diff --git a/library/digital_resources/Omeka/Service/Parser.php b/library/digital_resources/Omeka/Service/Parser.php
index 653780182a296b01003c44181104dff2877a7b4a..70ffe466896057d49a51b8749c5b731997cd2196 100644
--- a/library/digital_resources/Omeka/Service/Parser.php
+++ b/library/digital_resources/Omeka/Service/Parser.php
@@ -26,6 +26,11 @@ class Omeka_Service_Parser extends Class_WebService_OAI_DublinCoreParser_ForRess
   }
 
 
-  public function enddc_identifier($data) {}
+  public function enddc_identifier($data) {
+    if (preg_match_all('/files\/original\/([0-9a-f]+)\./', $data, $matches)) {
+      $this->getRessourceNumerique()
+           ->setIdentifierHash($matches[1][0]);
+    }
+  }
 }
 ?>
\ No newline at end of file
diff --git a/library/digital_resources/Omeka/Service/Resource.php b/library/digital_resources/Omeka/Service/Resource.php
index 2183962e9221eb9c7f9a74747ccee2bc3b78a7b4..1a75f59ac1afc95523339c85bcb2ad7b9a76bb97 100644
--- a/library/digital_resources/Omeka/Service/Resource.php
+++ b/library/digital_resources/Omeka/Service/Resource.php
@@ -21,6 +21,10 @@
 
 
 class Omeka_Service_Resource extends Class_WebService_BibNumerique_RessourceNumerique {
+  public function setIdentifierHash($data) {
+    $this->addPoster($this->getBaseUrl() . '/files/thumbnails/' . $data . '.jpg');
+  }
+
   public function addAuthor($author) {
     preg_match_all('/(?P<lastname>[^\.,\(]+)'
                    .'(, (?P<firstname>[^\.\(]+))?'
diff --git a/library/digital_resources/Omeka/View/Helper/Album.php b/library/digital_resources/Omeka/View/Helper/Album.php
index c8e8c531a9a87eaf52218846accc180168dc9d46..50066faab42ac8cba7128feebf1400d7b3594924 100644
--- a/library/digital_resources/Omeka/View/Helper/Album.php
+++ b/library/digital_resources/Omeka/View/Helper/Album.php
@@ -36,7 +36,7 @@ class Omeka_View_Helper_Album extends ZendAfi_View_Helper_TagRessourceNumerique
       $this->view->tag('script',
                        '',
                        ['id' => 'embedUV',
-                        'src' => $album->getUrlOrigine() . '/plugins/UniversalViewer/views/shared/javascripts/uv/lib/embed.js']);
+                        'src' => URL_JS . 'universalviewer-2.0.2/lib/embed.js']);
   }
 
 
diff --git a/library/digital_resources/Omeka/tests/OmekaTest.php b/library/digital_resources/Omeka/tests/OmekaTest.php
index 8cb30a4fd90f433087ea8e08805eb1a9bf49db84..daef219694273cdd7c1375da5adcd081b60b013d 100644
--- a/library/digital_resources/Omeka/tests/OmekaTest.php
+++ b/library/digital_resources/Omeka/tests/OmekaTest.php
@@ -27,6 +27,10 @@ class OmekaFixtures {
                         'http://omeka-demo.biblibre.com');
 
     $http_client = $this->mock()
+
+                        ->whenCalled('open_url')
+                        ->answers('')
+
                         ->whenCalled('open_url')
                         ->with('http://omeka-demo.biblibre.com/oai-pmh-repository/request?verb=ListRecords&metadataPrefix=oai_dc')
                         ->answers(file_get_contents(__DIR__ . '/omeka_oai_page_1.xml'));
@@ -105,16 +109,23 @@ class OmekaHarvestedTest extends AbstractControllerTestCase {
 
 
   /** @test */
-  public function alperRecordPreviewShouldUseUniversalIIIFPlayer() {
-    $this->dispatch('/noticeajax/resnumeriques/id/1', true);
-    $this->assertXPath('//div[@class="uv"][@data-uri="http://omeka-demo.biblibre.com/iiif/668/manifest"]/following-sibling::script[@id="embedUV"][@src="http://omeka-demo.biblibre.com/plugins/UniversalViewer/views/shared/javascripts/uv/lib/embed.js"]');
+  public function alpesRecordRightsShouldBeDomainePublic() {
+    $this->assertEquals('domaine public, public domain', $this->_alpes_record->getAlbum()->getDroits());
   }
 
 
   /** @test */
-  public function alpesRecordRightsShouldBeDomainePublic() {
-    $this->assertEquals('domaine public, public domain', $this->_alpes_record->getAlbum()->getDroits());
+  public function nainDeJardinThumbnalShouldBeFilesThumbnailsb53ccf92d3faf0ae3ca61289c74e56f0DotJpg() {
+    $this->assertEquals('http://omeka-demo.biblibre.com/files/thumbnails/b53ccf92d3faf0ae3ca61289c74e56f0.jpg', Class_Album::find(1)->getPoster());
+  }
+
+
+  /** @test */
+  public function alperRecordPreviewShouldUseUniversalIIIFPlayer() {
+    $this->dispatch('/noticeajax/resnumeriques/id/1', true);
+    $this->assertXPath('//div[@class="uv"][@data-uri="http://omeka-demo.biblibre.com/iiif/668/manifest"]/following-sibling::script[@id="embedUV"][contains(@src,"/embed.js")]');
   }
 
+
 }
 ?>
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/app.html b/public/opac/js/universalviewer-2.0.2/app.html
new file mode 100644
index 0000000000000000000000000000000000000000..7284f99ac8f7974669038f5d7913509b5d795ccd
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/app.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jsviews/0.9.75/jsviews.min.js"></script>
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/easyXDM/2.4.17.1/easyXDM.min.js"></script>
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/easyXDM/2.4.17.1/json2.min.js"></script>
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/es6-promise/3.2.1/es6-promise.min.js"></script>
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/yepnope/1.5.4/yepnope.min.js"></script>
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.min.js"></script>
+    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Base64/0.3.0/base64.min.js"></script>
+    <script type="text/javascript" src="lib/bundle.min.js"></script>
+
+    <script data-main="lib/app" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.min.js"></script>
+    <style type="text/css">
+        #app.loading {
+            background-repeat: no-repeat;
+            background-position: 50% 50%;
+            /*background-image: url(data:image/gif;base64,R0lGODlhEAAQAPIAAAAAAP///zw8PLy8vP///5ycnHx8fGxsbCH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==);*/
+            background-image: url(data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=);
+        }
+    </style>
+</head>
+<body>
+
+    <div id="app"></div>
+
+    <script type="text/javascript">
+        var app = document.getElementById("app");
+        var width = window.innerWidth || document.documentElement.clientWidth;
+        var height = window.innerHeight || document.documentElement.clientHeight;
+        app.setAttribute("style", "width:" + width + "px");
+        app.setAttribute("style", "height:" + height + "px");
+    </script>
+
+    <!-- uncomment the following for GA tracking when embedded on third party sites -->
+    <!--<script type="text/javascript" src="/examples/events.js"></script>-->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/html/uv-pdfcenterpanel-module/viewer.html b/public/opac/js/universalviewer-2.0.2/html/uv-pdfcenterpanel-module/viewer.html
new file mode 100644
index 0000000000000000000000000000000000000000..dc942c591f889b3716a629464990a3eeb35136ee
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/html/uv-pdfcenterpanel-module/viewer.html
@@ -0,0 +1,363 @@
+
+
+
+    <div id="outerContainer" dir="ltr" class="loadingInProgress">
+      <!--<link rel="resource" type="application/l10n" href="modules/uv-pdfcenterpanel-module/l10n/locale.properties"/>-->
+      <div id="sidebarContainer">
+        <div id="toolbarSidebar">
+          <div class="splitToolbarButton toggled">
+            <button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs">
+               <span data-l10n-id="thumbs_label">Thumbnails</span>
+            </button>
+            <button id="viewOutline" class="toolbarButton group" title="Show Document Outline" tabindex="3" data-l10n-id="outline">
+               <span data-l10n-id="outline_label">Document Outline</span>
+            </button>
+            <button id="viewAttachments" class="toolbarButton group" title="Show Attachments" tabindex="4" data-l10n-id="attachments">
+               <span data-l10n-id="attachments_label">Attachments</span>
+            </button>
+          </div>
+        </div>
+        <div id="sidebarContent">
+          <div id="thumbnailView">
+          </div>
+          <div id="outlineView" class="hidden">
+          </div>
+          <div id="attachmentsView" class="hidden">
+          </div>
+        </div>
+      </div>  <!-- sidebarContainer -->
+
+      <div id="mainContainer">
+        <div class="findbar hidden doorHanger hiddenSmallView" id="findbar">
+          <label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label>
+          <input id="findInput" class="toolbarField" tabindex="41">
+          <div class="splitToolbarButton">
+            <button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="42" data-l10n-id="find_previous">
+              <span data-l10n-id="find_previous_label">Previous</span>
+            </button>
+            <div class="splitToolbarButtonSeparator"></div>
+            <button class="toolbarButton findNext" title="" id="findNext" tabindex="43" data-l10n-id="find_next">
+              <span data-l10n-id="find_next_label">Next</span>
+            </button>
+          </div>
+          <input type="checkbox" id="findHighlightAll" class="toolbarField">
+          <label for="findHighlightAll" class="toolbarLabel" tabindex="44" data-l10n-id="find_highlight">Highlight all</label>
+          <input type="checkbox" id="findMatchCase" class="toolbarField">
+          <label for="findMatchCase" class="toolbarLabel" tabindex="45" data-l10n-id="find_match_case_label">Match case</label>
+          <span id="findMsg" class="toolbarLabel"></span>
+        </div>  <!-- findbar -->
+
+        <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
+          <div id="secondaryToolbarButtonContainer">
+            <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="19" data-l10n-id="presentation_mode">
+              <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+            </button>
+
+            <button id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File" tabindex="20" data-l10n-id="open_file">
+              <span data-l10n-id="open_file_label">Open</span>
+            </button>
+
+            <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="21" data-l10n-id="print">
+              <span data-l10n-id="print_label">Print</span>
+            </button>
+
+            <button id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download" tabindex="22" data-l10n-id="download">
+              <span data-l10n-id="download_label">Download</span>
+            </button>
+
+            <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView" title="Current view (copy or open in new window)" tabindex="23" data-l10n-id="bookmark">
+              <span data-l10n-id="bookmark_label">Current View</span>
+            </a>
+
+            <div class="horizontalToolbarSeparator visibleLargeView"></div>
+
+            <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="24" data-l10n-id="first_page">
+              <span data-l10n-id="first_page_label">Go to First Page</span>
+            </button>
+            <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="25" data-l10n-id="last_page">
+              <span data-l10n-id="last_page_label">Go to Last Page</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator"></div>
+
+            <button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="26" data-l10n-id="page_rotate_cw">
+              <span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span>
+            </button>
+            <button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise" tabindex="27" data-l10n-id="page_rotate_ccw">
+              <span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator"></div>
+
+            <button id="toggleHandTool" class="secondaryToolbarButton handTool" title="Enable hand tool" tabindex="28" data-l10n-id="hand_tool_enable">
+              <span data-l10n-id="hand_tool_enable_label">Enable hand tool</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator"></div>
+
+            <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties…" tabindex="29" data-l10n-id="document_properties">
+              <span data-l10n-id="document_properties_label">Document Properties…</span>
+            </button>
+          </div>
+        </div>  <!-- secondaryToolbar -->
+
+        <div class="toolbar">
+          <div id="toolbarContainer">
+            <div id="toolbarViewer">
+              <div id="toolbarViewerLeft">
+                <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="5" data-l10n-id="toggle_sidebar">
+                  <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
+                </button>
+                <div class="toolbarButtonSpacer"></div>
+                <button id="viewFind" class="toolbarButton group hiddenSmallView" title="Find in Document" tabindex="6" data-l10n-id="findbar">
+                   <span data-l10n-id="findbar_label">Find</span>
+                </button>
+                <div class="splitToolbarButton">
+                  <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="7" data-l10n-id="previous">
+                    <span data-l10n-id="previous_label">Previous</span>
+                  </button>
+                  <div class="splitToolbarButtonSeparator"></div>
+                  <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="8" data-l10n-id="next">
+                    <span data-l10n-id="next_label">Next</span>
+                  </button>
+                </div>
+                <label id="pageNumberLabel" class="toolbarLabel" for="pageNumber" data-l10n-id="page_label">Page: </label>
+                <input type="number" id="pageNumber" class="toolbarField pageNumber" value="1" size="4" min="1" tabindex="9">
+                <span id="numPages" class="toolbarLabel"></span>
+              </div>
+              <div id="toolbarViewerRight">
+                <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="13" data-l10n-id="presentation_mode">
+                  <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+                </button>
+
+                <button id="openFile" class="toolbarButton openFile hiddenLargeView" title="Open File" tabindex="14" data-l10n-id="open_file">
+                  <span data-l10n-id="open_file_label">Open</span>
+                </button>
+
+                <button id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="15" data-l10n-id="print">
+                  <span data-l10n-id="print_label">Print</span>
+                </button>
+
+                <button id="download" class="toolbarButton download hiddenMediumView" title="Download" tabindex="16" data-l10n-id="download">
+                  <span data-l10n-id="download_label">Download</span>
+                </button>
+                <!-- <div class="toolbarButtonSpacer"></div> -->
+                <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="17" data-l10n-id="bookmark">
+                  <span data-l10n-id="bookmark_label">Current View</span>
+                </a>
+
+                <div class="verticalToolbarSeparator hiddenSmallView"></div>
+
+                <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="18" data-l10n-id="tools">
+                  <span data-l10n-id="tools_label">Tools</span>
+                </button>
+              </div>
+              <div class="outerCenter">
+                <div class="innerCenter" id="toolbarViewerMiddle">
+                  <div class="splitToolbarButton">
+                    <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="10" data-l10n-id="zoom_out">
+                      <span data-l10n-id="zoom_out_label">Zoom Out</span>
+                    </button>
+                    <div class="splitToolbarButtonSeparator"></div>
+                    <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="11" data-l10n-id="zoom_in">
+                      <span data-l10n-id="zoom_in_label">Zoom In</span>
+                     </button>
+                  </div>
+                  <span id="scaleSelectContainer" class="dropdownToolbarButton">
+                     <select id="scaleSelect" title="Zoom" tabindex="12" data-l10n-id="zoom">
+                      <option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option>
+                      <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option>
+                      <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option>
+                      <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Full Width</option>
+                      <option id="customScaleOption" title="" value="custom"></option>
+                      <option title="" value="0.5">50%</option>
+                      <option title="" value="0.75">75%</option>
+                      <option title="" value="1">100%</option>
+                      <option title="" value="1.25">125%</option>
+                      <option title="" value="1.5">150%</option>
+                      <option title="" value="2">200%</option>
+                    </select>
+                  </span>
+                </div>
+              </div>
+            </div>
+            <div id="loadingBar">
+              <div class="progress">
+                <div class="glimmer">
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <menu type="context" id="viewerContextMenu">
+          <menuitem id="contextFirstPage" label="First Page"
+                    data-l10n-id="first_page"></menuitem>
+          <menuitem id="contextLastPage" label="Last Page"
+                    data-l10n-id="last_page"></menuitem>
+          <menuitem id="contextPageRotateCw" label="Rotate Clockwise"
+                    data-l10n-id="page_rotate_cw"></menuitem>
+          <menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise"
+                    data-l10n-id="page_rotate_ccw"></menuitem>
+        </menu>
+
+        <div id="viewerContainer" tabindex="0">
+          <div id="viewer"></div>
+        </div>
+
+        <div id="errorWrapper" hidden='true'>
+          <div id="errorMessageLeft">
+            <span id="errorMessage"></span>
+            <button id="errorShowMore" data-l10n-id="error_more_info">
+              More Information
+            </button>
+            <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>
+              Less Information
+            </button>
+          </div>
+          <div id="errorMessageRight">
+            <button id="errorClose" data-l10n-id="error_close">
+              Close
+            </button>
+          </div>
+          <div class="clearBoth"></div>
+          <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
+        </div>
+      </div> <!-- mainContainer -->
+
+      <div id="overlayContainer" class="hidden">
+        <div id="promptContainer" class="hidden">
+          <div id="passwordContainer" class="prompt doorHanger">
+            <div class="row">
+              <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
+            </div>
+            <div class="row">
+              <input type="password" id="password" class="toolbarField" />
+            </div>
+            <div class="buttonRow">
+              <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
+              <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
+            </div>
+          </div>
+        </div>
+        <div id="documentPropertiesContainer" class="hidden">
+          <div class="doorHanger">
+            <div class="row">
+              <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>
+            </div>
+            <div class="separator"></div>
+            <div class="row">
+              <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p>
+            </div>
+            <div class="separator"></div>
+            <div class="row">
+              <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p>
+            </div>
+            <div class="buttonRow">
+            <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
+            </div>
+          </div>
+        </div>
+      </div>  <!-- overlayContainer -->
+
+    </div> <!-- outerContainer -->
+    <div id="printContainer"></div>
+<div id="mozPrintCallback-shim" hidden>
+  <style scoped>
+#mozPrintCallback-shim {
+  position: fixed;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: 100%;
+  z-index: 9999999;
+
+  display: block;
+  text-align: center;
+  background-color: rgba(0, 0, 0, 0.5);
+}
+#mozPrintCallback-shim[hidden] {
+  display: none;
+}
+@media print {
+  #mozPrintCallback-shim {
+    display: none;
+  }
+}
+
+#mozPrintCallback-shim .mozPrintCallback-dialog-box {
+  display: inline-block;
+  margin: -50px auto 0;
+  position: relative;
+  top: 45%;
+  left: 0;
+  min-width: 220px;
+  max-width: 400px;
+
+  padding: 9px;
+
+  border: 1px solid hsla(0, 0%, 0%, .5);
+  border-radius: 2px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+
+  background-color: #474747;
+
+  color: hsl(0, 0%, 85%);
+  font-size: 16px;
+  line-height: 20px;
+}
+#mozPrintCallback-shim .progress-row {
+  clear: both;
+  padding: 1em 0;
+}
+#mozPrintCallback-shim progress {
+  width: 100%;
+}
+#mozPrintCallback-shim .relative-progress {
+  clear: both;
+  float: right;
+}
+#mozPrintCallback-shim .progress-actions {
+  clear: both;
+}
+  </style>
+  <div class="mozPrintCallback-dialog-box">
+    <!-- TODO: Localise the following strings -->
+    Preparing document for printing...
+    <div class="progress-row">
+      <progress value="0" max="100"></progress>
+      <span class="relative-progress">0%</span>
+    </div>
+    <div class="progress-actions">
+      <input type="button" value="Cancel" class="mozPrintCallback-cancel">
+    </div>
+  </div>
+</div>
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ach/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ach/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..dfc990af8dfbad76521099914ada905cd3a4e208
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ach/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Pe ki biyaro kakare coc acoya man me PDF.
+open_with_different_viewer=Yab Ki Gin maneno mapat pat
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ach/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ach/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..73ebb52960b05280cc2213c662e59d7ff8d3b9e1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ach/viewer.properties
@@ -0,0 +1,97 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pot buk Mukato
+next.title=Pot buk Malubo Kore
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pot buk:
+page_of=pi {{pageCount}}
+
+zoom_out.title=Dwogo Woko
+zoom_out_label=Dwogo Woko
+zoom_in.title=Dwogo iyie
+zoom_in_label=Dwogo iyie
+zoom.title=Kwoti
+print.title=Goo
+print_label=Goo
+open_file.title=Yab Pwail
+open_file_label=Yabi
+download.title=Gam
+download_label=Gam
+bookmark.title=Neno matye (loki onyo yabi i dirica manyen)
+bookmark_label=Neno Matye
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=Nyut ryeno rek pa Coc acoya
+outline_label=Ryeno rek me Coc acoya
+thumbs.title=Nyut Capa cing
+thumbs_label=Capa cing
+findbar_label=Nong
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pot buk {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Capa cing e Pot buk {{page}}
+
+# Context menu
+
+# Find panel button title and messages
+find_previous.title=Nong en matime malubo kore pi lok
+find_next.title=Nong en matime malubo kore pi lok
+find_not_found=Phrase pe ononge
+
+# Error panel labels
+error_more_info=Ngec Mukene
+error_close=Lor
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Kwena: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Agiki onyo acaki {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Pwail: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rek: {{line}}
+rendering_error=Bal otyeko time kun jalo pot buk.
+
+# Predefined zoom values
+page_scale_width=Bor wi Pot buk
+page_scale_fit=Pot buk Romo
+page_scale_auto=Dowogo ne matime pire kene
+page_scale_actual=Kit Mamite
+
+# Loading indicator messages
+loading_error_indicator=Bal
+loading_error=Bal otyeko time kun pango PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Lok angea manok]
+request_password=I ung otyeko gwoko PDF:
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/af/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/af/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b9d16a253127224201ac7a99be76131a3bd6f785
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/af/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dié PDF-dokument sal dalk nie korrek vertoon word nie.
+open_with_different_viewer=Open met 'n ander program
+open_with_different_viewer.accessKey=O
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/af/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/af/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..306ac1baf7f370e59aa574b74639b5d11b68701f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/af/viewer.properties
@@ -0,0 +1,140 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Vorige bladsy
+previous_label=Vorige
+next.title=Volgende bladsy
+next_label=Volgende
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Bladsy:
+page_of=van {{pageCount}}
+
+zoom_out.title=Zoem uit
+zoom_out_label=Zoem uit
+zoom_in.title=Zoem in
+zoom_in_label=Zoem in
+zoom.title=Zoem
+presentation_mode.title=Wissel na voorleggingsmodus
+presentation_mode_label=Voorleggingsmodus
+open_file.title=Open lêer
+open_file_label=Open
+print.title=Druk
+print_label=Druk
+download.title=Laai af
+download_label=Laai af
+bookmark.title=Huidige aansig (kopieer of open in nuwe venster)
+bookmark_label=Huidige aansig
+
+# Secondary toolbar and context menu
+tools.title=Nutsgoed
+tools_label=Nutsgoed
+first_page.title=Gaan na eerste bladsy
+first_page.label=Gaan na eerste bladsy
+first_page_label=Gaan na eerste bladsy
+last_page.title=Gaan na laaste bladsy
+last_page.label=Gaan na laaste bladsy
+last_page_label=Gaan na laaste bladsy
+page_rotate_cw.title=Roteer kloksgewys
+page_rotate_cw.label=Roteer kloksgewys
+page_rotate_cw_label=Roteer kloksgewys
+page_rotate_ccw.title=Roteer anti-kloksgewys
+page_rotate_ccw.label=Roteer anti-kloksgewys
+page_rotate_ccw_label=Roteer anti-kloksgewys
+
+
+# Document properties dialog box
+document_properties_file_name=Lêernaam:
+document_properties_title=Titel:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sypaneel aan/af
+toggle_sidebar_label=Sypaneel aan/af
+outline.title=Wys dokumentoorsig
+outline_label=Dokumentoorsig
+thumbs.title=Wys duimnaels
+thumbs_label=Duimnaels
+findbar.title=Soek in dokument
+findbar_label=Vind
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Bladsy {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Duimnael van bladsy {{page}}
+
+# Find panel button title and messages
+find_label=Vind:
+find_previous.title=Vind die vorige voorkoms van die frase
+find_previous_label=Vorige
+find_next.title=Vind die volgende voorkoms van die frase
+find_next_label=Volgende
+find_highlight=Verlig alle
+find_match_case_label=Kassensitief
+find_reached_top=Bokant van dokument is bereik; gaan voort van onder af
+find_reached_bottom=Einde van dokument is bereik; gaan voort van bo af
+find_not_found=Frase nie gevind nie
+
+# Error panel labels
+error_more_info=Meer inligting
+error_less_info=Minder inligting
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (ID: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Boodskap: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stapel: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Lêer: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Lyn: {{line}}
+rendering_error='n Fout het voorgekom toe die bladsy weergegee is.
+
+# Predefined zoom values
+page_scale_width=Bladsywydte
+page_scale_fit=Pas bladsy
+page_scale_auto=Outomatiese zoem
+page_scale_actual=Werklike grootte
+
+# Loading indicator messages
+loading_error_indicator=Fout
+loading_error='n Fout het voorgekom met die laai van die PDF.
+invalid_file_error=Ongeldige of korrupte PDF-lêer.
+missing_file_error=PDF-lêer is weg.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-annotasie
+password_label=Gee die wagwoord om dié PDF-lêer mee te open.
+password_invalid=Ongeldige wagwoord. Probeer gerus weer.
+password_ok=OK
+password_cancel=Kanselleer
+
+printing_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie.
+printing_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.
+web_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.
+document_colors_disabled=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: 'Laat bladsye toe om hul eie kleure te kies' is gedeaktiveer in die blaaier.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ak/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ak/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..077e99a913f0279696fe3f04c572f379f9501abe
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ak/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ɛbɛtumi aba no sɛ PDF dɔkomɛnte yi remmba papa wɔ kɔmputa no so.
+open_with_different_viewer=Fa hwɛfo foforo bue
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ak/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ak/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..883c2ab8e855a781848c8310797210f473d9ebfb
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ak/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Krataafa baako a etwa mu
+previous_label=Ekyiri-baako
+next.title=Krataafa a edi so baako
+next_label=Dea-É›-di-so-baako
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Krataafa:
+page_of=wÉ” {{pageCount}}
+
+zoom_out.title=Zuum pue
+zoom_out_label=Zuum ba abɔnten
+zoom_in.title=Zuum kÉ” mu
+zoom_in_label=Zuum kÉ” mu
+zoom.title=Zuum
+presentation_mode.title=Sesa kɔ Yɛkyerɛ Tebea mu
+presentation_mode_label=Yɛkyerɛ Tebea
+open_file.title=Bue Fael
+open_file_label=Bue
+print.title=Prente
+print_label=Prente
+download.title=Twe
+download_label=Twe
+bookmark.title=Seisei nhwÉ› (fa anaaso bue wÉ” tokuro foforo mu)
+bookmark_label=Seisei nhwÉ›
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=Ti asɛm:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=SÉ” anaaso dum saedbaa
+toggle_sidebar_label=SÉ” anaaso dum saedbaa
+outline.title=Kyerɛ dɔkomɛnt bɔbea
+outline_label=Dɔkomɛnt bɔbea
+thumbs.title=KyerÉ› mfoniwaa
+thumbs_label=Mfoniwaa
+findbar.title=Hu wɔ dɔkomɛnt no mu
+findbar_label=Hu
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Krataafa {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Krataafa ne mfoniwaa {{page}}
+
+# Find panel button title and messages
+find_label=Hunu:
+find_previous.title=San hu fres wÉ” ekyiri baako
+find_previous_label=Ekyiri baako
+find_next.title=San hu fres no wÉ” enim baako
+find_next_label=Ndiso
+find_highlight=HyÉ› bibiara nso
+find_match_case_label=Fa susu kaase
+find_reached_top=Edu krataafa ne soro, atoa so efiri ase
+find_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro
+find_not_found=Ennhu fres
+
+# Error panel labels
+error_more_info=Infɔmehyɛn bio a wɔka ho
+error_less_info=Te infɔmehyɛn bio a wɔka ho so
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{vɛɛhyen}} (nsi: {{si}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Nkrato: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Staake: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fael: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Laen: {{line}}
+rendering_error=Mfomso bae wÉ” bere a wÉ” rekyerÉ› krataafa no.
+
+# Predefined zoom values
+page_scale_width=Krataafa tɛtrɛtɛ
+page_scale_fit=Krataafa ehimtwa
+page_scale_auto=Zuum otomatik
+page_scale_actual=Kɛseyɛ ankasa
+
+# Loading indicator messages
+loading_error_indicator=Mfomso
+loading_error=Mfomso bae wɔ bere a wɔreloode PDF no.
+invalid_file_error=PDF fael no nndi mu anaaso ho atÉ” kyima.
+missing_file_error=PDF fael no ayera.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Tɛkst-nyiano]
+password_ok=OK
+password_cancel=Twa-mu
+
+printing_not_supported=Kɔkɔbɔ: Brawsa yi nnhyɛ daa mma prent ho kwan.
+printing_not_ready=Kɔkɔbɔ: Wɔnntwee PDF fael no nyinara mmbaee ama wo ɛ tumi aprente.
+web_fonts_disabled=Ɔedum wɛb-mfɔnt: nntumi mmfa PDF mfɔnt a wɔhyɛ mu nndi dwuma.
+document_colors_disabled=Wɔmma ho kwan sɛ PDF adɔkomɛnt de wɔn ara wɔn ahosu bɛdi dwuma: wɔ adum 'Ma ho kwan ma nkrataafa mpaw wɔn ara wɔn ahosu' wɔ brawsa yi mu.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/an/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/an/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..56e590d1ff5a060066e4e1ca22ee278e61b1d86c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/an/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Iste documento PDF talment no s'amuestre correctament.
+unsupported_feature_forms=Iste documento PDF contién formularios. A cumplimentación d'os campos de formularios no ye encara posible.
+open_with_different_viewer=Ubrir con belatro visor diferent
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/an/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/an/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..178508a0046ba4891518b4b96285803cf2060551
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/an/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pachina anterior
+previous_label=Anterior
+next.title=Pachina siguient
+next_label=Siguient
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pachina:
+page_of=de {{pageCount}}
+
+zoom_out.title=Achiquir
+zoom_out_label=Achiquir
+zoom_in.title=Agrandir
+zoom_in_label=Agrandir
+zoom.title=Grandaria
+presentation_mode.title=Cambear t'o modo de presentación
+presentation_mode_label=Modo de presentación
+open_file.title=Ubrir o fichero
+open_file_label=Ubrir
+print.title=Imprentar
+print_label=Imprentar
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar u ubrir en una nueva finestra)
+bookmark_label=Anvista actual
+
+# Secondary toolbar and context menu
+tools.title=Ferramientas
+tools_label=Ferramientas
+first_page.title=Ir ta la primer pachina
+first_page.label=Ir ta la primer pachina
+first_page_label=Ir ta la primer pachina
+last_page.title=Ir ta la zaguer pachina
+last_page.label=Ir ta la zaguera pachina
+last_page_label=Ir ta la zaguer pachina
+page_rotate_cw.title=Chirar enta la dreita
+page_rotate_cw.label=Chirar enta la dreita
+page_rotate_cw_label=Chira enta la dreita
+page_rotate_ccw.title=Chirar enta la zurda
+page_rotate_ccw.label=Chirar en sentiu antihorario
+page_rotate_ccw_label=Chirar enta la zurda
+
+hand_tool_enable.title=Activar a ferramienta man
+hand_tool_enable_label=Activar a ferramenta man
+hand_tool_disable.title=Desactivar a ferramienta man
+hand_tool_disable_label=Desactivar a ferramienta man
+
+# Document properties dialog box
+document_properties.title=Propiedatz d'o documento...
+document_properties_label=Propiedatz d'o documento...
+document_properties_file_name=Nombre de fichero:
+document_properties_file_size=Grandaria d'o fichero:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titol:
+document_properties_author=Autor:
+document_properties_subject=Afer:
+document_properties_keywords=Parolas clau:
+document_properties_creation_date=Calendata de creyación:
+document_properties_modification_date=Calendata de modificación:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creyador:
+document_properties_producer=Creyador de PDF:
+document_properties_version=Versión de PDF:
+document_properties_page_count=Numero de pachinas:
+document_properties_close=Close
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Amostrar u amagar a barra lateral
+toggle_sidebar_label=Amostrar a barra lateral
+outline.title=Amostrar o esquema d'o documento
+outline_label=Esquema d'o documento
+thumbs.title=Amostrar as miniaturas
+thumbs_label=Miniaturas
+findbar.title=Trobar en o documento
+findbar_label=Trobar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pachina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura d'a pachina {{page}}
+
+# Find panel button title and messages
+find_label=Trobar:
+find_previous.title=Trobar l'anterior coincidencia d'a frase
+find_previous_label=Anterior
+find_next.title=Trobar a siguient coincidencia d'a frase
+find_next_label=Siguient
+find_highlight=Resaltar-lo tot
+find_match_case_label=Coincidencia de mayusclas/minusclas
+find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo
+find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto
+find_not_found=No s'ha trobau a frase
+
+# Error panel labels
+error_more_info=Mas información
+error_less_info=Menos información
+error_close=Zarrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensache: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fichero: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linia: {{line}}
+rendering_error=Ha ocurriu una error en renderizar a pachina.
+
+# Predefined zoom values
+page_scale_width=Amplaria d'a pachina
+page_scale_fit=Achuste d'a pachina
+page_scale_auto=Grandaria automatica
+page_scale_actual=Grandaria actual
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=S'ha produciu una error en cargar o PDF.
+invalid_file_error=O PDF no ye valido u ye estorbau.
+missing_file_error=No i ha fichero PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotación {{type}}]
+password_label=Introduzca a clau ta ubrir iste fichero PDF.
+password_invalid=Clau invalida. Torna a intentar-lo.
+password_ok=Acceptar
+password_cancel=Cancelar
+
+printing_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.
+printing_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.
+web_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.
+document_colors_disabled=Os documentos PDF no pueden fer servir as suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ar/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ar/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..12d3fe248ea63ab45d58f57803a6cbdce379ebc4
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ar/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=قد لا يُعرض ملف PDF هذا بشكل سليم.
+unsupported_feature_forms=يحتوى ملف PDF على نماذج. ملء النماذج غير مدعوم.
+open_with_different_viewer=افتح في عارِض آخر
+open_with_different_viewer.accessKey=ت
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ar/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ar/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..29da8868fbfdfdf55cb2dc96334150c71f906787
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ar/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=الصفحة السابقة
+previous_label=السابقة
+next.title=الصفحة التالية
+next_label=التالية
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=صفحة:
+page_of=من {{pageCount}}
+
+zoom_out.title=بعّد
+zoom_out_label=بعّد
+zoom_in.title=قرّب
+zoom_in_label=قرّب
+zoom.title=التقريب
+presentation_mode.title=انتقل لوضع العرض التقديمي
+presentation_mode_label=وضع العرض التقديمي
+open_file.title=افتح ملفًا
+open_file_label=افتح
+print.title=اطبع
+print_label=اطبع
+download.title=نزّل
+download_label=نزّل
+bookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة)
+bookmark_label=المنظور الحالي
+
+# Secondary toolbar and context menu
+tools.title=الأدوات
+tools_label=الأدوات
+first_page.title=اذهب إلى الصفحة الأولى
+first_page.label=اذهب إلى الصفحة الأولى
+first_page_label=اذهب إلى الصفحة الأولى
+last_page.title=اذهب إلى الصفحة الأخيرة
+last_page.label=اذهب إلى الصفحة الأخيرة
+last_page_label=اذهب إلى الصفحة الأخيرة
+page_rotate_cw.title=أدر باتجاه عقارب الساعة
+page_rotate_cw.label=أدر باتجاه عقارب الساعة
+page_rotate_cw_label=أدر باتجاه عقارب الساعة
+page_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة
+page_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة
+page_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة
+
+hand_tool_enable.title=فعّل أداة اليد
+hand_tool_enable_label=فعّل أداة اليد
+hand_tool_disable.title=عطّل أداة اليد
+hand_tool_disable_label=عطّل أداة اليد
+
+# Document properties dialog box
+document_properties.title=خصائص المستند…
+document_properties_label=خصائص المستند…
+document_properties_file_name=اسم الملف:
+document_properties_file_size=حجم الملف:
+document_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت)
+document_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت)
+document_properties_title=العنوان:
+document_properties_author=المؤلف:
+document_properties_subject=الموضوع:
+document_properties_keywords=الكلمات الأساسية:
+document_properties_creation_date=تاريخ الإنشاء:
+document_properties_modification_date=تاريخ التعديل:
+document_properties_date_string={{date}}، {{time}}
+document_properties_creator=المنشئ:
+document_properties_producer=منتج PDF:
+document_properties_version=إصدارة PDF:
+document_properties_page_count=عدد الصفحات:
+document_properties_close=أغلق
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=بدّل الشريط الجانبي
+toggle_sidebar_label=بدّل الشريط الجانبي
+outline.title=اعرض مخطط المستند
+outline_label=مخطط المستند
+thumbs.title=اعرض مُصغرات
+thumbs_label=مُصغّرات
+findbar.title=ابحث في المستند
+findbar_label=ابحث
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=صفحة {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=مصغّرة صفحة {{page}}
+
+# Find panel button title and messages
+find_label=ابحث:
+find_previous.title=ابحث عن التّواجد السّابق للعبارة
+find_previous_label=السابق
+find_next.title=ابحث عن التّواجد التّالي للعبارة
+find_next_label=التالي
+find_highlight=أبرِز الكل
+find_match_case_label=طابق حالة الأحرف
+find_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند
+find_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند
+find_not_found=لا وجود للعبارة
+
+# Error panel labels
+error_more_info=معلومات أكثر
+error_less_info=معلومات أقل
+error_close=أغلق
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=الرسالة: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=الرصّة: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=الملف: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=السطر: {{line}}
+rendering_error=حدث خطأ أثناء عرض الصفحة.
+
+# Predefined zoom values
+page_scale_width=عرض الصفحة
+page_scale_fit=ملائمة الصفحة
+page_scale_auto=تقريب تلقائي
+page_scale_actual=الحجم الحقيقي
+
+# Loading indicator messages
+loading_error_indicator=عطل
+loading_error=حدث عطل أثناء تحميل ملف PDF.
+invalid_file_error=ملف PDF تالف أو غير صحيح
+missing_file_error=ملف PDF غير موجود
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[تعليق {{type}}]
+password_label=أدخل لكلمة السر لفتح هذا الملف.
+password_invalid=كلمة سر خطأ. من فضلك أعد المحاولة.
+password_ok=حسنا
+password_cancel=ألغِ
+
+printing_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل.
+printing_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة.
+web_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة.
+document_colors_disabled=ليس مسموحًا لملفات PDF باستخدام ألوانها الخاصة: خيار 'اسمح للصفحات باختيار ألوانها الخاصة' ليس مُفعّلًا في المتصفح.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/as/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/as/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..04e5434c50e8916cfa23fb193382393236519b52
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/as/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=এই PDF দস্তাবেজ সঠিকভাৱে প্ৰদৰ্শন নহবও পাৰে।
+unsupported_feature_forms=এই PDF দস্তাবেজে ফৰ্ম অন্তৰ্ভুক্ত কৰে। ফৰ্ম ফিল্ডসমূহ পূৰ্ণ কৰাটো সমৰ্থিত নহয়।
+open_with_different_viewer=অন্য দৰ্শকৰ সৈতে খোলক
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/as/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/as/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..903dd29e3b24ea68b88174e2645424ce7bd9739f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/as/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=পূৰ্বৱৰ্তী পৃষ্ঠা
+previous_label=পূৰ্বৱৰ্তী
+next.title=পৰৱৰ্তী পৃষ্ঠা
+next_label=পৰৱৰ্তী
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=পৃষ্ঠা:
+page_of=à§° {{pageCount}}
+
+zoom_out.title=জুম আউট
+zoom_out_label=জুম আউট
+zoom_in.title=জুম ইন
+zoom_in_label=জুম ইন
+zoom.title=জুম কৰক
+presentation_mode.title=উপস্থাপন অৱস্থালে যাওক
+presentation_mode_label=উপস্থাপন অৱস্থা
+open_file.title=ফাইল খোলক
+open_file_label=খোলক
+print.title=প্ৰিন্ট কৰক
+print_label=প্ৰিন্ট কৰক
+download.title=ডাউনল'ড কৰক
+download_label=ডাউনল'ড কৰক
+bookmark.title=বৰ্তমান দৃশ্য (কপি কৰক অথবা নতুন উইন্ডোত খোলক)
+bookmark_label=বৰ্তমান দৃশ্য
+
+# Secondary toolbar and context menu
+tools.title=সঁজুলিসমূহ
+tools_label=সঁজুলিসমূহ
+first_page.title=প্ৰথম পৃষ্ঠাত যাওক
+first_page.label=প্ৰথম পৃষ্ঠাত যাওক
+first_page_label=প্ৰথম পৃষ্ঠাত যাওক
+last_page.title=সৰ্বশেষ পৃষ্ঠাত যাওক
+last_page.label=সৰ্বশেষ পৃষ্ঠাত যাওক
+last_page_label=সৰ্বশেষ পৃষ্ঠাত যাওক
+page_rotate_cw.title=ঘড়ীৰ দিশত ঘুৰাওক
+page_rotate_cw.label=ঘড়ীৰ দিশত ঘুৰাওক
+page_rotate_cw_label=ঘড়ীৰ দিশত ঘুৰাওক
+page_rotate_ccw.title=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক
+page_rotate_ccw.label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক
+page_rotate_ccw_label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক
+
+hand_tool_enable.title=হাঁত সঁজুলি সামৰ্থবান কৰক
+hand_tool_enable_label=হাঁত সঁজুলি সামৰ্থবান কৰক
+hand_tool_disable.title=হাঁত সঁজুলি অসামৰ্থবান কৰক
+hand_tool_disable_label=হাঁত সঁজুলি অসামৰ্থবান কৰক
+
+# Document properties dialog box
+document_properties.title=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…
+document_properties_label=দস্তাবেজৰ বৈশিষ্ট্যসমূহ…
+document_properties_file_name=ফাইল নাম:
+document_properties_file_size=ফাইলৰ আকাৰ:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=শীৰ্ষক:
+document_properties_author=লেখক:
+document_properties_subject=বিষয়:
+document_properties_keywords=কিৱাৰ্ডসমূহ:
+document_properties_creation_date=সৃষ্টিৰ তাৰিখ:
+document_properties_modification_date=পৰিবৰ্তনৰ তাৰিখ:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=সৃষ্টিকৰ্তা:
+document_properties_producer=PDF উৎপাদক:
+document_properties_version=PDF সংস্কৰণ:
+document_properties_page_count=পৃষ্ঠাৰ গণনা:
+document_properties_close=বন্ধ কৰক
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=কাষবাৰ টগল কৰক
+toggle_sidebar_label=কাষবাৰ টগল কৰক
+outline.title=দস্তাবেজ আউটলাইন দেখুৱাওক
+outline_label=দস্তাবেজ আউটলাইন
+thumbs.title=থাম্বনেইলসমূহ দেখুৱাওক
+thumbs_label=থাম্বনেইলসমূহ
+findbar.title=দস্তাবেজত সন্ধান কৰক
+findbar_label=সন্ধান কৰক
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=পৃষ্ঠা {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=পৃষ্ঠাৰ থাম্বনেইল {{page}}
+
+# Find panel button title and messages
+find_label=সন্ধান কৰক:
+find_previous.title=বাক্যাংশৰ পূৰ্বৱৰ্তী উপস্থিতি সন্ধান কৰক
+find_previous_label=পূৰ্বৱৰ্তী
+find_next.title=বাক্যাংশৰ পৰৱৰ্তী উপস্থিতি সন্ধান কৰক
+find_next_label=পৰৱৰ্তী
+find_highlight=সকলো উজ্জ্বল কৰক
+find_match_case_label=ফলা মিলাওক
+find_reached_top=তলৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ ওপৰলৈ অহা হৈছে
+find_reached_bottom=ওপৰৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ তললৈ অহা হৈছে
+find_not_found=বাক্যাংশ পোৱা নগল
+
+# Error panel labels
+error_more_info=অধিক তথ্য
+error_less_info=কম তথ্য
+error_close=বন্ধ কৰক
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=বাৰ্তা: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=স্টেক: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ফাইল: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=শাৰী: {{line}}
+rendering_error=এই পৃষ্ঠা ৰেণ্ডাৰ কৰোতে এটা ত্ৰুটি দেখা দিলে।
+
+# Predefined zoom values
+page_scale_width=পৃষ্ঠাৰ প্ৰস্থ
+page_scale_fit=পৃষ্ঠা খাপ
+page_scale_auto=স্বচালিত জুম
+page_scale_actual=প্ৰকৃত আকাৰ
+
+# Loading indicator messages
+loading_error_indicator=ত্ৰুটি
+loading_error=PDF ল'ড কৰোতে এটা ত্ৰুটি দেখা দিলে।
+invalid_file_error=অবৈধ অথবা ক্ষতিগ্ৰস্থ PDF file।
+missing_file_error=সন্ধানহিন PDF ফাইল।
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} টোকা]
+password_label=এই PDF ফাইল খোলিবলৈ পাছৱাৰ্ড সুমুৱাওক।
+password_invalid=অবৈধ পাছৱাৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।
+password_ok=ঠিক আছে
+password_cancel=বাতিল কৰক
+
+printing_not_supported=সতৰ্কবাৰ্তা: প্ৰিন্টিং এই ব্ৰাউছাৰ দ্বাৰা সম্পূৰ্ণভাৱে সমৰ্থিত নহয়।
+printing_not_ready=সতৰ্কবাৰ্তা: PDF প্ৰিন্টিংৰ বাবে সম্পূৰ্ণভাৱে ল'ডেড নহয়।
+web_fonts_disabled=ৱেব ফন্টসমূহ অসামৰ্থবান কৰা আছে: অন্তৰ্ভুক্ত PDF ফন্টসমূহ ব্যৱহাৰ কৰিবলে অক্ষম।
+document_colors_disabled=PDF দস্তাবেজসমূহৰ সিহতৰ নিজস্ব ৰঙ ব্যৱহাৰ কৰাৰ অনুমতি নাই: ব্ৰাউছাৰত 'পৃষ্ঠাসমূহক সিহতৰ নিজস্ব ৰঙ নিৰ্বাচন কৰাৰ অনুমতি দিয়ক' অসামৰ্থবান কৰা আছে।
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ast/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ast/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5c25c99adb643d9723fdce2bca5e9aa1dab17b3f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ast/chrome.properties
@@ -0,0 +1,7 @@
+# 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/.
+
+unsupported_feature = Esti documentu PDF podría nun amosase correcho.
+open_with_different_viewer = Abrir con un visor distintu
+open_with_different_viewer.accessKey = o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ast/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ast/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..92e936fb16caf2dc69ae91cd5a377854099b8679
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ast/viewer.properties
@@ -0,0 +1,73 @@
+# 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/.
+
+previous.title = Páxina anterior
+previous_label = Anterior
+next.title = Páxina siguiente
+next_label = Siguiente
+page_label = Páxina:
+page_of = de {{pageCount}}
+zoom_out.title = Reducir
+zoom_out_label = Reducir
+zoom_in.title = Aumentar
+zoom_in_label = Aumentar
+zoom.title = Tamañu
+print.title = Imprentar
+print_label = Imprentar
+open_file.title = Abrir ficheru
+open_file_label = Abrir
+download.title = Descargar
+download_label = Descargar
+bookmark.title = Vista actual (copiar o abrir nuna nueva ventana)
+bookmark_label = Vista actual
+outline.title = Amosar l'esquema del documentu
+outline_label = Esquema del documentu
+thumbs.title = Amosar miniatures
+thumbs_label = Miniatures
+thumb_page_title = Páxina {{page}}
+thumb_page_canvas = Miniatura de la páxina {{page}}
+error_more_info = Más información
+error_less_info = Menos información
+error_close = Zarrar
+error_message = Mensaxe: {{message}}
+error_stack = Pila: {{stack}}
+error_file = Ficheru: {{file}}
+error_line = Llinia: {{line}}
+rendering_error = Hebo un fallu al renderizar la páxina.
+page_scale_width = Anchor de la páxina
+page_scale_fit = Axuste de la páxina
+page_scale_auto = Tamañu automáticu
+page_scale_actual = Tamañu actual
+loading_error_indicator = Fallu
+loading_error = Hebo un fallu al cargar el PDF.
+request_password = El PDF ta protexíu por una contraseña:
+printing_not_supported = Avisu: Imprentar nun tien sofitu téunicu completu nesti navegador.
+presentation_mode_label = 
+presentation_mode.title = 
+page_rotate_cw.label = 
+page_rotate_ccw.label = 
+last_page.label = Dir a la cabera páxina
+invalid_file_error = Ficheru PDF inválidu o corruptu.
+first_page.label = Dir a la primer páxina
+findbar_label = Guetar
+findbar.title = Guetar nel documentu
+find_previous_label = Anterior
+find_previous.title = Alcontrar l'anterior apaición de la fras
+find_not_found = Frase non atopada
+find_next_label = Siguiente
+find_next.title = Alcontrar la siguiente apaición d'esta fras
+find_match_case_label = Coincidencia de mayús./minús.
+find_label = Guetar:
+find_highlight = Remarcar toos
+find_reached_top=Algamóse'l principiu del documentu, siguir dende'l final
+find_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu
+web_fonts_disabled = Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes.
+toggle_sidebar_label = Camudar barra llateral
+toggle_sidebar.title = Camudar barra llateral
+missing_file_error = Nun hai ficheru PDF.
+error_version_info = PDF.js v{{version}} (build: {{build}})
+printing_not_ready = Avisu: Esti PDF nun se cargó completamente pa poder imprentase.
+text_annotation_type.alt = [Anotación {{type}}]
+invalid_password = Contraseña non válida.
+document_colors_disabled = Los documentos PDF nun tienen permitío usar los sos propios colores: 'Permitir a les páxines elexir los sos propios colores' ta desactivao nel navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/az/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/az/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7852e4ad1b63f9e385efbbb9c31ef76445621ad3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/az/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Bu PDF sənədi düzgün göstərilməyə bilər.
+open_with_different_viewer=Fərqli Baxış Proqramıyla Aç
+open_with_different_viewer.accessKey=a
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/az/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/az/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7a808d1e914ebdd5bda7197dd789804196213e72
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/az/viewer.properties
@@ -0,0 +1,139 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Əvvəlki səhifə
+previous_label=Əvvəlkini tap
+next.title=Növbəti səhifə
+next_label=Növbətini tap
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Səhifə:
+page_of=/ {{pageCount}}
+
+zoom_out.title=UzaqlaÅŸ
+zoom_out_label=UzaqlaÅŸ
+zoom_in.title=Yaxınlaş
+zoom_in_label=Yaxınlaş
+zoom.title=Yaxınlaşdırma
+presentation_mode.title=Təqdimat Rejiminə Keç
+presentation_mode_label=Təqdimat Rejimi
+open_file.title=Fayl Aç
+open_file_label=Aç
+print.title=Yazdır
+print_label=Yazdır
+download.title=Yüklə
+download_label=Yüklə
+bookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç)
+bookmark_label=Hazırki görünüş
+
+# Secondary toolbar and context menu
+tools.title=Alətlər
+tools_label=Alətlər
+first_page.title=İlk Səhifəyə get
+first_page.label=İlk Səhifəyə get
+first_page_label=İlk Səhifəyə get
+last_page.title=Son Səhifəyə get
+last_page.label=Son Səhifəyə get
+last_page_label=Son Səhifəyə get
+page_rotate_cw.title=Saat İstiqamətində Fırlat
+page_rotate_cw.label=Saat İstiqamətində Fırlat
+page_rotate_cw_label=Saat İstiqamətində Fırlat
+page_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat
+page_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat
+page_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat
+
+
+# Document properties dialog box
+document_properties_title=Başlık:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Yan Paneli Aç/Bağla
+toggle_sidebar_label=Yan Paneli Aç/Bağla
+outline.title=Sənəd struktunu göstər
+outline_label=Sənəd strukturu
+thumbs.title=Kiçik şəkilləri göstər
+thumbs_label=Kiçik şəkillər
+findbar.title=Sənəddə Tap
+findbar_label=Axtar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Səhifə{{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti
+
+# Find panel button title and messages
+find_label=Tap:
+find_previous.title=Bir öncəki uyğun gələn sözü tapır
+find_previous_label=Əvvəlkini tap
+find_next.title=Bir sonrakı uyğun gələn sözü tapır
+find_next_label=Növbətini tap
+find_highlight=İşarələ
+find_match_case_label=Böyük/kiçik hərfə həssaslıq
+find_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir
+find_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir
+find_not_found=Uyğunlaşma tapılmadı
+
+# Error panel labels
+error_more_info=Daha çox məlumati
+error_less_info=Daha az məlumat
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (yığma: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=İsmarıc: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stek: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fayl: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Sətir: {{line}}
+rendering_error=Səhifə göstərilərkən səhv yarandı.
+
+# Predefined zoom values
+page_scale_width=Səhifə genişliyi
+page_scale_fit=Səhifəni sığdır
+page_scale_auto=Avtomatik yaxınlaşdır
+page_scale_actual=Hazırki Həcm
+
+# Loading indicator messages
+loading_error_indicator=Səhv
+loading_error=PDF yüklenərkən bir səhv yarandı.
+invalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl.
+missing_file_error=PDF fayl yoxdur.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotasiyası]
+password_label=Bu PDF faylı açmaq üçün şifrəni daxil edin.
+password_invalid=Şifrə yanlışdır. Bir daha sınayın.
+password_ok=OK
+password_cancel=Ləğv et
+
+printing_not_supported=Xəbərdarlıq: Çap bu brauzer tərəfindən tam olaraq dəstəklənmir.
+printing_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib.
+web_fonts_disabled=Veb Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil.
+document_colors_disabled=PDF sənədlərə öz rənglərini işlətməyə icazə verilmir: 'Səhifələrə öz rənglərini istifadə etməyə icazə vermə' səyyahda söndürülüb.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/be/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/be/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c681cf19d9c2f0c1468d114b63088ea56486391c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/be/chrome.properties
@@ -0,0 +1,4 @@
+unsupported_feature = Гэты дакумент PDF можа адлюстроўвацца няправільна.
+unsupported_feature_forms = Гэты дакумент PDF змяшчае формы. Запаўненне палёў формаў не падтрымліваецца.
+open_with_different_viewer = Адкрыць у іншым праглядніку
+open_with_different_viewer.accessKey = А
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/be/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/be/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4c6b7c9bcd63b46afc6ad004e6f3fab653d5abb3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/be/viewer.properties
@@ -0,0 +1,103 @@
+previous.title = Папярэдняя старонка
+previous_label = Папярэдняя
+next.title = Наступная старонка
+next_label = Наступная
+page_label = Старонка:
+page_of = з {{pageCount}}
+zoom_out.title = Паменшыць
+zoom_out_label = Паменшыць
+zoom_in.title = Павялічыць
+zoom_in_label = Павялічыць
+zoom.title = Павялічэнне тэксту
+presentation_mode.title = Пераключыцца ў рэжым паказу
+presentation_mode_label = Рэжым паказу
+open_file.title = Адчыніць файл
+open_file_label = Адчыніць
+print.title = Друкаваць
+print_label = Друкаваць
+download.title = Загрузка
+download_label = Загрузка
+bookmark.title = Цяперашняя праява (скапіяваць або адчыніць у новым акне)
+bookmark_label = Цяперашняя праява
+tools.title = Прылады
+tools_label = Прылады
+first_page.title = Перайсці на першую старонку
+first_page.label = Перайсці на першую старонку
+first_page_label = Перайсці на першую старонку
+last_page.title = Перайсці на апошнюю старонку
+last_page.label = Перайсці на апошнюю старонку
+last_page_label = Перайсці на апошнюю старонку
+page_rotate_cw.title = Павярнуць па гадзіннікавай стрэлцы
+page_rotate_cw.label = Павярнуць па гадзіннікавай стрэлцы
+page_rotate_cw_label = Павярнуць па гадзіннікавай стрэлцы
+page_rotate_ccw.title = Павярнуць супраць гадзіннікавай стрэлкі
+page_rotate_ccw.label = Павярнуць супраць гадзіннікавай стрэлкі
+page_rotate_ccw_label = Павярнуць супраць гадзіннікавай стрэлкі
+hand_tool_enable.title = Дазволіць ручную прыладу
+hand_tool_enable_label = Дазволіць ручную прыладу
+hand_tool_disable.title = Забараніць ручную прыладу
+hand_tool_disable_label = Забараніць ручную прыладу
+document_properties.title = Уласцівасці дакумента…
+document_properties_label = Уласцівасці дакумента…
+document_properties_file_name = Назва файла:
+document_properties_file_size = Памер файла:
+document_properties_kb = {{size_kb}} КБ ({{size_b}} байт)
+document_properties_mb = {{size_mb}} МБ ({{size_b}} байт)
+document_properties_title = Загаловак:
+document_properties_author = Аўтар:
+document_properties_subject = Тэма:
+document_properties_keywords = Ключавыя словы:
+document_properties_creation_date = Дата стварэння:
+document_properties_modification_date = Дата змянення:
+document_properties_date_string = {{date}}, {{time}}
+document_properties_creator = Стваральнік:
+document_properties_producer = Вырабнік PDF:
+document_properties_version = Версія PDF:
+document_properties_page_count = Колькасць старонак:
+document_properties_close = Зачыніць
+toggle_sidebar.title = Пераключэнне палічкі
+toggle_sidebar_label = Пераключыць палічку
+outline.title = Паказ будовы дакумента
+outline_label = Будова дакумента
+thumbs.title = Паказ накідаў
+thumbs_label = Накіды
+findbar.title = Пошук у дакуменце
+findbar_label = Знайсці
+thumb_page_title = Старонка {{page}}
+thumb_page_canvas = Накід старонкі {{page}}
+find_label = Пошук:
+find_previous.title = Знайсці папярэдні выпадак выразу
+find_previous_label = Папярэдні
+find_next.title = Знайсці наступны выпадак выразу
+find_next_label = Наступны
+find_highlight = Падфарбаваць усе
+find_match_case_label = Адрозніваць вялікія/малыя літары
+find_reached_top = Дасягнуты пачатак дакумента, працяг з канца
+find_reached_bottom = Дасягнуты канец дакумента, працяг з пачатку
+find_not_found = Выраз не знойдзены
+error_more_info = Падрабязней
+error_less_info = Сцісла
+error_close = Закрыць
+error_version_info = PDF.js в{{version}} (пабудова: {{build}})
+error_message = Паведамленне: {{message}}
+error_stack = Стос: {{stack}}
+error_file = Файл: {{file}}
+error_line = Радок: {{line}}
+rendering_error = Здарылася памылка падчас адлюстравання старонкі.
+page_scale_width = Шырыня старонкі
+page_scale_fit = Уцісненне старонкі
+page_scale_auto = Самастойнае павялічэнне
+page_scale_actual = Сапраўдны памер
+loading_error_indicator = Памылка
+loading_error = Здарылася памылка падчас загрузкі PDF.
+invalid_file_error = Няспраўны або пашкоджаны файл PDF.
+missing_file_error = Адсутны файл PDF.
+text_annotation_type.alt = [{{type}} Annotation]
+password_label = Увядзіце пароль, каб адчыніць гэты файл PDF.
+password_invalid = Крывы пароль. Паспрабуйце зноў.
+password_ok = Добра
+password_cancel = Скасаваць
+printing_not_supported = Папярэджанне: друк не падтрымлівацца цалкам гэтым азіральнікам.
+printing_not_ready = Увага: PDF не сцягнуты цалкам для друкавання.
+web_fonts_disabled = Шрыфты Сеціва забаронены: немгчыма ўжываць укладзеныя шрыфты PDF.
+document_colors_disabled = Дакументам PDF не дазволена карыстацца сваімі ўласнымі колерамі: 'Дазволіць старонкам выбіраць свае ўласныя колеры' абяздзейнена ў азіральніку.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bg/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/bg/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..fc69ff039ded56f2ae99db678a684acd112107db
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bg/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Този PDF може и да не се покаже правилно.
+open_with_different_viewer=Отваряне с различна програма за показване
+open_with_different_viewer.accessKey=О
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bg/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/bg/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..52c98df4b641c624bfc53d5d3d11a146fa9114dc
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bg/viewer.properties
@@ -0,0 +1,124 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Предишна страница
+previous_label=Предишна
+next.title=Следваща страница
+next_label=Следваща
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Страница:
+page_of=от {{pageCount}}
+
+zoom_out.title=Отдалечаване
+zoom_out_label=Отдалечаване
+zoom_in.title=Приближаване
+zoom_in_label=Приближаване
+zoom.title=Мащабиране
+print.title=Отпечатване
+print_label=Отпечатване
+presentation_mode.title=Превключване към режим на представяне
+presentation_mode_label=Режим на представяне
+open_file.title=Отваряне на файл
+open_file_label=Отваряне
+download.title=Изтегляне
+download_label=Изтегляне
+bookmark.title=Текущ изглед (копиране или отваряне в нов прозорец)
+bookmark_label=Текущ изглед
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Превключване на страничната лента
+toggle_sidebar_label=Превключване на страничната лента
+outline.title=Показване на очертанията на документа
+outline_label=Очертание на документа
+thumbs.title=Показване на миниатюрите
+thumbs_label=Миниатюри
+findbar.title=Намиране в документа
+findbar_label=Търсене
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Страница {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Миниатюра на страница {{page}}
+
+# Context menu
+first_page.label=Към първата страница
+last_page.label=Към последната страница
+page_rotate_cw.label=Превъртане по часовниковата стрелка
+page_rotate_ccw.label=Превъртане обратно на часовниковата стрелка
+
+# Find panel button title and messages
+find_label=Търсене:
+find_previous.title=Намиране на предното споменаване на тази фраза
+find_previous_label=Предишна
+find_next.title=Намиране на следващото споменаване на тази фраза
+find_next_label=Следваща
+find_highlight=Маркирай всички
+find_match_case_label=Точно съвпадения
+find_reached_top=Достигнато е началото на документа. Търсенето ще продължи до края му.
+find_reached_bottom=Достигнат е края на документа. Търсенето ще продължи от началото му.
+find_not_found=Фразата не е намерена
+
+# Error panel labels
+error_more_info=Повече информация
+error_less_info=По-малко информация
+error_close=Затваряне
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js версия {{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Съобщение: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Стек: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Файл: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Ред: {{line}}
+rendering_error=Грешка при изчертаване на страницата.
+
+# Predefined zoom values
+page_scale_width=Ширина на страницата
+page_scale_fit=Вместване в страницата
+page_scale_auto=Автоматично мащабиране
+page_scale_actual=Действителен размер
+
+# Loading indicator messages
+loading_error_indicator=Грешка
+loading_error=Получи се грешка при зареждане на PDF-а.
+invalid_file_error=Невалиден или повреден PDF файл
+missing_file_error=Липсващ PDF файл.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Анотация {{type}}]
+request_password=Защитен от парола PDF:
+invalid_password=Невалидна парола.
+
+printing_not_supported=Внимание: Този браузър няма пълна поддръжка на отпечатване.
+printing_not_ready=Внимание: Този PDF файл не е напълно зареден за печат.
+web_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове.
+document_colors_disabled=На PDF-документите не е разрешено да използват собствени цветове: „Разрешаване на страниците да избират собствени цветове“ е деактивирано в браузъра.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bn-BD/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/bn-BD/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..62fa60e9791cbf7c374b90c5b4fe20999911bf2b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bn-BD/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=পিডিএফ নথিটি সঠিক ভাবে প্রদর্শিত নাও হতে পারে।
+open_with_different_viewer=ভিন্ন প্রদর্শকে খুলুন
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bn-BD/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/bn-BD/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6577a3660db306a4cf2c6ce31a2552453f845f80
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bn-BD/viewer.properties
@@ -0,0 +1,139 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=পূর্ববর্তী পৃষ্ঠা
+previous_label=পূর্ববর্তী
+next.title=পরবর্তী পৃষ্ঠা
+next_label=পরবর্তী
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=পৃষ্ঠা:
+page_of={{pageCount}} এর
+
+zoom_out.title=ছোট আকারে প্রদর্শন
+zoom_out_label=ছোট আকারে প্রদর্শন
+zoom_in.title=বড় আকারে প্রদর্শন
+zoom_in_label=বড় আকারে প্রদর্শন
+zoom.title=বড় আকারে প্রদর্শন
+presentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন
+presentation_mode_label=উপস্থাপনা মোড
+open_file.title=ফাইল খুলুন
+open_file_label=খুলুন
+print.title=মুদ্রণ
+print_label=মুদ্রণ
+download.title=ডাউনলোড
+download_label=ডাউনলোড
+bookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন)
+bookmark_label=বর্তমান অবস্থা
+
+# Secondary toolbar and context menu
+tools.title=টুল
+tools_label=টুল
+first_page.title=প্রথম পাতায় যাও
+first_page.label=প্রথম পাতায় যাও
+first_page_label=প্রথম পাতায় যাও
+last_page.title=শেষ পাতায় যাও
+last_page.label=শেষ পাতায় যাও
+last_page_label=শেষ পাতায় যাও
+page_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও
+page_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও
+page_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও
+page_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও
+page_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও
+page_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও
+
+
+# Document properties dialog box
+document_properties_title=শিরোনাম:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=সাইডবার টগল করুন
+toggle_sidebar_label=সাইডবার টগল করুন
+outline.title=নথির রূপরেখা প্রদর্শন করুন
+outline_label=নথির রূপরেখা
+thumbs.title=থাম্বনেইল সমূহ  প্রদর্শন করুন
+thumbs_label=থাম্বনেইল সমূহ
+findbar.title=নথির মধ্যে খুঁজুন
+findbar_label=অনুসন্ধান
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=পৃষ্ঠা {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} পৃষ্ঠার থাম্বনেইল
+
+# Find panel button title and messages
+find_label=অনুসন্ধান:
+find_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান
+find_previous_label=পূর্ববর্তী
+find_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান
+find_next_label=পরবর্তী
+find_highlight=সব হাইলাইট করা হবে
+find_match_case_label=অক্ষরের ছাঁদ মেলানো
+find_reached_top=পৃষ্ঠার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে
+find_reached_bottom=পৃষ্ঠার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে
+find_not_found=বাক্যাংশ পাওয়া যায়নি
+
+# Error panel labels
+error_more_info=আরও তথ্য
+error_less_info=কম তথ্য
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=বার্তা: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=নথি: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=লাইন: {{line}}
+rendering_error=পৃষ্ঠা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে।
+
+# Predefined zoom values
+page_scale_width=পৃষ্ঠার প্রস্থ
+page_scale_fit=পৃষ্ঠা ফিট করুন
+page_scale_auto=স্বয়ংক্রিয় জুম
+page_scale_actual=প্রকৃত আকার
+
+# Loading indicator messages
+loading_error_indicator=ত্রুটি
+loading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে।
+invalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল।
+missing_file_error=পিডিএফ ফাইল পাওয়া যাচ্ছে না।
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} টীকা]
+password_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন।
+password_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন।
+password_ok=ঠিক আছে
+password_cancel=বাতিল
+
+printing_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়।
+printing_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি।
+web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না।
+document_colors_disabled=পিডিএফ ডকুমেন্টকে তাদের নিজস্ব রঙ ব্যবহারে অনুমতি নেই: 'পাতা তাদের নিজেস্ব রঙ নির্বাচন করতে অনুমতি দিন' এই ব্রাউজারে নিষ্ক্রিয় রয়েছে।
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bn-IN/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/bn-IN/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6de3977f454ffdc123264ba53b451a5db775d7e6
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bn-IN/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=এই PDF নথিটি সঠিকরূপে প্রদর্শন নাও করা হতে পারে।
+open_with_different_viewer=ভিন্ন অ্যাপ্লিকেশন সহযোগে খুলুন
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bn-IN/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/bn-IN/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8834fab592f92055fb4c534ee5e6b23b12230b44
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bn-IN/viewer.properties
@@ -0,0 +1,139 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=পূর্ববর্তী পৃষ্ঠা
+previous_label=পূর্ববর্তী
+next.title=পরবর্তী পৃষ্ঠা
+next_label=পরবর্তী
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=পৃষ্ঠা:
+page_of=সর্বমোট {{pageCount}}
+
+zoom_out.title=ছোট মাপে প্রদর্শন
+zoom_out_label=ছোট মাপে প্রদর্শন
+zoom_in.title=বড় মাপে প্রদর্শন
+zoom_in_label=বড় মাপে প্রদর্শন
+zoom.title=প্রদর্শনের মাপ
+presentation_mode.title=উপস্থাপনা মোড স্যুইচ করুন
+presentation_mode_label=উপস্থাপনা মোড
+open_file.title=ফাইল খুলুন
+open_file_label=খুলুন
+print.title=প্রিন্ট করুন
+print_label=প্রিন্ট করুন
+download.title=ডাউনলোড করুন
+download_label=ডাউনলোড করুন
+bookmark.title=বর্তমান প্রদর্শন (কপি করুন অথবা নতুন উইন্ডোতে খুলুন)
+bookmark_label=বর্তমান প্রদর্শন
+
+# Secondary toolbar and context menu
+tools.title=সরঞ্জাম
+tools_label=সরঞ্জাম
+first_page.title=প্রথম পৃষ্ঠায় চলুন
+first_page.label=প্রথম পৃষ্ঠায় চলুন
+first_page_label=প্রথম পৃষ্ঠায় চলুন
+last_page.title=সর্বশেষ পৃষ্ঠায় চলুন
+last_page.label=সর্বশেষ পৃষ্ঠায় চলুন
+last_page_label=সর্বশেষ পৃষ্ঠায় চলুন
+page_rotate_cw.title=ডানদিকে ঘোরানো হবে
+page_rotate_cw.label=ডানদিকে ঘোরানো হবে
+page_rotate_cw_label=ডানদিকে ঘোরানো হবে
+page_rotate_ccw.title=বাঁদিকে ঘোরানো হবে
+page_rotate_ccw.label=বাঁদিকে ঘোরানো হবে
+page_rotate_ccw_label=বাঁদিকে ঘোরানো হবে
+
+
+# Document properties dialog box
+document_properties_title=শিরোনাম:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=সাইডবার টগল করুন
+toggle_sidebar_label=সাইডবার টগল করুন
+outline.title=নথির রূপরেখা প্রদর্শন
+outline_label=নথির রূপরেখা প্রদর্শন
+thumbs.title=থাম্ব-নেইল প্রদর্শন
+thumbs_label=থাম্ব-নেইল প্রদর্শন
+findbar.title=নথিতে খুঁজুন
+findbar_label=অনুসন্ধান করুন
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=পৃষ্ঠা {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=পৃষ্ঠা {{page}}-র থাম্ব-নেইল
+
+# Find panel button title and messages
+find_label=অনুসন্ধান:
+find_previous.title=চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন
+find_previous_label=পূর্ববর্তী
+find_next.title=চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন
+find_next_label=পরবর্তী
+find_highlight=সমগ্র উজ্জ্বল করুন
+find_match_case_label=হরফের ছাঁদ মেলানো হবে
+find_reached_top=পৃষ্ঠার প্রারম্ভে পৌছে গেছে, নীচের অংশ থেকে আরম্ভ করা হবে
+find_reached_bottom=পৃষ্ঠার অন্তিম প্রান্তে পৌছে গেছে, প্রথম অংশ থেকে আরম্ভ করা হবে
+find_not_found=পংক্তি পাওয়া যায়নি
+
+# Error panel labels
+error_more_info=অতিরিক্ত তথ্য
+error_less_info=কম তথ্য
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=পৃষ্ঠা প্রদর্শনকালে একটি সমস্যা দেখা দিয়েছে।
+
+# Predefined zoom values
+page_scale_width=পৃষ্ঠার প্রস্থ অনুযায়ী
+page_scale_fit=পৃষ্ঠার মাপ অনুযায়ী
+page_scale_auto=স্বয়ংক্রিয় মাপ নির্ধারণ
+page_scale_actual=প্রকৃত মাপ
+
+# Loading indicator messages
+loading_error_indicator=ত্রুটি
+loading_error=PDF লোড করার সময় সমস্যা দেখা দিয়েছে।
+invalid_file_error=অবৈধ বা ক্ষতিগ্রস্ত পিডিএফ ফাইল।
+missing_file_error=অনুপস্থিত PDF ফাইল
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=এই PDF ফাইল খোলার জন্য পাসওয়ার্ড দিন।
+password_invalid=পাসওয়ার্ড সঠিক নয়। অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন।
+password_ok=OK
+password_cancel=বাতিল করুন
+
+printing_not_supported=সতর্কবার্তা: এই ব্রাউজার দ্বারা প্রিন্ট ব্যবস্থা সম্পূর্ণরূপে সমর্থিত নয়।
+printing_not_ready=সতর্কবাণী: পিডিএফ সম্পূর্ণরূপে মুদ্রণের জন্য লোড করা হয় না.
+web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয় করা হয়েছে: এমবেডেড পিডিএফ ফন্ট ব্যবহার করতে অক্ষম.
+document_colors_disabled=পিডিএফ নথি তাদের নিজস্ব রং ব্যবহার করার জন্য অনুমতিপ্রাপ্ত নয়: ব্রাউজারে নিষ্ক্রিয় করা হয়েছে য়েন  'পেজ তাদের নিজস্ব রং নির্বাচন করার অনুমতি প্রদান করা য়ায়।'
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/br/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/br/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bdc0f7e7a503c69737b659e4189f0d6d4bf234bc
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/br/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Marteze n'eo ket skrammet an teuliad PDF-mañ gant un doare dereat.
+unsupported_feature_forms=An teuliad PDF-mañ a endalc'h furmskridoù. N'eo ket skoret leuniadur ar maezioù furmskridoù.
+open_with_different_viewer=Digeriñ gant ul lenner all
+open_with_different_viewer.accessKey=D
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/br/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/br/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e41b101fa179339b87899d52f702f6112df857e2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/br/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pajenn a-raok
+previous_label=A-raok
+next.title=Pajenn war-lerc'h
+next_label=War-lerc'h
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pajenn :
+page_of=eus {{pageCount}}
+
+zoom_out.title=Zoum bihanaat
+zoom_out_label=Zoum bihanaat
+zoom_in.title=Zoum brasaat
+zoom_in_label=Zoum brasaat
+zoom.title=Zoum
+presentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn
+presentation_mode_label=Mod kinnigadenn
+open_file.title=Digeriñ ur restr
+open_file_label=Digeriñ ur restr
+print.title=Moullañ
+print_label=Moullañ
+download.title=Pellgargañ
+download_label=Pellgargañ
+bookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez)
+bookmark_label=Gwel bremanel
+
+# Secondary toolbar and context menu
+tools.title=Ostilhoù
+tools_label=Ostilhoù
+first_page.title=Mont d'ar bajenn gentañ
+first_page.label=Mont d'ar bajenn gentañ
+first_page_label=Mont d'ar bajenn gentañ
+last_page.title=Mont d'ar bajenn diwezhañ
+last_page.label=Mont d'ar bajenn diwezhañ
+last_page_label=Mont d'ar bajenn diwezhañ
+page_rotate_cw.title=C'hwelañ gant roud ar bizied
+page_rotate_cw.label=C'hwelañ gant roud ar bizied
+page_rotate_cw_label=C'hwelañ gant roud ar bizied
+page_rotate_ccw.title=C'hwelañ gant roud gin ar bizied
+page_rotate_ccw.label=C'hwelañ gant roud gin ar bizied
+page_rotate_ccw_label=C'hwelañ gant roud gin ar bizied
+
+hand_tool_enable.title=Gweredekaat an ostilh "dorn"
+hand_tool_enable_label=Gweredekaat an ostilh "dorn"
+hand_tool_disable.title=Diweredekaat an ostilh "dorn"
+hand_tool_disable_label=Diweredekaat an ostilh "dorn"
+
+# Document properties dialog box
+document_properties.title=Perzhioù an teul…
+document_properties_label=Perzhioù an teul…
+document_properties_file_name=Anv restr :
+document_properties_file_size=Ment ar restr :
+document_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)
+document_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)
+document_properties_title=Titl :
+document_properties_author=Aozer :
+document_properties_subject=Danvez :
+document_properties_keywords=Gerioù-alc'hwez :
+document_properties_creation_date=Deiziad krouiñ :
+document_properties_modification_date=Deiziad kemmañ :
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Krouer :
+document_properties_producer=Kenderc'her PDF :
+document_properties_version=Handelv PDF :
+document_properties_page_count=Niver a bajennoù :
+document_properties_close=Serriñ
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez
+toggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez
+outline.title=Diskouez ar sinedoù
+outline_label=Sinedoù an teuliad
+thumbs.title=Diskouez ar melvennoù
+thumbs_label=Melvennoù
+findbar.title=Klask e-barzh an teuliad
+findbar_label=Klask
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pajenn {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Melvenn ar bajenn {{page}}
+
+# Find panel button title and messages
+find_label=Kavout :
+find_previous.title=Kavout an tamm frazenn kent o klotañ ganti
+find_previous_label=Kent
+find_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti
+find_next_label=War-lerc'h
+find_highlight=Usskediñ pep tra
+find_match_case_label=Teurel evezh ouzh ar pennlizherennoù
+find_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz
+find_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h
+find_not_found=N'haller ket kavout ar frazenn
+
+# Error panel labels
+error_more_info=Muioc'h a ditouroù
+error_less_info=Nebeutoc'h a ditouroù
+error_close=Serriñ
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js handelv {{version}} (kempunadur : {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Kemennadenn : {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Torn : {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Restr : {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linenn : {{line}}
+rendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad.
+
+# Predefined zoom values
+page_scale_width=Led ar bajenn
+page_scale_fit=Pajenn a-bezh
+page_scale_auto=Zoum emgefreek
+page_scale_actual=Ment wir
+
+# Loading indicator messages
+loading_error_indicator=Fazi
+loading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF.
+invalid_file_error=Restr PDF didalvoudek pe kontronet.
+missing_file_error=Restr PDF o vankout.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Notennañ]
+password_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ.
+password_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.
+password_ok=Mat eo
+password_cancel=Nullañ
+
+printing_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ.
+printing_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn.
+web_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet.
+document_colors_disabled=N'eo ket aotreet an teuliadoù PDF da arverañ o livioù dezho : diweredekaet eo 'Aotren ar pajennoù da zibab o livioù dezho' e-barzh ar merdeer.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bs/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/bs/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3125998655061ce3d93d497d45e0da6fe4307334
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bs/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ovaj PDF dokument možda neće biti prikazan ispravno.
+open_with_different_viewer=Otvori sa drugim preglednikom
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/bs/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/bs/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a89bf7afd4fcb35239ec1933cb697bb6fc491ca9
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/bs/viewer.properties
@@ -0,0 +1,125 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Prethodna strana
+previous_label=Prethodna
+next.title=Sljedeća strna
+next_label=Sljedeća
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Strana:
+page_of=od {{pageCount}}
+
+zoom_out.title=Umanji
+zoom_out_label=Umanji
+zoom_in.title=Uvećaj
+zoom_in_label=Uvećaj
+zoom.title=Uvećanje
+print.title=Å tampaj
+print_label=Å tampaj
+presentation_mode.title=Prebaci se u prezentacijski režim
+presentation_mode_label=Prezentacijski režim
+open_file.title=Otvori fajl
+open_file_label=Otvori
+download.title=Preuzmi
+download_label=Preuzmi
+bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)
+bookmark_label=Trenutni prikaz
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Uključi/isključi bočnu traku
+toggle_sidebar_label=Uključi/isključi bočnu traku
+outline.title=Prikaži konture dokumenta
+outline_label=Konture dokumenta
+thumbs.title=Prikaži thumbnailove
+thumbs_label=Thumbnailovi
+findbar.title=Pronađi u dokumentu
+findbar_label=Pronađi
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strana {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail strane {{page}}
+
+# Context menu
+first_page.label=Idi na prvu stranu
+last_page.label=Idi na zadnju stranu
+page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu
+page_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu
+
+# Find panel button title and messages
+find_label=Pronađi:
+find_previous.title=Pronađi prethodno pojavljivanje fraze
+find_previous_label=Prethodno
+find_next.title=Pronađi sljedeće pojavljivanje fraze
+find_next_label=Sljedeće
+find_highlight=Označi sve
+find_match_case_label=Osjetljivost na karaktere
+find_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna
+find_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha
+find_not_found=Fraza nije pronađena
+
+# Error panel labels
+error_more_info=Više informacija
+error_less_info=Manje informacija
+error_close=Zatvori
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Poruka: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fajl: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linija: {{line}}
+rendering_error=Došlo je do greške prilikom renderiranja strane.
+
+# Predefined zoom values
+page_scale_width=Å irina strane
+page_scale_fit=Uklopi stranu
+page_scale_auto=Automatsko uvećanje
+page_scale_actual=Stvarna veličina
+
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+loading_error_indicator=Greška
+loading_error=Došlo je do greške prilikom učitavanja PDF-a.
+invalid_file_error=Neispravan ili oštećen PDF fajl.
+missing_file_error=Nedostaje PDF fajl.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{[type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} pribilješka]
+request_password=PDF je zaštićen lozinkom:
+invalid_password=Pogrešna lozinka.
+
+printing_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru.
+printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje.
+web_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove.
+document_colors_disabled=PDF dokumentima nije dozvoljeno da koriste vlastite boje: \'Dozvoli stranicama da izaberu vlastite boje\' je deaktivirano u browseru.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ca/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ca/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2373dbb02e1a8fba9d371ce3abd86888bd0554b7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ca/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Aquest document PDF potser no es mostra correctament.
+unsupported_feature_forms=Aquest document PDF conté formularis. L'emplenat de camps de formularis no està implementat.
+open_with_different_viewer=Obre amb un altre visor
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ca/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ca/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d55ef2106670aea5a8022be5aece682bea8e1106
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ca/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pàgina anterior
+previous_label=Anterior
+next.title=Pàgina següent
+next_label=Següent
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pàgina:
+page_of=de {{pageCount}}
+
+zoom_out.title=Allunya
+zoom_out_label=Allunya
+zoom_in.title=Apropa
+zoom_in_label=Apropa
+zoom.title=Escala
+presentation_mode.title=Canvia al mode de presentació
+presentation_mode_label=Mode de presentació
+open_file.title=Obre el fitxer
+open_file_label=Obre
+print.title=Imprimeix
+print_label=Imprimeix
+download.title=Baixa
+download_label=Baixa
+bookmark.title=Vista actual (copia o obre en una finestra nova)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Eines
+tools_label=Eines
+first_page.title=Vés a la primera pàgina
+first_page.label=Vés a la primera pàgina
+first_page_label=Vés a la primera pàgina
+last_page.title=Vés a l'última pàgina
+last_page.label=Vés a l'última pàgina
+last_page_label=Vés a l'última pàgina
+page_rotate_cw.title=Gira cap a la dreta
+page_rotate_cw.label=Gira cap a la dreta
+page_rotate_cw_label=Gira cap a la dreta
+page_rotate_ccw.title=Gira cap a l'esquerra
+page_rotate_ccw.label=Gira cap a l'esquerra
+page_rotate_ccw_label=Gira cap a l'esquerra
+
+hand_tool_enable.title=Habilita l'eina de mà
+hand_tool_enable_label=Habilita l'eina de mà
+hand_tool_disable.title=Inhabilita l'eina de mà
+hand_tool_disable_label=Inhabilita l'eina de mà
+
+# Document properties dialog box
+document_properties.title=Propietats del document…
+document_properties_label=Propietats del document…
+document_properties_file_name=Nom del fitxer:
+document_properties_file_size=Mida del fitxer:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Títol:
+document_properties_author=Autor:
+document_properties_subject=Assumpte:
+document_properties_keywords=Paraules clau:
+document_properties_creation_date=Data de creació:
+document_properties_modification_date=Data de modificació:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Generador de PDF:
+document_properties_version=Versió de PDF:
+document_properties_page_count=Nombre de pàgines:
+document_properties_close=Tanca
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Mostra/amaga la barra lateral
+toggle_sidebar_label=Mostra/amaga la barra lateral
+outline.title=Mostra el contorn del document
+outline_label=Contorn del document
+thumbs.title=Mostra les miniatures
+thumbs_label=Miniatures
+findbar.title=Cerca al document
+findbar_label=Cerca
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pàgina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de la pàgina {{page}}
+
+# Find panel button title and messages
+find_label=Cerca:
+find_previous.title=Cerca l'anterior coincidència de l'expressió
+find_previous_label=Anterior
+find_next.title=Cerca la següent coincidència de l'expressió
+find_next_label=Següent
+find_highlight=Ressalta-ho tot
+find_match_case_label=Distingeix entre majúscules i minúscules
+find_reached_top=S'ha arribat al principi del document, es continua pel final
+find_reached_bottom=S'ha arribat al final del document, es continua pel principi
+find_not_found=No s'ha trobat l'expressió
+
+# Error panel labels
+error_more_info=Més informació
+error_less_info=Menys informació
+error_close=Tanca
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (muntatge: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Missatge: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fitxer: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Línia: {{line}}
+rendering_error=S'ha produït un error mentre es renderitzava la pàgina
+
+# Predefined zoom values
+page_scale_width=Amplària de la pàgina
+page_scale_fit=Ajusta la pàgina
+page_scale_auto=Zoom automàtic
+page_scale_actual=Mida real
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=S'ha produït un error en carregar el PDF.
+invalid_file_error=El fitxer PDF no és vàlid o està malmès.
+missing_file_error=Falta el fitxer PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotació {{type}}]
+password_label=Introduïu la contrasenya per obrir aquest fitxer PDF.
+password_invalid=La contrasenya no és vàlida. Torneu-ho a provar.
+password_ok=D'acord
+password_cancel=Cancel·la
+
+printing_not_supported=Avís: la impressió no és plenament funcional en aquest navegador.
+printing_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo.
+web_fonts_disabled=Les fonts web estan inhabilitades: no es poden incrustar fitxers PDF.
+document_colors_disabled=Els documents PDF no poden usar els seus colors propis: «Permet a les pàgines triar els colors propis» es troba desactivat al navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/cs/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/cs/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1d7ad0c56174e4f4c462a0ee203e3890ce71a256
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/cs/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Tento dokument PDF se nemusí zobrazovat správně.
+unsupported_feature_forms=Tento dokument PDF obsahuje formuláře. Vyplňování formulářových polí není podporováno.
+open_with_different_viewer=Zobrazit pomocí jiného prohlížeče
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/cs/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/cs/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7a97b8ab0f9a42423caa30bffcaa2cd343223792
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/cs/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Předchozí stránka
+previous_label=Předchozí
+next.title=Další stránka
+next_label=Další
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Stránka:
+page_of=z {{pageCount}}
+
+zoom_out.title=Zmenší velikost
+zoom_out_label=Zmenšit
+zoom_in.title=Zvětší velikost
+zoom_in_label=Zvětšit
+zoom.title=Nastaví velikost
+presentation_mode.title=Přepne režimu prezentace
+presentation_mode_label=Režim prezentace
+open_file.title=Otevře soubor
+open_file_label=Otevřít
+print.title=Vytiskne dokument
+print_label=Tisk
+download.title=Stáhne dokument
+download_label=Stáhnout
+bookmark.title=Aktuální pohled (kopírovat nebo otevřít v novém okně)
+bookmark_label=Aktuální pohled
+
+# Secondary toolbar and context menu
+tools.title=Nástroje
+tools_label=Nástroje
+first_page.title=Přejde na první stránku
+first_page.label=Přejít na první stránku
+first_page_label=Přejít na první stránku
+last_page.title=Přejde na poslední stránku
+last_page.label=Přejít na poslední stránku
+last_page_label=Přejít na poslední stránku
+page_rotate_cw.title=Otočí po směru hodin
+page_rotate_cw.label=Otočit po směru hodin
+page_rotate_cw_label=Otočit po směru hodin
+page_rotate_ccw.title=Otočí proti směru hodin
+page_rotate_ccw.label=Otočit proti směru hodin
+page_rotate_ccw_label=Otočit proti směru hodin
+
+hand_tool_enable.title=Povolit nástroj ručička
+hand_tool_enable_label=Povolit nástroj ručička
+hand_tool_disable.title=Zakázat nástroj ručička
+hand_tool_disable_label=Zakázat nástroj ručička
+
+# Document properties dialog box
+document_properties.title=Vlastnosti dokumentu…
+document_properties_label=Vlastnosti dokumentu…
+document_properties_file_name=Název souboru:
+document_properties_file_size=Velikost souboru:
+document_properties_kb={{size_kb}} kB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Nadpis:
+document_properties_author=Autor:
+document_properties_subject=Subjekt:
+document_properties_keywords=Klíčová slova:
+document_properties_creation_date=Datum vytvoření:
+document_properties_modification_date=Datum úpravy:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Vytvořil:
+document_properties_producer=Tvůrce PDF:
+document_properties_version=Verze PDF:
+document_properties_page_count=Počet stránek:
+document_properties_close=Zavřít
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Postranní lišta
+toggle_sidebar_label=Postranní lišta
+outline.title=Zobrazí osnovu dokumentu
+outline_label=Osnova dokumentu
+thumbs.title=Zobrazí náhledy
+thumbs_label=Náhledy
+findbar.title=Najde v dokumentu
+findbar_label=Najít
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strana {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Náhled strany {{page}}
+
+# Find panel button title and messages
+find_label=Najít:
+find_previous.title=Najde předchozí výskyt hledaného spojení
+find_previous_label=Předchozí
+find_next.title=Najde další výskyt hledaného spojení
+find_next_label=Další
+find_highlight=Zvýraznit
+find_match_case_label=Rozlišovat velikost
+find_reached_top=Dosažen začátek dokumentu, pokračuje se od konce
+find_reached_bottom=Dosažen konec dokumentu, pokračuje se o začátku
+find_not_found=Hledané spojení nenalezeno
+
+# Error panel labels
+error_more_info=Více informací
+error_less_info=Méně informací
+error_close=Zavřít
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (sestavení: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Zpráva: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Zásobník: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Soubor: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Řádka: {{line}}
+rendering_error=Při vykreslování stránky nastala chyba.
+
+# Predefined zoom values
+page_scale_width=Podle šířky
+page_scale_fit=Podle výšky
+page_scale_auto=Automatická velikost
+page_scale_actual=Aktuální velikost
+
+# Loading indicator messages
+loading_error_indicator=Chyba
+loading_error=Při nahrávání PDF nastala chyba.
+invalid_file_error=Neplatný nebo chybný soubor PDF.
+missing_file_error=Chybí soubor PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotace typu {{type}}]
+password_label=Pro otevření PDF souboru vložte heslo.
+password_invalid=Neplatné heslo. Zkuste to znovu.
+password_ok=OK
+password_cancel=Zrušit
+
+printing_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován.
+printing_not_ready=Upozornění: Dokument PDF není kompletně načten.
+web_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF.
+document_colors_disabled=PDF dokumenty nemají povoleny používání vlastních barev: volba \'Povolit stránkám používat vlastní barvy namísto výše zvolených\' je v prohlížeči deaktivována.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/csb/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/csb/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..99d117e66ee441096c9bb1b390a32bd2698984a3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/csb/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Nen lopk PDF mòże sã lëchò wëskrzëniwac
+open_with_different_viewer=Òtemkni w jinym czëtnikù
+open_with_different_viewer.accessKey = j
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/csb/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/csb/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..293a353c1497c0d35a96c3df2b3d6cd73d3b9708
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/csb/viewer.properties
@@ -0,0 +1,134 @@
+# 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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pòprzédnô strona
+previous_label=Pòprzédnô
+next.title=Nôslédnô strona
+next_label=Nôslédnô
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Strona:
+page_of=z {{pageCount}}
+
+zoom_out.title=Zmniészë
+zoom_out_label=Zmniészë
+zoom_in.title=Zwikszë
+zoom_in_label=Wiôlgòsc
+zoom.title=Wiôlgòsc
+print.title=Drëkùjë
+print_label=Drëkùjë
+presentation_mode.title=Przéńdzë w trib prezentacje 
+presentation_mode_label=Trib prezentacje 
+open_file.title=Ã’temkni lopk
+open_file_label=Ã’temkni
+download.title=Zladënk
+download_label=Zladënk
+bookmark.title=Spamiãtôj wëzdrzatk (kòpérëje, abò òtemkni w nowim òknnie)
+bookmark_label=Aktualny wëzdrzatk
+
+find_label=Szëkôj:
+find_previous.title=Biéj do pòprzédnégò wënikù szëkbë
+find_previous_label=Pòprzédny
+find_next.title=Biéj do nôslédnégò wënikù szëkbë
+find_next_label=Nôslédny
+find_highlight=Pòdszkrzëni wszëtczé
+find_match_case_label=Rozeznôwôj miarã lëterów
+find_not_found=Nie nalôzł tekstu
+find_reached_bottom=Doszedł do kùńca dokùmentu, zaczinającë òd górë
+find_reached_top=Doszedł do pòczątkù dokùmentu, zaczinającë òd dołù
+
+toggle_sidebar.title=Pòsuwk wëbiérkù
+toggle_sidebar_label=Pòsuwk wëbiérkù
+
+outline.title=Wëskrzëni òbcéch dokùmentu
+outline_label=Òbcéch dokùmentu
+thumbs.title=Wëskrzëni miniaturë
+thumbs_label=Miniaturë
+findbar.title=Przeszëkôj dokùment
+findbar_label=Nalezë
+tools_label=Nôrzãdła
+first_page.title=Biéj do pierszi stronë
+first_page.label=Biéj do pierszi stronë
+last_page.label=Biéj do òstatny stronë
+invalid_file_error=Lëchi ôrt, abò pòpsëti lopk PDF.
+
+
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strona {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura stronë {{page}}
+
+# Error panel labels
+error_more_info=Wicy infòrmacje
+error_less_info=Mni infòrmacje
+error_close=Close
+error_version_info=PDF.js v{{version}} (build: {{build}})
+
+
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{wiadło}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stóg}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{lopk}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=Pòkôza sã fela przë renderowanim stronë.
+
+# Predefined zoom values
+page_scale_width=Szérzawa stronë
+page_scale_fit=Dopasëje stronã
+page_scale_auto=Aùtomatnô wiôlgòsc
+page_scale_actual=Naturalnô wiôlgòsc
+
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+loading_error_indicator=Fela
+loading_error=Pòkôza sã fela przë wczëtiwanim PDFù.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{[type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+
+request_password=PDF je zabezpieczony parolÄ…:
+printing_not_supported = Òstrzéga: przezérnik nie je do kùńca wspieróny przez drëkôrze 
+
+# Context menu
+page_rotate_cw.label=Òbkrãcë w prawò
+page_rotate_ccw.label=Òbkrãcë w lewò
+
+
+last_page.title=Biéj do pòprzédny stronë
+last_page_label=Biéj do pòprzédny stronë
+page_rotate_cw.title=Òbkrãcë w prawò
+page_rotate_cw_label=Òbkrãcë w prawò
+page_rotate_ccw.title=Òbkrãcë w lewò
+page_rotate_ccw_label=Òbkrãcë w lewò
+
+
+web_fonts_disabled=Sécowé czconczi są wëłączoné: włączë je, bë móc ùżiwac òsadzonëch czconków w lopkach PDF.
+
+
+missing_file_error=Felëje lopka PDF.
+printing_not_ready = Òstrzéga: lopk mùszi sã do kùńca wczëtac zanim gò mòże drëkòwac
+
+document_colors_disabled=Dokùmentë PDF nie mògą ù swòjich farwów: \'Pòzwòlë stronóm wëbierac swòje farwë\' je wëłączoné w przezérnikù.
+invalid_password=Lëchô parola.
+text_annotation_type.alt=[Adnotacjô {{type}}]
+
+tools.title=Tools
+first_page_label=Go to First Page
+
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/cy/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/cy/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5674b45c5b8388a819b4692e679208debfd72147
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/cy/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Efallai na fydd y ddogfen PDF yn cael ei dangos yn gywir.
+unsupported_feature_forms=Mae'r ffurflen PDF hon yn cynnwys ffurflenni. Nid yw llanw ffurflenni'n cael eu cynnal.
+open_with_different_viewer=Agor gyda Darllenydd Gwahanol
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/cy/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/cy/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3f0681af0bba91e0be6460f8e6792df41534c280
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/cy/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Tudalen Flaenorol
+previous_label=Blaenorol
+next.title=Tudalen Nesaf
+next_label=Nesaf
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Tudalen:
+page_of=o {{pageCount}}
+
+zoom_out.title=Chwyddo Allan
+zoom_out_label=Chwyddo Allan
+zoom_in.title=Chwyddo Mewn
+zoom_in_label=Chwyddo Mewn
+zoom.title=Chwyddo
+presentation_mode.title=Newid i'r Modd Cyflwyno
+presentation_mode_label=Modd Cyflwyno
+open_file.title=Agor Ffeil
+open_file_label=Agor
+print.title=Argraffu
+print_label=Argraffu
+download.title=Llwyth
+download_label=Llwytho i Lawr
+bookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd)
+bookmark_label=Golwg Gyfredol
+
+# Secondary toolbar and context menu
+tools.title=Offer
+tools_label=Offer
+first_page.title=Mynd i'r Dudalen Gyntaf
+first_page.label=Mynd i'r Dudalen Gyntaf
+first_page_label=Mynd i'r Dudalen Gyntaf
+last_page.title=Mynd i'r Dudalen Olaf
+last_page.label=Mynd i'r Dudalen Olaf
+last_page_label=Mynd i'r Dudalen Olaf
+page_rotate_cw.title=Cylchdroi Clocwedd
+page_rotate_cw.label=Cylchdroi Clocwedd
+page_rotate_cw_label=Cylchdroi Clocwedd
+page_rotate_ccw.title=Cylchdroi Gwrthglocwedd
+page_rotate_ccw.label=Cylchdroi Gwrthglocwedd
+page_rotate_ccw_label=Cylchdroi Gwrthglocwedd
+
+hand_tool_enable.title=Galluogi offeryn llaw
+hand_tool_enable_label=Galluogi offeryn llaw
+hand_tool_disable.title=Analluogi offeryn llaw
+hand_tool_disable_label=Analluogi offeryn llaw
+
+# Document properties dialog box
+document_properties.title=Priodweddau Dogfen…
+document_properties_label=Priodweddau Dogfen…
+document_properties_file_name=Enw ffeil:
+document_properties_file_size=Maint ffeil:
+document_properties_kb={{size_kb}} KB ({{size_b}} beit)
+document_properties_mb={{size_mb}} MB ({{size_b}} beit)
+document_properties_title=Teitl:
+document_properties_author=Awdur:
+document_properties_subject=Pwnc:
+document_properties_keywords=Allweddair:
+document_properties_creation_date=Dyddiad Creu:
+document_properties_modification_date=Dyddiad Addasu:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Crewr:
+document_properties_producer=Cynhyrchydd PDF:
+document_properties_version=Fersiwn PDF:
+document_properties_page_count=Cyfrif Tudalen:
+document_properties_close=Cau
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toglo'r Bar Ochr
+toggle_sidebar_label=Toglo'r Bar Ochr
+outline.title=Dangos Amlinell Dogfen
+outline_label=Amlinelliad Dogfen
+thumbs.title=Dangos Lluniau Bach
+thumbs_label=Lluniau Bach
+findbar.title=Canfod yn y Ddogfen
+findbar_label=Canfod
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Tudalen {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Llun Bach Tudalen {{page}}
+
+# Find panel button title and messages
+find_label=Canfod:
+find_previous.title=Canfod enghraifft flaenorol o'r ymadrodd
+find_previous_label=Blaenorol
+find_next.title=Canfod enghraifft nesaf yr ymadrodd
+find_next_label=Nesaf
+find_highlight=Amlygu popeth
+find_match_case_label=Cydweddu maint
+find_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod
+find_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig
+find_not_found=Heb ganfod ymadrodd
+
+# Error panel labels
+error_more_info=Rhagor o Wybodaeth
+error_less_info=Llai o wybodaeth
+error_close=Cau
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Neges: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stac: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ffeil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Llinell: {{line}}
+rendering_error=Digwyddodd gwall wrth adeiladu'r dudalen.
+
+# Predefined zoom values
+page_scale_width=Lled Tudalen
+page_scale_fit=Ffit Tudalen
+page_scale_auto=Chwyddo Awtomatig
+page_scale_actual=Maint Gwirioneddol
+
+# Loading indicator messages
+loading_error_indicator=Gwall
+loading_error=Digwyddodd gwall wrth lwytho'r PDF.
+invalid_file_error=Ffeil PDF annilys neu llwgr.
+missing_file_error=Ffeil PDF coll.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anodiad {{type}} ]
+password_label=Rhowch gyfrinair i agor y PDF.
+password_invalid=Cyfrinair annilys. Ceisiwch eto.
+password_ok=Iawn
+password_cancel=Diddymu
+
+printing_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.
+printing_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.
+web_fonts_disabled=Ffontiau gwe wedi eu hanablu: methu defnyddio ffontiau PDF mewnblanedig.
+document_colors_disabled=Nid oes caniatâd i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae 'Caniatáu i dudalennau ddefnyddio eu lliwiau eu hunain' wedi ei atal yn y porwr.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/da/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/da/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a62097dd50575b92c5c09e58557f294600b42136
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/da/chrome.properties
@@ -0,0 +1,9 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dette PDF-dokument vises måske ikke korrekt.
+unsupported_feature_forms=Dette PDF-dokument indeholder formularer. Udfyldning af formularfelter understøttes ikke.
+open_with_different_viewer=Ã…bn med et andet program
+open_with_different_viewer.accessKey=Ã…
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/da/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/da/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1aa292abee7a29a60df66d1d498b2c2e5860b693
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/da/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Forrige side
+previous_label=Forrige
+next.title=Næste side
+next_label=Næste
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Side:
+page_of=af {{pageCount}}
+
+zoom_out.title=Zoom ud
+zoom_out_label=Zoom ud
+zoom_in.title=Zoom ind
+zoom_in_label=Zoom ind
+zoom.title=Zoom
+print.title=Udskriv
+print_label=Udskriv
+presentation_mode.title=Skift til præsentations-tilstand
+presentation_mode_label=Præsentations-tilstand
+open_file.title=Ã…bn fil
+open_file_label=Ã…bn
+download.title=Hent
+download_label=Hent
+bookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue)
+bookmark_label=Aktuel visning
+
+# Secondary toolbar and context menu
+tools.title=Værktøj
+tools_label=Værktøj
+first_page.title=Gå til første side
+first_page.label=Gå til første side
+first_page_label=Gå til første side
+last_page.title=GÃ¥ til sidste side
+last_page.label=GÃ¥ til sidste side
+last_page_label=GÃ¥ til sidste side
+page_rotate_cw.title=Roter med uret
+page_rotate_cw.label=Roter med uret
+page_rotate_cw_label=Roter med uret
+page_rotate_ccw.title=Roter mod uret
+page_rotate_ccw.label=Roter mod uret
+page_rotate_ccw_label=Roter mod uret
+
+hand_tool_enable.title=Aktiver håndværktøj
+hand_tool_enable_label=Aktiver håndværktøj
+hand_tool_disable.title=Deaktiver håndværktøj
+hand_tool_disable_label=Deaktiver håndværktøj
+
+# Document properties dialog box
+document_properties.title=Dokumentegenskaber…
+document_properties_label=Dokumentegenskaber…
+document_properties_file_name=Filnavn:
+document_properties_file_size=Filstørrelse:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titel:
+document_properties_author=Forfatter:
+document_properties_subject=Emne:
+document_properties_keywords=Nøgleord:
+document_properties_creation_date=Oprettet:
+document_properties_modification_date=Redigeret:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Program:
+document_properties_producer=PDF-producent:
+document_properties_version=PDF-version:
+document_properties_page_count=Antal sider:
+document_properties_close=Luk
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Slå sidepanel til eller fra
+toggle_sidebar_label=Slå sidepanel til eller fra
+outline.title=Vis dokumentets disposition
+outline_label=Dokument-disposition
+thumbs.title=Vis miniaturer
+thumbs_label=Miniaturer
+findbar.title=Find i dokument
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniature af side {{page}}
+
+# Find panel button title and messages
+find_label=Find:
+find_previous.title=Find den forrige forekomst
+find_previous_label=Forrige
+find_next.title=Find den næste forekomst
+find_next_label=Næste
+find_highlight=Fremhæv alle
+find_match_case_label=Forskel på store og små bogstaver
+find_reached_top=Toppen af siden blev nået, fortsatte fra bunden
+find_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen
+find_not_found=Der blev ikke fundet noget
+
+# Error panel labels
+error_more_info=Mere information
+error_less_info=Mindre information
+error_close=Luk
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Fejlmeddelelse: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linje: {{line}}
+rendering_error=Der opstod en fejl ved generering af siden.
+
+# Predefined zoom values
+page_scale_width=Sidebredde
+page_scale_fit=Tilpas til side
+page_scale_auto=Automatisk zoom
+page_scale_actual=Faktisk størrelse
+
+# Loading indicator messages
+loading_error_indicator=Fejl
+loading_error=Der opstod en fejl ved indlæsning af PDF-filen.
+invalid_file_error=PDF-filen er ugyldig eller ødelagt.
+missing_file_error=Manglende PDF-fil.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}kommentar]
+password_label=Angiv adgangskode til at åbne denne PDF-fil.
+password_invalid=Ugyldig adgangskode. Prøv igen.
+password_ok=OK
+password_cancel=Fortryd
+
+printing_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren.
+printing_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning.
+web_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.
+document_colors_disabled=PDF-dokumenter må ikke bruge deres egne farver: \'Tillad sider at vælge deres egne farver\' er deaktiveret i browseren.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/de/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/de/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..080636e4611e8e9b994dd9a38254a254aed047e8
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/de/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Das PDF-Dokument wird eventuell nicht korrekt dargestellt.
+unsupported_feature_forms=Das PDF-Dokument enthält Formulare. Das Ausfüllen von Formularen wird nicht unterstützt.
+open_with_different_viewer=Mit anderem Programm ansehen
+open_with_different_viewer.accessKey=P
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/de/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/de/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..947b78493031534b289806a9af9398a3edfdbe16
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/de/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Eine Seite zurück
+previous_label=Zurück
+next.title=Eine Seite vor
+next_label=Vor
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Seite:
+page_of=von {{pageCount}}
+
+zoom_out.title=Verkleinern
+zoom_out_label=Verkleinern
+zoom_in.title=Vergrößern
+zoom_in_label=Vergrößern
+zoom.title=Zoom
+print.title=Drucken
+print_label=Drucken
+presentation_mode.title=In Präsentationsmodus wechseln
+presentation_mode_label=Präsentationsmodus
+open_file.title=Datei öffnen
+open_file_label=Öffnen
+download.title=Dokument speichern
+download_label=Speichern
+bookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster)
+bookmark_label=Aktuelle Ansicht
+
+# Secondary toolbar and context menu
+tools.title=Werkzeuge
+tools_label=Werkzeuge
+first_page.title=Erste Seite anzeigen
+first_page.label=Erste Seite anzeigen
+first_page_label=Erste Seite anzeigen
+last_page.title=Letzte Seite anzeigen
+last_page.label=Letzte Seite anzeigen
+last_page_label=Letzte Seite anzeigen
+page_rotate_cw.title=Im Uhrzeigersinn drehen
+page_rotate_cw.label=Im Uhrzeigersinn drehen
+page_rotate_cw_label=Im Uhrzeigersinn drehen
+page_rotate_ccw.title=Gegen Uhrzeigersinn drehen
+page_rotate_ccw.label=Gegen Uhrzeigersinn drehen
+page_rotate_ccw_label=Gegen Uhrzeigersinn drehen
+
+hand_tool_enable.title=Hand-Werkzeug aktivieren
+hand_tool_enable_label=Hand-Werkzeug aktivieren
+hand_tool_disable.title=Hand-Werkzeug deaktivieren
+hand_tool_disable_label=Hand-Werkzeug deaktivieren
+
+# Document properties dialog box
+document_properties.title=Dokumenteigenschaften
+document_properties_label=Dokumenteigenschaften…
+document_properties_file_name=Dateiname:
+document_properties_file_size=Dateigröße:
+document_properties_kb={{size_kb}} KB ({{size_b}} Bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} Bytes)
+document_properties_title=Titel:
+document_properties_author=Autor:
+document_properties_subject=Thema:
+document_properties_keywords=Stichwörter:
+document_properties_creation_date=Erstelldatum:
+document_properties_modification_date=Bearbeitungsdatum:
+document_properties_date_string={{date}} {{time}}
+document_properties_creator=Anwendung:
+document_properties_producer=PDF erstellt mit:
+document_properties_version=PDF-Version:
+document_properties_page_count=Seitenzahl:
+document_properties_close=Schließen
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sidebar umschalten
+toggle_sidebar_label=Sidebar umschalten
+outline.title=Dokumentstruktur anzeigen
+outline_label=Dokumentstruktur
+thumbs.title=Miniaturansichten anzeigen
+thumbs_label=Miniaturansichten
+findbar.title=Dokument durchsuchen
+findbar_label=Suchen
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Seite {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniaturansicht von Seite {{page}}
+
+# Find panel button title and messages
+find_label=Suchen:
+find_previous.title=Vorheriges Auftreten des Suchbegriffs finden
+find_previous_label=Zurück
+find_next.title=Nächstes Auftreten des Suchbegriffs finden
+find_next_label=Weiter
+find_highlight=Alle hervorheben
+find_match_case_label=Groß-/Kleinschreibung beachten
+find_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort
+find_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort
+find_not_found=Suchbegriff nicht gefunden
+
+# Error panel labels
+error_more_info=Mehr Informationen
+error_less_info=Weniger Informationen
+error_close=Schließen
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js Version {{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Nachricht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Aufrufliste: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datei: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Zeile: {{line}}
+rendering_error=Beim Darstellen der Seite trat ein Fehler auf.
+
+# Predefined zoom values
+page_scale_width=Seitenbreite
+page_scale_fit=Seitengröße
+page_scale_auto=Automatischer Zoom
+page_scale_actual=Derzeitige Größe
+
+# Loading indicator messages
+loading_error_indicator=Fehler
+loading_error=Beim Laden der PDF-Datei trat ein Fehler auf.
+invalid_file_error=Ungültige oder beschädigte PDF-Datei
+missing_file_error=Fehlende PDF-Datei
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anlage: {{type}}]
+password_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein.
+password_invalid=Falsches Passwort. Bitte versuchen Sie es erneut.
+password_ok=OK
+password_cancel=Abbrechen
+
+printing_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt.
+printing_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen.
+web_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.
+document_colors_disabled=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: \'Seiten das Verwenden von eigenen Farben erlauben\' ist im Browser deaktiviert.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/el/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/el/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..68db9f2eaac8a7ff491e7b419ee73861567352ec
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/el/chrome.properties
@@ -0,0 +1,9 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Αυτό το έγγραφο PDF μπορεί να μην εμφανιστεί σωστά
+open_with_different_viewer=Άνοιγμα με διαφορετική εφαρμογή
+open_with_different_viewer.accessKey=δ
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/el/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/el/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..36723c22b1527d84594d6f3d25f15edd6da002b0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/el/viewer.properties
@@ -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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Προηγούμενη σελίδα
+previous_label=Προηγούμενη
+next.title=Επόμενη σελίδα
+next_label=Επόμενη
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Σελίδα:
+page_of= {{pageCount}}
+
+zoom_out.title=Σμίκρυνση
+zoom_out_label=Σμίκρυνση
+zoom_in.title=Μεγέθυνση
+zoom_in_label=Μεγέθυνση
+zoom.title=Μεγέθυνση
+print.title=Εκτύπωση
+print_label=Εκτύπωση
+open_file.title=Άνοιγμα αρχείου
+open_file_label=Άνοιγμα
+download.title=Λήψη
+download_label=Λήψη
+bookmark.title=Τρέχουσα προβολή (αντίγραφο ή άνοιγμα σε νέο παράθυρο)
+bookmark_label=Τρέχουσα προβολή
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=Προβολή διάρθρωσης κειμένου
+outline_label=Διάρθρωση κειμένου
+thumbs.title=Προβολή μικρογραφιών
+thumbs_label=Μικρογραφίες
+
+
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Σελίδα {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Μικρογραφία της σελίδας {{page}}
+
+first_page.label=Μετάβαση στην πρώτη σελίδα
+
+# Error panel labels
+error_more_info=Περισσότερες πληροφορίες
+error_less_info=Λιγότερες πληροφορίες
+error_close=Κλείσιμο
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Μήνυμα: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Αρχείο: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας.
+
+# Predefined zoom values
+page_scale_width=Πλάτος σελίδας
+page_scale_fit=Μέγεθος σελίδας
+page_scale_auto=Αυτόματη μεγέθυνση
+page_scale_actual=Πραγματικό μέγεθος
+
+
+# Context menu
+page_rotate_cw.label=Δεξιόστροφη περιστροφή
+page_rotate_ccw.label=Αριστερόστροφη περιστροφή
+
+presentation_mode.title=Μετάβαση σε λειτουργία παρουσίασης
+presentation_mode_label=Λειτουργία παρουσίασης
+
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+
+loading_error_indicator=Σφάλμα
+loading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF.
+
+request_password=Το PDF προστατεύεται από κωδικό:
+
+printing_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή.
+
+
+
+findbar.title=Εύρεση στο έγγραφο
+findbar_label=Εύρεση
+
+
+# Find panel button title and messages
+find_label=Εύρεση:
+find_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης
+find_previous_label=Προηγούμενο
+find_next.title=Εύρεση της επόμενης εμφάνισης της φράσης
+find_next_label=Επόμενο
+find_highlight=Επισήμανση όλων
+find_match_case_label=Ταίριασμα χαρακτήρα
+find_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος
+find_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή
+find_not_found=Η φράση δεν βρέθηκε
+
+invalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF.
+last_page.label=Μετάβαση στη τελευταία σελίδα
+
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+
+missing_file_error=Λείπει αρχείο PDF.
+
+
+toggle_sidebar.title=Εναλλαγή προβολής πλευρικής στήλης
+toggle_sidebar_label=Εναλλαγή προβολής πλευρικής στήλης
+
+web_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF.
+
+printing_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση.
+
+document_colors_disabled=Δεν επιτρέπεται στα έγγραφα PDF να χρησιμοποιούν τα δικά τους χρώματα: Η επιλογή \'Να επιτρέπεται η χρήση χρωμάτων της σελίδας\' δεν είναι ενεργή στην εφαρμογή.
+
+invalid_password=Μη έγκυρος κωδικός.
+text_annotation_type.alt=[{{type}} Annotation]
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/en-GB/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/en-GB/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a934a814e6f993575631da9af2f29afe472e39de
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/en-GB/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=This PDF document might not be displayed correctly.
+unsupported_feature_forms=This PDF document contains forms. The filling of form fields is not supported.
+open_with_different_viewer=Open With Different Viewer
+open_with_different_viewer.accessKey=O
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/en-GB/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/en-GB/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bc408c71682973c6a29d028b1fc296a6e38df6ed
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/en-GB/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Page:
+page_of=of {{pageCount}}
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+print.title=Print
+print_label=Print
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Go to First Page
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Go to Last Page
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Counter-Clockwise
+page_rotate_ccw.label=Rotate Counter-Clockwise
+page_rotate_ccw_label=Rotate Counter-Clockwise
+
+hand_tool_enable.title=Enable hand tool
+hand_tool_enable_label=Enable hand tool
+hand_tool_disable.title=Disable hand tool
+hand_tool_disable_label=Disable hand tool
+
+# Document properties dialog box
+document_properties.title=Document Properties…
+document_properties_label=Document Properties…
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+document_properties_kb={{size_kb}} kB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_close=Close
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_label=Toggle Sidebar
+outline.title=Show Document Outline
+outline_label=Document Outline
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Find panel button title and messages
+find_label=Find:
+find_previous.title=Find the previous occurrence of the phrase
+find_previous_label=Previous
+find_next.title=Find the next occurrence of the phrase
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+find_not_found=Phrase not found
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+password_cancel=Cancel
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_disabled=PDF documents are not allowed to use their own colours: \'Allow pages to choose their own colours\' is deactivated in the browser.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/en-US/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/en-US/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e42ac790caa8a1ed82bdeed99f7f211c911cb20b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/en-US/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=This PDF document might not be displayed correctly.
+unsupported_feature_forms=This PDF document contains forms. The filling of form fields is not supported.
+open_with_different_viewer=Open With Different Viewer
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/en-US/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/en-US/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a10bb8f22751bcb71676677d86b774dce8377e81
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/en-US/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Page:
+page_of=of {{pageCount}}
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+print.title=Print
+print_label=Print
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Go to First Page
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Go to Last Page
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Counterclockwise
+page_rotate_ccw.label=Rotate Counterclockwise
+page_rotate_ccw_label=Rotate Counterclockwise
+
+hand_tool_enable.title=Enable hand tool
+hand_tool_enable_label=Enable hand tool
+hand_tool_disable.title=Disable hand tool
+hand_tool_disable_label=Disable hand tool
+
+# Document properties dialog box
+document_properties.title=Document Properties…
+document_properties_label=Document Properties…
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_close=Close
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_label=Toggle Sidebar
+outline.title=Show Document Outline
+outline_label=Document Outline
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Find panel button title and messages
+find_label=Find:
+find_previous.title=Find the previous occurrence of the phrase
+find_previous_label=Previous
+find_next.title=Find the next occurrence of the phrase
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+find_not_found=Phrase not found
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+password_cancel=Cancel
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_disabled=PDF documents are not allowed to use their own colors: \'Allow pages to choose their own colors\' is deactivated in the browser.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/en-ZA/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/en-ZA/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e42ac790caa8a1ed82bdeed99f7f211c911cb20b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/en-ZA/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=This PDF document might not be displayed correctly.
+unsupported_feature_forms=This PDF document contains forms. The filling of form fields is not supported.
+open_with_different_viewer=Open With Different Viewer
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/en-ZA/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/en-ZA/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5588ff19597ae881333fd2d1cc34241f39939f89
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/en-ZA/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Page:
+page_of=of {{pageCount}}
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+print.title=Print
+print_label=Print
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Go to First Page
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Go to Last Page
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Counterclockwise
+page_rotate_ccw.label=Rotate Counterclockwise
+page_rotate_ccw_label=Rotate Counterclockwise
+
+hand_tool_enable.title=Enable hand tool
+hand_tool_enable_label=Enable hand tool
+hand_tool_disable.title=Disable hand tool
+hand_tool_disable_label=Disable hand tool
+
+# Document properties dialog box
+document_properties.title=Document Properties…
+document_properties_label=Document Properties…
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_close=Close
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_label=Toggle Sidebar
+outline.title=Show Document Outline
+outline_label=Document Outline
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Find panel button title and messages
+find_label=Find:
+find_previous.title=Find the previous occurrence of the phrase
+find_previous_label=Previous
+find_next.title=Find the next occurrence of the phrase
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+find_not_found=Phrase not found
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+password_cancel=Cancel
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_disabled=PDF documents are not allowed to use their own colours: 'Allow pages to choose their own colours' is deactivated in the browser.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/eo/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/eo/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..241f500037c58cedf05b83352328f77686e5de68
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/eo/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Tiu ĉi dokumento PDF povus esti malĝuste montrita.
+unsupported_feature_forms=Tiu ĉi dokumento PDF enhavas formularojn. Plenigi kampojn de formularoj ne estas subtenata.
+open_with_different_viewer=Malfermi per alia programo
+open_with_different_viewer.accessKey=m
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/eo/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/eo/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..343f395dcdeb53db835caae6d1b0f84eb82140b6
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/eo/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Antaŭa paĝo
+previous_label=MalantaÅ­en
+next.title=Venonta paĝo
+next_label=AntaÅ­en
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Paĝo:
+page_of=el {{pageCount}}
+
+zoom_out.title=Malpligrandigi
+zoom_out_label=Malpligrandigi
+zoom_in.title=Pligrandigi
+zoom_in_label=Pligrandigi
+zoom.title=Pligrandigilo
+presentation_mode.title=Iri al prezenta reĝimo
+presentation_mode_label=Prezenta reĝimo
+open_file.title=Malfermi dosieron
+open_file_label=Malfermi
+print.title=Presi
+print_label=Presi
+download.title=Elŝuti
+download_label=Elŝuti
+bookmark.title=Nuna vido (kopii aÅ­ malfermi en nova fenestro)
+bookmark_label=Nuna vido
+
+# Secondary toolbar and context menu
+tools.title=Iloj
+tools_label=Iloj
+first_page.title=Iri al la unua paĝo
+first_page.label=Iri al la unua paĝo
+first_page_label=Iri al la unua paĝo
+last_page.title=Iri al la lasta paĝo
+last_page.label=Iri al la lasta paĝo
+last_page_label=Iri al la lasta paĝo
+page_rotate_cw.title=Rotaciigi dekstrume
+page_rotate_cw.label=Rotaciigi dekstrume
+page_rotate_cw_label=Rotaciigi dekstrume
+page_rotate_ccw.title=Rotaciigi maldekstrume
+page_rotate_ccw.label=Rotaciigi maldekstrume
+page_rotate_ccw_label=Rotaciigi maldekstrume
+
+hand_tool_enable.title=Aktivigi manan ilon
+hand_tool_enable_label=Aktivigi manan ilon
+hand_tool_disable.title=Malaktivigi manan ilon
+hand_tool_disable_label=Malaktivigi manan ilon
+
+# Document properties dialog box
+document_properties.title=Atributoj de dokumento…
+document_properties_label=Atributoj de dokumento…
+document_properties_file_name=Nomo de dosiero:
+document_properties_file_size=Grado de dosiero:
+document_properties_kb={{size_kb}} KO ({{size_b}} oktetoj)
+document_properties_mb={{size_mb}} MO ({{size_b}} oktetoj)
+document_properties_title=Titolo:
+document_properties_author=AÅ­toro:
+document_properties_subject=Temo:
+document_properties_keywords=Åœlosilvorto:
+document_properties_creation_date=Dato de kreado:
+document_properties_modification_date=Dato de modifo:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Kreinto:
+document_properties_producer=Produktinto de PDF:
+document_properties_version=Versio de PDF:
+document_properties_page_count=Nombro de paĝoj:
+document_properties_close=Fermi
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Montri/kaŝi flankan strion
+toggle_sidebar_label=Montri/kaŝi flankan strion
+outline.title=Montri skemon de dokumento
+outline_label=Skemo de dokumento
+thumbs.title=Montri miniaturojn
+thumbs_label=Miniaturoj
+findbar.title=Serĉi en dokumento
+findbar_label=Serĉi
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Paĝo {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniaturo de paĝo {{page}}
+
+# Find panel button title and messages
+find_label=Serĉi:
+find_previous.title=Serĉi la antaŭan aperon de la frazo
+find_previous_label=MalantaÅ­en
+find_next.title=Serĉi la venontan aperon de la frazo
+find_next_label=AntaÅ­en
+find_highlight=Elstarigi ĉiujn
+find_match_case_label=Distingi inter majuskloj kaj minuskloj
+find_reached_top=Komenco de la dokumento atingita, daÅ­rigado ekde la fino
+find_reached_bottom=Fino de la dokumento atingita, daÅ­rigado ekde la komenco
+find_not_found=Frazo ne trovita
+
+# Error panel labels
+error_more_info=Pli da informo
+error_less_info=Mapli da informo
+error_close=Fermi
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesaĝo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stako: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dosiero: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linio: {{line}}
+rendering_error=Okazis eraro dum la montrado de la paĝo.
+
+# Predefined zoom values
+page_scale_width=Larĝo de paĝo
+page_scale_fit=Adapti paĝon
+page_scale_auto=AÅ­tomata skalo
+page_scale_actual=Reala gandeco
+
+# Loading indicator messages
+loading_error_indicator=Eraro
+loading_error=Okazis eraro dum la ŝargado de la PDF dosiero.
+invalid_file_error=Nevalida aÅ­ difektita PDF dosiero.
+missing_file_error=Mankas dosiero PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Prinoto: {{type}}]
+password_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF.
+password_invalid=Nevalida pasvorto. Bonvolu provi denove.
+password_ok=Akcepti
+password_cancel=Nuligi
+
+printing_not_supported=Averto: tiu ĉi retesplorilo ne plene subtenas presadon.
+printing_not_ready=Warning: La PDF dosiero ne estas plene ŝargita por presado.
+web_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.
+document_colors_disabled=Dokumentoj PDF ne rajtas havi siajn proprajn kolorojn: \'Permesi al paĝoj elekti siajn proprajn kolorojn\' estas malaktiva en la retesplorilo.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-AR/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-AR/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..527cdbb2dfe1983ee2d6d1825f5f4c3a1365f0ee
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-AR/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Este documento PDF puede que no se muestre correctamente.
+unsupported_feature_forms=Este documento PDF cotiene formularios. Completar campos de un formulario no está soportado.
+open_with_different_viewer=Abrir con un visor diferente
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-AR/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-AR/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..26aad42546f04243aef5bd13dadc0465f704512f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-AR/viewer.properties
@@ -0,0 +1,167 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Página anterior
+previous_label=Anterior
+next.title=Página siguiente
+next_label=Siguiente
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Página:
+page_of=de {{pageCount}}
+
+zoom_out.title=Alejar
+zoom_out_label=Alejar
+zoom_in.title=Acercar
+zoom_in_label=Acercar
+zoom.title=Zoom
+print.title=Imprimir
+print_label=Imprimir
+presentation_mode.title=Cambiar a modo presentación
+presentation_mode_label=Modo presentación
+open_file.title=Abrir archivo
+open_file_label=Abrir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar o abrir en nueva ventana)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Herramientas
+tools_label=Herramientas
+first_page.title=Ir a primera página
+first_page.label=Ir a primera página
+first_page_label=Ir a primera página
+last_page.title=Ir a última página
+last_page.label=Ir a última página
+last_page_label=Ir a última página
+page_rotate_cw.title=Rotar horario
+page_rotate_cw.label=Rotar horario
+page_rotate_cw_label=Rotar horario
+page_rotate_ccw.title=Rotar antihorario
+page_rotate_ccw.label=Rotar antihorario
+page_rotate_ccw_label=Rotar antihorario
+
+hand_tool_enable.title=Habilitar herramienta mano
+hand_tool_enable_label=Habilitar herramienta mano
+hand_tool_disable.title=Deshabilitar herramienta mano
+hand_tool_disable_label=Deshabilitar herramienta mano
+
+# Document properties dialog box
+document_properties.title=Propiedades del documento…
+document_properties_label=Propiedades del documento…
+document_properties_file_name=Nombre de archivo:
+document_properties_file_size=Tamaño de archovo:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Título:
+document_properties_author=Autor:
+document_properties_subject=Asunto:
+document_properties_keywords=Palabras clave:
+document_properties_creation_date=Fecha de creación:
+document_properties_modification_date=Fecha de modificación:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=PDF Productor:
+document_properties_version=Versión de PDF:
+document_properties_page_count=Cantidad de páginas:
+document_properties_close=Cerrar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Alternar barra lateral
+toggle_sidebar_label=Alternar barra lateral
+outline.title=Mostrar esquema del documento
+outline_label=Esquema del documento
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Buscar en documento
+findbar_label=Buscar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Página {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de página {{page}}
+
+# Context menu
+first_page.label=Ir a la primera página
+last_page.label=Ir a la última página
+page_rotate_cw.label=Rotar en sentido horario
+page_rotate_ccw.label=Rotar en sentido antihorario
+
+# Find panel button title and messages
+find_label=Buscar:
+find_previous.title=Buscar la aparición anterior de la frase
+find_previous_label=Anterior
+find_next.title=Buscar la siguiente aparición de la frase
+find_next_label=Siguiente
+find_highlight=Resaltar todo
+find_match_case_label=Coincidir mayúsculas
+find_reached_top=Inicio de documento alcanzado, continuando desde abajo
+find_reached_bottom=Fin de documento alcanzando, continuando desde arriba
+find_not_found=Frase no encontrada
+
+# Error panel labels
+error_more_info=Más información
+error_less_info=Menos información
+error_close=Cerrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaje: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Archivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Línea: {{line}}
+rendering_error=Ocurrió un error al dibujar la página.
+
+# Predefined zoom values
+page_scale_width=Ancho de página
+page_scale_fit=Ajustar página
+page_scale_auto=Zoom automático
+page_scale_actual=Tamaño real
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Ocurrió un error al cargar el PDF.
+invalid_file_error=Archivo PDF no válido o cocrrupto.
+missing_file_error=Archivo PDF faltante.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Anotación]
+password_label=Ingrese la contraseña para abrir este archivo PDF
+password_invalid=Contraseña inválida. Intente nuevamente.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador.
+printing_not_ready=Advertencia: El PDF no está completamente cargado para impresión.
+web_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF.
+document_colors_disabled=Los documentos PDF no tienen permitido usar sus propios colores: \'Permitir a las páginas elegir sus propios colores\' está desactivado en el navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-CL/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-CL/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e5d661c8c6041033b76c94a47cf4ceb0d5ea0dcd
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-CL/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+unsupported_feature = Este documento PDF podría no ser mostrado correctamente.
+unsupported_feature_forms=Este PDF contiene formularios. El rellenar campos de formularios no está soportado.
+
+open_with_different_viewer = Abrir con un visor diferente
+open_with_different_viewer.accessKey = o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-CL/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-CL/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..cdef0a8578cd66ce631fc6a724720742db26fba5
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-CL/viewer.properties
@@ -0,0 +1,126 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+previous.title = Página anterior
+previous_label = Anterior
+next.title = Página siguiente
+next_label = Siguiente
+page_label = Página:
+page_of = de {{pageCount}}
+zoom_out.title = Alejar
+zoom_out_label = Alejar
+zoom_in.title = Acercar
+zoom_in_label = Acercar
+zoom.title = Ampliación
+print.title = Imprimir
+print_label = Imprimir
+presentation_mode.title = Cambiar al modo de presentación
+presentation_mode_label = Modo de presentación
+open_file.title = Abrir archivo
+open_file_label = Abrir
+download.title = Descargar
+download_label = Descargar
+bookmark.title = Vista actual (copiar o abrir en nueva ventana)
+bookmark_label = Vista actual
+tools.title=Herramientas
+tools_label=Herramientas
+first_page.title=Ir a la primera página
+first_page.label=Ir a la primera página
+first_page_label=Ir a la primera página
+last_page.title=Ir a la última página
+last_page.label=Ir a la última página
+last_page_label=Ir a la última página
+page_rotate_cw.title=Girar a la derecha
+page_rotate_cw.label=Girar a la derecha
+page_rotate_cw_label=Girar a la derecha
+page_rotate_ccw.title=Girar a la izquierda
+page_rotate_ccw.label=Girar a la izquierda
+page_rotate_ccw_label=Girar a la izquierda
+
+hand_tool_enable.title=Activar herramienta de mano
+hand_tool_enable_label=Activar herramienta de mano
+hand_tool_disable.title=Desactivar herramienta de mano
+hand_tool_disable_label=Desactivar herramienta de mano
+
+document_properties.title=Propiedades del documento…
+document_properties_label=Propiedades del documento…
+document_properties_file_name=Nombre del archivo:
+document_properties_file_size=Tamaño del archivo:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Título:
+document_properties_author=Autor:
+document_properties_subject=Asunto:
+document_properties_keywords=Palabras clave:
+document_properties_creation_date=Fecha de creación:
+document_properties_modification_date=Fecha de modificación:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Productor del PDF:
+document_properties_version=Versión de PDF:
+document_properties_page_count=Cantidad de páginas:
+document_properties_close=Cerrar
+
+toggle_sidebar.title=Cambiar barra lateral
+toggle_sidebar_label=Cambiar barra lateral
+outline.title = Mostrar esquema del documento
+outline_label = Esquema del documento
+thumbs.title = Mostrar miniaturas
+thumbs_label = Miniaturas
+findbar.title = Buscar en el documento
+findbar_label = Buscar
+thumb_page_title = Página {{page}}
+thumb_page_canvas = Miniatura de la página {{page}}
+first_page.label = Ir a la primera página
+last_page.label = Ir a la última página
+page_rotate_cw.label = Rotar en sentido de los punteros del reloj
+page_rotate_ccw.label = Rotar en sentido contrario a los punteros del reloj
+find_label = Buscar:
+find_previous.title = Encontrar la aparición anterior de la frase
+find_previous_label = Previo
+find_next.title = Encontrar la siguiente aparición de la frase
+find_next_label = Siguiente
+find_highlight = Destacar todos
+find_match_case_label = Coincidir mayús./minús.
+find_reached_top=Se alcanzó el inicio del documento, continuando desde el final
+find_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio
+find_not_found = Frase no encontrada
+error_more_info = Más información
+error_less_info = Menos información
+error_close = Cerrar
+error_version_info=PDF.js v{{version}} (compilación: {{build}})
+error_message = Mensaje: {{message}}
+error_stack = Pila: {{stack}}
+error_file = Archivo: {{file}}
+error_line = Línea: {{line}}
+rendering_error = Ha ocurrido un error al renderizar la página.
+page_scale_width = Ancho de página
+page_scale_fit = Ajuste de página
+page_scale_auto = Aumento automático
+page_scale_actual = Tamaño actual
+loading_error_indicator = Error
+loading_error = Ha ocurrido un error al cargar el PDF.
+invalid_file_error = Archivo PDF inválido o corrupto.
+missing_file_error=Falta el archivo PDF.
+
+text_annotation_type.alt=[{{type}} Anotación]
+password_label=Ingrese la contraseña para abrir este archivo PDF.
+password_invalid=Contraseña inválida. Por favor, vuelva a intentarlo.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported = Advertencia: Imprimir no está soportado completamente por este navegador.
+printing_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso.
+web_fonts_disabled=Las fuentes web están desactivadas: imposible usar las fuentes PDF embebidas.
+document_colors_disabled=Los documentos PDF no tienen permitido usar sus propios colores: \'Permitir a las páginas elegir sus propios colores\' está desactivado en el navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-ES/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-ES/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0335deb37c01fcb3920a2107a8a9dd58ab4b0cbd
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-ES/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+unsupported_feature = Este documento PDF podría no mostrarse correctamente.
+unsupported_feature_forms = Este documento PDF contiene formularios. La cumplimentación de los campos de formularios no está implementada.
+open_with_different_viewer = Abrir con un visor diferente
+open_with_different_viewer.accessKey = o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-ES/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-ES/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..9475281f7c77bb79fef015d011bac08a61d6450e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-ES/viewer.properties
@@ -0,0 +1,107 @@
+# 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/.
+
+previous.title = Página anterior
+previous_label = Anterior
+next.title = Página siguiente
+next_label = Siguiente
+page_label = Página:
+page_of = de {{pageCount}}
+zoom_out.title = Reducir
+zoom_out_label = Reducir
+zoom_in.title = Aumentar
+zoom_in_label = Aumentar
+zoom.title = Tamaño
+presentation_mode.title = Cambiar al modo presentación
+presentation_mode_label = Modo presentación
+open_file.title = Abrir archivo
+open_file_label = Abrir
+print.title = Imprimir
+print_label = Imprimir
+download.title = Descargar
+download_label = Descargar
+bookmark.title = Vista actual (copiar o abrir en una nueva ventana)
+bookmark_label = Vista actual
+tools.title = Herramientas
+tools_label = Herramientas
+first_page.title = Ir a la primera página
+first_page.label = Ir a la primera página
+first_page_label = Ir a la primera página
+last_page.title = Ir a la última página
+last_page.label = Ir a la última página
+last_page_label = Ir a la última página
+page_rotate_cw.title = Rotar en sentido horario
+page_rotate_cw.label = Rotar en sentido horario
+page_rotate_cw_label = Rotar en sentido horario
+page_rotate_ccw.title = Rotar en sentido antihorario
+page_rotate_ccw.label = Rotar en sentido antihorario
+page_rotate_ccw_label = Rotar en sentido antihorario
+hand_tool_enable.title = Activar herramienta mano
+hand_tool_enable_label = Activar herramienta mano
+hand_tool_disable.title = Desactivar herramienta mano
+hand_tool_disable_label = Desactivar herramienta mano
+document_properties.title = Propiedades del documento…
+document_properties_label = Propiedades del documento…
+document_properties_file_name = Nombre de archivo:
+document_properties_file_size = Tamaño de archivo:
+document_properties_kb = {{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb = {{size_mb}} MB ({{size_b}} bytes)
+document_properties_title = Título:
+document_properties_author = Autor:
+document_properties_subject = Asunto:
+document_properties_keywords = Palabras clave:
+document_properties_creation_date = Fecha de creación:
+document_properties_modification_date = Fecha de modificación:
+document_properties_date_string = {{date}}, {{time}}
+document_properties_creator = Creador:
+document_properties_producer = Productor PDF:
+document_properties_version = Versión PDF:
+document_properties_page_count = Número de páginas:
+document_properties_close = Cerrar
+toggle_sidebar.title = Cambiar barra lateral
+toggle_sidebar_label = Cambiar barra lateral
+outline.title = Mostrar el esquema del documento
+outline_label = Esquema del documento
+thumbs.title = Mostrar miniaturas
+thumbs_label = Miniaturas
+findbar.title = Buscar en el documento
+findbar_label = Buscar
+thumb_page_title = Página {{page}}
+thumb_page_canvas = Miniatura de la página {{page}}
+find_label = Buscar:
+find_previous.title = Encontrar la anterior aparición de la frase
+find_previous_label = Anterior
+find_next.title = Encontrar la siguiente aparición de esta frase
+find_next_label = Siguiente
+find_highlight = Resaltar todos
+find_match_case_label = Coincidencia de mayús./minús.
+find_reached_top = Se alcanzó el inicio del documento, se continúa desde el final
+find_reached_bottom = Se alcanzó el final del documento, se continúa desde el inicio
+find_not_found = Frase no encontrada
+error_more_info = Más información
+error_less_info = Menos información
+error_close = Cerrar
+error_version_info = PDF.js v{{version}} (build: {{build}})
+error_message = Mensaje: {{message}}
+error_stack = Pila: {{stack}}
+error_file = Archivo: {{file}}
+error_line = Línea: {{line}}
+rendering_error = Ocurrió un error al renderizar la página.
+page_scale_width = Anchura de la página
+page_scale_fit = Ajuste de la página
+page_scale_auto = Tamaño automático
+page_scale_actual = Tamaño actual
+loading_error_indicator = Error
+loading_error = Ocurrió un error al cargar el PDF.
+invalid_file_error = Fichero PDF no válido o corrupto.
+missing_file_error = No hay fichero PDF.
+text_annotation_type.alt = [Anotación {{type}}]
+password_label = Introduzca la contraseña para abrir este archivo PDF.
+password_invalid = Contraseña no válida. Vuelva a intentarlo.
+password_ok = Aceptar
+password_cancel = Cancelar
+printing_not_supported = Advertencia: Imprimir no está totalmente soportado por este navegador.
+printing_not_ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.
+web_fonts_disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas.
+document_colors_disabled = Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-MX/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-MX/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..687648b9f0a03a084583cb1dad18e7eefc17885a
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-MX/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Este PDF podría no mostrarse correctamente.
+unsupported_feature_forms=Este documento PDF contiene formularios. La cumplimentación de los campos de formularios no está implementada.
+open_with_different_viewer=Abrir con un visor diferente.
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/es-MX/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/es-MX/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a573bbfe713f39550ea3bc52a01134efd9d823f2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/es-MX/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Página anterior
+previous_label=Anterior
+next.title=Página siguiente
+next_label=Siguiente
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Página:
+page_of=de {{pageCount}}
+
+zoom_out.title=Reducir
+zoom_out_label=Reducir
+zoom_in.title=Aumentar
+zoom_in_label=Aumentar
+zoom.title=Zoom
+presentation_mode.title=Cambiar al modo presentación
+presentation_mode_label=Modo presentación
+open_file.title=Abrir archivo
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copia o abierta en ventana nueva)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Herramientas
+tools_label=Herramientas
+first_page.title=Ir a la primera página
+first_page.label=Ir a la primera página
+first_page_label=Ir a la primera página
+last_page.title=Ir a la última página
+last_page.label=Ir a la última página
+last_page_label=Ir a la última página
+page_rotate_cw.title=Girar a la derecha
+page_rotate_cw.label=Girar a la derecha
+page_rotate_cw_label=Girar a la derecha
+page_rotate_ccw.title=Girar a la izquierda
+page_rotate_ccw.label=Girar a la izquierda
+page_rotate_ccw_label=Girar a la izquierda
+
+hand_tool_enable.title=Activar herramienta mano
+hand_tool_enable_label=Activar herramienta mano
+hand_tool_disable.title=Desactivar herramienta mano
+hand_tool_disable_label=Desactivar herramienta mano
+
+# Document properties dialog box
+document_properties.title=Propiedades del documento…
+document_properties_label=Propiedades del documento…
+document_properties_file_name=Nombre del archivo:
+document_properties_file_size=Tamaño del archivo:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Título:
+document_properties_author=Autor:
+document_properties_subject=Asunto:
+document_properties_keywords=Palabras claves:
+document_properties_creation_date=Fecha de creación:
+document_properties_modification_date=Fecha de modificación:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Productor PDF:
+document_properties_version=Versión PDF:
+document_properties_page_count=Número de páginas:
+document_properties_close=Cerrar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Cambiar barra lateral
+toggle_sidebar_label=Cambiar barra lateral
+outline.title=Mostrar esquema del documento
+outline_label=Esquema del documento
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Buscar en el documento
+findbar_label=Buscar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Página {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de la página {{page}}
+
+# Find panel button title and messages
+find_label=Encontrar:
+find_previous.title=Ir a la anterior frase encontrada
+find_previous_label=Anterior
+find_next.title=Ir a la siguiente frase encontrada
+find_next_label=Siguiente
+find_highlight=Resaltar todo
+find_match_case_label=Coincidir con mayúsculas y minúsculas
+find_reached_top=Se alcanzó el inicio del documento, se buscará al final
+find_reached_bottom=Se alcanzó el final del documento, se buscará al inicio
+find_not_found=No se encontró la frase
+
+# Error panel labels
+error_more_info=Más información
+error_less_info=Menos información
+error_close=Cerrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaje: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Archivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Línea: {{line}}
+rendering_error=Un error ocurrió al renderizar la página.
+
+# Predefined zoom values
+page_scale_width=Ancho de página
+page_scale_fit=Ajustar página
+page_scale_auto=Zoom automático
+page_scale_actual=Tamaño real
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Un error ocurrió al cargar el PDF.
+invalid_file_error=Archivo PDF invalido o dañado.
+missing_file_error=Archivo PDF no encontrado.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} anotación]
+password_label=Ingresa la contraseña para abrir este archivo PDF.
+password_invalid=Contraseña inválida. Por favor intenta de nuevo.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador.
+printing_not_ready=Advertencia: El PDF no cargo completamente para impresión.
+web_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas.
+document_colors_disabled=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las páginas elijan sus propios colores' esta desactivada en el navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/et/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/et/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e1bd82a5a3b831fde637a60a8232e3b7d7c47668
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/et/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=See PDF-dokument võib olla kuvatud vigaselt.
+unsupported_feature_forms=See PDF-dokument sisaldab vorme. Vormide täitmine ei ole toetatud.
+open_with_different_viewer=Ava mõne muu vaatajaga
+open_with_different_viewer.accessKey=A
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/et/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/et/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bc6b752ffb3708a88cd620e3572c3d16dfda122a
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/et/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Eelmine lehekülg
+previous_label=Eelmine
+next.title=Järgmine lehekülg
+next_label=Järgmine
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Lehekülg:
+page_of=(kokku {{pageCount}})
+
+zoom_out.title=Vähenda
+zoom_out_label=Vähenda
+zoom_in.title=Suurenda
+zoom_in_label=Suurenda
+zoom.title=Suurendamine
+presentation_mode.title=Lülitu esitlusrežiimi
+presentation_mode_label=Esitlusrežiim
+open_file.title=Ava fail
+open_file_label=Ava
+print.title=Prindi
+print_label=Prindi
+download.title=Laadi alla
+download_label=Laadi alla
+bookmark.title=Praegune vaade (kopeeri või ava uues aknas)
+bookmark_label=Praegune vaade
+
+# Secondary toolbar and context menu
+tools.title=Tööriistad
+tools_label=Tööriistad
+first_page.title=Mine esimesele leheküljele
+first_page.label=Mine esimesele leheküljele
+first_page_label=Mine esimesele leheküljele
+last_page.title=Mine viimasele leheküljele
+last_page.label=Mine viimasele leheküljele
+last_page_label=Mine viimasele leheküljele
+page_rotate_cw.title=Pööra päripäeva
+page_rotate_cw.label=Pööra päripäeva
+page_rotate_cw_label=Pööra päripäeva
+page_rotate_ccw.title=Pööra vastupäeva
+page_rotate_ccw.label=Pööra vastupäeva
+page_rotate_ccw_label=Pööra vastupäeva
+
+hand_tool_enable.title=Luba sirvimine
+hand_tool_enable_label=Luba sirvimine
+hand_tool_disable.title=Keela sirvimine
+hand_tool_disable_label=Keela sirvimine
+
+# Document properties dialog box
+document_properties.title=Dokumendi omadused…
+document_properties_label=Dokumendi omadused…
+document_properties_file_name=Faili nimi:
+document_properties_file_size=Faili suurus:
+document_properties_kb={{size_kb}} KiB ({{size_b}} baiti)
+document_properties_mb={{size_mb}} MiB ({{size_b}} baiti)
+document_properties_title=Pealkiri:
+document_properties_author=Autor:
+document_properties_subject=Teema:
+document_properties_keywords=Märksõnad:
+document_properties_creation_date=Loodud:
+document_properties_modification_date=Muudetud:
+document_properties_date_string={{date}} {{time}}
+document_properties_creator=Looja:
+document_properties_producer=Generaator:
+document_properties_version=Generaatori versioon:
+document_properties_page_count=Lehekülgi:
+document_properties_close=Sulge
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Näita külgriba
+toggle_sidebar_label=Näita külgriba
+outline.title=Näita sisukorda
+outline_label=Näita sisukorda
+thumbs.title=Näita pisipilte
+thumbs_label=Pisipildid
+findbar.title=Leia dokumendist
+findbar_label=Leia
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}. lehekülg
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. lehekülje pisipilt
+
+# Find panel button title and messages
+find_label=Leia:
+find_previous.title=Leia fraasi eelmine esinemiskoht
+find_previous_label=Eelmine
+find_next.title=Leia fraasi järgmine esinemiskoht
+find_next_label=Järgmine
+find_highlight=Too kõik esile
+find_match_case_label=Tõstutundlik
+find_reached_top=Jõuti dokumendi algusesse, jätkati lõpust
+find_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest
+find_not_found=Fraasi ei leitud
+
+# Error panel labels
+error_more_info=Rohkem teavet
+error_less_info=Vähem teavet
+error_close=Sulge
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Teade: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fail: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rida: {{line}}
+rendering_error=Lehe renderdamisel esines viga.
+
+# Predefined zoom values
+page_scale_width=Mahuta laiusele
+page_scale_fit=Mahuta leheküljele
+page_scale_auto=Automaatne suurendamine
+page_scale_actual=Tegelik suurus
+
+# Loading indicator messages
+loading_error_indicator=Viga
+loading_error=PDFi laadimisel esines viga.
+invalid_file_error=Vigane või rikutud PDF-fail.
+missing_file_error=PDF-fail puudub.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=PDF-faili avamiseks sisesta parool.
+password_invalid=Vigane parool. Palun proovi uuesti.
+password_ok=Sobib
+password_cancel=Loobu
+
+printing_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud.
+printing_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud.
+web_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada.
+document_colors_disabled=PDF-dokumentidel pole oma värvide kasutamine lubatud: \'Veebilehtedel on lubatud kasutada oma värve\' on brauseris deaktiveeritud.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/eu/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/eu/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..909be0696b79b94612910f1104e9958c242ea1f1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/eu/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=PDF dokumentu hau agian ezin da ondo bistaratu.
+open_with_different_viewer=Ireki beste ikustaile batekin
+open_with_different_viewer.accessKey=I
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/eu/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/eu/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..28dc16f57a5a14691714229c91d7c42001c16366
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/eu/viewer.properties
@@ -0,0 +1,136 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Aurreko orria
+previous_label=Aurrekoa
+next.title=Hurrengo orria
+next_label=Hurrengoa
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Orria:
+page_of=/ {{pageCount}}
+
+zoom_out.title=Urrundu zooma
+zoom_out_label=Urrundu zooma
+zoom_in.title=Gerturatu zooma
+zoom_in_label=Gerturatu zooma
+zoom.title=Zooma
+presentation_mode.title=Aldatu aurkezpen modura
+presentation_mode_label=Arkezpen modua
+open_file.title=Ireki fitxategia
+open_file_label=Ireki
+print.title=Inprimatu
+print_label=Inprimatu
+download.title=Deskargatu
+download_label=Deskargatu
+bookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian)
+bookmark_label=Uneko ikuspegia
+
+# Secondary toolbar and context menu
+tools.title=Tresnak
+tools_label=Tresnak
+first_page.title=Joan lehen orrira
+first_page.label=Joan lehen orrira
+first_page_label=Joan lehen orrira
+last_page.title=Joan azken orrira
+last_page.label=Joan azken orrira
+last_page_label=Joan azken orrira
+page_rotate_cw.title=Biratu erlojuaren norantzan
+page_rotate_cw.label=Biratu erlojuaren norantzan
+page_rotate_cw_label=Biratu erlojuaren norantzan
+page_rotate_ccw.title=Biratu erlojuaren aurkako norantzan
+page_rotate_ccw.label=Biratu erlojuaren aurkako norantzan
+page_rotate_ccw_label=Biratu erlojuaren aurkako norantzan
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Txandakatu alboko barra
+toggle_sidebar_label=Txandakatu alboko barra
+outline.title=Erakutsi dokumentuaren eskema
+outline_label=Dokumentuaren eskema
+thumbs.title=Erakutsi koadro txikiak
+thumbs_label=Koadro txikiak
+findbar.title=Bilatu dokumentuan
+findbar_label=Bilatu
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}. orria
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. orriaren koadro txikia
+
+# Find panel button title and messages
+find_label=Bilatu:
+find_previous.title=Bilatu esaldiaren aurreko parekatzea
+find_previous_label=Aurrekoa
+find_next.title=Bilatu esaldiaren hurrengo parekatzea
+find_next_label=Hurrengoa
+find_highlight=Nabarmendu guztia
+find_match_case_label=Bat etorri maiuskulekin/minuskulekin
+find_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen
+find_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen
+find_not_found=Esaldia ez da aurkitu
+
+# Error panel labels
+error_more_info=Informazio gehiago
+error_less_info=Informazio gutxiago
+error_close=Itxi
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (eraikuntza: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mezua: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fitxategia: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Lerroa: {{line}}
+rendering_error=Errorea gertatu da orria errendatzean.
+
+# Predefined zoom values
+page_scale_width=Orriaren zabalera
+page_scale_fit=Doitu orrira
+page_scale_auto=Zoom automatikoa
+page_scale_actual=Benetako tamaina
+
+# Loading indicator messages
+loading_error_indicator=Errorea
+loading_error=Errorea gertatu da PDFa kargatzean.
+invalid_file_error=PDF fitxategi baliogabe edo hondatua.
+missing_file_error=PDF fitxategia falta da.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} ohartarazpena]
+password_label=Idatzi PDF fitxategi hau irekitzeko pasahitza.
+password_invalid=Pasahitz baliogabea. Saiatu berriro mesedez.
+password_ok=Ados
+password_cancel=Utzi
+
+printing_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.
+printing_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko.
+web_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.
+document_colors_disabled=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fa/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/fa/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ca38b114fe662f53b924848853653ec061c3986b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fa/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=این پروندۀ PDF ممکن است به‌طور صحیح نمایش داده نشود.
+open_with_different_viewer=با یک نمایشگر دیگر نشان بده
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fa/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/fa/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..062f2c2d9c556f010ca5a9c888f33f83a07c939f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fa/viewer.properties
@@ -0,0 +1,102 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=صفحهٔ قبلی
+next.title=صفحهٔ بعدی
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=صفحه:
+page_of=از {{pageCount}}
+
+zoom_out.title=کوچک‌نمایی
+zoom_out_label=کوچک‌نمایی
+zoom_in.title=بزرگ‌نمایی
+zoom_in_label=بزرگ‌نمایی
+zoom.title=زوم
+presentation_mode.title=تغییر به حالت ارائه
+presentation_mode_label=حالت ارائه
+open_file.title=باز کردن پرونده
+open_file_label=باز کردن
+print.title=چاپ
+print_label=چاپ
+download.title=بارگیری
+download_label=بارگیری
+bookmark.title=نمای فعلی (کپی کن، یا در پنجرۀ دیگری نشان بده)
+bookmark_label=نمای فعلی
+
+# Secondary toolbar and context menu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=نمایش طرح نوشتار
+outline_label=طرح نوشتار
+thumbs.title=نمایش تصاویر بندانگشتی
+thumbs_label=تصاویر بندانگشتی
+findbar_label=پیدا کردن
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=صفحه {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}}
+
+# Find panel button title and messages
+find_previous.title=پیدا کردن رخداد قبلی عبارت
+find_next.title=پیدا کردن رخداد بعدی عبارت
+find_not_found=عبارت پیدا نشد
+
+# Error panel labels
+error_more_info=اطلاعات بیشتر
+error_less_info=اطلاعات کمتر
+error_close=بستن
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=پیام: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=توده: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=پرونده: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=سطر: {{line}}
+rendering_error=هنگام بارگیری صفحه خطایی رخ داد.
+
+# Predefined zoom values
+page_scale_width=عرض صفحه
+page_scale_fit=اندازه کردن صفحه
+page_scale_auto=بزرگنمایی خودکار
+page_scale_actual=اندازه واقعی‌
+
+# Loading indicator messages
+loading_error_indicator=خطا
+loading_error=هنگام بارگیری پرونده (PDF) خطایی رخ داد.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_ok=تأیید
+password_cancel=انصراف
+
+printing_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ff/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ff/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f2ae3a7ddd3c409d118a852b8944529d2654fc81
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ff/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ndee fiilannde PDF ena waawi waasa jaytineede no moÆ´Æ´iri.
+open_with_different_viewer=Udditir Yiytindorde WoÉ—nde
+open_with_different_viewer.accessKey=u
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ff/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ff/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d565a33001780f13753616213f987579f5284ee1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ff/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Hello Ɓennungo
+previous_label=Ɓennuɗo
+next.title=Hello faango
+next_label=Yeeso
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Hello:
+page_of=e nder {{pageCount}}
+
+zoom_out.title=Lonngo WoÉ—É—a
+zoom_out_label=Lonngo WoÉ—É—a
+zoom_in.title=Lonngo Ara
+zoom_in_label=Lonngo Ara
+zoom.title=Lonngo
+presentation_mode.title=Faytu to  Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Uddit Fiilde
+open_file_label=Uddit
+print.title=Winndito
+print_label=Winndito
+download.title=Aawto
+download_label=Aawto
+bookmark.title=Jiytol gonangol (natto walla uddit e henorde)
+bookmark_label=Jiytol Gonangol
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=Tiitoonde:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggilo Palal Sawndo
+toggle_sidebar_label=Toggilo Palal Sawndo
+outline.title=Hollu Toɓɓe Fiilannde
+outline_label=Toɓɓe Fiilannde
+thumbs.title=Hollu Dooɓe
+thumbs_label=Dooɓe
+findbar.title=Yiylo e fiilannde
+findbar_label=Yiytu
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Hello {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Dooɓre Hello {{page}}
+
+# Find panel button title and messages
+find_label=Yiytu:
+find_previous.title=Yiylo cilol ɓennugol konngol ngol
+find_previous_label=Ɓennuɗo
+find_next.title=Yiylo cilol garowol konngol ngol
+find_next_label=Yeeso
+find_highlight=Jalbin fof
+find_match_case_label=Jaaɓnu darnde
+find_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les
+find_reached_bottom=Heɓii hoore fiilannde, jokku faya les
+find_not_found=Konngi njiyataa
+
+# Error panel labels
+error_more_info=Ɓeydu Humpito
+error_less_info=Ustu Humpito
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Ɓatakuure: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fiilde: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Gorol: {{line}}
+rendering_error=Juumre waɗii tuma nde yoŋkittoo hello.
+
+# Predefined zoom values
+page_scale_width=Njaajeendi Hello
+page_scale_fit=KeÆ´eendi Hello
+page_scale_auto=Loongorde Jaajol
+page_scale_actual=Ɓetol Jaati
+
+# Loading indicator messages
+loading_error_indicator=Juumre
+loading_error=Juumre waÉ—ii tuma nde loowata PDF oo.
+invalid_file_error=Fiilde PDF moÆ´Æ´aani walla jiibii.
+missing_file_error=Fiilde PDF ena ŋakki.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Siiftannde]
+password_ok=OK
+password_cancel=Haaytu
+
+printing_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.
+printing_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol.
+web_fonts_disabled=Ponte geese ko daaÆ´aaÉ—e: horiima huutoraade ponte PDF coomtoraaÉ—e.
+document_colors_disabled=PiilanÉ—e PDF njamiraaka yoo kuutoro goobuuji mum'en keeriiÉ—i: 'Yamir kello yoo kuutoro goobuuki keeriiÉ—i' koko daaÆ´aa e wanngorde ndee.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fi/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/fi/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..495f5eafde4abda7fee6fe7e15d4e7d8763fc1a2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fi/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Tätä PDF-dokumenttia ei välttämättä osata näyttää oikein.
+unsupported_feature_forms=Tässä PDF-dokumentissa on lomakekenttiä. Lomakekenttien täyttämistä ei tueta.
+open_with_different_viewer=Avaa toisella ohjelmalla
+open_with_different_viewer.accessKey=A
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fi/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/fi/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5a5a87b3da37a8d3baf832039ef1ba327c32d178
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fi/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Edellinen sivu
+previous_label=Edellinen
+next.title=Seuraava sivu
+next_label=Seuraava
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Sivu:
+page_of=/ {{pageCount}}
+
+zoom_out.title=Loitonna
+zoom_out_label=Loitonna
+zoom_in.title=Lähennä
+zoom_in_label=Lähennä
+zoom.title=Suurennus
+presentation_mode.title=Siirry esitystilaan
+presentation_mode_label=Esitystila
+open_file.title=Avaa tiedosto
+open_file_label=Avaa
+print.title=Tulosta
+print_label=Tulosta
+download.title=Lataa
+download_label=Lataa
+bookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan)
+bookmark_label=Avoin ikkuna
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Siirry ensimmäiselle sivulle
+first_page.label=Siirry ensimmäiselle sivulle
+first_page_label=Siirry ensimmäiselle sivulle
+last_page.title=Siirry viimeiselle sivulle
+last_page.label=Siirry viimeiselle sivulle
+last_page_label=Siirry viimeiselle sivulle
+page_rotate_cw.title=Kierrä oikealle
+page_rotate_cw.label=Kierrä oikealle
+page_rotate_cw_label=Kierrä oikealle
+page_rotate_ccw.title=Kierrä vasemmalle
+page_rotate_ccw.label=Kierrä vasemmalle
+page_rotate_ccw_label=Kierrä vasemmalle
+
+hand_tool_enable.title=Käytä käsityökalua
+hand_tool_enable_label=Käytä käsityökalua
+hand_tool_disable.title=Poista käsityökalu käytöstä
+hand_tool_disable_label=Poista käsityökalu käytöstä
+
+# Document properties dialog box
+document_properties.title=Dokumentin ominaisuudet…
+document_properties_label=Dokumentin ominaisuudet…
+document_properties_file_name=Tiedostonimi:
+document_properties_file_size=Tiedoston koko:
+document_properties_kb={{size_kb}} kt ({{size_b}} tavua)
+document_properties_mb={{size_mb}} Mt ({{size_b}} tavua)
+document_properties_title=Otsikko:
+document_properties_author=Tekijä:
+document_properties_subject=Aihe:
+document_properties_keywords=Avainsanat:
+document_properties_creation_date=Luomispäivämäärä:
+document_properties_modification_date=Muokkauspäivämäärä:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Luoja:
+document_properties_producer=PDF-tuottaja:
+document_properties_version=PDF-versio:
+document_properties_page_count=Sivujen määrä:
+document_properties_close=Sulje
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Näytä/piilota sivupaneeli
+toggle_sidebar_label=Näytä/piilota sivupaneeli
+outline.title=Näytä dokumentin rakenne
+outline_label=Dokumentin rakenne
+thumbs.title=Näytä pienoiskuvat
+thumbs_label=Pienoiskuvat
+findbar.title=Etsi dokumentista
+findbar_label=Etsi
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Sivu {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Pienoiskuva sivusta {{page}}
+
+# Find panel button title and messages
+find_label=Etsi:
+find_previous.title=Etsi hakusanan edellinen osuma
+find_previous_label=Edellinen
+find_next.title=Etsi hakusanan seuraava osuma
+find_next_label=Seuraava
+find_highlight=Korosta kaikki
+find_match_case_label=Huomioi kirjainkoko
+find_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta
+find_reached_bottom=Päästiin dokumentin loppuun, continued from top
+find_not_found=Hakusanaa ei löytynyt
+
+# Error panel labels
+error_more_info=Lisätietoja
+error_less_info=Lisätietoja
+error_close=Sulje
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (kooste: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Virheilmoitus: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pino: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Tiedosto: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rivi: {{line}}
+rendering_error=Tapahtui virhe piirrettäessä sivua.
+
+# Predefined zoom values
+page_scale_width=Sivun leveys
+page_scale_fit=Koko sivu
+page_scale_auto=Automaattinen suurennus
+page_scale_actual=Todellinen koko
+
+# Loading indicator messages
+loading_error_indicator=Virhe
+loading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.
+invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.
+missing_file_error=Puuttuva PDF-tiedosto.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Kirjoita PDF-tiedoston salasana.
+password_invalid=Virheellinen salasana. Yritä uudestaan.
+password_ok=OK
+password_cancel=Peruuta
+
+printing_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja.
+printing_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa.
+web_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja.
+document_colors_disabled=PDF-dokumenttien ei ole sallittua käyttää omia värejään: Asetusta \"Sivut saavat käyttää omia värejään oletusten sijaan\" ei ole valittu selaimen asetuksissa.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fr/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/fr/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5742a2f2ba0ebabdb99b2d09b5eebc1bafcefa29
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fr/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+unsupported_feature=Il est possible que ce document PDF ne s'affiche pas correctement.
+unsupported_feature_forms=Ce document PDF contient des formulaires. Le remplissage de champs de formulaires n'est pas pris en charge.
+open_with_different_viewer=Ouvrir avec un autre lecteur PDF
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fr/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/fr/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0bf3e1df4127768fd3b8058d10c3e1253730358c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fr/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Page précédente
+previous_label=Précédent
+next.title=Page suivante
+next_label=Suivant
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Page :
+page_of=sur {{pageCount}}
+
+zoom_out.title=Zoom arrière
+zoom_out_label=Zoom arrière
+zoom_in.title=Zoom avant
+zoom_in_label=Zoom avant
+zoom.title=Zoom
+presentation_mode.title=Basculer en mode présentation
+presentation_mode_label=Mode présentation
+open_file.title=Ouvrir le fichier
+open_file_label=Ouvrir le fichier
+print.title=Imprimer
+print_label=Imprimer
+download.title=Télécharger
+download_label=Télécharger
+bookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre)
+bookmark_label=Affichage actuel
+
+# Secondary toolbar and context menu
+tools.title=Outils
+tools_label=Outils
+first_page.title=Aller à la première page
+first_page.label=Aller à la première page
+first_page_label=Aller à la première page
+last_page.title=Aller à la dernière page
+last_page.label=Aller à la dernière page
+last_page_label=Aller à la dernière page
+page_rotate_cw.title=Rotation horaire
+page_rotate_cw.label=Rotation horaire
+page_rotate_cw_label=Rotation horaire
+page_rotate_ccw.title=Rotation anti-horaire
+page_rotate_ccw.label=Rotation anti-horaire
+page_rotate_ccw_label=Rotation anti-horaire
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Afficher/Masquer le panneau latéral
+toggle_sidebar_label=Afficher/Masquer le panneau latéral
+outline.title=Afficher les signets
+outline_label=Signets du document
+thumbs.title=Afficher les vignettes
+thumbs_label=Vignettes
+findbar.title=Rechercher dans le document
+findbar_label=Rechercher
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Vignette de la page {{page}}
+
+hand_tool_enable.title=Activer l'outil main
+hand_tool_enable_label=Activer l'outil main
+hand_tool_disable.title=Désactiver l'outil main
+hand_tool_disable_label=Désactiver l'outil main
+
+# Document properties dialog box
+document_properties.title=Propriétés du document…
+document_properties_label=Propriétés du document…
+document_properties_file_name=Nom du fichier :
+document_properties_file_size=Taille du fichier :
+document_properties_kb={{size_kb}} Ko ({{size_b}} octets)
+document_properties_mb={{size_mb}} Mo ({{size_b}} octets)
+document_properties_title=Titre :
+document_properties_author=Auteur :
+document_properties_subject=Sujet :
+document_properties_keywords=Mots-clés :
+document_properties_creation_date=Date de création :
+document_properties_modification_date=Modifié le :
+document_properties_date_string={{date}} à {{time}}
+document_properties_creator=Créé par :
+document_properties_producer=Outil de conversion PDF :
+document_properties_version=Version PDF :
+document_properties_page_count=Nombre de pages :
+document_properties_close=Fermer
+
+# Find panel button title and messages
+find_label=Rechercher :
+find_previous.title=Trouver l'occurrence précédente de la phrase
+find_previous_label=Précédent
+find_next.title=Trouver la prochaine occurrence de la phrase
+find_next_label=Suivant
+find_highlight=Tout surligner
+find_match_case_label=Respecter la casse
+find_reached_top=Haut de la page atteint, poursuite depuis la fin
+find_reached_bottom=Bas de la page atteint, poursuite au début
+find_not_found=Phrase introuvable
+
+# Error panel labels
+error_more_info=Plus d'informations
+error_less_info=Moins d'informations
+error_close=Fermer
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message : {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pile : {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fichier : {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Ligne : {{line}}
+rendering_error=Une erreur s'est produite lors de l'affichage de la page.
+
+# Predefined zoom values
+page_scale_width=Pleine largeur
+page_scale_fit=Page entière
+page_scale_auto=Zoom automatique
+page_scale_actual=Taille réelle
+
+# Loading indicator messages
+loading_error_indicator=Erreur
+loading_error=Une erreur s'est produite lors du chargement du fichier PDF.
+invalid_file_error=Fichier PDF invalide ou corrompu.
+missing_file_error=Fichier PDF manquant.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Annotation {{type}}]
+password_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.
+password_invalid=Mot de passe incorrect. Veuillez réessayer.
+password_ok=OK
+password_cancel=Annuler
+
+printing_not_supported=Attention : l'impression n'est pas totalement prise en charge par ce navigateur.
+printing_not_ready=Attention : le PDF n'est pas entièrement chargé pour pouvoir l'imprimer.
+web_fonts_disabled=Les polices web sont désactivées : impossible d'utiliser les polices intégrées au PDF.
+document_colors_disabled=Les documents PDF ne peuvent pas utiliser leurs propres couleurs : « Autoriser les pages web à utiliser leurs propres couleurs » est désactivé dans le navigateur.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fy-NL/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/fy-NL/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1f80a3a44bc723ce9c61bae0456208f2c2f02f68
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fy-NL/chrome.properties
@@ -0,0 +1,9 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dit PDF-dokumint wurdt miskien net korrekt werjûn.
+unsupported_feature_forms=Dit PDF-dokumint befettet formulieren. It ynfoljen fan formulierfjilden is net stipe.
+open_with_different_viewer=Mei in oare PDF-lêzer iepenje
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/fy-NL/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/fy-NL/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2753682945011cdbf062a6c2d4a8bfc54c7031a2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/fy-NL/viewer.properties
@@ -0,0 +1,167 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Foarige side
+previous_label=Foarige
+next.title=Folgjende side
+next_label=Folgjende
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=side:
+page_of=fan {{pageCount}}
+
+zoom_out.title=Utzoome
+zoom_out_label=Utzoome
+zoom_in.title=Ynzoome
+zoom_in_label=Ynzoome
+zoom.title=Zoome
+print.title=Ofdrukke
+print_label=Ofdrukke
+presentation_mode.title=Wikselje nei presintaasjemoadus
+presentation_mode_label=Presintaasjemoadus
+open_file.title=Bestân iepenje
+open_file_label=Iepenje
+download.title=Ynlade
+download_label=Ynlade
+bookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster)
+bookmark_label=Aktuele finster
+
+# Secondary toolbar and context menu
+tools.title=Ark
+tools_label=Ark
+first_page.title=Gean nei earste side
+first_page.label=Gean nei earste side
+first_page_label=Gean nei earste side
+last_page.title=Gean nei lêste side
+last_page.label=Gean nei lêste side
+last_page_label=Gean nei lêste v
+page_rotate_cw.title=Rjochtsom draaie
+page_rotate_cw.label=Rjochtsom draaie
+page_rotate_cw_label=Rjochtsom draaie
+page_rotate_ccw.title=Linksom draaie
+page_rotate_ccw.label=Linksom draaie
+page_rotate_ccw_label=Linksom draaie
+
+hand_tool_enable.title=Hânark ynskeakelje
+hand_tool_enable_label=Hânark ynskeakelje
+hand_tool_disable.title=Hânark úyskeakelje
+hand_tool_disable_label=Hânark úyskeakelje
+
+# Document properties dialog box
+document_properties.title=Dokuminteigenskippen…
+document_properties_label=Dokuminteigenskippen…
+document_properties_file_name=Bestânsnamme:
+document_properties_file_size=Bestânsgrutte:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titel:
+document_properties_author=Auteur:
+document_properties_subject=Underwerp:
+document_properties_keywords=Kaaiwurden:
+document_properties_creation_date=Oanmaakdatum:
+document_properties_modification_date=Bewurkingsdatum:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Makker:
+document_properties_producer=PDF-makker:
+document_properties_version=PDF-ferzje:
+document_properties_page_count=Siden:
+document_properties_close=Slute
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sidebalke yn-/útskeakelje
+toggle_sidebar_label=Sidebalke yn-/útskeakelje
+outline.title=Dokumint ynhâldsopjefte toane
+outline_label=Dokumint ynhâldsopjefte
+thumbs.title=Foarbylden toane
+thumbs_label=Foarbylden
+findbar.title=Sykje yn dokumint
+findbar_label=Sykje
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Foarbyld fan side {{page}}
+
+# Context menu
+first_page.label=Nei earste side gean
+last_page.label=Nei lêste side gean
+page_rotate_cw.label=Rjochtsom draaie
+page_rotate_ccw.label=Linksom draaie
+
+# Find panel button title and messages
+find_label=Sykje:
+find_previous.title=It foarige foarkommen fan de tekst sykje
+find_previous_label=Foarige
+find_next.title=It folgjende foarkommen fan de tekst sykje
+find_next_label=Folgjende
+find_highlight=Alles markearje
+find_match_case_label=Haadlettergefoelich
+find_reached_top=Boppekant fan dokumint berikt, trochgien fanôf ûnderkant
+find_reached_bottom=Ein fan dokumint berikt, trochgien fanôf boppekant
+find_not_found=Tekst net fûn
+
+# Error panel labels
+error_more_info=Mear ynformaasje
+error_less_info=Minder ynformaasje
+error_close=Slute
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Berjocht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Bestân: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rigel: {{line}}
+rendering_error=Der is in flater bard by it renderjen fan de side.
+
+# Predefined zoom values
+page_scale_width=Sidebreedte
+page_scale_fit=Hiele side
+page_scale_auto=Automatysk zoome
+page_scale_actual=Wurklike grutte
+
+# Loading indicator messages
+loading_error_indicator=Flater
+loading_error=Der is in flater bard by it laden fan de PDF.
+invalid_file_error=Ynfalide of korruptearre PDF-bestân.
+missing_file_error=PDF-bestân ûntbrekt.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Jou it wachtwurd om dit PDF-bestân te iepenjen.
+password_invalid=Ferkeard wachtwurd. Probearje opnij.
+password_ok=OK
+password_cancel=Annulearje
+
+printing_not_supported=Warning: Printing is net folslein stipe troch dizze browser.
+printing_not_ready=Warning: PDF is net folslein laden om ôf te drukken.
+web_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik.
+document_colors_disabled=PDF-dokuminten binne net tastien om har eigen kleuren te brûken: \'Siden tastean har eigen kleuren te kiezen\' is útskeakele yn de browser.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ga-IE/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ga-IE/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2ebe021f59bdc6e2633fa577d2e460fedf895f9d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ga-IE/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Seans nach dtaispeánfar an cháipéis PDF seo mar is ceart.
+unsupported_feature_forms=This PDF document contains forms. The filling of form fields is not supported.
+open_with_different_viewer=Oscail le hAmharcán Eile
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ga-IE/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ga-IE/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..74a6341652db66e9fe7533f31f865eb18212211c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ga-IE/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=An Leathanach Roimhe Seo
+previous_label=Roimhe Seo
+next.title=An Chéad Leathanach Eile
+next_label=Ar Aghaidh
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Leathanach:
+page_of=as {{pageCount}}
+
+zoom_out.title=Súmáil Amach
+zoom_out_label=Súmáil Amach
+zoom_in.title=Súmáil Isteach
+zoom_in_label=Súmáil Isteach
+zoom.title=Súmáil
+presentation_mode.title=Úsáid an Mód Láithreoireachta
+presentation_mode_label=Mód Láithreoireachta
+open_file.title=Oscail Comhad
+open_file_label=Oscail
+print.title=Priontáil
+print_label=Priontáil
+download.title=Íosluchtaigh
+download_label=Íosluchtaigh
+bookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua)
+bookmark_label=An tAmharc Reatha
+
+# Secondary toolbar and context menu
+tools.title=Uirlisí
+tools_label=Uirlisí
+first_page.title=Go dtí an chéad leathanach
+first_page.label=Go dtí an chéad leathanach
+first_page_label=Go dtí an chéad leathanach
+last_page.title=Go dtí an leathanach deiridh
+last_page.label=Go dtí an leathanach deiridh
+last_page_label=Go dtí an leathanach deiridh
+page_rotate_cw.title=Rothlaigh ar deiseal
+page_rotate_cw.label=Rothlaigh ar deiseal
+page_rotate_cw_label=Rothlaigh ar deiseal
+page_rotate_ccw.title=Rothlaigh ar tuathal
+page_rotate_ccw.label=Rothlaigh ar tuathal
+page_rotate_ccw_label=Rothlaigh ar tuathal
+
+hand_tool_enable.title=Enable hand tool
+hand_tool_enable_label=Enable hand tool
+hand_tool_disable.title=Disable hand tool
+hand_tool_disable_label=Disable hand tool
+
+# Document properties dialog box
+document_properties.title=Document Properties…
+document_properties_label=Document Properties…
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Teideal:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_close=Close
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Scoránaigh an Barra Taoibh
+toggle_sidebar_label=Scoránaigh an Barra Taoibh
+outline.title=Taispeáin Creatlach na Cáipéise
+outline_label=Creatlach na Cáipéise
+thumbs.title=Taispeáin Mionsamhlacha
+thumbs_label=Mionsamhlacha
+findbar.title=Aimsigh sa Cháipéis
+findbar_label=Aimsigh
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Leathanach {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Mionsamhail Leathanaigh {{page}}
+
+# Find panel button title and messages
+find_label=Aimsigh:
+find_previous.title=Aimsigh an sampla roimhe seo den nath seo
+find_previous_label=Roimhe seo
+find_next.title=Aimsigh an chéad sampla eile den nath sin
+find_next_label=Ar aghaidh
+find_highlight=Aibhsigh uile
+find_match_case_label=Cásíogair
+find_reached_top=Ag barr na cáipéise, ag leanúint ón mbun
+find_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr
+find_not_found=Abairtín gan aimsiú
+
+# Error panel labels
+error_more_info=Tuilleadh Eolais
+error_less_info=Níos Lú Eolais
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Teachtaireacht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Cruach: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Comhad: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Líne: {{line}}
+rendering_error=Tharla earráid agus an leathanach á leagan amach.
+
+# Predefined zoom values
+page_scale_width=Leithead Leathanaigh
+page_scale_fit=Laghdaigh go dtí an Leathanach
+page_scale_auto=Súmáil Uathoibríoch
+page_scale_actual=Fíormhéid
+
+# Loading indicator messages
+loading_error_indicator=Earráid
+loading_error=Tharla earráid agus an cháipéis PDF á luchtú.
+invalid_file_error=Comhad neamhbhailí nó truaillithe PDF.
+missing_file_error=Comhad PDF ar iarraidh.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anótáil {{type}}]
+password_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt.
+password_invalid=Focal faire mícheart. Déan iarracht eile.
+password_ok=OK
+password_cancel=Cealaigh
+
+printing_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán.
+printing_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán luchtaithe.
+web_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid.
+document_colors_disabled=Níl cead ag cáipéisí PDF a ndathanna féin a roghnú; tá 'Tabhair cead do leathanaigh a ndathanna féin a roghnú' díchumasaithe sa mbrabhsálaí.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/gd/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/gd/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6750332dca0badfd4edf634fee2271e2ec5610b8
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/gd/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Faodaidh nach eil an sgrìobhainn PDF seo 'ga shealltainn mar bu chòir.
+unsupported_feature_forms=Tha foirmean sa PDF seo. Chan eil taic ri lìonadh foirmean.
+open_with_different_viewer=Fosgail le sealladair eile
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/gd/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/gd/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a0030a39107dd1bfed2e5a395473349a4486127c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/gd/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=An duilleag roimhe
+previous_label=Air ais
+next.title=An ath-dhuilleag
+next_label=Air adhart
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Duilleag:
+page_of=à {{pageCount}}
+
+zoom_out.title=Sùm a-mach
+zoom_out_label=Sùm a-mach
+zoom_in.title=Sùm a-steach
+zoom_in_label=Sùm a-steach
+zoom.title=Sùm
+presentation_mode.title=Gearr leum dhan mhodh taisbeanaidh
+presentation_mode_label=Am modh taisbeanaidh
+open_file.title=Fosgail faidhle
+open_file_label=Fosgail
+print.title=Clò-bhuail
+print_label=Clò-bhuail
+download.title=Luchdaich a-nuas
+download_label=Luchdaich a-nuas
+bookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr)
+bookmark_label=An sealladh làithreach
+
+# Secondary toolbar and context menu
+tools.title=Innealan
+tools_label=Innealan
+first_page.title=Rach gun chiad duilleag
+first_page.label=Rach gun chiad duilleag
+first_page_label=Rach gun chiad duilleag
+last_page.title=Rach gun duilleag mu dheireadh
+last_page.label=Rach gun duilleag mu dheireadh
+last_page_label=Rach gun duilleag mu dheireadh
+page_rotate_cw.title=Cuairtich gu deiseil
+page_rotate_cw.label=Cuairtich gu deiseil
+page_rotate_cw_label=Cuairtich gu deiseil
+page_rotate_ccw.title=Cuairtich gu tuathail
+page_rotate_ccw.label=Cuairtich gu tuathail
+page_rotate_ccw_label=Cuairtich gu tuathail
+
+hand_tool_enable.title=Cuir inneal na làimhe an comas
+hand_tool_enable_label=Cuir inneal na làimhe an comas
+hand_tool_disable.title=Cuir inneal na làimhe à comas
+hand_tool_disable_label=Cuir à comas inneal na làimhe
+
+# Document properties dialog box
+document_properties.title=Roghainnean na sgrìobhainne…
+document_properties_label=Roghainnean na sgrìobhainne…
+document_properties_file_name=Ainm an fhaidhle:
+document_properties_file_size=Meud an fhaidhle:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Tiotal:
+document_properties_author=Ùghdar:
+document_properties_subject=Cuspair:
+document_properties_keywords=Faclan-luirg:
+document_properties_creation_date=Latha a chruthachaidh:
+document_properties_modification_date=Latha atharrachaidh:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Cruthadair:
+document_properties_producer=Saothraiche a' PDF:
+document_properties_version=Tionndadh a' PDF:
+document_properties_page_count=Àireamh de dhuilleagan:
+document_properties_close=Dùin
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toglaich am bàr-taoibh
+toggle_sidebar_label=Toglaich am bàr-taoibh
+outline.title=Seall an sgrìobhainn far loidhne
+outline_label=Oir-loidhne na sgrìobhainne
+thumbs.title=Seall na dealbhagan
+thumbs_label=Dealbhagan
+findbar.title=Lorg san sgrìobhainn
+findbar_label=Lorg
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Duilleag a {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Dealbhag duilleag a {{page}}
+
+# Find panel button title and messages
+find_label=Lorg:
+find_previous.title=Lorg làthair roimhe na h-abairt seo
+find_previous_label=Air ais
+find_next.title=Lorg ath-làthair na h-abairt seo
+find_next_label=Air adhart
+find_highlight=Soillsich a h-uile
+find_match_case_label=Aire do litrichean mòra is beaga
+find_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige
+find_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige
+find_not_found=Cha deach an abairt a lorg
+
+# Error panel labels
+error_more_info=Barrachd fiosrachaidh
+error_less_info=Nas lugha de dh'fhiosrachadh
+error_close=Dùin
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Teachdaireachd: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stac: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Faidhle: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Loidhne: {{line}}
+rendering_error=Thachair mearachd rè reandaradh na duilleige.
+
+# Predefined zoom values
+page_scale_width=Leud na duilleige
+page_scale_fit=Freagair ri meud na duilleige
+page_scale_auto=Sùm fèin-obrachail
+page_scale_actual=Am fìor-mheud
+
+# Loading indicator messages
+loading_error_indicator=Mearachd
+loading_error=Thachair mearachd rè luchdadh a' PDF.
+invalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte.
+missing_file_error=Faidhle PDF a tha a dhìth.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Nòtachadh {{type}}]
+password_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.
+password_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?
+password_ok=Ceart ma-tha
+password_cancel=Sguir dheth
+
+printing_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh.
+printing_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh.
+web_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh.
+document_colors_disabled=Chan fhaod sgrìobhainnean PDF na dathan aca fhèin a chleachdadh: Tha "Leig le duilleagan na dathan aca fhèin a chleachdadh" à comas sa bhrabhsair.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/gl/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/gl/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2934927d329478a1e9c281fdcd5c6efa0cd40e9b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/gl/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Pode que este documento PDF non se visualice correctamente.
+open_with_different_viewer=Abrir cun visor diferente
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/gl/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/gl/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..08729fee67ee7ec2a688d262bdd4110b8064a335
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/gl/viewer.properties
@@ -0,0 +1,124 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Páxina anterior
+previous_label=Anterior
+next.title=Seguinte páxina
+next_label=Seguinte
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Páxina:
+page_of=de {{pageCount}}
+
+zoom_out.title=Reducir
+zoom_out_label=Reducir
+zoom_in.title=Ampliar
+zoom_in_label=Ampliar
+zoom.title=Zoom
+print.title=Imprimir
+print_label=Imprimir
+presentation_mode.title=Cambiar ao modo presentación
+presentation_mode_label=Modo presentación
+open_file.title=Abrir ficheiro
+open_file_label=Abrir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar ou abrir nunha nova xanela)
+bookmark_label=Vista actual
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Amosar/agochar a barra lateral
+toggle_sidebar_label=Amosar/agochar a barra lateral
+outline.title=Amosar esquema do documento
+outline_label=Esquema do documento
+thumbs.title=Amosar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Atopar no documento
+findbar_label=Atopar
+
+# Document outline messages
+no_outline=Ningún esquema dispoñíbel
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Páxina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da páxina {{page}}
+
+# Context menu
+first_page.label=Ir á primeira páxina
+last_page.label=Ir á última páxina
+page_rotate_cw.label=Rotar no sentido das agullas do reloxo
+page_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo
+
+# Find panel button title and messages
+find_label=Atopar:
+find_previous.title=Atopar a anterior aparición da frase
+find_previous_label=Anterior
+find_next.title=Atopar a seguinte aparición da frase
+find_next_label=Seguinte
+find_highlight=Realzar todo
+find_match_case_label=Diferenciar maiúsculas de minúsculas
+find_reached_top=Chegouse ao inicio do documento, continuar desde o final
+find_reached_bottom=Chegouse ao final do documento, continuar desde o inicio
+find_not_found=Non se atopou a frase
+
+# Error panel labels
+error_more_info=Máis información
+error_less_info=Menos información
+error_close=Pechar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaxe: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ficheiro: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Liña: {{line}}
+rendering_error=Produciuse un erro ao representar a páxina.
+
+# Predefined zoom values
+page_scale_width=Largura da páxina
+page_scale_fit=Axuste de páxina
+page_scale_auto=Zoom automático
+page_scale_actual=Tamaño actual
+
+# Loading indicator messages
+loading_error_indicator=Erro
+loading_error=Produciuse un erro ao cargar o PDF.
+invalid_file_error=Ficheiro PDF danado ou incorrecto.
+missing_file_error=Falta o ficheiro PDF.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type=[Anotación {{type}}]
+request_password=O PDF está protexido por un contrasinal:
+
+printing_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador.
+web_fonts_disabled=Desactiváronse as fontes web:  foi imposíbel usar as fontes incrustadas no PDF.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/gu-IN/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/gu-IN/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3237a114eb180ab4c2a2f2e61218821177ebac41
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/gu-IN/chrome.properties
@@ -0,0 +1,10 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=આ PDF દસ્તાવેજને યોગ્ય રીતે દર્શાવી શકાતો નથી.
+open_with_different_viewer=વિવિધ દર્શક સાથે ખોલો
+open_with_different_viewer.accessKey=o
+
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/gu-IN/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/gu-IN/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0ad91f0434132b59a59749bf8f22dad6b7e10e38
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/gu-IN/viewer.properties
@@ -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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=પહેલાનુ પાનું
+previous_label=પહેલાનુ
+next.title=આગળનુ પાનું
+ next_label=આગળનું
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=પાનું:
+page_of={{pageCount}} નું
+zoom_out.title=મોટુ કરો
+zoom_out_label=મોટુ કરો
+zoom_in.title=નાનું કરો
+zoom_in_label=નાનું કરો
+zoom.title=નાનું મોટુ કરો
+print.title=છાપો
+print_label=છારો
+open_file.title=ફાઇલ ખોલો
+open_file_label=ખોલો
+download.title=ડાઉનલોડ
+download_label=ડાઉનલોડ
+bookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો)
+bookmark_label=વર્તમાન દૃશ્ય
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=દસ્તાવેજ રૂપરેખા બતાવો
+outline_label=દસ્તાવેજ રૂપરેખા
+thumbs.title=થંબનેલ્સ બતાવો
+thumbs_label=થંબનેલ્સ
+
+# Document outline messages
+
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=પાનું {{page}}
+
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ
+# Error panel labels
+error_more_info=વધારે જાણકારી
+error_less_info=ઓછી જાણકારી
+error_close=બંધ કરો
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=સંદેશો: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=સ્ટેક: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ફાઇલ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=વાક્ય: {{line}}
+rendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય.
+# Predefined zoom values
+page_scale_width=પાનાની પહોળાઇ
+page_scale_fit=પાનું બંધબેસતુ
+page_scale_auto=આપમેળે નાનુંમોટુ કરો
+page_scale_actual=ચોક્કસ માપ
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+
+loading_error_indicator=ભૂલ
+loading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય.
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{[type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+
+printing_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી.
+
+error_version_info=PDF.js v{{version}} (build: {{build}})
+find_highlight=બધુ પ્રકાશિત કરો
+find_label=શોધો:
+find_match_case_label=કેસ બંધબેસાડો
+find_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો
+find_next_label=આગળનું
+find_not_found=શબ્દસમૂહ મળ્યુ નથી
+find_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો
+find_previous_label=પહેલાંનુ
+find_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ
+find_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ
+findbar.title=દસ્તાવેજમાં શોધો
+findbar_label=શોધો
+first_page.label=પહેલાં પાનામાં જાવ
+invalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ.
+last_page.label=છેલ્લા પાનામાં જાવ
+missing_file_error=ગુમ થયેલ PDF ફાઇલ.
+page_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો
+page_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો
+presentation_mode.title=રજૂઆત સ્થિતિમાં જાવ
+presentation_mode_label=રજૂઆત સ્થિતિ
+printing_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે.
+toggle_sidebar.title=ટૉગલ બાજુપટ્ટી
+toggle_sidebar_label=ટૉગલ બાજુપટ્ટી
+web_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ.
+document_colors_disabled=PDF દસ્તાવેજો તેનાં પોતાના રંગોને વાપરવા પરવાનગી આપતા નથી: \'તેનાં પોતાનાં રંગોને પસંદ કરવા માટે પાનાંને પરવાનગી આપો\' બ્રાઉઝરમાં નિષ્ક્રિય થયેલ છે.
+text_annotation_type.alt=[{{type}} Annotation]
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/he/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/he/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0b1ea45a16109a3e78c29340a4d62e82c32319fd
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/he/chrome.properties
@@ -0,0 +1,20 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=יתכן שמסמך PDF זה לא יוצג כראוי.
+unsupported_feature_forms=מסמך PDF זה מכיל טפסים. מילוי שדות בטפסים אינו נתמך.
+open_with_different_viewer=פתיחה בתוכנת צפייה שונה
+open_with_different_viewer.accessKey=פ
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/he/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/he/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..078d401ab6a4ab5e4a946ce107f346f05d5f3473
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/he/viewer.properties
@@ -0,0 +1,150 @@
+# 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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=דף קודם
+previous_label=קודם
+next.title=דף הבא
+next_label=הבא
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=עמוד:
+page_of=מתוך {{pageCount}}
+
+zoom_out.title=התרחקות
+zoom_out_label=התרחקות
+zoom_in.title=התקרבות
+zoom_in_label=התקרבות
+zoom.title=מרחק מתצוגה
+presentation_mode.title=מעבר למצב מצגת
+presentation_mode_label=מצב מצגת
+open_file.title=פתיחת קובץ
+open_file_label=פתיחה
+print.title=הדפסה
+print_label=הדפסה
+download.title=הורדה
+download_label=הורדה
+bookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש)
+bookmark_label=תצוגה נוכחית
+
+# Secondary toolbar and context menu
+tools.title=כלים
+tools_label=כלים
+first_page.title=מעבר לעמוד הראשון
+first_page.label=מעבר לעמוד הראשון
+first_page_label=מעבר לעמוד הראשון
+last_page.title=מעבר לעמוד האחרון
+last_page.label=מעבר לעמוד האחרון
+last_page_label=מעבר לעמוד האחרון
+page_rotate_cw.title=הטיה עם כיוון השעון
+page_rotate_cw.label=הטיה עם כיוון השעון
+page_rotate_cw_label=הטיה עם כיוון השעון
+page_rotate_ccw.title=הטיה כנגד כיוון השעון
+page_rotate_ccw.label=הטיה כנגד כיוון השעון
+page_rotate_ccw_label=הטיה כנגד כיוון השעון
+
+hand_tool_enable.title=הפעלת כלי היד
+hand_tool_enable_label=הפעלת כלי היד
+hand_tool_disable.title=נטרול כלי היד
+hand_tool_disable_label=נטרול כלי היד
+
+# Document properties dialog box
+document_properties.title=מאפייני מסמך…
+document_properties_label=מאפייני מסמך…
+document_properties_file_name=שם קובץ:
+document_properties_file_size=גודל הקובץ:
+document_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים)
+document_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים)
+document_properties_title=כותרת:
+document_properties_author=מחבר:
+document_properties_subject=נושא:
+document_properties_keywords=מילות מפתח:
+document_properties_creation_date=תאריך יצירה:
+document_properties_modification_date=תאריך שינוי:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=יוצר:
+document_properties_producer=יצרן PDF:
+document_properties_version=גרסת PDF:
+document_properties_page_count=מספר דפים:
+document_properties_close=סגירה
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=הצגה/הסתרה של סרגל הצד
+toggle_sidebar_label=הצגה/הסתרה של סרגל הצד
+outline.title=הצגת מתאר מסמך
+outline_label=מתאר מסמך
+thumbs.title=הצגת תצוגה מקדימה
+thumbs_label=תצוגה מקדימה
+findbar.title=חיפוש במסמך
+findbar_label=חיפוש
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=עמוד {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=תצוגה מקדימה של עמוד {{page}}
+
+# Find panel button title and messages
+find_label=חיפוש:
+find_previous.title=חיפוש מופע קודם של הביטוי
+find_previous_label=קודם
+find_next.title=חיפוש המופע הבא של הביטוי
+find_next_label=הבא
+find_highlight=הדגשת הכול
+find_match_case_label=התאמת אותיות
+find_reached_top=הגיע לראש הדף, ממשיך מלמטה
+find_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה
+find_not_found=ביטוי לא נמצא
+
+# Error panel labels
+error_more_info=מידע נוסף
+error_less_info=פחות מידע
+error_close=סגירה
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js גרסה {{version}} (בנייה: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=הודעה: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=תוכן מחסנית: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=קובץ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=שורה: {{line}}
+rendering_error=אירעה שגיאה בעת עיבוד הדף.
+
+# Predefined zoom values
+page_scale_width=רוחב העמוד
+page_scale_fit=התאמה לעמוד
+page_scale_auto=מרחק מתצוגה אוטומטי
+page_scale_actual=גודל אמתי
+
+# Loading indicator messages
+loading_error_indicator=שגיאה
+loading_error=אירעה שגיאה בעת טעינת ה־PDF.
+invalid_file_error=קובץ PDF פגום או לא תקין.
+missing_file_error=קובץ PDF חסר.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[הערת {{type}}]
+password_label=נא להכניס את הססמה לפתיחת קובץ PDF זה.
+password_invalid=ססמה שגויה. נא לנסות שנית.
+password_ok=אישור
+password_cancel=ביטול
+
+printing_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה.
+printing_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה.
+web_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים.
+document_colors_disabled=מסמכי PDF לא יכולים להשתמש בצבעים משלהם: האפשרות \\'לאפשר לעמודים לבחור צבעים משלהם\\' אינה פעילה בדפדפן.
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hi-IN/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/hi-IN/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..919424340080ebc20c2330f09bd6f05db32a46aa
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hi-IN/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=पीडीएफ दस्तावेज़ सही दिख नहीं सकता है.
+open_with_different_viewer=भिन्न प्रदर्शक के साथ खोलें
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hi-IN/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/hi-IN/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1600830d9aa2f4d2d0ab66002650014e159cfaed
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hi-IN/viewer.properties
@@ -0,0 +1,136 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=पिछला पृष्ठ
+previous_label=पिछला
+next.title=अगला पृष्ठ
+next_label=आगे
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=पृष्ठ:
+page_of={{pageCount}} का
+
+zoom_out.title=छोटा करें
+zoom_out_label=छोटा करें
+zoom_in.title=बड़ा करें
+zoom_in_label=बड़ा करें
+zoom.title=बड़ा-छोटा करें
+presentation_mode.title=प्रस्तुति अवस्था में जाएँ
+presentation_mode_label=प्रस्तुति अवस्था
+open_file.title=फ़ाइल खोलें
+open_file_label=खोलें
+print.title=छापें
+print_label=छापें
+download.title=डाउनलोड
+download_label=डाउनलोड
+bookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें)
+bookmark_label=मौजूदा दृश्य
+
+# Secondary toolbar and context menu
+tools.title=औज़ार
+tools_label=औज़ार
+first_page.title=प्रथम पृष्ठ पर जाएँ
+first_page.label=प्रथम पृष्ठ पर जाएँ
+first_page_label=प्रथम पृष्ठ पर जाएँ
+last_page.title=अंतिम पृष्ठ पर जाएँ
+last_page.label=अंतिम पृष्ठ पर जाएँ
+last_page_label=अंतिम पृष्ठ पर जाएँ
+page_rotate_cw.title=घड़ी की दिशा में घुमाएँ
+page_rotate_cw.label=घड़ी की दिशा में घुमाएँ
+page_rotate_cw_label=घड़ी की दिशा में घुमाएँ
+page_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ
+page_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ
+page_rotate_ccw_label=घड़ी की दिशा से उल्टा घुमाएँ
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=स्लाइडर टॉगल करें
+toggle_sidebar_label=स्लाइडर टॉगल करें
+outline.title=दस्तावेज़ आउटलाइन दिखाएँ
+outline_label=दस्तावेज़ आउटलाइन
+thumbs.title=लघुछवियाँ दिखाएँ
+thumbs_label=लघु छवि
+findbar.title=दस्तावेज़ में ढूँढ़ें
+findbar_label=ढूँढ़ें
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=पृष्ठ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=पृष्ठ {{page}} की लघु-छवि
+
+# Find panel button title and messages
+find_label=ढूंढें:
+find_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें
+find_previous_label=पिछला
+find_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें
+find_next_label=आगे
+find_highlight=सभी आलोकित करें
+find_match_case_label=मिलान स्थिति
+find_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें
+find_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी
+find_not_found=वाक्यांश नहीं मिला
+
+# Error panel labels
+error_more_info=अधिक सूचना
+error_less_info=कम सूचना
+error_close=बंद करें
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=संदेश: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=स्टैक: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=फ़ाइल: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=पंक्ति: {{line}}
+rendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई.
+
+# Predefined zoom values
+page_scale_width=पृष्ठ चौड़ाई
+page_scale_fit=पृष्ठ फिट
+page_scale_auto=स्वचालित जूम
+page_scale_actual=वास्तविक आकार
+
+# Loading indicator messages
+loading_error_indicator=त्रुटि
+loading_error=पीडीएफ लोड करते समय एक त्रुटि हुई.
+invalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल.
+missing_file_error=अनुपस्थित PDF फ़ाइल.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=इस पीडीएफ फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें.
+password_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें.
+password_ok=ठीक
+password_cancel=रद्द करें
+
+printing_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है.
+printing_not_ready=चेतावनी: पीडीएफ छपाई के लिए पूरी तरह से लोड नहीं है.
+web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ.
+document_colors_disabled=PDF दस्तावेज़ उनके अपने रंग को उपयोग करने के लिए अनुमति प्राप्त नहीं है: 'पृष्ठों को उनके अपने रंग को चुनने के लिए स्वीकृति दें कि वह उस ब्राउज़र में निष्क्रिय है.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hr/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/hr/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2cb559f26cb98d5cc3e43c961bd0361e92f1d039
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hr/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ovaj PDF možda neće biti ispravno prikazan
+open_with_different_viewer=Otvori s drugim preglednikom
+open_with_different_viewer.accessKey=O
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hr/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/hr/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e2d5d990d752ee45a094ff71d4b1917fd0187041
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hr/viewer.properties
@@ -0,0 +1,139 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Prethodna stranica
+previous_label=Prethodna
+next.title=Iduća stranica
+next_label=Iduća
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Stranica:
+page_of=od {{pageCount}}
+
+zoom_out.title=Uvećaj
+zoom_out_label=Smanji
+zoom_in.title=Uvaćaj
+zoom_in_label=Smanji
+zoom.title=Uvećanje
+presentation_mode.title=Prebaci u prezentacijski način rada
+presentation_mode_label=Prezentacijski način rada
+open_file.title=Otvori datoteku
+open_file_label=Otvori
+print.title=Ispis
+print_label=Ispis
+download.title=Preuzmi
+download_label=Preuzmi
+bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)
+bookmark_label=Trenutni prikaz
+
+# Secondary toolbar and context menu
+tools.title=Alati
+tools_label=Alati
+first_page.title=Idi na prvu stranicu
+first_page.label=Idi na prvu stranicu
+first_page_label=Idi na prvu stranicu
+last_page.title=Idi na posljednju stranicu
+last_page.label=Idi na posljednju stranicu
+last_page_label=Idi na posljednju stranicu
+page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu
+page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu
+page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu
+page_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu
+page_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu
+page_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu
+
+
+# Document properties dialog box
+document_properties_title=Naslov:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Prikaži/sakrij bočnu traku
+toggle_sidebar_label=Prikaži/sakrij bočnu traku
+outline.title=Prikaži obris dokumenta
+outline_label=Obris dokumenta
+thumbs.title=Prikaži sličice
+thumbs_label=Sličice
+findbar.title=Traži u dokumentu
+findbar_label=Traži
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Stranica {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Sličica stranice {{page}}
+
+# Find panel button title and messages
+find_label=Traži:
+find_previous.title=Pronađi prethodno javljanje ovog izraza
+find_previous_label=Prethodno
+find_next.title=Pronađi iduće javljanje ovog izraza
+find_next_label=Iduće
+find_highlight=Istankni sve
+find_match_case_label=Slučaj podudaranja
+find_reached_top=Dosegnut vrh dokumenta, nastavak od dna
+find_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha
+find_not_found=Izraz nije pronađen
+
+# Error panel labels
+error_more_info=Više informacija
+error_less_info=Manje informacija
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Poruka: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stog: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datoteka: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Redak: {{line}}
+rendering_error=Došlo je do greške prilikom iscrtavanja stranice.
+
+# Predefined zoom values
+page_scale_width=Å irina stranice
+page_scale_fit=Pristajanje stranici
+page_scale_auto=Automatsko uvećanje
+page_scale_actual=Prava veličina
+
+# Loading indicator messages
+loading_error_indicator=Greška
+loading_error=Došlo je do greške pri učitavanju PDF-a.
+invalid_file_error=Kriva ili oštećena PDF datoteka.
+missing_file_error=Nedostaje PDF datoteka.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Bilješka]
+password_label=Upišite lozinku da biste otvorili ovu PDF datoteku.
+password_invalid=Neispravna lozinka. Pokušajte ponovo.
+password_ok=U redu
+password_cancel=Odustani
+
+printing_not_supported=Upozorenje: Ispisivanje nije potpuno podržano u ovom pregledniku.
+printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis.
+web_fonts_disabled=Web fontovi su onemogućeni: nije moguće koristiti umetnute PDF fontove.
+document_colors_disabled=PDF dokumenti nemaju dopuštene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hu/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/hu/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3789bca0243392fcf2e1542cf48167c218921ff0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hu/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ez a PDF-dokumentum nem feltétlenül helyesen jelenik meg.
+unsupported_feature_forms=Ez a PDF-dokumentum űrlapokat tartalmaz. Az űrlapmezők kitöltése nem támogatott.
+open_with_different_viewer=Megnyitás másik megjelenítővel
+open_with_different_viewer.accessKey=M
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hu/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/hu/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..12a764a26808dd8782569de14ba5f812744d980c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hu/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Előző oldal
+previous_label=Előző
+next.title=Következő oldal
+next_label=Tovább
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Oldal:
+page_of=összesen: {{pageCount}}
+
+zoom_out.title=Kicsinyítés
+zoom_out_label=Kicsinyítés
+zoom_in.title=Nagyítás
+zoom_in_label=Nagyítás
+zoom.title=Nagyítás
+presentation_mode.title=Váltás bemutató módba
+presentation_mode_label=Bemutató mód
+open_file.title=Fájl megnyitása
+open_file_label=Megnyitás
+print.title=Nyomtatás
+print_label=Nyomtatás
+download.title=Letöltés
+download_label=Letöltés
+bookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban)
+bookmark_label=Aktuális nézet
+
+# Secondary toolbar and context menu
+tools.title=Eszközök
+tools_label=Eszközök
+first_page.title=Ugrás az első oldalra
+first_page.label=Ugrás az első oldalra
+first_page_label=Ugrás az első oldalra
+last_page.title=Ugrás az utolsó oldalra
+last_page.label=Ugrás az utolsó oldalra
+last_page_label=Ugrás az utolsó oldalra
+page_rotate_cw.title=Forgatás az óramutató járásával egyezően
+page_rotate_cw.label=Forgatás az óramutató járásával egyezően
+page_rotate_cw_label=Forgatás az óramutató járásával egyezően
+page_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen
+page_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen
+page_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen
+
+hand_tool_enable.title=Kéz eszköz bekapcsolása
+hand_tool_enable_label=Kéz eszköz bekapcsolása
+hand_tool_disable.title=Kéz eszköz kikapcsolása
+hand_tool_disable_label=Kéz eszköz kikapcsolása
+
+# Document properties dialog box
+document_properties.title=Dokumentum tulajdonságai…
+document_properties_label=Dokumentum tulajdonságai…
+document_properties_file_name=Fájlnév:
+document_properties_file_size=Fájlméret:
+document_properties_kb={{size_kb}} KB ({{size_b}} bájt)
+document_properties_mb={{size_mb}} MB ({{size_b}} bájt)
+document_properties_title=Cím:
+document_properties_author=Szerző:
+document_properties_subject=Tárgy:
+document_properties_keywords=Kulcsszavak:
+document_properties_creation_date=Létrehozás dátuma:
+document_properties_modification_date=Módosítás dátuma:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Létrehozta:
+document_properties_producer=PDF előállító:
+document_properties_version=PDF verzió:
+document_properties_page_count=Oldalszám:
+document_properties_close=Bezárás
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Oldalsáv be/ki
+toggle_sidebar_label=Oldalsáv be/ki
+outline.title=Dokumentumvázlat megjelenítése
+outline_label=Dokumentumvázlat
+thumbs.title=Bélyegképek megjelenítése
+thumbs_label=Bélyegképek
+findbar.title=Keresés a dokumentumban
+findbar_label=Keresés
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}. oldal
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. oldal bélyegképe
+
+# Find panel button title and messages
+find_label=Keresés:
+find_previous.title=A kifejezés előző előfordulásának keresése
+find_previous_label=Előző
+find_next.title=A kifejezés következő előfordulásának keresése
+find_next_label=Tovább
+find_highlight=Összes kiemelése
+find_match_case_label=Kis- és nagybetűk megkülönböztetése
+find_reached_top=A dokumentum eleje elérve, folytatás a végétől
+find_reached_bottom=A dokumentum vége elérve, folytatás az elejétől
+find_not_found=A kifejezés nem található
+
+# Error panel labels
+error_more_info=További információ
+error_less_info=Kevesebb információ
+error_close=Bezárás
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Üzenet: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Nyomkövetés: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fájl: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Sor: {{line}}
+rendering_error=Hiba történt az oldal feldolgozása közben.
+
+# Predefined zoom values
+page_scale_width=Oldalszélesség
+page_scale_fit=Teljes oldal
+page_scale_auto=Automatikus nagyítás
+page_scale_actual=Valódi méret
+
+# Loading indicator messages
+loading_error_indicator=Hiba
+loading_error=Hiba történt a PDF betöltésekor.
+invalid_file_error=Érvénytelen vagy sérült PDF fájl.
+missing_file_error=Hiányzó PDF fájl.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} megjegyzés]
+password_label=Adja meg a jelszót a PDF fájl megnyitásához.
+password_invalid=Helytelen jelszó. Próbálja újra.
+password_ok=OK
+password_cancel=Mégse
+
+printing_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást.
+printing_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz.
+web_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek.
+document_colors_disabled=A PDF dokumentumok nem használhatják saját színeiket: „Az oldalak a saját maguk által kiválasztott színeket használhatják” beállítás ki van kapcsolva a böngészőben.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hy-AM/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/hy-AM/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3dff8b03324f22b85598cc2789e00385b8f7ac18
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hy-AM/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Այս PDF փաստաթուղթը հնարավոր է նորմալ չցուցադրվի։
+unsupported_feature_forms=Այս PDF-ը պարունակում է ձևեր: Այդ ձևերի լրացումը չի աջակցվում:
+open_with_different_viewer=Բացել այլ դիտարկիչով
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/hy-AM/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/hy-AM/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..dcc47ef259042f1a4093626a978e705e713f6012
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/hy-AM/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Õ†Õ¡Õ­Õ¸Ö€Õ¤ Õ§Õ»Õ¨
+previous_label=Õ†Õ¡Õ­Õ¸Ö€Õ¤Õ¨
+next.title=Õ€Õ¡Õ»Õ¸Ö€Õ¤ Õ§Õ»Õ¨
+next_label=Õ€Õ¡Õ»Õ¸Ö€Õ¤Õ¨
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Ô·Õ».
+page_of={{pageCount}}-ից
+
+zoom_out.title=Փոքրացնել
+zoom_out_label=Փոքրացնել
+zoom_in.title=Խոշորացնել
+zoom_in_label=Խոշորացնել
+zoom.title=Õ„Õ¡Õ½Õ·Õ¿Õ¡Õ¢Õ¨ 
+presentation_mode.title=Անցնել Ներկայացման եղանակին
+presentation_mode_label=Ներկայացման եղանակ
+open_file.title=Բացել Ֆայլ
+open_file_label=Բացել
+print.title=Տպել
+print_label=Տպել
+download.title=Ô²Õ¥Õ¼Õ¶Õ¥Õ¬
+download_label=Ô²Õ¥Õ¼Õ¶Õ¥Õ¬
+bookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում)
+bookmark_label=Ընթացիկ տեսքը
+
+# Secondary toolbar and context menu
+tools.title=Ô³Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€
+tools_label=Ô³Õ¸Ö€Õ®Õ«Ö„Õ¶Õ¥Ö€
+first_page.title=Անցնել առաջին էջին
+first_page.label=Անցնել առաջին էջին
+first_page_label=Անցնել առաջին էջին
+last_page.title=Անցնել վերջին էջին
+last_page.label=Անցնել վերջին էջին
+last_page_label=Անցնել վերջին էջին
+page_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի
+page_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի
+page_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի
+page_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի
+page_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի
+page_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի
+
+hand_tool_enable.title=Միացնել ձեռքի գործիքը
+hand_tool_enable_label=Միացնել ձեռքի գործիքը
+hand_tool_disable.title=Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ±Õ¥Õ¼Ö„Õ« Õ£Õ¸Ö€Õ®Õ«Ö„Õ¨
+hand_tool_disable_label=Ô±Õ†Õ»Õ¡Õ¿Õ¥Õ¬ Õ±Õ¥Õ¼Ö„Õ« Õ£Õ¸Ö€Õ®Õ«Ö„Õ¨
+
+# Document properties dialog box
+document_properties.title=Õ“Õ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ« Õ°Õ¡Õ¿Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨...
+document_properties_label=Õ“Õ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ« Õ°Õ¡Õ¿Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨...
+document_properties_file_name=Õ–Õ¡ÕµÕ¬Õ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨.
+document_properties_file_size=Õ–Õ¡ÕµÕ¬Õ« Õ¹Õ¡ÖƒÕ¨.
+document_properties_kb={{size_kb}} Ô¿Ô² ({{size_b}} Õ¢Õ¡ÕµÕ©)
+document_properties_mb={{size_mb}} Õ„Ô² ({{size_b}} Õ¢Õ¡ÕµÕ©)
+document_properties_title=ÕŽÕ¥Ö€Õ¶Õ¡Õ£Õ«Ö€.
+document_properties_author=Հեղինակ․
+document_properties_subject=ÕŽÕ¥Ö€Õ¶Õ¡Õ£Õ«Ö€.
+document_properties_keywords=Õ€Õ«Õ´Õ¶Õ¡Õ¢Õ¡Õ¼.
+document_properties_creation_date=Ստեղծելու ամսաթիվը.
+document_properties_modification_date=Õ“Õ¸ÖƒÕ¸Õ­Õ¥Õ¬Õ¸Ö‚ Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾Õ¨.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Ստեղծող.
+document_properties_producer=PDF-Õ« Õ°Õ¥Õ²Õ«Õ¶Õ¡Õ¯Õ¨.
+document_properties_version=PDF-Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨.
+document_properties_page_count=Ô·Õ»Õ¥Ö€Õ« Ö„Õ¡Õ¶Õ¡Õ¯Õ¨.
+document_properties_close=Õ“Õ¡Õ¯Õ¥Õ¬
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Բացել/Փակել Կողային վահանակը
+toggle_sidebar_label=Բացել/Փակել Կողային վահանակը
+outline.title=Ցուցադրել փաստաթղթի բովանդակությունը
+outline_label=Õ“Õ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨
+thumbs.title=Ցուցադրել Մանրապատկերը
+thumbs_label=Õ„Õ¡Õ¶Ö€Õ¡ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¨
+findbar.title=Ô³Õ¿Õ¶Õ¥Õ¬ ÖƒÕ¡Õ½Õ¿Õ¡Õ©Õ²Õ©Õ¸Ö‚Õ´
+findbar_label=Õ“Õ¶Õ¿Ö€Õ¥Õ¬
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Ô·Õ»Õ¨ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Ô·Õ»Õ« Õ´Õ¡Õ¶Ö€Õ¡ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¨ {{page}}
+
+# Find panel button title and messages
+find_label=Ô³Õ¿Õ¶Õ¥Õ¬`
+find_previous.title=Ô³Õ¿Õ¶Õ¥Õ¬ Õ¡Õ¶Ö€Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¶Õ¡Õ­Õ¸Ö€Õ¤ Õ°Õ¡Õ¶Õ¤Õ«ÕºÕ¸Ö‚Õ´Õ¨
+find_previous_label=Õ†Õ¡Õ­Õ¸Ö€Õ¤Õ¨
+find_next.title=Ô³Õ¿Õ«Ö€ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Õ»Õ¸Ö€Õ¤ Õ°Õ¡Õ¶Õ¤Õ«ÕºÕ¸Ö‚Õ´Õ¨
+find_next_label=Õ€Õ¡Õ»Õ¸Ö€Õ¤Õ¨
+find_highlight=Õ†Õ·Õ¡Õ£Õ®Õ¥Õ¬ Ô²Õ¸Õ¬Õ¸Ö€Õ¨
+find_match_case_label=Õ„Õ¥Õ®(ÖƒÕ¸Ö„Ö€)Õ¡Õ¿Õ¡Õ¼ Õ°Õ¡Õ·Õ¾Õ« Õ¡Õ¼Õ¶Õ¥Õ¬
+find_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից
+find_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից
+find_not_found=Արտահայտությունը չգտնվեց
+
+# Error panel labels
+error_more_info=Ô±Õ¾Õ¥Õ¬Õ« Õ·Õ¡Õ¿ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶
+error_less_info=Õ”Õ«Õ¹ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶
+error_close=Õ“Õ¡Õ¯Õ¥Õ¬
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (կառուցումը. {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Ô³Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨. {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Õ‡Õ¥Õ²Õ». {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Õ–Õ¡ÕµÕ¬. {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Տողը. {{line}}
+rendering_error=Սխալ՝ էջը ստեղծելիս:
+
+# Predefined zoom values
+page_scale_width=Ô·Õ»Õ« Õ¬Õ¡ÕµÕ¶Ö„Õ¨
+page_scale_fit=Ձգել էջը
+page_scale_auto=Ô»Õ¶Ö„Õ¶Õ¡Õ·Õ­Õ¡Õ¿
+page_scale_actual=Ô»Ö€Õ¡Õ¯Õ¡Õ¶ Õ¹Õ¡ÖƒÕ¨
+
+# Loading indicator messages
+loading_error_indicator=Սխալ
+loading_error=Սխալ՝ PDF ֆայլը բացելիս։
+invalid_file_error=Սխալ կամ բնասված PDF ֆայլ:
+missing_file_error=PDF ֆայլը բացակայում է:
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Ô¾Õ¡Õ¶Õ¸Õ©Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶]
+password_label=Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ PDF-Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨:
+password_invalid=Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ½Õ­Õ¡Õ¬ Õ§: Ô¿Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Ö„:
+password_ok=Ô¼Ô±ÕŽ
+password_cancel=Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬
+
+printing_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։
+printing_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար:
+web_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները:
+document_colors_disabled=PDF փաստաթղթերին թույլատրված չէ օգտագործել իրենց սեփական գույները: 'Թույլատրել էջերին ընտրել իրենց սեփական գույները' ընտրանքը անջատված է դիտարկիչում:
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/id/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/id/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..dc7a4493cdd7b72b632bc35e2595770ba75909bb
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/id/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dokumen PDF mungkin tidak dapat ditampilkan dengan benar.
+unsupported_feature_forms=Dokumen PDF ini mengandung formulir. Pengisian bidang isian formulir tidak didukung.
+open_with_different_viewer=Buka dengan Program Lainnya
+open_with_different_viewer.accessKey=l
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/id/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/id/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c13c1da583bfe6c407a2baced5bb9108486df71b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/id/viewer.properties
@@ -0,0 +1,167 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Laman Sebelumnya
+previous_label=Sebelumnya
+next.title=Laman Selanjutnya
+next_label=Selanjutnya
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Laman:
+page_of=dari {{pageCount}}
+
+zoom_out.title=Perkecil
+zoom_out_label=Perkecil
+zoom_in.title=Perbesar
+zoom_in_label=Perbesar
+zoom.title=Perbesaran
+print.title=Cetak
+print_label=Cetak
+presentation_mode.title=Ganti ke Mode Presentasi
+presentation_mode_label=Mode Presentasi
+open_file.title=Buka Berkas
+open_file_label=Buka
+download.title=Unduh
+download_label=Unduh
+bookmark.title=Tampilan Sekarang (salin atau buka di jendela baru)
+bookmark_label=Tampilan Sekarang
+
+# Secondary toolbar and context menu
+tools.title=Alat
+tools_label=Alat
+first_page.title=Buka Halaman Pertama
+first_page.label=Buka Halaman Pertama
+first_page_label=Buka Halaman Pertama
+last_page.title=Buka Halaman Terakhir
+last_page.label=Buka Halaman Terakhir
+last_page_label=Buka Halaman Terakhir
+page_rotate_cw.title=Putar Searah Jarum Jam
+page_rotate_cw.label=Putar Searah Jarum Jam
+page_rotate_cw_label=Putar Searah Jarum Jam
+page_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam
+page_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam
+page_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam
+
+hand_tool_enable.title=Aktifkan alat tangan
+hand_tool_enable_label=Aktifkan alat tangan
+hand_tool_disable.title=Nonaktifkan alat tangan
+hand_tool_disable_label=Nonaktifkan alat tangan
+
+# Document properties dialog box
+document_properties.title=Properti Dokumen…
+document_properties_label=Properti Dokumen…
+document_properties_file_name=Nama berkas:
+document_properties_file_size=Ukuran berkas:
+document_properties_kb={{size_kb}} KB ({{size_b}} byte)
+document_properties_mb={{size_mb}} MB ({{size_b}} byte)
+document_properties_title=Judul:
+document_properties_author=Penyusun:
+document_properties_subject=Subjek:
+document_properties_keywords=Kata Kunci:
+document_properties_creation_date=Tanggal Dibuat:
+document_properties_modification_date=Tanggal Dimodifikasi:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Pembuat:
+document_properties_producer=Pemroduksi PDF:
+document_properties_version=Versi PDF:
+document_properties_page_count=Jumlah Halaman:
+document_properties_close=Tutup
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping
+toggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping
+outline.title=Buka Kerangka Dokumen
+outline_label=Kerangka Dokumen
+thumbs.title=Tampilkan Miniatur
+thumbs_label=Miniatur
+findbar.title=Temukan di Dokumen
+findbar_label=Temukan
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Laman {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatur Laman {{page}}
+
+# Context menu
+first_page.label=Ke Halaman Pertama
+last_page.label=Ke Halaman Terakhir
+page_rotate_cw.label=Putar Searah Jarum Jam
+page_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam
+
+# Find panel button title and messages
+find_label=Temukan:
+find_previous.title=Temukan kata sebelumnya
+find_previous_label=Sebelumnya
+find_next.title=Temukan lebih lanjut
+find_next_label=Selanjutnya
+find_highlight=Sorot semu&anya
+find_match_case_label=Cocokkan BESAR/kecil
+find_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah
+find_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas
+find_not_found=Frasa tidak ditemukan
+
+# Error panel labels
+error_more_info=Lebih Banyak Informasi
+error_less_info=Lebih Sedikit Informasi
+error_close=Tutup
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Pesan: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Berkas: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Baris: {{line}}
+rendering_error=Galat terjadi saat merender laman.
+
+# Predefined zoom values
+page_scale_width=Lebar Laman
+page_scale_fit=Muat Laman
+page_scale_auto=Perbesaran Otomatis
+page_scale_actual=Ukuran Asli
+
+# Loading indicator messages
+loading_error_indicator=Galat
+loading_error=Galat terjadi saat memuat PDF.
+invalid_file_error=Berkas PDF tidak valid atau rusak.
+missing_file_error=Berkas PDF tidak ada.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotasi {{type}}]
+password_label=Masukkan sandi untuk membuka berkas PDF ini.
+password_invalid=Sandi tidak valid. Silakan coba lagi.
+password_ok=Oke
+password_cancel=Batal
+
+printing_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.
+printing_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.
+web_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.
+document_colors_disabled=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan \'Izinkan laman memilih warna sendiri\’ dinonaktifkan pada pengaturan.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/is/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/is/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..221ef0a5c4fc18b0f2b0a2ec3afee8a856ac3aa0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/is/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Hugsanlega birtist þetta PDF skjal ekki rétt.
+unsupported_feature_forms=Þetta PDF skjal inniheldur eyðublað. Ekki er stuðningur við innfyllingu á eyðublaði.
+open_with_different_viewer=Opna með öðrum skoðara
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/is/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/is/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..98408e32a7eb7fe04f10c104f8d133cc9fc2a2d7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/is/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Fyrri síða
+previous_label=Fyrri
+next.title=Næsta síða
+next_label=Næsti
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Síða:
+page_of=af {{pageCount}}
+
+zoom_out.title=Minnka
+zoom_out_label=Minnka
+zoom_in.title=Stækka
+zoom_in_label=Stækka
+zoom.title=Aðdráttur
+presentation_mode.title=Skipta yfir á kynningarham
+presentation_mode_label=Kynningarhamur
+open_file.title=Opna skrá
+open_file_label=Opna
+print.title=Prenta
+print_label=Prenta
+download.title=Hala niður
+download_label=Hala niður
+bookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga)
+bookmark_label=Núverandi sýn
+
+# Secondary toolbar and context menu
+tools.title=Verkfæri
+tools_label=Verkfæri
+first_page.title=Fara á fyrstu síðu
+first_page.label=Fara á fyrstu síðu
+first_page_label=Fara á fyrstu síðu
+last_page.title=Fara á síðustu síðu
+last_page.label=Fara á síðustu síðu
+last_page_label=Fara á síðustu síðu
+page_rotate_cw.title=Snúa réttsælis
+page_rotate_cw.label=Snúa réttsælis
+page_rotate_cw_label=Snúa réttsælis
+page_rotate_ccw.title=Snúa rangsælis
+page_rotate_ccw.label=Snúa rangsælis
+page_rotate_ccw_label=Snúa rangsælis
+
+hand_tool_enable.title=Virkja handarverkfæri
+hand_tool_enable_label=Virkja handarverkfæri
+hand_tool_disable.title=Gera handarverkfæri óvirkt
+hand_tool_disable_label=Gera handarverkfæri óvirkt
+
+# Document properties dialog box
+document_properties.title=Eiginleikar skjals…
+document_properties_label=Eiginleikar skjals…
+document_properties_file_name=Skráarnafn:
+document_properties_file_size=Skrárstærð:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titill:
+document_properties_author=Hönnuður:
+document_properties_subject=Efni:
+document_properties_keywords=Stikkorð:
+document_properties_creation_date=Búið til:
+document_properties_modification_date=Dags breytingar:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Höfundur:
+document_properties_producer=PDF framleiðandi:
+document_properties_version=PDF útgáfa:
+document_properties_page_count=Blaðsíðufjöldi:
+document_properties_close=Loka
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Víxla hliðslá
+toggle_sidebar_label=Víxla hliðslá
+outline.title=Sýna efniskipan skjals
+outline_label=Efnisskipan skjals
+thumbs.title=Sýna smámyndir
+thumbs_label=Smámyndir
+findbar.title=Leita í skjali
+findbar_label=Leita
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Síða {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Smámynd af síðu {{page}}
+
+# Find panel button title and messages
+find_label=Leita:
+find_previous.title=Leita að fyrra tilfelli þessara orða
+find_previous_label=Fyrri
+find_next.title=Leita að næsta tilfelli þessara orða
+find_next_label=Næsti
+find_highlight=Lita allt
+find_match_case_label=Passa við stafstöðu
+find_reached_top=Náði efst í skjal, held áfram neðst
+find_reached_bottom=Náði enda skjals, held áfram efst
+find_not_found=Fann ekki orðið
+
+# Error panel labels
+error_more_info=Meiri upplýsingar
+error_less_info=Minni upplýsingar
+error_close=Loka
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Skilaboð: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stafli: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Skrá: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Lína: {{line}}
+rendering_error=Upp kom villa við að birta síðuna.
+
+# Predefined zoom values
+page_scale_width=Síðubreidd
+page_scale_fit=Passa á síðu
+page_scale_auto=Sjálfvirkur aðdráttur
+page_scale_actual=Raunstærð
+
+# Loading indicator messages
+loading_error_indicator=Villa
+loading_error=Villa kom upp við að hlaða inn PDF.
+invalid_file_error=Ógild eða skemmd PDF skrá.
+missing_file_error=Vantar PDF skrá.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Skýring]
+password_label=Sláðu inn lykilorð til að opna þessa PDF skrá.
+password_invalid=Ógilt lykilorð. Reyndu aftur.
+password_ok=Í lagi\u0020
+password_cancel=Hætta við
+
+printing_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra.
+printing_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun.
+web_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir.
+document_colors_disabled=PDF skjöl hafa ekki leyfi til að nota sína eigin liti: 'Leyfa síðum að velja eigin liti' er óvirkt í vafranum.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/it/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/it/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..562e9949f856b6606c279ca975f3fb8383c276a4
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/it/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+unsupported_feature = Questo documento PDF potrebbe non essere visualizzato correttamente.
+unsupported_feature_forms = Questo documento PDF contiene dei moduli. La compilazione di moduli non è supportata.
+open_with_different_viewer = Apri con un altro lettore
+open_with_different_viewer.accessKey = A
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/it/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/it/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f6c4888135e0d607eea487331be8cadaa27dcf25
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/it/viewer.properties
@@ -0,0 +1,107 @@
+# 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/.
+
+previous.title = Pagina precedente
+previous_label = Precedente
+next.title = Pagina successiva
+next_label = Successiva
+page_label = Pagina:
+page_of = di {{pageCount}}
+zoom_out.title = Riduci zoom
+zoom_out_label = Riduci zoom
+zoom_in.title = Aumenta zoom
+zoom_in_label = Aumenta zoom
+zoom.title = Zoom
+presentation_mode.title = Passa alla modalità presentazione
+presentation_mode_label = Modalità presentazione
+open_file.title = Apri file
+open_file_label = Apri file
+print.title = Stampa
+print_label = Stampa
+download.title = Scarica questo documento
+download_label = Download
+bookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra)
+bookmark_label = Visualizzazione corrente
+tools.title = Strumenti
+tools_label = Strumenti
+first_page.title = Vai alla prima pagina
+first_page.label = Vai alla prima pagina
+first_page_label = Vai alla prima pagina
+last_page.title = Vai all’ultima pagina
+last_page.label = Vai all’ultima pagina
+last_page_label = Vai all’ultima pagina
+page_rotate_cw.title = Ruota in senso orario
+page_rotate_cw.label = Ruota in senso orario
+page_rotate_cw_label = Ruota in senso orario
+page_rotate_ccw.title = Ruota in senso antiorario
+page_rotate_ccw.label = Ruota in senso antiorario
+page_rotate_ccw_label = Ruota in senso antiorario
+hand_tool_enable.title = Attiva strumento mano
+hand_tool_enable_label = Attiva strumento mano
+hand_tool_disable.title = Disattiva strumento mano
+hand_tool_disable_label = Disattiva strumento mano
+document_properties.title = Proprietà del documento…
+document_properties_label = Proprietà del documento…
+document_properties_file_name = Nome file:
+document_properties_file_size = Dimensione file:
+document_properties_kb = {{size_kb}} kB ({{size_b}} byte)
+document_properties_mb = {{size_kb}} MB ({{size_b}} byte)
+document_properties_title = Titolo:
+document_properties_author = Autore:
+document_properties_subject = Oggetto:
+document_properties_keywords = Parole chiave:
+document_properties_creation_date = Data creazione:
+document_properties_modification_date = Data modifica:
+document_properties_date_string = {{date}}, {{time}}
+document_properties_creator = Autore originale:
+document_properties_producer = Produttore PDF:
+document_properties_version = Versione PDF:
+document_properties_page_count = Conteggio pagine:
+document_properties_close = Chiudi
+toggle_sidebar.title = Attiva/disattiva barra laterale
+toggle_sidebar_label = Attiva/disattiva barra laterale
+outline.title = Visualizza la struttura del documento
+outline_label = Struttura documento
+thumbs.title = Mostra le miniature
+thumbs_label = Miniature
+findbar.title = Trova nel documento
+findbar_label = Trova
+thumb_page_title = Pagina {{page}}
+thumb_page_canvas = Miniatura della pagina {{page}}
+find_label = Trova:
+find_previous.title = Trova l’occorrenza precedente del testo da cercare
+find_previous_label = Precedente
+find_next.title = Trova l’occorrenza successiva del testo da cercare
+find_next_label = Successivo
+find_highlight = Evidenzia
+find_match_case_label = Maiuscole/minuscole
+find_reached_top = Raggiunto l’inizio della pagina, continua dalla fine
+find_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio
+find_not_found = Testo non trovato
+error_more_info = Più informazioni
+error_less_info = Meno informazioni
+error_close = Chiudi
+error_version_info = PDF.js v{{version}} (build: {{build}})
+error_message = Messaggio: {{message}}
+error_stack = Stack: {{stack}}
+error_file = File: {{file}}
+error_line = Riga: {{line}}
+rendering_error = Si è verificato un errore durante il rendering della pagina.
+page_scale_width = Larghezza pagina
+page_scale_fit = Adatta a una pagina
+page_scale_auto = Zoom automatico
+page_scale_actual = Dimensioni effettive
+loading_error_indicator = Errore
+loading_error = Si è verificato un errore durante il caricamento del PDF.
+invalid_file_error = File PDF non valido o danneggiato.
+missing_file_error = File PDF non disponibile.
+text_annotation_type.alt = [Annotazione: {{type}}]
+password_label = Inserire la password per aprire questo file PDF.
+password_invalid = Password non corretta. Riprovare.
+password_ok = OK
+password_cancel = Annulla
+printing_not_supported = Attenzione: la stampa non è completamente supportata da questo browser.
+printing_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa.
+web_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF.
+document_colors_disabled = Non è possibile per i documenti PDF utilizzare i propri colori: l’opzione del browser “Permetti alle pagine di scegliere i propri colori invece di quelli impostati” è disattivata.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ja/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ja/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..10e02bbbb4f94d07d72ccb3bce0d6b3605e11c09
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ja/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=この PDF 文書はサポートされていないため正しく表示できない可能性があります。
+unsupported_feature_forms=この PDF ドキュメントは、フォームが含まれています。フォームフィールドへの入力はサポートされていません。
+open_with_different_viewer=ほかのビューアで開く
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ja/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ja/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bfb46fe41559af257324406bde708227c9c986ea
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ja/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=前のページ
+previous_label=前へ
+next.title=次のページ
+next_label=次へ
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=ページ:
+page_of=/ {{pageCount}}
+
+zoom_out.title=縮小
+zoom_out_label=縮小
+zoom_in.title=拡大
+zoom_in_label=拡大
+zoom.title=拡大/縮小
+presentation_mode.title=プレゼンテーションモードに切り替えます
+presentation_mode_label=プレゼンテーションモード
+open_file.title=ファイルを開く
+open_file_label=開く
+print.title=印刷
+print_label=印刷
+download.title=ダウンロード
+download_label=ダウンロード
+bookmark.title=現在のビューをブックマーク
+bookmark_label=現在のビューをブックマーク
+
+# Secondary toolbar and context menu
+tools.title=ツール
+tools_label=ツール
+first_page.title=最初のページへ移動
+first_page.label=最初のページへ移動
+first_page_label=最初のページへ移動
+last_page.title=最後のページへ移動
+last_page.label=最後のページへ移動
+last_page_label=最後のページへ移動
+page_rotate_cw.title=右回転
+page_rotate_cw.label=右回転
+page_rotate_cw_label=右回転
+page_rotate_ccw.title=左回転
+page_rotate_ccw.label=左回転
+page_rotate_ccw_label=左回転
+
+hand_tool_enable.title=手のひらツールを有効にする
+hand_tool_enable_label=手のひらツールを有効にする
+hand_tool_disable.title=手のひらツールを無効にする
+hand_tool_disable_label=手のひらツールを無効にする
+
+# Document properties dialog box
+document_properties.title=文書のプロパティ...
+document_properties_label=文書のプロパティ...
+document_properties_file_name=ファイル名:
+document_properties_file_size=ファイルサイズ:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=タイトル:
+document_properties_author=作成者:
+document_properties_subject=件名:
+document_properties_keywords=キーワード:
+document_properties_creation_date=作成日:
+document_properties_modification_date=æ›´æ–°æ—¥:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=アプリケーション:
+document_properties_producer=PDF 変換:
+document_properties_version=PDF のバージョン:
+document_properties_page_count=ページ数:
+document_properties_close=閉じる
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=サイドバーの切り替え
+toggle_sidebar_label=サイドバーの切り替え
+outline.title=文書の目次
+outline_label=文書の目次
+thumbs.title=縮小版
+thumbs_label=縮小版
+findbar.title=検索
+findbar_label=検索
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} ページ
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=ページの縮小版 {{page}}
+
+# Find panel button title and messages
+find_label=検索:
+find_previous.title=指定文字列に一致する 1 つ前の部分を検索します
+find_previous_label=前へ
+find_next.title=指定文字列に一致する次の部分を検索します
+find_next_label=次へ
+find_highlight=すべて強調表示
+find_match_case_label=大文字/小文字を区別
+find_reached_top=文書先頭まで検索したので末尾に戻って検索しました。
+find_reached_bottom=文書末尾まで検索したので先頭に戻って検索しました。
+find_not_found=見つかりませんでした。
+
+# Error panel labels
+error_more_info=詳細情報
+error_less_info=詳細情報の非表示
+error_close=閉じる
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (ビルド: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=メッセージ: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=スタック: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ファイル: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=ライン: {{line}}
+rendering_error=ページのレンダリング中にエラーが発生しました
+
+# Predefined zoom values
+page_scale_width=幅に合わせる
+page_scale_fit=ページのサイズに合わせる
+page_scale_auto=自動ズーム
+page_scale_actual=実際のサイズ
+
+# Loading indicator messages
+loading_error_indicator=エラー
+loading_error=PDF の読み込み中にエラーが発生しました
+invalid_file_error=無効または破損した PDF ファイル
+missing_file_error=PDF ファイルが見つかりません。
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 注釈]
+password_label=この PDF ファイルを開くためのパスワードを入力してください。
+password_invalid=無効なパスワードです。もう一度やり直してください。
+password_ok=OK
+password_cancel=キャンセル
+
+printing_not_supported=警告: このブラウザでは印刷が完全にサポートされていません
+printing_not_ready=警告: PDF を印刷するための読み込みが終了していません
+web_fonts_disabled=Web フォントが無効になっています: 埋め込まれた PDF のフォントを使用することができません
+document_colors_disabled=PDF 文書は、Web ページが指定した配色を使用することができません: \'Web ページが指定した配色\' はブラウザで無効になっています。
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ka/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ka/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..41f500f8873def27117e60220cfefcb462cbbef0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ka/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ამ PDF დოკუმენტი შესაძლოა უმართებლოდ აისახოს.
+open_with_different_viewer=ასახვა სხვა პროგრამით
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ka/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ka/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f6c68f50f56ccd1fd3022b9e66ff8e86cd854f28
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ka/viewer.properties
@@ -0,0 +1,124 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=წინა გვერდი
+previous_label=წინა
+next.title=შემდეგი გვერდი
+next_label=შემდეგი
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=გვერდი:
+page_of=of {{pageCount}}
+
+zoom_out.title=შემცირება
+zoom_out_label=გაზრდა
+zoom_in.title=შემცირება
+zoom_in_label=შემცირება
+zoom.title=მასშტაბი
+print.title=ამობეჭდვა
+print_label=ამობეჭდვა
+presentation_mode.title=გადართვა პრეზენტაციის რეჟიმზე
+presentation_mode_label=პრეზენტაციის რეჟიმი
+open_file.title=ფაილის გახსნა
+open_file_label=გახსნა
+download.title=ჩამოტვირთვა
+download_label=ჩამოტვირთვა
+bookmark.title=მიმდინარე ხედი (ასლი ან გახსნა ახალ სარკმელში)
+bookmark_label=მიმდინარე ხედი
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=სტენდის ჩვენება/დამალვა
+toggle_sidebar_label=სტენდის ჩვენება/დამალვა
+outline.title=დოკუმენტის სქემის ჩვენება
+outline_label=დოკუმენტის სქემა
+thumbs.title=მინიატურების ჩვენება
+thumbs_label=მინიატურები
+findbar.title=პოვნა დოკუმენტში
+findbar_label=პოვნა
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=გვერდი {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=მინიატურა გვერდისთვის {{page}}
+
+# Context menu
+first_page.label=გადასვლა პირველ გვერდზე
+last_page.label=გადასვლა ბოლო გვერდზე
+page_rotate_cw.label=დატრიალება
+page_rotate_ccw.label=უკუდატრიალება
+
+# Find panel button title and messages
+find_label=პოვნა:
+find_previous.title=კონტექსტის წინა თანხვედრის პოვნა
+find_previous_label=წინა
+find_next.title=კონტექსტის შემდეგი თანხვედრის პოვნა
+find_next_label=შემდეგი
+find_highlight=ყველას გამოყოფა
+find_match_case_label=მთავრულის გათვალისწინებით
+find_reached_top=დოკუმენტის თავი, გრძელდება დოკუმენტის ბოლოდან
+find_reached_bottom=დოკუმენტის ბოლო, გრძელდება დოკუმენტის თავიდან
+find_not_found=კონტექსტი ვერ მოიძებნა
+
+# Error panel labels
+error_more_info=დეტალების ჩვენება
+error_less_info=დეტალების დამალვა
+error_close=დახურვა
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (აგება: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=გზავნილი: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=მჭიდი: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ფაილი: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=სტრიქონი: {{line}}
+rendering_error=შეცდომა გვერდის ასახვისას.
+
+# Predefined zoom values
+page_scale_width=გვერდის სიგანეზე
+page_scale_fit=გვერდის შევსება
+page_scale_auto=თვითმასშტაბი
+page_scale_actual=რეალური ზომა
+
+# Loading indicator messages
+loading_error_indicator=შეცდომა
+loading_error=შეცდომა PDF ფაილის ჩატვირთვისას.
+invalid_file_error=უმართებლო ან დაზიანებული PDF ფაილი.
+missing_file_error=მცდარი PDF ფაილი.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} ანოტაცია]
+request_password=PDF დაცულია პაროლით:
+invalid_password=პაროლი მცდარია.
+
+printing_not_supported=გაფრთხილება: ამ ბრაუზერში ამობეჭდვის მხარდაჭერა არასრულია .
+printing_not_ready=გაფრთხილება: PDF ფაილი ამოსაბეჭდად სრულად არ ჩატვირთულა.
+web_fonts_disabled=ვებ შრიფტები ამორთულია: ჩადგმული PDF შრიფტებით სარგებლობა ვერ ხერხდება.
+document_colors_disabled=PDF დოკუმენტებს ეკრძალებათ საკუთარი ფერების გამოყენება: ბრაუზერში ამორთულია პარამეტრი - «გვერდებისთვის საკუთარი ფერებით სარგებლობის უფლება».
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/kk/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/kk/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..448e6bbbe194d52611677582f7a410484b40914d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/kk/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Бұл PDF құжаты дұрыс көрсетілмеуі мүмкін.
+unsupported_feature_forms=Бұл PDF құжатында формалар бар. Формалар өрістерін толтыруға қолдау жоқ.
+open_with_different_viewer=Басқа қолданбада ашу
+open_with_different_viewer.accessKey=о
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/kk/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/kk/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..632b21b1cccabb69c1342a3fe9ffaa52f4d491bf
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/kk/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Алдыңғы парақ
+previous_label=Алдыңғысы
+next.title=Келесі парақ
+next_label=Келесі
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Парақ:
+page_of={{pageCount}} ішінен
+
+zoom_out.title=Кішірейту
+zoom_out_label=Кішірейту
+zoom_in.title=Үлкейту
+zoom_in_label=Үлкейту
+zoom.title=Масштаб
+presentation_mode.title=Презентация режиміне ауысу
+presentation_mode_label=Презентация режимі
+open_file.title=Файлды ашу
+open_file_label=Ашу
+print.title=Баспаға шығару
+print_label=Баспаға шығару
+download.title=Жүктеп алу
+download_label=Жүктеп алу
+bookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу)
+bookmark_label=Ағымдағы көрініс
+
+# Secondary toolbar and context menu
+tools.title=Саймандар
+tools_label=Саймандар
+first_page.title=Алғашқы параққа өту
+first_page.label=Алғашқы параққа өту
+first_page_label=Алғашқы параққа өту
+last_page.title=Соңғы параққа өту
+last_page.label=Соңғы параққа өту
+last_page_label=Соңғы параққа өту
+page_rotate_cw.title=Сағат тілі бағытымен айналдыру
+page_rotate_cw.label=Сағат тілі бағытымен бұру
+page_rotate_cw_label=Сағат тілі бағытымен бұру
+page_rotate_ccw.title=Сағат тілі бағытына қарсы бұру
+page_rotate_ccw.label=Сағат тілі бағытына қарсы бұру
+page_rotate_ccw_label=Сағат тілі бағытына қарсы бұру
+
+hand_tool_enable.title=Қол сайманын іске қосу
+hand_tool_enable_label=Қол сайманын іске қосу
+hand_tool_disable.title=Қол сайманын сөндіру
+hand_tool_disable_label=Қол сайманын сөндіру
+
+# Document properties dialog box
+document_properties.title=Құжат қасиеттері…
+document_properties_label=Құжат қасиеттері…
+document_properties_file_name=Файл аты:
+document_properties_file_size=Файл өлшемі:
+document_properties_kb={{size_kb}} КБ ({{size_b}} байт)
+document_properties_mb={{size_mb}} МБ ({{size_b}} байт)
+document_properties_title=Тақырыбы...
+document_properties_author=Авторы:
+document_properties_subject=Тақырыбы:
+document_properties_keywords=Кілт сөздер:
+document_properties_creation_date=Жасалған күні:
+document_properties_modification_date=Түзету күні:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Жасаған:
+document_properties_producer=PDF өндірген:
+document_properties_version=PDF нұсқасы:
+document_properties_page_count=Беттер саны:
+document_properties_close=Жабу
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Бүйір панелін көрсету/жасыру
+toggle_sidebar_label=Бүйір панелін көрсету/жасыру
+outline.title=Құжат құрамасын көрсету
+outline_label=Құжат құрамасы
+thumbs.title=Кіші көріністерді көрсету
+thumbs_label=Кіші көріністер
+findbar.title=Құжаттан табу
+findbar_label=Табу
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} парағы
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} парағы үшін кіші көрінісі
+
+# Find panel button title and messages
+find_label=Табу:
+find_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу
+find_previous_label=Алдыңғысы
+find_next.title=Осы сөздердің мәтіннен келесі кездесуін табу
+find_next_label=Келесі
+find_highlight=Барлығын түспен ерекшелеу
+find_match_case_label=Регистрді ескеру
+find_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз
+find_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз
+find_not_found=Сөз(дер) табылмады
+
+# Error panel labels
+error_more_info=Көбірек ақпарат
+error_less_info=Азырақ ақпарат
+error_close=Жабу
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (жинақ: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Хабарлама: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Стек: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Файл: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Жол: {{line}}
+rendering_error=Парақты өңдеу кезінде қате кетті.
+
+# Predefined zoom values
+page_scale_width=Парақ ені
+page_scale_fit=Парақты сыйдыру
+page_scale_auto=Автомасштабтау
+page_scale_actual=Нақты өлшемі
+
+# Loading indicator messages
+loading_error_indicator=Қате
+loading_error=PDF жүктеу кезінде қате кетті.
+invalid_file_error=Зақымдалған немесе қате PDF файл.
+missing_file_error=PDF файлы жоқ.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} аңдатпасы]
+password_label=Бұл PDF файлын ашу үшін парольді енгізіңіз.
+password_invalid=Пароль дұрыс емес. Қайталап көріңіз.
+password_ok=ОК
+password_cancel=Бас тарту
+
+printing_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды.
+printing_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады.
+web_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес.
+document_colors_disabled=PDF құжаттарына өздік түстерді қолдану рұқсат етілмеген: бұл браузерде 'Веб-сайттарға өздерінің түстерін қолдануға рұқсат беру' мүмкіндігі сөндірулі тұр.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/km/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/km/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..9c86c52db201b530bad46f8b615672a4a402be15
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/km/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ឯកសារ PDF នេះ​អាច​មិន​ត្រូវ​បាន​បង្ហាញ​ត្រឹមត្រូវ ។
+unsupported_feature_forms=ឯកសារ PDF នេះ​មាន​ទម្រង់។ បំពេញ​វា​ទម្រង់​មិន​ត្រូវ​បាន​គាំទ្រ។
+open_with_different_viewer=បើក​ជាមួយ​កម្មវិធី​មើល​ផ្សេងគ្នា
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/km/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/km/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..25975b94d78887a64976d983064ce88cbaaac30c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/km/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=ទំព័រ​មុន
+previous_label=មុន
+next.title=ទំព័រ​បន្ទាប់
+next_label=បន្ទាប់
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=ទំព័រ ៖
+page_of=នៃ {{pageCount}}
+
+zoom_out.title=​បង្រួម
+zoom_out_label=​បង្រួម
+zoom_in.title=​ពង្រីក
+zoom_in_label=​ពង្រីក
+zoom.title=ពង្រីក
+presentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ
+presentation_mode_label=របៀប​បទ​បង្ហាញ
+open_file.title=បើក​ឯកសារ
+open_file_label=បើក
+print.title=បោះពុម្ព
+print_label=បោះពុម្ព
+download.title=ទាញ​យក
+download_label=ទាញ​យក
+bookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី)
+bookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន
+
+# Secondary toolbar and context menu
+tools.title=ឧបករណ៍
+tools_label=ឧបករណ៍
+first_page.title=ទៅកាន់​ទំព័រ​ដំបូង​
+first_page.label=ទៅកាន់​ទំព័រ​ដំបូង​
+first_page_label=ទៅកាន់​ទំព័រ​ដំបូង​
+last_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​
+last_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​
+last_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ
+page_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា
+page_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា
+page_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា
+page_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​
+page_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​
+page_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​
+
+hand_tool_enable.title=បើក​ឧបករណ៍​ដោយ​ដៃ
+hand_tool_enable_label=បើក​ឧបករណ៍​ដោយ​ដៃ
+hand_tool_disable.title=បិទ​ឧបករណ៍​ប្រើ​ដៃ
+hand_tool_disable_label=បិទ​ឧបករណ៍​ប្រើ​ដៃ
+
+# Document properties dialog box
+document_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ…
+document_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ…
+document_properties_file_name=ឈ្មោះ​ឯកសារ៖
+document_properties_file_size=ទំហំ​ឯកសារ៖
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=ចំណងជើង ៖
+document_properties_author=អ្នក​និពន្ធ៖
+document_properties_subject=ប្រធានបទ៖
+document_properties_keywords=ពាក្យ​គន្លឹះ៖
+document_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖
+document_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=អ្នក​បង្កើត៖
+document_properties_producer=កម្មវិធី​បង្កើត PDF ៖
+document_properties_version=កំណែ PDF ៖
+document_properties_page_count=ចំនួន​ទំព័រ៖
+document_properties_close=បិទ
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល
+toggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល
+outline.title=បង្ហាញ​គ្រោង​ឯកសារ
+outline_label=គ្រោង​ឯកសារ
+thumbs.title=បង្ហាញ​រូបភាព​តូចៗ
+thumbs_label=រួបភាព​តូចៗ
+findbar.title=រក​នៅ​ក្នុង​ឯកសារ
+findbar_label=រក
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=ទំព័រ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}}
+
+# Find panel button title and messages
+find_label=រក ៖
+find_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន
+find_previous_label=មុន
+find_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់
+find_next_label=បន្ទាប់
+find_highlight=បន្លិច​ទាំងអស់
+find_match_case_label=ករណី​ដំណូច
+find_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ
+find_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ
+find_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា
+
+# Error panel labels
+error_more_info=ព័ត៌មាន​បន្ថែម
+error_less_info=ព័ត៌មាន​តិចតួច
+error_close=បិទ
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=សារ ៖ {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=ជង់ ៖ {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ឯកសារ ៖ {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=ជួរ ៖ {{line}}
+rendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។
+
+# Predefined zoom values
+page_scale_width=ទទឹង​ទំព័រ
+page_scale_fit=សម​ទំព័រ
+page_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ
+page_scale_actual=ទំហំ​ជាក់ស្ដែង
+
+# Loading indicator messages
+loading_error_indicator=កំហុស
+loading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។
+invalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។
+missing_file_error=បាត់​ឯកសារ PDF
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់]
+password_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។
+password_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។
+password_ok=យល់​ព្រម
+password_cancel=បោះបង់
+
+printing_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។
+printing_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។
+web_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។
+document_colors_disabled=ឯកសារ PDF មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ប្រើ​ពណ៌​ផ្ទាល់​របស់​វា​ទេ៖ 'អនុញ្ញាត​​ឲ្យ​ទំព័រ​ជ្រើស​ពណ៌​ផ្ទាល់​ខ្លួន' ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម​ក្នុង​​កម្មវិធី​រុករក។
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/kn/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/kn/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f2ffcb3540b226883e14c2f4aba1077b053a0fe7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/kn/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ಈ PDF ದಸ್ತಾವೇಜು ಸರಿಯಾಗಿ ಕಾಣಿಸದೆ ಇರಬಹುದು.
+open_with_different_viewer=ಬೇರೊಂದು ವೀಕ್ಷಕದಲ್ಲಿ ತೆರೆ
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/kn/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/kn/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5aa417f4357f31b844e8756a90e775574bdc4c60
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/kn/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=ಹಿಂದಿನ ಪುಟ
+previous_label=ಹಿಂದಿನ
+next.title=ಮುಂದಿನ ಪುಟ
+next_label=ಮುಂದಿನ
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=ಪುಟ:
+page_of={{pageCount}} ರಲ್ಲಿ
+
+zoom_out.title=ಕಿರಿದಾಗಿಸು
+zoom_out_label=ಕಿರಿದಾಗಿಸಿ
+zoom_in.title=ಹಿರಿದಾಗಿಸು
+zoom_in_label=ಹಿರಿದಾಗಿಸಿ
+zoom.title=ಗಾತ್ರಬದಲಿಸು
+presentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು
+presentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ
+open_file.title=ಕಡತವನ್ನು ತೆರೆ
+open_file_label=ತೆರೆಯಿರಿ
+print.title=ಮುದ್ರಿಸು
+print_label=ಮುದ್ರಿಸಿ
+download.title=ಇಳಿಸು
+download_label=ಇಳಿಸಿಕೊಳ್ಳಿ
+bookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ)
+bookmark_label=ಪ್ರಸಕ್ತ ನೋಟ
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=ಶೀರ್ಷಿಕೆ:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು
+toggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು
+outline.title=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆಯನ್ನು ತೋರಿಸು
+outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ
+thumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು
+thumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು
+findbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು
+findbar_label=ಹುಡುಕು
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=ಪುಟ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}}
+
+# Find panel button title and messages
+find_label=ಹುಡುಕು:
+find_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು
+find_previous_label=ಹಿಂದಿನ
+find_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು
+find_next_label=ಮುಂದಿನ
+find_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು
+find_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು
+find_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು
+find_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು
+find_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ
+
+# Error panel labels
+error_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ
+error_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=ಸಂದೇಶ: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=ರಾಶಿ: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ಕಡತ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=ಸಾಲು: {{line}}
+rendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.
+
+# Predefined zoom values
+page_scale_width=ಪುಟದ ಅಗಲ
+page_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ
+page_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ
+page_scale_actual=ನಿಜವಾದ ಗಾತ್ರ
+
+# Loading indicator messages
+loading_error_indicator=ದೋಷ
+loading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ.
+invalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ.
+missing_file_error=PDF ಕಡತ ಇಲ್ಲ.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ]
+password_ok=ಸರಿ
+password_cancel=ರದ್ದು ಮಾಡು
+
+printing_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ.
+printing_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ.
+web_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.
+document_colors_disabled=PDF ದಸ್ತಾವೇಜುಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣಗಳನ್ನು ಬಳಸಲು ಅನುಮತಿ ಇರುವುದಿಲ್ಲ: 'ಪುಟಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸು' ಅನ್ನು ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ko/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ko/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e21f10646d6183c44801dff25a88f723352eafa6
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ko/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=이 PDF 문서는 다르게 보일 수 있습니다.
+unsupported_feature_forms=이 PDF 문서에는 폼 입력이 들어 있습니다. 폼 필드를 채우는 것은 지원되지 않습니다.
+open_with_different_viewer=다른 프로그램으로 보기
+open_with_different_viewer.accessKey=o
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ko/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ko/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f0bc908edd30506f45ade392fd6804679ae8d3b7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ko/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=이전 페이지
+previous_label=이전
+next.title=다음 페이지
+next_label=다음
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=페이지:
+page_of=/{{pageCount}}
+
+zoom_out.title=축소
+zoom_out_label=축소
+zoom_in.title=확대
+zoom_in_label=확대
+zoom.title=크기
+print.title=인쇄
+print_label=인쇄
+presentation_mode.title=발표 모드로 전환
+presentation_mode_label=발표 모드
+open_file.title=파일 열기
+open_file_label=열기
+download.title=다운로드
+download_label=다운로드
+bookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기)
+bookmark_label=지금 보이는 그대로
+
+# Secondary toolbar and context menu
+tools.title=도구
+tools_label=도구
+first_page.title=첫 페이지로 이동
+first_page.label=첫 페이지로 이동
+first_page_label=첫 페이지로 이동
+last_page.title=마지막 페이지로 이동
+last_page.label=마지막 페이지로 이동
+last_page_label=마지막 페이지로 이동
+page_rotate_cw.title=시계방향으로 회전
+page_rotate_cw.label=시계방향으로 회전
+page_rotate_cw_label=시계방향으로 회전
+page_rotate_ccw.title=시계 반대방향으로 회전
+page_rotate_ccw.label=시계 반대방향으로 회전
+page_rotate_ccw_label=시계 반대방향으로 회전
+
+hand_tool_enable.title=손 도구 켜기
+hand_tool_enable_label=손 도구 켜기
+hand_tool_disable.title=손 도구 끄기
+hand_tool_disable_label=손 도구 끄기
+
+# Document properties dialog box
+document_properties.title=문서 속성…
+document_properties_label=문서 속성…
+document_properties_file_name=파일 이름:
+document_properties_file_size=파일 사이즈:
+document_properties_kb={{size_kb}} KB ({{size_b}}바이트)
+document_properties_mb={{size_mb}} MB ({{size_b}}바이트)
+document_properties_title=제목:
+document_properties_author=저자:
+document_properties_subject=주제:
+document_properties_keywords=키워드:
+document_properties_creation_date=생성일:
+document_properties_modification_date=수정일:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=생성자:
+document_properties_producer=PDF 생성기:
+document_properties_version=PDF 버전:
+document_properties_page_count=총 페이지:
+document_properties_close=닫기
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=탐색창 열고 닫기
+toggle_sidebar_label=탐색창 열고 닫기
+outline.title=문서 개요 보기
+outline_label=문서 개요
+thumbs.title=미리보기
+thumbs_label=미리보기
+findbar.title=검색
+findbar_label=검색
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}쪽
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}쪽 미리보기
+
+# Find panel button title and messages
+find_label=검색:
+find_previous.title=지정 문자열에 일치하는 1개 부분을 검색
+find_previous_label=이전
+find_next.title=지정 문자열에 일치하는 다음 부분을 검색
+find_next_label=다음
+find_highlight=모두 강조 표시
+find_match_case_label=대문자/소문자 구별
+find_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다.
+find_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다.
+find_not_found=검색 결과 없음
+
+# Error panel labels
+error_more_info=정보 더 보기
+error_less_info=정보 간단히 보기
+error_close=닫기
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (빌드: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=메시지: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=스택: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=파일: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=줄 번호: {{line}}
+rendering_error=페이지를 렌더링하다 오류가 났습니다.
+
+# Predefined zoom values
+page_scale_width=페이지 너비에 맞춤
+page_scale_fit=페이지에 맞춤
+page_scale_auto=알아서 맞춤
+page_scale_actual=실제 크기에 맞춤
+
+# Loading indicator messages
+loading_error_indicator=오류
+loading_error=PDF를 읽는 중 오류가 생겼습니다.
+invalid_file_error=유효하지 않거나 파손된 PDF 파일
+missing_file_error=PDF 파일이 없습니다.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{[type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 주석]
+password_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오.
+password_invalid=잘못된 암호입니다. 다시 시도해 주십시오.
+password_ok=확인
+password_cancel=취소
+
+printing_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다.
+printing_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다.
+web_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다.
+document_colors_disabled=PDF 문서의 색상을 쓰지 못하게 되어 있음: \'웹 페이지 자체 색상 사용 허용\'이 브라우저에서 꺼져 있습니다.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ku/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ku/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..135305d0ec0e503aa9c3a0bf3ba3f55682708d22
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ku/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dibe ku ev belgeya PDFê rast neyê nîşandan.
+open_with_different_viewer=Bi nîşandereke din veke
+open_with_different_viewer.accessKey=B
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ku/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ku/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..00160d0ab9dbdbcc0547c64e931b3b111a4b4617
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ku/viewer.properties
@@ -0,0 +1,136 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Rûpela berê
+previous_label=PaÅŸve
+next.title=Rûpela pêş
+next_label=Pêş
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Rûpel:
+page_of=/ {{pageCount}}
+
+zoom_out.title=Dûr bike
+zoom_out_label=Dûr bike
+zoom_in.title=Nêzîk bike
+zoom_in_label=Nêzîk bike
+zoom.title=Nêzîk Bike
+presentation_mode.title=Derbasî mûda pêşkêşkariyê bibe
+presentation_mode_label=Moda Pêşkêşkariyê
+open_file.title=Pelî veke
+open_file_label=Veke
+print.title=Çap bike
+print_label=Çap bike
+download.title=Jêbar bike
+download_label=Jêbar bike
+bookmark.title=Xuyakirina niha (kopî yan jî di pencereyeke nû de veke)
+bookmark_label=Xuyakirina niha
+
+# Secondary toolbar and context menu
+tools.title=Amûr
+tools_label=Amûr
+first_page.title=Here rûpela yekemîn
+first_page.label=Here rûpela yekemîn
+first_page_label=Here rûpela yekemîn
+last_page.title=Here rûpela dawîn
+last_page.label=Here rûpela dawîn
+last_page_label=Here rûpela dawîn
+page_rotate_cw.title=Bi aliyê saetê ve bizivirîne
+page_rotate_cw.label=Bi aliyê saetê ve bizivirîne
+page_rotate_cw_label=Bi aliyê saetê ve bizivirîne
+page_rotate_ccw.title=Berevajî aliyê saetê ve bizivirîne
+page_rotate_ccw.label=Berevajî aliyê saetê ve bizivirîne
+page_rotate_ccw_label=Berevajî aliyê saetê ve bizivirîne
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Darikê kêlekê veke/bigire
+toggle_sidebar_label=Darikê kêlekê veke/bigire
+outline.title=Şemaya belgeyê nîşan bide
+outline_label=Şemaya belgeyê
+thumbs.title=Wênekokan nîşan bide
+thumbs_label=Wênekok
+findbar.title=Di belgeyê de bibîne
+findbar_label=Bibîne
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Rûpel {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Wênekoka rûpelê {{page}}
+
+# Find panel button title and messages
+find_label=Bibîne:
+find_previous.title=Peyva berê bibîne
+find_previous_label=PaÅŸve
+find_next.title=Peyya pêş bibîne
+find_next_label=Pêşve
+find_highlight=Tevî beloq bike
+find_match_case_label=Ji bo tîpên hûrdek-girdek bihîstyar
+find_reached_top=Gihîşt serê rûpelê, ji dawiya rûpelê bidomîne
+find_reached_bottom=Gihîşt dawiya rûpelê, ji serê rûpelê bidomîne
+find_not_found=Peyv nehat dîtin
+
+# Error panel labels
+error_more_info=Zêdetir agahî
+error_less_info=Zêdetir agahî
+error_close=Girtin
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js versiyon {{version}} (avanî: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Peyam: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Komik: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Pel: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rêzik: {{line}}
+rendering_error=Di vehûrandina rûpelê de çewtî çêbû.
+
+# Predefined zoom values
+page_scale_width=Firehiya rûpelê
+page_scale_fit=Di rûpelê de bicî bike
+page_scale_auto=Xweber nêzîk bike
+page_scale_actual=Mezinahiya rastîn
+
+# Loading indicator messages
+loading_error_indicator=Xeletî
+loading_error=Dema ku PDF dihat barkirin çewtiyek çêbû.
+invalid_file_error=Pelê PDFê nederbasdar yan jî xirabe ye.
+missing_file_error=Pelê PDFê kêm e.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Nîşaneya {{type}}ê]
+password_label=Ji bo PDFê vekî şîfreyê binivîse.
+password_invalid=Şîfre çewt e. Tika ye dîsa biceribîne.
+password_ok=Temam
+password_cancel=Betal
+
+printing_not_supported=Hişyarî: Çapkirin ji hêla vê gerokê ve bi temamî nayê destekirin.
+printing_not_ready=Hişyarî: PDF bi temamî nehat barkirin û ji bo çapê ne amade ye.
+web_fonts_disabled=Fontên Webê neçalak in: Fontên PDFê yên veşartî nayên bikaranîn.
+document_colors_disabled=Destûr tune ye ku belgeyên PDFê rengên xwe bi kar bînin: Di gerokê de 'destûrê bide rûpelan ku rengên xwe bi kar bînin' nehatiye çalakirin.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lg/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/lg/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..540b7729f5a2e82d12d11bfb5d0a02cd3a9f8f40
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lg/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ekiwandiko kino ekya PDF kiyinza obutalabika bulungi.
+open_with_different_viewer=Gulawo ne pulogulamu endala
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lg/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/lg/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ed8195cb7da575cdd977136fd7e53de6ed0cca64
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lg/viewer.properties
@@ -0,0 +1,100 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Omuko  Ogubadewo
+next.title=Omuko Oguddako
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Omuko:
+page_of=ku {{pageCount}}
+
+zoom_out.title=Zimbulukusa
+zoom_out_label=Zimbulukusa
+zoom_in.title=Funza Munda
+zoom_in_label=Funza Munda
+zoom.title=Gezzamu
+print.title=Fulumya
+print_label=Fulumya
+open_file.title=Bikula Fayiro
+open_file_label=Ggulawo
+download.title=Tikula
+download_label=Tikula
+bookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya)
+bookmark_label=Endabika Eriwo
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=Laga Ensalo ze Kiwandiko
+outline_label=Ensalo ze Ekiwandiko
+thumbs.title=Laga Ekifanyi Mubufunze
+thumbs_label=Ekifanyi Mubufunze
+findbar_label=Zuula
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Omuko {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}}
+
+# Context menu
+
+# Find panel button title and messages
+find_previous.title=Zuula awayise mukweddamu mumiteddera
+find_next.title=Zuula ekidako mukweddamu mumiteddera
+find_highlight=Londa byonna
+find_not_found=Emiteddera tezuuliddwa
+
+# Error panel labels
+error_more_info=Ebisingawo
+error_less_info=Mubumpimpi
+error_close=Galawo
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Obubaaka: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Ebipangiddwa: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fayiro {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Layini: {{line}}
+rendering_error=Wabadewo ensobi muku tekawo omuko.
+
+# Predefined zoom values
+page_scale_width=Obugazi bwo Omuko
+page_scale_fit=Okutuka kwo Omuko
+page_scale_auto=Okwefunza no Kwegeza
+page_scale_actual=Obunene Obutufu
+
+# Loading indicator messages
+loading_error_indicator=Ensobi
+loading_error=Wabadewo ensobi mukutika PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Enyonyola]
+request_password=PDF ekumibwa ekisumuluzo:
+
+printing_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lij/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/lij/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..cc633f23d7e2fd72f0e7177ed62b20352d495b08
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lij/chrome.properties
@@ -0,0 +1,7 @@
+# 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/.
+
+unsupported_feature = Sto documénto PDF o poriéiva no êse mostròu bén.
+open_with_different_viewer = Àrvi co-in âtro letô
+open_with_different_viewer.accessKey = o
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lij/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/lij/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..40c932f849752cdba2717d39026a1ab7f9335622
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lij/viewer.properties
@@ -0,0 +1,94 @@
+# 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/.
+
+previous.title = Pàgina precedénte
+previous_label = Precedénte
+next.title = Pàgina dòppo
+next_label = Pròscima
+page_label = Pàgina:
+page_of = de {{pageCount}}
+zoom_out.title = Diminoìsci zoom
+zoom_out_label = Diminoìsci zoom
+zoom_in.title = Aoménta zoom
+zoom_in_label = Aoménta zoom
+zoom.title = Zoom
+print.title = Stànpa
+print_label = Stànpa
+open_file.title = Àrvi file
+open_file_label = Àrvi
+download.title = Descaregaménto
+download_label = Descaregaménto
+bookmark.title = Vixón corénte (còpia ò àrvi inte 'n nêuvo barcón)
+bookmark_label = Vixón corénte
+outline.title = Véddi strutûa documénto
+outline_label = Strutûa documénto
+thumbs.title = Móstra miniatûe
+thumbs_label = Miniatûe
+thumb_page_title = Pàgina {{page}}
+thumb_page_canvas = Miniatûa da pàgina {{page}}
+error_more_info = Ciù informaçioìn
+error_less_info = Mêno informaçioìn
+error_version_info = PDF.js v{{version}} (build: {{build}})
+error_close = Særa
+missing_file_error = O file PDF o no gh'é.
+toggle_sidebar.title = Atîva/dizatîva bâra de sciànco
+toggle_sidebar_label = Atîva/dizatîva bâra de sciànco
+error_message = Mesàggio: {{message}}
+error_stack = Stack: {{stack}}
+error_file = File: {{file}}
+error_line = Lìnia: {{line}}
+rendering_error = Gh'é stæto 'n'erô itno rendering da pàgina.
+page_scale_width = Larghéssa pàgina
+page_scale_fit = Adàtta a una pàgina
+page_scale_auto = Zoom aotomàtico
+page_scale_actual = Dimenscioìn efetîve
+loading_error_indicator = Erô
+loading_error = S'é verificòu 'n'erô itno caregaménto do PDF.
+printing_not_supported = Atençión: a stànpa a no l'é conpletaménte soportâ da sto navegatô.
+
+# Context menu
+page_rotate_cw.label=Gîa in sénso do reléuio
+page_rotate_ccw.label=Gîa in sénso do reléuio a-a revèrsa
+
+presentation_mode.title=Vànni into mòddo de prezentaçión
+presentation_mode_label=Mòddo de prezentaçión
+
+find_label = Trêuva:
+find_previous.title = Trêuva a ripetiçión precedénte do tèsto da çercâ
+find_previous_label = Precedénte
+find_next.title = Trêuva a ripetiçión dòppo do tèsto da çercâ
+find_next_label = Segoénte
+find_highlight = Evidénçia
+find_match_case_label = Maióscole/minóscole
+find_reached_bottom = Razónto l'inìçio da pàgina, contìnoa da-a fìn
+find_reached_top = Razónto a fìn da pàgina, contìnoa da l'inìçio
+find_not_found = Tèsto no trovòu
+findbar.title = Trêuva into documénto
+findbar_label = Trêuva
+first_page.label = Vànni a-a prìmma pàgina
+last_page.label = Vànni a l'ùrtima pàgina
+invalid_file_error = O file PDF o l'é no vàlido ò aroinòu.
+
+web_fonts_disabled = I font do web én dizativæ: inposcìbile adêuviâ i caràteri do PDF.
+printing_not_ready = Atençión: o PDF o no l'é ancón caregòu conpletaménte pe-a stànpa.
+
+document_colors_disabled = No l'é poscìbile adêuviâ i pròpi coî pe-i documénti PDF: l'opçión do navegatô 'Permètti a-e pàgine de çèrne i pròpi coî in càngio de quélli inpostæ' a l'é dizativâ.
+text_annotation_type.alt = [Anotaçión: {{type}}]
+
+first_page.title = Vànni a-a prìmma pàgina
+first_page_label = Vànni a-a prìmma pàgina
+last_page.title = Vànni a l'ùrtima pàgina
+last_page_label = Vànni a l'ùrtima pàgina
+page_rotate_ccw.title = Gîa into vèrso antiorâio
+page_rotate_ccw_label = Gîa into vèrso antiorâio
+page_rotate_cw.title = Gîa into vèrso orâio
+page_rotate_cw_label = Gîa into vèrso orâio
+tools.title = Struménti
+tools_label = Struménti
+password_label = Dìmme a paròlla segrêta pe arvî sto file PDF.
+password_invalid = Paròlla segrêta sbaliâ. Prêuva tórna.
+password_ok = Va bén
+password_cancel = Anùlla
+
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/locale.properties b/public/opac/js/universalviewer-2.0.2/l10n/locale.properties
new file mode 100644
index 0000000000000000000000000000000000000000..9aded1b594ce13771a5d18707f97f91818d21a63
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/locale.properties
@@ -0,0 +1,312 @@
+[ach]
+@import url(ach/viewer.properties)
+
+[af]
+@import url(af/viewer.properties)
+
+[ak]
+@import url(ak/viewer.properties)
+
+[an]
+@import url(an/viewer.properties)
+
+[ar]
+@import url(ar/viewer.properties)
+
+[as]
+@import url(as/viewer.properties)
+
+[ast]
+@import url(ast/viewer.properties)
+
+[az]
+@import url(az/viewer.properties)
+
+[be]
+@import url(be/viewer.properties)
+
+[bg]
+@import url(bg/viewer.properties)
+
+[bn-BD]
+@import url(bn-BD/viewer.properties)
+
+[bn-IN]
+@import url(bn-IN/viewer.properties)
+
+[br]
+@import url(br/viewer.properties)
+
+[bs]
+@import url(bs/viewer.properties)
+
+[ca]
+@import url(ca/viewer.properties)
+
+[cs]
+@import url(cs/viewer.properties)
+
+[csb]
+@import url(csb/viewer.properties)
+
+[cy]
+@import url(cy/viewer.properties)
+
+[da]
+@import url(da/viewer.properties)
+
+[de]
+@import url(de/viewer.properties)
+
+[el]
+@import url(el/viewer.properties)
+
+[en-GB]
+@import url(en-GB/viewer.properties)
+
+[en-US]
+@import url(en-US/viewer.properties)
+
+[en-ZA]
+@import url(en-ZA/viewer.properties)
+
+[eo]
+@import url(eo/viewer.properties)
+
+[es-AR]
+@import url(es-AR/viewer.properties)
+
+[es-CL]
+@import url(es-CL/viewer.properties)
+
+[es-ES]
+@import url(es-ES/viewer.properties)
+
+[es-MX]
+@import url(es-MX/viewer.properties)
+
+[et]
+@import url(et/viewer.properties)
+
+[eu]
+@import url(eu/viewer.properties)
+
+[fa]
+@import url(fa/viewer.properties)
+
+[ff]
+@import url(ff/viewer.properties)
+
+[fi]
+@import url(fi/viewer.properties)
+
+[fr]
+@import url(fr/viewer.properties)
+
+[fy-NL]
+@import url(fy-NL/viewer.properties)
+
+[ga-IE]
+@import url(ga-IE/viewer.properties)
+
+[gd]
+@import url(gd/viewer.properties)
+
+[gl]
+@import url(gl/viewer.properties)
+
+[gu-IN]
+@import url(gu-IN/viewer.properties)
+
+[he]
+@import url(he/viewer.properties)
+
+[hi-IN]
+@import url(hi-IN/viewer.properties)
+
+[hr]
+@import url(hr/viewer.properties)
+
+[hu]
+@import url(hu/viewer.properties)
+
+[hy-AM]
+@import url(hy-AM/viewer.properties)
+
+[id]
+@import url(id/viewer.properties)
+
+[is]
+@import url(is/viewer.properties)
+
+[it]
+@import url(it/viewer.properties)
+
+[ja]
+@import url(ja/viewer.properties)
+
+[ka]
+@import url(ka/viewer.properties)
+
+[kk]
+@import url(kk/viewer.properties)
+
+[km]
+@import url(km/viewer.properties)
+
+[kn]
+@import url(kn/viewer.properties)
+
+[ko]
+@import url(ko/viewer.properties)
+
+[ku]
+@import url(ku/viewer.properties)
+
+[lg]
+@import url(lg/viewer.properties)
+
+[lij]
+@import url(lij/viewer.properties)
+
+[lt]
+@import url(lt/viewer.properties)
+
+[lv]
+@import url(lv/viewer.properties)
+
+[mai]
+@import url(mai/viewer.properties)
+
+[mk]
+@import url(mk/viewer.properties)
+
+[ml]
+@import url(ml/viewer.properties)
+
+[mn]
+@import url(mn/viewer.properties)
+
+[mr]
+@import url(mr/viewer.properties)
+
+[ms]
+@import url(ms/viewer.properties)
+
+[my]
+@import url(my/viewer.properties)
+
+[nb-NO]
+@import url(nb-NO/viewer.properties)
+
+[nl]
+@import url(nl/viewer.properties)
+
+[nn-NO]
+@import url(nn-NO/viewer.properties)
+
+[nso]
+@import url(nso/viewer.properties)
+
+[oc]
+@import url(oc/viewer.properties)
+
+[or]
+@import url(or/viewer.properties)
+
+[pa-IN]
+@import url(pa-IN/viewer.properties)
+
+[pl]
+@import url(pl/viewer.properties)
+
+[pt-BR]
+@import url(pt-BR/viewer.properties)
+
+[pt-PT]
+@import url(pt-PT/viewer.properties)
+
+[rm]
+@import url(rm/viewer.properties)
+
+[ro]
+@import url(ro/viewer.properties)
+
+[ru]
+@import url(ru/viewer.properties)
+
+[rw]
+@import url(rw/viewer.properties)
+
+[sah]
+@import url(sah/viewer.properties)
+
+[si]
+@import url(si/viewer.properties)
+
+[sk]
+@import url(sk/viewer.properties)
+
+[sl]
+@import url(sl/viewer.properties)
+
+[son]
+@import url(son/viewer.properties)
+
+[sq]
+@import url(sq/viewer.properties)
+
+[sr]
+@import url(sr/viewer.properties)
+
+[sv-SE]
+@import url(sv-SE/viewer.properties)
+
+[sw]
+@import url(sw/viewer.properties)
+
+[ta]
+@import url(ta/viewer.properties)
+
+[ta-LK]
+@import url(ta-LK/viewer.properties)
+
+[te]
+@import url(te/viewer.properties)
+
+[th]
+@import url(th/viewer.properties)
+
+[tl]
+@import url(tl/viewer.properties)
+
+[tn]
+@import url(tn/viewer.properties)
+
+[tr]
+@import url(tr/viewer.properties)
+
+[uk]
+@import url(uk/viewer.properties)
+
+[ur]
+@import url(ur/viewer.properties)
+
+[vi]
+@import url(vi/viewer.properties)
+
+[wo]
+@import url(wo/viewer.properties)
+
+[xh]
+@import url(xh/viewer.properties)
+
+[zh-CN]
+@import url(zh-CN/viewer.properties)
+
+[zh-TW]
+@import url(zh-TW/viewer.properties)
+
+[zu]
+@import url(zu/viewer.properties)
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lt/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/lt/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2a8a2336ac2bd74ec77c47db28d6a271959a1268
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lt/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Gali būti, jog šis PDF dokumentas rodomas neteisingai.
+unsupported_feature_forms=Šiame PDF dokumente yra formų. Formų laukų pildymas kol kas nepalaikomas.
+open_with_different_viewer=Atverti kita žiūrykle
+open_with_different_viewer.accessKey=k
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lt/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/lt/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..fefb1599dad314ca0ecf6160d29a1ed96a871ab4
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lt/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Ankstesnis puslapis
+previous_label=Ankstesnis
+next.title=Kitas puslapis
+next_label=Kitas
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Puslapis:
+page_of=iš {{pageCount}}
+
+zoom_out.title=Sumažinti
+zoom_out_label=Sumažinti
+zoom_in.title=Padidinti
+zoom_in_label=Padidinti
+zoom.title=Mastelis
+print.title=Spausdinti
+print_label=Spausdinti
+presentation_mode.title=Pereiti į pateikties veikseną
+presentation_mode_label=Pateikties veiksena
+open_file.title=Atverti failÄ…
+open_file_label=Atverti
+download.title=Parsiųsti
+download_label=Parsiųsti
+bookmark.title=Esamojo rodinio saitas (kopijavimui ar atvÄ—rimui kitame lange)
+bookmark_label=Esamasis rodinys
+
+# Secondary toolbar and context menu
+tools.title=PriemonÄ—s
+tools_label=PriemonÄ—s
+first_page.title=Eiti į pirmą puslapį
+first_page.label=Eiti į pirmą puslapį
+first_page_label=Eiti į pirmą puslapį
+last_page.title=Eiti į paskutinį puslapį
+last_page.label=Eiti į paskutinį puslapį
+last_page_label=Eiti į paskutinį puslapį
+page_rotate_cw.title=Pasukti pagal laikrodžio rodyklę
+page_rotate_cw.label=Pasukti pagal laikrodžio rodyklę
+page_rotate_cw_label=Pasukti pagal laikrodžio rodyklę
+page_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę
+page_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę
+page_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę
+
+hand_tool_enable.title=Įgalinti vilkimo veikseną
+hand_tool_enable_label=Įgalinti vilkimo veikseną
+hand_tool_disable.title=Išjungti vilkimo veikseną
+hand_tool_disable_label=Išjungti vilkimo veikseną
+
+# Document properties dialog box
+document_properties.title=Dokumento savybės…
+document_properties_label=Dokumento savybės…
+document_properties_file_name=Failo vardas:
+document_properties_file_size=Failo dydis:
+document_properties_kb={{size_kb}} KB ({{size_b}} B)
+document_properties_mb={{size_mb}} MB ({{size_b}} B)
+document_properties_title=Antraštė:
+document_properties_author=Autorius:
+document_properties_subject=Tema:
+document_properties_keywords=Reikšminiai žodžiai:
+document_properties_creation_date=Sukūrimo data:
+document_properties_modification_date=Modifikavimo data:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Kūrėjas:
+document_properties_producer=PDF generatorius:
+document_properties_version=PDF versija:
+document_properties_page_count=Puslapių skaičius:
+document_properties_close=Užverti
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Rodyti / slėpti šoninį polangį
+toggle_sidebar_label=Å oninis polangis
+outline.title=Rodyti dokumento metmenis
+outline_label=Dokumento metmenys
+thumbs.title=Rodyti puslapių miniatiūras
+thumbs_label=Miniatiūros
+findbar.title=Ieškoti dokumente
+findbar_label=Ieškoti
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} puslapis
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} puslapio miniatiūra
+
+# Find panel button title and messages
+find_label=Ieškoti:
+find_previous.title=Ieškoti ankstesnio frazės egzemplioriaus
+find_previous_label=Ankstesnis
+find_next.title=Ieškoti tolesnio frazės egzemplioriaus
+find_next_label=Tolesnis
+find_highlight=Viską paryškinti
+find_match_case_label=Skirti didžiąsias ir mažąsias raides
+find_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos
+find_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios
+find_not_found=Ieškoma frazė nerasta
+
+# Error panel labels
+error_more_info=Išsamiau
+error_less_info=Glausčiau
+error_close=Užverti
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v. {{version}} (darinys: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Pranešimas: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=DÄ—klas: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Failas: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=EilutÄ—: {{line}}
+rendering_error=Atvaizduojant puslapį, įvyko klaida.
+
+# Predefined zoom values
+page_scale_width=Priderinti prie lapo pločio
+page_scale_fit=Pritaikyti prie lapo dydžio
+page_scale_auto=Automatinis mastelis
+page_scale_actual=Tikras dydis
+
+# Loading indicator messages
+loading_error_indicator=Klaida
+loading_error=Įkeliant PDF failą, įvyko klaida.
+invalid_file_error=Tai nÄ—ra PDF failas arba jis yra sugadintas.
+missing_file_error=PDF failas nerastas.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[„{{type}}“ tipo anotacija]
+password_label=Įveskite slaptažodį šiam PDF failui atverti.
+password_invalid=Slaptažodis neteisingas. Bandykite dar kartą.
+password_ok=Gerai
+password_cancel=Atsisakyti
+
+printing_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas.
+printing_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui.
+web_fonts_disabled=Neįgalinti saityno šriftai – šiame PDF faile esančių šriftų naudoti negalima.
+document_colors_disabled=PDF dokumentams neleidžiama nurodyti savo spalvų, nes išjungta naršyklės nuostata „Leisti tinklalapiams nurodyti spalvas“.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lv/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/lv/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..11adf31f28f113d8a70d51c31f92cf644f32bd85
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lv/chrome.properties
@@ -0,0 +1,9 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Iespējams, ka šis PDF dokuments netiek attēlots korekti.
+open_with_different_viewer=Atvērt ar citu programmu
+open_with_different_viewer.accessKey=o
+unsupported_feature_forms=Šis PDF dokuments satur formas. Formu lauku aizpilde netiek nodrošināta.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/lv/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/lv/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1638a2a43b74317398b612f3c874360063ae0c8c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/lv/viewer.properties
@@ -0,0 +1,157 @@
+# 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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Iepriekšējā lapa
+previous_label=Iepriekšējā
+next.title=Nākamā lapa
+next_label=Nākamā
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Lapa:
+page_of=no {{pageCount}}
+
+zoom_out.title=Attālināt 
+zoom_out_label=Attālināt
+zoom_in.title=Pietuvināt
+zoom_in_label=Pietuvināt
+zoom.title=Palielinājums
+print.title=Drukāšana
+print_label=Drukāt
+presentation_mode.title=Pārslēgties uz Prezentācijas režīmu
+presentation_mode_label=Prezentācijas režīms
+open_file.title=Atvērt failu
+open_file_label=Atvērt
+download.title=Lejupielāde
+download_label=Lejupielādēt
+bookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā)
+bookmark_label=Pašreizējais skats
+findbar.title=Meklēt dokumentā
+findbar_label=Meklēt
+
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Pārslēgt sānu joslu
+toggle_sidebar_label=Pārslēgt sānu joslu
+outline.title=Parādīt dokumenta saturu
+outline_label=Dokumenta saturs
+thumbs.title=Parādīt sīktēlus
+thumbs_label=Sīktēli
+
+# Find panel button title and messages
+find_label=Meklēt:
+find_previous.title=Atrast iepriekšējo
+find_previous_label=Iepriekšējā
+find_next.title=Atrast nākamo
+find_next_label=Nākamā
+find_highlight=Iekrāsot visas
+find_match_case_label=Lielo, mazo burtu jutīgs
+find_reached_top=Sasniegts dokumenta sākums, turpinām no beigām
+find_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma
+find_not_found=Frāze nav atrasta
+first_page.title=Iet uz pirmo lapu
+first_page.label=Iet uz pirmo lapu
+first_page_label=Iet uz pirmo lapu
+last_page.title=Iet uz pēdējo lapu
+last_page.label=Iet uz pēdējo lapu
+last_page_label=Iet uz pēdējo lapu
+tools.title=Rīki
+tools_label=Rīki
+page_rotate_cw.title=Pagriezt pa pulksteni
+page_rotate_cw.label=Pagriezt pa pulksteni
+page_rotate_cw_label=Pagriezt pa pulksteni
+page_rotate_ccw.title=Pagriezt pret pulksteni
+page_rotate_ccw.label=Pagriezt pret pulksteni
+page_rotate_ccw_label=Pagriezt pret pulksteni
+
+# Document properties dialog box
+document_properties.title=Dokumenta iestatījumi…
+document_properties_label=Dokumenta iestatījumi…
+document_properties_file_name=Faila nosaukums:
+document_properties_file_size=Faila izmērs:
+document_properties_kb={{size_kb}} KB ({{size_b}} biti)
+document_properties_mb={{size_mb}} MB ({{size_b}} biti)
+document_properties_title=Nosaukums:
+document_properties_author=Autors:
+document_properties_subject=Tēma:
+document_properties_keywords=Atslēgas vārdi:
+document_properties_creation_date=Izveides datums:
+document_properties_modification_date=LAbošanas datums:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Radītājs:
+document_properties_producer=PDF producents:
+document_properties_version=PDF versija:
+document_properties_page_count=Lapu skaits:
+document_properties_close=Aizvērt
+
+hand_tool_enable.title=Aktivēt rokas rīku
+hand_tool_enable_label=Aktivēt rokas rīku
+hand_tool_disable.title=Deaktivēt rokas rīku
+hand_tool_disable_label=Deaktivēt rokas rīku
+
+invalid_file_error=Nederīgs vai bojāts PDF fails.
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Lapa {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Lapas {{page}} sīktēls
+
+# Error panel labels
+error_more_info=Vairāk informācijas
+error_less_info=MAzāk informācijas
+error_close=Close
+
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Ziņojums: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Steks: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rindiņa: {{line}}
+rendering_error=Attēlojot lapu radās kļūda
+missing_file_error=PDF fails nav atrasts.
+
+# Predefined zoom values
+page_scale_width=Lapas platumā
+page_scale_fit=Ietilpinot lapu
+page_scale_auto=Automātiskais izmērs
+page_scale_actual=Patiesais izmērs
+
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+loading_error_indicator=Kļūda
+loading_error=Ielādējot PDF notika kļūda.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{[type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} anotācija]
+
+text_annotation_type.alt=[{{type}} Anotācija]
+password_label=Ievadiet paroli, lai atvērtu PDF failu.
+password_invalid=Nepareiza parole, mēģiniet vēlreiz.
+password_ok=Labi
+password_cancel=Atcelt
+
+
+printing_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji.
+web_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus.
+printing_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai.
+document_colors_disabled=PDF dokumentiem nav atļauts izmantot pašiem savas krāsas: \'Atļaut lapām izvēlēties pašām savas krāsas\' ir deaktivēts pārlūkā.
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mai/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/mai/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b23c0d52c8b1ac2516a212951d39d6a0b3e2e06d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mai/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=पीडीएफ दस्तावेज सही देख नहि सकैत अछि.
+open_with_different_viewer=अलग प्रदर्शकक संग खोलू
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mai/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/mai/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f8aad88d387b572b4826489eb3e0f41145117fc2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mai/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=पछिला पृष्ठ
+previous_label=पछिला
+next.title=अगिला पृष्ठ
+next_label=आगाँ
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=पृष्ठ:
+page_of={{pageCount}} क
+
+zoom_out.title=छोट करू
+zoom_out_label=छोट करू
+zoom_in.title=पैघ करू
+zoom_in_label=जूम इन
+zoom.title=छोट-पैघ करू 
+print.title=छापू
+print_label=छापू
+presentation_mode.title=प्रस्तुति अवस्थामे जाउ
+presentation_mode_label=प्रस्तुति अवस्था
+open_file.title=फाइल खोलू
+open_file_label=खोलू
+download.title=डाउनलोड
+download_label=डाउनलोड
+bookmark.title=मोजुदा दृश्य (नव विंडोमे नकल लिअ अथवा खोलू)
+bookmark_label=वर्तमान दृश्य
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=स्लाइडर टागल
+toggle_sidebar_label=स्लाइडर टागल
+outline.title=दस्तावेज आउटलाइन देखाउ
+outline_label=दस्तावेज खाका
+thumbs.title=लघु-छवि देखाउ
+thumbs_label=लघु छवि
+findbar.title=दस्तावेजमे ढूँढू
+findbar_label=ताकू
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=पृष्ठ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=पृष्ठ {{page}} का लघु-चित्र
+
+# Context menu
+first_page.label=प्रथम पृष्ठ पर जाउ
+last_page.label=अंतिम पृष्ठ पर जाउ
+page_rotate_cw.label=घड़ीक दिशा मे घुमाउ
+page_rotate_ccw.label=घड़ीक दिशा सँ उनटा घुमाउ
+
+# Find panel button title and messages
+find_label=ताकू:
+find_previous.title=खोजक पछिला उपस्थिति ताकू
+find_previous_label=पछिला
+find_next.title=खोजक अगिला उपस्थिति ताकू
+find_next_label=आगाँ
+find_highlight=सभटा आलोकित करू
+find_match_case_label=मिलान स्थिति
+find_reached_top=पृष्ठक शीर्ष जाए पहुँचल, तल सँ जारी
+find_reached_bottom=पृष्ठक तल मे जाए पहुँचल, शीर्ष सँ जारी
+find_not_found=वाकींश नहि भेटल
+
+# Error panel labels
+error_more_info=बेसी  सूचना
+error_less_info=कम सूचना
+error_close=बन्न करू
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=संदेश: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=स्टैक: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=फ़ाइल: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=पंक्ति: {{line}}
+rendering_error=पृष्ठ रेंडरिंगक समय त्रुटि आएल.
+
+# Predefined zoom values
+page_scale_width=पृष्ठ चओड़ाइ
+page_scale_fit=पृष्ठ फिट
+page_scale_auto=स्वचालित जूम
+page_scale_actual=सही आकार
+
+# Loading indicator messages
+loading_error_indicator=त्रुटि
+loading_error=पीडीएफ लोड करैत समय एकटा त्रुटि भेल.
+invalid_file_error=अमान्य अथवा भ्रष्ट PDF फाइल.
+missing_file_error=अनुपस्थित PDF फाइल.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type=[{{type}} Annotation]
+request_password=पीडीएफ गुड़किल्लीसँ संरक्षित अछि:
+
+printing_not_supported=चेतावनी: ई ब्राउजर पर छपाइ पूर्ण तरह सँ समर्थित नहि अछि.
+printing_not_ready=चेतावनी: पीडीएफ छपाइक लेल पूर्ण तरह सँ लोड नहि अछि.
+web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय अछि: अंतःस्थापित PDF फान्टसक उपयोगमे असमर्थ.
+web_colors_disabled=वेब रंग निष्क्रिय अछि.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mk/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/mk/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6c882ffe571a2fd38573a96a125a807588d2d498
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mk/chrome.properties
@@ -0,0 +1,9 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Овој PDF документ може да се прикаже неисправно.
+open_with_different_viewer=Отвори со друг прегледувач
+
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mk/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/mk/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..18ded891459dfd53a12d5c412102933fce4a1800
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mk/viewer.properties
@@ -0,0 +1,126 @@
+# 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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Претходна страница
+previous_label=Претходна
+next.title=Следна страница
+next_label=Следна
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Страница:
+page_of=од {{pageCount}}
+
+zoom_out.title=Намалување
+zoom_out_label=Намали
+zoom_in.title=Зголемување
+zoom_in_label=Зголеми
+zoom.title=Променување на големина
+print.title=Печатење
+print_label=Печати
+open_file.title=Отварање  датотека
+open_file_label=Отвори
+download.title=Преземање
+download_label=Преземи
+bookmark.title=Овој преглед (копирај или отвори во нов прозорец)
+bookmark_label=Овој преглед
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_slider.title=Вклучување на лизгач
+toggle_slider_label=Вклучи лизгач
+outline.title=Прикажување на содржина на документот
+outline_label=Содржина на документот
+thumbs.title=Прикажување на икони
+thumbs_label=Икони
+
+# Document outline messages
+no_outline=Нема содржина
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Страница {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Икона од страница {{page}}
+
+# Error panel labels
+error_more_info=Повеќе информации
+error_less_info=Помалку информации
+error_close=Затвори
+# LOCALIZATION NOTE (error_build): "{{build}}" will be replaced by the PDF.JS
+# build ID.
+error_build=PDF.JS Build: {{build}}
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Порака: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Датотека: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Линија: {{line}}
+rendering_error=Настана грешка при прикажувањето на страницата.
+
+# Predefined zoom values
+page_scale_width=Ширина на страница
+page_scale_fit=Цела страница
+page_scale_auto=Автоматска големина
+page_scale_actual=Вистинска големина
+
+loading_error_indicator=Грешка
+loading_error=Настана грешка при вчитувањето на PDF-от.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{[type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type=[{{type}} Забелешка]
+request_password=PDF-от е заштитен со лозинка:
+
+
+printing_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач.
+
+find_highlight=Означи сѐ
+
+# Find panel button title and messages
+find_label=Најди:
+find_match_case_label=Токму така
+find_next.title=Најди ја следната појава на фразата
+find_next_label=Следно
+find_not_found=Фразата не е пронајдена
+find_previous.title=Најди ја предходната појава на фразата
+find_previous_label=Претходно
+find_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток
+find_reached_top=Барањето стигна до почетокот на документот и почнува од крајот
+findbar.title=Најди во документот
+findbar_label=Најди
+
+# Context menu
+first_page.label=Оди до првата страница
+invalid_file_error=Невалидна или корумпирана PDF датотека.
+last_page.label=Оди до последната страница
+page_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот
+page_rotate_cw.label=Ротирај по стрелките на часовникот
+presentation_mode.title=Премини во презентациски режим
+presentation_mode_label=Презентациски режим
+
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+missing_file_error=Недостасува PDF документ.
+printing_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Вклучи странична лента
+toggle_sidebar_label=Вклучи странична лента
+web_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ml/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ml/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3821f51167c780cfff8112e75413cdc3ecea2035
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ml/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ഈ പിഡിഎഫ് രേഖ നിങ്ങള്‍ക്കു് ശരിയായി കാണുവാന്‍ സാധ്യമല്ല.
+open_with_different_viewer=മറ്റൊരു പ്രയോഗം ഉപയോഗിച്ചു് തുറക്കുക
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ml/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ml/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..888b241e6d1e8814b8339904fe0f309e1a39d459
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ml/viewer.properties
@@ -0,0 +1,136 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=മുമ്പുള്ള താള്‍
+previous_label=മുമ്പു്
+next.title=അടുത്ത താള്‍
+next_label=അടുത്തതു്
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=താള്‍:
+page_of={{pageCount}}
+
+zoom_out.title=ചെറുതാക്കുക
+zoom_out_label=ചെറുതാക്കുക
+zoom_in.title=വലുതാക്കുക
+zoom_in_label=വലുതാക്കുക
+zoom.title=വ്യാപ്തി മാറ്റുക
+presentation_mode.title=പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക
+presentation_mode_label=പ്രസന്റേഷന്‍ രീതി
+open_file.title=ഫയല്‍ തുറക്കുക
+open_file_label=തുറക്കുക
+print.title=പ്രിന്റ് ചെയ്യുക
+print_label=പ്രിന്റ് ചെയ്യുക
+download.title=ഡൌണ്‍ലോഡ് ചെയ്യുക
+download_label=ഡൌണ്‍ലോഡ് ചെയ്യുക
+bookmark.title=നിലവിലുള്ള കാഴ്ച (പുതിയ ജാലകത്തില്‍ പകര്‍ത്തുക അല്ലെങ്കില്‍ തുറക്കുക)
+bookmark_label=നിലവിലുള്ള കാഴ്ച
+
+# Secondary toolbar and context menu
+tools.title=ഉപകരണങ്ങള്‍
+tools_label=ഉപകരണങ്ങള്‍
+first_page.title=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക
+first_page.label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക
+first_page_label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക
+last_page.title=അവസാന താളിലേയ്ക്കു് പോകുക
+last_page.label=അവസാന താളിലേയ്ക്കു് പോകുക
+last_page_label=അവസാന താളിലേയ്ക്കു് പോകുക
+page_rotate_cw.title=ഘടികാരദിശയില്‍ കറക്കുക
+page_rotate_cw.label=ഘടികാരദിശയില്‍ കറക്കുക
+page_rotate_cw_label=ഘടികാരദിശയില്‍ കറക്കുക
+page_rotate_ccw.title=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക
+page_rotate_ccw.label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക
+page_rotate_ccw_label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=സൈഡ് ബാറിലേക്കു് മാറ്റുക
+toggle_sidebar_label=സൈഡ് ബാറിലേക്കു് മാറ്റുക
+outline.title=രേഖയുടെ ഔട്ട്ലൈന്‍ കാണിയ്ക്കുക
+outline_label=രേഖയുടെ ഔട്ട്ലൈന്‍
+thumbs.title=തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക
+thumbs_label=തംബ്നെയിലുകള്‍
+findbar.title=രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക
+findbar_label=കണ്ടെത്തുക 
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=താള്‍ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} താളിനുള്ള തംബ്നെയില്‍
+
+# Find panel button title and messages
+find_label=കണ്ടെത്തുക
+find_previous.title=വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക 
+find_previous_label=മുമ്പു്
+find_next.title=വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക 
+find_next_label=അടുത്തതു്
+find_highlight=എല്ലാം എടുത്തുകാണിയ്ക്കുക
+find_match_case_label=അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക
+find_reached_top=രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു
+find_reached_bottom=രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു 
+find_not_found=വാചകം കണ്ടെത്താനായില്ല 
+
+# Error panel labels
+error_more_info=കൂടുതല്‍ വിവരം
+error_less_info=കുറച്ച് വിവരം
+error_close=അടയ്ക്കുക
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=സന്ദേശം: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=സ്റ്റാക്ക്: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ഫയല്‍: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=വരി: {{line}}
+rendering_error=താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു.
+
+# Predefined zoom values
+page_scale_width=താളിന്റെ വീതി
+page_scale_fit=താള്‍ പാകത്തിനാക്കുക
+page_scale_auto=സ്വയമായി വലുതാക്കുക
+page_scale_actual=യഥാര്‍ത്ഥ വ്യാപ്തി
+
+# Loading indicator messages
+loading_error_indicator=പിശക്
+loading_error=പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു.
+invalid_file_error=തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍.
+missing_file_error=പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് രഹസ്യവാക്ക് നല്‍കുക.
+password_invalid=തെറ്റായ രഹസ്യവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക.
+password_ok=à´¶à´°à´¿
+password_cancel=റദ്ദാക്കുക
+
+printing_not_supported=മുന്നറിയിപ്പു്: ഈ ബ്രൌസര്‍ പൂര്‍ണ്ണമായി പ്രിന്റിങ് പിന്തുണയ്ക്കുന്നില്ല.
+printing_not_ready=മുന്നറിയിപ്പു്: പ്രിന്റ് ചെയ്യുന്നതിനു് പിഡിഎഫ് പൂര്‍ണ്ണമായി ലഭ്യമല്ല.
+web_fonts_disabled=വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല.
+document_colors_disabled=സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ പിഡിഎഫ് രേഖകള്‍ക്കു് അനുവാദമില്ല:  'സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ താളുകളെ അനുവദിയ്ക്കുക' എന്നതു് ബ്രൌസറില്‍ നിര്‍ജീവമാണു്.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mn/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/mn/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..73ebae02e9be52a98982031a3d31a1dc0e544c5b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mn/chrome.properties
@@ -0,0 +1,15 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mn/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/mn/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f0366444a52b9999cf9fa92dba6c3a095907c6fa
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mn/viewer.properties
@@ -0,0 +1,65 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+
+zoom.title=Тэлэлт
+open_file.title=Файл нээ
+open_file_label=Нээ
+
+# Secondary toolbar and context menu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+findbar_label=Ол
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+find_previous.title=Хайлтын өмнөх олдцыг харуулна
+find_next.title=Хайлтын дараагийн олдцыг харуулна
+find_not_found=Олдсонгүй
+
+# Error panel labels
+error_more_info=Нэмэлт мэдээлэл
+error_close=Хаа
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+
+# Loading indicator messages
+loading_error_indicator=Алдаа
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mr/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/mr/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..666b4561b3b83dff922a5786a787045e32414079
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mr/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=हे PDF दस्तऐवज कदाचित योग्यरित्या दाखवणे शक्य नाही.
+open_with_different_viewer=वेगळ्या प्रदर्शकासह उघडा
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/mr/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/mr/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b2593814bf2bbced2a4d2d54aa8a040ee7655a9d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/mr/viewer.properties
@@ -0,0 +1,119 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=मागील पृष्ठ
+previous_label=मागील
+next.title=पुढील पृष्ठ
+next_label=पुढील
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=पृष्ठ:
+page_of=पैकी {{pageCount}}
+
+zoom_out.title=छोटे करा
+zoom_out_label=छोटे करा
+zoom_in.title=मोठे करा
+zoom_in_label=मोठे करा
+zoom.title=लहान किंवा मोठे करा
+presentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा
+presentation_mode_label=प्रस्तुतिकरण मोड
+open_file.title=फाइल उघडा
+open_file_label=उघडा
+print.title=छपाई करा
+print_label=छपाई करा
+download.title=डाउनलोड करा
+download_label=डाउनलोड करा
+bookmark.title=सध्याचे अवलोकन (नविन पटलात प्रत बनवा किंवा उघडा)
+bookmark_label=सध्याचे अवलोकन
+
+# Secondary toolbar and context menu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=बाजूचीपट्टी टॉगल करा
+toggle_sidebar_label=बाजूचीपट्टी टॉगल करा
+outline.title=दस्तऐवज रूपरेषा दाखवा
+outline_label=दस्तऐवज रूपरेषा
+thumbs.title=थंबनेल्स् दाखवा
+thumbs_label=थंबनेल्स्
+findbar.title=दस्तऐवजात शोधा
+findbar_label=शोधा
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=पृष्ठ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=पृष्ठाचे थंबनेल {{page}}
+
+# Find panel button title and messages
+find_label=शोधा:
+find_previous.title=वाकप्रयोगची मागील घटना शोधा
+find_previous_label=मागील
+find_next.title=वाकप्रयोगची पुढील घटना शोधा
+find_next_label=पुढील
+find_highlight=सर्व ठळक करा
+find_match_case_label=आकार जुळवा
+find_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे
+find_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे
+find_not_found=वाकप्रयोग आढळले नाही
+
+# Error panel labels
+error_more_info=आणखी माहिती
+error_less_info=कमी माहिती
+error_close=बंद करा
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=संदेश: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=स्टॅक: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=फाइल: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=रेष: {{line}}
+rendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली.
+
+# Predefined zoom values
+page_scale_width=पृष्ठाची रूंदी
+page_scale_fit=पृष्ठ बसवा
+page_scale_auto=स्वयं लाहन किंवा मोठे करणे
+page_scale_actual=प्रत्यक्ष आकार
+
+# Loading indicator messages
+loading_error_indicator=त्रुटी
+loading_error=PDF लोड करतेवेळी त्रुटी आढळली.
+invalid_file_error=अवैध किंवा दोषीत PDF फाइल.
+missing_file_error=न आढळणारी PDF फाइल.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} टिपण्णी]
+password_cancel=रद्द करा
+
+printing_not_supported=सावधानता: या ब्राउजरतर्फे छपाइ पूर्णपणे समर्थीत नाही.
+printing_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही.
+web_fonts_disabled=वेब फाँट्स असमर्थीत आहेत: एम्बेडेड PDF फाँट्स्चा वापर अशक्य.
+document_colors_disabled=PDF दस्ताएवजांना त्यांचे रंग वापरण्यास अनुमती नाही: ब्राउजरमध्ये ' पानांना त्यांचे रंग निवडण्यास अनुमती द्या' बंद केले आहे.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ms/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ms/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b814a14d378c737d90e571e5fd01e92067d75be3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ms/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dokument PDF ini munkin tidak dipaparkan dengan baik.
+unsupported_feature_forms=Dokumen PDF ini mengandungi borang. Pengisian medan borang tidak disokong.
+open_with_different_viewer=Buka Dengan Pelihat Berbeza
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ms/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ms/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e110e00289a67899a6a95b9fffd9a6337ce9bec0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ms/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Laman Sebelumnya
+previous_label=Terdahulu
+next.title=Laman seterusnya
+next_label=Berikut
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Laman:
+page_of=daripada {{pageCount}}
+
+zoom_out.title=Zum Keluar
+zoom_out_label=Zum Keluar
+zoom_in.title=Zum Masuk
+zoom_in_label=Zum Masuk
+zoom.title=Zum
+presentation_mode.title=Bertukar ke Mod Persembahan
+presentation_mode_label=Mod Persembahan
+open_file.title=Buka Fail
+open_file_label=Buka
+print.title=Cetak
+print_label=Cetak
+download.title=Muat turun
+download_label=Muat turun
+bookmark.title=Pandangan semasa (salinan atau dibuka dalam tetingkap baru)
+bookmark_label=Lihat semasa
+
+# Secondary toolbar and context menu
+tools.title=Alatan
+tools_label=Alatan
+first_page.title=Pergi ke Halaman Pertama
+first_page.label=Pergi ke Halaman Pertama
+first_page_label=Pergi ke Halaman Pertama
+last_page.title=Pergi ke Halaman Terakhir
+last_page.label=Pergi ke Halaman Terakhir
+last_page_label=Pergi ke Halaman Terakhir
+page_rotate_cw.title=Berputar ikut arah Jam
+page_rotate_cw.label=Berputar ikut arah Jam
+page_rotate_cw_label=Berputar ikut arah Jam
+page_rotate_ccw.title=Pusing berlawan arah jam
+page_rotate_ccw.label=Pusing berlawan arah jam
+page_rotate_ccw_label=Pusing berlawan arah jam
+
+hand_tool_enable.title=Bolehkan alatan tangan
+hand_tool_enable_label=Bolehkan alatan tangan
+hand_tool_disable.title=Lumpuhkan alatan tangan
+hand_tool_disable_label=Lumpuhkan alatan tangan
+
+# Document properties dialog box
+document_properties.title=Ciri Dokumen…
+document_properties_label=Ciri Dokumen…
+document_properties_file_name=Nama fail:
+document_properties_file_size=Saiz fail:
+document_properties_kb={{size_kb}} KB ({{size_b}} bait)
+document_properties_mb={{size_mb}} MB ({{size_b}} bait)
+document_properties_title=Tajuk:
+document_properties_author=Pengarang:
+document_properties_subject=Subjek:
+document_properties_keywords=Kata kunci:
+document_properties_creation_date=Masa Dicipta:
+document_properties_modification_date=Tarikh Ubahsuai:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Pencipta:
+document_properties_producer=Pengeluar PDF:
+document_properties_version=Versi PDF:
+document_properties_page_count=Kiraan Laman:
+document_properties_close=Tutup
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Togol Bar Sisi
+toggle_sidebar_label=Togol Bar Sisi
+outline.title=Tunjuk Rangka Dokumen
+outline_label=Rangka Dokument
+thumbs.title=Tunjuk Imej kecil
+thumbs_label=Imej kecil
+findbar.title=Cari didalam Dokumen
+findbar_label=Cari
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Halaman {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Halaman Imej kecil {{page}}
+
+# Find panel button title and messages
+find_label=Cari:
+find_previous.title=Cari teks frasa berkenaan yang terdahulu
+find_previous_label=Sebelumnya
+find_next.title=Cari teks frasa berkenaan yang berikut
+find_next_label=Berikut
+find_highlight=Serlahkan semua
+find_match_case_label=Kes Sepadan
+find_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah
+find_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas
+find_not_found=Frasa tidak ditemui
+
+# Error panel labels
+error_more_info=Maklumat lanjut
+error_less_info=Kurang Informasi
+error_close=Tutup
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesej: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Timbun: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fail: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Garis: {{line}}
+rendering_error=Ralat berlaku ketika memberikan halaman.
+
+# Predefined zoom values
+page_scale_width=Lebar Halaman
+page_scale_fit=Muat Halaman
+page_scale_auto=Zoom Automatik
+page_scale_actual=Saiz Sebenar
+
+# Loading indicator messages
+loading_error_indicator=Ralat
+loading_error=Masalah berlaku semasa menuatkan sebuah PDF.
+invalid_file_error=Tidak sah atau fail PDF rosak.
+missing_file_error=Fail PDF Hilang.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Anotasi]
+password_label=Masukan kata kunci untuk membuka fail PDF ini.
+password_invalid=Kata laluan salah. Cuba lagi.
+password_ok=OK
+password_cancel=Batal
+
+printing_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.
+printing_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.
+web_fonts_disabled=Fon web dilumpuhkan: tidak dapat fon PDF terbenam.
+document_colors_disabled=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: 'Benarkan muka surat untuk memilih warna sendiri' telah dinyahaktif dalam pelayar.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/my/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/my/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4f3115ee1627f32c52889526318b0a8d9b9e2b7e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/my/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ယခု PDF ဖိုင်အား ကောင်းစွာ ပြသနိုင်မည်မဟုတ် ။
+open_with_different_viewer=တခြားမြင်ကွင်း နဲ့ဖွင့်ပါ
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/my/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/my/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b50b899f8d3b369bacf5508844dcf57170a7b18b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/my/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=အရင် စာမျက်နှာ
+previous_label=အရင်နေရာ
+next.title=ရှေ့ စာမျက်နှာ
+next_label=နောက်တခု
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=စာမျက်နှာ -
+page_of=၏ {{pageCount}}
+
+zoom_out.title=ချုံ့ပါ
+zoom_out_label=ချုံ့ပါ
+zoom_in.title=ချဲ့ပါ
+zoom_in_label=ချဲ့ပါ
+zoom.title=ချုံ့/ချဲ့ပါ
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=ဖိုင်အားဖွင့်ပါ။
+open_file_label=ဖွင့်ပါ
+print.title=ပုံနှိုပ်ပါ
+print_label=ပုံနှိုပ်ပါ
+download.title=ကူးဆွဲ
+download_label=ကူးဆွဲ
+bookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ)
+bookmark_label=လက်ရှိ မြင်ကွင်း
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=ခေါင်းစဉ်‌ -
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ်
+toggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ
+outline.title=စာတမ်း မူကြမ်း ကိုပြပါ
+outline_label=စာတမ်း မူကြမ်း
+thumbs.title=ပုံရိပ်ငယ်များကို ပြပါ
+thumbs_label=ပုံရိပ်ငယ်များ
+findbar.title=Find in Document
+findbar_label=ရှာဖွေပါ
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=စာမျက်နှာ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}}
+
+# Find panel button title and messages
+find_label=ရှာဖွေပါ -
+find_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ
+find_previous_label=နောက်သို့
+find_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ
+find_next_label=ရှေ့သို့
+find_highlight=အားလုံးကို မျဉ်းသားပါ
+find_match_case_label=စာလုံး တိုက်ဆိုင်ပါ
+find_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ
+find_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ
+find_not_found=စကားစု မတွေ့ရဘူး
+
+# Error panel labels
+error_more_info=နောက်ထပ်အချက်အလက်များ
+error_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက်
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=မက်ဆေ့ - {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=အထပ် - {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ဖိုင် {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=လိုင်း - {{line}}
+rendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။
+
+# Predefined zoom values
+page_scale_width=စာမျက်နှာ အကျယ်
+page_scale_fit=စာမျက်နှာ ကွက်တိ
+page_scale_auto=အလိုအလျောက် ချုံ့ချဲ့
+page_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ်
+
+# Loading indicator messages
+loading_error_indicator=အမှား
+loading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။
+invalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင်
+missing_file_error=PDF ပျောက်ဆုံး
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်]
+password_ok=OK
+password_cancel=ပယ်​ဖျက်ပါ
+
+printing_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။
+printing_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_disabled=PDF ဖိုင်အား ၎င်းဤ ကိုယ်ပိုင်အရောင်များကို အသုံးပြုခွင့်မပေးထားပါ ။ 'စာမျက်နှာအားလုံးအားအရောင်ရွေးချယ်ခွင့်' အား ယခု ဘယောက်ဆာတွင် ပိတ်ထားခြင်းကြောင့်ဖြစ် သှ်
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nb-NO/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/nb-NO/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..37f9dc34c1137a7f8332ffa56c456f88a7a0c409
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nb-NO/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dette PDF-dokumentet vises kanskje ikke riktig.
+unsupported_feature_forms=Dette PDF-dokumentet inneholder skjemaer. Utfylling av skjemaer støttes ikke.
+open_with_different_viewer=Ã…pne med et annet visningsprogram
+open_with_different_viewer.accessKey=n
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nb-NO/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/nb-NO/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..65ffce7b6e44a6584fcd825969376069f3a19880
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nb-NO/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Forrige side
+previous_label=Forrige
+next.title=Neste side
+next_label=Neste
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Side:
+page_of=av {{pageCount}}
+
+zoom_out.title=Zoom ut
+zoom_out_label=Zoom ut
+zoom_in.title=Zoom inn
+zoom_in_label=Zoom inn
+zoom.title=Zoom
+presentation_mode.title=Bytt til presentasjonsmodus
+presentation_mode_label=Presentasjonsmodus
+open_file.title=Ã…pne fil
+open_file_label=Ã…pne
+print.title=Skriv ut
+print_label=Skriv ut
+download.title=Last ned
+download_label=Last ned
+bookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu)
+bookmark_label=Nåværende visning
+
+# Secondary toolbar and context menu
+tools.title=Verktøy
+tools_label=Verktøy
+first_page.title=Gå til første side
+first_page.label=Gå til første side
+first_page_label=Gå til første side
+last_page.title=GÃ¥ til siste side
+last_page.label=GÃ¥ til siste side
+last_page_label=GÃ¥ til siste side
+page_rotate_cw.title=Roter med klokken
+page_rotate_cw.label=Roter med klokken
+page_rotate_cw_label=Roter med klokken
+page_rotate_ccw.title=Roter mot klokken
+page_rotate_ccw.label=Roter mot klokken
+page_rotate_ccw_label=Roter mot klokken
+
+hand_tool_enable.title=Slå på hånd-verktøy
+hand_tool_enable_label=Slå på hånd-verktøy
+hand_tool_disable.title=Slå av hånd-verktøy
+hand_tool_disable_label=Slå av hånd-verktøy
+
+# Document properties dialog box
+document_properties.title=Dokumentegenskaper …
+document_properties_label=Dokumentegenskaper …
+document_properties_file_name=Filnavn:
+document_properties_file_size=Filstørrelse:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Tittel:
+document_properties_author=Forfatter:
+document_properties_subject=Emne:
+document_properties_keywords=Nøkkelord:
+document_properties_creation_date=Opprettet dato:
+document_properties_modification_date=Endret dato:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Opprettet av:
+document_properties_producer=PDF-verktøy:
+document_properties_version=PDF-versjon:
+document_properties_page_count=Sideantall:
+document_properties_close=Lukk
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Slå av/på sidestolpe
+toggle_sidebar_label=Slå av/på sidestolpe
+outline.title=Vis dokumentdisposisjon
+outline_label=Dokumentdisposisjon
+thumbs.title=Vis miniatyrbilde
+thumbs_label=Miniatyrbilde
+findbar.title=Finn i dokumentet
+findbar_label=Finn
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatyrbilde av side {{page}}
+
+# Find panel button title and messages
+find_label=Finn:
+find_previous.title=Finn forrige forekomst av frasen
+find_previous_label=Forrige
+find_next.title=Finn neste forekomst av frasen
+find_next_label=Neste
+find_highlight=Uthev alle
+find_match_case_label=Skill store/små bokstaver
+find_reached_top=NÃ¥dde toppen av dokumentet, fortsetter fra bunnen
+find_reached_bottom=NÃ¥dde bunnen av dokumentet, fortsetter fra toppen
+find_not_found=Fant ikke teksten
+
+# Error panel labels
+error_more_info=Mer info
+error_less_info=Mindre info
+error_close=Lukk
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (bygg: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Melding: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stakk: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linje: {{line}}
+rendering_error=En feil oppstod ved opptegning av siden.
+
+# Predefined zoom values
+page_scale_width=Sidebredde
+page_scale_fit=Tilpass til siden
+page_scale_auto=Automatisk zoom
+page_scale_actual=Virkelig størrelse
+
+# Loading indicator messages
+loading_error_indicator=Feil
+loading_error=En feil oppstod ved lasting av PDF.
+invalid_file_error=Ugyldig eller skadet PDF-fil.
+missing_file_error=Manglende PDF-fil.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} annotasjon]
+password_label=Skriv inn passordet for å åpne denne PDF-filen.
+password_invalid=Ugyldig passord. Prøv igjen.
+password_ok=OK
+password_cancel=Avbryt
+
+printing_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren.
+printing_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift.
+web_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter.
+document_colors_disabled=PDF-dokumenter tillates ikke å bruke deres egne farger: \'Tillat sider å velge egne farger\' er deaktivert i nettleseren.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nl/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/nl/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..fe4370b224ca64434f96312752b0bb75d30bc39b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nl/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dit PDF-document wordt mogelijk niet juist weergegeven.
+unsupported_feature_forms=Dit PDF-document bevat formulieren. Het invullen van formuliervelden wordt niet ondersteund.
+open_with_different_viewer=Openen met andere PDF-lezer
+open_with_different_viewer.accessKey=O
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nl/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/nl/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3cd730bc56177838536437f1e3b923df474d9d39
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nl/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Vorige pagina
+previous_label=Vorige
+next.title=Volgende pagina
+next_label=Volgende
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pagina:
+page_of=van {{pageCount}}
+
+zoom_out.title=Uitzoomen
+zoom_out_label=Uitzoomen
+zoom_in.title=Inzoomen
+zoom_in_label=Inzoomen
+zoom.title=Zoomen
+presentation_mode.title=Wisselen naar presentatiemodus
+presentation_mode_label=Presentatiemodus
+open_file.title=Bestand openen
+open_file_label=Openen
+print.title=Afdrukken
+print_label=Afdrukken
+download.title=Downloaden
+download_label=Downloaden
+bookmark.title=Huidige weergave (kopiëren of openen in nieuw venster)
+bookmark_label=Huidige weergave
+
+# Secondary toolbar and context menu
+tools.title=Hulpmiddelen
+tools_label=Hulpmiddelen
+first_page.title=Naar eerste pagina gaan
+first_page.label=Naar eerste pagina gaan
+first_page_label=Naar eerste pagina gaan
+last_page.title=Naar laatste pagina gaan
+last_page.label=Naar laatste pagina gaan
+last_page_label=Naar laatste pagina gaan
+page_rotate_cw.title=Rechtsom draaien
+page_rotate_cw.label=Rechtsom draaien
+page_rotate_cw_label=Rechtsom draaien
+page_rotate_ccw.title=Linksom draaien
+page_rotate_ccw.label=Linksom draaien
+page_rotate_ccw_label=Linksom draaien
+
+hand_tool_enable.title=Handhulpmiddel inschakelen
+hand_tool_enable_label=Handhulpmiddel inschakelen
+hand_tool_disable.title=Handhulpmiddel uitschakelen
+hand_tool_disable_label=Handhulpmiddel uitschakelen
+
+# Document properties dialog box
+document_properties.title=Documenteigenschappen…
+document_properties_label=Documenteigenschappen…
+document_properties_file_name=Bestandsnaam:
+document_properties_file_size=Bestandsgrootte:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titel:
+document_properties_author=Auteur:
+document_properties_subject=Onderwerp:
+document_properties_keywords=Trefwoorden:
+document_properties_creation_date=Aanmaakdatum:
+document_properties_modification_date=Wijzigingsdatum:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Auteur:
+document_properties_producer=PDF-producent:
+document_properties_version=PDF-versie:
+document_properties_page_count=Aantal pagina’s:
+document_properties_close=Sluiten
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Zijbalk in-/uitschakelen
+toggle_sidebar_label=Zijbalk in-/uitschakelen
+outline.title=Documentoverzicht tonen
+outline_label=Documentoverzicht
+thumbs.title=Miniaturen tonen
+thumbs_label=Miniaturen
+findbar.title=Zoeken in document
+findbar_label=Zoeken
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatuur van pagina {{page}}
+
+# Find panel button title and messages
+find_label=Zoeken:
+find_previous.title=Het vorige voorkomen van de tekst zoeken
+find_previous_label=Vorige
+find_next.title=Het volgende voorkomen van de tekst zoeken
+find_next_label=Volgende
+find_highlight=Alles markeren
+find_match_case_label=Hoofdlettergevoelig
+find_reached_top=Bovenkant van het document bereikt, doorgegaan vanaf de onderkant
+find_reached_bottom=Onderkant van het document bereikt, doorgegaan vanaf de bovenkant
+find_not_found=Tekst niet gevonden
+
+# Error panel labels
+error_more_info=Meer informatie
+error_less_info=Minder informatie
+error_close=Sluiten
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Bericht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Bestand: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Regel: {{line}}
+rendering_error=Er is een fout opgetreden bij het weergeven van de pagina.
+
+# Predefined zoom values
+page_scale_width=Paginabreedte
+page_scale_fit=Hele pagina
+page_scale_auto=Automatisch zoomen
+page_scale_actual=Werkelijke grootte
+
+# Loading indicator messages
+loading_error_indicator=Fout
+loading_error=Er is een fout opgetreden bij het laden van de PDF.
+invalid_file_error=Ongeldig of beschadigd PDF-bestand.
+missing_file_error=PDF-bestand ontbreekt. 
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-aantekening]
+password_label=Voer het wachtwoord in om dit PDF-bestand te openen.
+password_invalid=Ongeldig wachtwoord. Probeer het opnieuw.
+password_ok=OK
+password_cancel=Annuleren
+
+printing_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.
+printing_not_ready=Warning: PDF is niet volledig geladen om af te drukken.
+web_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.
+document_colors_disabled=PDF-documenten mogen hun eigen kleuren niet gebruiken: ‘Pagina’s toestaan om hun eigen kleuren te kiezen’ is uitgeschakeld in de browser.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nn-NO/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/nn-NO/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..21948f53e977bb32504f75ec82ce0a65716853b8
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nn-NO/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Dette PDF-dokumentet vert kanskje ikkje vist rett.
+open_with_different_viewer=Opne med eit anna visingsprogram
+open_with_different_viewer.accessKey=n
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nn-NO/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/nn-NO/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bda1f9067fdced7a2b1e2222754567d3f338a4f1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nn-NO/viewer.properties
@@ -0,0 +1,136 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Førre side
+previous_label=Førre
+next.title=Neste side
+next_label=Neste
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Side:
+page_of=av {{pageCount}}
+
+zoom_out.title=Zoom ut
+zoom_out_label=Zoom ut
+zoom_in.title=Zoom inn
+zoom_in_label=Zoom inn
+zoom.title=Zoom
+presentation_mode.title=Byt til presentasjonsmodus
+presentation_mode_label=Presentasjonsmodus
+open_file.title=Opne fil
+open_file_label=Opne
+print.title=Skriv ut
+print_label=Skriv ut
+download.title=Last ned
+download_label=Last ned
+bookmark.title=Gjeldande vising (kopier eller opne i nytt vindauge)
+bookmark_label=Gjeldande vising
+
+# Secondary toolbar and context menu
+tools.title=Verktøy
+tools_label=Verktøy
+first_page.title=Gå til første side
+first_page.label=Gå til første side
+first_page_label=Gå til første side
+last_page.title=GÃ¥ til siste side
+last_page.label=GÃ¥ til siste side
+last_page_label=GÃ¥ til siste side
+page_rotate_cw.title=Roter med klokka
+page_rotate_cw.label=Roter med klokka
+page_rotate_cw_label=Roter med klokka
+page_rotate_ccw.title=Roter mot klokka
+page_rotate_ccw.label=Roter mot klokka
+page_rotate_ccw_label=Roter mot klokka
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Slå av/på sidestolpe
+toggle_sidebar_label=Slå av/på sidestolpe
+outline.title=Vis dokumentdisposisjon
+outline_label=Dokumentdisposisjon
+thumbs.title=Vis miniatyrbilde
+thumbs_label=Miniatyrbilde
+findbar.title=Finn i dokumentet
+findbar_label=Finn
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatyrbilde av side {{page}}
+
+# Find panel button title and messages
+find_label=Finn:
+find_previous.title=Finn tidlegare førekomst av frasa
+find_previous_label=Førre
+find_next.title=Finn neste førekomst av frasa
+find_next_label=Neste
+find_highlight=Uthev alle
+find_match_case_label=Skil store/små bokstavar
+find_reached_top=Nådde toppen av dokumentet, held fram frå botnen
+find_reached_bottom=Nådde botnen av dokumentet, held fram frå toppen
+find_not_found=Fann ikkje teksten
+
+# Error panel labels
+error_more_info=Meir info
+error_less_info=Mindre info
+error_close=Lukk
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (bygg: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Melding: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stakk: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linje: {{line}}
+rendering_error=Ein feil oppstod ved oppteikning av sida.
+
+# Predefined zoom values
+page_scale_width=Sidebreidde
+page_scale_fit=Tilpass til sida
+page_scale_auto=Automatisk zoom
+page_scale_actual=Verkeleg størrelse
+
+# Loading indicator messages
+loading_error_indicator=Feil
+loading_error=Ein feil oppstod ved lasting av PDF.
+invalid_file_error=Ugyldig eller korrupt PDF fil.
+missing_file_error=Manglande PDF-fil.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} annotasjon]
+password_label=Skriv inn passordet for å opne denne PDF-fila.
+password_invalid=Ugyldig passord. Prøv igjen.
+password_ok=OK
+password_cancel=Avbryt
+
+printing_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren.
+printing_not_ready=Ã…tvaring: PDF ikkje fullstendig innlasta for utskrift.
+web_fonts_disabled=Web-fontar er avslått: Kan ikkje bruke innbundne PDF-fontar.
+document_colors_disabled=PDF-dokument har ikkje løyve til å nytte eigne fargar: \'Tillat sider å velje eigne fargar\' er slått av i nettlesaren.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nso/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/nso/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..15ce24973f5aa482144c34b9578b40686c684dc5
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nso/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Tokumente ye ya PDF e ka no se bontšhwe ka tsela ya maleba.
+open_with_different_viewer=Bula ka selebeledi se fapanego
+open_with_different_viewer.accessKey=b
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/nso/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/nso/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..09923f59375425af173ef90d2b4ab05517b43ce3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/nso/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Letlakala le fetilego
+previous_label=Fetilego
+next.title=Letlakala le latelago
+next_label=Latelago
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Letlakala:
+page_of=la {{pageCount}}
+
+zoom_out.title=Bušetša ka gare
+zoom_out_label=Bušetša ka gare
+zoom_in.title=Godišetša ka ntle
+zoom_in_label=Godišetša ka ntle
+zoom.title=Godiša
+print.title=Gatiša
+print_label=Gatiša
+presentation_mode.title=Fetogela go mokgwa wa tlhagišo
+presentation_mode_label=Mokgwa wa tlhagišo
+open_file.title=Bula faele
+open_file_label=Bula
+download.title=Laolla
+download_label=Laolla
+bookmark.title=Pono ya bjale (kopiša le go bula lefasetereng le leswa)
+bookmark_label=Tebelelo ya gona bjale
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Å ielanya para ya ka thoko
+toggle_sidebar_label=Å ielanya para ya ka thoko
+outline.title=Laetša kakaretšo ya tokumente
+outline_label=Kakaretšo ya tokumente
+thumbs.title=Laetša dikhutšofatšo
+thumbs_label=Dikhutšofatšo
+findbar.title=Hwetša go tokumente
+findbar_label=Hwetša
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Letlakala {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Khutšofatšo ya letlakala {{page}}
+
+# Context menu
+first_page.label=Eya letlakaleng la mathomo
+last_page.label=Eya letlakaleng la mafelelo
+page_rotate_cw.label=Dikološa go ya ka go la go ja
+page_rotate_ccw.label=Dikološa go ya go la ntsogošo
+
+# Find panel button title and messages
+find_label=Hwetša:
+find_previous.title=Hwetša tiragalo e fetilego ya sekafoko
+find_previous_label=Fetilego
+find_next.title=Hwetša tiragalo e latelago ya sekafoko
+find_next_label=Latelago
+find_highlight=Bonagatša tšohle
+find_match_case_label=Swantšha kheisi
+find_reached_top=Fihlile godimo ga tokumente, go tšwetšwe pele go tloga tlase
+find_reached_bottom=Fihlile mafelelong a tokumente, go tšwetšwe pele go tloga godimo
+find_not_found=Sekafoko ga sa hwetšwa
+
+# Error panel labels
+error_more_info=Tshedimošo e oketšegilego
+error_less_info=Tshedimošo ya tlasana
+error_close=Tswalela
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Molaetša: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Mokgobo: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Faele: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Mothaladi: {{line}}
+rendering_error=Go diregile phošo ge go be go gafelwa letlakala.
+
+# Predefined zoom values
+page_scale_width=Bophara bja letlakala
+page_scale_fit=Go lekana ga letlakala
+page_scale_auto=Kgodišo ya maitirišo
+page_scale_actual=Bogolo bja kgonthe
+
+# Loading indicator messages
+loading_error_indicator=Phošo
+loading_error=Go diregile phošo ge go hlahlelwa PDF.
+invalid_file_error=Faele ye e sa šomego goba e senyegilego ya PDF.
+missing_file_error=Faele yeo e sego gona ya PDF.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type=[{{type}} Tlhaloso]
+request_password=PDF e šireleditšwe ka lentšuphetišo:
+
+printing_not_supported=Temošo: Go gatiša ga go thekgwe ke praosara ye ka botlalo.
+printing_not_ready=Temošo: PDF ga ya hlahlelwa ka botlalo bakeng sa go gatišwa.
+web_fonts_disabled=Difonte tša wepe di šitišitšwe: ga e kgone go diriša difonte tša PDF tše khutišitšwego.
+web_colors_disabled=Mebala ya wepe e šitišitšwe.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/oc/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/oc/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6781a4301fc3b297a6a76fc77bc3870a74cc1d50
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/oc/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Es possible qu'aqueste document PDF s'afiche pas corrèctament.
+unsupported_feature_forms=Aqueste document PDF conten de formularis. L'emplenatge de camps de formularis es pas pres en carga.
+open_with_different_viewer=Dobrir amb un autre lector PDF
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/oc/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/oc/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..65b40801ebe540067be229b31a1c68b53dfbe769
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/oc/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina precedenta
+previous_label=Precedent
+next.title=Pagina seguenta
+next_label=Seguent
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pagina :
+page_of=sus {{pageCount}}
+
+zoom_out.title=Zoom arrièr
+zoom_out_label=Zoom arrièr
+zoom_in.title=Zoom avant
+zoom_in_label=Zoom avant
+zoom.title=Zoom
+presentation_mode.title=Bascuolar en mòde presentacion
+presentation_mode_label=Mòde Presentacion
+open_file.title=Dobrir lo fichièr
+open_file_label=Dobrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Telecargar
+download_label=Telecargar
+bookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla)
+bookmark_label=Afichatge actual
+
+# Secondary toolbar and context menu
+tools.title=Aisinas
+tools_label=Aisinas
+first_page.title=Anar a la primièra pagina
+first_page.label=Anar a la primièra pagina
+first_page_label=Anar a la primièra pagina
+last_page.title=Anar a la darrièra pagina
+last_page.label=Anar a la darrièra pagina
+last_page_label=Anar a la darrièra pagina
+page_rotate_cw.title=Rotacion orària
+page_rotate_cw.label=Rotacion orària
+page_rotate_cw_label=Rotacion orària
+page_rotate_ccw.title=Rotacion antiorària
+page_rotate_ccw.label=Rotacion antiorària
+page_rotate_ccw_label=Rotacion antiorària
+
+hand_tool_enable.title=Activar l'aisina man
+hand_tool_enable_label=Activar l'aisina man
+hand_tool_disable.title=Desactivar l'aisina man
+hand_tool_disable_label=Desactivar l'aisina man
+
+# Document properties dialog box
+document_properties.title=Proprietats del document...
+document_properties_label=Proprietats del document...
+document_properties_file_name=Nom del fichièr :
+document_properties_file_size=Talha del fichièr :
+document_properties_kb={{size_kb}} Ko ({{size_b}} octets)
+document_properties_mb={{size_mb}} Mo ({{size_b}} octets)
+document_properties_title=Títol :
+document_properties_author=Autor :
+document_properties_subject=Subjècte :
+document_properties_keywords=Mots claus :
+document_properties_creation_date=Data de creacion :
+document_properties_modification_date=Data de modificacion :
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator :
+document_properties_producer=Aisina de conversion PDF :
+document_properties_version=Version PDF :
+document_properties_page_count=Nombre de paginas :
+document_properties_close=Tampar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Afichar/amagar lo panèl lateral
+toggle_sidebar_label=Afichar/amagar lo panèl lateral
+outline.title=Afichar los marcapaginas
+outline_label=Marcapaginas del document
+thumbs.title=Afichar las vinhetas
+thumbs_label=Vinhetas
+findbar.title=Trobar dins lo document
+findbar_label=Recercar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Vinheta de la pagina {{page}}
+
+# Find panel button title and messages
+find_label=Recercar
+find_previous.title=Tròba l'ocurréncia precedenta de la frasa
+find_previous_label=Precedent
+find_next.title=Tròba l'ocurréncia venenta de la frasa
+find_next_label=Seguent
+find_highlight=Suslinhar tot
+find_match_case_label=Respectar la cassa
+find_reached_top=Naut de la pagina atench, perseguida dempuèi lo bas
+find_reached_bottom=Bas de la pagina atench, perseguida al començament
+find_not_found=Frasa pas trobada
+
+# Error panel labels
+error_more_info=Mai de detalhs
+error_less_info=Mens d'informacions
+error_close=Tampar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Messatge : {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila : {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fichièr : {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linha : {{line}}
+rendering_error=Una error s'es producha pendent l'afichatge de la pagina.
+
+# Predefined zoom values
+page_scale_width=Largor plena
+page_scale_fit=Pagina entièra
+page_scale_auto=Zoom automatic
+page_scale_actual=Talha vertadièra
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Una error s'es producha pendent lo cargament del fichièr PDF.
+invalid_file_error=Fichièr PDF invalid o corromput.
+missing_file_error=Fichièr PDF mancant.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotacion {{type}}]
+password_label=Picatz lo senhal per dobrir aqueste fichièr PDF.
+password_invalid=Senhal incorrècte. Tornatz ensajar.
+password_ok=D'acòrdi
+password_cancel=Anullar
+
+printing_not_supported=Atencion : l'estampatge es pas completament gerit per aqueste navigador.
+printing_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir.
+web_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF.
+document_colors_disabled=Los documents PDF pòdon pas utilizar lors pròprias colors : « Autorizar las paginas web d'utilizar lors pròprias colors » es desactivat dins lo navigador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/or/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/or/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..25c3c35fd58e5738769f19925501f9f35942ad14
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/or/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ଏହି PDF ଦଲିଲ ହୁଏତଃ ସଠିକ ଭାବରେ ଦର୍ଶାଯାଇ ନାହିଁ।
+open_with_different_viewer=ଭିନ୍ନ ଏକ ପ୍ରଦର୍ଶକ ସହାୟତାରେ ଦର୍ଶାନ୍ତୁ
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/or/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/or/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5f98607d322a3cd6fd6d1b04ba0abad00b2224e8
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/or/viewer.properties
@@ -0,0 +1,139 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=ପୂର୍ବ ପୃଷ୍ଠା
+previous_label=ପୂର୍ବ
+next.title=ପର ପୃଷ୍ଠା
+next_label=ପର
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=ପୃଷ୍ଠା:
+page_of={{pageCount}} ର
+
+zoom_out.title=ଛୋଟ କରନ୍ତୁ
+zoom_out_label=ଛୋଟ କରନ୍ତୁ
+zoom_in.title=ବଡ଼ କରନ୍ତୁ
+zoom_in_label=ବଡ଼ କରନ୍ତୁ
+zoom.title=ଛୋଟ ବଡ଼ କରନ୍ତୁ
+presentation_mode.title=ଉପସ୍ଥାପନ ଧାରାକୁ ବଦଳାନ୍ତୁ
+presentation_mode_label=ଉପସ୍ଥାପନ ଧାରା
+open_file.title=ଫାଇଲ ଖୋଲନ୍ତୁ
+open_file_label=ଖୋଲନ୍ତୁ
+print.title=ମୁଦ୍ରଣ
+print_label=ମୁଦ୍ରଣ
+download.title=ଆହରଣ
+download_label=ଆହରଣ
+bookmark.title=ପ୍ରଚଳିତ ଦୃଶ୍ୟ (ନକଲ କରନ୍ତୁ କିମ୍ବା ଏକ ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ)
+bookmark_label=ପ୍ରଚଳିତ ଦୃଶ୍ୟ
+
+# Secondary toolbar and context menu
+tools.title=ସାଧନଗୁଡ଼ିକ
+tools_label=ସାଧନଗୁଡ଼ିକ
+first_page.title=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
+first_page.label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
+first_page_label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
+last_page.title=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
+last_page.label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
+last_page_label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ
+page_rotate_cw.title=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
+page_rotate_cw.label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
+page_rotate_cw_label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
+page_rotate_ccw.title=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
+page_rotate_ccw.label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
+page_rotate_ccw_label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ
+
+
+# Document properties dialog box
+document_properties_title=ଶୀର୍ଷକ:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ
+toggle_sidebar_label=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ
+outline.title=ଦଲିଲ  ସାରାଂଶ ଦର୍ଶାନ୍ତୁ
+outline_label=ଦଲିଲ ସାରାଂଶ
+thumbs.title=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ
+thumbs_label=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ
+findbar.title=ଦଲିଲରେ ଖୋଜନ୍ତୁ
+findbar_label=ଖୋଜନ୍ତୁ
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=ପୃଷ୍ଠା {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=ପୃଷ୍ଠାର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ {{page}}
+
+# Find panel button title and messages
+find_label=ଖୋଜନ୍ତୁ:
+find_previous.title=ଏହି ବାକ୍ୟାଂଶର ପୂର୍ବ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ
+find_previous_label=ପୂର୍ବବର୍ତ୍ତୀ
+find_next.title=ଏହି ବାକ୍ୟାଂଶର ପରବର୍ତ୍ତୀ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ
+find_next_label=ପରବର୍ତ୍ତୀ 
+find_highlight=ସମସ୍ତଙ୍କୁ ଆଲୋକିତ କରନ୍ତୁ
+find_match_case_label=ଅକ୍ଷର ମେଳାନ୍ତୁ
+find_reached_top=ତଳୁ ଉପରକୁ ଗତି କରି ଦଲିଲର ଉପର ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି
+find_reached_bottom=ଉପରୁ ତଳକୁ ଗତି କରି ଦଲିଲର ଶେଷ ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି
+find_not_found=ବାକ୍ୟାଂଶ ମିଳିଲା ନାହିଁ
+
+# Error panel labels
+error_more_info=ଅଧିକ ସୂଚନା
+error_less_info=ସ୍ୱଳ୍ପ ସୂଚନା
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=ସନ୍ଦେଶ: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=ଷ୍ଟାକ: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ଫାଇଲ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=ଧାଡ଼ି: {{line}}
+rendering_error=ପୃଷ୍ଠା ଚିତ୍ରଣ କରିବା ସମୟରେ ତ୍ରୁଟି ଘଟିଲା।
+
+# Predefined zoom values
+page_scale_width=ପୃଷ୍ଠା ଓସାର
+page_scale_fit=ପୃଷ୍ଠା ମେଳନ
+page_scale_auto=ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଛୋଟବଡ଼ କରିବା
+page_scale_actual=ପ୍ରକୃତ ଆକାର
+
+# Loading indicator messages
+loading_error_indicator=ତ୍ରୁଟି
+loading_error=PDF ଧାରଣ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ଘଟିଲା।
+invalid_file_error=ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ PDF ଫାଇଲ।
+missing_file_error=ହଜିଯାଇଥିବା PDF ଫାଇଲ।
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=ଏହି PDF ଫାଇଲକୁ ଖୋଲିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ ଭରଣ କରନ୍ତୁ।
+password_invalid=ଭୁଲ ପ୍ରବେଶ ସଂକେତ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।
+password_ok=ଠିକ ଅଛି
+password_cancel=ବାତିଲ କରନ୍ତୁ
+
+printing_not_supported=ଚେତାବନୀ: ଏହି ବ୍ରାଉଜର ଦ୍ୱାରା ମୁଦ୍ରଣ କ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ।
+printing_not_ready=ଚେତାବନୀ: PDF ଟି ମୁଦ୍ରଣ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଧାରଣ ହୋଇ ନାହିଁ।
+web_fonts_disabled=ୱେବ ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି: ସନ୍ନିହିତ PDF ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାରେ ଅସମର୍ଥ।
+document_colors_disabled=PDF ଦଲିଲଗୁଡ଼ିକ ସେମାନଙ୍କର ନିଜର ରଙ୍ଗ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ: 'ସେମାନଙ୍କର ନିଜ ରଙ୍ଗ ବାଛିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ' କୁ ବ୍ରାଉଜରରେ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pa-IN/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/pa-IN/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8e52424fbfaa0a483e208c1d8529b772b62a7b77
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pa-IN/chrome.properties
@@ -0,0 +1,10 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ਇਹ PDF ਡੌਕੂਮੈਂਟ ਸ਼ਾਇਦ ਠੀਕ ਤਰ੍ਹਾਂ ਨਾ ਵੇਖਾਇਆ ਜਾ ਸਕੇ।
+unsupported_feature_forms=ਇਹ PDF ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਫਾਰਮ ਹਨ। ਫਾਰਮ ਖੇਤਰਾਂ ਨੂੰ ਭਰਨਾ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।
+open_with_different_viewer=ਵੱਖਰੇ ਦਰਸ਼ਕ ਨਾਲ ਖੋਲ੍ਹੋ
+open_with_different_viewer.accessKey=o
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pa-IN/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/pa-IN/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..35e2907d9a54494aa4d9f4b58dd285da792c6a73
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pa-IN/viewer.properties
@@ -0,0 +1,175 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=ਪੇਜ਼ ਪਿੱਛੇ
+previous_label=ਪਿੱਛੇ
+next.title=ਪੇਜ਼ ਅੱਗੇ
+next_label=ਅੱਗੇ
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=ਪੇਜ਼:
+page_of={{pageCount}} ਵਿੱਚੋਂ
+
+zoom_out.title=ਜ਼ੂਮ ਆਉਟ
+zoom_out_label=ਜ਼ੂਮ ਆਉਟ
+zoom_in.title=ਜ਼ੂਮ ਇਨ
+zoom_in_label=ਜ਼ੂਮ ਇਨ
+zoom.title=ਜ਼ੂਨ
+print.title=ਪਰਿੰਟ
+print_label=ਪਰਿੰਟ
+presentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ
+presentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ
+
+open_file.title=ਫਾਇਲ ਖੋਲ੍ਹੋ
+open_file_label=ਖੋਲ੍ਹੋ
+download.title=ਡਾਊਨਲੋਡ
+download_label=ਡਾਊਨਲੋਡ
+bookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ)
+bookmark_label=ਮੌਜੂਦਾ ਝਲਕ
+
+# Secondary toolbar and context menu
+tools.title=ਟੂਲ
+tools_label=ਟੂਲ
+first_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
+first_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
+first_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
+
+last_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
+last_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
+page_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ
+page_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ
+page_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ
+page_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ
+page_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ
+
+hand_tool_enable.title=ਹੱਥ ਟੂਲ ਚਾਲੂ
+hand_tool_enable_label=ਹੱਥ ਟੂਲ ਚਾਲੂ
+hand_tool_disable.title=ਹੱਥ ਟੂਲ ਬੰਦ
+hand_tool_disable_label=ਹੱਥ ਟੂਲ ਬੰਦ
+
+# Document properties dialog box
+document_properties.title=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ
+document_properties_label=…ਦਸਤਾਵੇਜ਼ ਵਿਸ਼ੇਸ਼ਤਾ
+document_properties_file_name=ਫਾਇਲ ਨਾਂ:
+document_properties_file_size=ਫਾਇਲ ਆਕਾਰ:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=ਟਾਈਟਲ:
+document_properties_author=ਲੇਖਕ:
+document_properties_subject=ਵਿਸ਼ਾ:
+document_properties_keywords=ਸ਼ਬਦ:
+document_properties_creation_date=ਬਣਾਉਣ ਮਿਤੀ:
+document_properties_modification_date=ਸੋਧ ਮਿਤੀ:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=ਨਿਰਮਾਤਾ:
+document_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ:
+document_properties_version=PDF ਵਰਜਨ:
+document_properties_page_count=ਪੇਜ਼ ਗਿਣਤੀ:
+document_properties_close=ਬੰਦ ਕਰੋ
+
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ
+toggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ
+
+outline.title=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ ਵੇਖਾਓ
+outline_label=ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ
+thumbs.title=ਥੰਮਨੇਲ ਵੇਖਾਓ
+thumbs_label=ਥੰਮਨੇਲ
+findbar.title=ਡੌਕੂਮੈਂਟ ਵਿੱਚ ਲੱਭੋ
+findbar_label=ਲੱਭੋ
+
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=ਪੇਜ਼ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} ਪੇਜ਼ ਦਾ ਥੰਮਨੇਲ
+
+
+# Context menu
+first_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
+last_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ
+page_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ
+page_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ
+
+# Find panel button title and messages
+find_label=ਲੱਭੋ:
+find_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ
+find_previous_label=ਪਿੱਛੇ
+find_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ
+find_next_label=ਅੱਗੇ
+find_highlight=ਸਭ ਉਭਾਰੋ
+find_match_case_label=ਅੱਖਰ ਆਕਾਰ ਮਿਲਾਉ
+find_reached_top=ਡੌਕੂਮੈਂਟ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ
+find_reached_bottom=ਡੌਕੂਮੈਂਟ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ
+find_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ
+
+
+# Error panel labels
+error_more_info=ਹੋਰ ਜਾਣਕਾਰੀ
+error_less_info=ਘੱਟ ਜਾਣਕਾਰੀ
+error_close=ਬੰਦ ਕਰੋ
+
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}}
+
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=ਸੁਨੇਹਾ: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=ਸਟੈਕ: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ਫਾਇਲ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=ਲਾਈਨ: {{line}}
+rendering_error=ਪੇਜ਼ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।
+
+# Predefined zoom values
+page_scale_width=ਪੇਜ਼ ਚੌੜਾਈ
+page_scale_fit=ਪੇਜ਼ ਫਿੱਟ
+page_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ
+page_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ
+
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+loading_error_indicator=ਗਲਤੀ
+loading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ।
+invalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਇਲ ਹੈ।
+missing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਇਲ।
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=ਇਹ PDF ਫਾਇਲ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ।
+password_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।
+password_ok=ਠੀਕ ਹੈ
+password_cancel=ਰੱਦ ਕਰੋ
+
+printing_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।
+printing_not_ready=ਸਾਵਧਾਨ: ਪੀਡੀਐਫ(PDF) ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ।
+web_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ ਪੀਡੀਐਫ (PDF) ਫੋਂਟ ਵਰਤਨ ਲਈ ਅਸਮਰੱਥ ਹੈ।
+document_colors_disabled=PDF ਡੌਕੂਮੈਂਟ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਨਹੀਂ ਹੈ।: ਬਰਾਊਜ਼ਰ ਵਿੱਚ \'ਸਫ਼ਿਆਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦਿਉ\' ਨੂੰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pl/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/pl/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3c7eb81c4ba040ad6ccf703759ad5691afff5653
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pl/chrome.properties
@@ -0,0 +1,9 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ten dokument PDF może nie wyświetlać się poprawnie.
+unsupported_feature_forms=Ten dokument PDF zawiera formularze. Uzupełnianie pól formularzy nie jest obsługiwane.
+open_with_different_viewer=Otwórz w innym programie
+open_with_different_viewer.accessKey=O
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pl/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/pl/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d4f408f873ebc0bced85ac1c095dc007e9ab8213
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pl/viewer.properties
@@ -0,0 +1,149 @@
+# 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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Poprzednia strona
+previous_label=Poprzednia
+next.title=Następna strona
+next_label=Następna
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Strona:
+page_of=z {{pageCount}}
+
+zoom_out.title=Pomniejszenie
+zoom_out_label=Pomniejsz
+zoom_in.title=Powiększenie
+zoom_in_label=Powiększ
+zoom.title=Skala
+presentation_mode.title=Przełącz na tryb prezentacji
+presentation_mode_label=Tryb prezentacji
+open_file.title=Otwieranie pliku
+open_file_label=Otwórz
+print.title=Drukowanie
+print_label=Drukuj
+download.title=Pobieranie
+download_label=Pobierz
+bookmark.title=Aktualny widok (skopiuj lub otwórz w nowym oknie)
+bookmark_label=Aktualny widok
+
+tools.title=Tools
+tools_label=Tools
+first_page.title=Przechodzenie do pierwszej strony
+first_page.label=Przejdź do pierwszej strony
+first_page_label=Przejdź do pierwszej strony
+last_page.title=Przechodzenie do ostatniej strony
+last_page.label=Przejdź do ostatniej strony
+last_page_label=Przejdź do ostatniej strony
+page_rotate_cw.title=Obracanie zgodnie z ruchem wskazówek zegara
+page_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara
+page_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara
+page_rotate_ccw.title=Obracanie przeciwnie do ruchu wskazówek zegara
+page_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara
+page_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara
+
+hand_tool_enable.title=Włączanie narzędzia rączka
+hand_tool_enable_label=Włącz narzędzie rączka
+hand_tool_disable.title=Wyłączanie narzędzia rączka
+hand_tool_disable_label=Wyłącz narzędzie rączka
+
+document_properties.title=Właściwości dokumentu…
+document_properties_label=Właściwości dokumentu…
+document_properties_file_name=Nazwa pliku:
+document_properties_file_size=Rozmiar pliku:
+document_properties_kb={{size_kb}} KB ({{size_b}} b)
+document_properties_mb={{size_mb}} MB ({{size_b}} b)
+document_properties_title=Tytuł:
+document_properties_author=Autor:
+document_properties_subject=Temat:
+document_properties_keywords=Słowa kluczowe:
+document_properties_creation_date=Data utworzenia:
+document_properties_modification_date=Data modyfikacji:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Utworzony przez:
+document_properties_producer=PDF wyprodukowany przez:
+document_properties_version=Wersja PDF:
+document_properties_page_count=Liczba stron:
+document_properties_close=Zamknij
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Przełączanie panelu bocznego
+toggle_sidebar_label=Przełącz panel boczny
+outline.title=Wyświetlanie zarysu dokumentu
+outline_label=Zarys dokumentu
+thumbs.title=Wyświetlanie miniaturek
+thumbs_label=Miniaturki
+findbar.title=Znajdź w dokumencie
+findbar_label=Znajdź
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strona {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniaturka strony {{page}}
+
+# Find panel button title and messages
+find_label=Znajdź:
+find_previous.title=Znajdź poprzednie wystąpienie tekstu
+find_previous_label=Poprzednie
+find_next.title=Znajdź następne wystąpienie tekstu
+find_next_label=Następne
+find_highlight=Podświetl wszystkie
+find_match_case_label=Rozróżniaj wielkość znaków
+find_reached_top=Osiągnięto początek dokumentu, kontynuacja od końca
+find_reached_bottom=Osiągnięto koniec dokumentu, kontynuacja od początku
+find_not_found=Tekst nieznaleziony
+
+# Error panel labels
+error_more_info=Więcej informacji
+error_less_info=Mniej informacji
+error_close=Zamknij
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (kompilacja: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Wiadomość: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stos: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Plik: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Wiersz: {{line}}
+rendering_error=Podczas renderowania strony wystąpił błąd.
+
+# Predefined zoom values
+page_scale_width=Szerokość strony
+page_scale_fit=Dopasowanie strony
+page_scale_auto=Skala automatyczna
+page_scale_actual=Rozmiar rzeczywisty
+
+# Loading indicator messages
+loading_error_indicator=Błąd
+loading_error=Podczas wczytywania dokumentu PDF wystąpił błąd.
+invalid_file_error=Nieprawidłowy lub uszkodzony plik PDF.
+missing_file_error=Brak pliku PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Adnotacja: {{type}}]
+password_label=Wprowadź hasło, aby otworzyć ten dokument PDF.
+password_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie.
+password_ok=OK
+password_cancel=Anuluj
+
+printing_not_supported=Ostrzeżenie: Drukowanie nie jest w pełni wspierane przez przeglądarkę.
+printing_not_ready=Ostrzeżenie: Dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować.
+web_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF.
+document_colors_disabled=Dokumenty PDF nie mogą używać własnych kolorów: Opcja „Pozwalaj stronom stosować inne kolory” w przeglądarce jest nieaktywna.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pt-BR/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/pt-BR/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ad1baa2ef1392b33ce618dd899ee54edd91b69c0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pt-BR/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Este documento PDF pode não ser exibido corretamente.
+unsupported_feature_forms=Este documento PDF contém formulários. O preenchimento de campos de formulários não é suportada.
+open_with_different_viewer=Abrir com outro visualizador
+open_with_different_viewer.accessKey=b
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pt-BR/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/pt-BR/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a8e33b88e0dbd090099e0dfb15b8bfa6226509f1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pt-BR/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Página anterior
+previous_label=Anterior
+next.title=Próxima página
+next_label=Próxima
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Página:
+page_of=de {{pageCount}}
+
+zoom_out.title=Diminuir zoom
+zoom_out_label=Diminuir zoom
+zoom_in.title=Aumentar zoom
+zoom_in_label=Aumentar zoom
+zoom.title=Zoom
+presentation_mode.title=Alternar para modo de apresentação
+presentation_mode_label=Modo de apresentação
+open_file.title=Abrir arquivo
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Download
+download_label=Download
+bookmark.title=Visualização atual (copie ou abra em nova janela)
+bookmark_label=Visualização atual
+
+# Secondary toolbar and context menu
+tools.title=Ferramentas
+tools_label=Ferramentas
+first_page.title=Ir para a primeira página
+first_page.label=Ir para a primeira página
+first_page_label=Ir para a primeira página
+last_page.title=Ir para a última página
+last_page.label=Ir para a última página
+last_page_label=Ir para a última página
+page_rotate_cw.title=Girar no sentido horário
+page_rotate_cw.label=Girar no sentido horário
+page_rotate_cw_label=Girar no sentido horário
+page_rotate_ccw.title=Girar no sentido anti-horário
+page_rotate_ccw.label=Girar no sentido anti-horário
+page_rotate_ccw_label=Girar no sentido anti-horário
+
+hand_tool_enable.title=Ativar ferramenta da mão
+hand_tool_enable_label=Ativar ferramenta da mão
+hand_tool_disable.title=Desativar ferramenta da mão
+hand_tool_disable_label=Desativar ferramenta da mão
+
+# Document properties dialog box
+document_properties.title=Propriedades do documento…
+document_properties_label=Propriedades do documento…
+document_properties_file_name=Nome do arquivo:
+document_properties_file_size=Tamanho do arquivo:
+document_properties_kb={{size_kb}}\u202fKB ({{size_b}} bytes)
+document_properties_mb={{size_mb}}\u202fMB ({{size_b}} bytes)
+document_properties_title=Título:
+document_properties_author=Autor:
+document_properties_subject=Assunto:
+document_properties_keywords=Palavras-chave:
+document_properties_creation_date=Data da criação:
+document_properties_modification_date=Data da modificação:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Criação:
+document_properties_producer=Criador do PDF:
+document_properties_version=Versão do PDF:
+document_properties_page_count=Contagem de páginas:
+document_properties_close=Fechar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Exibir/ocultar painel
+toggle_sidebar_label=Exibir/ocultar painel
+outline.title=Exibir estrutura de tópicos
+outline_label=Estrutura de tópicos do documento
+thumbs.title=Exibir miniaturas das páginas
+thumbs_label=Miniaturas
+findbar.title=Localizar no documento
+findbar_label=Localizar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Página {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da página {{page}}
+
+# Find panel button title and messages
+find_label=Localizar:
+find_previous.title=Localizar a ocorrência anterior do texto
+find_previous_label=Anterior
+find_next.title=Localizar a próxima ocorrência do texto
+find_next_label=Próxima
+find_highlight=Realçar tudo
+find_match_case_label=Diferenciar maiúsculas/minúsculas
+find_reached_top=Atingido o início do documento, continuando do fim
+find_reached_bottom=Atingido o fim do documento, continuando do início
+find_not_found=Texto não encontrado
+
+# Error panel labels
+error_more_info=Mais informações
+error_less_info=Menos informações
+error_close=Fechar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensagem: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Arquivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linha: {{line}}
+rendering_error=Ocorreu um erro ao renderizar a página.
+
+# Predefined zoom values
+page_scale_width=Largura da página
+page_scale_fit=Ajustar à janela
+page_scale_auto=Zoom automático
+page_scale_actual=Tamanho real
+
+# Loading indicator messages
+loading_error_indicator=Erro
+loading_error=Ocorreu um erro ao carregar o PDF.
+invalid_file_error=Arquivo PDF corrompido ou inválido.
+missing_file_error=Arquivo PDF ausente.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotação {{type}}]
+password_label=Forneça a senha para abrir este arquivo PDF.
+password_invalid=Senha inválida. Por favor, tente de novo.
+password_ok=OK
+password_cancel=Cancelar
+
+printing_not_supported=Alerta: a impressão não é totalmente suportada neste navegador.
+printing_not_ready=Alerta: o PDF não está totalmente carregado para impressão.
+web_fonts_disabled=Fontes da web estão desativadas: não é possível usar fontes incorporadas do PDF.
+document_colors_disabled=Documentos PDF não estão permitidos a usar suas próprias cores: “Páginas podem usar outras cores” está desativado no navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pt-PT/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/pt-PT/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d9cf0e9db655536ba2db187367e9adf69a7d40ae
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pt-PT/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Este documento PDF poderá não ser apresentado corretamente.
+unsupported_feature_forms=Este documento PDF contém formulários. O preenchimento dos campos não é suportado.
+open_with_different_viewer=Abrir com outro visualizador
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/pt-PT/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/pt-PT/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0ad9b8afe3e38c2ec65ac7f2a801eedb6a8535a4
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/pt-PT/viewer.properties
@@ -0,0 +1,166 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Página anterior
+previous_label=Anterior
+next.title=Página seguinte
+next_label=Seguinte
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Página:
+page_of=de {{pageCount}}
+
+zoom_out.title=Reduzir
+zoom_out_label=Reduzir
+zoom_in.title=Ampliar
+zoom_in_label=Ampliar
+zoom.title=Ampliação
+presentation_mode.title=Mudar para modo de apresentação
+presentation_mode_label=Modo de apresentação
+open_file.title=Abrir ficheiro
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Transferir
+download_label=Transferir
+bookmark.title=Vista atual (copiar ou abrir em nova janela)
+bookmark_label=Vista atual
+
+# Secondary toolbar and context menu
+tools.title=Ferramentas
+tools_label=Ferramentas
+first_page.title=Ir para a primeira página
+first_page.label=Ir para a primeira página
+first_page_label=Ir para a primeira página
+last_page.title=Ir para a última página
+last_page.label=Ir para a última página
+last_page_label=Ir para a última página
+page_rotate_cw.title=Rodar à direita
+page_rotate_cw.label=Rodar à direita
+page_rotate_cw_label=Rodar à direita
+page_rotate_ccw.title=Rodar à esquerda
+page_rotate_ccw.label=Rodar à esquerda
+page_rotate_ccw_label=Rodar à esquerda
+hand_tool_enable.title=Ativar ferramenta Mão
+hand_tool_enable_label=Ativar ferramenta Mão
+hand_tool_disable.title=Desativar ferramenta Mão
+hand_tool_disable_label=Desativar ferramenta Mão
+
+# Document properties dialog box
+document_properties.title=Propriedades do documento...
+document_properties_label=Propriedades do documento...
+document_properties_file_name=Nome do ficheiro:
+document_properties_file_size=Tamanho do ficheiro:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Título:
+document_properties_author=Autor:
+document_properties_subject=Assunto:
+document_properties_keywords=Palavras-chave:
+document_properties_creation_date=Data de criação:
+document_properties_modification_date=Data de modificação:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Criador:
+document_properties_producer=Produtor de PDF:
+document_properties_version=versão do PDF:
+document_properties_page_count=N.º de páginas:
+document_properties_close=Fechar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Comutar barra lateral
+toggle_sidebar_label=Comutar barra lateral
+outline.title=Mostrar estrutura do documento
+outline_label=Estrutura do documento
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Localizar no documento
+findbar_label=Localizar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Página {{page}}
+
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da página {{page}}
+
+# Find panel button title and messages
+find_label=Localizar:
+find_previous.title=Localizar a ocorrência anterior
+find_previous_label=Anterior
+find_next.title=Localizar a ocorrência seguinte
+find_next_label=Seguinte
+find_highlight=Destacar tudo
+find_match_case_label=Correspondência
+find_reached_top=Início de documento atingido, a continuar do fim
+find_reached_bottom=Fim da página atingido, a continuar do início
+find_not_found=Frase não encontrada
+
+# Error panel labels
+error_more_info=Mais informação
+error_less_info=Menos informação
+error_close=Fechar
+
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (compilação: {{build}})
+
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensagem: {{message}}
+
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pilha: {{stack}}
+
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ficheiro: {{file}}
+
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linha: {{line}}
+rendering_error=Ocorreu um erro ao processar a página.
+
+# Predefined zoom values
+page_scale_width=Ajustar à largura
+page_scale_fit=Ajustar à página
+page_scale_auto=Tamanho automático
+page_scale_actual=Tamanho real
+
+# Loading indicator messages
+loading_error_indicator=Erro
+loading_error=Ocorreu um erro ao carregar o PDF.
+invalid_file_error=Ficheiro PDF inválido ou danificado.
+missing_file_error=Ficheiro PDF inexistente.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotação {{type}}]
+password_label=Introduza a senha para abrir este PDF.
+password_invalid=Senha inválida. Tente novamente.
+password_ok=OK
+password_cancel=Cancelar
+
+printing_not_supported=Aviso: a impressão não é totalmente suportada por este navegador.
+printing_not_ready=Aviso: o PDF ainda não está totalmente carregado.
+web_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF incorporados.
+document_colors_disabled=Os documentos PDF não permitem a utilização das suas próprias cores: \'Autorizar as páginas a escolher as suas próprias cores\' está desativado no navegador.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/rm/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/rm/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d6fbb8f108637cca368a16fdc2705d9cb7a72884
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/rm/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Quest document PDF na vegn eventualmain betg visualisà correctamain.
+open_with_different_viewer=Avrir cun in auter program
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/rm/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/rm/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4408cd386823ae33e68d2c617402482ba796466e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/rm/viewer.properties
@@ -0,0 +1,127 @@
+# 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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina precedenta
+previous_label=Enavos
+next.title=Proxima pagina
+next_label=Enavant
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pagina:
+page_of=da {{pageCount}}
+
+zoom_out.title=Empitschnir
+zoom_out_label=Empitschnir
+zoom_in.title=Engrondir
+zoom_in_label=Engrondir
+zoom.title=Zoom
+print.title=Stampar
+print_label=Stampar
+presentation_mode.title=Midar en il modus da preschentaziun
+presentation_mode_label=Modus da preschentaziun
+open_file.title=Avrir datoteca
+open_file_label=Avrir
+print.title=Stampar
+print_label=Stampar
+download.title=Telechargiar
+download_label=Telechargiar
+bookmark.title=Vista actuala (copiar u avrir en ina nova fanestra)
+bookmark_label=Vista actuala
+
+# Secondary toolbar and context menu
+tools.title=Utensils
+tools_label=Utensils
+first_page.title=Siglir a l'emprima pagina
+first_page.label=Siglir a l'emprima pagina
+first_page_label=Siglir a l'emprima pagina
+last_page.title=Siglir a la davosa pagina
+last_page.label=Siglir a la davosa pagina
+last_page_label=Siglir a la davosa pagina
+page_rotate_cw.title=Rotar en direcziun da l'ura
+page_rotate_cw.label=Rotar en direcziun da l'ura
+page_rotate_cw_label=Rotar en direcziun da l'ura
+page_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura
+page_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura
+page_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Activar/deactivar la trav laterala
+toggle_sidebar_label=Activar/deactivar la trav laterala
+outline.title=Mussar la structura da la pagina
+outline_label=Structura da la pagina
+thumbs.title=Mussar las miniaturas
+thumbs_label=Miniaturas
+findbar.title=Tschertgar en il document
+findbar_label=Tschertgar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da la pagina {{page}}
+
+# Find panel button title and messages
+find_label=Tschertgar:
+find_previous.title=Tschertgar la posiziun precedenta da l'expressiun
+find_previous_label=Enavos
+find_next.title=Tschertgar la proxima posiziun da l'expressiun
+find_next_label=Enavant
+find_highlight=Relevar tuts
+find_match_case_label=Resguardar maiusclas/minusclas
+find_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document
+find_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document
+find_not_found=Impussibel da chattar l'expressiun
+
+
+# Error panel labels
+error_more_info=Dapli infurmaziuns
+error_less_info=Damain infurmaziuns
+error_close=Serrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Messadi: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datoteca: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Lingia: {{line}}
+rendering_error=Ina errur è cumparida cun visualisar questa pagina.
+
+# Predefined zoom values
+page_scale_width=Ladezza da la pagina
+page_scale_fit=Entira pagina
+page_scale_auto=Zoom automatic
+page_scale_actual=Grondezza actuala
+
+# Loading indicator messages
+loading_error_indicator=Errur
+loading_error=Ina errur è cumparida cun chargiar il PDF.
+invalid_file_error=Datoteca PDF nunvalida u donnegiada.
+missing_file_error=Datoteca PDF manconta.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Annotaziun da {{type}}]
+request_password=Quest PDF è protegì cun in pled-clav:
+invalid_password=Pled-clav nunvalid.
+
+printing_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.
+printing_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar.
+web_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.
+document_colors_disabled=Documents da PDF na pon betg utilisar lur atgnas colurs: \'Permetter a las paginas d'utilisar lur atgnas colurs empè da las colurs tschernidas survart\' è deactivà en il navigatur.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ro/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ro/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0d31aafaec3cd23259de84453c77f16f346b4388
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ro/chrome.properties
@@ -0,0 +1,27 @@
+# Translator(s):
+#
+# Alexandru Szasz <alexxed@gmail.com>
+#
+# Reviewer(s):
+#
+# Alexandru Szasz <alexxed@gmail.com>
+#
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Acest document PDF ar putea să nu fie afișat corect.
+open_with_different_viewer=Deschide cu alt vizualizator
+open_with_different_viewer.accessKey=o
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ro/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ro/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..88c676c1dcf267dccbc4392fed51dffb4707b3d1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ro/viewer.properties
@@ -0,0 +1,156 @@
+# Translator(s):
+#
+# silviubogan <silviubogan@yahoo.com>
+# Alexandru Szasz <alexxed@gmail.com>
+# Laudatti <Laudatti@gmail.com>
+# raulmalea <raul.malea@gmail.com>
+# Marin Bînzari <spartakusmd@gmail.com>
+# strainu <narro@strainu.ro>
+# manuelciosici <manuelrciosici@gmail.com>
+# anonymous <anonymous@n.a>
+# alexef <alex@eftimie.ro>
+# Cristian Silaghi <cristian.silaghi@mozilla.ro>
+#
+# Reviewer(s):
+#
+# Alexandru Szasz <alexxed@gmail.com>
+# raulmalea <raul.malea@gmail.com>
+# Cristian Silaghi <cristian.silaghi@mozilla.ro>
+#
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina precedentă
+previous_label=ÃŽnapoi
+next.title=Pagina următoare
+next_label=ÃŽnainte
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pagină:
+page_of=din {{pageCount}}
+
+zoom_out.title=Depărtează
+zoom_out_label=Depărtează
+zoom_in.title=Apropie
+zoom_in_label=Apropie
+zoom.title=Panoramează
+presentation_mode.title=Schimbă la modul de prezentare
+presentation_mode_label=Mod de prezentare
+open_file.title=Deschide un fișier
+open_file_label=Deschide
+print.title=Tipărește
+print_label=Tipărește
+download.title=Descarcă
+download_label=Descarcă
+bookmark.title=Vizualizare curentă (copiați sau deschideți într-o fereastră nouă)
+bookmark_label=Vizualizare curentă
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Mergeți la prima pagină
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Mergi la ultima pagină
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotește în sensul acelor de ceasornic
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Counterclockwise
+page_rotate_ccw.label=Rotate Counter-Clockwise
+page_rotate_ccw_label=Rotate Counterclockwise
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Comută bara laterală
+toggle_sidebar_label=Comută bara laterală
+outline.title=Arată schița documentului
+outline_label=Schiță document
+thumbs.title=Arată miniaturi
+thumbs_label=Miniaturi
+findbar.title=Caută în document
+findbar_label=Căutați
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura paginii {{page}}
+
+# Find panel button title and messages
+find_label=Caută:
+find_previous.title=Găsește instanța anterioară în frază
+find_previous_label=Anterior
+find_next.title=Găstește următoarea instanță în frază
+find_next_label=Următor
+find_highlight=Evidențiază aparițiile
+find_match_case_label=Potrivire litere
+find_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit
+find_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început
+find_not_found=Nu s-a găsit textul
+
+# Error panel labels
+error_more_info=Mai multe informații
+error_less_info=Mai puțină informație
+error_close=ÃŽnchide
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (varianta: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesaj: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stivă: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fișier: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linie: {{line}}
+rendering_error=A intervenit o eroare la afișarea paginii.
+
+# Predefined zoom values
+page_scale_width=Lățime pagină
+page_scale_fit=Potrivire la pagină
+page_scale_auto=Dimensiune automată
+page_scale_actual=Dimensiune reală
+
+# Loading indicator messages
+loading_error_indicator=Eroare
+loading_error=A intervenit o eroare la încărcarea fișierului PDF.
+invalid_file_error=Fișier PDF invalid sau deteriorat.
+missing_file_error=Fișier PDF lipsă.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Adnotare]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+password_cancel=Cancel
+
+printing_not_supported=Atenție: Tipărirea nu este suportată în totalitate de acest navigator.
+printing_not_ready=Avertisment: Fișierul PDF nu este încărcat complet pentru tipărire.
+web_fonts_disabled=Fonturile web sunt dezactivate: nu pot utiliza fonturile PDF încorporate.
+document_colors_disabled=Documentele PDF nu sunt autorizate să folosească propriile culori: \'Permite paginilor să aleagă propriile culori\' este dezactivată în navigator.
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ru/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ru/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ba3041ff976d13eddb87de0f6fa705358882712c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ru/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+unsupported_feature = Этот документ PDF может отображаться некорректно.
+unsupported_feature_forms = Этот документ PDF содержит формы. Заполнение полей форм не поддерживается.
+open_with_different_viewer = Открыть в другой программе просмотра
+open_with_different_viewer.accessKey = Ñ‹
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ru/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ru/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..147392088c6da7a827697668cc536f7798c1fe71
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ru/viewer.properties
@@ -0,0 +1,107 @@
+# 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/.
+
+previous.title = Предыдущая страница
+previous_label = Предыдущая
+next.title = Следующая страница
+next_label = Следующая
+page_label = Страница:
+page_of = из {{pageCount}}
+zoom_out.title = Уменьшить
+zoom_out_label = Уменьшить
+zoom_in.title = Увеличить
+zoom_in_label = Увеличить
+zoom.title = Масштаб
+presentation_mode.title = Перейти в режим презентации
+presentation_mode_label = Режим презентации
+open_file.title = Открыть файл
+open_file_label = Открыть
+print.title = Печать
+print_label = Печать
+download.title = Загрузить
+download_label = Загрузить
+bookmark.title = Ссылка на текущий вид (скопировать или открыть в новом окне)
+bookmark_label = Текущий вид
+tools.title = Инструменты
+tools_label = Инструменты
+first_page.title = Перейти на первую страницу
+first_page.label = Перейти на первую страницу
+first_page_label = Перейти на первую страницу
+last_page.title = Перейти на последнюю страницу
+last_page.label = Перейти на последнюю страницу
+last_page_label = Перейти на последнюю страницу
+page_rotate_cw.title = Повернуть по часовой стрелке
+page_rotate_cw.label = Повернуть по часовой стрелке
+page_rotate_cw_label = Повернуть по часовой стрелке
+page_rotate_ccw.title = Повернуть против часовой стрелки
+page_rotate_ccw.label = Повернуть против часовой стрелки
+page_rotate_ccw_label = Повернуть против часовой стрелки
+hand_tool_enable.title = Включить Инструмент «Рука»
+hand_tool_enable_label = Включить Инструмент «Рука»
+hand_tool_disable.title = Отключить Инструмент «Рука»
+hand_tool_disable_label = Отключить Инструмент «Рука»
+document_properties.title = Свойства документа…
+document_properties_label = Свойства документа…
+document_properties_file_name = Имя файла:
+document_properties_file_size = Размер файла:
+document_properties_kb = {{size_kb}} КБ ({{size_b}} байт)
+document_properties_mb = {{size_mb}} МБ ({{size_b}} байт)
+document_properties_title = Заголовок:
+document_properties_author = Автор:
+document_properties_subject = Тема:
+document_properties_keywords = Ключевые слова:
+document_properties_creation_date = Дата создания:
+document_properties_modification_date = Дата изменения:
+document_properties_date_string = {{date}}, {{time}}
+document_properties_creator = Приложение:
+document_properties_producer = Производитель PDF:
+document_properties_version = Версия PDF:
+document_properties_page_count = Число страниц:
+document_properties_close = Закрыть
+toggle_sidebar.title = Открыть/закрыть боковую панель
+toggle_sidebar_label = Открыть/закрыть боковую панель
+outline.title = Показать содержание документа
+outline_label = Содержание документа
+thumbs.title = Показать миниатюры
+thumbs_label = Миниатюры
+findbar.title = Найти в документе
+findbar_label = Найти
+thumb_page_title = Страница {{page}}
+thumb_page_canvas = Миниатюра страницы {{page}}
+find_label = Найти:
+find_previous.title = Найти предыдущее вхождение фразы в текст
+find_previous_label = Назад
+find_next.title = Найти следующее вхождение фразы в текст
+find_next_label = Далее
+find_highlight = Подсветить все
+find_match_case_label = С учётом регистра
+find_reached_top = Достигнут верх документа, продолжено снизу
+find_reached_bottom = Достигнут конец документа, продолжено сверху
+find_not_found = Фраза не найдена
+error_more_info = Детали
+error_less_info = Скрыть детали
+error_close = Закрыть
+error_version_info = PDF.js v{{version}} (сборка: {{build}})
+error_message = Сообщение: {{message}}
+error_stack = Стeк: {{stack}}
+error_file = Файл: {{file}}
+error_line = Строка: {{line}}
+rendering_error = При создании страницы произошла ошибка.
+page_scale_width = По ширине страницы
+page_scale_fit = По размеру страницы
+page_scale_auto = Автоматически
+page_scale_actual = Реальный размер
+loading_error_indicator = Ошибка
+loading_error = При загрузке PDF произошла ошибка.
+invalid_file_error = Некорректный или повреждённый PDF-файл.
+missing_file_error = PDF-файл отсутствует.
+text_annotation_type.alt = [Аннотация {{type}}]
+password_label = Введите пароль, чтобы открыть этот PDF-файл.
+password_invalid = Неверный пароль. Пожалуйста, попробуйте снова.
+password_ok = OK
+password_cancel = Отмена
+printing_not_supported = Предупреждение: В этом браузере не полностью поддерживается печать.
+printing_not_ready = Предупреждение: PDF не полностью загружен для печати.
+web_fonts_disabled = Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты.
+document_colors_disabled = PDF-документам не разрешено использовать свои цвета: в браузере отключён параметр «Разрешить веб-сайтам использовать свои цвета».
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/rw/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/rw/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0b469195c29b67adef84a181aa4177b257cf3bb1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/rw/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=This PDF document might not be displayed correctly.
+open_with_different_viewer=Open With Different Viewer
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/rw/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/rw/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..993c48483433245581f6cdf19f2bed185869db2e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/rw/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Page:
+page_of=of {{pageCount}}
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Ihindurangano
+print.title=Print
+print_label=Print
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Gufungura Dosiye
+open_file_label=Gufungura
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_label=Toggle Sidebar
+outline.title=Show Document Outline
+outline_label=Document Outline
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Gushakisha
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Context menu
+first_page.label=Go to First Page
+last_page.label=Go to Last Page
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_ccw.label=Rotate Counterclockwise
+
+# Find panel button title and messages
+find_label="Gushaka:"
+find_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha
+find_previous_label=Previous
+find_next.title=Gushaka aho uyu murongo wongera kugaruka
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+find_not_found=Umurongo ntubonetse
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Gufunga
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+
+# Loading indicator messages
+loading_error_indicator=Ikosa
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type=[{{type}} Annotation]
+request_password=PDF is protected by a password:
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+web_colors_disabled=Web colors are disabled.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sah/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/sah/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..990cfef651a80e6cf3ca0ba47c516a282317991f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sah/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Бу PDF дөкүмүөн сыыһа көстүөн сөп.
+open_with_different_viewer=Атын бырагырааммаҕа арыйыы
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sah/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/sah/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..49d1f49ba5dc41197af627e96d5b90a76f51e5cd
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sah/viewer.properties
@@ -0,0 +1,122 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Инники сирэй
+previous_label=Иннинээҕи
+next.title=Аныгыскы сирэй
+next_label=Аныгыскы
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Сирэй:
+page_of=мантан {{pageCount}}
+
+zoom_out.title=Куччат
+zoom_out_label=Куччат
+zoom_in.title=Улаатыннар
+zoom_in_label=Улаатыннар
+zoom.title=Улаатыннар
+presentation_mode.title=Көрдөрөр эрэсиимҥэ
+presentation_mode_label=Көрдөрөр эрэсиим
+open_file.title=Билэни арый
+open_file_label=Ас
+print.title=Бэчээт
+print_label=Бэчээт
+download.title=Хачайдааһын
+download_label=Хачайдааһын
+bookmark.title=Билиҥҥи көстүүтэ (хатылаа эбэтэр саҥа түннүккэ арый)
+bookmark_label=Билиҥҥи көстүүтэ
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=Баһа:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Ойоҕос хапталы арый/сап
+toggle_sidebar_label=Ойоҕос хапталы арый/сап
+outline.title=Дөкүмүөн иһинээҕитин көрдөр
+outline_label=Дөкүмүөн иһинээҕитэ
+thumbs.title=Ойуучааннары көрдөр
+thumbs_label=Ойуучааннар
+findbar.title=Дөкүмүөнтэн бул
+findbar_label=Бул
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Сирэй {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Сирэй ойуучаана {{page}}
+
+# Find panel button title and messages
+find_label=Бул:
+find_previous.title=Этии тиэкискэ бу иннинээҕи киириитин бул
+find_previous_label=Иннинээҕи
+find_next.title=Этии тиэкискэ бу кэннинээҕи киириитин бул
+find_next_label=Аныгыскы
+find_highlight=Барытын сырдатан көрдөр
+find_match_case_label=Буукуба улаханын-кыратын араар
+find_reached_top=Сирэй үрдүгэр тиийдиҥ, салгыыта аллара
+find_reached_bottom=Сирэй бүттэ, үөһэ салҕанна
+find_not_found=Этии көстүбэтэ
+
+# Error panel labels
+error_more_info=Сиһилии
+error_less_info=Сиһилиитин кистээ
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (хомуйуута: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Этии: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Стeк: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Билэ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Устуруока: {{line}}
+rendering_error=Сирэйи айарга алҕас таҕыста.
+
+# Predefined zoom values
+page_scale_width=Сирэй кэтитинэн
+page_scale_fit=Сирэй кээмэйинэн
+page_scale_auto=Аптамаатынан
+page_scale_actual=Дьиҥнээх кээмэйэ
+
+# Loading indicator messages
+loading_error_indicator=Алҕас
+loading_error=PDF-билэни хачайдыырга алҕас таҕыста.
+invalid_file_error=Туох эрэ алҕастаах эбэтэр алдьаммыт PDF-билэ.
+missing_file_error=PDF-билэ суох.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} туһунан]
+password_cancel=Салҕаама
+
+printing_not_supported=Сэрэтии: Бу браузер бэчээттиири толору өйөөбөт.
+printing_not_ready=Сэрэтии: PDF бэчээттииргэ толору хачайдана илик.
+web_fonts_disabled=Ситим-бичиктэр араарыллыахтара: PDF бичиктэрэ кыайан көстүбэттэр.
+document_colors_disabled=PDF-дөкүмүөүннэргэ бэйэлэрин өҥнөрүн туттар көҥүллэммэтэ: "Ситим-сирдэр бэйэлэрин өҥнөрүн тутталларын көҥүллүүргэ" диэн браузерга арахса сылдьар эбит.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/si/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/si/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1516770ba5eed6a16c84509c0f14833a8f48ef42
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/si/chrome.properties
@@ -0,0 +1,17 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=මෙම PDF ලේඛනය නිසි ලෙස දර්ශනය නොවිය හැක.
+open_with_different_viewer=වෙනස් දසුනක් සමඟ විවෘත කරන්න
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/si/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/si/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..21ef93f45329d5b39334cec0d437f1bb036cc48f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/si/viewer.properties
@@ -0,0 +1,98 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=මීට පෙර පිටුව
+next.title=මීළඟ පිටුව
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=පිටුව:
+page_of={{pageCount}} කින්
+
+zoom_out.title=කුඩා කරන්න
+zoom_out_label=කුඩා කරන්න
+zoom_in.title=විශාල කරන්න
+zoom_in_label=විශාල කරන්න
+zoom.title=විශාලණය
+open_file.title=ගොනුව විවෘත කරන්න
+open_file_label=විවෘත කරන්න
+print.title=මුද්‍රණය
+print_label=මුද්‍රණය
+download.title=බාගන්න
+download_label=බාගන්න
+bookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න)
+bookmark_label=දැනට ඇති දසුන
+
+# Secondary toolbar and context menu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=ලේඛනයේ පිට මායිම පෙන්වන්න
+outline_label=ලේඛනයේ පිට මායිම
+thumbs.title=සිඟිති රූ පෙන්වන්න
+thumbs_label=සිඟිති රූ
+findbar_label=සොයන්න
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=පිටුව {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}}
+
+# Find panel button title and messages
+find_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න
+find_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න
+find_not_found=ඔබ සෙව් වචන හමු නොවීය
+
+# Error panel labels
+error_more_info=බොහෝ තොරතුරු
+error_less_info=අවම තොරතුරු
+error_close=වසන්න
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=පණිවිඩය: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ගොනුව: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=පේළිය: {{line}}
+rendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි.
+
+# Predefined zoom values
+page_scale_width=පිටුවේ පළල
+page_scale_fit=පිටුවට සුදුසු ලෙස
+page_scale_auto=ස්වයංක්‍රීය විශාලණය
+page_scale_actual=නියමිත ප්‍රමාණය
+
+# Loading indicator messages
+loading_error_indicator=දෝෂය
+loading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} විස්තරය]
+request_password=PDF මුරපදයක් මඟින් ආරක්ෂිතයි:
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sk/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/sk/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..44fdd6ed89d641b68844d3c29ce10467a3d00593
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sk/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Tento dokument PDF sa nemusí zobrazovať správne.
+unsupported_feature_forms=Tento dokument PDF obsahuje formuláre. Vypĺňanie polí formulárov nie je podporované.
+open_with_different_viewer=Otvoriť pomocou externého programu
+open_with_different_viewer.accessKey=O
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sk/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/sk/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..530dc944192c70b93c3c671a4ac41a6365d8b6af
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sk/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Predchádzajúca strana
+previous_label=Predchádzajúca
+next.title=Nasledujúca strana
+next_label=Nasledujúca
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Strana:
+page_of=z {{pageCount}}
+
+zoom_out.title=Vzdialiť
+zoom_out_label=Vzdialiť
+zoom_in.title=Priblížiť
+zoom_in_label=Priblížiť
+zoom.title=Lupa
+presentation_mode.title=Prepnúť na režim Prezentácia
+presentation_mode_label=Režim Prezentácia
+open_file.title=Otvoriť súbor
+open_file_label=Otvoriť
+print.title=Tlačiť
+print_label=Tlačiť
+download.title=Prevziať
+download_label=Prevziať
+bookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne)
+bookmark_label=Aktuálne zobrazenie
+
+# Secondary toolbar and context menu
+tools.title=Nástroje
+tools_label=Nástroje
+first_page.title=Prejsť na prvú stranu
+first_page.label=Prejsť na prvú stranu
+first_page_label=Prejsť na prvú stranu
+last_page.title=Prejsť na poslednú stranu
+last_page.label=Prejsť na poslednú stranu
+last_page_label=Prejsť na poslednú stranu
+page_rotate_cw.title=Otočiť v smere hodinových ručičiek
+page_rotate_cw.label=Otočiť v smere hodinových ručičiek
+page_rotate_cw_label=Otočiť v smere hodinových ručičiek
+page_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek
+page_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek
+page_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek
+
+hand_tool_enable.title=Zapnúť nástroj Ruka
+hand_tool_enable_label=Zapnúť nástroj Ruka
+hand_tool_disable.title=Vypnúť nástroj Ruka
+hand_tool_disable_label=Vypnúť nástroj Ruka
+
+# Document properties dialog box
+document_properties.title=Vlastnosti dokumentu…
+document_properties_label=Vlastnosti dokumentu…
+document_properties_file_name=Názov súboru:
+document_properties_file_size=Veľkosť súboru:
+document_properties_kb={{size_kb}} kB ({{size_b}} bajtov)
+document_properties_mb={{size_mb}} MB ({{size_b}} bajtov)
+document_properties_title=Názov:
+document_properties_author=Autor:
+document_properties_subject=Predmet:
+document_properties_keywords=Kľúčové slová:
+document_properties_creation_date=Dátum vytvorenia:
+document_properties_modification_date=Dátum úpravy:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Vytvoril:
+document_properties_producer=Tvorca PDF:
+document_properties_version=Verzia PDF:
+document_properties_page_count=Počet strán:
+document_properties_close=Zavrieť
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Prepnúť bočný panel
+toggle_sidebar_label=Prepnúť bočný panel
+outline.title=Zobraziť prehľad dokumentu
+outline_label=Prehľad documentu
+thumbs.title=Zobraziť miniatúry
+thumbs_label=Miniatúry
+findbar.title=Hľadať v dokumente
+findbar_label=Hľadať
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strana {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatúra strany {{page}}
+
+# Find panel button title and messages
+find_label=Hľadať:
+find_previous.title=Vyhľadať predchádzajúci výskyt reťazca
+find_previous_label=Predchádzajúce
+find_next.title=Vyhľadať ďalší výskyt reťazca
+find_next_label=Ďalšie
+find_highlight=Zvýrazniť všetky
+find_match_case_label=Rozlišovať malé/veľké písmená
+find_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca
+find_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku
+find_not_found=Výraz nebol nájdený
+
+# Error panel labels
+error_more_info=Viac informácií
+error_less_info=Menej informácií
+error_close=Zavrieť
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (zostavenie: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Správa: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Zásobník: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Súbor: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Riadok: {{line}}
+rendering_error=Pri vykresľovaní stránky sa vyskytla chyba.
+
+# Predefined zoom values
+page_scale_width=Na šírku strany
+page_scale_fit=Na veľkosť strany
+page_scale_auto=Automatická veľkosť
+page_scale_actual=Skutočná veľkosť
+
+# Loading indicator messages
+loading_error_indicator=Chyba
+loading_error=Počas načítavania dokumentu PDF sa vyskytla chyba.
+invalid_file_error=Neplatný alebo poškodený súbor PDF.
+missing_file_error=Chýbajúci súbor PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotácia typu {{type}}]
+password_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo.
+password_invalid=Heslo nie je platné. Skúste to znova.
+password_ok=OK
+password_cancel=Zrušiť
+
+printing_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná.
+printing_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač.
+web_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF.
+document_colors_disabled=Dokumenty PDF nemajú povolené používať vlastné farby, pretože voľba \'Povoliť stránkam používať vlastné farby\' je v nastaveniach prehliadača vypnutá.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sl/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/sl/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3b23ba186e9e8d739ff94f81d0af4c12c3eebfc7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sl/chrome.properties
@@ -0,0 +1,8 @@
+# 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/.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ta dokument PDF morda ni pravilno prikazan.
+open_with_different_viewer=Odpri z drugim prikazovalnikom
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sl/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/sl/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e2fc675b93b8d4296b2e6ef023c72560bc2055f4
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sl/viewer.properties
@@ -0,0 +1,136 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Prejšnja stran
+previous_label=Nazaj
+next.title=Naslednja stran
+next_label=Naprej
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Stran:
+page_of=od {{pageCount}}
+
+zoom_out.title=Pomanjšaj
+zoom_out_label=Pomanjšaj
+zoom_in.title=Povečaj
+zoom_in_label=Povečaj
+zoom.title=Povečava
+presentation_mode.title=Preklopi v način predstavitve
+presentation_mode_label=Način predstavitve
+open_file.title=Odpri datoteko
+open_file_label=Odpri
+print.title=Natisni
+print_label=Natisni
+download.title=Prenesi
+download_label=Prenesi
+bookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu)
+bookmark_label=Trenutni pogled
+
+# Secondary toolbar and context menu
+tools.title=Orodja
+tools_label=Orodja
+first_page.title=Pojdi na prvo stran
+first_page.label=Pojdi na prvo stran
+first_page_label=Pojdi na prvo stran
+last_page.title=Pojdi na zadnjo stran
+last_page.label=Pojdi na zadnjo stran
+last_page_label=Pojdi na zadnjo stran
+page_rotate_cw.title=Zavrti v smeri urninega kazalca
+page_rotate_cw.label=Zavrti v smeri urninega kazalca
+page_rotate_cw_label=Zavrti v smeri urninega kazalca
+page_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca
+page_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca
+page_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Preklopi stransko vrstico
+toggle_sidebar_label=Preklopi stransko vrstico
+outline.title=Prikaži oris dokumenta
+outline_label=Oris dokumenta
+thumbs.title=Prikaži sličice
+thumbs_label=Sličice
+findbar.title=Iskanje po dokumentu
+findbar_label=Iskanje
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Stran {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Sličica strani {{page}}
+
+# Find panel button title and messages
+find_label=Najdi:
+find_previous.title=Najdi prejšnjo ponovitev iskanega
+find_previous_label=Najdi nazaj
+find_next.title=Najdi naslednjo ponovitev iskanega
+find_next_label=Najdi naprej
+find_highlight=Označi vse
+find_match_case_label=Razlikuj velike/male črke
+find_reached_top=Dosežen začetek dokumenta iz smeri konca
+find_reached_bottom=Doseženo konec dokumenta iz smeri začetka
+find_not_found=Iskanega ni mogoče najti
+
+# Error panel labels
+error_more_info=Več informacij
+error_less_info=Manj informacij
+error_close=Zapri
+# LOCALIZATION NOTE (error_build): "{{build}}" will be replaced by the PDF.JS
+# build ID.
+error_version_info=PDF.js r{{version}} (graditev: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Sporočilo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Sklad: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datoteka: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Vrstica: {{line}}
+rendering_error=Med pripravljanjem strani je prišlo do napake!
+
+# Predefined zoom values
+page_scale_width=Å irina strani
+page_scale_fit=Prilagodi stran
+page_scale_auto=Samodejno
+page_scale_actual=Dejanska velikost
+
+# Loading indicator messages
+loading_error_indicator=Napaka
+loading_error=Med nalaganjem datoteke PDF je prišlo do napake.
+invalid_file_error=Neveljavna ali pokvarjena datoteka PDF.
+missing_file_error=Ni datoteke PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Opomba vrste {{type}}]
+password_label=Vnesite geslo za odpiranje te datoteke PDF.
+password_invalid=Neveljavno geslo. Poskusite znova.
+password_ok=V redu
+password_cancel=Prekliči
+
+printing_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja.
+printing_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje.
+web_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti.
+document_colors_disabled=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: možnost \'Dovoli stranem uporabo lastnih barv\' je v brskalniku onemogočena.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/son/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/son/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2dc99eaddb411c9695a08a006f30d21c78567893
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/son/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=A ga hin ka tee PDF takaddaa woo ši cebandi ka boori.
+open_with_different_viewer=Feeri nda guna jinay tana
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/son/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/son/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..83f2b8ca76451ab122c8ffad2b647448d8e3701a
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/son/viewer.properties
@@ -0,0 +1,120 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Moo bisante
+previous_label=Bisante
+next.title=Jinehere moo
+next_label=Jine
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=&Moo:
+page_of={{pageCount}} ga
+
+zoom_out.title=Nakasandi
+zoom_out_label=Nakasandi
+zoom_in.title=Bebbeerandi
+zoom_in_label=Bebbeerandi
+zoom.title=Bebbeerandi
+presentation_mode.title=Bere cebeyan alhaali
+presentation_mode_label=Cebeyan alhaali
+open_file.title=Tuku feeri
+open_file_label=Feeri
+print.title=Kar
+print_label=Kar
+download.title=Zumandi
+download_label=Zumandi
+bookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra)
+bookmark_label=Sohõ gunaroo
+
+# Secondary toolbar and context menu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Kanjari ceraw zuu
+toggle_sidebar_label=Kanjari ceraw zuu
+outline.title=Takadda filla-boŋ cebe
+outline_label=Takadda filla-boŋ
+thumbs.title=Kabeboy biyey cebe
+thumbs_label=Kabeboy biyey
+findbar.title=Ceeci takaddaa ra
+findbar_label=Ceeci
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} moo
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Kabeboy bii {{page}} moo še
+
+# Find panel button title and messages
+find_label=Ceeci:
+find_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci
+find_previous_label=Bisante
+find_next.title=Kalimaɲaŋoo hiino bangayroo ceeci
+find_next_label=Jine
+find_highlight=Ikul šilbay
+find_match_case_label=Harfu-beeriyan hawgay
+find_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo
+find_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga
+find_not_found=Kalimaɲaa mana duwandi
+
+# Error panel labels
+error_more_info=Alhabar tontoni
+error_less_info=Alhabar tontoni
+error_close=Daabu
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Alhabar:  {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Dekeri: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Tuku: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Žeeri: {{line}}
+rendering_error=Firka bangay kaŋ moɲoo goo ma willandi.
+
+# Predefined zoom values
+page_scale_width=Mooo hayyan
+page_scale_fit=Moo sawayan
+page_scale_auto=Boŋše azzaati barmayyan
+page_scale_actual=Adadu cimi
+
+# Loading indicator messages
+loading_error_indicator=Firka
+loading_error=Firka bangay kaŋ PDF goo ma zumandi.
+invalid_file_error=PDF tuku laala wala laybante.
+missing_file_error=PDF tuku kumante.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt={{type}} maasa-caw]
+password_ok=Ayyo
+password_cancel=Naŋ
+
+printing_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo.
+printing_not_ready=Yaamar: PDF ši zunbu ka timme karyan še.
+web_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey.
+document_colors_disabled=PDF takaddawey ši duu fondo ka ngey boŋ noonawey zaa: 'Naŋ moɲey ma ngey boŋ noonawey suuba' ši dira ceecikaa ga.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sq/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/sq/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..50c9ca72512724a00e9c0aa996f1c5908b7c8088
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sq/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Ky dokument PDF mund të mos jetë shfaqur si duhet.
+unsupported_feature_forms=Ky dokument PDF përmban formularë. Plotësimi i fushave të formularëve nuk mbulohet.
+open_with_different_viewer=Hapeni me një Parës Tjetër
+open_with_different_viewer.accessKey=H
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sq/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/sq/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..4647ca686bc1615115704bff518d54041a2f45f2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sq/viewer.properties
@@ -0,0 +1,160 @@
+# 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/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Faqja e Mëparshme
+previous_label=E mëparshmja
+next.title=Faqja Pasuese
+next_label=Pasuesja
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Faqja:
+page_of=nga {{pageCount}}
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+print.title=Shtype
+print_label=Shtypeni
+presentation_mode.title=Kalo te Mënyra Paraqitje
+presentation_mode_label=Mënyra Paraqitje
+open_file.title=Hapni Kartelë
+open_file_label=Hapeni
+download.title=Shkarkim
+download_label=Shkarkojeni
+bookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re)
+bookmark_label=Pamja e Tanishme
+
+# Secondary toolbar and context menu
+tools.title=Mjete
+tools_label=Mjete
+first_page.title=Shkoni te Faqja e Parë
+first_page.label=Shkoni te Faqja e Parë
+first_page_label=Shkoni te Faqja e Parë
+last_page.title=Shkoni te Faqja e Fundit
+last_page.label=Shkoni te Faqja e Fundit
+last_page_label=Shkoni te Faqja e Fundit
+page_rotate_cw.title=Rrotullojeni Në Kahun Orar
+page_rotate_cw.label=Rrotullojeni Në Kahun Orar
+page_rotate_cw_label=Rrotullojeni Në Kahun Orar
+page_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar
+page_rotate_ccw.label=Rrotullojeni Në Kahun Kundërorar
+page_rotate_ccw_label=Rrotullojeni Në Kahun Kundërorar
+
+hand_tool_enable.title=Aktivizoni mjet dore
+hand_tool_enable_label=Aktivizoni mjet dore
+hand_tool_disable.title=Çaktivizoni mjet dore
+hand_tool_disable_label=Çaktivizoni mjet dore
+
+# Document properties dialog box
+document_properties.title=Veti Dokumenti…
+document_properties_label=Veti Dokumenti…
+document_properties_file_name=Emër kartele:
+document_properties_file_size=Madhësi kartele:
+document_properties_kb={{size_kb}} KB ({{size_b}} bajte)
+document_properties_mb={{size_mb}} MB ({{size_b}} bajte)
+document_properties_title=Titull:
+document_properties_author=Autor:
+document_properties_subject=Subjekt:
+document_properties_keywords=Fjalëkyçe:
+document_properties_creation_date=Datë Krijimi:
+document_properties_modification_date=Datë Ndryshimi:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Krijues:
+document_properties_producer=Prodhues PDF-je:
+document_properties_version=Version PDF-je:
+document_properties_page_count=Numër Faqesh:
+document_properties_close=Mbylle
+
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Shfaqni/Fshihni Anështyllën
+toggle_sidebar_label=Shfaqni/Fshihni Anështyllën
+
+outline.title=Shfaq Përvijim Dokumenti
+outline_label=Shfaq Përvijim Dokumenti
+thumbs.title=Shfaq Miniatura
+thumbs_label=Miniatura
+findbar.title=Gjej në Dokument
+findbar_label=Gjej
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Faqja {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniaturë e Faqes {{page}}
+
+# Context menu
+first_page.label=Kalo te Faqja e Parë
+last_page.label=Kalo te Faqja e Fundit
+page_rotate_cw.label=Rrotulloje Në Kahun Orar
+page_rotate_ccw.label=Rrotulloje Në Kahun Antiorar
+
+# Find panel button title and messages
+find_label=Gjej:
+find_previous.title=Gjeni hasjen e mëparshme të togfjalëshit
+find_previous_label=E mëparshmja
+find_next.title=Gjeni hasjen pasuese të togfjalëshit
+find_next_label=Pasuesja
+find_highlight=Theksoji të gjitha
+find_match_case_label=Siç është shkruar
+find_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit
+find_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut
+find_not_found=Nuk u gjet togfjalëshi
+
+# Error panel labels
+error_more_info=Më Tepër të Dhëna
+error_less_info=Më Pak të Dhëna
+error_close=Mbylle
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesazh: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Kartelë: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rresht: {{line}}
+rendering_error=Ndodhi një gabim gjatë riprodhimit të faqes.
+
+# Predefined zoom values
+page_scale_width=Gjerësi Faqeje
+page_scale_fit=Sa Nxë Faqja
+page_scale_auto=Zoom i Vetvetishëm
+page_scale_actual=Madhësia Faktike
+
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+loading_error_indicator=Gabim
+loading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së.
+invalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar.
+missing_file_error=Kartelë PDF që mungon.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Nënvizim {{type}}]
+password_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF.
+password_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni.
+password_ok=OK
+password_cancel=Anuloje
+
+printing_not_supported=Kujdes: Shtypja nuk mbulohet plotësisht nga ky shfletues.
+printing_not_ready=Kujdes: PDF-ja nuk është ngarkuar plotësisht që ta shtypni.
+web_fonts_disabled=Shkronjat Web janë të çaktivizuara: i pazoti të përdorë shkronja të trupëzuara në PDF.
+document_colors_disabled=Dokumenteve PDF nuk u është lejuar të përdorin ngjyrat e veta: \'Lejoji faqet t&apos;i zgjedhin vetë ngjyrat\', te shfletuesi, është e çaktivizuar.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sr/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/sr/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..0b469195c29b67adef84a181aa4177b257cf3bb1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sr/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=This PDF document might not be displayed correctly.
+open_with_different_viewer=Open With Different Viewer
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sr/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/sr/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a3c5c92f886ebf050a98ef7b423f547925264a39
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sr/viewer.properties
@@ -0,0 +1,123 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Страна:
+page_of=of {{pageCount}}
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Увећај
+print.title=Print
+print_label=Print
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Отвори датотеку
+open_file_label=Отвори
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_label=Toggle Sidebar
+outline.title=Show Document Outline
+outline_label=Document Outline
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Context menu
+first_page.label=Go to First Page
+last_page.label=Go to Last Page
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_ccw.label=Rotate Counterclockwise
+
+# Find panel button title and messages
+find_label=Пронађи:
+find_previous.title=Пронађи претходну појаву фразе
+find_previous_label=Previous
+find_next.title=Налази наредну појаву фразе
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+find_not_found=Фраза није пронађена
+
+# Error panel labels
+error_more_info=Више података
+error_less_info=Less Information
+error_close=Затвори
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+
+# Loading indicator messages
+loading_error_indicator=Грешка
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type=[{{type}} Annotation]
+request_password=PDF is protected by a password:
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+web_colors_disabled=Web colors are disabled.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sv-SE/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/sv-SE/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..aac1087cb540e9689a957acc8bb7b7148dee16ce
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sv-SE/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Det här PDF-dokumentet kanske inte visas på rätt sätt.
+unsupported_feature_forms=Det här PDF-dokumentet innehåller formulär. Ifyllnad av formulärfält stöds inte.
+open_with_different_viewer=Öppna med ett annat visningsprogram
+open_with_different_viewer.accessKey=Ö
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sv-SE/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/sv-SE/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2c5c7e35e5e37e246f5ca2381055f4b95f09733c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sv-SE/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Föregående sida
+previous_label=Föregående
+next.title=Nästa sida
+next_label=Nästa
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Sida:
+page_of=av {{pageCount}}
+
+zoom_out.title=Zooma ut
+zoom_out_label=Zooma ut
+zoom_in.title=Zooma in
+zoom_in_label=Zooma in
+zoom.title=Zoom
+presentation_mode.title=Byt till presentationsläge
+presentation_mode_label=Presentationsläge
+open_file.title=Öppna fil
+open_file_label=Öppna
+print.title=Skriv ut
+print_label=Skriv ut
+download.title=Hämta
+download_label=Hämta
+bookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster)
+bookmark_label=Aktuell vy
+
+# Secondary toolbar and context menu
+tools.title=Verktyg
+tools_label=Verktyg
+first_page.title=Gå till första sidan
+first_page.label=Gå till första sidan
+first_page_label=Gå till första sidan
+last_page.title=GÃ¥ till sista sidan
+last_page.label=GÃ¥ till sista sidan
+last_page_label=GÃ¥ till sista sidan
+page_rotate_cw.title=Rotera medurs
+page_rotate_cw.label=Rotera medurs
+page_rotate_cw_label=Rotera medurs
+page_rotate_ccw.title=Rotera moturs
+page_rotate_ccw.label=Rotera moturs
+page_rotate_ccw_label=Rotera moturs
+
+hand_tool_enable.title=Aktivera handverktyg
+hand_tool_enable_label=Aktivera handverktyg
+hand_tool_disable.title=Inaktivera handverktyg
+hand_tool_disable_label=Inaktivera handverktyg
+
+# Document properties dialog box
+document_properties.title=Dokumentegenskaper…
+document_properties_label=Dokumentegenskaper…
+document_properties_file_name=Filnamn:
+document_properties_file_size=Filstorlek:
+document_properties_kb={{size_kb}} kB ({{size_b}} byte)
+document_properties_mb={{size_mb}} MB ({{size_b}} byte)
+document_properties_title=Titel:
+document_properties_author=Författare:
+document_properties_subject=Ämne:
+document_properties_keywords=Nyckelord:
+document_properties_creation_date=Skapades:
+document_properties_modification_date=Ändrades:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Skapare:
+document_properties_producer=PDF-producent:
+document_properties_version=PDF-version:
+document_properties_page_count=Sidantal:
+document_properties_close=Stäng
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Visa/dölj sidofält
+toggle_sidebar_label=Visa/dölj sidofält
+outline.title=Visa dokumentöversikt
+outline_label=Dokumentöversikt
+thumbs.title=Visa miniatyrer
+thumbs_label=Miniatyrer
+findbar.title=Sök i dokument
+findbar_label=Sök
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Sida {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatyr av sida {{page}}
+
+# Find panel button title and messages
+find_label=Sök:
+find_previous.title=Hitta föregående förekomst av frasen
+find_previous_label=Föregående
+find_next.title=Hitta nästa förekomst av frasen
+find_next_label=Nästa
+find_highlight=Markera alla
+find_match_case_label=Matcha versal/gemen
+find_reached_top=Nådde början av dokumentet, började från slutet
+find_reached_bottom=Nådde slutet på dokumentet, började från början
+find_not_found=Frasen hittades inte
+
+# Error panel labels
+error_more_info=Mer information
+error_less_info=Mindre information
+error_close=Stäng
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Meddelande: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rad: {{line}}
+rendering_error=Ett fel uppstod vid visning av sidan.
+
+# Predefined zoom values
+page_scale_width=Sidbredd
+page_scale_fit=Anpassa sida
+page_scale_auto=Automatisk zoom
+page_scale_actual=Verklig storlek
+
+# Loading indicator messages
+loading_error_indicator=Fel
+loading_error=Ett fel uppstod vid laddning av PDF-filen.
+invalid_file_error=Ogiltig eller korrupt PDF-fil.
+missing_file_error=Saknad PDF-fil.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-annotering]
+password_label=Skriv in lösenordet för att öppna PDF-filen.
+password_invalid=Ogiltigt lösenord. Försök igen.
+password_ok=OK
+password_cancel=Avbryt
+
+printing_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren.
+printing_not_ready=Varning: PDF:en är inte klar för utskrift.
+web_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt.
+document_colors_disabled=PDF-dokument tillåts inte använda egna färger: \'Låt sidor använda egna färger\' är inaktiverat i webbläsaren.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sw/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/sw/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..21e717e06a8ce66dc6b6c45d6cecf549d4452866
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sw/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Waraka huu wa PDF unaweza kuwa hauonyeshwi vizuri.
+open_with_different_viewer=Fungua Na Kiangaliaji Tofauti
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/sw/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/sw/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8f9f7dd8422e29174b380bfeb6ca096b7ac94f93
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/sw/viewer.properties
@@ -0,0 +1,121 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Ukurasa Uliotangulia
+previous_label=Iliyotangulia
+next.title=Ukurasa Ufuatao
+next_label=Ifuatayo
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Ukurasa:
+page_of=ya {{Hesabu ya ukurasa}}
+
+zoom_out.title=Kuza Nje
+zoom_out_label=Kuza Nje
+zoom_in.title=Kuza Ndani
+zoom_in_label=Kuza Ndani
+zoom.title=Kuza
+presentation_mode.title=Badili kwa Hali ya Uwasilishaji
+presentation_mode_label=Hali ya Uwasilishaji
+open_file.title=Fungua Faili
+open_file_label=Fungua
+print.title=Chapisha
+print_label=Chapisha
+download.title=Pakua
+download_label=Pakua
+bookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya)
+bookmark_label=Mwonekano wa Sasa
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=Kichwa:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Kibiano cha Upau wa Kando
+toggle_sidebar_label=Kibiano cha Upau wa Kando
+outline.title=Onyesha Ufupisho wa Waraka
+outline_label=Ufupisho wa Waraka
+thumbs.title=Onyesha Kijipicha
+thumbs_label=Vijipicha
+findbar.title=Pata katika Waraka
+findbar_label=Tafuta
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Ukurasa {{ukurasa}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}}
+
+# Find panel button title and messages
+find_label=Tafuta:
+find_previous.title=Tafuta tukio kabla ya msemo huu
+find_previous_label=Iliyotangulia
+find_next.title=Tafuta tukio linalofuata la msemo
+find_next_label=Ifuatayo
+find_highlight=Angazia yote
+find_match_case_label=Linganisha herufi
+find_reached_top=Imefika juu ya waraka, imeendelea kutoka chini
+find_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu
+find_not_found=Msemo hukupatikana
+
+# Error panel labels
+error_more_info=Maelezo Zaidi
+error_less_info=Maelezo Kidogo
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (jenga: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Ujumbe: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Panganya: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Faili: {{faili}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Laini: {{laini}}
+rendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa
+
+# Predefined zoom values
+page_scale_width=Upana wa Ukurasa
+page_scale_fit=Usawa wa Ukurasa
+page_scale_auto=Ukuzaji wa Kiotomatiki
+page_scale_actual=Ukubwa Halisi
+
+# Loading indicator messages
+loading_error_indicator=Hitilafu
+loading_error=Hitilafu lilitokea wakati wa kupakia PDF.
+invalid_file_error=Faili ya PDF isiyohalali au potofu.
+missing_file_error=Faili ya PDF isiyopo.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Ufafanuzi]
+password_ok=SAWA
+password_cancel=Ghairi
+
+printing_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki.
+web_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ta-LK/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ta-LK/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..eea694ee2a8bab1411c3a00d133b430190873b1c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ta-LK/chrome.properties
@@ -0,0 +1,3 @@
+# 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/.
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ta-LK/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ta-LK/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..7abed1b5d2cf7ba109585e51675c951bbed73260
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ta-LK/viewer.properties
@@ -0,0 +1,50 @@
+# 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/.
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+
+zoom.title=அளவு
+open_file.title=கோப்பினைத் திறக்க
+open_file_label=திறக்க
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Context menu
+
+# Find panel button title and messages
+find_previous.title=இந்த சொற்றொடரின் முன்னைய நிகழ்வை தேடு
+find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வைத் தேடு
+
+# Error panel labels
+error_close=மூடுக
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+
+# Loading indicator messages
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ta/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ta/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8b7216768a5ec783ab1a97f7cb9c85e6557ff236
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ta/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=PDF ஆவணம் சரியாக காண்பிக்கப்படாது போகக்கூடும்.
+unsupported_feature_forms=இந்த பிடிஎஃப் உரையாவணம் படிவங்களை வைத்துள்ளது. படிவங்களில் உள்ள புலங்களை நிரப்ப ஆதரிக்கபடவில்லை.
+open_with_different_viewer=வேறு காட்சி நிரல் கொண்டு திறக்கவும்
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ta/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ta/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e7019225263548a67ea6b31beffa07e0050ce85a
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ta/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=முந்தைய பக்கம்
+previous_label=முந்தையது
+next.title=அடுத்த பக்கம்
+next_label=அடுத்து
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=பக்கம்:
+page_of=இல் {{pageCount}}
+
+zoom_out.title=சிறிதாக்கு
+zoom_out_label=சிறிதாக்கு
+zoom_in.title=பெரிதாக்கு
+zoom_in_label=பெரிதாக்கு
+zoom.title=பெரிதாக்கு
+presentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு
+presentation_mode_label=விளக்ககாட்சி பயன்முறை
+open_file.title=கோப்பினை திற
+open_file_label=திற
+print.title=அச்சிடு
+print_label=அச்சிடு
+download.title=பதிவிறக்கு
+download_label=பதிவிறக்கு
+bookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற)
+bookmark_label=தற்போதைய காட்சி
+
+# Secondary toolbar and context menu
+tools.title=கருவிகள்
+tools_label=கருவிகள்
+first_page.title=முதல் பக்கத்திற்கு செல்லவும்
+first_page.label=முதல் பக்கத்திற்கு செல்லவும்
+first_page_label=முதல் பக்கத்திற்கு செல்லவும்
+last_page.title=கடைசி பக்கத்திற்கு செல்லவும்
+last_page.label=கடைசி பக்கத்திற்கு செல்லவும்
+last_page_label=கடைசி பக்கத்திற்கு செல்லவும்
+page_rotate_cw.title=வலஞ்சுழியாக சுழற்று
+page_rotate_cw.label=வலஞ்சுழியாக சுழற்று
+page_rotate_cw_label=வலஞ்சுழியாக சுழற்று
+page_rotate_ccw.title=இடஞ்சுழியாக சுழற்று
+page_rotate_ccw.label=இடஞ்சுழியாக சுழற்று
+page_rotate_ccw_label=இடஞ்சுழியாக சுழற்று
+
+hand_tool_enable.title=கை கருவியை செயலாக்கு
+hand_tool_enable_label=கை கருவியை செயலாக்கு
+hand_tool_disable.title=கை கருவியை முடக்கு
+hand_tool_disable_label=கை கருவியை முடக்கு
+
+# Document properties dialog box
+document_properties.title=ஆவண பண்புகள்...
+document_properties_label=ஆவண பண்புகள்...
+document_properties_file_name=கோப்பு பெயர்:
+document_properties_file_size=கோப்பின் அளவு:
+document_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்)
+document_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்)
+document_properties_title=தலைப்பு:
+document_properties_author=எழுதியவர்
+document_properties_subject=பொருள்:
+document_properties_keywords=முக்கிய வார்த்தைகள்:
+document_properties_creation_date=படைத்த தேதி :
+document_properties_modification_date=திருத்திய தேதி:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=உருவாக்குபவர்:
+document_properties_producer=பிடிஎஃப் தயாரிப்பாளர்:
+document_properties_version=PDF பதிப்பு:
+document_properties_page_count=பக்க எண்ணிக்கை:
+document_properties_close=மூடுக
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று
+toggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று
+outline.title=ஆவண வெளிவரையைக் காண்பி
+outline_label=ஆவண வெளிவரை
+thumbs.title=சிறுபடங்களைக் காண்பி
+thumbs_label=சிறுபடங்கள்
+findbar.title=ஆவணத்தில் கண்டறி
+findbar_label=கண்டுபிடி
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=பக்கம் {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}}
+
+# Find panel button title and messages
+find_label=கண்டறி:
+find_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு
+find_previous_label=முந்தையது
+find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு
+find_next_label=அடுத்து
+find_highlight=அனைத்தையும் தனிப்படுத்து
+find_match_case_label=பேரெழுத்தாக்கத்தை உணர்
+find_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது
+find_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது
+find_not_found=சொற்றொடர் காணவில்லை
+
+# Error panel labels
+error_more_info=கூடுதல் தகவல்
+error_less_info=குறைந்த தகவல்
+error_close=மூடுக
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=செய்தி: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=ஸ்டேக்: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=கோப்பு: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=வரி: {{line}}
+rendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது.
+
+# Predefined zoom values
+page_scale_width=பக்க அகலம்
+page_scale_fit=பக்கப் பொருத்தம்
+page_scale_auto=தானியக்க பெரிதாக்கல்
+page_scale_actual=உண்மையான அளவு
+
+# Loading indicator messages
+loading_error_indicator=பிழை
+loading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது.
+invalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு.
+missing_file_error=PDF கோப்பு காணவில்லை.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} விளக்கம்]
+password_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும்.
+password_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க.
+password_ok=சரி
+password_cancel=இரத்து
+
+printing_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை.
+printing_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை.
+web_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை.
+document_colors_disabled=PDF ஆவணங்களுக்கு அவற்றின் சொந்த நிறங்களைப் பயன்படுத்த அனுமதியில்லை: உலாவியில் 'பக்கங்கள் தங்கள் சொந்த நிறங்களைத் தேர்வு செய்துகொள்ள அனுமதி' என்னும் விருப்பம் முடக்கப்பட்டுள்ளது.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/te/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/te/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..fe879643392ee39ce2c7f46c10fc02d03efa36db
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/te/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=ఈ PDF పత్రము సరిగా ప్రదర్శించ పడకపోవచ్చును.
+open_with_different_viewer=వేరే దర్శనితో తెరువుము
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/te/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/te/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f6bcdfa73651e863d04655b9bfebe3d64d30cc36
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/te/viewer.properties
@@ -0,0 +1,145 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=క్రితం పేజీ
+previous_label=క్రితం
+next.title=తరువాత పేజీ
+next_label=తరువాత
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=పేజీ:
+page_of=మొత్తం {{pageCount}} లో
+
+zoom_out.title=జూమ్ తగ్గించు
+zoom_out_label=జూమ్ తగ్గించు
+zoom_in.title=జూమ్ చేయి
+zoom_in_label=జూమ్ చేయి
+zoom.title=జూమ్
+presentation_mode.title=ప్రదర్శనా రీతికి మారు
+presentation_mode_label=ప్రదర్శనా రీతి
+open_file.title=ఫైల్ తెరువు
+open_file_label=తెరువు
+print.title=ముద్రించు
+print_label=ముద్రించు
+download.title=డౌనులోడు
+download_label=డౌనులోడు
+bookmark.title=ప్రస్తుత దర్శనం (నకలుతీయి లేదా కొత్త విండోనందు తెరువుము)
+bookmark_label=ప్రస్తుత దర్శనం
+
+# Secondary toolbar and context menu
+tools.title=పనిముట్లు
+tools_label=పనిముట్లు
+first_page.title=మొదటి పేజీకి వెళ్ళు
+first_page.label=మొదటి పేజీకి వెళ్ళు
+first_page_label=మొదటి పేజీకి వెళ్ళు
+last_page.title=చివరి పేజీకి వెళ్ళు
+last_page.label=చివరి పేజీకి వెళ్ళు
+last_page_label=చివరి పేజీకి వెళ్ళు
+page_rotate_cw.title=సవ్యదిశలో తిప్పుము
+page_rotate_cw.label=సవ్యదిశలో తిప్పుము
+page_rotate_cw_label=సవ్యదిశలో తిప్పుము
+page_rotate_ccw.title=అపసవ్యదిశలో తిప్పుము
+page_rotate_ccw.label=అపసవ్యదిశలో తిప్పుము
+page_rotate_ccw_label=అపసవ్యదిశలో తిప్పుము
+
+
+# Document properties dialog box
+document_properties_title=శీర్షిక:
+document_properties_subject=విషయం:
+document_properties_keywords=కీపదాలు:
+document_properties_date_string={{date}}, {{time}}
+document_properties_page_count=పేజీల సంఖ్య:
+document_properties_close=మూసివేయి
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=పక్కపట్టీ మార్చు
+toggle_sidebar_label=పక్కపట్టీ మార్చు
+outline.title=పత్రము అవుట్‌లైన్ చూపు
+outline_label=పత్రము అవుట్‌లైన్
+thumbs.title=థంబ్‌నైల్స్ చూపు
+thumbs_label=థంబ్‌నైల్స్
+findbar.title=ఈ పత్రమునందు కనుగొనుము
+findbar_label=కనుగొను
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=పేజీ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=పేజీ {{page}} యొక్క థంబ్‌నైల్
+
+# Find panel button title and messages
+find_label=కనుగొను:
+find_previous.title=పదంయొక్క ముందలి  సంభవాన్ని  కనుగొను
+find_previous_label=మునుపటి
+find_next.title=పదం యొక్క తర్వాతి  సంభవాన్ని  కనుగొను
+find_next_label=తరువాత
+find_highlight=అన్నిటిని  ఉద్దీపనం చేయుము
+find_match_case_label=అక్షరములతేడాతో పోల్చుము
+find_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి
+find_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి
+find_not_found=పదం కనబడలేదు
+
+# Error panel labels
+error_more_info=మరింత సమాచారం
+error_less_info=తక్కువ సమాచారం
+error_close=మూసివేయి
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=సందేశం: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=స్టాక్: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=ఫైలు: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=వరుస: {{line}}
+rendering_error=పేజీను రెండర్ చేయుటలో వొక దోషం యెదురైంది.
+
+# Predefined zoom values
+page_scale_width=పేజీ వెడల్పు
+page_scale_fit=పేజీ అమర్పు
+page_scale_auto=స్వయంచాలక జూమ్
+page_scale_actual=యథార్ధ పరిమాణం
+
+# Loading indicator messages
+loading_error_indicator=దోషం
+loading_error=PDF లోడవుచున్నప్పుడు వొక దోషం యెదురైంది.
+invalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు.
+missing_file_error=దొరకని PDF ఫైలు.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} టీకా]
+password_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము
+password_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి.
+password_ok=సరే
+password_cancel=రద్దుచేయి
+
+printing_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటునీయబడుట లేదు
+printing_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు.
+web_fonts_disabled=వెబ్ ఫాంట్లు అచేతనపరచ బడెను: ఎంబెడెడ్ PDF ఫాంట్లు వుపయోగించలేక పోయింది.
+document_colors_disabled=PDF పత్రాలు వాటి స్వంత రంగులను వుపయోగించుకొనుటకు అనుమతించబడవు: విహరణి నందు 'పేజీలను వాటి స్వంత రంగులను యెంచుకొనుటకు అనుమతించు' అనునది అచేతనం చేయబడివుంది.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/th/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/th/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b505a9ac25155fdb8c8770f14e0ed0d3f83d4196
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/th/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=เอกสาร PDF นี้อาจแสดงผลไม่ถูกต้อง
+unsupported_feature_forms=มีฟอร์มอยู่ในเอกสาร PDF นี้ โปรแกรมไม่รองรับการกรอกฟอร์ม
+open_with_different_viewer=เปิดดูด้วยโปรแกรมอื่น
+open_with_different_viewer.accessKey=น
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/th/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/th/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..5d4d91549c6a670c6602c356cc09e071910052f9
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/th/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=หน้าก่อนหน้า
+previous_label=ก่อนหน้า
+next.title=หน้าถัดไป
+next_label=ถัดไป
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=หน้า:
+page_of=จาก {{pageCount}}
+
+zoom_out.title=ย่อ
+zoom_out_label=ย่อ Out
+zoom_in.title=ขยาย
+zoom_in_label=ขยาย
+zoom.title=ย่อ-ขยาย
+presentation_mode.title=สลับเข้าสู่รูปแบบการนำเสนอ
+presentation_mode_label=รูปแบบการนำเสนอ
+open_file.title=เปิดแฟ้ม
+open_file_label=เปิด
+print.title=พิมพ์
+print_label=พิมพ์
+download.title=ดาวน์โหลด
+download_label=ดาวน์โหลด
+bookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่)
+bookmark_label=มุมมองปัจจุบัน
+
+# Secondary toolbar and context menu
+tools.title=เครื่องมือ
+tools_label=เครื่องมือ
+first_page.title=ไปยังหน้าแรก
+first_page.label=ไปยังหน้าแรก
+first_page_label=ไปยังหน้าแรก
+last_page.title=ไปยังหน้าสุดท้าย
+last_page.label=ไปยังหน้าสุดท้าย
+last_page_label=ไปยังหน้าสุดท้าย
+page_rotate_cw.title=หมุนตามเข็มนาฬิกา
+page_rotate_cw.label=หมุนตามเข็มนาฬิกา
+page_rotate_cw_label=หมุนตามเข็มนาฬิกา
+page_rotate_ccw.title=หมุนทวนเข็มนาฬิกา
+page_rotate_ccw.label=หมุนทวนเข็มนาฬิกา
+page_rotate_ccw_label=หมุนทวนเข็มนาฬิกา
+
+hand_tool_enable.title=เปิดใช้งานเครื่องมือรูปมือ
+hand_tool_enable_label=เปิดใช้งานเครื่องมือรูปมือ
+hand_tool_disable.title=ปิดใช้งานเครื่องมือรูปมือ
+hand_tool_disable_label=ปิดใช้งานเครื่องมือรูปมือ
+
+# Document properties dialog box
+document_properties.title=คุณสมบัติเอกสาร…
+document_properties_label=คุณสมบัติเอกสาร…
+document_properties_file_name=ชื่อแฟ้ม :
+document_properties_file_size=ขนาดแฟ้ม :
+document_properties_kb={{size_kb}} กิโลไบต์ ({{size_b}} ไบต์)
+document_properties_mb={{size_mb}} เมกะไบต์ ({{size_b}} ไบต์)
+document_properties_title=หัวเรื่อง :
+document_properties_author=ผู้แต่ง :
+document_properties_subject=หัวข้อ :
+document_properties_keywords=คำสำคัญ :
+document_properties_creation_date=วันที่สร้าง :
+document_properties_modification_date=วันที่แก้ไข :
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=สร้างโดย :
+document_properties_producer=ผู้ผลิต PDF :
+document_properties_version=รุ่น PDF :
+document_properties_page_count=จำนวนหน้า :
+document_properties_close=ปิด
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=สลับแถบข้าง
+toggle_sidebar_label=สลับแถบข้าง
+outline.title=แสดงโครงเอกสาร
+outline_label=โครงเอกสาร
+thumbs.title=แสดงภาพขนาดย่อ
+thumbs_label=ภาพขนาดย่อ
+findbar.title=ค้นหาในเอกสาร
+findbar_label=ค้นหา
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=หน้า {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=ภาพขนาดย่อของหน้า {{page}}
+
+# Find panel button title and messages
+find_label=ค้นหา:
+find_previous.title=หาตำแหน่งก่อนหน้าของคำค้น
+find_previous_label=ก่อนหน้า
+find_next.title=หาตำแหน่งถัดไปของคำค้น
+find_next_label=ถัดไป
+find_highlight=เน้นสีทั้งหมด
+find_match_case_label=ตัวพิมพ์ตรงกัน
+find_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง
+find_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน
+find_not_found=ไม่พบวลีที่ต้องการ
+
+# Error panel labels
+error_more_info=ข้อมูลเพิ่มเติม
+error_less_info=ข้อมูลน้อย
+error_close=ปิด
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=ข้อความ: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=สแต็ก: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=แฟ้ม: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=บรรทัด: {{line}}
+rendering_error=เกิดข้อผิดพลาดขณะกำลังคำนวณการแสดงผลของหน้า
+
+# Predefined zoom values
+page_scale_width=ความกว้างหน้า
+page_scale_fit=พอดีหน้า
+page_scale_auto=ย่อ-ขยายอัตโนมัติ
+page_scale_actual=ขนาดเท่าจริง
+
+# Loading indicator messages
+loading_error_indicator=ข้อผิดพลาด
+loading_error=เกิดข้อผิดพลาดขณะกำลังโหลด PDF
+invalid_file_error=แฟ้ม PDF ไม่ถูกต้องหรือไม่สมบูรณ์
+missing_file_error=แฟ้ม PDF หาย
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[คำอธิบายประกอบ {{type}}]
+password_label=ใส่รหัสผ่านเพื่อเปิดไฟล์ PDF นี้
+password_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง
+password_ok=ตกลง
+password_cancel=ยกเลิก
+
+printing_not_supported=คำเตือน: เบราเซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่
+printing_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์
+web_fonts_disabled=แบบอักษรเว็บถูกปิดการใช้งาน: ไม่สามารถใช้แบบอักษรฝังตัวใน PDF
+document_colors_disabled=เอกสาร PDF ไม่ได้รับอนุญาตให้ใช้สีของตัวเอง: 'อนุญาตให้หน้าเอกสารสามารถเลือกสีของตัวเอง' ถูกปิดใช้งานในเบราเซอร์
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/tl/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/tl/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ea0e30ef67bc4da5d2d88530960343fed5e326b8
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/tl/chrome.properties
@@ -0,0 +1,17 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Baka hindi maipakita ng maayos ang PDF document na ito.
+open_with_different_viewer=Buksan Gamit ang Ibang Viewer
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/tl/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/tl/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..07d86eb141fc8c6a39bd40eb4cf635ed3b173316
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/tl/viewer.properties
@@ -0,0 +1,83 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Naunang Pahina
+next.title=Sunod na Pahina
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Pahina:
+page_of=ng {{bilangngPahina}}
+
+open_file.title=Magbukas ng file
+open_file_label=Buksan
+bookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)
+bookmark_label=Kasalukuyang tingin
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=Pamagat:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=Ipakita ang banghay ng dokumento
+outline_label=Banghay ng dokumento
+thumbs.title=Ipakita ang mga Thumbnails
+findbar_label=Hanapin
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pahina {{pahina}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail ng Pahina {{pahina}}
+
+# Find panel button title and messages
+
+# Error panel labels
+error_more_info=Maraming Inpormasyon
+error_less_info=Maikling Inpormasyon
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensahe: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linya: { { linya } }
+rendering_error=May naganap na pagkakamali habang pagsasalin sa pahina.
+
+# Predefined zoom values
+page_scale_width=Haba ng Pahina
+page_scale_fit=ang pahina ay angkop
+page_scale_auto=awtomatikong pag-imbulog
+
+# Loading indicator messages
+loading_error=May maling nangyari habang kinakarga ang PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=OK
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/tn/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/tn/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..73ebae02e9be52a98982031a3d31a1dc0e544c5b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/tn/chrome.properties
@@ -0,0 +1,15 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/tn/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/tn/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bd172747d3af0cb4ee440ce42a1a0071a7fb5eb3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/tn/viewer.properties
@@ -0,0 +1,68 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Tsebe:
+
+zoom.title=Zuma/gogela
+open_file.title=Bula Faele
+open_file_label=Bula
+
+# Secondary toolbar and context menu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+findbar_label=Batla
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+find_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko
+find_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko
+find_not_found=Setlhopha sa mafoko ga se a bonwa
+
+# Error panel labels
+error_more_info=Tshedimosetso e Nngwe
+error_close=Tswala
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+
+# Loading indicator messages
+loading_error_indicator=Phoso
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=Siame
+password_cancel=Khansela
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/tr/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/tr/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d4cceca04105e230cdc26385e8de322609cf37b3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/tr/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Bu PDF belgesi düzgün görüntülenmeyebilir.
+unsupported_feature_forms=Bu PDF belgesi form içeriyor. Form alanlarının doldurulması desteklenmemektedir.
+open_with_different_viewer=Farklı bir görüntüleyici ile aç
+open_with_different_viewer.accessKey=F
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/tr/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/tr/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6466be58a67140d61fadcce9c3cef06ac6157808
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/tr/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Önceki sayfa
+previous_label=Önceki
+next.title=Sonraki sayfa
+next_label=Sonraki
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Sayfa:
+page_of=/ {{pageCount}}
+
+zoom_out.title=UzaklaÈ™
+zoom_out_label=UzaklaÈ™
+zoom_in.title=YaklaÅŸ
+zoom_in_label=YaklaÅŸ
+zoom.title=Yakınlaştırma
+presentation_mode.title=Sunum moduna geç
+presentation_mode_label=Sunum Modu
+open_file.title=Dosya aç
+open_file_label=Aç
+print.title=Yazdır
+print_label=Yazdır
+download.title=İndir
+download_label=İndir
+bookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç)
+bookmark_label=Geçerli görünüm
+
+# Secondary toolbar and context menu
+tools.title=Araçlar
+tools_label=Araçlar
+first_page.title=İlk sayfaya git
+first_page.label=İlk sayfaya git
+first_page_label=İlk sayfaya git
+last_page.title=Son sayfaya git
+last_page.label=Son sayfaya git
+last_page_label=Son sayfaya git
+page_rotate_cw.title=Saat yönünde döndür
+page_rotate_cw.label=Saat yönünde döndür
+page_rotate_cw_label=Saat yönünde döndür
+page_rotate_ccw.title=Saat yönünün tersine döndür
+page_rotate_ccw.label=Saat yönünün tersine döndür
+page_rotate_ccw_label=Saat yönünün tersine döndür
+
+hand_tool_enable.title=El aracını etkinleştir
+hand_tool_enable_label=El aracını etkinleştir
+hand_tool_disable.title=El aracını kapat
+hand_tool_disable_label=El aracını kapat
+
+# Document properties dialog box
+document_properties.title=Belge özellikleri…
+document_properties_label=Belge özellikleri…
+document_properties_file_name=Dosya adı:
+document_properties_file_size=Dosya boyutu:
+document_properties_kb={{size_kb}} KB ({{size_b}} bayt)
+document_properties_mb={{size_mb}} MB ({{size_b}} bayt)
+document_properties_title=Başlık:
+document_properties_author=Yazar:
+document_properties_subject=Konu:
+document_properties_keywords=Anahtar kelimeler:
+document_properties_creation_date=Oluturma tarihi:
+document_properties_modification_date=DeÄŸiÅŸtirme tarihi:
+document_properties_date_string={{date}} {{time}}
+document_properties_creator=OluÅŸturan:
+document_properties_producer=PDF üreticisi:
+document_properties_version=PDF sürümü:
+document_properties_page_count=Sayfa sayısı:
+document_properties_close=Kapat
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Kenar çubuğunu aç/kapat
+toggle_sidebar_label=Kenar çubuğunu aç/kapat
+outline.title=Belge şemasını göster
+outline_label=Belge şeması
+thumbs.title=Küçük resimleri göster
+thumbs_label=Küçük resimler
+findbar.title=Belgede bul
+findbar_label=Bul
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Sayfa {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. sayfanın küçük hâli
+
+# Find panel button title and messages
+find_label=Bul:
+find_previous.title=Önceki eşleşmeyi bul
+find_previous_label=Önceki
+find_next.title=Sonraki eÅŸleÅŸmeyi bul
+find_next_label=Sonraki
+find_highlight=Tümünü vurgula
+find_match_case_label=Büyük-küçük harf eşleştir
+find_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi
+find_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi
+find_not_found=Eşleşme bulunamadı
+
+# Error panel labels
+error_more_info=Daha fazla bilgi
+error_less_info=Daha az bilgi
+error_close=Kapat
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js sürüm {{version}} (yapı: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=İleti: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Yığın: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dosya: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Satır: {{line}}
+rendering_error=Sayfa yorumlanırken bir hata oluştu.
+
+# Predefined zoom values
+page_scale_width=Sayfa geniÅŸliÄŸi
+page_scale_fit=Sayfayı sığdır
+page_scale_auto=Otomatik yakınlaştır
+page_scale_actual=Gerçek boyut
+
+# Loading indicator messages
+loading_error_indicator=Hata
+loading_error=PDF yüklenirken bir hata oluştu.
+invalid_file_error=Geçersiz veya bozulmuş PDF dosyası.
+missing_file_error=PDF dosyası eksik.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} iÅŸareti]
+password_label=Bu PDF dosyasını açmak için parolasını girin.
+password_invalid=Geçersiz parola. Lütfen tekrar deneyin.
+password_ok=Tamam
+password_cancel=İptal
+
+printing_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir.
+printing_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil.
+web_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor.
+document_colors_disabled=PDF belgelerinin kendi renklerini kullanması için izin verilmiyor: 'Sayfalara kendi renklerini seçmesi için izin ver' tarayıcıda etkinleştirilmemiş.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/uk/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/uk/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..37f453dc6f550f8e1adc6da818564774ded03ac6
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/uk/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Цей PDF-документ може відображатись неправильно.
+open_with_different_viewer=Відкрити іншим переглядачем
+open_with_different_viewer.accessKey=Ñ–
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/uk/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/uk/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..31363f6f7a5cf49084f12d87f2dbb0298540b53d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/uk/viewer.properties
@@ -0,0 +1,136 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Попередня сторінка
+previous_label=Попередня
+next.title=Наступна сторінка
+next_label=Наступна
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Сторінка:
+page_of=з {{pageCount}}
+
+zoom_out.title=Зменшити
+zoom_out_label=Зменшити
+zoom_in.title=Збільшити
+zoom_in_label=Збільшити
+zoom.title=Масштаб
+presentation_mode.title=Перейти в режим презентації
+presentation_mode_label=Режим презентації
+open_file.title=Відкрити файл
+open_file_label=Відкрити
+print.title=Друк
+print_label=Друк
+download.title=Завантажити
+download_label=Завантажити
+bookmark.title=Поточний вигляд (копіювати чи відкрити у новому вікні)
+bookmark_label=Поточний вигляд
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Йти на першу сторінку
+first_page.label=Йти на першу сторінку
+first_page_label=Йти на першу сторінку
+last_page.title=Йти на останню сторінку
+last_page.label=Йти на останню сторінку
+last_page_label=Йти на останню сторінку
+page_rotate_cw.title=Обернути за годинниковою стрілкою
+page_rotate_cw.label=Обернути за годинниковою стрілкою
+page_rotate_cw_label=Обернути за годинниковою стрілкою
+page_rotate_ccw.title=Обернути проти годинникової стрілки
+page_rotate_ccw.label=Обернути проти годинникової стрілки
+page_rotate_ccw_label=Обернути проти годинникової стрілки
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Перемкнути бічну панель
+toggle_sidebar_label=Перемкнути бічну панель
+outline.title=Показувати схему документа
+outline_label=Схема документа
+thumbs.title=Показувати ескізи
+thumbs_label=Ескізи
+findbar.title=Шукати в документі
+findbar_label=Пошук
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Сторінка {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Ескіз сторінки {{page}}
+
+# Find panel button title and messages
+find_label=Знайти:
+find_previous.title=Знайти попереднє входження фрази
+find_previous_label=Попереднє
+find_next.title=Знайти наступне входження фрази
+find_next_label=Наступне
+find_highlight=Підсвітити все
+find_match_case_label=З урахуванням регістру
+find_reached_top=Досягнуто початку документу, продовжено з кінця
+find_reached_bottom=Досягнуто кінця документу, продовжено з початку
+find_not_found=Фразу не знайдено
+
+# Error panel labels
+error_more_info=Більше інформації
+error_less_info=Менше інформації
+error_close=Закрити
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Повідомлення: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Стек: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Файл: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Рядок: {{line}}
+rendering_error=Під час рендеру сторінки сталась помилка.
+
+# Predefined zoom values
+page_scale_width=За шириною
+page_scale_fit=Умістити
+page_scale_auto=Авто-масштаб
+page_scale_actual=Дійсний розмір
+
+# Loading indicator messages
+loading_error_indicator=Помилка
+loading_error=Під час завантаження PDF сталась помилка.
+invalid_file_error=Недійсний або пошкоджений PDF-файл.
+missing_file_error=Відсутній PDF-файл.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-аннотація]
+password_label=Введіть пароль для відкриття цього PDF-файла.
+password_invalid=Невірний пароль. Спробуйте ще.
+password_ok=Гаразд
+password_cancel=Скасувати
+
+printing_not_supported=Попередження: Цей браузер не повністю підтримує друк.
+printing_not_ready=Попередження: The PDF це повністю завантажений для друку.
+web_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти.
+document_colors_disabled=PDF-документам не дозволено використовувати свої власні кольори: в браузері вимкнено «Дозволити сторінкам використовувати свої власні кольори».
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ur/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/ur/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..584210bebc5ada53ff4bb479f1134c1a1ecd8ed5
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ur/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=یہ PDF دستاویز شائد ٹھیک طرح نہین دکھایا جا سکے۔
+unsupported_feature_forms=اس PDF دستاویز میں فارم شامل ہیں۔ فارم قطعوں کی بھرائی معاونت شدہ نہیں ہے۔
+open_with_different_viewer=کسی اور ناظر سے کھولیں
+open_with_different_viewer.accessKey=Ú©
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/ur/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/ur/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c52220f1719400a3351d15be6a150bc5830826b5
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/ur/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=پچھلا صفحہ
+previous_label=پچھلا
+next.title=اگلا صفحہ
+next_label=Ø¢Ú¯Û’
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=صفحہ:
+page_of={{pageCount}} کا
+
+zoom_out.title=باہر زوم کریں
+zoom_out_label=باہر زوم کریں
+zoom_in.title=اندر زوم کریں
+zoom_in_label=اندر زوم کریں
+zoom.title=زوم
+presentation_mode.title=پیشکش موڈ میں چلے جائیں
+presentation_mode_label=پیشکش موڈ
+open_file.title=مسل کھولیں
+open_file_label=کھولیں
+print.title=چھاپیں
+print_label=چھاپیں
+download.title=ڈاؤن لوڈ
+download_label=ڈاؤن لوڈ
+bookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں)
+bookmark_label=حالیہ نظارہ
+
+# Secondary toolbar and context menu
+tools.title=آلات
+tools_label=آلات
+first_page.title=پہلے صفحہ پر جائیں
+first_page.label=پہلے صفحہ پر جائیں
+first_page_label=پہلے صفحہ پر جائیں
+last_page.title=آخری صفحہ پر جائیں
+last_page.label=آخری صفحہ پر جائیں
+last_page_label=آخری صفحہ پر جائیں
+page_rotate_cw.title=گھڑی وار گھمائیں
+page_rotate_cw.label=گھڑی وار گھمائیں
+page_rotate_cw_label=گھڑی وار گھمائیں
+page_rotate_ccw.title=ضد گھڑی وار گھمائیں
+page_rotate_ccw.label=ضد گھڑی وار گھمائیں
+page_rotate_ccw_label=ضد گھڑی وار گھمائیں
+
+hand_tool_enable.title=ہاتھ ٹول اہل بنائیں
+hand_tool_enable_label=ہاتھ ٹول اہل بنائیں
+hand_tool_disable.title=ہاتھ ٹول nنااہل بنائیں 
+hand_tool_disable_label=ہاتھ ٹول نااہل بنائیں
+
+# Document properties dialog box
+document_properties.title=دستاویز خواص…
+document_properties_label=دستاویز خواص… 
+document_properties_file_name=نام مسل:
+document_properties_file_size=مسل سائز:
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=عنوان:
+document_properties_author=تخلیق کار:
+document_properties_subject=موضوع:
+document_properties_keywords=کلیدی الفاظ:
+document_properties_creation_date=تخلیق کی تاریخ:
+document_properties_modification_date=ترمیم کی تاریخ:
+document_properties_date_string={{date}}، {{time}}
+document_properties_creator=تخلیق کار:
+document_properties_producer=PDF پیدا کار:
+document_properties_version=PDF ورژن:
+document_properties_page_count=صفحہ شمار:
+document_properties_close=بند کریں
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=سلائیڈ ٹوگل کریں
+toggle_sidebar_label=سلائیڈ ٹوگل کریں
+outline.title=دستاویز آؤٹ لائن دکھائیں
+outline_label=دستاویز آؤٹ لائن
+thumbs.title=تھمبنیل دکھائیں
+thumbs_label=مجمل
+findbar.title=دستاویز میں ڈھونڈیں
+findbar_label=ڈھونڈیں
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=صفحہ {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=صفحے کا مجمل {{page}}
+
+# Find panel button title and messages
+find_label=ڈھونڈیں:
+find_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں
+find_previous_label=پچھلا
+find_next.title=فقرے کا اگلہ وقوع ڈھونڈیں
+find_next_label=Ø¢Ú¯Û’
+find_highlight=تمام نمایاں کریں
+find_match_case_label=حروف مشابہ کریں
+find_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا
+find_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا
+find_not_found=فقرا نہیں ملا
+
+# Error panel labels
+error_more_info=مزید معلومات
+error_less_info=کم معلومات
+error_close=بند کریں
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=پیغام: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=سٹیک: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=مسل: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=لائن: {{line}}
+rendering_error=صفحہ بناتے ہوئے نقص آ گیا۔
+
+# Predefined zoom values
+page_scale_width=صفحہ چوڑائی
+page_scale_fit=صفحہ فٹنگ
+page_scale_auto=خودکار زوم
+page_scale_actual=اصل سائز
+
+# Loading indicator messages
+loading_error_indicator=نقص
+loading_error=PDF لوڈ کرتے وقت نقص آ گیا۔
+invalid_file_error=ناجائز یا خراب PDF مسل
+missing_file_error=PDF مسل غائب ہے۔
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} نوٹ]
+password_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں.
+password_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں.
+password_ok=سہی
+password_cancel=منسوخ کریں
+
+printing_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔
+printing_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔
+web_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔
+document_colors_disabled=PDF دستاویزات کو اپنے رنگ استعمال کرنے کی اجازت نہیں: 'صفحات کو اپنے رنگ چنیں' کی اِجازت براؤزر میں بے عمل ہے۔
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/vi/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/vi/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..229f8b455d58e60cd17fe62d8b04762e2aacc38e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/vi/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Tài liệu PDF này có thể không được hiển thị đúng.
+open_with_different_viewer=Mở bằng chương trình khác
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/vi/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/vi/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..adabe41df15d277581c7672d378516d84a6ff871
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/vi/viewer.properties
@@ -0,0 +1,120 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Trang Trước
+previous_label=Trước
+next.title=Trang Sau
+next_label=Tiếp
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Trang:
+page_of=thuộc về {{pageCount}}
+
+zoom_out.title=Thu nhỏ
+zoom_out_label=Thu nhỏ
+zoom_in.title=Phóng to
+zoom_in_label=Phóng to
+zoom.title=Thu phóng
+presentation_mode.title=Chuyển sang chế độ trình chiếu
+presentation_mode_label=Chế độ trình chiếu
+open_file.title=Mở Tập Tin
+open_file_label=Mở tập tin
+print.title=In
+print_label=In
+download.title=Tải xuống
+download_label=Tải xuống
+bookmark.title=Góc nhìn hiện tại (copy hoặc mở trong cửa sổ mới)
+bookmark_label=Chế độ xem hiện tại
+
+# Secondary toolbar and context menu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Bật/Tắt Thanh Lề
+toggle_sidebar_label=Bật/Tắt Thanh Lề
+outline.title=Hiển thị bản phác tài liệu
+outline_label=Bản phác họa Tài liệu
+thumbs.title=Hiển thị Thumbnails
+thumbs_label=Thumbnails (hình biểu diễn nhỏ)
+findbar.title=Tìm trong tài liệu
+findbar_label=Tìm
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Trang {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Hình ảnh thu nhỏ của trang {{page}}
+
+# Find panel button title and messages
+find_label=Tìm kiếm:
+find_previous.title=Tìm cụm từ ở phần trước
+find_previous_label=Trước
+find_next.title=Tìm cụm từ ở phần sau
+find_next_label=Tiếp
+find_highlight=Tô sáng tất cả
+find_match_case_label=Phân biệt chữ hoa, chữ thường
+find_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối
+find_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu
+find_not_found=Không tìm thấy cụm từ
+
+# Error panel labels
+error_more_info=Thông tin thêm
+error_less_info=Hiển thị ít thông tin hơn
+error_close=Đóng
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Thông điệp: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Tệp: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Dòng: {{line}}
+rendering_error=Lỗi khi hiển thị trang.
+
+# Predefined zoom values
+page_scale_width=Chiều rộng trang
+page_scale_fit=Độ vừa của trang
+page_scale_auto=Tự động thu/phóng
+page_scale_actual=Kích thước thực
+
+# Loading indicator messages
+loading_error_indicator=Lá»—i
+loading_error=Lỗi khi tải tài liệu PDF.
+invalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ.
+missing_file_error=Thiếu tập tin PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Chú thích]
+password_ok=OK
+password_cancel=Hủy bỏ
+
+printing_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này.
+printing_not_ready=Cảnh báo: PDF chưa được tải hết để in.
+web_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng.
+document_colors_disabled=Tài liệu PDF không được cho phép dùng màu riêng: 'Cho phép trang chọn màu riêng' đã bị tắt trên trình duyệt.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/wo/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/wo/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..66ab16a4d4d5abc0a9078544910e11fd08483eae
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/wo/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Jukki PDF bii mënul feeñ bu baax.
+open_with_different_viewer=Ubbi ak wone bu wuute
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/wo/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/wo/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..94965ab96f216252008b48cb757992b9853e3e92
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/wo/viewer.properties
@@ -0,0 +1,116 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Xët wi jiitu
+previous_label=Bi jiitu
+next.title=Xët wi ci topp
+next_label=Bi ci topp
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Xët:
+page_of=ci {{pageCount}}
+
+zoom_out.title=Wàññi
+zoom_out_label=Wàññi
+zoom_in.title=Yaatal
+zoom_in_label=Yaatal
+zoom.title=Yambalaŋ
+presentation_mode.title=Wañarñil ci anamu wone
+presentation_mode_label=Anamu Wone
+open_file.title=Ubbi benn dencukaay
+open_file_label=Ubbi
+print.title=Móol
+print_label=Móol
+download.title=Yeb yi
+download_label=Yeb yi
+bookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees)
+bookmark_label=Wone bi feeñ
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_title=Bopp:
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+outline.title=Wone takku yi
+outline_label=Takku jukki yi
+thumbs.title=Wone nataal yu ndaw yi
+thumbs_label=Nataal yu ndaw yi
+findbar.title=Gis ci biir jukki bi
+findbar_label=Wut
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Xët {{xët}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Wiñet bu xët{{xët}}
+
+# Find panel button title and messages
+find_label=Wut:
+find_previous.title=Seet beneen kaddu bu ni mel te jiitu
+find_previous_label=Bi jiitu
+find_next.title=Seet beneen kaddu bu ni mel
+find_next_label=Bi ci topp
+find_highlight=Melaxal lépp
+find_match_case_label=Sàmm jëmmalin wi
+find_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf
+find_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte
+find_not_found=Gisiñu kaddu gi
+
+# Error panel labels
+error_more_info=Xibaar yu gën bari
+error_less_info=Xibaar yu gën bari
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Bataaxal: {{bataaxal}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Juug: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dencukaay: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rëdd : {{line}}
+rendering_error=Am njumte bu am bi xët bi di wonewu.
+
+# Predefined zoom values
+page_scale_width=Yaatuwaay bu mët
+page_scale_fit=Xët lëmm
+page_scale_auto=Yambalaŋ ci saa si
+page_scale_actual=Dayo bi am
+
+# Loading indicator messages
+loading_error_indicator=Njumte
+loading_error=Am na njumte ci yebum dencukaay PDF bi.
+invalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Karmat {{type}}]
+password_ok=OK
+password_cancel=Neenal
+
+printing_not_supported=Artu: Joowkat bii nanguwul lool mool.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/xh/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/xh/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..79acd370891fe7dc36cce0043424595643539aaf
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/xh/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Olu xwebhu lwe-PDF lusenokungaboniswa kakuhle.
+unsupported_feature_forms=Olu xwebhu lwe-PDF luneefomu. Ukuzalisa izikhewu zefomu akuxhaswa.
+open_with_different_viewer=Vula ngesibonisi esahlukileyo
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/xh/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/xh/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8a3bdb9d1d24f17d7ead5ed66e11ce193ba7a614
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/xh/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Iphepha langaphambili
+previous_label=Okwangaphambili
+next.title=Iphepha elilandelayo
+next_label=Okulandelayo
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Iphepha:
+page_of=kwali- {{pageCount}}
+
+zoom_out.title=Bhekelisela Kudana
+zoom_out_label=Bhekelisela Kudana
+zoom_in.title=Sondeza Kufuphi
+zoom_in_label=Sondeza Kufuphi
+zoom.title=Yandisa / Nciphisa
+presentation_mode.title=Tshintshela kwimo yonikezelo
+presentation_mode_label=Imo yonikezelo
+open_file.title=Vula Ifayile
+open_file_label=Vula
+print.title=Printa
+print_label=Printa
+download.title=Khuphela
+download_label=Khuphela
+bookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha)
+bookmark_label=Imbonakalo ekhoyo
+
+# Secondary toolbar and context menu
+tools.title=Izixhobo zemiyalelo
+tools_label=Izixhobo zemiyalelo
+first_page.title=Yiya kwiphepha lokuqala
+first_page.label=Yiya kwiphepha lokuqala
+first_page_label=Yiya kwiphepha lokuqala
+last_page.title=Yiya kwiphepha lokugqibela
+last_page.label=Yiya kwiphepha lokugqibela
+last_page_label=Yiya kwiphepha lokugqibela
+page_rotate_cw.title=Jikelisa ngasekunene
+page_rotate_cw.label=Jikelisa ngasekunene
+page_rotate_cw_label=Jikelisa ngasekunene
+page_rotate_ccw.title=Jikelisa ngasekhohlo
+page_rotate_ccw.label=Jikelisa ngasekhohlo
+page_rotate_ccw_label=Jikelisa ngasekhohlo
+
+hand_tool_enable.title=Yenza isixhobo sesandla sisebenze
+hand_tool_enable_label=Yenza isixhobo sesandla sisebenze
+hand_tool_disable.title=Yenza isixhobo sesandla singasebenzi
+hand_tool_disable_label=Yenza isixhobo sesandla singasebenzi
+
+# Document properties dialog box
+document_properties.title=Iipropati zoxwebhu…
+document_properties_label=Iipropati zoxwebhu…
+document_properties_file_name=Igama lefayile:
+document_properties_file_size=Isayizi yefayile:
+document_properties_kb={{size_kb}} KB ({{size_b}} iibhayiti)
+document_properties_mb={{size_mb}} MB ({{size_b}} iibhayiti)
+document_properties_title=Umxholo:
+document_properties_author=Umbhali:
+document_properties_subject=Umbandela:
+document_properties_keywords=Amagama aphambili:
+document_properties_creation_date=Umhla wokwenziwa kwayo:
+document_properties_modification_date=Umhla wokulungiswa kwayo:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Umntu oyenzileyo:
+document_properties_producer=Umvelisi we-PDF:
+document_properties_version=Uhlelo lwe-PDF:
+document_properties_page_count=Inani lamaphepha:
+document_properties_close=Vala
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Togola ngebha eseCaleni
+toggle_sidebar_label=Togola ngebha eseCaleni
+outline.title=Bonisa isishwankathelo soxwebhu
+outline_label=Isishwankathelo soxwebhu
+thumbs.title=Bonisa ukrobiso kumfanekiso
+thumbs_label=Ukrobiso kumfanekiso
+findbar.title=Fumana kuXwebhu
+findbar_label=Fumana
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Iphepha {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}}
+
+# Find panel button title and messages
+find_label=Fumanisa:
+find_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama
+find_previous_label=Okwangaphambili
+find_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama
+find_next_label=Okulandelayo
+find_highlight=Qaqambisa konke
+find_match_case_label=Tshatisa ngobukhulu bukanobumba
+find_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi
+find_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu
+find_not_found=Ibinzana alifunyenwanga
+
+# Error panel labels
+error_more_info=Inkcazelo Engakumbi
+error_less_info=Inkcazelo Encinane
+error_close=Vala
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=I-PDF.js v{{uhlelo}} (yakha: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Umyalezo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Imfumba: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ifayile: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Umgca: {{line}}
+rendering_error=Imposiso yenzekile xa bekunikezelwa iphepha.
+
+# Predefined zoom values
+page_scale_width=Ububanzi bephepha
+page_scale_fit=Ukulinganiswa kwephepha
+page_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo
+page_scale_actual=Ubungakanani bokwenene
+
+# Loading indicator messages
+loading_error_indicator=Imposiso
+loading_error=Imposiso yenzekile xa kulayishwa i-PDF.
+invalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.
+missing_file_error=Ifayile ye-PDF edukileyo.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Ubhalo-nqaku]
+password_label=Faka ipasiwedi ukuze uvule le fayile yePDF.
+password_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona.
+password_ok=KULUNGILE
+password_cancel=Rhoxisa
+
+printing_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.
+printing_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.
+web_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.
+document_colors_disabled=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza.
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/zh-CN/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/zh-CN/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..04dafddb1e05811b2490ccbb714f1916e6ddc5d2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/zh-CN/chrome.properties
@@ -0,0 +1,19 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=此 PDF 文档可能无法正确地显示。
+unsupported_feature_forms=此 PDF 文档包含表单。不支持表单字段的填写。
+open_with_different_viewer=用其他查看器打开
+open_with_different_viewer.accessKey=o
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/zh-CN/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/zh-CN/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..a9f1ce72d829f763d2c5be5187d32bf2d663841a
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/zh-CN/viewer.properties
@@ -0,0 +1,161 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=上一页
+previous_label=上一页
+next.title=下一页
+next_label=下一页
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=页面:
+page_of=/ {{pageCount}}
+
+zoom_out.title=缩小
+zoom_out_label=缩小
+zoom_in.title=放大
+zoom_in_label=放大
+zoom.title=缩放
+presentation_mode.title=切换到演示模式
+presentation_mode_label=演示模式
+open_file.title=打开文件
+open_file_label=打开
+print.title=打印
+print_label=打印
+download.title=下载
+download_label=下载
+bookmark.title=当前视图(复制或在新窗口中打开)
+bookmark_label=当前视图
+
+# Secondary toolbar and context menu
+tools.title=工具
+tools_label=工具
+first_page.title=转到第一页
+first_page.label=转到第一页
+first_page_label=转到第一页
+last_page.title=转到最后一页
+last_page.label=转到最后一页
+last_page_label=转到最后一页
+page_rotate_cw.title=顺时针旋转
+page_rotate_cw.label=顺时针旋转
+page_rotate_cw_label=顺时针旋转
+page_rotate_ccw.title=逆时针旋转
+page_rotate_ccw.label=逆时针旋转
+page_rotate_ccw_label=逆时针旋转
+
+hand_tool_enable.title=启用手形工具
+hand_tool_enable_label=启用手形工具
+hand_tool_disable.title=禁用手形工具
+hand_tool_disable_label=禁用手形工具
+
+# Document properties dialog box
+document_properties.title=文档属性…
+document_properties_label=文档属性…
+document_properties_file_name=文件名:
+document_properties_file_size=文件大小:
+document_properties_kb={{size_kb}} KB ({{size_b}} 字节)
+document_properties_mb={{size_mb}} MB ({{size_b}} 字节)
+document_properties_title=标题:
+document_properties_author=作者:
+document_properties_subject=主题:
+document_properties_keywords=关键词:
+document_properties_creation_date=创建日期:
+document_properties_modification_date=修改日期:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=创建者:
+document_properties_producer=PDF 制作者:
+document_properties_version=PDF 版本:
+document_properties_page_count=页数:
+document_properties_close=关闭
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=切换侧栏
+toggle_sidebar_label=切换侧栏
+outline.title=显示文档大纲
+outline_label=文档大纲
+thumbs.title=显示缩略图
+thumbs_label=缩略图
+findbar.title=在文档中查找
+findbar_label=查找
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=页码 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=页面 {{page}} 的缩略图
+
+# Find panel button title and messages
+find_label=查找:
+find_previous.title=查找词语上一次出现的位置
+find_previous_label=上一页
+find_next.title=查找词语后一次出现的位置
+find_next_label=下一页
+find_highlight=全部高亮显示
+find_match_case_label=区分大小写
+find_reached_top=到达文档开头,从末尾继续
+find_reached_bottom=到达文档末尾,从开头继续
+find_not_found=词语未找到
+
+# Error panel labels
+error_more_info=更多信息
+error_less_info=更少信息
+error_close=关闭
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=信息:{{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=堆栈:{{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=文件:{{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=行号:{{line}}
+rendering_error=渲染页面时发生错误。
+
+# Predefined zoom values
+page_scale_width=适合页宽
+page_scale_fit=适合页面
+page_scale_auto=自动缩放
+page_scale_actual=实际大小
+
+# Loading indicator messages
+loading_error_indicator=错误
+loading_error=载入PDF时发生错误。
+invalid_file_error=无效或损坏的PDF文件。
+missing_file_error=缺少PDF文件。
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 注解]
+password_label=输入密码以打开此 PDF 文件。
+password_invalid=密码无效。请重试。
+password_ok=确定
+password_cancel=取消
+
+printing_not_supported=警告:打印功能不完全支持此浏览器。
+printing_not_ready=警告:该 PDF 未完全加载以供打印。
+web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的PDF字体。
+document_colors_disabled=不允许 PDF 文档使用自己的颜色:浏览器中“允许页面选择自己的颜色”的选项已停用。
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/zh-TW/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/zh-TW/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2b585fd21ae639275777a7f0d0594413c1143c0c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/zh-TW/chrome.properties
@@ -0,0 +1,20 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=此 PDF 文件可能並未正確顯示。
+unsupported_feature_forms=此 PDF 文件包含表單,不支援填寫表單欄位。
+open_with_different_viewer=使用其他檢視器開啟
+open_with_different_viewer.accessKey=o
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/zh-TW/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/zh-TW/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..8bb223613941ab2819ff1e9b11b3b03caa914216
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/zh-TW/viewer.properties
@@ -0,0 +1,162 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=上一頁
+previous_label=上一頁
+next.title=下一頁
+next_label=下一頁
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=頁:
+page_of=/ {{pageCount}}
+
+zoom_out.title=縮小
+zoom_out_label=縮小
+zoom_in.title=放大
+zoom_in_label=放大
+zoom.title=縮放
+presentation_mode.title=切換至簡報模式
+presentation_mode_label=簡報模式
+open_file.title=開啟檔案
+open_file_label=開啟
+print.title=列印
+print_label=列印
+download.title=下載
+download_label=下載
+bookmark.title=目前檢視的內容(複製或開啟於新視窗)
+bookmark_label=目前檢視
+
+# Secondary toolbar and context menu
+tools.title=工具
+tools_label=工具
+first_page.title=跳到第一頁
+first_page.label=跳到第一頁
+first_page_label=跳到第一頁
+last_page.title=跳到最後一頁
+last_page.label=跳到最後一頁
+last_page_label=跳到最後一頁
+page_rotate_cw.title=順時針旋轉
+page_rotate_cw.label=順時針旋轉
+page_rotate_cw_label=順時針旋轉
+page_rotate_ccw.title=逆時針旋轉
+page_rotate_ccw.label=逆時針旋轉
+page_rotate_ccw_label=逆時針旋轉
+
+hand_tool_enable.title=啟用掌型工具
+hand_tool_enable_label=啟用掌型工具
+hand_tool_disable.title=停用掌型工具
+hand_tool_disable_label=停用掌型工具
+
+# Document properties dialog box
+document_properties.title=文件內容…
+document_properties_label=文件內容…
+document_properties_file_name=檔案名稱:
+document_properties_file_size=檔案大小:
+document_properties_kb={{size_kb}} KB({{size_b}} 位元組)
+document_properties_mb={{size_kb}} MB({{size_b}} 位元組)
+document_properties_title=標題:
+document_properties_author=作者:
+document_properties_subject=主旨:
+document_properties_keywords=關鍵字:
+document_properties_creation_date=建立日期:
+document_properties_modification_date=修改日期:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=建立者:
+document_properties_producer=PDF 產生器:
+document_properties_version=PDF 版本:
+document_properties_page_count=頁數:
+document_properties_close=關閉
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=切換側邊欄
+toggle_sidebar_label=切換側邊欄
+outline.title=顯示文件大綱
+outline_label=文件大綱
+thumbs.title=顯示縮圖
+thumbs_label=縮圖
+findbar.title=在文件中尋找
+findbar_label=尋找
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=頁 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=頁 {{page}} 的縮圖
+
+# Find panel button title and messages
+find_label=尋找:
+find_previous.title=尋找文字前次出現的位置
+find_previous_label=上一個
+find_next.title=尋找文字下次出現的位置
+find_next_label=下一個
+find_highlight=全部強調標示
+find_match_case_label=區分大小寫
+find_reached_top=已搜尋至文件頂端,自底端繼續搜尋
+find_reached_bottom=已搜尋至文件底端,自頂端繼續搜尋
+find_not_found=找不到指定文字
+
+# Error panel labels
+error_more_info=更多資訊
+error_less_info=更少資訊
+error_close=關閉
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=訊息: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=堆疊: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=檔案: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=行: {{line}}
+rendering_error=描繪頁面時發生錯誤。
+
+# Predefined zoom values
+page_scale_width=頁面寬度
+page_scale_fit=縮放至頁面大小
+page_scale_auto=自動縮放
+page_scale_actual=實際大小
+
+# Loading indicator messages
+loading_error_indicator=錯誤
+loading_error=載入 PDF 時發生錯誤。
+invalid_file_error=無效或毀損的 PDF 檔案。
+missing_file_error=找不到 PDF 檔案。
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 註解]
+password_label=請輸入用來開啟此 PDF 檔案的密碼。
+password_invalid=密碼不正確,請再試一次。
+password_ok=確定
+password_cancel=取消
+
+printing_not_supported=警告: 此瀏覽器未完整支援列印功能。
+printing_not_ready=警告: 此 PDF 未完成下載以供列印。
+web_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。
+document_colors_disabled=瀏覽器的「優先使用網頁指定的色彩」未被勾選,PDF 文件無法使用自己的色彩。
+
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/zu/chrome.properties b/public/opac/js/universalviewer-2.0.2/l10n/zu/chrome.properties
new file mode 100644
index 0000000000000000000000000000000000000000..b706db688cd1b92c3d00c19c5acd5c558d56f382
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/zu/chrome.properties
@@ -0,0 +1,18 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Chrome notification bar messages and buttons
+unsupported_feature=Leli dokhumenti le-PDF lingahle lingaboniswa kahle.
+open_with_different_viewer=Vula ngesibuki esihlukile
+open_with_different_viewer.accessKey=v
diff --git a/public/opac/js/universalviewer-2.0.2/l10n/zu/viewer.properties b/public/opac/js/universalviewer-2.0.2/l10n/zu/viewer.properties
new file mode 100644
index 0000000000000000000000000000000000000000..bd7a08f6d48d33262068d7e4a3af82f239831b47
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/l10n/zu/viewer.properties
@@ -0,0 +1,124 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Ikhasi eledlule
+previous_label=Okudlule
+next.title=Ikhasi elilandelayo
+next_label=Okulandelayo
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Ikhasi:
+page_of=kwe-{{pageCount}}
+
+zoom_out.title=Hlehlisela emuva
+zoom_out_label=Hlehlisela emuva
+zoom_in.title=Sondeza eduze
+zoom_in_label=Sondeza eduze
+zoom.title=Lwiza
+print.title=Phrinta
+print_label=Phrinta
+presentation_mode.title=Guqulela kwindlela yesethulo
+presentation_mode_label=Indlelo yesethulo
+open_file.title=Vula ifayela
+open_file_label=Vula
+download.title=Landa
+download_label=Landa
+bookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha)
+bookmark_label=Ukubuka kwamanje
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=I-toggle yebha yaseceleni
+toggle_sidebar_label=i-toggle yebha yaseceleni
+outline.title=Bonisa umugqa waseceleni wedokhumenti
+outline_label=Umugqa waseceleni wedokhumenti
+thumbs.title=Bonisa izithombe ezincane
+thumbs_label=Izithonjana
+findbar.title=Thola kwidokhumenti
+findbar_label=Thola
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Ikhasi {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Isithonjana sekhasi {{page}}
+
+# Context menu
+first_page.label=Yiya kwikhasi lokuqala
+last_page.label=Yiya kwikhasi lokugcina
+page_rotate_cw.label=Jikisela ngendlela yewashi
+page_rotate_ccw.label=Jikisela kwelokudla
+
+# Find panel button title and messages
+find_label=Thola
+find_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana
+find_previous_label=Okudlulile
+find_next.title=Thola enye indawo okuvela kuyo lomshwana
+find_next_label=Okulandelayo
+find_highlight=Gqamisa konke
+find_match_case_label=Fanisa ikheyisi
+find_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi
+find_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu
+find_not_found=Umshwana awutholakali
+
+# Error panel labels
+error_more_info=Ukwaziswa Okwengeziwe
+error_less_info=Ukwazi okuncane
+error_close=Vala
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Umlayezo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Isitaki: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ifayela: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Umugqa: {{line}}
+rendering_error=Iphutha lenzekile uma kunikwa ikhasi.
+
+# Predefined zoom values
+page_scale_width=Ububanzi bekhasi
+page_scale_fit=Ukulingana kwekhasi
+page_scale_auto=Ukulwiza okuzenzekalelayo
+page_scale_actual=Usayizi Wangempela
+
+# Loading indicator messages
+loading_error_indicator=Iphutha
+loading_error=Kwenzeke iphutha uma kulayishwa i-PDF.
+invalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele.
+missing_file_error=Ifayela le-PDF elilahlekile.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Amazwibela e-{{type}}]
+request_password=I-PDF ivikeleke ngephasiwedi
+invalid_password=Iphasiwedi Engavumelekile.
+
+printing_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele.
+printing_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta.
+web_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF. 
+document_colors_disabled=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli.
diff --git a/public/opac/js/universalviewer-2.0.2/lib/Detector.js b/public/opac/js/universalviewer-2.0.2/lib/Detector.js
new file mode 100644
index 0000000000000000000000000000000000000000..23dcf1200938f5cc58271b7d734a045409e4270e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/Detector.js
@@ -0,0 +1,67 @@
+
+/**
+ * @author alteredq / http://alteredqualia.com/
+ * @author mr.doob / http://mrdoob.com/
+ */
+
+var Detector = {
+
+	canvas: !! window.CanvasRenderingContext2D,
+	webgl: ( function () { try { var canvas = document.createElement( 'canvas' ); return !! ( window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ) ); } catch ( e ) { return false; } } )(),
+	workers: !! window.Worker,
+	fileapi: window.File && window.FileReader && window.FileList && window.Blob,
+
+	getWebGLErrorMessage: function () {
+
+		var element = document.createElement( 'div' );
+		element.id = 'webgl-error-message';
+		element.style.fontFamily = 'monospace';
+		element.style.fontSize = '13px';
+		element.style.fontWeight = 'normal';
+		element.style.textAlign = 'center';
+		element.style.background = '#fff';
+		element.style.color = '#000';
+		element.style.padding = '1.5em';
+		element.style.width = '400px';
+		element.style.margin = '5em auto 0';
+
+		if ( ! this.webgl ) {
+
+			element.innerHTML = window.WebGLRenderingContext ? [
+				'Your graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br />',
+				'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.'
+			].join( '\n' ) : [
+				'Your browser does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br/>',
+				'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.'
+			].join( '\n' );
+
+		}
+
+		return element;
+
+	},
+
+	addGetWebGLMessage: function ( parameters ) {
+
+		var parent, id, element;
+
+		parameters = parameters || {};
+
+		parent = parameters.parent !== undefined ? parameters.parent : document.body;
+		id = parameters.id !== undefined ? parameters.id : 'oldie';
+
+		element = Detector.getWebGLErrorMessage();
+		element.id = id;
+
+		parent.appendChild( element );
+
+	}
+
+};
+
+// browserify support
+if ( typeof module === 'object' ) {
+
+	module.exports = Detector;
+
+}
diff --git a/public/opac/js/universalviewer-2.0.2/lib/README.md b/public/opac/js/universalviewer-2.0.2/lib/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..104ebd72d4367131ced7bff1a37cd6535657bce0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/README.md
@@ -0,0 +1,9 @@
+## minifying pdf.js
+
+https://github.com/DanielRuf/pdf.daniel-ruf.de/blob/master/README.md
+
+java -jar C:\google-closure\compiler.jar --language_in=ECMASCRIPT5 --compilation_level SIMPLE_OPTIMIZATIONS --js viewer.js --js_output_file viewer.min.js
+java -jar C:\google-closure\compiler.jar --language_in=ECMASCRIPT5 --compilation_level SIMPLE_OPTIMIZATIONS --js pdf.js --js_output_file pdf.min.js
+java -jar C:\google-closure\compiler.jar --language_in=ECMASCRIPT5 --compilation_level SIMPLE_OPTIMIZATIONS --js pdf.worker.js --js_output_file pdf.worker.min.js
+
+(use full path C:\google-closure\compiler.jar)
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/app.js b/public/opac/js/universalviewer-2.0.2/lib/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..03b7041cd87c48bce2f24a4fb6af60d95762462d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/app.js
@@ -0,0 +1,8 @@
+var requirejs,require,define;!function(global){function commentReplace(e,t,i,n){return n||""}function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){if(e){var i;for(i=0;i<e.length&&(!e[i]||!t(e[i],i,e));i+=1);}}function eachReverse(e,t){if(e){var i;for(i=e.length-1;i>-1&&(!e[i]||!t(e[i],i,e));i-=1);}}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(e,t,i,n){return t&&eachProp(t,function(t,o){(i||!hasProp(e,o))&&(!n||"object"!=typeof t||!t||isArray(t)||isFunction(t)||t instanceof RegExp?e[o]=t:(e[o]||(e[o]={}),mixin(e[o],t,i,n)))}),e}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split("."),function(e){t=t[e]}),t}function makeError(e,t,i,n){var o=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return o.requireType=e,o.requireModules=n,i&&(o.originalError=i),o}function newContext(e){function t(e){var t,i;for(t=0;t<e.length;t++)if(i=e[t],"."===i)e.splice(t,1),t-=1;else if(".."===i){if(0===t||1===t&&".."===e[2]||".."===e[t-1])continue;t>0&&(e.splice(t-1,2),t-=2)}}function i(e,i,n){var o,s,r,a,l,h,c,u,p,d,g,f,m=i&&i.split("/"),v=w.map,$=v&&v["*"];if(e&&(e=e.split("/"),c=e.length-1,w.nodeIdCompat&&jsSuffixRegExp.test(e[c])&&(e[c]=e[c].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&m&&(f=m.slice(0,m.length-1),e=f.concat(e)),t(e),e=e.join("/")),n&&v&&(m||$)){r=e.split("/");e:for(a=r.length;a>0;a-=1){if(h=r.slice(0,a).join("/"),m)for(l=m.length;l>0;l-=1)if(s=getOwn(v,m.slice(0,l).join("/")),s&&(s=getOwn(s,h))){u=s,p=a;break e}!d&&$&&getOwn($,h)&&(d=getOwn($,h),g=a)}!u&&d&&(u=d,p=g),u&&(r.splice(0,p,u),e=r.join("/"))}return o=getOwn(w.pkgs,e),o?o:e}function n(e){isBrowser&&each(scripts(),function(t){return t.getAttribute("data-requiremodule")===e&&t.getAttribute("data-requirecontext")===E.contextName?(t.parentNode.removeChild(t),!0):void 0})}function o(e){var t=getOwn(w.paths,e);return t&&isArray(t)&&t.length>1?(t.shift(),E.require.undef(e),E.makeRequire(null,{skipMap:!0})([e]),!0):void 0}function s(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function r(e,t,n,o){var r,a,l,h,c=null,u=t?t.name:null,p=e,d=!0,g="";return e||(d=!1,e="_@r"+(O+=1)),h=s(e),c=h[0],e=h[1],c&&(c=i(c,u,o),a=getOwn(T,c)),e&&(c?g=a&&a.normalize?a.normalize(e,function(e){return i(e,u,o)}):-1===e.indexOf("!")?i(e,u,o):e:(g=i(e,u,o),h=s(g),c=h[0],g=h[1],n=!0,r=E.nameToUrl(g))),l=!c||a||n?"":"_unnormalized"+(L+=1),{prefix:c,name:g,parentMap:t,unnormalized:!!l,url:r,originalName:p,isDefine:d,id:(c?c+"!"+g:g)+l}}function a(e){var t=e.id,i=getOwn(S,t);return i||(i=S[t]=new E.Module(e)),i}function l(e,t,i){var n=e.id,o=getOwn(S,n);!hasProp(T,n)||o&&!o.defineEmitComplete?(o=a(e),o.error&&"error"===t?i(o.error):o.on(t,i)):"defined"===t&&i(T[n])}function h(e,t){var i=e.requireModules,n=!1;t?t(e):(each(i,function(t){var i=getOwn(S,t);i&&(i.error=e,i.events.error&&(n=!0,i.emit("error",e)))}),n||req.onError(e))}function c(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(E.defQueueMap[t]=!0),R.push(e)}),globalDefQueue=[])}function u(e){delete S[e],delete _[e]}function p(e,t,i){var n=e.map.id;e.error?e.emit("error",e.error):(t[n]=!0,each(e.depMaps,function(n,o){var s=n.id,r=getOwn(S,s);!r||e.depMatched[o]||i[s]||(getOwn(t,s)?(e.defineDep(o,T[s]),e.check()):p(r,t,i))}),i[n]=!0)}function d(){var e,t,i=1e3*w.waitSeconds,s=i&&E.startTime+i<(new Date).getTime(),r=[],a=[],l=!1,c=!0;if(!$){if($=!0,eachProp(_,function(e){var i=e.map,h=i.id;if(e.enabled&&(i.isDefine||a.push(e),!e.error))if(!e.inited&&s)o(h)?(t=!0,l=!0):(r.push(h),n(h));else if(!e.inited&&e.fetched&&i.isDefine&&(l=!0,!i.prefix))return c=!1}),s&&r.length)return e=makeError("timeout","Load timeout for modules: "+r,null,r),e.contextName=E.contextName,h(e);c&&each(a,function(e){p(e,{},{})}),s&&!t||!l||!isBrowser&&!isWebWorker||y||(y=setTimeout(function(){y=0,d()},50)),$=!1}}function g(e){hasProp(T,e[0])||a(r(e[0],null,!0)).init(e[1],e[2])}function f(e,t,i,n){e.detachEvent&&!isOpera?n&&e.detachEvent(n,t):e.removeEventListener(i,t,!1)}function m(e){var t=e.currentTarget||e.srcElement;return f(t,E.onScriptLoad,"load","onreadystatechange"),f(t,E.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function v(){var e;for(c();R.length;){if(e=R.shift(),null===e[0])return h(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1]));g(e)}E.defQueueMap={}}var $,b,E,x,y,w={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},S={},_={},C={},R=[],T={},I={},D={},O=1,L=1;return x={require:function(e){return e.require?e.require:e.require=E.makeRequire(e.map)},exports:function(e){return e.usingExports=!0,e.map.isDefine?e.exports?T[e.map.id]=e.exports:e.exports=T[e.map.id]={}:void 0},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(w.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},b=function(e){this.events=getOwn(C,e.id)||{},this.map=e,this.shim=getOwn(w.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0},b.prototype={init:function(e,t,i,n){n=n||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=n.ignore,n.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,E.startTime=(new Date).getTime();var e=this.map;return this.shim?void E.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()})):e.prefix?this.callPlugin():this.load()}},load:function(){var e=this.map.url;I[e]||(I[e]=!0,E.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var e,t,i=this.map.id,n=this.depExports,o=this.exports,s=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(s)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{o=E.execCb(i,s,n,o)}catch(r){e=r}else o=E.execCb(i,s,n,o);if(this.map.isDefine&&void 0===o&&(t=this.module,t?o=t.exports:this.usingExports&&(o=this.exports)),e)return e.requireMap=this.map,e.requireModules=this.map.isDefine?[this.map.id]:null,e.requireType=this.map.isDefine?"define":"require",h(this.error=e)}else o=s;if(this.exports=o,this.map.isDefine&&!this.ignore&&(T[i]=o,req.onResourceLoad)){var a=[];each(this.depMaps,function(e){a.push(e.normalizedMap||e)}),req.onResourceLoad(E,this.map,a)}u(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(E.defQueueMap,i)||this.fetch()}},callPlugin:function(){var e=this.map,t=e.id,n=r(e.prefix);this.depMaps.push(n),l(n,"defined",bind(this,function(n){var o,s,c,p=getOwn(D,this.map.id),d=this.map.name,g=this.map.parentMap?this.map.parentMap.name:null,f=E.makeRequire(e.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(n.normalize&&(d=n.normalize(d,function(e){return i(e,g,!0)})||""),s=r(e.prefix+"!"+d,this.map.parentMap),l(s,"defined",bind(this,function(e){this.map.normalizedMap=s,this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),c=getOwn(S,s.id),void(c&&(this.depMaps.push(s),this.events.error&&c.on("error",bind(this,function(e){this.emit("error",e)})),c.enable()))):p?(this.map.url=E.nameToUrl(p),void this.load()):(o=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})}),o.error=bind(this,function(e){this.inited=!0,this.error=e,e.requireModules=[t],eachProp(S,function(e){0===e.map.id.indexOf(t+"_unnormalized")&&u(e.map.id)}),h(e)}),o.fromText=bind(this,function(i,n){var s=e.name,l=r(s),c=useInteractive;n&&(i=n),c&&(useInteractive=!1),a(l),hasProp(w.config,t)&&(w.config[s]=w.config[t]);try{req.exec(i)}catch(u){return h(makeError("fromtexteval","fromText eval for "+t+" failed: "+u,u,[t]))}c&&(useInteractive=!0),this.depMaps.push(l),E.completeLoad(s),f([s],o)}),void n.load(e.name,f,o,w))})),E.enable(n,this),this.pluginMaps[n.id]=n},enable:function(){_[this.map.id]=this,this.enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,n,o;if("string"==typeof e){if(e=r(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,o=getOwn(x,e.id))return void(this.depExports[t]=o(this));this.depCount+=1,l(e,"defined",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?l(e,"error",bind(this,this.errback)):this.events.error&&l(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,n=S[i],hasProp(x,i)||!n||n.enabled||E.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(S,e.id);t&&!t.enabled&&E.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},E={config:w,contextName:e,registry:S,defined:T,urlFetched:I,defQueue:R,defQueueMap:{},Module:b,makeModuleMap:r,nextTick:req.nextTick,onError:h,configure:function(e){if(e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/"),"string"==typeof e.urlArgs){var t=e.urlArgs;e.urlArgs=function(e,i){return(-1===i.indexOf("?")?"?":"&")+t}}var i=w.shim,n={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){n[t]?(w[t]||(w[t]={}),mixin(w[t],e,!0,!0)):w[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(D[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=E.makeShimExports(e)),i[t]=e}),w.shim=i),e.packages&&each(e.packages,function(e){var t,i;e="string"==typeof e?{name:e}:e,i=e.name,t=e.location,t&&(w.paths[i]=e.location),w.pkgs[i]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(S,function(e,t){e.inited||e.map.unnormalized||(e.map=r(t,null,!0))}),(e.deps||e.callback)&&E.require(e.deps||[],e.callback)},makeShimExports:function(e){function t(){var t;return e.init&&(t=e.init.apply(global,arguments)),t||e.exports&&getGlobal(e.exports)}return t},makeRequire:function(t,o){function s(i,n,l){var c,u,p;return o.enableBuildCallback&&n&&isFunction(n)&&(n.__requireJsBuild=!0),"string"==typeof i?isFunction(n)?h(makeError("requireargs","Invalid require call"),l):t&&hasProp(x,i)?x[i](S[t.id]):req.get?req.get(E,i,t,s):(u=r(i,t,!1,!0),c=u.id,hasProp(T,c)?T[c]:h(makeError("notloaded",'Module name "'+c+'" has not been loaded yet for context: '+e+(t?"":". Use require([])")))):(v(),E.nextTick(function(){v(),p=a(r(null,t)),p.skipMap=o.skipMap,p.init(i,n,l,{enabled:!0}),d()}),s)}return o=o||{},mixin(s,{isBrowser:isBrowser,toUrl:function(e){var n,o=e.lastIndexOf("."),s=e.split("/")[0],r="."===s||".."===s;return-1!==o&&(!r||o>1)&&(n=e.substring(o,e.length),e=e.substring(0,o)),E.nameToUrl(i(e,t&&t.id,!0),n,!0)},defined:function(e){return hasProp(T,r(e,t,!1,!0).id)},specified:function(e){return e=r(e,t,!1,!0).id,hasProp(T,e)||hasProp(S,e)}}),t||(s.undef=function(e){c();var i=r(e,t,!0),o=getOwn(S,e);o.undefed=!0,n(e),delete T[e],delete I[i.url],delete C[e],eachReverse(R,function(t,i){t[0]===e&&R.splice(i,1)}),delete E.defQueueMap[e],o&&(o.events.defined&&(C[e]=o.events),u(e))}),s},enable:function(e){var t=getOwn(S,e.id);t&&a(e).enable()},completeLoad:function(e){var t,i,n,s=getOwn(w.shim,e)||{},r=s.exports;for(c();R.length;){if(i=R.shift(),null===i[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);g(i)}if(E.defQueueMap={},n=getOwn(S,e),!t&&!hasProp(T,e)&&n&&!n.inited){if(!(!w.enforceDefine||r&&getGlobal(r)))return o(e)?void 0:h(makeError("nodefine","No define call for "+e,null,[e]));g([e,s.deps||[],s.exportsFn])}d()},nameToUrl:function(e,t,i){var n,o,s,r,a,l,h,c=getOwn(w.pkgs,e);if(c&&(e=c),h=getOwn(D,e))return E.nameToUrl(h,t,i);if(req.jsExtRegExp.test(e))a=e+(t||"");else{for(n=w.paths,o=e.split("/"),s=o.length;s>0;s-=1)if(r=o.slice(0,s).join("/"),l=getOwn(n,r)){isArray(l)&&(l=l[0]),o.splice(0,s,l);break}a=o.join("/"),a+=t||(/^data\:|^blob\:|\?/.test(a)||i?"":".js"),a=("/"===a.charAt(0)||a.match(/^[\w\+\.\-]+:/)?"":w.baseUrl)+a}return w.urlArgs&&!/^blob\:/.test(a)?a+w.urlArgs(e,a):a},load:function(e,t){req.load(E,e,t)},execCb:function(e,t,i,n){return t.apply(n,i)},onScriptLoad:function(e){if("load"===e.type||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){interactiveScript=null;var t=m(e);E.completeLoad(t.id)}},onScriptError:function(e){var t=m(e);if(!o(t.id)){var i=[];return eachProp(S,function(e,n){0!==n.indexOf("_@r")&&each(e.depMaps,function(e){return e.id===t.id?(i.push(n),!0):void 0})}),h(makeError("scripterror",'Script error for "'+t.id+(i.length?'", needed by: '+i.join(", "):'"'),e,[t.id]))}}},E.require=E.makeRequire(),E}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState?interactiveScript:(eachReverse(scripts(),function(e){return"interactive"===e.readyState?interactiveScript=e:void 0}),interactiveScript)}var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.2.0",commentRegExp=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;if("undefined"==typeof define){if("undefined"!=typeof requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}"undefined"==typeof require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,n){var o,s,r=defContextName;return isArray(e)||"string"==typeof e||(s=e,isArray(t)?(e=t,t=i,i=n):e=[]),s&&s.context&&(r=s.context),o=getOwn(contexts,r),o||(o=contexts[r]=req.s.newContext(r)),s&&o.configure(s),o.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick="undefined"!=typeof setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(e){req[e]=function(){var t=contexts[defContextName];return t.require[e].apply(t,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],baseElement=document.getElementsByTagName("base")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var n=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return n.type=e.scriptType||"text/javascript",n.charset="utf-8",n.async=!0,n},req.load=function(e,t,i){var n,o=e&&e.config||{};if(isBrowser)return n=req.createNode(o,t,i),n.setAttribute("data-requirecontext",e.contextName),n.setAttribute("data-requiremodule",t),!n.attachEvent||n.attachEvent.toString&&n.attachEvent.toString().indexOf("[native code")<0||isOpera?(n.addEventListener("load",e.onScriptLoad,!1),n.addEventListener("error",e.onScriptError,!1)):(useInteractive=!0,n.attachEvent("onreadystatechange",e.onScriptLoad)),n.src=i,o.onNodeCreated&&o.onNodeCreated(n,o,t,i),currentlyAddingScript=n,baseElement?head.insertBefore(n,baseElement):head.appendChild(n),currentlyAddingScript=null,n;if(isWebWorker)try{setTimeout(function(){},0),importScripts(i),e.completeLoad(t)}catch(s){e.onError(makeError("importscripts","importScripts failed for "+t+" at "+i,s,[t]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){return head||(head=e.parentNode),dataMain=e.getAttribute("data-main"),dataMain?(mainScript=dataMain,cfg.baseUrl||-1!==mainScript.indexOf("!")||(src=mainScript.split("/"),mainScript=src.pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0):void 0}),define=function(e,t,i){var n,o;"string"!=typeof e&&(i=t,t=e,e=null),isArray(t)||(i=t,t=null),!t&&isFunction(i)&&(t=[],i.length&&(i.toString().replace(commentRegExp,commentReplace).replace(cjsRequireRegExp,function(e,i){t.push(i)}),t=(1===i.length?["require"]:["require","exports","module"]).concat(t))),useInteractive&&(n=currentlyAddingScript||getInteractiveScript(),n&&(e||(e=n.getAttribute("data-requiremodule")),o=contexts[n.getAttribute("data-requirecontext")])),o?(o.defQueue.push([e,t,i]),o.defQueueMap[e]=!0):globalDefQueue.push([e,t,i])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}}(this),define("requireLib",function(){}),define("modules/uv-shared-module/BaseCommands",["require","exports"],function(e,t){var i=function(){function e(){}return e.namespace="uv.",e.ACCEPT_TERMS=e.namespace+"onAcceptTerms",e.BOOKMARK=e.namespace+"onBookmark",e.CANVAS_INDEX_CHANGE_FAILED=e.namespace+"onCanvasIndexChangeFailed",e.CANVAS_INDEX_CHANGED=e.namespace+"onCanvasIndexChanged",e.CLICKTHROUGH=e.namespace+"onClickthrough",e.CLOSE_ACTIVE_DIALOGUE=e.namespace+"onCloseActiveDialogue",e.CLOSE_LEFT_PANEL=e.namespace+"onCloseLeftPanel",e.CLOSE_RIGHT_PANEL=e.namespace+"onCloseRightPanel",e.CREATED=e.namespace+"onCreated",e.DOWN_ARROW=e.namespace+"onDownArrow",e.DOWNLOAD=e.namespace+"onDownload",e.DROP=e.namespace+"onDrop",e.END=e.namespace+"onEnd",e.ESCAPE=e.namespace+"onEscape",e.EXTERNAL_LINK_CLICKED=e.namespace+"onExternalLinkClicked",e.FEEDBACK=e.namespace+"onFeedback",e.FORBIDDEN=e.namespace+"onForbidden",e.HIDE_CLICKTHROUGH_DIALOGUE=e.namespace+"onHideClickthroughDialogue",e.HIDE_DOWNLOAD_DIALOGUE=e.namespace+"onHideDownloadDialogue",e.HIDE_EMBED_DIALOGUE=e.namespace+"onHideEmbedDialogue",e.HIDE_EXTERNALCONTENT_DIALOGUE=e.namespace+"onHideExternalContentDialogue",e.HIDE_GENERIC_DIALOGUE=e.namespace+"onHideGenericDialogue",e.HIDE_HELP_DIALOGUE=e.namespace+"onHideHelpDialogue",e.HIDE_INFORMATION=e.namespace+"onHideInformation",e.HIDE_LOGIN_DIALOGUE=e.namespace+"onHideLoginDialogue",e.HIDE_MOREINFO_DIALOGUE=e.namespace+"onHideMoreInfoDialogue",e.HIDE_OVERLAY=e.namespace+"onHideOverlay",e.HIDE_RESTRICTED_DIALOGUE=e.namespace+"onHideRestrictedDialogue",e.HIDE_SETTINGS_DIALOGUE=e.namespace+"onHideSettingsDialogue",e.HIDE_SHARE_DIALOGUE=e.namespace+"onHideShareDialogue",e.HOME=e.namespace+"onHome",e.LEFT_ARROW=e.namespace+"onLeftArrow",e.LEFTPANEL_COLLAPSE_FULL_FINISH=e.namespace+"onLeftPanelCollapseFullFinish",e.LEFTPANEL_COLLAPSE_FULL_START=e.namespace+"onLeftPanelCollapseFullStart",e.LEFTPANEL_EXPAND_FULL_FINISH=e.namespace+"onLeftPanelExpandFullFinish",e.LEFTPANEL_EXPAND_FULL_START=e.namespace+"onLeftPanelExpandFullStart",e.LOAD_FAILED=e.namespace+"onLoadFailed",e.LOAD=e.namespace+"onLoad",e.LOGIN_FAILED=e.namespace+"onLoginFailed",e.LOGIN=e.namespace+"onLogin",e.LOGOUT=e.namespace+"onLogout",e.METRIC_CHANGED=e.namespace+"onMetricChanged",e.MINUS=e.namespace+"onMinus",e.NOT_FOUND=e.namespace+"onNotFound",e.OPEN_EXTERNAL_RESOURCE=e.namespace+"onOpenExternalResource",e.OPEN_LEFT_PANEL=e.namespace+"onOpenLeftPanel",e.OPEN_RIGHT_PANEL=e.namespace+"onOpenRightPanel",e.OPEN=e.namespace+"onOpen",e.PAGE_DOWN=e.namespace+"onPageDown",e.PAGE_UP=e.namespace+"onPageUp",e.PARENT_EXIT_FULLSCREEN=e.namespace+"onParentExitFullScreen",e.PLUS=e.namespace+"onPlus",e.REDIRECT=e.namespace+"onRedirect",e.REFRESH=e.namespace+"onRefresh",e.RESIZE=e.namespace+"onResize",e.RESOURCE_DEGRADED=e.namespace+"onResourceDegraded",e.RETRY=e.namespace+"onRetry",e.RETURN=e.namespace+"onReturn",e.RIGHT_ARROW=e.namespace+"onRightArrow",e.RIGHTPANEL_COLLAPSE_FULL_FINISH=e.namespace+"onRightPanelCollapseFullFinish",e.RIGHTPANEL_COLLAPSE_FULL_START=e.namespace+"onRightPanelCollapseFullStart",e.RIGHTPANEL_EXPAND_FULL_FINISH=e.namespace+"onRightPanelExpandFullFinish",e.RIGHTPANEL_EXPAND_FULL_START=e.namespace+"onRightPanelExpandFullStart",e.SEQUENCE_INDEX_CHANGED=e.namespace+"onSequenceIndexChanged",e.SETTINGS_CHANGED=e.namespace+"onSettingsChanged",e.SHOW_CLICKTHROUGH_DIALOGUE=e.namespace+"onShowClickThroughDialogue",e.SHOW_DOWNLOAD_DIALOGUE=e.namespace+"onShowDownloadDialogue",e.SHOW_EMBED_DIALOGUE=e.namespace+"onShowEmbedDialogue",e.SHOW_EXTERNALCONTENT_DIALOGUE=e.namespace+"onShowExternalContentDialogue",e.SHOW_GENERIC_DIALOGUE=e.namespace+"onShowGenericDialogue",e.SHOW_HELP_DIALOGUE=e.namespace+"onShowHelpDialogue",e.SHOW_INFORMATION=e.namespace+"onShowInformation",e.SHOW_LOGIN_DIALOGUE=e.namespace+"onShowLoginDialogue",e.SHOW_MOREINFO_DIALOGUE=e.namespace+"onShowMoreInfoDialogue",e.SHOW_OVERLAY=e.namespace+"onShowOverlay",e.SHOW_RESTRICTED_DIALOGUE=e.namespace+"onShowRestrictedDialogue",e.SHOW_SETTINGS_DIALOGUE=e.namespace+"onShowSettingsDialogue",e.SHOW_SHARE_DIALOGUE=e.namespace+"onShowShareDialogue",e.SHOW_TERMS_OF_USE=e.namespace+"onShowTermsOfUse",e.THUMB_SELECTED=e.namespace+"onThumbSelected",e.TOGGLE_EXPAND_LEFT_PANEL=e.namespace+"onToggleExpandLeftPanel",e.TOGGLE_EXPAND_RIGHT_PANEL=e.namespace+"onToggleExpandRightPanel",e.TOGGLE_FULLSCREEN=e.namespace+"onToggleFullScreen",e.UP_ARROW=e.namespace+"onUpArrow",e.UPDATE_SETTINGS=e.namespace+"onUpdateSettings",e.VIEW_FULL_TERMS=e.namespace+"onViewFullTerms",e.WINDOW_UNLOAD=e.namespace+"onWindowUnload",e}();return i}),define("Params",["require","exports"],function(e,t){var i;return function(e){e[e.collectionIndex=0]="collectionIndex",e[e.manifestIndex=1]="manifestIndex",e[e.sequenceIndex=2]="sequenceIndex",e[e.canvasIndex=3]="canvasIndex",e[e.xywh=4]="xywh",e[e.rotation=5]="rotation",e[e.highlight=6]="highlight",e[e.anchor=7]="anchor"}(i||(i={})),i}),define("BootstrapParams",["require","exports","./Params"],function(e,t,i){var n=function(){function e(){this.paramMap=["c","m","s","cv","xywh","r","h","a"],this.config=Utils.Urls.getQuerystringParameter("config"),this.domain=Utils.Urls.getQuerystringParameter("domain"),this.embedDomain=Utils.Urls.getQuerystringParameter("embedDomain"),this.embedScriptUri=Utils.Urls.getQuerystringParameter("embedScriptUri"),this.isHomeDomain="true"===Utils.Urls.getQuerystringParameter("isHomeDomain"),this.isLightbox="true"===Utils.Urls.getQuerystringParameter("isLightbox"),this.isOnlyInstance="true"===Utils.Urls.getQuerystringParameter("isOnlyInstance"),this.isReload="true"===Utils.Urls.getQuerystringParameter("isReload");var e=Utils.Urls.getQuerystringParameter("jsonp");this.jsonp=null===e?null:!("false"===e||"0"===e),this.manifestUri=Utils.Urls.getQuerystringParameter("manifestUri");var t=Utils.Urls.getQuerystringParameter("locale")||"en-GB";this.setLocale(t),this.collectionIndex=this.getParam(i.collectionIndex),this.manifestIndex=this.getParam(i.manifestIndex),this.sequenceIndex=this.getParam(i.sequenceIndex),this.canvasIndex=this.getParam(i.canvasIndex)}return e.prototype.getLocaleName=function(){return this.localeName},e.prototype.getParam=function(e){if(this.hashParamsAvailable()){var t=parseInt(Utils.Urls.getHashParameter(this.paramMap[e],parent.document));if(t||0===t)return t}return parseInt(Utils.Urls.getQuerystringParameter(this.paramMap[e]))||0},e.prototype.hashParamsAvailable=function(){return this.isHomeDomain&&!this.isReload&&this.isOnlyInstance},e.prototype.setLocale=function(e){this.locale=e,this.locales=[];for(var t=this.locale.split(","),i=0;i<t.length;i++){var n=t[i].split(":");this.locales.push({name:n[0].trim(),label:n[1]?n[1].trim():""})}this.localeName=this.locales[0].name},e}();return n}),define("Bootstrapper",["require","exports","./modules/uv-shared-module/BaseCommands","./BootstrapParams"],function(e,t,i,n){var o=function(){function e(e){this.isFullScreen=!1,this.extensions=e}return e.prototype.bootstrap=function(e){var t=this;this.params=new n,e&&(this.params=$.extend(!0,this.params,e)),this.params.manifestUri&&($("#app").empty(),$("#app").addClass("loading"),$('link[type*="text/css"]').remove(),jQuery.support.cors=!0,Manifold.loadManifest({iiifResourceUri:this.params.manifestUri,collectionIndex:this.params.collectionIndex,manifestIndex:this.params.manifestIndex,sequenceIndex:this.params.sequenceIndex,canvasIndex:this.params.canvasIndex,locale:this.params.localeName}).then(function(e){var i=e.getTrackingLabel();i+=", URI: "+t.params.embedDomain,window.trackingLabel=i;var n=e.getSequenceByIndex(t.params.sequenceIndex);if(!n)return void t.notFound();var o=e.getCanvasByIndex(t.params.canvasIndex);if(!o)return void t.notFound();var s=o.getType(),r=t.extensions[s.toString()];if(!r){var a=o.getProperty("format");r=t.extensions[a]}return r?(r.helper=e,void t.featureDetect(function(){t.configure(r,function(e){t.injectCss(r,e,function(){t.createExtension(r,e)})})})):void alert("No matching UV extension found.")})["catch"](function(){this.notFound()}))},e.prototype.isCORSEnabled=function(){return null===this.params.jsonp?Modernizr.cors:!this.params.jsonp},e.prototype.notFound=function(){try{return void parent.$(parent.document).trigger(i.NOT_FOUND)}catch(e){}},e.prototype.featureDetect=function(e){yepnope({test:window.btoa&&window.atob,nope:"lib/base64.min.js",complete:function(){e()}})},e.prototype.configure=function(e,t){var i=this,n=this;this.getConfigExtension(e,function(o){var s=window.DEBUG?"extensions/"+e.name+"/build/"+n.params.getLocaleName()+".config.json":"lib/"+e.name+"."+n.params.getLocaleName()+".config.json";$.getJSON(s,function(n){i.extendConfig(e,n,o,t)})})},e.prototype.extendConfig=function(e,t,i,n){t.name=e.name,i&&(t.uri=this.params.config,$.extend(!0,t,i)),n(t)},e.prototype.getConfigExtension=function(e,t){var i=sessionStorage.getItem(e.name+"."+this.params.localeName);if(i)t(JSON.parse(i));else if(this.params.config)if(this.isCORSEnabled())$.getJSON(this.params.config,function(e){t(e)});else{var n={url:this.params.config,type:"GET",dataType:"jsonp",jsonp:"callback",jsonpCallback:"configExtensionCallback"};$.ajax(n),window.configExtensionCallback=function(e){t(e)}}else t(null)},e.prototype.injectCss=function(e,t,i){var n=window.DEBUG?"extensions/"+e.name+"/build/"+t.options.theme+".css":"themes/"+t.options.theme+"/css/"+e.name+"/theme.css";yepnope.injectCss(n,function(){i()})},e.prototype.createExtension=function(e,t){this.config=t;var i=e.helper;this.extension=new e.type(this),this.extension.helper=i,this.extension.name=e.name,this.extension.create()},e}();return o}),define("modules/uv-shared-module/Panel",["require","exports","./BaseCommands"],function(e,t,i){var n=function(){function e(e,t,i){this.isResized=!1,this.$element=e,this.fitToParentWidth=t||!1,this.fitToParentHeight=i||!1,this.create()}return e.prototype.create=function(){var e=this;$.subscribe(i.RESIZE,function(){e.resize()})},e.prototype.resize=function(){var e=this.$element.parent();this.fitToParentWidth&&this.$element.width(e.width()),this.fitToParentHeight&&this.$element.height(e.height()),this.isResized=!0},e}();return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/BaseView",["require","exports","./Panel"],function(e,t,i){var n=function(e){function t(t,i,n){this.modules=[],this.bootstrapper=$("body > #app").data("bootstrapper"),e.call(this,t,i,n)}return __extends(t,e),t.prototype.create=function(){e.prototype.create.call(this),this.extension=this.bootstrapper.extension,this.config={},this.config.content={},this.config.options={},this.content=this.config.content,this.options=this.config.options;var t=this;t.modules.length&&(t.modules=t.modules.reverse(),_.each(t.modules,function(e){t.config=$.extend(!0,t.config,t.extension.config.modules[e])}))},t.prototype.init=function(){},t.prototype.setConfig=function(e){this.modules.push(e)},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/Dialogue",["require","exports","./BaseView","./BaseCommands"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t,!1,!1),this.allowClose=!0,this.isActive=!1,this.isUnopened=!0}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("dialogue"),e.prototype.create.call(this),$.subscribe(n.CLOSE_ACTIVE_DIALOGUE,function(){t.isActive&&t.allowClose&&t.close()}),$.subscribe(n.ESCAPE,function(){t.isActive&&t.allowClose&&t.close()}),this.$top=$('<div class="top"></div>'),this.$element.append(this.$top),this.$closeButton=$('<a href="#" class="close" tabindex="0">'+this.content.close+"</a>"),this.$top.append(this.$closeButton),this.$middle=$('<div class="middle"></div>'),this.$element.append(this.$middle),this.$content=$('<div class="content"></div>'),this.$middle.append(this.$content),this.$bottom=$('<div class="bottom"></div>'),this.$element.append(this.$bottom),this.$closeButton.on("click",function(e){e.preventDefault(),t.close()}),this.returnFunc=this.close},t.prototype.enableClose=function(){this.allowClose=!0,this.$closeButton.show()},t.prototype.disableClose=function(){this.allowClose=!1,this.$closeButton.hide()},t.prototype.setDockedPosition=function(){var e=Math.floor(this.extension.height()-this.$element.outerHeight(!0)),t=0,i=0;if(this.$triggerButton){var n=Math.normalise(this.$triggerButton.offset().left,0,this.extension.width());t=Math.floor(this.extension.width()*n-this.$element.width()*n),i=this.$element.width()*n}this.$bottom.css("backgroundPosition",i+"px 0px"),this.$element.css({top:e,left:t})},t.prototype.open=function(e){var t=this;this.$element.show(),e&&e.length?(this.$triggerButton=e,this.$bottom.show()):this.$bottom.hide(),this.isActive=!0,setTimeout(function(){var e=t.$element.find(".default");if(e.length)e.focus();else{var i=t.$element.find("input:visible").first();i.length?i.focus():t.$closeButton.focus()}},1),$.publish(n.SHOW_OVERLAY),this.isUnopened&&(this.isUnopened=!1,this.afterFirstOpen()),this.resize()},t.prototype.afterFirstOpen=function(){},t.prototype.close=function(){this.isActive&&(this.$element.hide(),this.isActive=!1,$.publish(this.closeCommand),$.publish(n.HIDE_OVERLAY))},t.prototype.resize=function(){e.prototype.resize.call(this),this.$element.css({top:Math.floor(this.extension.height()/2-this.$element.height()/2),left:Math.floor(this.extension.width()/2-this.$element.width()/2)})},t}(i);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/ClickThroughDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("clickThroughDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_CLICKTHROUGH_DIALOGUE,this.closeCommand=i.HIDE_CLICKTHROUGH_DIALOGUE,
+$.subscribe(this.openCommand,function(e,i){t.acceptCallback=i.acceptCallback,t.resource=i.resource,t.open()}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$title=$("<h1></h1>"),this.$content.append(this.$title),this.$content.append('            <div>                <p class="message scroll"></p>                <div class="buttons">                    <a class="acceptTerms btn btn-primary" href="#" target="_parent"></a>                </div>            </div>'),this.$message=this.$content.find(".message"),this.$acceptTermsButton=this.$content.find(".acceptTerms"),this.$acceptTermsButton.text("Accept Terms and Open"),this.$element.hide(),this.$acceptTermsButton.on("click",function(e){e.preventDefault(),t.close(),$.publish(i.ACCEPT_TERMS),t.acceptCallback&&t.acceptCallback()})},t.prototype.open=function(){e.prototype.open.call(this),this.$title.text(this.resource.clickThroughService.getProperty("label")),this.$message.html(this.resource.clickThroughService.getProperty("description")),this.$message.targetBlank(),this.$message.find("a").on("click",function(){var e=$(this).attr("href");$.publish(i.EXTERNAL_LINK_CLICKED,[e])}),this.resize()},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return o}),define("modules/uv-shared-module/InformationArgs",["require","exports"],function(e,t){var i=function(){function e(e,t){this.informationType=e,this.param=t}return e}();return i}),define("modules/uv-shared-module/InformationType",["require","exports"],function(e,t){var i;return function(e){e[e.AUTH_CORS_ERROR=0]="AUTH_CORS_ERROR",e[e.DEGRADED_RESOURCE=1]="DEGRADED_RESOURCE"}(i||(i={})),i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/LoginDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("loginDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_LOGIN_DIALOGUE,this.closeCommand=i.HIDE_LOGIN_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.loginCallback=i.loginCallback,t.logoutCallback=i.logoutCallback,t.options=i.options,t.resource=i.resource,t.open()}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$title=$("<h1></h1>"),this.$content.append(this.$title),this.$content.append('            <div>                <p class="message scroll"></p>                <div class="buttons">                    <a class="logout btn btn-primary" href="#" target="_parent"></a>                    <a class="login btn btn-primary" href="#" target="_parent"></a>                    <a class="cancel btn btn-primary" href="#"></a>                </div>            </div>'),this.$message=this.$content.find(".message"),this.$loginButton=this.$content.find(".login"),this.$loginButton.text(this.content.login),this.$logoutButton=this.$content.find(".logout"),this.$logoutButton.text(this.content.logout),this.$cancelButton=this.$content.find(".cancel"),this.$cancelButton.text(this.content.cancel),this.$element.hide(),this.$loginButton.on("click",function(e){e.preventDefault(),t.close(),t.loginCallback&&t.loginCallback()}),this.$logoutButton.on("click",function(e){e.preventDefault(),t.close(),t.logoutCallback&&t.logoutCallback()}),this.$cancelButton.on("click",function(e){e.preventDefault(),t.close()}),this.updateLogoutButton()},t.prototype.open=function(){e.prototype.open.call(this),this.$title.text(this.resource.loginService.getProperty("label"));var t=this.resource.loginService.getProperty("description");this.options.warningMessage&&(t='<span class="warning">'+this.extension.config.content[this.options.warningMessage]+'</span><span class="description">'+t+"</span>"),this.updateLogoutButton(),this.$message.html(t),this.$message.targetBlank(),this.$message.find("a").on("click",function(){var e=$(this).attr("href");$.publish(i.EXTERNAL_LINK_CLICKED,[e])}),this.options.showCancelButton?this.$cancelButton.show():this.$cancelButton.hide(),this.resize()},t.prototype.updateLogoutButton=function(){this.extension.isLoggedIn?this.$logoutButton.show():this.$logoutButton.hide()},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return o}),define("modules/uv-shared-module/LoginWarningMessages",["require","exports"],function(e,t){var i=function(){function e(){}return e.FORBIDDEN="forbiddenResourceMessage",e}();return i}),define("modules/uv-shared-module/StringValue",["require","exports"],function(e,t){var i=function(){function e(e){this.value="",e&&(this.value=e.toLowerCase())}return e.prototype.toString=function(){return this.value},e}();t.StringValue=i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/MetricType",["require","exports","./StringValue"],function(e,t,i){var n=function(e){function t(){e.apply(this,arguments)}return __extends(t,e),t.MOBILELANDSCAPE=new t("mobilelandscape"),t.LAPTOP=new t("laptop"),t}(i.StringValue);t.MetricType=n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/RestrictedDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("restrictedDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_RESTRICTED_DIALOGUE,this.closeCommand=i.HIDE_RESTRICTED_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.acceptCallback=i.acceptCallback,t.options=i.options,t.resource=i.resource,t.open()}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$title=$("<h1></h1>"),this.$content.append(this.$title),this.$content.append('            <div>                <p class="message scroll"></p>                <div class="buttons">                    <a class="cancel btn btn-primary" href="#" target="_parent"></a>                </div>            </div>'),this.$message=this.$content.find(".message"),this.$message.targetBlank(),this.$cancelButton=this.$content.find(".cancel"),this.$cancelButton.text(this.content.cancel),this.$element.hide(),this.$cancelButton.on("click",function(e){e.preventDefault(),t.close()})},t.prototype.open=function(){e.prototype.open.call(this),this.isAccepted=!1,this.$title.text(this.resource.restrictedService.getProperty("label"));var t=this.resource.restrictedService.getProperty("description");this.$message.html(t),this.$message.targetBlank(),this.$message.find("a").on("click",function(){var e=$(this).attr("href");$.publish(i.EXTERNAL_LINK_CLICKED,[e])}),this.resize()},t.prototype.close=function(){e.prototype.close.call(this),!this.isAccepted&&this.acceptCallback&&(this.isAccepted=!0,this.acceptCallback())},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/GenericDialogue",["require","exports","./BaseCommands","./Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("genericDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_GENERIC_DIALOGUE,this.closeCommand=i.HIDE_GENERIC_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.acceptCallback=i.acceptCallback,t.showMessage(i)}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$message=$("<p></p>"),this.$content.append(this.$message),this.$acceptButton=$('<a href="#" class="btn btn-primary accept default"></a>'),this.$content.append(this.$acceptButton),this.$acceptButton.text(this.content.ok),this.$acceptButton.onPressed(function(){t.accept()}),this.returnFunc=function(){t.isActive&&t.accept()},this.$element.hide()},t.prototype.accept=function(){$.publish(i.CLOSE_ACTIVE_DIALOGUE),this.acceptCallback&&this.acceptCallback()},t.prototype.showMessage=function(e){this.$message.html(e.message),e.buttonText?this.$acceptButton.text(e.buttonText):this.$acceptButton.text(this.content.ok),e.allowClose===!1&&this.disableClose(),this.open()},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/Shell",["require","exports","./BaseCommands","./BaseView","./GenericDialogue"],function(e,t,i,n,o){var s=function(e){function t(i){t.$element=i,e.call(this,t.$element,!0,!0)}return __extends(t,e),t.prototype.create=function(){e.prototype.create.call(this),$.subscribe(i.SHOW_OVERLAY,function(){t.$overlays.show()}),$.subscribe(i.HIDE_OVERLAY,function(){t.$overlays.hide()}),t.$headerPanel=$('<div class="headerPanel"></div>'),t.$element.append(t.$headerPanel),t.$mainPanel=$('<div class="mainPanel"></div>'),t.$element.append(t.$mainPanel),t.$centerPanel=$('<div class="centerPanel"></div>'),t.$mainPanel.append(t.$centerPanel),t.$leftPanel=$('<div class="leftPanel"></div>'),t.$mainPanel.append(t.$leftPanel),t.$rightPanel=$('<div class="rightPanel"></div>'),t.$mainPanel.append(t.$rightPanel),t.$footerPanel=$('<div class="footerPanel"></div>'),t.$element.append(t.$footerPanel),t.$mobileFooterPanel=$('<div class="footerPanel mobile"></div>'),t.$element.append(t.$mobileFooterPanel),t.$overlays=$('<div class="overlays"></div>'),t.$element.append(t.$overlays),t.$genericDialogue=$('<div class="overlay genericDialogue"></div>'),t.$overlays.append(t.$genericDialogue),t.$overlays.on("click",function(e){$(e.target).hasClass("overlays")&&(e.preventDefault(),$.publish(i.CLOSE_ACTIVE_DIALOGUE))}),new o(t.$genericDialogue)},t.prototype.resize=function(){e.prototype.resize.call(this),t.$overlays.width(this.extension.width()),t.$overlays.height(this.extension.height());var i=this.$element.height()-parseInt(t.$mainPanel.css("marginTop"))-(t.$headerPanel.is(":visible")?t.$headerPanel.height():0)-(t.$footerPanel.is(":visible")?t.$footerPanel.height():0)-(t.$mobileFooterPanel.is(":visible")?t.$mobileFooterPanel.height():0);t.$mainPanel.height(i)},t}(n);return s}),define("modules/uv-shared-module/BaseExtension",["require","exports","./BaseCommands","../../BootstrapParams","../../modules/uv-dialogues-module/ClickThroughDialogue","./InformationArgs","./InformationType","../../modules/uv-dialogues-module/LoginDialogue","./LoginWarningMessages","../../modules/uv-shared-module/MetricType","../../Params","../../modules/uv-dialogues-module/RestrictedDialogue","./Shell"],function(e,t,i,n,o,s,r,a,l,h,c,u,p){var d=function(){function t(e){this.isCreated=!1,this.isLoggedIn=!1,this.metric=h.MetricType.LAPTOP,this.metrics=[],this.shifted=!1,this.tabbing=!1,this.bootstrapper=e,this.config=this.bootstrapper.config,this.jsonp=this.bootstrapper.params.jsonp,this.locale=this.bootstrapper.params.getLocaleName(),this.isHomeDomain=this.bootstrapper.params.isHomeDomain,this.isReload=this.bootstrapper.params.isReload,this.embedDomain=this.bootstrapper.params.embedDomain,this.isOnlyInstance=this.bootstrapper.params.isOnlyInstance,this.embedScriptUri=this.bootstrapper.params.embedScriptUri,this.domain=this.bootstrapper.params.domain,this.isLightbox=this.bootstrapper.params.isLightbox}return t.prototype.create=function(e){var t=this,o=this;this.$element=$("#app"),this.$element.data("bootstrapper",this.bootstrapper);var s=$(window);if(this.embedWidth=s.width(),this.embedHeight=s.height(),this.$element.width(this.embedWidth),this.$element.height(this.embedHeight),this._parseMetrics(),!this.isReload&&Utils.Documents.isInIFrame()&&(this.bootstrapper.socket=new easyXDM.Socket({onMessage:function(e,i){e=$.parseJSON(e),t.handleParentFrameEvent(e)}})),this.triggerSocket(i.LOAD,{bootstrapper:{config:this.bootstrapper.config,params:this.bootstrapper.params},settings:this.getSettings(),preview:this.getSharePreview()}),this.$element.empty(),this.$element.removeClass(),this.$element.addClass("browser-"+window.browserDetect.browser),this.$element.addClass("browser-version-"+window.browserDetect.version),this.isHomeDomain||this.$element.addClass("embedded"),this.isLightbox&&this.$element.addClass("lightbox"),$(document).on("mousemove",function(e){t.mouseX=e.pageX,t.mouseY=e.pageY}),!this.isReload){window.onresize=function(){var e=$(window);$("body").height(e.height()),t.resize()};var r=Utils.Documents.getHiddenProp();if(r){var a=r.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(a,function(){Utils.Documents.isHidden()||t.resize()})}Utils.Bools.getBool(this.config.options.dropEnabled,!0)&&this.$element.on("drop",function(e){e.preventDefault();var o=e.originalEvent.dataTransfer.getData("URL"),s=Utils.Urls.getUrlParts(o),r=Utils.Urls.getQuerystringParameterFromString("manifest",s.search);if(r){t.triggerSocket(i.DROP,r);var a=new n;a.manifestUri=r,t.reload(a)}}),this.$element.on("dragover",function(e){e.preventDefault()}),$(document).on("keyup keydown",function(e){t.shifted=e.shiftKey,t.tabbing=e.keyCode===KeyCodes.KeyDown.Tab}),$(document).keydown(function(e){var t=null,n=!0;e.ctrlKey||e.altKey||e.shiftKey||(e.keyCode===KeyCodes.KeyDown.Enter&&(t=i.RETURN,n=!1),e.keyCode===KeyCodes.KeyDown.Escape&&(t=i.ESCAPE),e.keyCode===KeyCodes.KeyDown.PageUp&&(t=i.PAGE_UP),e.keyCode===KeyCodes.KeyDown.PageDown&&(t=i.PAGE_DOWN),e.keyCode===KeyCodes.KeyDown.End&&(t=i.END),e.keyCode===KeyCodes.KeyDown.Home&&(t=i.HOME),(e.keyCode===KeyCodes.KeyDown.NumpadPlus||171===e.keyCode||e.keyCode===KeyCodes.KeyDown.Equals)&&(t=i.PLUS,n=!1),(e.keyCode===KeyCodes.KeyDown.NumpadMinus||173===e.keyCode||e.keyCode===KeyCodes.KeyDown.Dash)&&(t=i.MINUS,n=!1),o.useArrowKeysToNavigate()&&(e.keyCode===KeyCodes.KeyDown.LeftArrow&&(t=i.LEFT_ARROW),e.keyCode===KeyCodes.KeyDown.UpArrow&&(t=i.UP_ARROW),e.keyCode===KeyCodes.KeyDown.RightArrow&&(t=i.RIGHT_ARROW),e.keyCode===KeyCodes.KeyDown.DownArrow&&(t=i.DOWN_ARROW))),t&&(n&&e.preventDefault(),$.publish(t))}),this.bootstrapper.params.isHomeDomain&&Utils.Documents.isInIFrame()&&$.subscribe(i.PARENT_EXIT_FULLSCREEN,function(){t.isOverlayActive()&&$.publish(i.ESCAPE),$.publish(i.ESCAPE),$.publish(i.RESIZE)})}this.$element.append('<a href="/" id="top"></a>'),this.$element.append('<iframe id="commsFrame" style="display:none"></iframe>'),$.subscribe(i.ACCEPT_TERMS,function(){t.triggerSocket(i.ACCEPT_TERMS)}),$.subscribe(i.LOGIN_FAILED,function(){t.triggerSocket(i.LOGIN_FAILED),t.showMessage(t.config.content.authorisationFailedMessage)}),$.subscribe(i.LOGIN,function(){t.isLoggedIn=!0,t.triggerSocket(i.LOGIN)}),$.subscribe(i.LOGOUT,function(){t.isLoggedIn=!1,t.triggerSocket(i.LOGOUT)}),$.subscribe(i.BOOKMARK,function(){t.bookmark(),t.triggerSocket(i.BOOKMARK)}),$.subscribe(i.CANVAS_INDEX_CHANGE_FAILED,function(){t.triggerSocket(i.CANVAS_INDEX_CHANGE_FAILED)}),$.subscribe(i.CANVAS_INDEX_CHANGED,function(e,n){t.triggerSocket(i.CANVAS_INDEX_CHANGED,n)}),$.subscribe(i.CLICKTHROUGH,function(){t.triggerSocket(i.CLICKTHROUGH)}),$.subscribe(i.CLOSE_ACTIVE_DIALOGUE,function(){t.triggerSocket(i.CLOSE_ACTIVE_DIALOGUE)}),$.subscribe(i.CLOSE_LEFT_PANEL,function(){t.triggerSocket(i.CLOSE_LEFT_PANEL),t.resize()}),$.subscribe(i.CLOSE_RIGHT_PANEL,function(){t.triggerSocket(i.CLOSE_RIGHT_PANEL),t.resize()}),$.subscribe(i.CREATED,function(){t.isCreated=!0,t.triggerSocket(i.CREATED)}),$.subscribe(i.DOWN_ARROW,function(){t.triggerSocket(i.DOWN_ARROW)}),$.subscribe(i.DOWNLOAD,function(e,n){t.triggerSocket(i.DOWNLOAD,n)}),$.subscribe(i.END,function(){t.triggerSocket(i.END)}),$.subscribe(i.ESCAPE,function(){t.triggerSocket(i.ESCAPE),t.isFullScreen()&&!t.isOverlayActive()&&$.publish(i.TOGGLE_FULLSCREEN)}),$.subscribe(i.EXTERNAL_LINK_CLICKED,function(e,n){t.triggerSocket(i.EXTERNAL_LINK_CLICKED,n)}),$.subscribe(i.FEEDBACK,function(){t.feedback()}),$.subscribe(i.FORBIDDEN,function(){t.triggerSocket(i.FORBIDDEN),$.publish(i.OPEN_EXTERNAL_RESOURCE)}),$.subscribe(i.HIDE_DOWNLOAD_DIALOGUE,function(){t.triggerSocket(i.HIDE_DOWNLOAD_DIALOGUE)}),$.subscribe(i.HIDE_EMBED_DIALOGUE,function(){t.triggerSocket(i.HIDE_EMBED_DIALOGUE)}),$.subscribe(i.HIDE_EXTERNALCONTENT_DIALOGUE,function(){t.triggerSocket(i.HIDE_EXTERNALCONTENT_DIALOGUE)}),$.subscribe(i.HIDE_GENERIC_DIALOGUE,function(){t.triggerSocket(i.HIDE_GENERIC_DIALOGUE)}),$.subscribe(i.HIDE_HELP_DIALOGUE,function(){t.triggerSocket(i.HIDE_HELP_DIALOGUE)}),$.subscribe(i.HIDE_INFORMATION,function(){t.triggerSocket(i.HIDE_INFORMATION)}),$.subscribe(i.HIDE_LOGIN_DIALOGUE,function(){t.triggerSocket(i.HIDE_LOGIN_DIALOGUE)}),$.subscribe(i.HIDE_OVERLAY,function(){t.triggerSocket(i.HIDE_OVERLAY)}),$.subscribe(i.HIDE_RESTRICTED_DIALOGUE,function(){t.triggerSocket(i.HIDE_RESTRICTED_DIALOGUE)}),$.subscribe(i.HIDE_SETTINGS_DIALOGUE,function(){t.triggerSocket(i.HIDE_SETTINGS_DIALOGUE)}),$.subscribe(i.HOME,function(){t.triggerSocket(i.HOME)}),$.subscribe(i.LEFT_ARROW,function(){t.triggerSocket(i.LEFT_ARROW)}),$.subscribe(i.LEFTPANEL_COLLAPSE_FULL_FINISH,function(){t.triggerSocket(i.LEFTPANEL_COLLAPSE_FULL_FINISH)}),$.subscribe(i.LEFTPANEL_COLLAPSE_FULL_START,function(){t.triggerSocket(i.LEFTPANEL_COLLAPSE_FULL_START)}),$.subscribe(i.LEFTPANEL_EXPAND_FULL_FINISH,function(){t.triggerSocket(i.LEFTPANEL_EXPAND_FULL_FINISH)}),$.subscribe(i.LEFTPANEL_EXPAND_FULL_START,function(){t.triggerSocket(i.LEFTPANEL_EXPAND_FULL_START)}),$.subscribe(i.LOAD_FAILED,function(){t.triggerSocket(i.LOAD_FAILED),_.isNull(o.lastCanvasIndex)||o.lastCanvasIndex===o.helper.canvasIndex||t.viewCanvas(o.lastCanvasIndex)}),$.subscribe(i.NOT_FOUND,function(){t.triggerSocket(i.NOT_FOUND)}),$.subscribe(i.OPEN,function(){t.triggerSocket(i.OPEN);var e=String.format(t.config.options.openTemplate,t.helper.iiifResourceUri);window.open(e)}),$.subscribe(i.OPEN_LEFT_PANEL,function(){t.triggerSocket(i.OPEN_LEFT_PANEL),t.resize()}),$.subscribe(i.OPEN_EXTERNAL_RESOURCE,function(){t.triggerSocket(i.OPEN_EXTERNAL_RESOURCE)}),$.subscribe(i.OPEN_RIGHT_PANEL,function(){t.triggerSocket(i.OPEN_RIGHT_PANEL),t.resize()}),$.subscribe(i.PAGE_DOWN,function(){t.triggerSocket(i.PAGE_DOWN)}),$.subscribe(i.PAGE_UP,function(){t.triggerSocket(i.PAGE_UP)}),$.subscribe(i.RESOURCE_DEGRADED,function(e,n){t.triggerSocket(i.RESOURCE_DEGRADED),t.handleDegraded(n)}),$.subscribe(i.RETURN,function(){t.triggerSocket(i.RETURN)}),$.subscribe(i.RIGHT_ARROW,function(){t.triggerSocket(i.RIGHT_ARROW)}),$.subscribe(i.RIGHTPANEL_COLLAPSE_FULL_FINISH,function(){t.triggerSocket(i.RIGHTPANEL_COLLAPSE_FULL_FINISH)}),$.subscribe(i.RIGHTPANEL_COLLAPSE_FULL_START,function(){t.triggerSocket(i.RIGHTPANEL_COLLAPSE_FULL_START)}),$.subscribe(i.RIGHTPANEL_EXPAND_FULL_FINISH,function(){t.triggerSocket(i.RIGHTPANEL_EXPAND_FULL_FINISH)}),$.subscribe(i.RIGHTPANEL_EXPAND_FULL_START,function(){t.triggerSocket(i.RIGHTPANEL_EXPAND_FULL_START)}),$.subscribe(i.SEQUENCE_INDEX_CHANGED,function(){t.triggerSocket(i.SEQUENCE_INDEX_CHANGED)}),$.subscribe(i.SETTINGS_CHANGED,function(e,n){t.triggerSocket(i.SETTINGS_CHANGED,n)}),$.subscribe(i.SHOW_DOWNLOAD_DIALOGUE,function(){t.triggerSocket(i.SHOW_DOWNLOAD_DIALOGUE)}),$.subscribe(i.SHOW_EMBED_DIALOGUE,function(){t.triggerSocket(i.SHOW_EMBED_DIALOGUE)}),$.subscribe(i.SHOW_EXTERNALCONTENT_DIALOGUE,function(){t.triggerSocket(i.SHOW_EXTERNALCONTENT_DIALOGUE)}),$.subscribe(i.SHOW_GENERIC_DIALOGUE,function(){t.triggerSocket(i.SHOW_GENERIC_DIALOGUE)}),$.subscribe(i.SHOW_HELP_DIALOGUE,function(){t.triggerSocket(i.SHOW_HELP_DIALOGUE)}),$.subscribe(i.SHOW_INFORMATION,function(){t.triggerSocket(i.SHOW_INFORMATION)}),$.subscribe(i.SHOW_LOGIN_DIALOGUE,function(){t.triggerSocket(i.SHOW_LOGIN_DIALOGUE)}),$.subscribe(i.SHOW_CLICKTHROUGH_DIALOGUE,function(){t.triggerSocket(i.SHOW_CLICKTHROUGH_DIALOGUE)}),$.subscribe(i.SHOW_RESTRICTED_DIALOGUE,function(){t.triggerSocket(i.SHOW_RESTRICTED_DIALOGUE)}),$.subscribe(i.SHOW_OVERLAY,function(){t.triggerSocket(i.SHOW_OVERLAY)}),$.subscribe(i.SHOW_SETTINGS_DIALOGUE,function(){t.triggerSocket(i.SHOW_SETTINGS_DIALOGUE)}),$.subscribe(i.SHOW_TERMS_OF_USE,function(){t.triggerSocket(i.SHOW_TERMS_OF_USE);var e=t.helper.getAttribution();t.showMessage(e)}),$.subscribe(i.THUMB_SELECTED,function(e,n){t.triggerSocket(i.THUMB_SELECTED,n.index)}),$.subscribe(i.TOGGLE_FULLSCREEN,function(){$("#top").focus(),t.bootstrapper.isFullScreen=!t.bootstrapper.isFullScreen,t.triggerSocket(i.TOGGLE_FULLSCREEN,{isFullScreen:t.bootstrapper.isFullScreen,overrideFullScreen:t.config.options.overrideFullScreen})}),$.subscribe(i.UP_ARROW,function(){t.triggerSocket(i.UP_ARROW)}),$.subscribe(i.UPDATE_SETTINGS,function(){t.triggerSocket(i.UPDATE_SETTINGS)}),$.subscribe(i.VIEW_FULL_TERMS,function(){t.triggerSocket(i.VIEW_FULL_TERMS)}),$.subscribe(i.WINDOW_UNLOAD,function(){t.triggerSocket(i.WINDOW_UNLOAD)}),this.shell=new p(this.$element),e?this.loadDependencies(e):this.getDependencies(function(e){t.loadDependencies(e)})},t.prototype.createModules=function(){this.$clickThroughDialogue=$('<div class="overlay clickthrough"></div>'),p.$overlays.append(this.$clickThroughDialogue),this.clickThroughDialogue=new o(this.$clickThroughDialogue),this.$restrictedDialogue=$('<div class="overlay login"></div>'),p.$overlays.append(this.$restrictedDialogue),this.restrictedDialogue=new u(this.$restrictedDialogue),this.$loginDialogue=$('<div class="overlay login"></div>'),p.$overlays.append(this.$loginDialogue),this.loginDialogue=new a(this.$loginDialogue)},t.prototype.modulesCreated=function(){},t.prototype.getDependencies=function(t){var i=this,n=window.DEBUG?"../../extensions/"+this.name+"/dependencies":this.name+"-dependencies",o=$("script[data-requiremodule]").filter(function(){var e=$(this).attr("data-requiremodule");return-1!=e.indexOf(i.name)&&-1!=e.indexOf("dependencies")});o.length?t(null):e([n],function(e){for(var n=window.DEBUG?"../../extensions/"+i.name+"/lib/":"",o=0;o<e.dependencies.length;o++)e.dependencies[o]=n+e.dependencies[o];t(e)})},t.prototype.loadDependencies=function(t){var i=this;t?e(t.dependencies,function(){i.dependenciesLoaded()}):i.dependenciesLoaded()},t.prototype.dependenciesLoaded=function(){this.createModules(),this.modulesCreated(),$.publish(i.RESIZE),$.publish(i.CREATED),this.setParams(),this.setDefaultFocus(),this.viewCanvas(this.getCanvasIndexParam())},t.prototype.setParams=function(){this.isHomeDomain&&(this.setParam(c.collectionIndex,this.helper.collectionIndex),this.setParam(c.manifestIndex,this.helper.manifestIndex),this.setParam(c.sequenceIndex,this.helper.sequenceIndex),this.setParam(c.canvasIndex,this.helper.canvasIndex))},t.prototype.setDefaultFocus=function(){var e=this;setTimeout(function(){e.config.options.allowStealFocus&&$("[tabindex=0]").focus()},1)},t.prototype.width=function(){return $(window).width()},t.prototype.height=function(){return $(window).height()},t.prototype.triggerSocket=function(e,t){jQuery(document).trigger(e,[t]),this.bootstrapper.socket&&this.bootstrapper.socket.postMessage(JSON.stringify({eventName:e,eventObject:t}))},t.prototype.redirect=function(e){this.triggerSocket(i.REDIRECT,e)},t.prototype.refresh=function(){this.triggerSocket(i.REFRESH,null)},t.prototype._parseMetrics=function(){var e=this.config.options.metrics;if(e)for(var t=0;t<e.length;t++){var i=e[t];i.type=new h.MetricType(i.type),this.metrics.push(i)}},t.prototype._updateMetric=function(){for(var e=0;e<this.metrics.length;e++){var t=this.metrics[e];this.width()>t.minWidth&&this.width()<=t.maxWidth&&this.metric!==t.type&&(this.metric=t.type,$.publish(i.METRIC_CHANGED))}},t.prototype.resize=function(){this._updateMetric(),$.publish(i.RESIZE)},t.prototype.handleParentFrameEvent=function(e){var t=this;Utils.Async.waitFor(function(){return t.isCreated},function(){switch(e.eventName){case i.TOGGLE_FULLSCREEN:$.publish(i.TOGGLE_FULLSCREEN,e.eventObject);break;case i.PARENT_EXIT_FULLSCREEN:$.publish(i.PARENT_EXIT_FULLSCREEN)}})},t.prototype.reload=function(e){var t=new n;e&&(t=$.extend(t,e)),t.isReload=!0,$.disposePubSub(),this.bootstrapper.bootstrap(t)},t.prototype.getCanvasIndexParam=function(){return this.bootstrapper.params.getParam(c.canvasIndex)},t.prototype.getSequenceIndexParam=function(){return this.bootstrapper.params.getParam(c.sequenceIndex)},t.prototype.isSeeAlsoEnabled=function(){return this.config.options.seeAlsoEnabled!==!1},t.prototype.getShareUrl=function(){if(this.isDeepLinkingEnabled())return Utils.Documents.isInIFrame()?parent.document.location.href:document.location.href;if(this.helper.hasRelatedPage()){var e=this.helper.getRelated();return e&&e.length&&(e=e[0]),e["@id"]}return null},t.prototype.getIIIFShareUrl=function(){return this.helper.iiifResourceUri+"?manifest="+this.helper.iiifResourceUri},t.prototype.addTimestamp=function(e){return e+"?t="+Utils.Dates.getTimeStamp()},t.prototype.isDeepLinkingEnabled=function(){return this.isHomeDomain&&this.isOnlyInstance},t.prototype.isOnHomeDomain=function(){return this.isDeepLinkingEnabled()},t.prototype.getDomain=function(){var e=Utils.Urls.getUrlParts(this.helper.iiifResourceUri);return e.host},t.prototype.getEmbedDomain=function(){return this.embedDomain},t.prototype.getSettings=function(){if(Utils.Bools.getBool(this.config.options.saveUserSettings,!1)){var e=Utils.Storage.get("uv.settings",Utils.StorageType.local);if(e)return $.extend(this.config.options,e.value)}return this.config.options},t.prototype.updateSettings=function(e){if(Utils.Bools.getBool(this.config.options.saveUserSettings,!1)){var t=Utils.Storage.get("uv.settings",Utils.StorageType.local);t&&(e=$.extend(t.value,e)),Utils.Storage.set("uv.settings",e,31536e4,Utils.StorageType.local)}this.config.options=$.extend(this.config.options,e)},t.prototype.sanitize=function(e){var t=document.createElement("div"),i=$(t);i.html(e);var n=new Sanitize({elements:["a","b","br","img","p","i","span"],attributes:{a:["href"],img:["src","alt"]},protocols:{a:{href:["http","https"]}}});return i.html(n.clean_node(t)),i.html()},t.prototype.getLocales=function(){if(this.locales)return this.locales;var e=this.config.localisation.locales.clone(),t=this.bootstrapper.params.locales,i=[];_.each(t,function(t){var n=_.filter(e,function(e){return e.name===t.name});if(n.length){var o=n[0];t.label&&(o.label=t.label),o.added=!0,i.push(o)}});var n=Utils.Bools.getBool(this.config.options.limitLocales,!1);return n||_.each(e,function(e){e.added||i.push(e),delete e.added}),this.locales=i},t.prototype.getAlternateLocale=function(){for(var e,t=this.getLocales(),i=0;i<t.length;i++){var n=t[i];n.name!==this.locale&&(e=n)}return n},t.prototype.changeLocale=function(e){var t=this.locales.clone(),i=t.indexOfTest(function(t){return t.name===e});t.move(i,0);var o=this.serializeLocales(t),s=new n;s.setLocale(o),this.reload(s)},t.prototype.serializeLocales=function(e){for(var t="",i=0;i<e.length;i++){var n=e[i];i>0&&(t+=","),t+=n.name,n.label&&(t+=":"+n.label)}return t},t.prototype.getSerializedLocales=function(){return this.serializeLocales(this.locales)},t.prototype.getSharePreview=function(){var e={};e.title=this.helper.getLabel();var t=this.helper.getCurrentCanvas(),i=t.getProperty("thumbnail");return i&&_.isString(i)||(i=t.getCanonicalImageUri(this.config.options.bookmarkThumbWidth)),e.image=i,e},t.prototype.getPagedIndices=function(e){return"undefined"==typeof e&&(e=this.helper.canvasIndex),[e]},t.prototype.getCurrentCanvases=function(){for(var e=this.getPagedIndices(this.helper.canvasIndex),t=[],i=0;i<e.length;i++){var n=e[i],o=this.helper.getCanvasByIndex(n);t.push(o)}return t},t.prototype.getCanvasLabels=function(e){var t=this.getPagedIndices(),i="";if(1===t.length)i=e;else for(var n=1;n<=t.length;n++)i.length&&(i+=","),i+=e+" "+n;return i},t.prototype.getCurrentCanvasRange=function(){var e=this.helper.getCanvasRange(this.helper.getCurrentCanvas());return e},t.prototype.getExternalResources=function(e){var t=this,n=this.getPagedIndices(),o=[];_.each(n,function(i){var n=t.helper.getCanvasByIndex(i),s=new Manifold.ExternalResource(n,t.helper.getInfoUri);if(s.index=i,e){var r=_.find(e,function(e){return e.dataUri===s.dataUri});r?o.push(r):o.push(s)}else o.push(s)});var s=this.config.options.tokenStorage;return new Promise(function(e){manifesto.Utils.loadExternalResources(o,s,t.clickThrough,t.restricted,t.login,t.getAccessToken,t.storeAccessToken,t.getStoredAccessToken,t.handleExternalResourceResponse).then(function(i){t.resources=_.map(i,function(e){return e.data.index=e.index,_.toPlainObject(e.data)}),e(t.resources)})["catch"](function(e){switch(e.name){case manifesto.StatusCodes.AUTHORIZATION_FAILED.toString():$.publish(i.LOGIN_FAILED);break;case manifesto.StatusCodes.FORBIDDEN.toString():$.publish(i.FORBIDDEN);break;case manifesto.StatusCodes.RESTRICTED.toString():break;default:t.showMessage(e.message||e)}})})},t.prototype.getParam=function(e){var t;return this.isDeepLinkingEnabled()&&(t=Utils.Urls.getHashParameter(this.bootstrapper.params.paramMap[e],parent.document)),t||(t=Utils.Urls.getQuerystringParameter(this.bootstrapper.params.paramMap[e])),t},t.prototype.setParam=function(e,t){this.isDeepLinkingEnabled()&&Utils.Urls.setHashParameter(this.bootstrapper.params.paramMap[e],t,parent.document)},t.prototype.viewCanvas=function(e){this.helper.isCanvasIndexOutOfRange(e)&&(this.showMessage(this.config.content.canvasIndexOutOfRange),e=0),this.lastCanvasIndex=this.helper.canvasIndex,this.helper.canvasIndex=e,$.publish(i.CANVAS_INDEX_CHANGED,[e]),$.publish(i.OPEN_EXTERNAL_RESOURCE),this.setParam(c.canvasIndex,e)},t.prototype.showMessage=function(e,t,n,o){this.closeActiveDialogue(),$.publish(i.SHOW_GENERIC_DIALOGUE,[{message:e,acceptCallback:t,buttonText:n,allowClose:o}])},t.prototype.closeActiveDialogue=function(){$.publish(i.CLOSE_ACTIVE_DIALOGUE)},t.prototype.isOverlayActive=function(){return p.$overlays.is(":visible")},t.prototype.viewManifest=function(e){var t=new n;t.manifestUri=this.helper.iiifResourceUri,t.collectionIndex=this.helper.getCollectionIndex(e),t.manifestIndex=e.index,t.sequenceIndex=0,t.canvasIndex=0,this.reload(t)},t.prototype.viewCollection=function(e){var t=new n;t.manifestUri=this.helper.iiifResourceUri,t.collectionIndex=e.index,t.manifestIndex=0,t.sequenceIndex=0,t.canvasIndex=0,this.reload(t)},t.prototype.isFullScreen=function(){return this.bootstrapper.isFullScreen},t.prototype.isHeaderPanelEnabled=function(){return Utils.Bools.getBool(this.config.options.headerPanelEnabled,!0)},t.prototype.isLeftPanelEnabled=function(){if(Utils.Bools.getBool(this.config.options.leftPanelEnabled,!0)){if(this.helper.hasParentCollection())return!0;if(this.helper.isMultiCanvas()&&this.helper.getViewingHint().toString()!==manifesto.ViewingHint.continuous().toString())return!0}return!1},t.prototype.isRightPanelEnabled=function(){return Utils.Bools.getBool(this.config.options.rightPanelEnabled,!0)},t.prototype.isFooterPanelEnabled=function(){return Utils.Bools.getBool(this.config.options.footerPanelEnabled,!0)},t.prototype.useArrowKeysToNavigate=function(){return Utils.Bools.getBool(this.config.options.useArrowKeysToNavigate,!0)},t.prototype.bookmark=function(){},t.prototype.feedback=function(){this.triggerSocket(i.FEEDBACK,new n)},t.prototype.getBookmarkUri=function(){var e=parent.document.URL,t=Utils.Urls.getUrlParts(e),i=t.pathname+t.search+parent.document.location.hash;return i.startsWith("/")||(i="/"+i),i},t.prototype.clickThrough=function(e){return new Promise(function(t){$.publish(i.SHOW_CLICKTHROUGH_DIALOGUE,[{resource:e,acceptCallback:function(){var n=window.open(e.clickThroughService.id),o=window.setInterval(function(){
+n.closed&&(window.clearInterval(o),$.publish(i.CLICKTHROUGH),t())},500)}}])})},t.prototype.restricted=function(e){return new Promise(function(t,n){$.publish(i.SHOW_RESTRICTED_DIALOGUE,[{resource:e,acceptCallback:function(){$.publish(i.LOAD_FAILED),n(e)}}])})},t.prototype.login=function(e){return new Promise(function(t){var n={};e.status===HTTPStatusCode.FORBIDDEN&&(n.warningMessage=l.FORBIDDEN,n.showCancelButton=!0),$.publish(i.SHOW_LOGIN_DIALOGUE,[{resource:e,loginCallback:function(){var n=window.open(e.loginService.id+"?t="+(new Date).getTime()),o=window.setInterval(function(){n.closed&&(window.clearInterval(o),$.publish(i.LOGIN),t())},500)},logoutCallback:function(){var n=window.open(e.logoutService.id+"?t="+(new Date).getTime()),o=window.setInterval(function(){n.closed&&(window.clearInterval(o),$.publish(i.LOGOUT),t())},500)},options:n}])})},t.prototype.getAccessToken=function(e,t){return new Promise(function(i,n){var o=e.tokenService.id,s=o+"|"+(new Date).getTime(),r=function(e){window.removeEventListener("message",r);var o=e.data;o.error?t?n(o.errorDescription):i(null):i(o)};window.addEventListener("message",r,!1);var a=o+"?messageId="+s;$("#commsFrame").prop("src",a)})},t.prototype.storeAccessToken=function(e,t,i){return new Promise(function(n,o){Utils.Storage.set(e.tokenService.id,t,t.expiresIn,new Utils.StorageType(i)),n()})},t.prototype.getStoredAccessToken=function(e,t){return new Promise(function(i,n){var o,s=[];if(e.tokenService&&(o=Utils.Storage.get(e.tokenService.id,new Utils.StorageType(t))),o)s.push(o);else for(var r=Utils.Urls.getUrlParts(e.dataUri).hostname,a=Utils.Storage.getItems(new Utils.StorageType(t)),l=0;l<a.length;l++)o=a[l],o.key.contains(r)&&s.push(o);s=_.sortBy(s,function(e){return e.expiresAt});var h;s.length&&(h=s.last().value),i(h)})},t.prototype.handleExternalResourceResponse=function(e){return new Promise(function(t,n){if(e.isResponseHandled=!0,e.status===HTTPStatusCode.OK)t(e);else if(e.status===HTTPStatusCode.MOVED_TEMPORARILY)t(e),$.publish(i.RESOURCE_DEGRADED,[e]);else if(e.error.status===HTTPStatusCode.UNAUTHORIZED||e.error.status===HTTPStatusCode.INTERNAL_SERVER_ERROR)if(Modernizr.cors)n(e.error.statusText);else{var o=new s(r.AUTH_CORS_ERROR,null);$.publish(i.SHOW_INFORMATION,[o]),t(e)}else if(e.error.status===HTTPStatusCode.FORBIDDEN){var a=new Error;a.message="Forbidden",a.name=manifesto.StatusCodes.FORBIDDEN.toString(),n(a)}else n(e.error.statusText)})},t.prototype.handleDegraded=function(e){var t=new s(r.DEGRADED_RESOURCE,e);$.publish(i.SHOW_INFORMATION,[t])},t}();return d}),define("modules/uv-shared-module/Bookmark",["require","exports"],function(e,t){var i=function(){function e(){}return e}();return i}),define("extensions/uv-mediaelement-extension/Commands",["require","exports"],function(e,t){var i=function(){function e(){}return e.namespace="mediaelementExtension.",e.MEDIA_ENDED=e.namespace+"onMediaEnded",e.MEDIA_PAUSED=e.namespace+"onMediaPaused",e.MEDIA_PLAYED=e.namespace+"onMediaPlayed",e}();return i}),define("modules/uv-shared-module/DownloadOption",["require","exports"],function(e,t){var i=function(){function e(e){this.value=e}return e.prototype.toString=function(){return this.value},e.currentViewAsJpg=new e("currentViewAsJpg"),e.dynamicCanvasRenderings=new e("dynamicCanvasRenderings"),e.dynamicImageRenderings=new e("dynamicImageRenderings"),e.dynamicSequenceRenderings=new e("dynamicSequenceRenderings"),e.entireFileAsOriginal=new e("entireFileAsOriginal"),e.selection=new e("selection"),e.wholeImageHighRes=new e("wholeImageHighRes"),e.wholeImagesHighRes=new e("wholeImagesHighRes"),e.wholeImageLowResAsJpg=new e("wholeImageLowResAsJpg"),e}();return i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/DownloadDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue","../uv-shared-module/DownloadOption"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("downloadDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_DOWNLOAD_DIALOGUE,this.closeCommand=i.HIDE_DOWNLOAD_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.open(i)}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$title=$("<h1>"+this.content.title+"</h1>"),this.$content.append(this.$title),this.$noneAvailable=$('<div class="noneAvailable">'+this.content.noneAvailable+"</div>"),this.$content.append(this.$noneAvailable),this.$downloadOptions=$('<ol class="options"></ol>'),this.$content.append(this.$downloadOptions),this.$footer=$('<div class="footer"></div>'),this.$content.append(this.$footer),this.$termsOfUseButton=$('<a href="#">'+this.extension.config.content.termsOfUse+"</a>"),this.$footer.append(this.$termsOfUseButton),this.$termsOfUseButton.onPressed(function(){$.publish(i.SHOW_TERMS_OF_USE)}),this.$element.hide(),this.updateTermsOfUseButton()},t.prototype.addEntireFileDownloadOptions=function(){var e=this;if(this.isDownloadOptionAvailable(o.entireFileAsOriginal)){this.$downloadOptions.empty();var t=this.extension.helper.getCurrentCanvas(),i=!1;_.each(t.getRenderings(),function(t){var n=t.getFormat(),o="";n&&(o=n.toString()),e.addEntireFileDownloadOption(t.id,Manifesto.TranslationCollection.getValue(t.getLabel()),o),i=!0}),i||this.addEntireFileDownloadOption(t.id,null,null)}},t.prototype.addEntireFileDownloadOption=function(e,t,i){t?t+=" ({0})":t=this.content.entireFileAsOriginal;var n;n=i?Utils.Files.simplifyMimeType(i):this.getFileExtension(e),this.$downloadOptions.append('<li><a href="'+e+'" target="_blank" download tabindex="0">'+String.format(t,n)+"</li>")},t.prototype.updateNoneAvailable=function(){this.$downloadOptions.find("li:visible").length?this.$noneAvailable.hide():this.$noneAvailable.show()},t.prototype.updateTermsOfUseButton=function(){var e=this.extension.helper.getAttribution();Utils.Bools.getBool(this.extension.config.options.termsOfUseEnabled,!1)&&e?this.$termsOfUseButton.show():this.$termsOfUseButton.hide()},t.prototype.getFileExtension=function(e){return e.split(".").pop()},t.prototype.isDownloadOptionAvailable=function(e){switch(e){case o.entireFileAsOriginal:this.extension.helper.manifest.getService(manifesto.ServiceProfile.uiExtensions());if(!this.extension.helper.isUIEnabled("mediaDownload"))return!1}return!0},t.prototype.close=function(){e.prototype.close.call(this)},t.prototype.resize=function(){this.setDockedPosition()},t}(n);return s});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-mediaelement-extension/DownloadDialogue",["require","exports","../../modules/uv-dialogues-module/DownloadDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("downloadDialogue"),e.prototype.create.call(this)},t.prototype.open=function(t){e.prototype.open.call(this,t),this.addEntireFileDownloadOptions(),this.updateNoneAvailable(),this.resize()},t.prototype.isDownloadOptionAvailable=function(t){return e.prototype.isDownloadOptionAvailable.call(this,t)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/ShareDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t),this.aspectRatio=.75,this.isEmbedViewVisible=!1,this.isShareViewVisible=!1,this.maxHeight=this.maxWidth*this.aspectRatio,this.maxWidth=8e3,this.minHeight=this.minWidth*this.aspectRatio,this.minWidth=200}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("shareDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_SHARE_DIALOGUE,this.closeCommand=i.HIDE_SHARE_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.open(i),t.isShareAvailable()?t.openShareView():t.openEmbedView()}),$.subscribe(this.closeCommand,function(e){t.close()}),$.subscribe(i.SHOW_EMBED_DIALOGUE,function(e,i){t.open(i),t.openEmbedView()}),this.$tabs=$('<div class="tabs"></div>'),this.$content.append(this.$tabs),this.$shareButton=$('<a class="share tab default" tabindex="0">'+this.content.share+"</a>"),this.$shareButton.prop("title",this.content.share),this.$tabs.append(this.$shareButton),this.$embedButton=$('<a class="embed tab" tabindex="0">'+this.content.embed+"</a>"),this.$embedButton.prop("title",this.content.embed),this.$tabs.append(this.$embedButton),this.$tabsContent=$('<div class="tabsContent"></div>'),this.$content.append(this.$tabsContent),this.$footer=$('<div class="footer"></div>'),this.$content.append(this.$footer),this.$shareView=$('<div class="shareView view"></div>'),this.$tabsContent.append(this.$shareView),this.$shareHeader=$('<div class="header"></div>'),this.$shareView.append(this.$shareHeader),this.$shareLink=$('<a class="shareLink" onclick="return false;"></a>'),this.$shareView.append(this.$shareLink),this.$shareInput=$('<input class="shareInput" type="text" readonly="true" />'),this.$shareView.append(this.$shareInput),this.$shareFrame=$('<iframe class="shareFrame"></iframe>'),this.$shareView.append(this.$shareFrame),this.$embedView=$('<div class="embedView view"></div>'),this.$tabsContent.append(this.$embedView),this.$embedHeader=$('<div class="header"></div>'),this.$embedView.append(this.$embedHeader),this.$code=$('<input class="code" type="text" readonly="true" />'),this.$embedView.append(this.$code),this.$customSize=$('<div class="customSize"></div>'),this.$embedView.append(this.$customSize),this.$size=$('<span class="size">'+this.content.size+"</span>"),this.$customSize.append(this.$size),this.$customSizeDropDown=$('<select id="size"></select>'),this.$customSize.append(this.$customSizeDropDown),this.$customSizeDropDown.append('<option value="small" data-width="560" data-height="420">560 x 420</option>'),this.$customSizeDropDown.append('<option value="medium" data-width="640" data-height="480">640 x 480</option>'),this.$customSizeDropDown.append('<option value="large" data-width="800" data-height="600">800 x 600</option>'),this.$customSizeDropDown.append('<option value="custom">'+this.content.customSize+"</option>"),this.$widthInput=$('<input class="width" type="text" maxlength="10" />'),this.$customSize.append(this.$widthInput),this.$x=$('<span class="x">x</span>'),this.$customSize.append(this.$x),this.$heightInput=$('<input class="height" type="text" maxlength="10" />'),this.$customSize.append(this.$heightInput);var n=this.extension.getIIIFShareUrl();this.$iiifButton=$('<a class="imageBtn iiif" href="'+n+'" title="'+this.content.iiif+'" target="_blank"></a>'),this.$footer.append(this.$iiifButton),this.$termsOfUseButton=$('<a href="#">'+this.extension.config.content.termsOfUse+"</a>"),this.$footer.append(this.$termsOfUseButton),this.$widthInput.on("keydown",function(e){return Utils.Numbers.numericalInput(e)}),this.$heightInput.on("keydown",function(e){return Utils.Numbers.numericalInput(e)}),this.$shareInput.focus(function(){$(this).select()}),this.$code.focus(function(){$(this).select()}),this.$shareButton.onPressed(function(){t.openShareView()}),this.$embedButton.onPressed(function(){t.openEmbedView()}),this.$customSizeDropDown.change(function(){t.update()}),this.$widthInput.change(function(){t.updateHeightRatio(),t.update()}),this.$heightInput.change(function(){t.updateWidthRatio(),t.update()}),this.$termsOfUseButton.onPressed(function(){$.publish(i.SHOW_TERMS_OF_USE)}),this.$element.hide(),this.update()},t.prototype.open=function(t){e.prototype.open.call(this,t),this.update()},t.prototype.getShareUrl=function(){return this.extension.getShareUrl()},t.prototype.isShareAvailable=function(){return!!this.getShareUrl()},t.prototype.update=function(){this.isShareAvailable()?this.$shareButton.show():this.$shareButton.hide();var e=this.getSelectedSize();"custom"===e.val()?(this.$widthInput.show(),this.$x.show(),this.$heightInput.show()):(this.$widthInput.hide(),this.$x.hide(),this.$heightInput.hide(),this.currentWidth=Number(e.data("width")),this.currentHeight=Number(e.data("height")),this.$widthInput.val(String(this.currentWidth)),this.$heightInput.val(String(this.currentHeight))),this.updateInstructions(),this.updateShareOptions(),this.updateShareFrame(),this.updateTermsOfUseButton()},t.prototype.updateShareOptions=function(){this.$shareInput.val(this.getShareUrl()),this.$shareLink.prop("href",this.getShareUrl()),this.$shareLink.text(this.getShareUrl()),$.browser.mobile?(this.$shareInput.hide(),this.$shareLink.show()):(this.$shareInput.show(),this.$shareLink.hide())},t.prototype.updateInstructions=function(){Utils.Bools.getBool(this.options.instructionsEnabled,!1)?(this.$shareHeader.show(),this.$embedHeader.show(),this.$shareHeader.text(this.content.shareInstructions),this.$embedHeader.text(this.content.embedInstructions)):(this.$shareHeader.hide(),this.$embedHeader.hide())},t.prototype.getSelectedSize=function(){return this.$customSizeDropDown.find(":selected")},t.prototype.updateWidthRatio=function(){this.currentHeight=Number(this.$heightInput.val()),this.currentHeight<this.minHeight?(this.currentHeight=this.minHeight,this.$heightInput.val(String(this.currentHeight))):this.currentHeight>this.maxHeight&&(this.currentHeight=this.maxHeight,this.$heightInput.val(String(this.currentHeight))),this.currentWidth=Math.floor(this.currentHeight/this.aspectRatio),this.$widthInput.val(String(this.currentWidth))},t.prototype.updateHeightRatio=function(){this.currentWidth=Number(this.$widthInput.val()),this.currentWidth<this.minWidth?(this.currentWidth=this.minWidth,this.$widthInput.val(String(this.currentWidth))):this.currentWidth>this.maxWidth&&(this.currentWidth=this.maxWidth,this.$widthInput.val(String(this.currentWidth))),this.currentHeight=Math.floor(this.currentWidth*this.aspectRatio),this.$heightInput.val(String(this.currentHeight))},t.prototype.updateShareFrame=function(){var e=this.extension.helper.getShareServiceUrl();Utils.Bools.getBool(this.config.options.shareFrameEnabled,!0)&&e?(this.$shareFrame.prop("src",e),this.$shareFrame.show()):this.$shareFrame.hide()},t.prototype.updateTermsOfUseButton=function(){var e=this.extension.helper.getAttribution();Utils.Bools.getBool(this.extension.config.options.termsOfUseEnabled,!1)&&e?this.$termsOfUseButton.show():this.$termsOfUseButton.hide()},t.prototype.openShareView=function(){this.isShareViewVisible=!0,this.isEmbedViewVisible=!1,this.$embedView.hide(),this.$shareView.show(),this.$shareButton.addClass("on default"),this.$embedButton.removeClass("on default"),this.resize()},t.prototype.openEmbedView=function(){this.isShareViewVisible=!1,this.isEmbedViewVisible=!0,this.$embedView.show(),this.$shareView.hide(),this.$shareButton.removeClass("on default"),this.$embedButton.addClass("on default"),this.resize()},t.prototype.close=function(){e.prototype.close.call(this)},t.prototype.getViews=function(){return this.$tabsContent.find(".view")},t.prototype.equaliseViewHeights=function(){this.getViews().equaliseHeight(!0)},t.prototype.resize=function(){this.equaliseViewHeights(),this.setDockedPosition()},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-mediaelement-extension/ShareDialogue",["require","exports","../../modules/uv-dialogues-module/ShareDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("shareDialogue"),e.prototype.create.call(this)},t.prototype.update=function(){e.prototype.update.call(this),this.code=this.extension.getEmbedScript(this.options.embedTemplate,this.currentWidth,this.currentHeight),this.$code.val(this.code)},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/FooterPanel",["require","exports","./BaseCommands","./BaseView","./MetricType"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("footerPanel"),e.prototype.create.call(this),$.subscribe(i.TOGGLE_FULLSCREEN,function(){t.updateFullScreenButton()}),$.subscribe(i.METRIC_CHANGED,function(){t.updateMinimisedButtons(),t.updateMoreInfoButton()}),$.subscribe(i.SETTINGS_CHANGED,function(){t.updateDownloadButton()}),this.$options=$('<div class="options"></div>'),this.$element.append(this.$options),this.$feedbackButton=$('<a class="feedback" title="'+this.content.feedback+'" tabindex="0">'+this.content.feedback+"</a>"),this.$options.prepend(this.$feedbackButton),this.$openButton=$('<a class="open" title="'+this.content.open+'" tabindex="0">'+this.content.open+"</a>"),this.$options.prepend(this.$openButton),this.$bookmarkButton=$('<a class="bookmark" title="'+this.content.bookmark+'" tabindex="0">'+this.content.bookmark+"</a>"),this.$options.prepend(this.$bookmarkButton),this.$shareButton=$('<a href="#" class="share" title="'+this.content.share+'" tabindex="0">'+this.content.share+"</a>"),this.$options.append(this.$shareButton),this.$embedButton=$('<a href="#" class="embed" title="'+this.content.embed+'" tabindex="0">'+this.content.embed+"</a>"),this.$options.append(this.$embedButton),this.$downloadButton=$('<a class="download" title="'+this.content.download+'" tabindex="0">'+this.content.download+"</a>"),this.$options.prepend(this.$downloadButton),this.$moreInfoButton=$('<a href="#" class="moreInfo" title="'+this.content.moreInfo+'" tabindex="0">'+this.content.moreInfo+"</a>"),this.$options.prepend(this.$moreInfoButton),this.$fullScreenBtn=$('<a href="#" class="fullScreen" title="'+this.content.fullScreen+'" tabindex="0">'+this.content.fullScreen+"</a>"),this.$options.append(this.$fullScreenBtn),this.$openButton.onPressed(function(){$.publish(i.OPEN)}),this.$feedbackButton.onPressed(function(){$.publish(i.FEEDBACK)}),this.$bookmarkButton.onPressed(function(){$.publish(i.BOOKMARK)}),this.$shareButton.onPressed(function(){$.publish(i.SHOW_SHARE_DIALOGUE,[t.$shareButton])}),this.$embedButton.onPressed(function(){$.publish(i.SHOW_EMBED_DIALOGUE,[t.$embedButton])}),this.$downloadButton.onPressed(function(){$.publish(i.SHOW_DOWNLOAD_DIALOGUE,[t.$downloadButton])}),this.$moreInfoButton.onPressed(function(){$.publish(i.SHOW_MOREINFO_DIALOGUE,[t.$moreInfoButton])}),this.$fullScreenBtn.on("click",function(e){e.preventDefault(),$.publish(i.TOGGLE_FULLSCREEN)}),Utils.Bools.getBool(this.options.embedEnabled,!0)||this.$embedButton.hide(),this.updateMoreInfoButton(),this.updateOpenButton(),this.updateFeedbackButton(),this.updateBookmarkButton(),this.updateEmbedButton(),this.updateDownloadButton(),this.updateFullScreenButton(),this.updateShareButton(),this.updateMinimisedButtons()},t.prototype.updateMinimisedButtons=function(){return Utils.Bools.getBool(this.options.minimiseButtons,!1)?void this.$options.addClass("minimiseButtons"):void(this.extension.metric.toString()===o.MetricType.MOBILELANDSCAPE.toString()?this.$options.addClass("minimiseButtons"):this.$options.removeClass("minimiseButtons"))},t.prototype.updateMoreInfoButton=function(){var e=Utils.Bools.getBool(this.options.moreInfoEnabled,!1);e&&this.extension.metric.toString()===o.MetricType.MOBILELANDSCAPE.toString()?this.$moreInfoButton.show():this.$moreInfoButton.hide()},t.prototype.updateOpenButton=function(){var e=Utils.Bools.getBool(this.options.openEnabled,!1);e&&!this.extension.isHomeDomain?this.$openButton.show():this.$openButton.hide()},t.prototype.updateFullScreenButton=function(){Utils.Bools.getBool(this.options.fullscreenEnabled,!0)||this.$fullScreenBtn.hide(),this.extension.isLightbox&&this.$fullScreenBtn.addClass("lightbox"),this.extension.isFullScreen()?(this.$fullScreenBtn.swapClass("fullScreen","exitFullscreen"),this.$fullScreenBtn.text(this.content.exitFullScreen),this.$fullScreenBtn.attr("title",this.content.exitFullScreen)):(this.$fullScreenBtn.swapClass("exitFullscreen","fullScreen"),this.$fullScreenBtn.text(this.content.fullScreen),this.$fullScreenBtn.attr("title",this.content.fullScreen))},t.prototype.updateEmbedButton=function(){this.extension.helper.isUIEnabled("embed")&&Utils.Bools.getBool(this.options.embedEnabled,!1)?$.browser.mobile||this.$embedButton.show():this.$embedButton.hide()},t.prototype.updateShareButton=function(){this.extension.helper.isUIEnabled("share")&&Utils.Bools.getBool(this.options.shareEnabled,!0)?this.$shareButton.show():this.$shareButton.hide()},t.prototype.updateDownloadButton=function(){var e=Utils.Bools.getBool(this.options.downloadEnabled,!0);e?this.$downloadButton.show():this.$downloadButton.hide()},t.prototype.updateFeedbackButton=function(){var e=Utils.Bools.getBool(this.options.feedbackEnabled,!1);e?this.$feedbackButton.show():this.$feedbackButton.hide()},t.prototype.updateBookmarkButton=function(){var e=Utils.Bools.getBool(this.options.bookmarkEnabled,!1);e?this.$bookmarkButton.show():this.$bookmarkButton.hide()},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return s}),define("modules/uv-shared-module/Information",["require","exports"],function(e,t){var i=function(){function e(e,t){this.message=e,this.actions=t}return e}();return i}),define("modules/uv-shared-module/InformationAction",["require","exports"],function(e,t){var i=function(){function e(){}return e}();return i}),define("modules/uv-shared-module/InformationFactory",["require","exports","./BaseCommands","./Information","./InformationAction","./InformationType"],function(e,t,i,n,o,s){var r=function(){function e(e){this.extension=e}return e.prototype.Get=function(e){switch(e.informationType){case s.AUTH_CORS_ERROR:return new n(this.extension.config.content.authCORSError,[]);case s.DEGRADED_RESOURCE:var t=[],r=new o;return r.label=this.extension.config.content.degradedResourceLogin,r.action=function(){$.publish(i.HIDE_INFORMATION),$.publish(i.OPEN_EXTERNAL_RESOURCE,[[e.param]])},t.push(r),new n(this.extension.config.content.degradedResourceMessage,t)}},e}();return r});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/HeaderPanel",["require","exports","./BaseCommands","./BaseView","../uv-shared-module/InformationFactory"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t,!1,!1)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("headerPanel"),e.prototype.create.call(this),$.subscribe(i.SHOW_INFORMATION,function(e,i){t.showInformation(i)}),$.subscribe(i.HIDE_INFORMATION,function(){t.hideInformation()}),this.$options=$('<div class="options"></div>'),this.$element.append(this.$options),this.$centerOptions=$('<div class="centerOptions"></div>'),this.$options.append(this.$centerOptions),this.$rightOptions=$('<div class="rightOptions"></div>'),this.$options.append(this.$rightOptions),this.$localeToggleButton=$('<a class="localeToggle" tabindex="0"></a>'),this.$rightOptions.append(this.$localeToggleButton),this.$settingsButton=$('<a class="imageBtn settings" tabindex="0"></a>'),this.$settingsButton.attr("title",this.content.settings),this.$rightOptions.append(this.$settingsButton),this.$informationBox=$('<div class="informationBox">                                     <div class="message"></div>                                     <div class="actions"></div>                                     <div class="close"></div>                                   </div>'),this.$element.append(this.$informationBox),this.$informationBox.hide(),this.$informationBox.find(".close").attr("title",this.content.close),this.$informationBox.find(".close").on("click",function(e){e.preventDefault(),$.publish(i.HIDE_INFORMATION)}),this.$localeToggleButton.on("click",function(){t.extension.changeLocale(String(t.$localeToggleButton.data("locale")))}),this.$settingsButton.onPressed(function(){$.publish(i.SHOW_SETTINGS_DIALOGUE)}),this.updateLocaleToggle(),this.updateSettingsButton()},t.prototype.updateLocaleToggle=function(){if(!this.localeToggleIsVisible())return void this.$localeToggleButton.hide();var e=this.extension.getAlternateLocale(),t=e.name.split("-")[0].toUpperCase();this.$localeToggleButton.data("locale",e.name),this.$localeToggleButton.attr("title",e.label),this.$localeToggleButton.text(t)},t.prototype.updateSettingsButton=function(){var e=Utils.Bools.getBool(this.options.settingsButtonEnabled,!0);e?this.$settingsButton.show():this.$settingsButton.hide()},t.prototype.localeToggleIsVisible=function(){return this.extension.getLocales().length>1&&Utils.Bools.getBool(this.options.localeToggleEnabled,!1)},t.prototype.showInformation=function(e){var t=new o(this.extension);this.information=t.Get(e);var i=this.$informationBox.find(".message");i.html(this.information.message).find("a").attr("target","_top");var n=this.$informationBox.find(".actions");n.empty();for(var s=0;s<this.information.actions.length;s++){var r=this.information.actions[s],a=$('<a href="#" class="btn btn-default">'+r.label+"</a>");a.on("click",r.action),n.append(a)}this.$informationBox.show(),this.$element.addClass("showInformation"),this.extension.resize()},t.prototype.hideInformation=function(){this.$element.removeClass("showInformation"),this.$informationBox.hide(),this.extension.resize()},t.prototype.getSettings=function(){return this.extension.getSettings()},t.prototype.updateSettings=function(e){this.extension.updateSettings(e),$.publish(i.UPDATE_SETTINGS,[e])},t.prototype.resize=function(){e.prototype.resize.call(this);var t=this.$element.width(),i=t/2,n=this.$centerOptions.outerWidth(),o=i-n/2;if(this.$centerOptions.css({left:o}),this.$informationBox.is(":visible")){var s=this.$informationBox.find(".actions"),r=this.$informationBox.find(".message");r.width(this.$element.width()-r.horizontalMargins()-s.outerWidth(!0)-this.$informationBox.find(".close").outerWidth(!0)-1),r.ellipsisFill(this.information.message)}this.extension.width()<this.extension.config.options.minWidthBreakPoint?this.localeToggleIsVisible()&&this.$localeToggleButton.hide():this.localeToggleIsVisible()&&this.$localeToggleButton.show()},t}(n);return s});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/HelpDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("helpDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_HELP_DIALOGUE,this.closeCommand=i.HIDE_HELP_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.open()}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$title=$("<h1></h1>"),this.$content.append(this.$title),this.$scroll=$('<div class="scroll"></div>'),this.$content.append(this.$scroll),this.$message=$("<p></p>"),this.$scroll.append(this.$message),this.$title.text(this.content.title),this.$message.html(this.content.text),this.$message.targetBlank(),this.$element.hide()},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/CenterPanel",["require","exports","./Shell","./BaseView"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t,!1,!0)}return __extends(t,e),t.prototype.create=function(){var t=this;e.prototype.create.call(this),this.$title=$('<div class="title"></div>'),this.$element.append(this.$title),this.$content=$('<div id="content" class="content"></div>'),this.$element.append(this.$content),this.$attribution=$('<div class="attribution">                                   <div class="header">                                       <div class="title"></div>                                       <div class="close"></div>                                   </div>                                   <div class="main">                                       <div class="attribution-text"></div>                                       <div class="license"></div>                                       <div class="logo"></div>                                   </div>                              </div>'),this.$attribution.find(".header .title").text(this.content.attribution),this.$content.append(this.$attribution),this.$attribution.hide(),this.$closeAttributionButton=this.$attribution.find(".header .close"),this.$closeAttributionButton.on("click",function(e){e.preventDefault(),t.$attribution.hide()}),Utils.Bools.getBool(this.options.titleEnabled,!0)||this.$title.hide()},t.prototype.updateAttribution=function(){var e=this,t=this.extension.helper.getAttribution(),i=Utils.Bools.getBool(this.options.attributionEnabled,!0);if(t&&i){this.$attribution.show();var n=this.$attribution.find(".attribution-text"),o=this.$attribution.find(".license"),s=this.$attribution.find(".logo");n.html(this.extension.sanitize(t)),n.find("img").one("load",function(){e.resize()}).each(function(){this.complete&&$(this).load()}),n.targetBlank(),n.toggleExpandText(this.options.trimAttributionCount,function(){e.resize()}),o.hide(),s.hide()}},t.prototype.resize=function(){e.prototype.resize.call(this);var t=i.$leftPanel.is(":visible")?Math.floor(i.$leftPanel.width()):0,n=i.$rightPanel.is(":visible")?Math.floor(i.$rightPanel.width()):0,o=Math.floor(this.$element.parent().width()-t-n);this.$element.css({left:t,width:o});var s;s=this.options&&this.options.titleEnabled===!1?0:this.$title.height(),this.$content.height(this.$element.height()-s),this.$content.width(this.$element.width()),this.$attribution&&this.$attribution.is(":visible")&&this.$attribution.css("top",this.$content.height()-this.$attribution.outerHeight()-this.$attribution.verticalMargins())},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-mediaelementcenterpanel-module/MediaElementCenterPanel",["require","exports","../uv-shared-module/BaseCommands","../../extensions/uv-mediaelement-extension/Commands","../uv-shared-module/CenterPanel"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("mediaelementCenterPanel"),e.prototype.create.call(this);var t=this;this.extension.isVideo()&&$.subscribe(i.TOGGLE_FULLSCREEN,function(e){t.bootstrapper.isFullScreen?(t.$container.css("backgroundColor","#000"),t.player.enterFullScreen(!1)):(t.$container.css("backgroundColor","transparent"),t.player.exitFullScreen(!1))}),$.subscribe(i.OPEN_EXTERNAL_RESOURCE,function(e,i){t.openMedia(i)}),this.$container=$('<div class="container"></div>'),this.$content.append(this.$container),this.title=this.extension.helper.getLabel()},t.prototype.openMedia=function(e){var t=this,i=this;this.extension.getExternalResources(e).then(function(){
+t.$container.empty();var e=t.extension.helper.getCurrentCanvas();t.mediaHeight=t.config.defaultHeight,t.mediaWidth=t.config.defaultWidth,t.$container.height(t.mediaHeight),t.$container.width(t.mediaWidth);var o=Utils.Dates.getTimeStamp(),s=t.extension.getPosterImageUri(),r=s?' poster="'+s+'"':"",a=[];if(_.each(e.getRenderings(),function(e){a.push({type:e.getFormat().toString(),src:e.id})}),t.extension.isVideo())t.media=t.$container.append('<video id="'+o+'" type="video/mp4" class="mejs-uv" controls="controls" preload="none"'+r+"></video>"),t.player=new MediaElementPlayer("#"+o,{type:["video/mp4","video/webm","video/flv"],plugins:["flash"],alwaysShowControls:!1,autosizeProgress:!1,success:function(e){e.addEventListener("canplay",function(e){i.resize()}),e.addEventListener("play",function(e){$.publish(n.MEDIA_PLAYED,[Math.floor(i.player.media.currentTime)])}),e.addEventListener("pause",function(e){Math.floor(i.player.media.currentTime)!=Math.floor(i.player.media.duration)&&$.publish(n.MEDIA_PAUSED,[Math.floor(i.player.media.currentTime)])}),e.addEventListener("ended",function(e){$.publish(n.MEDIA_ENDED,[Math.floor(i.player.media.duration)])}),e.setSrc(a);try{e.load()}catch(t){}}});else{var l=0;for(var h in a)if("audio/mp3"===a[h].type){l=h;break}t.media=t.$container.append('<audio id="'+o+'" type="'+a[l].type+'" src="'+a[l].src+'" class="mejs-uv" controls="controls" preload="none"'+r+"></audio>"),t.player=new MediaElementPlayer("#"+o,{plugins:["flash"],alwaysShowControls:!1,autosizeProgress:!1,defaultVideoWidth:i.mediaWidth,defaultVideoHeight:i.mediaHeight,success:function(e){e.addEventListener("canplay",function(e){i.resize()}),e.addEventListener("play",function(e){$.publish(n.MEDIA_PLAYED,[Math.floor(i.player.media.currentTime)])}),e.addEventListener("pause",function(e){Math.floor(i.player.media.currentTime)!=Math.floor(i.player.media.duration)&&$.publish(n.MEDIA_PAUSED,[Math.floor(i.player.media.currentTime)])}),e.addEventListener("ended",function(e){$.publish(n.MEDIA_ENDED,[Math.floor(i.player.media.duration)])});try{e.load()}catch(t){}}})}t.resize()})},t.prototype.resize=function(){if(e.prototype.resize.call(this),"Firefox"===window.browserDetect.browser&&window.browserDetect.version<13)this.$container.width(this.mediaWidth),this.$container.height(this.mediaHeight);else{var t=Utils.Measurements.Dimensions.fitRect(this.mediaWidth,this.mediaHeight,this.$content.width(),this.$content.height());this.$container.height(t.height),this.$container.width(t.width)}this.player&&!this.extension.isFullScreen()&&this.player.resize();var i=Math.floor((this.$content.width()-this.$container.width())/2),n=Math.floor((this.$content.height()-this.$container.height())/2);this.$container.css({left:i,top:n}),this.$title.ellipsisFill(this.title)},t}(o);return s});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/BaseExpandPanel",["require","exports","./BaseView"],function(e,t,i){var n=function(e){function t(t){e.call(this,t,!1,!0),this.isExpanded=!1,this.isFullyExpanded=!1,this.isUnopened=!0,this.autoToggled=!1,this.expandFullEnabled=!0}return __extends(t,e),t.prototype.create=function(){var t=this;e.prototype.create.call(this),this.$top=$('<div class="top"></div>'),this.$element.append(this.$top),this.$title=$('<div class="title"></div>'),this.$title.prop("title",this.content.title),this.$top.append(this.$title),this.$expandFullButton=$('<a class="expandFullButton" tabindex="0"></a>'),this.$expandFullButton.prop("title",this.content.expandFull),this.$top.append(this.$expandFullButton),Utils.Bools.getBool(this.config.options.expandFullEnabled,!0)||this.$expandFullButton.hide(),this.$collapseButton=$('<div class="collapseButton" tabindex="0"></div>'),this.$collapseButton.prop("title",this.content.collapse),this.$top.append(this.$collapseButton),this.$closed=$('<div class="closed"></div>'),this.$element.append(this.$closed),this.$expandButton=$('<a class="expandButton" tabindex="0"></a>'),this.$expandButton.prop("title",this.content.expand),this.$closed.append(this.$expandButton),this.$closedTitle=$('<a class="title"></a>'),this.$closedTitle.prop("title",this.content.title),this.$closed.append(this.$closedTitle),this.$main=$('<div class="main"></div>'),this.$element.append(this.$main),this.$expandButton.onPressed(function(){t.toggle()}),this.$expandFullButton.onPressed(function(){t.expandFull()}),this.$closedTitle.onPressed(function(){t.toggle()}),this.$title.onPressed(function(){t.isFullyExpanded?t.collapseFull():t.toggle()}),this.$collapseButton.onPressed(function(){t.isFullyExpanded?t.collapseFull():t.toggle()}),this.$top.hide(),this.$main.hide()},t.prototype.init=function(){e.prototype.init.call(this)},t.prototype.setTitle=function(e){this.$title.text(e),this.$closedTitle.text(e)},t.prototype.toggle=function(e){var t=this;e?this.autoToggled=!0:this.autoToggled=!1,this.isExpanded&&(this.$top.hide(),this.$main.hide(),this.$closed.show()),this.$element.stop().animate({width:this.getTargetWidth(),left:this.getTargetLeft()},this.options.panelAnimationDuration,function(){t.toggled()})},t.prototype.toggled=function(){this.toggleStart(),this.isExpanded=!this.isExpanded,this.isExpanded&&(this.$closed.hide(),this.$top.show(),this.$main.show()),this.toggleFinish(),this.isUnopened=!1},t.prototype.expandFull=function(){var e=this;this.isExpanded||this.toggled();var t=this.getFullTargetWidth(),i=this.getFullTargetLeft();this.expandFullStart(),this.$element.stop().animate({width:t,left:i},this.options.panelAnimationDuration,function(){e.expandFullFinish()})},t.prototype.collapseFull=function(){var e=this,t=this.getTargetWidth(),i=this.getTargetLeft();this.collapseFullStart(),this.$element.stop().animate({width:t,left:i},this.options.panelAnimationDuration,function(){e.collapseFullFinish()})},t.prototype.getTargetWidth=function(){return 0},t.prototype.getTargetLeft=function(){return 0},t.prototype.getFullTargetWidth=function(){return 0},t.prototype.getFullTargetLeft=function(){return 0},t.prototype.toggleStart=function(){},t.prototype.toggleFinish=function(){this.isExpanded&&!this.autoToggled?this.focusCollapseButton():this.focusExpandButton()},t.prototype.expandFullStart=function(){},t.prototype.expandFullFinish=function(){this.isFullyExpanded=!0,this.$expandFullButton.hide(),this.focusCollapseButton()},t.prototype.collapseFullStart=function(){},t.prototype.collapseFullFinish=function(){this.isFullyExpanded=!1,this.expandFullEnabled&&this.$expandFullButton.show(),this.focusExpandFullButton()},t.prototype.focusExpandButton=function(){var e=this;setTimeout(function(){e.$expandButton.focus()},1)},t.prototype.focusExpandFullButton=function(){var e=this;setTimeout(function(){e.$expandFullButton.focus()},1)},t.prototype.focusCollapseButton=function(){var e=this;setTimeout(function(){e.$collapseButton.focus()},1)},t.prototype.resize=function(){e.prototype.resize.call(this),this.$main.height(this.$element.parent().height()-this.$top.outerHeight(!0))},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/RightPanel",["require","exports","./BaseCommands","./BaseExpandPanel"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){e.prototype.create.call(this),this.$element.width(this.options.panelCollapsedWidth)},t.prototype.init=function(){var t=this;e.prototype.init.call(this);var n=Utils.Bools.getBool(this.extension.getSettings().rightPanelOpen,this.options.panelOpen);n&&this.toggle(!0),$.subscribe(i.TOGGLE_EXPAND_RIGHT_PANEL,function(){t.isFullyExpanded?t.collapseFull():t.expandFull()})},t.prototype.getTargetWidth=function(){return this.isExpanded?this.options.panelCollapsedWidth:this.options.panelExpandedWidth},t.prototype.getTargetLeft=function(){return this.isExpanded?this.$element.parent().width()-this.options.panelCollapsedWidth:this.$element.parent().width()-this.options.panelExpandedWidth},t.prototype.toggleFinish=function(){e.prototype.toggleFinish.call(this),this.isExpanded?$.publish(i.OPEN_RIGHT_PANEL):$.publish(i.CLOSE_RIGHT_PANEL),this.extension.updateSettings({rightPanelOpen:this.isExpanded})},t.prototype.resize=function(){e.prototype.resize.call(this),this.$element.css({left:Math.floor(this.$element.parent().width()-this.$element.outerWidth())})},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-moreinforightpanel-module/MoreInfoRightPanel",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/RightPanel"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("moreInfoRightPanel"),e.prototype.create.call(this),$.subscribe(i.CANVAS_INDEX_CHANGED,function(e,i){t.databind()}),this.setTitle(this.config.content.title),this.$metadata=$('<div class="iiif-metadata-component"></div>'),this.$main.append(this.$metadata),this.component=new IIIFComponents.MetadataComponent(this._getOptions())},t.prototype.toggleFinish=function(){e.prototype.toggleFinish.call(this),this.databind()},t.prototype.databind=function(){this.component.options=this._getOptions(),this.component.databind()},t.prototype._getOptions=function(){var e=this;return{canvasDisplayOrder:this.config.options.canvasDisplayOrder,canvases:this.extension.getCurrentCanvases(),canvasExclude:this.config.options.canvasExclude,canvasLabels:this.extension.getCanvasLabels(this.content.page),content:this.config.content,copiedMessageDuration:2e3,copyToClipboardEnabled:Utils.Bools.getBool(this.config.options.copyToClipboardEnabled,!1),element:".rightPanel .iiif-metadata-component",helper:this.extension.helper,licenseFormatter:null,limit:this.config.options.textLimit||4,limitType:IIIFComponents.MetadataComponentOptions.LimitType.LINES,manifestDisplayOrder:this.config.options.manifestDisplayOrder,manifestExclude:this.config.options.manifestExclude,range:this.extension.getCurrentCanvasRange(),rtlLanguageCodes:this.config.options.rtlLanguageCodes,sanitizer:function(t){return e.extension.sanitize(t)},showAllLanguages:this.config.options.showAllLanguages}},t.prototype.resize=function(){e.prototype.resize.call(this),this.$main.height(this.$element.height()-this.$top.height()-this.$main.verticalMargins())},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/LeftPanel",["require","exports","./BaseCommands","./BaseExpandPanel"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;e.prototype.create.call(this),this.$element.width(this.options.panelCollapsedWidth),$.subscribe(i.TOGGLE_EXPAND_LEFT_PANEL,function(){t.isFullyExpanded?t.collapseFull():t.expandFull()})},t.prototype.init=function(){e.prototype.init.call(this);var t=Utils.Bools.getBool(this.extension.getSettings().leftPanelOpen,this.options.panelOpen);t&&this.toggle(!0)},t.prototype.getTargetWidth=function(){return this.isFullyExpanded||!this.isExpanded?this.options.panelExpandedWidth:this.options.panelCollapsedWidth},t.prototype.getFullTargetWidth=function(){return this.$element.parent().width()},t.prototype.toggleFinish=function(){e.prototype.toggleFinish.call(this),this.isExpanded?$.publish(i.OPEN_LEFT_PANEL):$.publish(i.CLOSE_LEFT_PANEL),this.extension.updateSettings({leftPanelOpen:this.isExpanded})},t.prototype.resize=function(){e.prototype.resize.call(this),this.isFullyExpanded&&this.$element.width(this.$element.parent().width())},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-shared-module/ThumbsView",["require","exports","./BaseCommands","./BaseView"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t,!0,!0),this.isCreated=!1,this.isOpen=!1}return __extends(t,e),t.prototype.create=function(){var t=this;e.prototype.create.call(this),$.subscribe(i.CANVAS_INDEX_CHANGED,function(e,i){t.selectIndex(parseInt(i))}),$.subscribe(i.LOGIN,function(){t.loadThumbs()}),$.subscribe(i.CLICKTHROUGH,function(){t.loadThumbs()}),this.$thumbs=$('<div class="thumbs"></div>'),this.$element.append(this.$thumbs),this.$thumbs.addClass(this.extension.helper.getViewingDirection().toString());var n=this;$.templates({thumbsTemplate:'<div id="thumb{{>index}}" class="{{:~className()}}" data-src="{{>uri}}" data-visible="{{>visible}}" data-index="{{>index}}">                                <div class="wrap" style="height:{{>height + ~extraHeight()}}px"></div>                                <div class="info">                                    <span class="index">{{:#index + 1}}</span>                                    <span class="label" title="{{>label}}">{{>label}}&nbsp;</span>                                    <span class="searchResults" title="{{:~searchResultsTitle()}}">{{>data.searchResults}}</span>                                </div>                             </div>                             {{if ~separator()}}                                  <div class="separator"></div>                              {{/if}}'});var o=this.options.thumbsExtraHeight;$.views.helpers({separator:function(){return!1},extraHeight:function(){return o},className:function(){var e="thumb";0===this.data.index&&(e+=" first"),this.data.uri||(e+=" placeholder");var t=n.extension.helper.getViewingDirection().toString();return e+=t===manifesto.ViewingDirection.topToBottom().toString()||t===manifesto.ViewingDirection.bottomToTop().toString()?" oneCol":" twoCol"},searchResultsTitle:function(){var e=Number(this.data.data.searchResults);return e?e>1?String.format(n.content.searchResults,e):String.format(n.content.searchResult,e):void 0}}),this.$element.on("scroll",function(){t.scrollStop()},100),this.resize()},t.prototype.databind=function(){this.thumbs&&(this._thumbsCache=null,this.createThumbs(),this.loadThumbs(0),this.selectIndex(this.extension.helper.canvasIndex))},t.prototype.createThumbs=function(){var e=this;if(this.thumbs){for(var t=[],n=0;n<this.thumbs.length;n++){var o=this.thumbs[n];t.push(o.height)}for(var s=Math.median(t),n=0;n<this.thumbs.length;n++){var o=this.thumbs[n];o.height=s}this.$thumbs.link($.templates.thumbsTemplate,this.thumbs),this.$thumbs.undelegate(".thumb","click"),this.$thumbs.delegate(".thumb","click",function(t){t.preventDefault();var n=$.view(this).data;e.lastThumbClickedIndex=n.index,$.publish(i.THUMB_SELECTED,[n])}),this.setLabel(),this.isCreated=!0}},t.prototype.selectAll=function(e){},t.prototype.scrollStop=function(){var e=1/((this.$thumbs.height()-this.$element.height())/this.$element.scrollTop());e>1&&(e=1);var t=Math.floor((this.thumbs.length-1)*e);this.loadThumbs(t)},t.prototype.loadThumbs=function(e){if(this.thumbs&&this.thumbs.length){_.isUndefined(e)&&(e=this.extension.helper.canvasIndex);for(var t=e,i=this.options.thumbsLoadRange,n={start:t>i?t-i:0,end:t<this.thumbs.length-1-i?t+i:this.thumbs.length-1},o=this.options.thumbsImageFadeInDuration,s=n.start;s<=n.end;s++){var r=this.getThumbByIndex(s),a=r.find(".wrap");if(!a.hasClass("loading")&&!a.hasClass("loaded")){var l=r.attr("data-visible");if("false"!==l){a.removeClass("loadingFailed"),a.addClass("loading");var h=r.attr("data-src");h+="?t="+Utils.Dates.getTimeStamp();var c=$('<img src="'+h+'" />');$(c).hide().load(function(){$(this).fadeIn(o,function(){$(this).parent().swapClass("loading","loaded")})}).error(function(){$(this).parent().swapClass("loading","loadingFailed")}),a.append(c)}else a.addClass("hidden")}}}},t.prototype.show=function(){var e=this;this.isOpen=!0,this.$element.show(),setTimeout(function(){e.selectIndex(e.extension.helper.canvasIndex)},1)},t.prototype.hide=function(){this.isOpen=!1,this.$element.hide()},t.prototype.isPDF=function(){return this.extension.helper.getElementType().toString().contains("pdf")},t.prototype.setLabel=function(){$(this.$thumbs).find("span.index").hide(),$(this.$thumbs).find("span.label").show()},t.prototype.addSelectedClassToThumbs=function(e){this.getThumbByIndex(e).addClass("selected")},t.prototype.selectIndex=function(e){if(-1!==e&&this.thumbs&&this.thumbs.length){this.getAllThumbs().removeClass("selected"),this.$selectedThumb=this.getThumbByIndex(e),this.addSelectedClassToThumbs(e);var t=this.extension.getPagedIndices(e);~t.indexOf(this.lastThumbClickedIndex)||this.$element.scrollTop(this.$selectedThumb.position().top),this.loadThumbs(e)}},t.prototype.getAllThumbs=function(){return this._thumbsCache||(this._thumbsCache=this.$thumbs.find(".thumb")),this._thumbsCache},t.prototype.getThumbByIndex=function(e){return this.$thumbs.find('[data-index="'+e+'"]')},t.prototype.scrollToThumb=function(e){var t=this.getThumbByIndex(e);this.$element.scrollTop(t.position().top)},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-resourcesleftpanel-module/ThumbsView",["require","exports","../uv-shared-module/ThumbsView"],function(e,t,i){var n=function(e){function t(){e.apply(this,arguments)}return __extends(t,e),t.prototype.create=function(){this.setConfig("resourcesLeftPanel"),e.prototype.create.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-resourcesleftpanel-module/ResourcesLeftPanel",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/LeftPanel","./ThumbsView"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("resourcesLeftPanel"),e.prototype.create.call(this),this.setTitle(this.content.title),this.$tabsContent=$('<div class="tabsContent"></div>'),this.$main.append(this.$tabsContent),this.$views=$('<div class="views"></div>'),this.$tabsContent.append(this.$views),this.$thumbsView=$('<div class="thumbsView"></div>'),this.$views.append(this.$thumbsView),this.$resourcesView=$('<div class="resourcesView"></div>'),this.$resources=$("<ul></ul>"),this.$resourcesView.append(this.$resources),this.$views.append(this.$resourcesView),this.thumbsView=new o(this.$thumbsView),this.dataBind()},t.prototype.dataBind=function(){this.dataBindThumbsView();var e=this.extension.helper.getResources();0===e.length&&this.$resourcesView.hide();for(var t=0;t<e.length;t++){var i=e[t],n=i.getResource(),o=$('<li><a href="'+n.id+'" target="_blank">'+Manifesto.TranslationCollection.getValue(n.getLabel())+" ("+Utils.Files.simplifyMimeType(n.getFormat().toString())+")</li>");this.$resources.append(o)}},t.prototype.dataBindThumbsView=function(){if(this.thumbsView){var e,t,i=this.extension.helper.getViewingDirection().toString();i===manifesto.ViewingDirection.topToBottom().toString()||i===manifesto.ViewingDirection.bottomToTop().toString()?(e=this.config.options.oneColThumbWidth,t=this.config.options.oneColThumbHeight):(e=this.config.options.twoColThumbWidth,t=this.config.options.twoColThumbHeight),"undefined"==typeof e&&(e=100),"undefined"==typeof t&&(t=100),this.thumbsView.thumbs=this.extension.helper.getThumbs(e,t),this.thumbsView.thumbs.length<2&&this.$thumbsView.hide(),this.thumbsView.databind()}},t.prototype.expandFullStart=function(){e.prototype.expandFullStart.call(this),$.publish(i.LEFTPANEL_EXPAND_FULL_START)},t.prototype.expandFullFinish=function(){e.prototype.expandFullFinish.call(this),$.publish(i.LEFTPANEL_EXPAND_FULL_FINISH)},t.prototype.collapseFullStart=function(){e.prototype.collapseFullStart.call(this),$.publish(i.LEFTPANEL_COLLAPSE_FULL_START)},t.prototype.collapseFullFinish=function(){e.prototype.collapseFullFinish.call(this),$.publish(i.LEFTPANEL_COLLAPSE_FULL_FINISH)},t.prototype.resize=function(){e.prototype.resize.call(this),this.$views.height(this.$main.height()),this.$resources.height(this.$main.height())},t}(n);return s});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/SettingsDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("settingsDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_SETTINGS_DIALOGUE,this.closeCommand=i.HIDE_SETTINGS_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.open()}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$title=$("<h1></h1>"),this.$content.append(this.$title),this.$scroll=$('<div class="scroll"></div>'),this.$content.append(this.$scroll),this.$version=$('<div class="version"></div>'),this.$content.append(this.$version),this.$website=$('<div class="website"></div>'),this.$content.append(this.$website),this.$locale=$('<div class="setting locale"></div>'),this.$scroll.append(this.$locale),this.$localeLabel=$('<label for="locale">'+this.content.locale+"</label>"),this.$locale.append(this.$localeLabel),this.$localeDropDown=$('<select id="locale"></select>'),this.$locale.append(this.$localeDropDown),this.$title.text(this.content.title),this.$website.html(this.content.website),this.$website.targetBlank();for(var n=this.extension.getLocales(),o=0;o<n.length;o++){var s=n[o];this.$localeDropDown.append('<option value="'+s.name+'">'+s.label+"</option>")}this.$localeDropDown.val(this.extension.locale),this.$localeDropDown.change(function(){t.extension.changeLocale(t.$localeDropDown.val())}),this.extension.getLocales().length<2&&this.$locale.hide(),this.$element.hide()},t.prototype.getSettings=function(){return this.extension.getSettings()},t.prototype.updateSettings=function(e){this.extension.updateSettings(e),$.publish(n.UPDATE_SETTINGS,[e])},t.prototype.open=function(){var t=this;e.prototype.open.call(this),window.DEBUG||$.getJSON("package.json",function(e){t.$version.text("v"+e.version)})},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(o);return s});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-mediaelement-extension/SettingsDialogue",["require","exports","../../modules/uv-dialogues-module/SettingsDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("settingsDialogue"),e.prototype.create.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-mediaelement-extension/Extension",["require","exports","../../modules/uv-shared-module/BaseCommands","../../modules/uv-shared-module/BaseExtension","../../modules/uv-shared-module/Bookmark","./Commands","./DownloadDialogue","./ShareDialogue","../../modules/uv-shared-module/FooterPanel","../../modules/uv-shared-module/HeaderPanel","../../modules/uv-dialogues-module/HelpDialogue","../../modules/uv-mediaelementcenterpanel-module/MediaElementCenterPanel","../../modules/uv-moreinforightpanel-module/MoreInfoRightPanel","../../modules/uv-resourcesleftpanel-module/ResourcesLeftPanel","./SettingsDialogue","../../modules/uv-shared-module/Shell"],function(e,t,i,n,o,s,r,a,l,h,c,u,p,d,g,f){var m=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(t){var n=this;e.prototype.create.call(this,t),$(window).bind("enterfullscreen",function(){$.publish(i.TOGGLE_FULLSCREEN)}),$(window).bind("exitfullscreen",function(){$.publish(i.TOGGLE_FULLSCREEN)}),$.subscribe(i.THUMB_SELECTED,function(e,t){n.viewCanvas(t)}),$.subscribe(i.LEFTPANEL_EXPAND_FULL_START,function(e){f.$centerPanel.hide(),f.$rightPanel.hide()}),$.subscribe(i.LEFTPANEL_COLLAPSE_FULL_FINISH,function(e){f.$centerPanel.show(),f.$rightPanel.show(),n.resize()}),$.subscribe(s.MEDIA_ENDED,function(e){n.triggerSocket(s.MEDIA_ENDED)}),$.subscribe(s.MEDIA_PAUSED,function(e){n.triggerSocket(s.MEDIA_PAUSED)}),$.subscribe(s.MEDIA_PLAYED,function(e){n.triggerSocket(s.MEDIA_PLAYED)})},t.prototype.createModules=function(){e.prototype.createModules.call(this),this.isHeaderPanelEnabled()?this.headerPanel=new h(f.$headerPanel):f.$headerPanel.hide(),this.isLeftPanelEnabled()&&(this.leftPanel=new d(f.$leftPanel)),this.centerPanel=new u(f.$centerPanel),this.isRightPanelEnabled()&&(this.rightPanel=new p(f.$rightPanel)),this.isFooterPanelEnabled()?this.footerPanel=new l(f.$footerPanel):f.$footerPanel.hide(),this.$helpDialogue=$('<div class="overlay help"></div>'),f.$overlays.append(this.$helpDialogue),this.helpDialogue=new c(this.$helpDialogue),this.$downloadDialogue=$('<div class="overlay download"></div>'),f.$overlays.append(this.$downloadDialogue),this.downloadDialogue=new r(this.$downloadDialogue),this.$shareDialogue=$('<div class="overlay share"></div>'),f.$overlays.append(this.$shareDialogue),this.shareDialogue=new a(this.$shareDialogue),this.$settingsDialogue=$('<div class="overlay settings"></div>'),f.$overlays.append(this.$settingsDialogue),this.settingsDialogue=new g(this.$settingsDialogue),this.isLeftPanelEnabled()&&this.leftPanel.init(),this.isRightPanelEnabled()&&this.rightPanel.init()},t.prototype.isLeftPanelEnabled=function(){return Utils.Bools.getBool(this.config.options.leftPanelEnabled,!0)&&(this.helper.isMultiCanvas()||this.helper.isMultiSequence()||this.helper.hasResources())},t.prototype.bookmark=function(){e.prototype.bookmark.call(this);var t=this.extensions.helper.getCurrentCanvas(),n=new o;n.index=this.helper.canvasIndex,n.label=Manifesto.TranslationCollection.getValue(t.getLabel()),n.path=this.getBookmarkUri(),n.thumb=t.getProperty("thumbnail"),n.title=this.helper.getLabel(),n.trackingLabel=window.trackingLabel,this.isVideo()?n.type=manifesto.ElementType.movingimage().toString():n.type=manifesto.ElementType.sound().toString(),this.triggerSocket(i.BOOKMARK,n)},t.prototype.getEmbedScript=function(e,t,i){var n=this.config.uri||"",o=String.format(e,this.getSerializedLocales(),n,this.helper.iiifResourceUri,this.helper.collectionIndex,this.helper.manifestIndex,this.helper.sequenceIndex,this.helper.canvasIndex,t,i,this.embedScriptUri);return o},t.prototype.getPosterImageUri=function(){return this.helper.getCurrentCanvas().getProperty("thumbnail")},t.prototype.isVideo=function(){var e=this.helper.getElementType();return e.toString()===manifesto.ElementType.movingimage().toString()},t}(n);return m});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-pdf-extension/DownloadDialogue",["require","exports","../../modules/uv-dialogues-module/DownloadDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("downloadDialogue"),e.prototype.create.call(this)},t.prototype.open=function(t){e.prototype.open.call(this,t),this.addEntireFileDownloadOptions(),this.$downloadOptions.find("li:visible").length?this.$noneAvailable.hide():this.$noneAvailable.show(),this.resize()},t.prototype.isDownloadOptionAvailable=function(t){return e.prototype.isDownloadOptionAvailable.call(this,t)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-pdf-extension/ShareDialogue",["require","exports","../../modules/uv-dialogues-module/ShareDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("shareDialogue"),e.prototype.create.call(this)},t.prototype.update=function(){e.prototype.update.call(this),this.code=this.extension.getEmbedScript(this.options.embedTemplate,this.currentWidth,this.currentHeight),this.$code.val(this.code)},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-pdfcenterpanel-module/PDFCenterPanel",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/CenterPanel","../../Params"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("pdfCenterPanel"),e.prototype.create.call(this),$.subscribe(i.OPEN_EXTERNAL_RESOURCE,function(e,i){t.openMedia(i)})},t.prototype.openMedia=function(e){var t=this,i=this;this.extension.getExternalResources(e).then(function(){var e=t.extension.helper.getCurrentCanvas(),n=e.id,s=window.browserDetect.browser,r=window.browserDetect.version;if("Explorer"===s&&10>r||!t.config.options.usePdfJs)new PDFObject({url:n,id:"PDF"}).embed("content");else{var a;a=window.DEBUG?"modules/uv-pdfcenterpanel-module/html/viewer.html":"html/uv-pdfcenterpanel-module/viewer.html",t.$content.load(a,function(){window.DEBUG?PDFJS.workerSrc="extensions/uv-pdf-extension/lib/pdf.worker.min.js":PDFJS.workerSrc="lib/pdf.worker.min.js",PDFJS.DEFAULT_URL=n;var e=1+parseInt(i.extension.getParam(o.anchor))||0;PDFView.initialBookmark="page="+e,window.webViewerLoad(),t.resize()})}})},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(n);return s});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-pdf-extension/SettingsDialogue",["require","exports","../../modules/uv-dialogues-module/SettingsDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("settingsDialogue"),e.prototype.create.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-pdf-extension/Extension",["require","exports","../../modules/uv-shared-module/BaseCommands","../../modules/uv-shared-module/BaseExtension","../../modules/uv-shared-module/Bookmark","./DownloadDialogue","./ShareDialogue","../../modules/uv-shared-module/FooterPanel","../../modules/uv-shared-module/HeaderPanel","../../modules/uv-moreinforightpanel-module/MoreInfoRightPanel","../../modules/uv-pdfcenterpanel-module/PDFCenterPanel","../../modules/uv-resourcesleftpanel-module/ResourcesLeftPanel","./SettingsDialogue","../../modules/uv-shared-module/Shell"],function(e,t,i,n,o,s,r,a,l,h,c,u,p,d){
+var g=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(t){var n=this;e.prototype.create.call(this),$.subscribe(i.THUMB_SELECTED,function(e,t){n.viewCanvas(t.index)}),$.subscribe(i.LEFTPANEL_EXPAND_FULL_START,function(e){d.$centerPanel.hide(),d.$rightPanel.hide()}),$.subscribe(i.LEFTPANEL_COLLAPSE_FULL_FINISH,function(e){d.$centerPanel.show(),d.$rightPanel.show(),n.resize()}),$.subscribe(i.SHOW_OVERLAY,function(e,t){n.IsOldIE()&&n.centerPanel.$element.hide()}),$.subscribe(i.HIDE_OVERLAY,function(e,t){n.IsOldIE()&&n.centerPanel.$element.show()})},t.prototype.IsOldIE=function(){var e=window.browserDetect.browser,t=window.browserDetect.version;return"Explorer"===e&&9>=t?!0:!1},t.prototype.createModules=function(){e.prototype.createModules.call(this),this.isHeaderPanelEnabled()?this.headerPanel=new l(d.$headerPanel):d.$headerPanel.hide(),this.isLeftPanelEnabled()&&(this.leftPanel=new u(d.$leftPanel)),this.centerPanel=new c(d.$centerPanel),this.isRightPanelEnabled()&&(this.rightPanel=new h(d.$rightPanel)),this.isFooterPanelEnabled()?this.footerPanel=new a(d.$footerPanel):d.$footerPanel.hide(),this.$downloadDialogue=$('<div class="overlay download"></div>'),d.$overlays.append(this.$downloadDialogue),this.downloadDialogue=new s(this.$downloadDialogue),this.$shareDialogue=$('<div class="overlay share"></div>'),d.$overlays.append(this.$shareDialogue),this.shareDialogue=new r(this.$shareDialogue),this.$settingsDialogue=$('<div class="overlay settings"></div>'),d.$overlays.append(this.$settingsDialogue),this.settingsDialogue=new p(this.$settingsDialogue),this.isLeftPanelEnabled()&&this.leftPanel.init(),this.isRightPanelEnabled()&&this.rightPanel.init()},t.prototype.bookmark=function(){e.prototype.bookmark.call(this);var t=this.helper.getCurrentCanvas(),n=new o;n.index=this.helper.canvasIndex,n.label=Manifesto.TranslationCollection.getValue(t.getLabel()),n.path=this.getBookmarkUri(),n.thumb=t.getProperty("thumbnail"),n.title=this.helper.getLabel(),n.trackingLabel=window.trackingLabel,n.type=manifesto.ElementType.document().toString(),this.triggerSocket(i.BOOKMARK,n)},t.prototype.getEmbedScript=function(e,t,i){var n=this.config.uri||"",o=String.format(e,this.getSerializedLocales(),n,this.helper.iiifResourceUri,this.helper.collectionIndex,this.helper.manifestIndex,this.helper.sequenceIndex,this.helper.canvasIndex,t,i,this.embedScriptUri);return o},t}(n);return g}),define("extensions/uv-seadragon-extension/Commands",["require","exports"],function(e,t){var i=function(){function e(){}return e.namespace="seadragonExtension.",e.CLEAR_SEARCH=e.namespace+"onClearSearch",e.CURRENT_VIEW_URI=e.namespace+"onCurrentViewUri",e.FIRST=e.namespace+"onFirst",e.GALLERY_DECREASE_SIZE=e.namespace+"onGalleryDecreaseSize",e.GALLERY_INCREASE_SIZE=e.namespace+"onGalleryIncreaseSize",e.GALLERY_THUMB_SELECTED=e.namespace+"onGalleryThumbSelected",e.HIDE_MULTISELECT_DIALOGUE=e.namespace+"onHideMultiSelectDialogue",e.IMAGE_SEARCH=e.namespace+"onImageSearch",e.LAST=e.namespace+"onLast",e.MODE_CHANGED=e.namespace+"onModeChanged",e.MULTISELECT_CHANGE=e.namespace+"onMultiSelectChange",e.MULTISELECTION_MADE=e.namespace+"onMultiSelectionMade",e.NEXT_SEARCH_RESULT=e.namespace+"onNextSearchResult",e.NEXT=e.namespace+"onNext",e.NEXT_IMAGES_SEARCH_RESULT_UNAVAILABLE=e.namespace+"onNextImagesSearchResultUnavailable",e.PREV_IMAGES_SEARCH_RESULT_UNAVAILABLE=e.namespace+"onPrevImagesSearchResultUnavailable",e.OPEN_THUMBS_VIEW=e.namespace+"onOpenThumbsView",e.OPEN_TREE_VIEW=e.namespace+"onOpenTreeView",e.PAGE_SEARCH=e.namespace+"onPageSearch",e.PAGING_TOGGLED=e.namespace+"onPagingToggled",e.PREV_SEARCH_RESULT=e.namespace+"onPrevSearchResult",e.PREV=e.namespace+"onPrev",e.PRINT=e.namespace+"onPrint",e.ROTATE=e.namespace+"onRotate",e.SEADRAGON_ANIMATION_FINISH=e.namespace+"onAnimationfinish",e.SEADRAGON_ANIMATION_START=e.namespace+"onAnimationStart",e.SEADRAGON_ANIMATION=e.namespace+"onAnimation",e.SEADRAGON_OPEN=e.namespace+"onOpen",e.SEADRAGON_RESIZE=e.namespace+"onResize",e.SEADRAGON_ROTATION=e.namespace+"onRotation",e.SEARCH_PREVIEW_FINISH=e.namespace+"onSearchPreviewFinish",e.SEARCH_PREVIEW_START=e.namespace+"onSearchPreviewStart",e.SEARCH_RESULT_CANVAS_CHANGED=e.namespace+"onSearchResultCanvasChanged",e.SEARCH_RESULT_RECT_CHANGED=e.namespace+"onSearchResultRectChanged",e.SEARCH_RESULTS_EMPTY=e.namespace+"onSearchResultsEmpty",e.SEARCH_RESULTS=e.namespace+"onSearchResults",e.SEARCH_RESULTS_CLEARED=e.namespace+"onSearchResultsCleared",e.SEARCH=e.namespace+"onSearch",e.SHOW_MULTISELECT_DIALOGUE=e.namespace+"onShowMultiSelectDialogue",e.THUMB_MULTISELECTED=e.namespace+"onThumbMultiSelected",e.TREE_NODE_MULTISELECTED=e.namespace+"onTreeNodeMultiSelected",e.TREE_NODE_SELECTED=e.namespace+"onTreeNodeSelected",e.VIEW_PAGE=e.namespace+"onViewPage",e.ZOOM_IN=e.namespace+"onZoomIn",e.ZOOM_OUT=e.namespace+"onZoomOut",e}();return i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-contentleftpanel-module/GalleryView",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/BaseView","../../extensions/uv-seadragon-extension/Commands"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t,!0,!0),this.isOpen=!1}return __extends(t,e),t.prototype.create=function(){this.setConfig("contentLeftPanel"),e.prototype.create.call(this),this.$gallery=$('<div class="iiif-gallery-component"></div>'),this.$element.append(this.$gallery)},t.prototype.setup=function(){this.component=new IIIFComponents.GalleryComponent(this.galleryOptions),this.component.on("thumbSelected",function(e){var t=e[0];$.publish(o.GALLERY_THUMB_SELECTED,[t]),$.publish(i.THUMB_SELECTED,[t])}),this.component.on("decreaseSize",function(){$.publish(o.GALLERY_DECREASE_SIZE)}),this.component.on("increaseSize",function(){$.publish(o.GALLERY_INCREASE_SIZE)})},t.prototype.databind=function(){this.component.options=this.galleryOptions,this.component.databind(),this.resize()},t.prototype.show=function(){var e=this;this.isOpen=!0,this.$element.show(),setTimeout(function(){e.component.selectIndex(e.extension.helper.canvasIndex)},10)},t.prototype.hide=function(){this.isOpen=!1,this.$element.hide()},t.prototype.resize=function(){e.prototype.resize.call(this);var t=$(this.galleryOptions.element),i=t.find(".main"),n=t.find(".header");i.height(this.$element.height()-n.height())},t}(n);return s}),define("extensions/uv-seadragon-extension/Mode",["require","exports"],function(e,t){var i=function(){function e(e){this.value=e}return e.prototype.toString=function(){return this.value},e.image=new e("image"),e.page=new e("page"),e}();return i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-contentleftpanel-module/ThumbsView",["require","exports","../uv-shared-module/ThumbsView","../../extensions/uv-seadragon-extension/Commands","../../extensions/uv-seadragon-extension/Mode"],function(e,t,i,n,o){var s=function(e){function t(){e.apply(this,arguments)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("contentLeftPanel"),e.prototype.create.call(this),$.subscribe(n.MODE_CHANGED,function(e,i){t.setLabel()}),$.subscribe(n.SEARCH_PREVIEW_START,function(e,i){t.searchPreviewStart(i)}),$.subscribe(n.SEARCH_PREVIEW_FINISH,function(){t.searchPreviewFinish()}),this.extension.helper.isPaged()&&this.$thumbs.addClass("paged");var i=this;$.views.helpers({separator:function(){return i.extension.helper.isVerticallyAligned()?!0:i.extension.helper.isPaged()?(this.data.index-1)%2==0?!1:!0:!1}})},t.prototype.addSelectedClassToThumbs=function(e){if(this.extension.isPagingSettingEnabled())for(var t=this.extension.getPagedIndices(e),i=0;i<t.length;i++)this.getThumbByIndex(t[i]).addClass("selected");else this.getThumbByIndex(e).addClass("selected")},t.prototype.isPageModeEnabled=function(){return"function"==typeof this.extension.getMode?this.config.options.pageModeEnabled&&this.extension.getMode().toString()===o.page.toString():this.config.options.pageModeEnabled},t.prototype.searchPreviewStart=function(e){this.scrollToThumb(e);var t=this.getThumbByIndex(e);t.addClass("searchpreview")},t.prototype.searchPreviewFinish=function(){this.scrollToThumb(this.extension.helper.canvasIndex),this.getAllThumbs().removeClass("searchpreview")},t.prototype.setLabel=function(){this.isPDF()?($(this.$thumbs).find("span.index").hide(),$(this.$thumbs).find("span.label").hide()):this.isPageModeEnabled()?($(this.$thumbs).find("span.index").hide(),$(this.$thumbs).find("span.label").show()):($(this.$thumbs).find("span.index").show(),$(this.$thumbs).find("span.label").hide())},t}(i);return s});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-contentleftpanel-module/TreeView",["require","exports","../uv-shared-module/BaseView","../../extensions/uv-seadragon-extension/Commands"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t,!0,!0),this.isOpen=!1}return __extends(t,e),t.prototype.create=function(){this.setConfig("contentLeftPanel"),e.prototype.create.call(this),this.$tree=$('<div class="iiif-tree-component"></div>'),this.$element.append(this.$tree)},t.prototype.setup=function(){this.component=new IIIFComponents.TreeComponent(this.treeOptions),this.component.on("treeNodeSelected",function(e){var t=e[0];$.publish(n.TREE_NODE_SELECTED,[t])}),this.component.on("treeNodeMultiSelected",function(e){var t=e[0];$.publish(n.TREE_NODE_MULTISELECTED,[t])})},t.prototype.databind=function(){this.component.options=this.treeOptions,this.component.databind(),this.resize()},t.prototype.show=function(){this.isOpen=!0,this.$element.show()},t.prototype.hide=function(){this.isOpen=!1,this.$element.hide()},t.prototype.selectNode=function(e){this.component.selectNode(e)},t.prototype.deselectCurrentNode=function(){this.component.deselectCurrentNode()},t.prototype.getNodeById=function(e){return this.component.getNodeById(e)},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(i);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-contentleftpanel-module/ContentLeftPanel",["require","exports","../uv-shared-module/BaseCommands","../../extensions/uv-seadragon-extension/Commands","./GalleryView","../uv-shared-module/LeftPanel","../uv-shared-module/MetricType","../../extensions/uv-seadragon-extension/Mode","./ThumbsView","./TreeView"],function(e,t,i,n,o,s,r,a,l,h){var c=function(e){function t(t){e.call(this,t),this.expandFullEnabled=!1,this.isThumbsViewOpen=!1,this.isTreeViewOpen=!1,this.treeSortType=Manifold.TreeSortType.NONE}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("contentLeftPanel"),e.prototype.create.call(this);$.subscribe(i.SETTINGS_CHANGED,function(){t.databind()}),$.subscribe(n.GALLERY_THUMB_SELECTED,function(){t.collapseFull()}),$.subscribe(i.METRIC_CHANGED,function(){t.extension.metric.toString()===r.MetricType.MOBILELANDSCAPE.toString()&&t.isFullyExpanded&&t.collapseFull()}),$.subscribe(n.SEARCH_RESULTS,function(){t.databindThumbsView(),t.databindGalleryView()}),$.subscribe(n.SEARCH_RESULTS_CLEARED,function(){t.databindThumbsView(),t.databindGalleryView()}),$.subscribe(n.SEARCH_RESULTS_EMPTY,function(){t.databindThumbsView(),t.databindGalleryView()}),$.subscribe(i.CANVAS_INDEX_CHANGED,function(e,i){t.isFullyExpanded&&t.collapseFull(),t.selectCurrentTreeNode(),t.updateTreeTabBySelection()}),this.$tabs=$('<div class="tabs"></div>'),this.$main.append(this.$tabs),this.$treeButton=$('<a class="index tab" tabindex="0">'+this.content.index+"</a>"),this.$tabs.append(this.$treeButton),this.$thumbsButton=$('<a class="thumbs tab" tabindex="0">'+this.content.thumbnails+"</a>"),this.$thumbsButton.prop("title",this.content.thumbnails),this.$tabs.append(this.$thumbsButton),this.$tabsContent=$('<div class="tabsContent"></div>'),this.$main.append(this.$tabsContent),this.$options=$('<div class="options"></div>'),this.$tabsContent.append(this.$options),this.$topOptions=$('<div class="top"></div>'),this.$options.append(this.$topOptions),this.$treeSelect=$("<select></select>"),this.$topOptions.append(this.$treeSelect),this.$bottomOptions=$('<div class="bottom"></div>'),this.$options.append(this.$bottomOptions),this.$leftOptions=$('<div class="left"></div>'),this.$bottomOptions.append(this.$leftOptions),this.$rightOptions=$('<div class="right"></div>'),this.$bottomOptions.append(this.$rightOptions),this.$treeViewOptions=$('<div class="treeView"></div>'),this.$leftOptions.append(this.$treeViewOptions),this.$sortByLabel=$('<span class="sort">'+this.content.sortBy+"</span>"),this.$treeViewOptions.append(this.$sortByLabel),this.$sortButtonGroup=$('<div class="btn-group"></div>'),this.$treeViewOptions.append(this.$sortButtonGroup),this.$sortByDateButton=$('<button class="btn tabindex="0"">'+this.content.date+"</button>"),this.$sortButtonGroup.append(this.$sortByDateButton),this.$sortByVolumeButton=$('<button class="btn" tabindex="0">'+this.content.volume+"</button>"),this.$sortButtonGroup.append(this.$sortByVolumeButton),this.$views=$('<div class="views"></div>'),this.$tabsContent.append(this.$views),this.$treeView=$('<div class="treeView"></div>'),this.$views.append(this.$treeView),this.$thumbsView=$('<div class="thumbsView" tabindex="0"></div>'),this.$views.append(this.$thumbsView),this.$galleryView=$('<div class="galleryView"></div>'),this.$views.append(this.$galleryView),this.$treeSelect.hide(),this.$treeSelect.change(function(){t.databindTreeView(),t.selectCurrentTreeNode(),t.updateTreeTabBySelection()}),this.$sortByDateButton.on("click",function(){t.sortByDate()}),this.$sortByVolumeButton.on("click",function(){t.sortByVolume()}),this.$treeViewOptions.hide(),this.$treeButton.onPressed(function(){t.openTreeView(),$.publish(n.OPEN_TREE_VIEW)}),this.$thumbsButton.onPressed(function(){t.openThumbsView(),$.publish(n.OPEN_THUMBS_VIEW)}),this.setTitle(this.content.title),this.$sortByVolumeButton.addClass("on");var o=this.options.tabOrder;if(o){o=o.toLowerCase(),o=o.replace(/ /g,"");var s=o.split(",");"thumbs"===s[0]?(this.$treeButton.before(this.$thumbsButton),this.$thumbsButton.addClass("first")):this.$treeButton.addClass("first")}},t.prototype.createTreeView=function(){this.treeView=new h(this.$treeView),this.treeView.treeOptions=this.getTreeOptions(),this.treeView.setup(),this.databindTreeView();var e=this.extension.helper.getTopRanges();if(e.length>1)for(var t=0;t<e.length;t++){var i=e[t];this.$treeSelect.append('<option value="'+i.id+'">'+Manifesto.TranslationCollection.getValue(i.getLabel())+"</option>")}this.updateTreeViewOptions()},t.prototype.databind=function(){this.databindThumbsView(),this.databindTreeView(),this.databindGalleryView()},t.prototype.updateTreeViewOptions=function(){var e=this.getTreeData();this.isCollection()&&this.extension.helper.treeHasNavDates(e)?this.$treeViewOptions.show():this.$treeViewOptions.hide(),this.$treeSelect.find("option").length?this.$treeSelect.show():this.$treeSelect.hide()},t.prototype.sortByDate=function(){this.treeSortType=Manifold.TreeSortType.DATE,this.treeView.treeOptions=this.getTreeOptions(),this.treeView.databind(),this.selectCurrentTreeNode(),this.$sortByDateButton.addClass("on"),this.$sortByVolumeButton.removeClass("on"),this.resize()},t.prototype.sortByVolume=function(){this.treeSortType=Manifold.TreeSortType.NONE,this.treeView.treeOptions=this.getTreeOptions(),this.treeView.databind(),this.selectCurrentTreeNode(),this.$sortByDateButton.removeClass("on"),this.$sortByVolumeButton.addClass("on"),this.resize()},t.prototype.isCollection=function(){var e=this.getTreeData();return e.data.type===manifesto.TreeNodeType.collection().toString()},t.prototype.databindTreeView=function(){this.treeView&&(this.treeView.treeOptions=this.getTreeOptions(),this.treeView.databind(),this.selectCurrentTreeNode())},t.prototype.getTreeOptions=function(){return{branchNodesSelectable:!1,element:".views .treeView .iiif-tree-component",helper:this.extension.helper,topRangeIndex:this.getSelectedTopRangeIndex(),treeSortType:this.treeSortType}},t.prototype.updateTreeTabByCanvasIndex=function(){var e=this.extension.helper.getTopRanges();if(e.length>1){var t=this.getCurrentCanvasTopRangeIndex(),i=e[t];this.setTreeTabTitle(Manifesto.TranslationCollection.getValue(i.getLabel()))}else this.setTreeTabTitle(this.content.index)},t.prototype.setTreeTabTitle=function(e){this.$treeButton.text(e),this.$treeButton.prop("title",e)},t.prototype.updateTreeTabBySelection=function(){var e,t=this.extension.helper.getTopRanges();t.length>1&&(e=this.treeView?this.getSelectedTree().text():Manifesto.TranslationCollection.getValue(t[0].getLabel())),e?this.setTreeTabTitle(e):this.setTreeTabTitle(this.content.index)},t.prototype.getViewingDirection=function(){return this.extension.helper.getViewingDirection()},t.prototype.createThumbsView=function(){this.thumbsView=new l(this.$thumbsView),this.databindThumbsView()},t.prototype.databindThumbsView=function(){if(this.thumbsView){var e,t,i=this.getViewingDirection().toString();i===manifesto.ViewingDirection.topToBottom().toString()||i===manifesto.ViewingDirection.bottomToTop().toString()?(e=this.config.options.oneColThumbWidth,t=this.config.options.oneColThumbHeight):(e=this.config.options.twoColThumbWidth,t=this.config.options.twoColThumbHeight);var n=this.extension.helper.getThumbs(e,t);i===manifesto.ViewingDirection.bottomToTop().toString()&&n.reverse();var o=this.extension.searchResults;if(o&&o.length)for(var s=0;s<o.length;s++){var r=o[s],a=n.en().where(function(e){return e.index===r.canvasIndex}).first(),l=$.extend(!0,{},a.data);l.searchResults=r.rects.length,a.data=l}this.thumbsView.thumbs=n,this.thumbsView.databind()}},t.prototype.createGalleryView=function(){this.galleryView=new o(this.$galleryView),this.galleryView.galleryOptions=this.getGalleryOptions(),this.galleryView.setup(),this.databindGalleryView()},t.prototype.databindGalleryView=function(){this.galleryView&&(this.galleryView.galleryOptions=this.getGalleryOptions(),this.galleryView.databind())},t.prototype.getGalleryOptions=function(){return{element:".views .galleryView .iiif-gallery-component",helper:this.extension.helper,chunkedResizingThreshold:this.config.options.galleryThumbChunkedResizingThreshold,content:this.config.content,debug:!1,imageFadeInDuration:300,initialZoom:6,minLabelWidth:20,pageModeEnabled:this.isPageModeEnabled(),scrollStopDuration:100,searchResults:this.extension.searchResults,sizingEnabled:Modernizr.inputtypes.range,thumbHeight:this.config.options.galleryThumbHeight,thumbLoadPadding:this.config.options.galleryThumbLoadPadding,thumbWidth:this.config.options.galleryThumbWidth,viewingDirection:this.getViewingDirection()}},t.prototype.isPageModeEnabled=function(){return"function"==typeof this.extension.getMode?Utils.Bools.getBool(this.config.options.pageModeEnabled,!0)&&this.extension.getMode().toString()===a.page.toString():Utils.Bools.getBool(this.config.options.pageModeEnabled,!0)},t.prototype.getSelectedTree=function(){return this.$treeSelect.find(":selected")},t.prototype.getSelectedTopRangeIndex=function(){var e=this.getSelectedTree().index();return-1===e&&(e=0),e},t.prototype.getTreeData=function(){var e=this.getSelectedTopRangeIndex();return this.extension.helper.getTree(e,Manifold.TreeSortType.NONE)},t.prototype.toggleFinish=function(){if(e.prototype.toggleFinish.call(this),this.isUnopened){var t=Utils.Bools.getBool(this.config.options.treeEnabled,!0),i=Utils.Bools.getBool(this.config.options.thumbsEnabled,!0),n=this.getTreeData();n&&n.nodes.length||(t=!1),t&&i||this.$tabs.hide(),i&&this.defaultToThumbsView()?this.openThumbsView():t&&this.openTreeView()}},t.prototype.defaultToThumbsView=function(){var e=Utils.Bools.getBool(this.config.options.defaultToTreeEnabled,!1),t=this.config.options.defaultToTreeIfGreaterThan||0,i=this.getTreeData();return e&&i.nodes.length>t?!1:!0},t.prototype.expandFullStart=function(){e.prototype.expandFullStart.call(this),$.publish(i.LEFTPANEL_EXPAND_FULL_START)},t.prototype.expandFullFinish=function(){e.prototype.expandFullFinish.call(this),this.$treeButton.hasClass("on")?this.openTreeView():this.$thumbsButton.hasClass("on")&&this.openThumbsView(),$.publish(i.LEFTPANEL_EXPAND_FULL_FINISH)},t.prototype.collapseFullStart=function(){e.prototype.collapseFullStart.call(this),$.publish(i.LEFTPANEL_COLLAPSE_FULL_START)},t.prototype.collapseFullFinish=function(){e.prototype.collapseFullFinish.call(this),this.$thumbsButton.hasClass("on")&&this.openThumbsView(),$.publish(i.LEFTPANEL_COLLAPSE_FULL_FINISH)},t.prototype.openTreeView=function(){this.isTreeViewOpen=!0,this.isThumbsViewOpen=!1,this.treeView||this.createTreeView(),this.$treeButton.addClass("on"),this.$thumbsButton.removeClass("on"),this.treeView.show(),this.thumbsView&&this.thumbsView.hide(),this.galleryView&&this.galleryView.hide(),this.updateTreeViewOptions(),this.selectCurrentTreeNode(),this.resize(),this.treeView.resize()},t.prototype.openThumbsView=function(){this.isTreeViewOpen=!1,this.isThumbsViewOpen=!0,this.thumbsView||this.createThumbsView(),this.isFullyExpanded&&!this.galleryView&&this.createGalleryView(),this.$treeButton.removeClass("on"),this.$thumbsButton.addClass("on"),this.treeView&&this.treeView.hide(),this.$treeSelect.hide(),this.$treeViewOptions.hide(),this.resize(),this.isFullyExpanded?(this.thumbsView.hide(),this.galleryView&&this.galleryView.show(),this.galleryView&&this.galleryView.resize()):(this.galleryView&&this.galleryView.hide(),this.thumbsView.show(),this.thumbsView.resize())},t.prototype.selectTopRangeIndex=function(e){this.$treeSelect.prop("selectedIndex",e)},t.prototype.getCurrentCanvasTopRangeIndex=function(){var e=-1,t=this.extension.getCurrentCanvasRange();return t&&(e=Number(t.path.split("/")[0])),e},t.prototype.selectCurrentTreeNode=function(){if(this.treeView){var e,t=this.getCurrentCanvasTopRangeIndex(),i=this.getSelectedTopRangeIndex(),n=t===i;if(-1!=t){var o=this.extension.getCurrentCanvasRange();o&&o.treeNode&&(e=this.treeView.getNodeById(o.treeNode.id))}e&&n?this.treeView.selectNode(e):this.treeView.deselectCurrentNode()}},t.prototype.resize=function(){e.prototype.resize.call(this),this.$tabsContent.height(this.$main.height()-(this.$tabs.is(":visible")?this.$tabs.height():0)-this.$tabsContent.verticalPadding()),this.$views.height(this.$tabsContent.height()-this.$options.outerHeight())},t}(s);return c}),define("modules/uv-shared-module/Point",["require","exports"],function(e,t){var i=function(){function e(e,t){this.x=e,this.y=t}return e}();return i}),define("extensions/uv-seadragon-extension/CroppedImageDimensions",["require","exports","../../modules/uv-shared-module/Point"],function(e,t,i){var n=Utils.Measurements.Size,o=function(){function e(){this.region=new n(0,0),this.regionPos=new i(0,0),this.size=new n(0,0)}return e}();return o}),define("extensions/uv-seadragon-extension/DownloadType",["require","exports"],function(e,t){var i=function(){function e(){}return e.CURRENTVIEW="currentView",e.ENTIREDOCUMENTASPDF="entireDocumentAsPdf",e.ENTIREDOCUMENTASTEXT="entireDocumentAsText",e.WHOLEIMAGEHIGHRES="wholeImageHighRes",e.WHOLEIMAGESHIGHRES="wholeImageHighRes",e.WHOLEIMAGELOWRES="wholeImageLowRes",e.UNKNOWN="unknown",e}();return i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-seadragon-extension/DownloadDialogue",["require","exports","../../modules/uv-shared-module/BaseCommands","../../modules/uv-dialogues-module/DownloadDialogue","./Commands","../../modules/uv-shared-module/DownloadOption","./DownloadType"],function(e,t,i,n,o,s,r){var a=Utils.Measurements.Size,l=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("downloadDialogue"),e.prototype.create.call(this),this.$imageOptionsContainer=$('<li class="group image"></li>'),this.$downloadOptions.append(this.$imageOptionsContainer),this.$imageOptions=$("<ul></ul>"),this.$imageOptionsContainer.append(this.$imageOptions),this.$currentViewAsJpgButton=$('<li class="option single"><input id="'+s.currentViewAsJpg.toString()+'" type="radio" name="downloadOptions" tabindex="0" /><label for="'+s.currentViewAsJpg.toString()+'"></label></li>'),this.$imageOptions.append(this.$currentViewAsJpgButton),this.$currentViewAsJpgButton.hide(),this.$wholeImageHighResButton=$('<li class="option single"><input id="'+s.wholeImageHighRes.toString()+'" type="radio" name="downloadOptions" tabindex="0" /><label id="'+s.wholeImageHighRes.toString()+'label" for="'+s.wholeImageHighRes.toString()+'"></label></li>'),this.$imageOptions.append(this.$wholeImageHighResButton),this.$wholeImageHighResButton.hide(),this.$wholeImagesHighResButton=$('<li class="option multiple"><input id="'+s.wholeImagesHighRes.toString()+'" type="radio" name="downloadOptions" tabindex="0" /><label id="'+s.wholeImagesHighRes.toString()+'label" for="'+s.wholeImagesHighRes.toString()+'"></label></li>'),this.$imageOptions.append(this.$wholeImagesHighResButton),this.$wholeImageHighResButton.hide(),this.$wholeImageLowResAsJpgButton=$('<li class="option single"><input id="'+s.wholeImageLowResAsJpg.toString()+'" type="radio" name="downloadOptions" tabindex="0" /><label for="'+s.wholeImageLowResAsJpg.toString()+'">'+this.content.wholeImageLowResAsJpg+"</label></li>"),this.$imageOptions.append(this.$wholeImageLowResAsJpgButton),this.$wholeImageLowResAsJpgButton.hide(),this.$canvasOptionsContainer=$('<li class="group canvas"></li>'),this.$downloadOptions.append(this.$canvasOptionsContainer),this.$canvasOptions=$("<ul></ul>"),this.$canvasOptionsContainer.append(this.$canvasOptions),this.$sequenceOptionsContainer=$('<li class="group sequence"></li>'),this.$downloadOptions.append(this.$sequenceOptionsContainer),this.$sequenceOptions=$("<ul></ul>"),this.$sequenceOptionsContainer.append(this.$sequenceOptions),this.$selectionButton=$('<li class="option"><input id="'+s.selection.toString()+'" type="radio" name="downloadOptions" tabindex="0" /><label id="'+s.selection.toString()+'label" for="'+s.selection.toString()+'"></label></li>'),this.$sequenceOptions.append(this.$selectionButton),this.$selectionButton.hide(),this.$buttonsContainer=$('<div class="buttons"></div>'),this.$content.append(this.$buttonsContainer),this.$downloadButton=$('<a class="btn btn-primary" href="#" tabindex="0">'+this.content.download+"</a>"),this.$buttonsContainer.append(this.$downloadButton),this.$explanatoryTextTemplate=$('<span class="explanatory"></span>');var n=this;this.$downloadButton.on("click",function(e){e.preventDefault();var a=n.getSelectedOption(),l=a.attr("id"),h=a.attr("title"),c=a.data("mime"),u=r.UNKNOWN,p=t.extension.helper.getCurrentCanvas();if(t.renderingUrls[l])c&&(-1!==c.toLowerCase().indexOf("pdf")?u=r.ENTIREDOCUMENTASPDF:-1!==c.toLowerCase().indexOf("txt")&&(u=r.ENTIREDOCUMENTASTEXT)),(u=r.ENTIREDOCUMENTASPDF)&&window.open(t.renderingUrls[l]);else switch(l){case s.currentViewAsJpg.toString():var d=n.extension.getViewer();window.open(n.extension.getCroppedImageUri(p,d)),u=r.CURRENTVIEW;break;case s.selection.toString():Utils.Async.waitFor(function(){return!t.isActive},function(){$.publish(o.SHOW_MULTISELECT_DIALOGUE)});break;case s.wholeImageHighRes.toString():window.open(t.getCanvasHighResImageUri(t.extension.helper.getCurrentCanvas())),u=r.WHOLEIMAGEHIGHRES;break;case s.wholeImagesHighRes.toString():for(var g=t.extension.getPagedIndices(),f=0;f<g.length;f++)window.open(t.getCanvasHighResImageUri(t.extension.helper.getCanvasByIndex(g[f])));u=r.WHOLEIMAGESHIGHRES;break;case s.wholeImageLowResAsJpg.toString():window.open(n.extension.getConfinedImageUri(p,n.options.confinedImageSize)),u=r.WHOLEIMAGELOWRES}$.publish(i.DOWNLOAD,[{type:u,label:h}]),t.close()})},t.prototype.open=function(t){e.prototype.open.call(this,t);var i=this.extension.helper.getCurrentCanvas(),n=this.extension.getViewerRotation(),o=n%180==0;if(this.isDownloadOptionAvailable(s.currentViewAsJpg)){var r=this.$currentViewAsJpgButton.find("input"),a=this.$currentViewAsJpgButton.find("label"),l=this.content.currentViewAsJpg,h=this.extension.getViewer(),c=this.extension.getCroppedImageDimensions(i,h);if(c?(l=o?String.format(l,c.size.width,c.size.height):String.format(l,c.size.height,c.size.width),a.text(l),r.prop("title",l),this.$currentViewAsJpgButton.data("width",c.size.width),this.$currentViewAsJpgButton.data("height",c.size.height),this.$currentViewAsJpgButton.show()):this.$currentViewAsJpgButton.hide(),Utils.Bools.getBool(this.options.optionsExplanatoryTextEnabled,!1)){var u=this.content.currentViewAsJpgExplanation;if(u){var p=this.$explanatoryTextTemplate.clone();p.text(u),a.append(p)}}}else this.$currentViewAsJpgButton.hide();if(this.isDownloadOptionAvailable(s.wholeImageHighRes)){var r=this.$wholeImageHighResButton.find("input"),a=this.$wholeImageHighResButton.find("label"),d=this.getCanvasMimeType(this.extension.helper.getCurrentCanvas());d=d?Utils.Files.simplifyMimeType(d):"?";var g=this.getCanvasComputedDimensions(this.extension.helper.getCurrentCanvas());if(g){var l=o?String.format(this.content.wholeImageHighRes,g.width,g.height,d):String.format(this.content.wholeImageHighRes,g.height,g.width,d);a.text(l),r.prop("title",l),this.$wholeImageHighResButton.data("width",g.width),this.$wholeImageHighResButton.data("height",g.height),this.$wholeImageHighResButton.show()}else this.$wholeImageHighResButton.hide();if(Utils.Bools.getBool(this.options.optionsExplanatoryTextEnabled,!1)){var u=this.content.wholeImageHighResExplanation;if(u){var p=this.$explanatoryTextTemplate.clone();p.text(u),a.append(p)}}}else this.$wholeImageHighResButton.hide();if(this.isDownloadOptionAvailable(s.wholeImagesHighRes)){var r=this.$wholeImagesHighResButton.find("input"),a=this.$wholeImagesHighResButton.find("label"),d=this.getCanvasMimeType(this.extension.helper.getCurrentCanvas());d=d?Utils.Files.simplifyMimeType(d):"?";var l=String.format(this.content.wholeImagesHighRes,d);if(a.text(l),r.prop("title",l),this.$wholeImagesHighResButton.show(),Utils.Bools.getBool(this.options.optionsExplanatoryTextEnabled,!1)){var u=this.content.wholeImagesHighResExplanation;if(u){var p=this.$explanatoryTextTemplate.clone();p.text(u),a.append(p)}}}else this.$wholeImagesHighResButton.hide();if(this.isDownloadOptionAvailable(s.wholeImageLowResAsJpg)){var r=this.$wholeImageLowResAsJpgButton.find("input"),a=this.$wholeImageLowResAsJpgButton.find("label"),g=this.extension.getConfinedImageDimensions(i,this.options.confinedImageSize),l=o?String.format(this.content.wholeImageLowResAsJpg,g.width,g.height):String.format(this.content.wholeImageLowResAsJpg,g.height,g.width);if(a.text(l),r.prop("title",l),this.$wholeImageLowResAsJpgButton.data("width",g.width),this.$wholeImageLowResAsJpgButton.data("height",g.height),this.$wholeImageLowResAsJpgButton.show(),Utils.Bools.getBool(this.options.optionsExplanatoryTextEnabled,!1)){var u=this.content.wholeImageLowResAsJpgExplanation;if(u){var p=this.$explanatoryTextTemplate.clone();p.text(u),a.append(p)}}}else this.$wholeImageLowResAsJpgButton.hide();if(this.isDownloadOptionAvailable(s.selection)){var r=this.$selectionButton.find("input"),a=this.$selectionButton.find("label");if(a.text(this.content.downloadSelection),r.prop("title",this.content.downloadSelection),this.$selectionButton.show(),Utils.Bools.getBool(this.options.optionsExplanatoryTextEnabled,!1)){
+var u=this.content.selectionExplanation;if(u){var p=this.$explanatoryTextTemplate.clone();p.text(u),a.append(p)}}}else this.$selectionButton.hide();if(this.resetDynamicDownloadOptions(),this.isDownloadOptionAvailable(s.dynamicImageRenderings))for(var f=i.getImages(),m=0;m<f.length;m++)this.addDownloadOptionsForRenderings(f[m].getResource(),this.content.entireFileAsOriginal,s.dynamicImageRenderings);if(this.isDownloadOptionAvailable(s.dynamicCanvasRenderings)&&this.addDownloadOptionsForRenderings(i,this.content.entireFileAsOriginal,s.dynamicCanvasRenderings),this.isDownloadOptionAvailable(s.dynamicSequenceRenderings)&&this.addDownloadOptionsForRenderings(this.extension.helper.getCurrentSequence(),this.content.entireDocument,s.dynamicSequenceRenderings),this.isDownloadOptionAvailable(s.currentViewAsJpg)){var v=parseInt(this.$currentViewAsJpgButton.data("width").toString()),b=parseInt(this.$currentViewAsJpgButton.data("height").toString()),E=parseInt(this.$wholeImageHighResButton.data("width").toString()),x=parseInt(this.$wholeImageHighResButton.data("height").toString()),y=v/E*100,w=b/x*100,S=this.options.currentViewDisabledPercentage;y>=S&&w>=S?this.$currentViewAsJpgButton.hide():this.$currentViewAsJpgButton.show()}var _=this.$imageOptions.find("li.single");_=_.sort(function(e,t){var i=$(e).data("width");i?i=parseInt(i.toString()):0;var n=$(e).data("height");n?n=parseInt(n.toString()):0;var o=$(t).data("width");o?o=parseInt(o.toString()):0;var s=$(t).data("height");s?s=parseInt(s.toString()):0;var r=i*n,a=o*s;return a>r?-1:r>a?1:0}),_.detach().appendTo(this.$imageOptions);var C=this.$downloadOptions.find("li.group");C.each(function(e,t){var i=$(t);i.show(),i.find("li.option:hidden").length===i.find("li.option").length&&i.hide()}),this.$downloadOptions.find("li.group:visible").last().addClass("lastVisible"),this.$downloadOptions.find("li.option:visible").length?(this.$downloadOptions.find("li.option input:visible:first").prop("checked",!0),this.$noneAvailable.hide(),this.$downloadButton.show()):(this.$noneAvailable.show(),this.$downloadButton.hide()),this.resize()},t.prototype.resetDynamicDownloadOptions=function(){this.renderingUrls=[],this.renderingUrlsCount=0,this.$downloadOptions.find("li.dynamic").remove()},t.prototype.addDownloadOptionsForRenderings=function(e,t,i){for(var n=e.getRenderings(),o=0;o<n.length;o++){var r=n[o];if(r){var a=Manifesto.TranslationCollection.getValue(r.getLabel()),l="downloadOption"+ ++this.renderingUrlsCount;a?a+=" ({0})":a=t;var h=Utils.Files.simplifyMimeType(r.getFormat().toString());a=String.format(a,h),this.renderingUrls[l]=r.id;var c=$('<li class="option dynamic"><input id="'+l+'" data-mime="'+h+'" title="'+a+'" type="radio" name="downloadOptions" tabindex="0" /><label for="'+l+'">'+a+"</label></li>");switch(i){case s.dynamicImageRenderings:this.$imageOptions.append(c);break;case s.dynamicCanvasRenderings:this.$canvasOptions.append(c);break;case s.dynamicSequenceRenderings:this.$sequenceOptions.append(c)}}}},t.prototype.getSelectedOption=function(){return this.$downloadOptions.find("li.option input:checked")},t.prototype.getCanvasImageResource=function(e){var t=e.getImages();return t[0]?t[0].getResource():null},t.prototype.getCanvasHighResImageUri=function(e){var t=this.getCanvasComputedDimensions(e);if(t){var i=t.width,n=e.getCanonicalImageUri(i),o=n.split("/"),s=this.extension.getViewerRotation();return o[o.length-2]=String(s),n=o.join("/")}return""},t.prototype.getCanvasMimeType=function(e){var t=this.getCanvasImageResource(e),i=t.getFormat();return i?i.toString():null},t.prototype.getCanvasDimensions=function(e){return e.externalResource.data?new a(e.externalResource.data.width,e.externalResource.data.height):new a(0,0)},t.prototype.getCanvasMaxDimensions=function(e){return e.externalResource.data&&e.externalResource.data.profile[1]?new a(e.externalResource.data.profile[1].maxWidth,e.externalResource.data.profile[1].maxHeight):null},t.prototype.getCanvasComputedDimensions=function(e){var t=this.getCanvasDimensions(e),i=this.getCanvasMaxDimensions(e);if(!i)return null;var n=t.width,o=t.height;if(!_.isUndefined(i.width)&&i.width<t.width)if(n=i.width,_.isUndefined(i.height)){var s=Math.normalise(i.width,0,t.width);o=Math.floor(t.height*s)}else o=i.height;return new a(n,o)},t.prototype.isDownloadOptionAvailable=function(t){switch(t){case s.currentViewAsJpg:case s.dynamicCanvasRenderings:case s.dynamicImageRenderings:case s.wholeImageHighRes:if(!this.extension.isPagingSettingEnabled()||this.extension.isPagingSettingEnabled()&&this.extension.resources&&1===this.extension.resources.length){var i=this.getCanvasMaxDimensions(this.extension.helper.getCurrentCanvas());if(i){if(_.isUndefined(i.width))return!0;if(i.width<=this.options.maxImageWidth)return!0}}return!1;case s.wholeImagesHighRes:return this.extension.isPagingSettingEnabled()&&this.extension.resources&&this.extension.resources.length>1?!0:!1;case s.wholeImageLowResAsJpg:var n=this.getCanvasComputedDimensions(this.extension.helper.getCurrentCanvas());return n?!this.extension.isPagingSettingEnabled()&&n.width>this.options.confinedImageSize:!1;case s.selection:return this.options.selectionEnabled;default:return e.prototype.isDownloadOptionAvailable.call(this,t)}},t}(n);return l});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/ExternalContentDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("externalContentDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_EXTERNALCONTENT_DIALOGUE,this.closeCommand=i.HIDE_EXTERNALCONTENT_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.open(),t.$iframe.prop("src",i.uri)}),$.subscribe(this.closeCommand,function(e){t.close()}),this.$iframe=$("<iframe></iframe>"),this.$content.append(this.$iframe),this.$element.hide()},t.prototype.resize=function(){e.prototype.resize.call(this),this.$iframe.width(this.$content.width()),this.$iframe.height(this.$content.height())},t}(n);return o}),define("modules/uv-shared-module/AutoComplete",["require","exports"],function(e,t){var i=function(){function e(e,t,i,n,o,s,r){var a=this;void 0===o&&(o=300),void 0===s&&(s=2),void 0===r&&(r=!1),this._validKeyDownCodes=[KeyCodes.KeyDown.Backspace,KeyCodes.KeyDown.Spacebar,KeyCodes.KeyDown.Tab,KeyCodes.KeyDown.LeftArrow,KeyCodes.KeyDown.RightArrow,KeyCodes.KeyDown.Delete],this._validKeyPressCodes=[KeyCodes.KeyPress.GraveAccent,KeyCodes.KeyPress.DoubleQuote],this._lastKeyDownWasValid=!1,this._$element=e,this._autoCompleteFunc=t,this._delay=o,this._minChars=s,this._onSelect=n,this._parseResultsFunc=i,this._positionAbove=r,this._$searchResultsList=$('<ul class="autocomplete"></ul>'),this._positionAbove?this._$element.parent().prepend(this._$searchResultsList):this._$element.parent().append(this._$searchResultsList),this._$searchResultTemplate=$('<li class="result"><a href="#" tabindex="-1"></a></li>');var l=function(){var e=0;return function(t,i){clearTimeout(e),e=setTimeout(t,i)}}(),h=this;this._$element.on("keydown",function(e){var t=e.originalEvent;h._lastKeyDownWasValid=h._isValidKeyDown(t);var i=Utils.Keyboard.getCharCode(t),n=!1;i===KeyCodes.KeyDown.LeftArrow?n=!0:i===KeyCodes.KeyDown.RightArrow&&(n=!0),n&&(t.cancelBubble=!0,t.stopPropagation&&t.stopPropagation())}),this._$element.on("keypress",function(e){var t=h._isValidKeyPress(e.originalEvent);return h._lastKeyDownWasValid||t?!0:(e.preventDefault(),!1)}),this._$element.on("keyup",function(e){if(!h._getSelectedListItem().length&&e.keyCode===KeyCodes.KeyDown.Enter)return void h._onSelect(h._getTerms());if(h._$searchResultsList.is(":visible")&&h._results.length)if(e.keyCode===KeyCodes.KeyDown.Enter)h._searchForItem(h._getSelectedListItem());else{if(e.keyCode===KeyCodes.KeyDown.DownArrow)return void h._setSelectedResultIndex(1);if(e.keyCode===KeyCodes.KeyDown.UpArrow)return void h._setSelectedResultIndex(-1)}e.keyCode!==KeyCodes.KeyDown.Enter&&l(function(){var e=h._getTerms();e&&e.length>h._minChars&&!e.contains(" ")?h._search(e):(h._clearResults(),h._hideResults())},h._delay)}),$(document).on("mouseup",function(e){0===a._$searchResultsList.parent().has($(e.target)[0]).length&&(a._clearResults(),a._hideResults())}),this._hideResults()}return e.prototype._isValidKeyDown=function(e){var t=this._validKeyDownCodes.contains(Utils.Keyboard.getCharCode(e));return t},e.prototype._isValidKeyPress=function(e){var t=Utils.Keyboard.getCharCode(e),i=String.fromCharCode(t),n=i.isAlphanumeric()||this._validKeyPressCodes.contains(t);return n},e.prototype._getTerms=function(){return this._$element.val().trim()},e.prototype._setSelectedResultIndex=function(e){var t;t=1===e?this._selectedResultIndex+1:this._selectedResultIndex-1;var i=this._$searchResultsList.find("li");0>t?t=i.length-1:t>i.length-1&&(t=0),this._selectedResultIndex=t,i.removeClass("selected");var n=i.eq(this._selectedResultIndex);n.addClass("selected");var o=n.outerHeight(!0)*this._selectedResultIndex;this._$searchResultsList.scrollTop(o)},e.prototype._search=function(e){this._results=[],this._clearResults(),this._showResults(),this._$searchResultsList.append('<li class="loading"></li>'),this._updateListPosition();var t=this;this._autoCompleteFunc(e,function(e){t._listResults(e)})},e.prototype._clearResults=function(){this._$searchResultsList.empty()},e.prototype._hideResults=function(){this._$searchResultsList.hide()},e.prototype._showResults=function(){this._selectedResultIndex=-1,this._$searchResultsList.show()},e.prototype._updateListPosition=function(){this._positionAbove?this._$searchResultsList.css({top:-1*this._$searchResultsList.outerHeight(!0)}):this._$searchResultsList.css({top:this._$element.outerHeight(!0)})},e.prototype._listResults=function(e){if(this._results=this._parseResultsFunc(e),this._clearResults(),!this._results.length)return void this._hideResults();for(var t=0;t<this._results.length;t++){var i=this._results[t],n=this._$searchResultTemplate.clone(),o=n.find("a");o.text(i),this._$searchResultsList.append(n)}this._updateListPosition();var s=this;this._$searchResultsList.find("li").on("click",function(e){e.preventDefault(),s._searchForItem($(this))})},e.prototype._searchForItem=function(e){var t=e.find("a").text();this._$element.val(t),this._hideResults(),this._onSelect(t),this._clearResults(),this._hideResults()},e.prototype._getSelectedListItem=function(){return this._$searchResultsList.find("li.selected")},e}();return i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-searchfooterpanel-module/FooterPanel",["require","exports","../uv-shared-module/AutoComplete","../uv-shared-module/BaseCommands","../uv-shared-module/FooterPanel","../../extensions/uv-seadragon-extension/Commands","../../extensions/uv-seadragon-extension/Mode"],function(e,t,i,n,o,s,r){var a=function(e){function t(t){e.call(this,t),this.placemarkerTouched=!1}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("searchFooterPanel"),e.prototype.create.call(this),$.subscribe(n.CANVAS_INDEX_CHANGED,function(e,i){t.canvasIndexChanged(),t.setCurrentSearchResultPlacemarker(),t.updatePrevButton(),t.updateNextButton()}),$.subscribe(s.MODE_CHANGED,function(e,i){t.settingsChanged()}),$.subscribe(s.SEARCH,function(e,i){t.terms=i}),$.subscribe(s.SEARCH_RESULTS,function(e,i){t.displaySearchResults(i.terms,i.results),t.setCurrentSearchResultPlacemarker()}),$.subscribe(s.SEARCH_RESULTS_EMPTY,function(){t.hideSearchSpinner()}),$.subscribe(s.SEARCH_RESULT_RECT_CHANGED,function(){t.updatePrevButton(),t.updateNextButton()}),this.$printButton=$('<a class="print" title="'+this.content.print+'" tabindex="0">'+this.content.print+"</a>"),this.$options.prepend(this.$printButton),this.$searchContainer=$('<div class="search"></div>'),this.$element.prepend(this.$searchContainer),this.$searchOptions=$('<div class="searchOptions"></div>'),this.$searchContainer.append(this.$searchOptions),this.$searchLabel=$('<span class="label">'+this.content.searchWithin+"</span>"),this.$searchOptions.append(this.$searchLabel),this.$searchTextContainer=$('<div class="searchTextContainer"></div>'),this.$searchOptions.append(this.$searchTextContainer),this.$searchText=$('<input class="searchText" type="text" maxlength="100" value="'+this.content.enterKeyword+'" />'),this.$searchTextContainer.append(this.$searchText),this.$searchButton=$('<a class="imageButton searchButton" tabindex="0"></a>'),this.$searchTextContainer.append(this.$searchButton),this.$searchPagerContainer=$('<div class="searchPager"></div>'),this.$element.prepend(this.$searchPagerContainer),this.$searchPagerControls=$('<div class="controls"></div>'),this.$searchPagerContainer.prepend(this.$searchPagerControls),this.$previousResultButton=$('<a class="previousResult" title="'+this.content.previousResult+'">'+this.content.previousResult+"</a>"),this.$searchPagerControls.append(this.$previousResultButton),this.$searchResultsInfo=$('<div class="searchResultsInfo"><span class="number">x</span> <span class="foundFor"></span> \'<span class="terms">y</span>\'</div>'),this.$searchPagerControls.append(this.$searchResultsInfo),this.$clearSearchResultsButton=$('<a class="clearSearch" title="'+this.content.clearSearch+'">'+this.content.clearSearch+"</a>"),this.$searchResultsInfo.append(this.$clearSearchResultsButton),this.$nextResultButton=$('<a class="nextResult" title="'+this.content.nextResult+'">'+this.content.nextResult+"</a>"),this.$searchPagerControls.append(this.$nextResultButton),this.$searchResultsContainer=$('<div class="searchResults"></div>'),this.$element.prepend(this.$searchResultsContainer),this.$line=$('<div class="line"></div>'),this.$searchResultsContainer.append(this.$line),this.$pagePositionMarker=$('<div class="positionPlacemarker"></div>'),this.$searchResultsContainer.append(this.$pagePositionMarker),this.$pagePositionLabel=$('<div class="label"></div>'),this.$searchResultsContainer.append(this.$pagePositionLabel),this.$placemarkerDetails=$('<div class="placeMarkerDetails"></div>'),this.$searchResultsContainer.append(this.$placemarkerDetails),this.$placemarkerDetailsTop=$("<h1></h1>"),this.$placemarkerDetails.append(this.$placemarkerDetailsTop),this.$placemarkerDetailsBottom=$("<p></p>"),this.$placemarkerDetails.append(this.$placemarkerDetailsBottom),this.$searchPagerContainer.hide(),this.$placemarkerDetails.hide();var o=this;this.$searchButton.on("click",function(e){e.preventDefault(),t.search(t.$searchText.val())}),this.$searchText.on("focus",function(){t.$searchText.val()===t.content.enterKeyword&&t.$searchText.val("")}),this.$placemarkerDetails.on("mouseover",function(){$.publish(s.SEARCH_PREVIEW_START,[t.currentPlacemarkerIndex])}),this.$placemarkerDetails.on("mouseleave",function(){$(this).hide(),$.publish(s.SEARCH_PREVIEW_FINISH);var e=o.getSearchResultPlacemarkers();e.removeClass("hover")}),this.$placemarkerDetails.on("click",function(e){$.publish(s.VIEW_PAGE,[t.currentPlacemarkerIndex])}),this.$previousResultButton.on("click",function(e){e.preventDefault(),$.publish(s.PREV_SEARCH_RESULT)}),this.$nextResultButton.on("click",function(e){e.preventDefault(),$.publish(s.NEXT_SEARCH_RESULT)}),this.$clearSearchResultsButton.on("click",function(e){e.preventDefault(),$.publish(s.CLEAR_SEARCH),t.clearSearchResults()}),this.extension.isSearchWithinEnabled()||(this.$searchContainer.hide(),this.$searchPagerContainer.hide(),this.$searchResultsContainer.hide(),this.$element.addClass("min")),1===this.extension.helper.getTotalCanvases()&&this.$searchResultsContainer.hide();var r=this.extension.getAutoCompleteUri();r?new i(this.$searchText,function(e,t){$.getJSON(String.format(r,e),function(e){t(e)})},function(e){return _.map(e.terms,function(e){return e.match})},function(e){t.search(e)},300,2,!0):this.$searchText.on("keyup",function(e){e.keyCode===KeyCodes.KeyDown.Enter&&o.search(o.$searchText.val())}),this.$printButton.onPressed(function(){$.publish(s.PRINT)}),this.updatePrintButton();var a=Utils.Bools.getBool(this.config.options.positionMarkerEnabled,!0);a||(this.$pagePositionMarker.hide(),this.$pagePositionLabel.hide())},t.prototype.isZoomToSearchResultEnabled=function(){return Utils.Bools.getBool(this.extension.config.options.zoomToSearchResultEnabled,!0)},t.prototype.isPreviousButtonEnabled=function(){var e=this.extension.helper.canvasIndex,t=this.getFirstSearchResultCanvasIndex(),i=this.getCurrentSearchResultRectIndex();return this.isZoomToSearchResultEnabled()&&this.extension.currentSearchResultRect?t>e?!1:e===t&&0===i?!1:!0:e>t},t.prototype.isCanvasIndexLessThanFirstSearchResultIndex=function(){var e=this.extension.searchResults;return this.extension.helper.canvasIndex<=e[0].canvasIndex},t.prototype.isNextButtonEnabled=function(){var e=this.extension.helper.canvasIndex,t=this.getLastSearchResultCanvasIndex(),i=this.getCurrentSearchResultRectIndex();return this.isZoomToSearchResultEnabled()&&this.extension.currentSearchResultRect?e>t?!1:e===t&&i===this.getLastSearchResultRectIndex()?!1:!0:t>e},t.prototype.getSearchResults=function(){return this.extension.searchResults},t.prototype.getCurrentSearchResultRectIndex=function(){return this.extension.getCurrentSearchResultRectIndex()},t.prototype.getFirstSearchResultCanvasIndex=function(){var e=this.getSearchResults(),t=e[0].canvasIndex;return t},t.prototype.getLastSearchResultCanvasIndex=function(){var e=this.getSearchResults(),t=e[e.length-1].canvasIndex;return t},t.prototype.getLastSearchResultRectIndex=function(){return this.extension.getLastSearchResultRectIndex()},t.prototype.updateNextButton=function(){var e=this.extension.searchResults;e&&e.length&&(this.isNextButtonEnabled()?this.$nextResultButton.removeClass("disabled"):this.$nextResultButton.addClass("disabled"))},t.prototype.updatePrevButton=function(){var e=this.extension.searchResults;e&&e.length&&(this.isPreviousButtonEnabled()?this.$previousResultButton.removeClass("disabled"):this.$previousResultButton.addClass("disabled"))},t.prototype.updatePrintButton=function(){var e=Utils.Bools.getBool(this.options.printEnabled,!1);e?this.$printButton.show():this.$printButton.hide()},t.prototype.search=function(e){return this.terms=e,""===this.terms||this.terms===this.content.enterKeyword?void this.extension.showMessage(this.config.modules.genericDialogue.content.emptyValue,function(){this.$searchText.focus()}):(this.$searchText.blur(),this.showSearchSpinner(),void $.publish(s.SEARCH,[this.terms]))},t.prototype.getSearchResultPlacemarkers=function(){return this.$searchResultsContainer.find(".searchResultPlacemarker")},t.prototype.setCurrentSearchResultPlacemarker=function(){var e=this.getSearchResultPlacemarkers();e.parent().find(".current").removeClass("current");var t=$('.searchResultPlacemarker[data-index="'+this.extension.helper.canvasIndex+'"]');t.addClass("current")},t.prototype.positionSearchResultPlacemarkers=function(){var e=this.extension.searchResults;if(e.length){var t=this.getSearchResultPlacemarkers();t.remove();for(var i=this.getPageLineRatio(),n=this.$line.position().top,o=this.$line.position().left,s=this,r=0;r<e.length;r++){var a=e[r],l=a.canvasIndex*i,h=$('<div class="searchResultPlacemarker" data-index="'+a.canvasIndex+'"></div>');h[0].ontouchstart=function(e){s.onPlacemarkerTouchStart.call(this,s)},h.click(function(e){s.onPlacemarkerClick.call(this,s)}),h.mouseenter(function(e){s.onPlacemarkerMouseEnter.call(this,s)}),h.mouseleave(function(e){s.onPlacemarkerMouseLeave.call(this,e,s)}),this.$searchResultsContainer.append(h);var c=n-h.height(),u=o+l-h.width()/2;h.css({top:c,left:u})}}},t.prototype.onPlacemarkerTouchStart=function(e){e.placemarkerTouched=!0;var t=$(this),i=parseInt(t.attr("data-index"));$.publish(s.VIEW_PAGE,[i])},t.prototype.onPlacemarkerClick=function(e){if(!e.placemarkerTouched){e.placemarkerTouched=!1;var t=$(this),i=parseInt(t.attr("data-index"));$.publish(s.VIEW_PAGE,[i])}},t.prototype.onPlacemarkerMouseEnter=function(e){if(!e.placemarkerTouched){var t=$(this);t.addClass("hover");var i=parseInt(t.attr("data-index"));$.publish(s.SEARCH_PREVIEW_START,[i]);var n=e.getSearchResultPlacemarkers(),o=n.index(t[0]);e.currentPlacemarkerIndex=i,e.$placemarkerDetails.show();var a="{0} {1}",l=e.extension.getMode();if(l.toString()===r.page.toString()){var h=e.extension.helper.getCanvasByIndex(i),c=Manifesto.TranslationCollection.getValue(h.getLabel());""===c&&(c=this.extension.helper.manifest.options.defaultLabel),a=String.format(a,e.content.pageCaps,c)}else a=String.format(a,e.content.imageCaps,i+1);e.$placemarkerDetailsTop.html(a);var u,p=e.extension.searchResults[o],d=Utils.Strings.ellipsis(e.terms,e.options.elideDetailsTermsCount);1===p.rects.length?(u=e.content.instanceFound,u=String.format(u,d)):(u=e.content.instancesFound,u=String.format(u,p.rects.length,d)),e.$placemarkerDetailsBottom.html(u);var g=t.position(),f=g.top-e.$placemarkerDetails.height(),m=g.left;m<e.$placemarkerDetails.width()/2?m=0-t.width()/2:m>e.$line.width()-e.$placemarkerDetails.width()/2?m=e.$line.width()-e.$placemarkerDetails.width()+t.width()/2:m-=e.$placemarkerDetails.width()/2,e.$placemarkerDetails.css({top:f,left:m})}},t.prototype.onPlacemarkerMouseLeave=function(e,t){$.publish(s.SEARCH_PREVIEW_FINISH);var i=$(this),n=e.toElement||e.relatedTarget,o=$(n).closest(t.$placemarkerDetails).length;n!=t.$placemarkerDetails.get(0)&&0===o&&(t.$placemarkerDetails.hide(),i.removeClass("hover"))},t.prototype.setPageMarkerPosition=function(){if(null!=this.extension.helper.canvasIndex){var e=this.getPageLineRatio(),t=this.$line.position().top,i=this.$line.position().left,n=this.extension.helper.canvasIndex*e,o=t,s=i+n;this.$pagePositionMarker.css({top:o,left:s});var r=this.$line.width();s+this.$pagePositionLabel.outerWidth(!0)>r?(s-=this.$pagePositionLabel.outerWidth(!0),this.$pagePositionLabel.removeClass("right"),this.$pagePositionLabel.addClass("left")):(this.$pagePositionLabel.removeClass("left"),this.$pagePositionLabel.addClass("right")),this.$pagePositionLabel.css({top:o,left:s})}},t.prototype.clearSearchResults=function(){this.extension.searchResults=[];var e=this.getSearchResultPlacemarkers();e.remove(),this.$searchText.val(this.content.enterKeyword),this.$searchContainer.show(),this.$searchPagerContainer.hide(),this.$searchText.focus()},t.prototype.getPageLineRatio=function(){var e=this.$line.width();return 1===this.extension.helper.getTotalCanvases()?0:e/(this.extension.helper.getTotalCanvases()-1)},t.prototype.canvasIndexChanged=function(){this.setPageMarkerPosition(),this.setPlacemarkerLabel()},t.prototype.settingsChanged=function(){this.setPlacemarkerLabel()},t.prototype.setPlacemarkerLabel=function(){var e=this.content.displaying,t=this.extension.helper.canvasIndex;if(this.isPageModeEnabled()){var i=this.extension.helper.getCanvasByIndex(t),n=Manifesto.TranslationCollection.getValue(i.getLabel());""===n&&(n=this.content.defaultLabel);var o=this.extension.helper.getLastCanvasLabel(!0);this.$pagePositionLabel.html(String.format(e,this.content.page,this.extension.sanitize(n),this.extension.sanitize(o)))}else this.$pagePositionLabel.html(String.format(e,this.content.image,t+1,this.extension.helper.getTotalCanvases()))},t.prototype.isPageModeEnabled=function(){return this.config.options.pageModeEnabled&&this.extension.getMode().toString()===r.page.toString()},t.prototype.showSearchSpinner=function(){this.$searchText.addClass("searching")},t.prototype.hideSearchSpinner=function(){this.$searchText.removeClass("searching")},t.prototype.displaySearchResults=function(e,t){if(t){this.hideSearchSpinner(),this.positionSearchResultPlacemarkers(),this.$searchContainer.hide(),this.$searchPagerControls.css({left:0});var i=this.$searchPagerContainer.find(".number");i.text(this.extension.getTotalSearchResultRects());var n=this.$searchResultsInfo.find(".foundFor");1===t.length?n.html(this.content.resultFoundFor):n.html(this.content.resultsFoundFor);var o=this.$searchPagerContainer.find(".terms");o.html(Utils.Strings.ellipsis(e,this.options.elideResultsTermsCount)),o.prop("title",e),this.$searchPagerContainer.show(),this.resize()}},t.prototype.resize=function(){e.prototype.resize.call(this);var t=this.extension.searchResults;t&&t.length&&this.positionSearchResultPlacemarkers(),this.setPageMarkerPosition(),this.$searchPagerContainer.width(this.$element.width());var i=this.$element.width()/2;this.$searchPagerControls.css({left:i-this.$searchPagerControls.width()/2}),this.$searchOptions.css({left:i-this.$searchOptions.outerWidth()/2})},t}(o);return a});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-osdmobilefooterpanel-module/MobileFooter",["require","exports","../uv-shared-module/FooterPanel","../../extensions/uv-seadragon-extension/Commands"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("mobileFooterPanel"),e.prototype.create.call(this),this.$spacer=$('<div class="spacer"></div>'),this.$options.prepend(this.$spacer),this.$rotateButton=$('<a class="rotate" title="'+this.content.rotateRight+'" tabindex="0">'+this.content.rotateRight+"</a>"),this.$options.prepend(this.$rotateButton),this.$zoomOutButton=$('<a class="zoomOut" title="'+this.content.zoomOut+'" tabindex="0">'+this.content.zoomOut+"</a>"),this.$options.prepend(this.$zoomOutButton),this.$zoomInButton=$('<a class="zoomIn" title="'+this.content.zoomIn+'" tabindex="0">'+this.content.zoomIn+"</a>"),this.$options.prepend(this.$zoomInButton),this.$zoomInButton.onPressed(function(){$.publish(n.ZOOM_IN)}),this.$zoomOutButton.onPressed(function(){$.publish(n.ZOOM_OUT)}),this.$rotateButton.onPressed(function(){$.publish(n.ROTATE)})},t.prototype.resize=function(){e.prototype.resize.call(this),this.$options.css("left",Math.floor(this.$element.width()/2-this.$options.width()/2))},t}(i);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-dialogues-module/MoreInfoDialogue",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/Dialogue"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("moreInfoDialogue"),e.prototype.create.call(this),this.openCommand=i.SHOW_MOREINFO_DIALOGUE,this.closeCommand=i.HIDE_MOREINFO_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.open(i)}),$.subscribe(this.closeCommand,function(e){t.close()}),this.config.content=this.extension.config.modules.moreInfoRightPanel.content,this.config.options=this.extension.config.modules.moreInfoRightPanel.options,this.$title=$("<h1>"+this.config.content.title+"</h1>"),this.$content.append(this.$title),this.$metadata=$('<div class="iiif-metadata-component"></div>'),this.$content.append(this.$metadata),this.component=new IIIFComponents.MetadataComponent(this._getOptions()),this.$element.hide()},t.prototype.open=function(t){e.prototype.open.call(this,t),this.component.databind()},t.prototype._getOptions=function(){var e=this;return{canvasDisplayOrder:this.config.options.canvasDisplayOrder,canvases:this.extension.getCurrentCanvases(),canvasExclude:this.config.options.canvasExclude,canvasLabels:"Left Page, Right Page",content:this.config.content,copiedMessageDuration:2e3,copyToClipboardEnabled:Utils.Bools.getBool(this.config.options.copyToClipboardEnabled,!1),element:".overlay.moreInfo .iiif-metadata-component",helper:this.extension.helper,licenseFormatter:null,limit:this.config.options.textLimit||4,limitType:IIIFComponents.MetadataComponentOptions.LimitType.LINES,manifestDisplayOrder:this.config.options.manifestDisplayOrder,manifestExclude:this.config.options.manifestExclude,range:this.extension.getCurrentCanvasRange(),rtlLanguageCodes:this.config.options.rtlLanguageCodes,sanitizer:function(t){return e.extension.sanitize(t)},showAllLanguages:this.config.options.showAllLanguages}},t.prototype.close=function(){e.prototype.close.call(this)},t.prototype.resize=function(){this.setDockedPosition()},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-multiselectdialogue-module/MultiSelectDialogue",["require","exports","../../extensions/uv-seadragon-extension/Commands","../../modules/uv-shared-module/Dialogue","../../extensions/uv-seadragon-extension/Mode"],function(e,t,i,n,o){var s=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("multiSelectDialogue"),e.prototype.create.call(this);var n=this;this.openCommand=i.SHOW_MULTISELECT_DIALOGUE,this.closeCommand=i.HIDE_MULTISELECT_DIALOGUE,$.subscribe(this.openCommand,function(e,i){t.open();var n=t.extension.helper.getMultiSelectState();n.setEnabled(!0),t.component.databind()}),$.subscribe(this.closeCommand,function(e){t.close();var i=t.extension.helper.getMultiSelectState();i.setEnabled(!1)}),this.$title=$("<h1></h1>"),this.$content.append(this.$title),this.$title.text(this.content.title),this.$gallery=$('<div class="iiif-gallery-component"></div>'),this.$content.append(this.$gallery),this.options={element:".overlay.multiSelect .iiif-gallery-component",helper:this.extension.helper,chunkedResizingThreshold:this.config.options.galleryThumbChunkedResizingThreshold,content:this.config.content,debug:!1,imageFadeInDuration:300,initialZoom:4,minLabelWidth:20,pageModeEnabled:this.isPageModeEnabled(),searchResults:[],scrollStopDuration:100,sizingEnabled:!0,thumbHeight:this.config.options.galleryThumbHeight,thumbLoadPadding:this.config.options.galleryThumbLoadPadding,thumbWidth:this.config.options.galleryThumbWidth,viewingDirection:this.extension.helper.getViewingDirection()},this.component=new IIIFComponents.GalleryComponent(this.options);var o=$(this.options.element).find("a.select");o.addClass("btn btn-primary"),this.component.on("multiSelectionMade",function(e){var t=e[0];$.publish(i.MULTISELECTION_MADE,[t]),n.close()}),this.$element.hide()},t.prototype.isPageModeEnabled=function(){return Utils.Bools.getBool(this.config.options.pageModeEnabled,!0)&&this.extension.getMode().toString()===o.page.toString()},t.prototype.open=function(){e.prototype.open.call(this)},t.prototype.close=function(){e.prototype.close.call(this)},t.prototype.resize=function(){e.prototype.resize.call(this);var t=$(this.options.element),i=t.find(".main"),n=t.find(".header");i.height(this.$content.height()-this.$title.outerHeight()-this.$title.verticalMargins()-n.height())},t}(n);return s}),define("extensions/uv-seadragon-extension/MultiSelectionArgs",["require","exports"],function(e,t){var i=function(){function e(){}return e}();return i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-pagingheaderpanel-module/PagingHeaderPanel",["require","exports","../uv-shared-module/AutoComplete","../uv-shared-module/BaseCommands","../../extensions/uv-seadragon-extension/Commands","../uv-shared-module/HeaderPanel","../../extensions/uv-seadragon-extension/Mode"],function(e,t,i,n,o,s,r){var a=function(e){function t(t){e.call(this,t),this.firstButtonEnabled=!1,
+this.lastButtonEnabled=!1,this.nextButtonEnabled=!1,this.prevButtonEnabled=!1}return __extends(t,e),t.prototype.create=function(){var t=this;if(this.setConfig("pagingHeaderPanel"),e.prototype.create.call(this),$.subscribe(n.CANVAS_INDEX_CHANGED,function(e,i){t.canvasIndexChanged(i)}),$.subscribe(n.SETTINGS_CHANGED,function(e){t.modeChanged(),t.updatePagingToggle()}),$.subscribe(n.CANVAS_INDEX_CHANGE_FAILED,function(e){t.setSearchFieldValue(t.extension.helper.canvasIndex)}),$.subscribe(n.LEFTPANEL_EXPAND_FULL_START,function(e){t.openGallery()}),$.subscribe(n.LEFTPANEL_COLLAPSE_FULL_START,function(e){t.closeGallery()}),this.$prevOptions=$('<div class="prevOptions"></div>'),this.$centerOptions.append(this.$prevOptions),this.$firstButton=$('<a class="imageBtn first" tabindex="0"></a>'),this.$prevOptions.append(this.$firstButton),this.$prevButton=$('<a class="imageBtn prev" tabindex="0"></a>'),this.$prevOptions.append(this.$prevButton),this.$modeOptions=$('<div class="mode"></div>'),this.$centerOptions.append(this.$modeOptions),this.$imageModeLabel=$('<label for="image">'+this.content.image+"</label>"),this.$modeOptions.append(this.$imageModeLabel),this.$imageModeOption=$('<input type="radio" id="image" name="mode" tabindex="0"/>'),this.$modeOptions.append(this.$imageModeOption),this.$pageModeLabel=$('<label for="page"></label>'),this.$modeOptions.append(this.$pageModeLabel),this.$pageModeOption=$('<input type="radio" id="page" name="mode" tabindex="0"/>'),this.$modeOptions.append(this.$pageModeOption),this.$search=$('<div class="search"></div>'),this.$centerOptions.append(this.$search),this.$searchText=$('<input class="searchText" maxlength="50" type="text" tabindex="0"/>'),this.$search.append(this.$searchText),Utils.Bools.getBool(this.options.autoCompleteBoxEnabled,!0))this.$searchText.hide(),this.$autoCompleteBox=$('<input class="autocompleteText" type="text" maxlength="100" />'),this.$search.append(this.$autoCompleteBox),new i(this.$autoCompleteBox,function(e,i){var n=[],o=t.extension.helper.getCanvases();if(t.isPageModeEnabled())for(var s=0;s<o.length;s++){var r=o[s],a=Manifesto.TranslationCollection.getValue(r.getLabel());a.startsWith(e)&&n.push(a)}else for(var s=0;s<o.length;s++){var r=o[s];r.index.toString().startsWith(e)&&n.push(r.index.toString())}i(n)},function(e){return e},function(e){t.search(e)},300,0);else if(Utils.Bools.getBool(this.options.imageSelectionBoxEnabled,!0)){this.$selectionBoxOptions=$('<div class="image-selectionbox-options"></div>'),this.$centerOptions.append(this.$selectionBoxOptions),this.$imageSelectionBox=$('<select class="image-selectionbox" name="image-select" tabindex="0" ></select>'),this.$selectionBoxOptions.append(this.$imageSelectionBox);for(var s=0;s<this.extension.helper.getTotalCanvases();s++){var a=this.extension.helper.getCanvasByIndex(s),l=this.extension.sanitize(Manifesto.TranslationCollection.getValue(a.getLabel()));this.$imageSelectionBox.append("<option value="+s+">"+l+"</option>")}this.$imageSelectionBox.change(function(){var e=parseInt(t.$imageSelectionBox.val());$.publish(o.IMAGE_SEARCH,[e])})}this.$total=$('<span class="total"></span>'),this.$search.append(this.$total),this.$searchButton=$('<a class="go btn btn-primary" tabindex="0">'+this.content.go+"</a>"),this.$search.append(this.$searchButton),this.$nextOptions=$('<div class="nextOptions"></div>'),this.$centerOptions.append(this.$nextOptions),this.$nextButton=$('<a class="imageBtn next" tabindex="0"></a>'),this.$nextOptions.append(this.$nextButton),this.$lastButton=$('<a class="imageBtn last" tabindex="0"></a>'),this.$nextOptions.append(this.$lastButton),this.isPageModeEnabled()?(this.$pageModeOption.attr("checked","checked"),this.$pageModeOption.removeAttr("disabled"),this.$pageModeLabel.removeClass("disabled")):(this.$imageModeOption.attr("checked","checked"),this.$pageModeOption.attr("disabled","disabled"),this.$pageModeLabel.addClass("disabled")),this.extension.helper.getManifestType().toString()===manifesto.ManifestType.manuscript().toString()?this.$pageModeLabel.text(this.content.folio):this.$pageModeLabel.text(this.content.page),this.$galleryButton=$('<a class="imageBtn gallery" title="'+this.content.gallery+'" tabindex="0"></a>'),this.$rightOptions.prepend(this.$galleryButton),this.$pagingToggleButtons=$('<div class="pagingToggleButtons"></div>'),this.$rightOptions.prepend(this.$pagingToggleButtons),this.$oneUpButton=$('<a class="imageBtn one-up" title="'+this.content.oneUp+'" tabindex="0"></a>'),this.$pagingToggleButtons.append(this.$oneUpButton),this.$twoUpButton=$('<a class="imageBtn two-up" title="'+this.content.twoUp+'" tabindex="0"></a>'),this.$pagingToggleButtons.append(this.$twoUpButton),this.updatePagingToggle(),this.updateGalleryButton(),this.$oneUpButton.onPressed(function(){var e=!1;t.updateSettings({pagingEnabled:e}),$.publish(o.PAGING_TOGGLED,[e])}),this.$twoUpButton.onPressed(function(){var e=!0;t.updateSettings({pagingEnabled:e}),$.publish(o.PAGING_TOGGLED,[e])}),this.$galleryButton.onPressed(function(){$.publish(n.TOGGLE_EXPAND_LEFT_PANEL)}),this.setTitles(),this.setTotal();var h=this.extension.helper.getViewingDirection();1===this.extension.helper.getTotalCanvases()&&this.$centerOptions.hide(),this.$firstButton.onPressed(function(){switch(h.toString()){case manifesto.ViewingDirection.leftToRight().toString():case manifesto.ViewingDirection.topToBottom().toString():case manifesto.ViewingDirection.bottomToTop().toString():$.publish(o.FIRST);break;case manifesto.ViewingDirection.rightToLeft().toString():$.publish(o.LAST)}}),this.$prevButton.onPressed(function(){switch(h.toString()){case manifesto.ViewingDirection.leftToRight().toString():case manifesto.ViewingDirection.bottomToTop().toString():case manifesto.ViewingDirection.topToBottom().toString():$.publish(o.PREV);break;case manifesto.ViewingDirection.rightToLeft().toString():$.publish(o.NEXT)}}),this.$nextButton.onPressed(function(){switch(h.toString()){case manifesto.ViewingDirection.leftToRight().toString():case manifesto.ViewingDirection.bottomToTop().toString():case manifesto.ViewingDirection.topToBottom().toString():$.publish(o.NEXT);break;case manifesto.ViewingDirection.rightToLeft().toString():$.publish(o.PREV)}}),this.$lastButton.onPressed(function(){switch(h.toString()){case manifesto.ViewingDirection.leftToRight().toString():case manifesto.ViewingDirection.topToBottom().toString():case manifesto.ViewingDirection.bottomToTop().toString():$.publish(o.LAST);break;case manifesto.ViewingDirection.rightToLeft().toString():$.publish(o.FIRST)}}),this.config.options.pageModeEnabled?(this.$imageModeOption.on("click",function(e){$.publish(o.MODE_CHANGED,[r.image.toString()])}),this.$pageModeOption.on("click",function(e){$.publish(o.MODE_CHANGED,[r.page.toString()])})):(this.$imageModeOption.hide(),this.$pageModeLabel.hide(),this.$pageModeOption.hide()),this.$searchText.onEnter(function(){t.$searchText.blur(),t.search(t.$searchText.val())}),this.$searchText.click(function(){$(this).select()}),this.$searchButton.onPressed(function(){t.options.autoCompleteBoxEnabled?t.search(t.$autoCompleteBox.val()):t.search(t.$searchText.val())}),this.options.modeOptionsEnabled===!1&&(this.$modeOptions.hide(),this.$centerOptions.addClass("modeOptionsDisabled")),this.options.imageSelectionBoxEnabled===!0&&this.options.autoCompleteBoxEnabled!==!0&&this.$search.hide(),this.options.helpEnabled===!1&&this.$helpButton.hide(),Utils.Bools.getBool(this.options.pagingToggleEnabled,!0)||this.$pagingToggleButtons.hide()},t.prototype.openGallery=function(){this.$oneUpButton.removeClass("on"),this.$twoUpButton.removeClass("on"),this.$galleryButton.addClass("on")},t.prototype.closeGallery=function(){this.updatePagingToggle(),this.$galleryButton.removeClass("on")},t.prototype.isPageModeEnabled=function(){return this.config.options.pageModeEnabled&&this.extension.getMode().toString()===r.page.toString()},t.prototype.setTitles=function(){this.isPageModeEnabled()?(this.$firstButton.prop("title",this.content.firstPage),this.$prevButton.prop("title",this.content.previousPage),this.$nextButton.prop("title",this.content.nextPage),this.$lastButton.prop("title",this.content.lastPage)):(this.$firstButton.prop("title",this.content.firstImage),this.$prevButton.prop("title",this.content.previousImage),this.$nextButton.prop("title",this.content.nextImage),this.$lastButton.prop("title",this.content.lastImage)),this.$searchButton.prop("title",this.content.go)},t.prototype.updatePagingToggle=function(){return this.pagingToggleIsVisible()?void(this.extension.isPagingSettingEnabled()?(this.$oneUpButton.removeClass("on"),this.$twoUpButton.addClass("on")):(this.$twoUpButton.removeClass("on"),this.$oneUpButton.addClass("on"))):void this.$pagingToggleButtons.hide()},t.prototype.pagingToggleIsVisible=function(){return Utils.Bools.getBool(this.options.pagingToggleEnabled,!0)&&this.extension.helper.isPagingAvailable()},t.prototype.updateGalleryButton=function(){this.galleryIsVisible()||this.$galleryButton.hide()},t.prototype.galleryIsVisible=function(){return Utils.Bools.getBool(this.options.galleryButtonEnabled,!0)&&this.extension.isLeftPanelEnabled()},t.prototype.setTotal=function(){var e=this.content.of;this.isPageModeEnabled()?this.$total.html(String.format(e,this.extension.helper.getLastCanvasLabel(!0))):this.$total.html(String.format(e,this.extension.helper.getTotalCanvases()))},t.prototype.setSearchFieldValue=function(e){var t,i=this.extension.helper.getCanvasByIndex(e);if(this.isPageModeEnabled()){var n=Manifesto.TranslationCollection.getValue(i.getLabel());t="-"===n?"":n}else e+=1,t=e;this.options.autoCompleteBoxEnabled?this.$autoCompleteBox.val(t):this.$searchText.val(t)},t.prototype.search=function(e){if(!e)return this.extension.showMessage(this.content.emptyValue),void $.publish(n.CANVAS_INDEX_CHANGE_FAILED);if(this.isPageModeEnabled())$.publish(o.PAGE_SEARCH,[e]);else{var t;if(t=this.options.autoCompleteBoxEnabled?parseInt(this.$autoCompleteBox.val(),10):parseInt(this.$searchText.val(),10),t-=1,isNaN(t))return this.extension.showMessage(this.extension.config.modules.genericDialogue.content.invalidNumber),void $.publish(n.CANVAS_INDEX_CHANGE_FAILED);var i=this.extension.helper.getCanvasByIndex(t);if(!i)return this.extension.showMessage(this.extension.config.modules.genericDialogue.content.pageNotFound),void $.publish(n.CANVAS_INDEX_CHANGE_FAILED);$.publish(o.IMAGE_SEARCH,[t])}},t.prototype.canvasIndexChanged=function(e){this.setSearchFieldValue(e),this.options.imageSelectionBoxEnabled===!0&&this.options.autoCompleteBoxEnabled!==!0&&this.$imageSelectionBox.val(e);var t=this.extension.helper.getViewingDirection();t.toString()===manifesto.ViewingDirection.rightToLeft().toString()?(this.extension.helper.isFirstCanvas()?(this.disableLastButton(),this.disableNextButton()):(this.enableLastButton(),this.enableNextButton()),this.extension.helper.isLastCanvas()?(this.disableFirstButton(),this.disablePrevButton()):(this.enableFirstButton(),this.enablePrevButton())):(this.extension.helper.isFirstCanvas()?(this.disableFirstButton(),this.disablePrevButton()):(this.enableFirstButton(),this.enablePrevButton()),this.extension.helper.isLastCanvas()?(this.disableLastButton(),this.disableNextButton()):(this.enableLastButton(),this.enableNextButton()))},t.prototype.disableFirstButton=function(){this.firstButtonEnabled=!1,this.$firstButton.disable()},t.prototype.enableFirstButton=function(){this.firstButtonEnabled=!0,this.$firstButton.enable()},t.prototype.disableLastButton=function(){this.lastButtonEnabled=!1,this.$lastButton.disable()},t.prototype.enableLastButton=function(){this.lastButtonEnabled=!0,this.$lastButton.enable()},t.prototype.disablePrevButton=function(){this.prevButtonEnabled=!1,this.$prevButton.disable()},t.prototype.enablePrevButton=function(){this.prevButtonEnabled=!0,this.$prevButton.enable()},t.prototype.disableNextButton=function(){this.nextButtonEnabled=!1,this.$nextButton.disable()},t.prototype.enableNextButton=function(){this.nextButtonEnabled=!0,this.$nextButton.enable()},t.prototype.modeChanged=function(){this.setSearchFieldValue(this.extension.helper.canvasIndex),this.setTitles(),this.setTotal()},t.prototype.resize=function(){e.prototype.resize.call(this),this.extension.width()<this.extension.config.options.minWidthBreakPoint?(this.pagingToggleIsVisible()&&this.$pagingToggleButtons.hide(),this.galleryIsVisible()&&this.$galleryButton.hide()):(this.pagingToggleIsVisible()&&this.$pagingToggleButtons.show(),this.galleryIsVisible()&&this.$galleryButton.show())},t}(s);return a}),define("extensions/uv-seadragon-extension/Bounds",["require","exports"],function(e,t){var i=function(){function e(e,t,i,n){this.x=e,this.y=t,this.w=i,this.h=n}return e.prototype.toString=function(){return this.x+","+this.y+","+this.w+","+this.h},e.fromString=function(t){var i=t.split(",");return new e(Number(i[0]),Number(i[1]),Number(i[2]),Number(i[3]))},e}();return i});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-seadragoncenterpanel-module/SeadragonCenterPanel",["require","exports","../uv-shared-module/BaseCommands","../../extensions/uv-seadragon-extension/Bounds","../uv-shared-module/CenterPanel","../../extensions/uv-seadragon-extension/Commands","../uv-shared-module/MetricType","../../Params"],function(e,t,i,n,o,s,r,a){var l=function(e){function t(t){e.call(this,t),this.controlsVisible=!1,this.isCreated=!1,this.isFirstLoad=!0,this.nextButtonEnabled=!1,this.prevButtonEnabled=!1}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("seadragonCenterPanel"),e.prototype.create.call(this),this.$viewer=$('<div id="viewer"></div>'),this.$content.prepend(this.$viewer),$.subscribe(i.SETTINGS_CHANGED,function(e,i){t.viewer.gestureSettingsMouse.clickToZoom=i.clickToZoomEnabled}),$.subscribe(i.OPEN_EXTERNAL_RESOURCE,function(e,i){t.whenResized(function(){t.isCreated||t.createUI(),t.openMedia(i)})}),$.subscribe(s.CLEAR_SEARCH,function(){t.whenCreated(function(){t.extension.currentSearchResultRect=null,t.clearSearchResults()})}),$.subscribe(s.VIEW_PAGE,function(){t.extension.previousSearchResultRect=null,t.extension.currentSearchResultRect=null}),$.subscribe(s.NEXT_SEARCH_RESULT,function(){t.whenCreated(function(){t.nextSearchResult()})}),$.subscribe(s.PREV_SEARCH_RESULT,function(){t.whenCreated(function(){t.prevSearchResult()})}),$.subscribe(s.ZOOM_IN,function(){t.whenCreated(function(){t.zoomIn()})}),$.subscribe(s.ZOOM_OUT,function(){t.whenCreated(function(){t.zoomOut()})}),$.subscribe(s.ROTATE,function(){t.whenCreated(function(){t.rotateRight()})}),$.subscribe(i.METRIC_CHANGED,function(){t.whenCreated(function(){t.updateResponsiveView()})})},t.prototype.whenResized=function(e){var t=this;Utils.Async.waitFor(function(){return t.isResized},e)},t.prototype.whenCreated=function(e){var t=this;Utils.Async.waitFor(function(){return t.isCreated},e)},t.prototype.zoomIn=function(){this.viewer.viewport.zoomTo(2*this.viewer.viewport.getZoom(!0))},t.prototype.zoomOut=function(){this.viewer.viewport.zoomTo(.5*this.viewer.viewport.getZoom(!0))},t.prototype.rotateRight=function(){this.viewer.viewport.setRotation(this.viewer.viewport.getRotation()+90)},t.prototype.updateResponsiveView=function(){this.setNavigatorVisible(),this.extension.metric.toString()===r.MetricType.MOBILELANDSCAPE.toString()?(this.viewer.autoHideControls=!1,this.$viewportNavButtons.hide()):(this.viewer.autoHideControls=!0,this.$viewportNavButtons.show())},t.prototype.createUI=function(){var e=this;this.$spinner=$('<div class="spinner"></div>'),this.$content.append(this.$spinner),this.updateAttribution();var t=window.DEBUG?"modules/uv-seadragoncenterpanel-module/img/":"themes/"+this.extension.config.options.theme+"/img/uv-seadragoncenterpanel-module/";window.openSeadragonViewer=this.viewer=OpenSeadragon({id:"viewer",ajaxWithCredentials:!1,showNavigationControl:!0,showNavigator:!0,showRotationControl:!0,showHomeControl:Utils.Bools.getBool(this.config.options.showHomeControl,!1),showFullPageControl:!1,defaultZoomLevel:this.config.options.defaultZoomLevel||0,maxZoomPixelRatio:this.config.options.maxZoomPixelRatio||2,controlsFadeDelay:this.config.options.controlsFadeDelay||250,controlsFadeLength:this.config.options.controlsFadeLength||250,navigatorPosition:this.config.options.navigatorPosition||"BOTTOM_RIGHT",animationTime:this.config.options.animationTime||1.2,visibilityRatio:this.config.options.visibilityRatio||.5,constrainDuringPan:Utils.Bools.getBool(this.config.options.constrainDuringPan,!1),immediateRender:Utils.Bools.getBool(this.config.options.immediateRender,!1),blendTime:this.config.options.blendTime||0,autoHideControls:Utils.Bools.getBool(this.config.options.autoHideControls,!0),prefixUrl:t,gestureSettingsMouse:{clickToZoom:!!this.extension.config.options.clickToZoomEnabled},navImages:{zoomIn:{REST:"zoom_in.png",GROUP:"zoom_in.png",HOVER:"zoom_in.png",DOWN:"zoom_in.png"},zoomOut:{REST:"zoom_out.png",GROUP:"zoom_out.png",HOVER:"zoom_out.png",DOWN:"zoom_out.png"},home:{REST:"home.png",GROUP:"home.png",HOVER:"home.png",DOWN:"home.png"},rotateright:{REST:"rotate_right.png",GROUP:"rotate_right.png",HOVER:"rotate_right.png",DOWN:"rotate_right.png"},rotateleft:{REST:"pixel.gif",GROUP:"pixel.gif",HOVER:"pixel.gif",DOWN:"pixel.gif"},next:{REST:"pixel.gif",GROUP:"pixel.gif",HOVER:"pixel.gif",DOWN:"pixel.gif"},previous:{REST:"pixel.gif",GROUP:"pixel.gif",HOVER:"pixel.gif",DOWN:"pixel.gif"}}}),this.$zoomInButton=this.$viewer.find('div[title="Zoom in"]'),this.$zoomInButton.attr("tabindex",0),this.$zoomInButton.prop("title",this.content.zoomIn),this.$zoomInButton.addClass("zoomIn viewportNavButton"),this.$zoomOutButton=this.$viewer.find('div[title="Zoom out"]'),this.$zoomOutButton.attr("tabindex",0),this.$zoomOutButton.prop("title",this.content.zoomOut),this.$zoomOutButton.addClass("zoomOut viewportNavButton"),this.$goHomeButton=this.$viewer.find('div[title="Go home"]'),this.$goHomeButton.attr("tabindex",0),this.$goHomeButton.prop("title",this.content.goHome),this.$goHomeButton.addClass("goHome viewportNavButton"),this.$rotateButton=this.$viewer.find('div[title="Rotate right"]'),this.$rotateButton.attr("tabindex",0),this.$rotateButton.prop("title",this.content.rotateRight),this.$rotateButton.addClass("rotate viewportNavButton"),this.$viewportNavButtonsContainer=this.$viewer.find(".openseadragon-container > div:not(.openseadragon-canvas):first"),this.$viewportNavButtons=this.$viewportNavButtonsContainer.find(".viewportNavButton"),this.$canvas=$(this.viewer.canvas),window.DEBUG||this.$canvas.on("contextmenu",function(e){return!1}),this.$navigator=this.$viewer.find(".navigator"),this.setNavigatorVisible(),this.$element.on("mousemove",function(t){e.controlsVisible||(e.controlsVisible=!0,e.viewer.setControlsEnabled(!0))}),this.$element.on("mouseleave",function(t){e.controlsVisible&&(e.controlsVisible=!1,e.viewer.setControlsEnabled(!1))}),this.$element.on("mousemove",function(t){if(!e.$viewer.find(".navigator").ismouseover()){if(!e.controlsVisible)return;e.controlsVisible=!1,e.viewer.setControlsEnabled(!1)}},this.config.options.controlsFadeAfterInactive),this.viewer.addHandler("tile-drawn",function(){e.$spinner.hide()}),this.viewer.addHandler("resize",function(t){$.publish(s.SEADRAGON_RESIZE,[t]),e.viewerResize(t)}),this.viewer.addHandler("animation-start",function(e){$.publish(s.SEADRAGON_ANIMATION_START,[e])}),this.viewer.addHandler("animation",function(e){$.publish(s.SEADRAGON_ANIMATION,[e])}),this.viewer.addHandler("animation-finish",function(t){e.currentBounds=e.getViewportBounds(),e.updateVisibleSearchResultRects(),$.publish(s.SEADRAGON_ANIMATION_FINISH,[t])}),this.viewer.addHandler("rotate",function(e){$.publish(s.SEADRAGON_ROTATION,[e.degrees])}),this.title=this.extension.helper.getLabel(),this.createNavigationButtons(),this.hidePrevButton(),this.hideNextButton(),this.isCreated=!0,this.resize()},t.prototype.createNavigationButtons=function(){var e=this.extension.helper.getViewingDirection();switch(this.$prevButton=$('<div class="paging btn prev" tabindex="0"></div>'),this.$prevButton.prop("title",this.content.previous),this.$nextButton=$('<div class="paging btn next" tabindex="0"></div>'),this.$nextButton.prop("title",this.content.next),this.viewer.addControl(this.$prevButton[0],{anchor:OpenSeadragon.ControlAnchor.TOP_LEFT}),this.viewer.addControl(this.$nextButton[0],{anchor:OpenSeadragon.ControlAnchor.TOP_RIGHT}),e.toString()){case manifesto.ViewingDirection.bottomToTop().toString():case manifesto.ViewingDirection.topToBottom().toString():this.$prevButton.addClass("vertical"),this.$nextButton.addClass("vertical")}var t=this;this.$prevButton.onPressed(function(i){if(i.preventDefault(),OpenSeadragon.cancelEvent(i),t.prevButtonEnabled)switch(e.toString()){case manifesto.ViewingDirection.leftToRight().toString():case manifesto.ViewingDirection.bottomToTop().toString():case manifesto.ViewingDirection.topToBottom().toString():$.publish(s.PREV);break;case manifesto.ViewingDirection.rightToLeft().toString():$.publish(s.NEXT)}}),this.$nextButton.onPressed(function(i){if(i.preventDefault(),OpenSeadragon.cancelEvent(i),t.nextButtonEnabled)switch(e.toString()){case manifesto.ViewingDirection.leftToRight().toString():case manifesto.ViewingDirection.bottomToTop().toString():case manifesto.ViewingDirection.topToBottom().toString():$.publish(s.NEXT);break;case manifesto.ViewingDirection.rightToLeft().toString():$.publish(s.PREV)}})},t.prototype.openMedia=function(e){var t=this;this.$spinner.show(),this.items=[],this.extension.getExternalResources(e).then(function(e){t.viewer.close(),e=t.getPagePositions(e);for(var i=0;i<e.length;i++){var n=e[i];t.viewer.addTiledImage({tileSource:n,x:n.x,y:n.y,width:n.width,success:function(i){t.items.push(i),t.items.length===e.length&&t.openPagesHandler(),t.resize()}})}})},t.prototype.getPagePositions=function(e){var t,i,n,o,s,r;if(e.length>1)if(2===e.length)this.extension.helper.isVerticallyAligned()?(n=e[0],n.y=0,o=e[1],o.y=n.height+this.config.options.pageGap):(t=e[0],t.x=0,i=e[1],i.x=t.width+this.config.options.pageGap);else if(this.extension.helper.isVerticallyAligned())if(this.extension.helper.isTopToBottom())for(var a=0;a<e.length-1;a++)s=e[a],r=e[a+1],r.y=(s.y||0)+s.height;else for(var a=e.length;a>0;a--)s=e[a],r=e[a-1],r.y=(s.y||0)-s.height;else if(this.extension.helper.isLeftToRight())for(var a=0;a<e.length-1;a++)s=e[a],r=e[a+1],r.x=(s.x||0)+s.width;else for(var a=e.length-1;a>0;a--)s=e[a],r=e[a-1],r.x=(s.x||0)-s.width;return e},t.prototype.openPagesHandler=function(){if($.publish(s.SEADRAGON_OPEN),this.extension.helper.isMultiCanvas()&&!this.extension.helper.isContinuous()){this.showPrevButton(),this.showNextButton(),$(".navigator").addClass("extraMargin");var e=this.extension.helper.getViewingDirection();e.toString()===manifesto.ViewingDirection.rightToLeft().toString()?(this.extension.helper.isFirstCanvas()?this.disableNextButton():this.enableNextButton(),this.extension.helper.isLastCanvas()?this.disablePrevButton():this.enablePrevButton()):(this.extension.helper.isFirstCanvas()?this.disablePrevButton():this.enablePrevButton(),this.extension.helper.isLastCanvas()?this.disableNextButton():this.enableNextButton())}this.setNavigatorVisible(),this.overlaySearchResults(),this.updateBounds();var t=this.getInitialSearchResultRect();this.extension.previousSearchResultRect=null,this.extension.currentSearchResultRect=null,t&&this.isZoomToSearchResultEnabled()&&this.zoomToSearchResult(t),this.isFirstLoad=!1},t.prototype.updateBounds=function(){var e=this.extension.getSettings();this.isFirstLoad?(this.initialRotation=this.extension.getParam(a.rotation),this.initialRotation&&this.viewer.viewport.setRotation(parseInt(this.initialRotation)),this.initialBounds=this.extension.getParam(a.xywh),this.initialBounds&&(this.initialBounds=n.fromString(this.initialBounds),this.currentBounds=this.initialBounds,this.fitToBounds(this.currentBounds))):e.preserveViewport?this.fitToBounds(this.currentBounds):this.goHome()},t.prototype.goHome=function(){this.viewer.viewport.goHome(!0)},t.prototype.disablePrevButton=function(){this.prevButtonEnabled=!1,this.$prevButton.addClass("disabled")},t.prototype.enablePrevButton=function(){this.prevButtonEnabled=!0,this.$prevButton.removeClass("disabled")},t.prototype.hidePrevButton=function(){this.disablePrevButton(),this.$prevButton.hide()},t.prototype.showPrevButton=function(){this.enablePrevButton(),this.$prevButton.show()},t.prototype.disableNextButton=function(){this.nextButtonEnabled=!1,this.$nextButton.addClass("disabled")},t.prototype.enableNextButton=function(){this.nextButtonEnabled=!0,this.$nextButton.removeClass("disabled")},t.prototype.hideNextButton=function(){this.disableNextButton(),this.$nextButton.hide()},t.prototype.showNextButton=function(){this.enableNextButton(),this.$nextButton.show()},t.prototype.serialiseBounds=function(e){return e.x+","+e.y+","+e.width+","+e.height},t.prototype.fitToBounds=function(e,t){void 0===t&&(t=!0);var i=new OpenSeadragon.Rect;i.x=Number(e.x),i.y=Number(e.y),i.width=Number(e.w),i.height=Number(e.h),this.viewer.viewport.fitBoundsWithConstraints(i,t)},t.prototype.getCroppedImageBounds=function(){if(!this.viewer||!this.viewer.viewport)return null;var e=this.extension.helper.getCurrentCanvas(),t=this.extension.getCroppedImageDimensions(e,this.viewer),i=new n(t.regionPos.x,t.regionPos.y,t.region.width,t.region.height);return i.toString()},t.prototype.getViewportBounds=function(){if(!this.viewer||!this.viewer.viewport)return null;var e=this.viewer.viewport.getBounds(!0),t=new n(Math.floor(e.x),Math.floor(e.y),Math.floor(e.width),Math.floor(e.height));return t},t.prototype.viewerResize=function(e){if(e.viewport){var t=e.viewport.getCenter(!0);t&&setTimeout(function(){e.viewport.panTo(t,!0)},1)}},t.prototype.clearSearchResults=function(){this.$canvas.find(".searchOverlay").hide()},t.prototype.overlaySearchResults=function(){for(var e=this.getSearchResultsForCurrentImages(),t=0;t<e.length;t++)for(var i=e[t],n=this.getSearchOverlayRects(i),o=0;o<n.length;o++){var s=n[o],r=document.createElement("div");r.id="searchResult-"+s.canvasIndex+"-"+s.resultIndex,r.className="searchOverlay",r.title=this.extension.sanitize(s.chars),this.viewer.addOverlay(r,s)}},t.prototype.getSearchResultsForCurrentImages=function(){var e=[],t=this.extension.searchResults;if(!t.length)return e;for(var i=this.extension.getPagedIndices(),n=0;n<i.length;n++)for(var o=i[n],s=0;s<t.length;s++)if(t[s].canvasIndex===o){e.push(t[s]);break}return e},t.prototype.getSearchResultRectsForCurrentImages=function(){var e=this.getSearchResultsForCurrentImages();return e.en().selectMany(function(e){return e.rects}).toArray()},t.prototype.updateVisibleSearchResultRects=function(){for(var e=this.getSearchResultRectsForCurrentImages(),t=0;t<e.length;t++){var i=e[t],n=this.viewer.viewport.getBounds();i.isVisible=Utils.Measurements.Dimensions.hitRect(n.x,n.y,n.width,n.height,i.viewportX,i.viewportY)}},t.prototype.getSearchResultRectIndex=function(e){var t=this.getSearchResultRectsForCurrentImages();return t.indexOf(e)},t.prototype.isZoomToSearchResultEnabled=function(){return Utils.Bools.getBool(this.extension.config.options.zoomToSearchResultEnabled,!0)},t.prototype.nextSearchResult=function(){for(var e,t=this.getSearchResultRectsForCurrentImages(),i=this.getSearchResultRectIndex(this.extension.currentSearchResultRect),n=i+1;n<t.length;n++){var o=t[n];e=o;break}e&&this.isZoomToSearchResultEnabled()?o.canvasIndex>this.extension.helper.canvasIndex?(this.extension.currentSearchResultRect=o,$.publish(s.SEARCH_RESULT_CANVAS_CHANGED,[o])):this.zoomToSearchResult(o):$.publish(s.NEXT_IMAGES_SEARCH_RESULT_UNAVAILABLE)},t.prototype.prevSearchResult=function(){for(var e,t=this.getSearchResultRectsForCurrentImages(),i=this.getSearchResultRectIndex(this.extension.currentSearchResultRect),n=i-1;n>=0;n--){var o=t[n];e=o;break}e&&this.isZoomToSearchResultEnabled()?o.canvasIndex<this.extension.helper.canvasIndex?(this.extension.currentSearchResultRect=o,$.publish(s.SEARCH_RESULT_CANVAS_CHANGED,[o])):this.zoomToSearchResult(o):$.publish(s.PREV_IMAGES_SEARCH_RESULT_UNAVAILABLE)},t.prototype.getSearchResultRectByIndex=function(e){var t=this.getSearchResultRectsForCurrentImages();return t.length?t[e]:null},t.prototype.getInitialSearchResultRect=function(){var e=this,t=this.getSearchResultRectsForCurrentImages();return t.length?this.extension.previousSearchResultRect&&this.extension.previousSearchResultRect.canvasIndex>this.extension.helper.canvasIndex?t.en().where(function(t){return t.canvasIndex===e.extension.helper.canvasIndex}).last():t.en().where(function(t){return t.canvasIndex===e.extension.helper.canvasIndex}).first():null},t.prototype.zoomToSearchResult=function(e){this.extension.previousSearchResultRect=this.extension.currentSearchResultRect||e,this.extension.currentSearchResultRect=e,this.fitToBounds(new n(e.viewportX,e.viewportY,e.width,e.height),!1),this.highlightSearchResultRect(e),$.publish(s.SEARCH_RESULT_RECT_CHANGED)},t.prototype.highlightSearchResultRect=function(e){var t=$("#searchResult-"+e.canvasIndex+"-"+e.index);t.addClass("current"),$(".searchOverlay").not(t).removeClass("current")},t.prototype.getSearchOverlayRects=function(e){var t=[],i=this.extension.resources.en().where(function(t){return t.index===e.canvasIndex}).first(),n=this.extension.resources.indexOf(i),o=(this.extension.resources[n].width,0);n>0&&(o=this.extension.resources[n-1].width);for(var s=0;s<e.rects.length;s++){var r=e.rects[s],a=r.x+o+(n>0?this.config.options.pageGap:0),l=r.y,h=r.width,c=r.height,u=new OpenSeadragon.Rect(a,l,h,c);r.viewportX=a,r.viewportY=l,u.canvasIndex=r.canvasIndex,u.resultIndex=r.index,u.chars=r.chars,t.push(u)}return t},t.prototype.resize=function(){var t=this;if(e.prototype.resize.call(this),this.$viewer.height(this.$content.height()-this.$viewer.verticalMargins()),this.$viewer.width(this.$content.width()-this.$viewer.horizontalMargins()),this.isCreated){this.$title.ellipsisFill(this.extension.sanitize(this.title)),this.$spinner.css("top",this.$content.height()/2-this.$spinner.height()/2),this.$spinner.css("left",this.$content.width()/2-this.$spinner.width()/2);var i=this.extension.helper.getViewingDirection();if(this.extension.helper.isMultiCanvas()&&this.$prevButton&&this.$nextButton){var n=Math.floor(this.$content.width()/2);switch(i.toString()){case manifesto.ViewingDirection.bottomToTop().toString():this.$prevButton.addClass("down"),this.$nextButton.addClass("up"),this.$prevButton.css("left",n-this.$prevButton.outerWidth()/2),this.$prevButton.css("top",this.$content.height()-this.$prevButton.height()),this.$nextButton.css("left",-1*n-this.$nextButton.outerWidth()/2);break;case manifesto.ViewingDirection.topToBottom().toString():this.$prevButton.css("left",n-this.$prevButton.outerWidth()/2),this.$nextButton.css("left",-1*n-this.$nextButton.outerWidth()/2),this.$nextButton.css("top",this.$content.height()-this.$nextButton.height());break;default:this.$prevButton.css("top",(this.$content.height()-this.$prevButton.height())/2),this.$nextButton.css("top",(this.$content.height()-this.$nextButton.height())/2)}}setTimeout(function(){if(t.extension.helper.isContinuous())if(t.extension.helper.isHorizontallyAligned()){var e=t.$viewer.width()-t.$viewer.rightMargin();t.$navigator.width(e)}else t.$navigator.height(t.$viewer.height())},100)}},t.prototype.setFocus=function(){this.$canvas.is(":focus")||this.extension.config.options.allowStealFocus&&this.$canvas.focus()},t.prototype.setNavigatorVisible=function(){var e=Utils.Bools.getBool(this.extension.getSettings().navigatorEnabled,!0)&&this.extension.metric.toString()!==r.MetricType.MOBILELANDSCAPE.toString();this.viewer.navigator.setVisible(e),e?this.$navigator.show():this.$navigator.hide()},t}(o);return l});var __extends=this&&this.__extends||function(e,t){function i(){
+this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-seadragon-extension/SettingsDialogue",["require","exports","../../modules/uv-dialogues-module/SettingsDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("settingsDialogue"),e.prototype.create.call(this),this.$navigatorEnabled=$('<div class="setting navigatorEnabled"></div>'),this.$scroll.append(this.$navigatorEnabled),this.$navigatorEnabledCheckbox=$('<input id="navigatorEnabled" type="checkbox" tabindex="0" />'),this.$navigatorEnabled.append(this.$navigatorEnabledCheckbox),this.$navigatorEnabledLabel=$('<label for="navigatorEnabled">'+this.content.navigatorEnabled+"</label>"),this.$navigatorEnabled.append(this.$navigatorEnabledLabel),this.$pagingEnabled=$('<div class="setting pagingEnabled"></div>'),this.$scroll.append(this.$pagingEnabled),this.$pagingEnabledCheckbox=$('<input id="pagingEnabled" type="checkbox" tabindex="0" />'),this.$pagingEnabled.append(this.$pagingEnabledCheckbox),this.$pagingEnabledLabel=$('<label for="pagingEnabled">'+this.content.pagingEnabled+"</label>"),this.$pagingEnabled.append(this.$pagingEnabledLabel),this.$clickToZoomEnabled=$('<div class="setting clickToZoom"></div>'),this.$scroll.append(this.$clickToZoomEnabled),this.$clickToZoomEnabledCheckbox=$('<input id="clickToZoomEnabled" type="checkbox" />'),this.$clickToZoomEnabled.append(this.$clickToZoomEnabledCheckbox),this.$clickToZoomEnabledLabel=$('<label for="clickToZoomEnabled">'+this.content.clickToZoomEnabled+"</label>"),this.$clickToZoomEnabled.append(this.$clickToZoomEnabledLabel),this.$preserveViewport=$('<div class="setting preserveViewport"></div>'),this.$scroll.append(this.$preserveViewport),this.$preserveViewportCheckbox=$('<input id="preserveViewport" type="checkbox" tabindex="0" />'),this.$preserveViewport.append(this.$preserveViewportCheckbox),this.$preserveViewportLabel=$('<label for="preserveViewport">'+this.content.preserveViewport+"</label>"),this.$preserveViewport.append(this.$preserveViewportLabel),this.$navigatorEnabledCheckbox.change(function(){var e={};t.$navigatorEnabledCheckbox.is(":checked")?e.navigatorEnabled=!0:e.navigatorEnabled=!1,t.updateSettings(e)}),this.$clickToZoomEnabledCheckbox.change(function(){var e={};t.$clickToZoomEnabledCheckbox.is(":checked")?e.clickToZoomEnabled=!0:e.clickToZoomEnabled=!1,t.updateSettings(e)}),this.$pagingEnabledCheckbox.change(function(){var e={};t.$pagingEnabledCheckbox.is(":checked")?e.pagingEnabled=!0:e.pagingEnabled=!1,t.updateSettings(e)}),this.$preserveViewportCheckbox.change(function(){var e={};t.$preserveViewportCheckbox.is(":checked")?e.preserveViewport=!0:e.preserveViewport=!1,t.updateSettings(e)})},t.prototype.open=function(){e.prototype.open.call(this);var t=this.getSettings();t.navigatorEnabled?this.$navigatorEnabledCheckbox.prop("checked",!0):this.$navigatorEnabledCheckbox.removeAttr("checked"),t.clickToZoomEnabled?this.$clickToZoomEnabledCheckbox.prop("checked",!0):this.$clickToZoomEnabledCheckbox.removeAttr("checked"),this.extension.helper.isPagingAvailable()?t.pagingEnabled?this.$pagingEnabledCheckbox.prop("checked",!0):this.$pagingEnabledCheckbox.removeAttr("checked"):this.$pagingEnabled.hide(),t.preserveViewport?this.$preserveViewportCheckbox.prop("checked",!0):this.$preserveViewportCheckbox.removeAttr("checked")},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-seadragon-extension/ShareDialogue",["require","exports","../../modules/uv-dialogues-module/ShareDialogue","./Commands"],function(e,t,i,n){var o=function(e){function t(t){var i=this;e.call(this,t),$.subscribe(n.SEADRAGON_OPEN,function(){i.update()}),$.subscribe(n.SEADRAGON_ANIMATION_FINISH,function(){i.update()})}return __extends(t,e),t.prototype.create=function(){this.setConfig("shareDialogue"),e.prototype.create.call(this)},t.prototype.update=function(){e.prototype.update.call(this);var t=this.extension.getViewportBounds(),i=this.extension.getViewerRotation();this.code=this.extension.getEmbedScript(this.options.embedTemplate,this.currentWidth,this.currentHeight,t,i),this.$code.val(this.code)},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(i);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-seadragon-extension/Extension",["require","exports","../../modules/uv-shared-module/BaseCommands","../../modules/uv-shared-module/BaseExtension","../../modules/uv-shared-module/Bookmark","./Commands","../../modules/uv-contentleftpanel-module/ContentLeftPanel","./CroppedImageDimensions","./DownloadDialogue","../../modules/uv-dialogues-module/ExternalContentDialogue","../../modules/uv-searchfooterpanel-module/FooterPanel","../../modules/uv-dialogues-module/HelpDialogue","../../modules/uv-shared-module/MetricType","../../modules/uv-osdmobilefooterpanel-module/MobileFooter","./Mode","../../modules/uv-dialogues-module/MoreInfoDialogue","../../modules/uv-moreinforightpanel-module/MoreInfoRightPanel","../../modules/uv-multiselectdialogue-module/MultiSelectDialogue","./MultiSelectionArgs","../../modules/uv-pagingheaderpanel-module/PagingHeaderPanel","../../Params","../../modules/uv-shared-module/Point","../../modules/uv-seadragoncenterpanel-module/SeadragonCenterPanel","./SettingsDialogue","./ShareDialogue","../../modules/uv-shared-module/Shell"],function(e,t,i,n,o,s,r,a,l,h,c,u,p,d,g,f,m,v,b,E,x,y,w,S,C,R){var T=Manifold.SearchResult,I=Utils.Measurements.Size,D=function(e){function t(t){e.call(this,t),this.currentRotation=0,this.isSearching=!1,this.searchResults=[]}return __extends(t,e),t.prototype.create=function(t){var n=this;e.prototype.create.call(this,t);$.subscribe(i.METRIC_CHANGED,function(){if(n.metric.toString()===p.MetricType.MOBILELANDSCAPE.toString()){var e={};e.pagingEnabled=!1,n.updateSettings(e),$.publish(i.UPDATE_SETTINGS),R.$rightPanel.hide()}else R.$rightPanel.show()}),$.subscribe(s.CLEAR_SEARCH,function(e){n.searchResults=null,$.publish(s.SEARCH_RESULTS_CLEARED),n.triggerSocket(s.CLEAR_SEARCH)}),$.subscribe(i.DOWN_ARROW,function(e){n.useArrowKeysToNavigate()||n.centerPanel.setFocus()}),$.subscribe(i.END,function(e){n.viewPage(n.helper.getLastPageIndex())}),$.subscribe(s.FIRST,function(e){n.triggerSocket(s.FIRST),n.viewPage(n.helper.getFirstPageIndex())}),$.subscribe(s.GALLERY_DECREASE_SIZE,function(e){n.triggerSocket(s.GALLERY_DECREASE_SIZE)}),$.subscribe(s.GALLERY_INCREASE_SIZE,function(e){n.triggerSocket(s.GALLERY_INCREASE_SIZE)}),$.subscribe(s.GALLERY_THUMB_SELECTED,function(e){n.triggerSocket(s.GALLERY_THUMB_SELECTED)}),$.subscribe(i.HOME,function(e){n.viewPage(n.helper.getFirstPageIndex())}),$.subscribe(s.IMAGE_SEARCH,function(e,t){n.triggerSocket(s.IMAGE_SEARCH,t),n.viewPage(t)}),$.subscribe(s.LAST,function(e){n.triggerSocket(s.LAST),n.viewPage(n.helper.getLastPageIndex())}),$.subscribe(i.LEFT_ARROW,function(e){n.useArrowKeysToNavigate()?n.viewPage(n.getPrevPageIndex()):n.centerPanel.setFocus()}),$.subscribe(i.LEFTPANEL_COLLAPSE_FULL_START,function(e){n.metric.toString()!==p.MetricType.MOBILELANDSCAPE.toString()&&R.$rightPanel.show()}),$.subscribe(i.LEFTPANEL_COLLAPSE_FULL_FINISH,function(e){R.$centerPanel.show(),n.resize()}),$.subscribe(i.LEFTPANEL_EXPAND_FULL_START,function(e){R.$centerPanel.hide(),R.$rightPanel.hide()}),$.subscribe(i.MINUS,function(e){n.centerPanel.setFocus()}),$.subscribe(s.MODE_CHANGED,function(e,t){n.triggerSocket(s.MODE_CHANGED,t),n.mode=new g(t);var o=n.getSettings();$.publish(i.SETTINGS_CHANGED,[o])}),$.subscribe(s.MULTISELECTION_MADE,function(e,t){var i=new b;i.manifestUri=n.helper.iiifResourceUri,i.allCanvases=t.length===n.helper.getCanvases().length,i.canvases=t,i.format=n.config.options.multiSelectionMimeType,i.sequence=n.helper.getCurrentSequence().id,n.triggerSocket(s.MULTISELECTION_MADE,i)}),$.subscribe(s.NEXT,function(e){n.triggerSocket(s.NEXT),n.viewPage(n.getNextPageIndex())}),$.subscribe(s.NEXT_SEARCH_RESULT,function(){n.triggerSocket(s.NEXT_SEARCH_RESULT)}),$.subscribe(s.NEXT_IMAGES_SEARCH_RESULT_UNAVAILABLE,function(){n.triggerSocket(s.NEXT_IMAGES_SEARCH_RESULT_UNAVAILABLE),n.nextSearchResult()}),$.subscribe(s.PREV_IMAGES_SEARCH_RESULT_UNAVAILABLE,function(){n.triggerSocket(s.PREV_IMAGES_SEARCH_RESULT_UNAVAILABLE),n.prevSearchResult()}),$.subscribe(s.OPEN_THUMBS_VIEW,function(e){n.triggerSocket(s.OPEN_THUMBS_VIEW)}),$.subscribe(s.OPEN_TREE_VIEW,function(e){n.triggerSocket(s.OPEN_TREE_VIEW)}),$.subscribe(i.PAGE_DOWN,function(e){n.viewPage(n.getNextPageIndex())}),$.subscribe(s.PAGE_SEARCH,function(e,t){n.triggerSocket(s.PAGE_SEARCH,t),n.viewLabel(t)}),$.subscribe(i.PAGE_UP,function(e){n.viewPage(n.getPrevPageIndex())}),$.subscribe(s.PAGING_TOGGLED,function(e,t){n.triggerSocket(s.PAGING_TOGGLED,t)}),$.subscribe(i.PLUS,function(e){n.centerPanel.setFocus()}),$.subscribe(s.PREV,function(e){n.triggerSocket(s.PREV),n.viewPage(n.getPrevPageIndex())}),$.subscribe(s.PREV_SEARCH_RESULT,function(){n.triggerSocket(s.PREV_SEARCH_RESULT)}),$.subscribe(s.PRINT,function(){n.print()}),$.subscribe(i.RIGHT_ARROW,function(e){n.useArrowKeysToNavigate()?n.viewPage(n.getNextPageIndex()):n.centerPanel.setFocus()}),$.subscribe(s.SEADRAGON_ANIMATION,function(){n.triggerSocket(s.SEADRAGON_ANIMATION)}),$.subscribe(s.SEADRAGON_ANIMATION_FINISH,function(e,t){n.centerPanel&&n.centerPanel.currentBounds&&n.setParam(x.xywh,n.centerPanel.getViewportBounds().toString());var i=n.helper.getCurrentCanvas();n.triggerSocket(s.CURRENT_VIEW_URI,{cropUri:n.getCroppedImageUri(i,n.getViewer()),fullUri:n.getConfinedImageUri(i,i.getWidth())})}),$.subscribe(s.SEADRAGON_ANIMATION_START,function(){n.triggerSocket(s.SEADRAGON_ANIMATION_START)}),$.subscribe(s.SEADRAGON_OPEN,function(){n.useArrowKeysToNavigate()||n.centerPanel.setFocus()}),$.subscribe(s.SEADRAGON_RESIZE,function(){n.triggerSocket(s.SEADRAGON_RESIZE)}),$.subscribe(s.SEADRAGON_ROTATION,function(e,t){n.triggerSocket(s.SEADRAGON_ROTATION),n.currentRotation=t,n.setParam(x.rotation,t)}),$.subscribe(s.SEARCH,function(e,t){n.triggerSocket(s.SEARCH,t),n.searchWithin(t)}),$.subscribe(s.SEARCH_PREVIEW_FINISH,function(e){n.triggerSocket(s.SEARCH_PREVIEW_FINISH)}),$.subscribe(s.SEARCH_PREVIEW_START,function(e){n.triggerSocket(s.SEARCH_PREVIEW_START)}),$.subscribe(s.SEARCH_RESULTS,function(e,t){n.triggerSocket(s.SEARCH_RESULTS,t)}),$.subscribe(s.SEARCH_RESULT_CANVAS_CHANGED,function(e,t){n.viewPage(t.canvasIndex)}),$.subscribe(s.SEARCH_RESULTS_EMPTY,function(e){n.triggerSocket(s.SEARCH_RESULTS_EMPTY)}),$.subscribe(i.THUMB_SELECTED,function(e,t){n.viewPage(t.index)}),$.subscribe(s.TREE_NODE_SELECTED,function(e,t){n.triggerSocket(s.TREE_NODE_SELECTED,t.data.path),n.treeNodeSelected(t)}),$.subscribe(i.UP_ARROW,function(e){n.useArrowKeysToNavigate()||n.centerPanel.setFocus()}),$.subscribe(i.UPDATE_SETTINGS,function(e){n.viewPage(n.helper.canvasIndex,!0);var t=n.getSettings();$.publish(i.SETTINGS_CHANGED,[t])}),$.subscribe(s.VIEW_PAGE,function(e,t){n.triggerSocket(s.VIEW_PAGE,t),n.viewPage(t)}),Utils.Async.waitFor(function(){return n.centerPanel&&n.centerPanel.isCreated},function(){n.checkForSearchParam(),n.checkForRotationParam()})},t.prototype.createModules=function(){e.prototype.createModules.call(this),this.isHeaderPanelEnabled()?this.headerPanel=new E(R.$headerPanel):R.$headerPanel.hide(),this.isLeftPanelEnabled()?this.leftPanel=new r(R.$leftPanel):R.$leftPanel.hide(),this.centerPanel=new w(R.$centerPanel),this.isRightPanelEnabled()?this.rightPanel=new m(R.$rightPanel):R.$rightPanel.hide(),this.isFooterPanelEnabled()?(this.footerPanel=new c(R.$footerPanel),this.mobileFooterPanel=new d(R.$mobileFooterPanel)):R.$footerPanel.hide(),this.$helpDialogue=$('<div class="overlay help"></div>'),R.$overlays.append(this.$helpDialogue),this.helpDialogue=new u(this.$helpDialogue),this.$moreInfoDialogue=$('<div class="overlay moreInfo"></div>'),R.$overlays.append(this.$moreInfoDialogue),this.moreInfoDialogue=new f(this.$moreInfoDialogue),this.$multiSelectDialogue=$('<div class="overlay multiSelect"></div>'),R.$overlays.append(this.$multiSelectDialogue),this.multiSelectDialogue=new v(this.$multiSelectDialogue),this.$shareDialogue=$('<div class="overlay share"></div>'),R.$overlays.append(this.$shareDialogue),this.shareDialogue=new C(this.$shareDialogue),this.$downloadDialogue=$('<div class="overlay download"></div>'),R.$overlays.append(this.$downloadDialogue),this.downloadDialogue=new l(this.$downloadDialogue),this.$settingsDialogue=$('<div class="overlay settings"></div>'),R.$overlays.append(this.$settingsDialogue),this.settingsDialogue=new S(this.$settingsDialogue),this.$externalContentDialogue=$('<div class="overlay externalContent"></div>'),R.$overlays.append(this.$externalContentDialogue),this.externalContentDialogue=new h(this.$externalContentDialogue),this.isHeaderPanelEnabled()&&this.headerPanel.init(),this.isLeftPanelEnabled()&&this.leftPanel.init(),this.isRightPanelEnabled()&&this.rightPanel.init(),this.isFooterPanelEnabled()&&this.footerPanel.init()},t.prototype.checkForSearchParam=function(){if(this.isDeepLinkingEnabled()){var e=this.getParam(x.highlight);e&&(e.replace(/\+/g," ").replace(/"/g,""),$.publish(s.SEARCH,[e]))}},t.prototype.checkForRotationParam=function(){if(this.isDeepLinkingEnabled()){var e=Number(this.getParam(x.rotation));e&&$.publish(s.SEADRAGON_ROTATION,[e])}},t.prototype.viewPage=function(e,t){if(-1!==e){if(this.helper.isCanvasIndexOutOfRange(e)&&(this.showMessage(this.config.content.canvasIndexOutOfRange),e=0),this.isPagingSettingEnabled()&&!t){var i=this.getPagedIndices(e);if(i.contains(this.helper.canvasIndex))return void this.viewCanvas(e)}this.viewCanvas(e)}},t.prototype.getViewer=function(){return this.centerPanel.viewer},t.prototype.getMode=function(){if(this.mode)return this.mode;switch(this.helper.getManifestType().toString()){case manifesto.ManifestType.monograph().toString():return g.page;case manifesto.ManifestType.manuscript().toString():return g.page;default:return g.image}},t.prototype.getViewportBounds=function(){if(!this.centerPanel)return null;var e=this.centerPanel.getViewportBounds();return e?e.toString():null},t.prototype.getViewerRotation=function(){return this.centerPanel?this.currentRotation:null},t.prototype.viewRange=function(e){var t=this.helper.getRangeByPath(e);if(t){var i=t.getCanvasIds()[0],n=this.helper.getCanvasIndexById(i);this.viewPage(n)}},t.prototype.viewLabel=function(e){if(!e)return this.showMessage(this.config.modules.genericDialogue.content.emptyValue),void $.publish(i.CANVAS_INDEX_CHANGE_FAILED);var t=this.helper.getCanvasIndexByLabel(e);-1!=t?this.viewPage(t):(this.showMessage(this.config.modules.genericDialogue.content.pageNotFound),$.publish(i.CANVAS_INDEX_CHANGE_FAILED))},t.prototype.treeNodeSelected=function(e){var t=e.data;if(t.type)switch(t.type){case manifesto.IIIFResourceType.manifest().toString():this.viewManifest(t);break;case manifesto.IIIFResourceType.collection().toString():this.viewCollection(t);break;default:this.viewRange(t.path)}},t.prototype.clearSearch=function(){this.searchResults=[],this.viewPage(this.helper.canvasIndex)},t.prototype.prevSearchResult=function(){for(var e,t=this.searchResults.length-1;t>=0;t--){var i=this.searchResults[t];if(i.canvasIndex<=this.getPrevPageIndex()){e=i,this.viewPage(e.canvasIndex);break}}},t.prototype.nextSearchResult=function(){for(var e,t=0;t<this.searchResults.length;t++){var i=this.searchResults[t];if(i.canvasIndex>=this.getNextPageIndex()){e=i,this.viewPage(i.canvasIndex);break}}},t.prototype.bookmark=function(){e.prototype.bookmark.call(this);var t=this.helper.getCurrentCanvas(),n=new o;n.index=this.helper.canvasIndex,n.label=Manifesto.TranslationCollection.getValue(t.getLabel()),n.path=this.getCroppedImageUri(t,this.getViewer()),n.thumb=t.getCanonicalImageUri(this.config.options.bookmarkThumbWidth),n.title=this.helper.getLabel(),n.trackingLabel=window.trackingLabel,n.type=manifesto.ElementType.image().toString(),this.triggerSocket(i.BOOKMARK,n)},t.prototype.print=function(){window.print(),this.triggerSocket(s.PRINT)},t.prototype.getCroppedImageDimensions=function(e,t){if(!t)return null;if(!t.viewport)return null;if(!e.getHeight()||!e.getWidth())return null;var i=t.viewport.getBounds(!0),n=new a,o=Math.floor(i.width),s=Math.floor(i.height),r=Math.floor(i.x),l=Math.floor(i.y);r+o>e.getWidth()?o=e.getWidth()-r:0>r&&(o+=r,r=0),l+s>e.getHeight()?s=e.getHeight()-l:0>l&&(s+=l,l=0),o=Math.min(o,e.getWidth()),s=Math.min(s,e.getHeight());var h=o,c=s;if(e.externalResource.data&&e.externalResource.data.profile&&e.externalResource.data.profile[1]){var u=new I(e.externalResource.data.profile[1].maxWidth,e.externalResource.data.profile[1].maxHeight);if(!_.isUndefined(u.width)&&!_.isUndefined(u.height)){if(o>u.width){var p=u.width;s=Math.round(p*(s/o)),o=p}if(s>u.height){var d=u.height;o=Math.round(o/s*d),s=d}}}return n.region=new I(h,c),n.regionPos=new y(r,l),n.size=new I(o,s),n},t.prototype.getCroppedImageUri=function(e,t){if(!t)return null;if(!t.viewport)return null;var i=this.getCroppedImageDimensions(e,t),n=this.getImageBaseUri(e),o=this.getImageId(e),s=i.regionPos.x+","+i.regionPos.y+","+i.region.width+","+i.region.height,r=i.size.width+","+i.size.height,a=this.getViewerRotation(),l="default";return n+"/"+o+"/"+s+"/"+r+"/"+a+"/"+l+".jpg"},t.prototype.getConfinedImageDimensions=function(e,t){var i=new I(0,0);i.width=t;var n=Math.normalise(t,0,e.getWidth());return i.height=Math.floor(e.getHeight()*n),i},t.prototype.getConfinedImageUri=function(e,t){var i=this.getImageBaseUri(e),n=this.getImageId(e),o="full",s=this.getConfinedImageDimensions(e,t),r=s.width+","+s.height,a=this.getViewerRotation(),l="default";return i+"/"+n+"/"+o+"/"+r+"/"+a+"/"+l+".jpg"},t.prototype.getImageId=function(e){var t=this.getInfoUri(e);return t=t.substr(0,t.lastIndexOf("/")),t.substr(t.lastIndexOf("/")+1)},t.prototype.getImageBaseUri=function(e){var t=this.getInfoUri(e);return t=t.substr(0,t.lastIndexOf("/")),t.substr(0,t.lastIndexOf("/"))},t.prototype.getInfoUri=function(e){var t,i=e.getImages();if(i&&i.length)for(var n=i[0],o=n.getResource(),s=o.getServices(),r=0;r<s.length;r++){var a=s[r],l=a.id;_.endsWith(l,"/")||(l+="/"),manifesto.Utils.isImageProfile(a.getProfile())&&(t=l+"info.json")}return t||(t=window.DEBUG?"/src/extensions/uv-seadragon-extension/lib/imageunavailable.json":"lib/imageunavailable.json"),t},t.prototype.getEmbedScript=function(e,t,i,n,o){var s=this.config.uri||"",r=String.format(e,this.getSerializedLocales(),s,this.helper.iiifResourceUri,this.helper.collectionIndex,this.helper.manifestIndex,this.helper.sequenceIndex,this.helper.canvasIndex,n,o,t,i,this.embedScriptUri);return r},t.prototype.getPrevPageIndex=function(e){_.isUndefined(e)&&(e=this.helper.canvasIndex);var t;if(this.isPagingSettingEnabled()){var i=this.getPagedIndices(e);t=this.helper.isRightToLeft()?i.last()-1:i[0]-1}else t=e-1;return t},t.prototype.isSearchWithinEnabled=function(){return Utils.Bools.getBool(this.config.options.searchWithinEnabled,!1)&&this.helper.getSearchWithinService()?!0:!1},t.prototype.isPagingSettingEnabled=function(){return this.helper.isPagingAvailable()?this.getSettings().pagingEnabled:!1},t.prototype.getNextPageIndex=function(e){_.isUndefined(e)&&(e=this.helper.canvasIndex);var t;if(this.isPagingSettingEnabled()){var i=this.getPagedIndices(e);t=this.helper.isRightToLeft()?i[0]+1:i.last()+1}else t=e+1;return t>this.helper.getTotalCanvases()-1?-1:t},t.prototype.getAutoCompleteService=function(){var e=this.helper.getSearchWithinService();return e?e.getService(manifesto.ServiceProfile.autoComplete()):null},t.prototype.getAutoCompleteUri=function(){var e=this.getAutoCompleteService();return e?e.id+"?q={0}":null},t.prototype.getSearchWithinServiceUri=function(){var e=this.helper.getSearchWithinService();if(!e)return null;var t=e.id;return t+="?q={0}"},t.prototype.searchWithin=function(e){var t=this;if(!this.isSearching){this.isSearching=!0,this.searchResults=[];var i=this,n=this.getSearchWithinServiceUri();n=String.format(n,e),this.getSearchResults(n,e,this.searchResults,function(n){t.isSearching=!1,n.length?(t.searchResults=n.sort(function(e,t){return e.canvasIndex-t.canvasIndex}),$.publish(s.SEARCH_RESULTS,[{terms:e,results:n}]),i.viewPage(i.helper.canvasIndex,!0)):i.showMessage(i.config.modules.genericDialogue.content.noMatches,function(){$.publish(s.SEARCH_RESULTS_EMPTY)})})}},t.prototype.getSearchResults=function(e,t,i,n){var o=this;$.getJSON(e,function(e){e.resources&&e.resources.length&&(i=i.concat(o.parseSearchJson(e,i))),e.next?o.getSearchResults(e.next,t,i,n):n(i)})},t.prototype.parseSearchJson=function(e,t){for(var i=[],n=0;n<e.resources.length;n++){var o=e.resources[n],s=this.helper.getCanvasIndexById(o.on.match(/(.*)#/)[1]),r=new T(o,s),a=i.en().where(function(e){return e.canvasIndex===r.canvasIndex}).first();a?a.addRect(o):i.push(r)}return i.sort(function(e,t){return e.canvasIndex-t.canvasIndex}),i},t.prototype.getSearchResultRects=function(){return this.searchResults.en().selectMany(function(e){return e.rects}).toArray()},t.prototype.getCurrentSearchResultRectIndex=function(){var e=this.getSearchResultRects();return e.indexOf(this.currentSearchResultRect)},t.prototype.getTotalSearchResultRects=function(){var e=this.getSearchResultRects();return e.length},t.prototype.isFirstSearchResultRect=function(){return 0===this.getCurrentSearchResultRectIndex()},t.prototype.getLastSearchResultRectIndex=function(){return this.getTotalSearchResultRects()-1},t.prototype.getPagedIndices=function(e){_.isUndefined(e)&&(e=this.helper.canvasIndex);var t=[];return this.helper.isContinuous()?t=_.map(this.helper.getCanvases(),function(e,t){return t}):this.isPagingSettingEnabled()?(t=this.helper.isFirstCanvas(e)||this.helper.isLastCanvas(e)&&this.helper.isTotalCanvasesEven()?[e]:e%2?[e,e+1]:[e-1,e],this.helper.isRightToLeft()&&(t=t.reverse())):t.push(this.helper.canvasIndex),t},t}(n);return D});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-virtex-extension/DownloadDialogue",["require","exports","../../modules/uv-dialogues-module/DownloadDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("downloadDialogue"),e.prototype.create.call(this)},t.prototype.open=function(t){e.prototype.open.call(this,t),this.addEntireFileDownloadOptions(),this.updateNoneAvailable(),this.resize()},t.prototype.isDownloadOptionAvailable=function(t){return e.prototype.isDownloadOptionAvailable.call(this,t)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-virtex-extension/ShareDialogue",["require","exports","../../modules/uv-dialogues-module/ShareDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("shareDialogue"),e.prototype.create.call(this)},t.prototype.update=function(){e.prototype.update.call(this),this.code=this.extension.getEmbedScript(this.options.embedTemplate,this.currentWidth,this.currentHeight),this.$code.val(this.code)},t.prototype.resize=function(){e.prototype.resize.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-virtex-extension/SettingsDialogue",["require","exports","../../modules/uv-dialogues-module/SettingsDialogue"],function(e,t,i){var n=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){this.setConfig("settingsDialogue"),e.prototype.create.call(this)},t}(i);return n});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("modules/uv-virtexcenterpanel-module/VirtexCenterPanel",["require","exports","../uv-shared-module/BaseCommands","../uv-shared-module/CenterPanel"],function(e,t,i,n){var o=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(){var t=this;this.setConfig("virtexCenterPanel"),e.prototype.create.call(this);var n=this;$.subscribe(i.OPEN_EXTERNAL_RESOURCE,function(e,t){n.openMedia(t)}),this.$navigation=$('<div class="navigation"></div>'),this.$content.prepend(this.$navigation),this.$zoomInButton=$('<a class="imageBtn zoomIn" title="'+this.content.zoomIn+'"></a>'),this.$navigation.append(this.$zoomInButton),this.$zoomOutButton=$('<a class="imageBtn zoomOut" title="'+this.content.zoomOut+'"></a>'),this.$navigation.append(this.$zoomOutButton),this.$viewport=$('<div class="virtex"></div>'),this.$content.prepend(this.$viewport),this.title=this.extension.helper.getLabel(),this.updateAttribution(),this.$zoomInButton.on("click",function(e){e.preventDefault(),t.viewport.zoomIn()}),this.$zoomOutButton.on("click",function(e){e.preventDefault(),t.viewport.zoomOut()})},t.prototype.openMedia=function(e){var t=this;this.extension.getExternalResources(e).then(function(){t.$viewport.empty();var e=t.extension.helper.getCurrentCanvas();t.viewport=virtex.create({element:"#content .virtex",object:e.id,showStats:t.options.showStats}),t.resize()})},t.prototype.resize=function(){e.prototype.resize.call(this),this.$title.ellipsisFill(this.title),this.$viewport.width(this.$content.width()),this.$viewport.height(this.$content.height())},t}(n);return o});var __extends=this&&this.__extends||function(e,t){function i(){this.constructor=e}for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)};define("extensions/uv-virtex-extension/Extension",["require","exports","../../modules/uv-shared-module/BaseCommands","../../modules/uv-shared-module/BaseExtension","../../modules/uv-shared-module/Bookmark","../../modules/uv-contentleftpanel-module/ContentLeftPanel","./DownloadDialogue","./ShareDialogue","../../modules/uv-shared-module/FooterPanel","../../modules/uv-shared-module/HeaderPanel","../../modules/uv-moreinforightpanel-module/MoreInfoRightPanel","./SettingsDialogue","../../modules/uv-shared-module/Shell","../../modules/uv-virtexcenterpanel-module/VirtexCenterPanel"],function(e,t,i,n,o,s,r,a,l,h,c,u,p,d){var g=function(e){function t(t){e.call(this,t)}return __extends(t,e),t.prototype.create=function(t){var n=this;e.prototype.create.call(this,t),$.subscribe(i.THUMB_SELECTED,function(e,t){n.viewCanvas(t)})},t.prototype.createModules=function(){e.prototype.createModules.call(this),this.isHeaderPanelEnabled()?this.headerPanel=new h(p.$headerPanel):p.$headerPanel.hide(),this.isLeftPanelEnabled()&&(this.leftPanel=new s(p.$leftPanel)),this.centerPanel=new d(p.$centerPanel),this.isRightPanelEnabled()&&(this.rightPanel=new c(p.$rightPanel)),this.isFooterPanelEnabled()?this.footerPanel=new l(p.$footerPanel):p.$footerPanel.hide(),this.$downloadDialogue=$('<div class="overlay download"></div>'),p.$overlays.append(this.$downloadDialogue),this.downloadDialogue=new r(this.$downloadDialogue),this.$shareDialogue=$('<div class="overlay share"></div>'),p.$overlays.append(this.$shareDialogue),this.shareDialogue=new a(this.$shareDialogue),this.$settingsDialogue=$('<div class="overlay settings"></div>'),p.$overlays.append(this.$settingsDialogue),this.settingsDialogue=new u(this.$settingsDialogue),this.isLeftPanelEnabled()?this.leftPanel.init():p.$leftPanel.hide(),this.isRightPanelEnabled()?this.rightPanel.init():p.$rightPanel.hide()},t.prototype.isLeftPanelEnabled=function(){return Utils.Bools.getBool(this.config.options.leftPanelEnabled,!0)&&(this.helper.isMultiCanvas()||this.helper.isMultiSequence())},t.prototype.bookmark=function(){e.prototype.bookmark.call(this);var t=this.helper.getCurrentCanvas(),n=new o;n.index=this.helper.canvasIndex,n.label=Manifesto.TranslationCollection.getValue(t.getLabel()),n.path=this.getBookmarkUri(),n.thumb=t.getProperty("thumbnail"),n.title=this.helper.getLabel(),n.trackingLabel=window.trackingLabel,n.type=manifesto.ElementType.physicalobject().toString(),this.triggerSocket(i.BOOKMARK,n)},t.prototype.getEmbedScript=function(e,t,i){var n=this.config.uri||"",o=String.format(e,this.getSerializedLocales(),n,this.helper.iiifResourceUri,this.helper.collectionIndex,this.helper.manifestIndex,this.helper.sequenceIndex,this.helper.canvasIndex,t,i,this.embedScriptUri);return o},t}(n);return g}),"function"==typeof jQuery&&define("jquery",[],function(){return jQuery}),require(["Bootstrapper","extensions/uv-mediaelement-extension/Extension","extensions/uv-pdf-extension/Extension","extensions/uv-seadragon-extension/Extension","extensions/uv-virtex-extension/Extension"],function(e,t,i,n,o){var s={};s[manifesto.ElementType.canvas().toString()]={type:n,name:"uv-seadragon-extension"},s[manifesto.ElementType.movingimage().toString()]={type:t,name:"uv-mediaelement-extension"},s[manifesto.ElementType.physicalobject().toString()]={type:o,name:"uv-virtex-extension"},s[manifesto.ElementType.sound().toString()]={type:t,name:"uv-mediaelement-extension"},s[manifesto.RenderingFormat.pdf().toString()]={type:i,name:"uv-pdf-extension"};var r=new e(s);r.bootstrap()}),define("app",function(){});
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/bundle.min.js b/public/opac/js/universalviewer-2.0.2/lib/bundle.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..efbbe84d0dc5d282015e472041aa546c8f5082bf
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/bundle.min.js
@@ -0,0 +1,11 @@
+function Sanitize(){var i,options;for(options=arguments[0]||{},this.config={},this.config.elements=options.elements?options.elements:[],this.config.attributes=options.attributes?options.attributes:{},this.config.attributes[Sanitize.ALL]=this.config.attributes[Sanitize.ALL]?this.config.attributes[Sanitize.ALL]:[],this.config.allow_comments=!!options.allow_comments&&options.allow_comments,this.allowed_elements={},this.config.protocols=options.protocols?options.protocols:{},this.config.add_attributes=options.add_attributes?options.add_attributes:{},this.dom=options.dom?options.dom:document,i=0;i<this.config.elements.length;i++)this.allowed_elements[this.config.elements[i]]=!0;if(this.config.remove_element_contents={},this.config.remove_all_contents=!1,options.remove_contents)if(options.remove_contents instanceof Array)for(i=0;i<options.remove_contents.length;i++)this.config.remove_element_contents[options.remove_contents[i]]=!0;else this.config.remove_all_contents=!0;this.transformers=options.transformers?options.transformers:[]}window.browserDetect={init:function(){this.browser=this.searchString(this.dataBrowser)||"Other",this.version=this.searchVersion(navigator.userAgent)||this.searchVersion(navigator.appVersion)||"Unknown","Explorer"==this.browser&&"7"==this.version&&navigator.userAgent.match(/Trident/i)&&(this.version=this.searchVersionIE())},searchString:function(data){for(var i=0;i<data.length;i++){var dataString=data[i].string;if(this.versionSearchString=data[i].subString,dataString.indexOf(data[i].subString)!=-1)return data[i].identity}},searchVersion:function(dataString){var index=dataString.indexOf(this.versionSearchString);if(index!=-1)return parseFloat(dataString.substring(index+this.versionSearchString.length+1))},searchVersionIE:function(){var ver,ua=navigator.userAgent.toString().toLowerCase(),match=/(trident)(?:.*rv:([\w.]+))?/.exec(ua)||/(msie) ([\w.]+)/.exec(ua)||["",null,-1];try{ver=match[2].split(".")[0]}catch(err){ver="unknown"}return ver},dataBrowser:[{string:navigator.userAgent,subString:"Chrome",identity:"Chrome"},{string:navigator.userAgent,subString:"MSIE",identity:"Explorer"},{string:navigator.userAgent,subString:"Trident",identity:"Explorer"},{string:navigator.userAgent,subString:"Firefox",identity:"Firefox"},{string:navigator.userAgent,subString:"Safari",identity:"Safari"},{string:navigator.userAgent,subString:"Opera",identity:"Opera"}]},window.browserDetect.init(),function(a){(jQuery.browser=jQuery.browser||{}).mobile=/(android|bb\d+|meego).+mobile|avantgo|bada\/|android|ipad|playbook|silk|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))}(navigator.userAgent||navigator.vendor||window.opera),function(factory){factory(jQuery)}(function($){if($.support.cors||!$.ajaxTransport||!window.XDomainRequest)return $;var httpRegEx=/^(https?:)?\/\//i,getOrPostRegEx=/^get|post$/i,sameSchemeRegEx=new RegExp("^(//|"+location.protocol+")","i");return $.ajaxTransport("* text html xml json",function(options,userOptions,jqXHR){if(options.crossDomain&&options.async&&getOrPostRegEx.test(options.type)&&httpRegEx.test(options.url)&&sameSchemeRegEx.test(options.url)){var xdr=null;return{send:function(headers,complete){var postData="",userType=(userOptions.dataType||"").toLowerCase();xdr=new XDomainRequest,/^\d+$/.test(userOptions.timeout)&&(xdr.timeout=userOptions.timeout),xdr.ontimeout=function(){complete(500,"timeout")},xdr.onload=function(){var allResponseHeaders="Content-Length: "+xdr.responseText.length+"\r\nContent-Type: "+xdr.contentType,status={code:200,message:"success"},responses={text:xdr.responseText};try{if("html"===userType||/text\/html/i.test(xdr.contentType))responses.html=xdr.responseText;else if("json"===userType||"text"!==userType&&/\/json/i.test(xdr.contentType))try{responses.json=$.parseJSON(xdr.responseText)}catch(e){status.code=500,status.message="parseerror"}else if("xml"===userType||"text"!==userType&&/\/xml/i.test(xdr.contentType)){var doc=new ActiveXObject("Microsoft.XMLDOM");doc.async=!1;try{doc.loadXML(xdr.responseText)}catch(e){doc=void 0}if(!doc||!doc.documentElement||doc.getElementsByTagName("parsererror").length)throw status.code=500,status.message="parseerror","Invalid XML: "+xdr.responseText;responses.xml=doc}}catch(parseMessage){throw parseMessage}finally{complete(status.code,status.message,responses,allResponseHeaders)}},xdr.onprogress=function(){},xdr.onerror=function(){complete(401,"error",{text:xdr.responseText})},userOptions.data&&(postData="string"===$.type(userOptions.data)?userOptions.data:$.param(userOptions.data)),xdr.open(options.type,options.url),xdr.send(postData)},abort:function(){xdr&&xdr.abort()}}}}),$}),window.Modernizr=function(a,b,c){function v(a){j.cssText=a}function x(a,b){return typeof a===b}function A(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)p[c[d]]=c[d]in k;return p.list&&(p.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),p}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var e,f,h,d=0,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e="text"!==k.type,e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&"textfield"!==h.getComputedStyle(k,null).WebkitAppearance&&0!==k.offsetHeight,g.removeChild(k)):/^(search|tel)$/.test(f)||(e=/^(url|email)$/.test(f)?k.checkValidity&&k.checkValidity()===!1:k.value!=l)),o[a[d]]=!!e;return o}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var s,u,d="2.8.3",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",n=({}.toString,{}),o={},p={},q=[],r=q.slice,t={}.hasOwnProperty;u=x(t,"undefined")||x(t.call,"undefined")?function(a,b){return b in a&&x(a.constructor.prototype[b],"undefined")}:function(a,b){return t.call(a,b)},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if("function"!=typeof c)throw new TypeError;var d=r.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(r.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(r.call(arguments)))};return e});for(var B in n)u(n,B)&&(s=B.toLowerCase(),e[s]=n[B](),q.push((e[s]?"":"no-")+s));return e.input||A(),e.addTest=function(a,b){if("object"==typeof a)for(var d in a)u(a,d)&&e.addTest(d,a[d]);else{if(a=a.toLowerCase(),e[a]!==c)return e;b="function"==typeof b?b():b,"undefined"!=typeof f&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},v(""),i=k=null,e._version=d,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+q.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var A,B,l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}};B=function(a){function b(a){var e,f,g,a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a};for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var c,b=0;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var m,n,h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var l,o,k=b.createElement("script"),e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var j,e=b.createElement("link"),c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))},Modernizr.addTest("cors",!!(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest)),Sanitize.REGEX_PROTOCOL=/^([A-Za-z0-9\+\-\.\&\;\*\s]*?)(?:\:|&*0*58|&*x0*3a)/i,Sanitize.RELATIVE="__RELATIVE__",Sanitize.ALL="__ALL__",Sanitize.prototype.clean_node=function(container){function _array_index(needle,haystack){var i;for(i=0;i<haystack.length;i++)if(haystack[i]==needle)return i;return-1}function _merge_arrays_uniq(){var i,j,result=[],uniq_hash={};for(i=0;i<arguments.length;i++)if(arguments[i]&&arguments[i].length)for(j=0;j<arguments[i].length;j++)uniq_hash[arguments[i][j]]||(uniq_hash[arguments[i][j]]=!0,result.push(arguments[i][j]));return result}function _clean(elem){var clone;switch(elem.nodeType){case 1:_clean_element.call(this,elem);break;case 3:clone=elem.cloneNode(!1),this.current_element.appendChild(clone);break;case 5:clone=elem.cloneNode(!1),this.current_element.appendChild(clone);break;case 8:this.config.allow_comments&&(clone=elem.cloneNode(!1),this.current_element.appendChild(clone));break;default:console&&console.log&&console.log("unknown node type",elem.nodeType)}}function _clean_element(elem){var i,parent_element,name,allowed_attributes,attr,attr_name,attr_node,protocols,del,attr_ok,transform=_transform_element.call(this,elem);if(elem=transform.node,name=elem.nodeName.toLowerCase(),parent_element=this.current_element,this.allowed_elements[name]||transform.whitelist){this.current_element=this.dom.createElement(elem.nodeName),parent_element.appendChild(this.current_element);var attrs=this.config.attributes;for(allowed_attributes=_merge_arrays_uniq(attrs[name],attrs[Sanitize.ALL],transform.attr_whitelist),i=0;i<allowed_attributes.length;i++)attr_name=allowed_attributes[i],attr=elem.attributes[attr_name],attr&&(attr_ok=!0,this.config.protocols[name]&&this.config.protocols[name][attr_name]&&(protocols=this.config.protocols[name][attr_name],del=attr.value.toLowerCase().match(Sanitize.REGEX_PROTOCOL),attr_ok=del?_array_index(del[1],protocols)!=-1:_array_index(Sanitize.RELATIVE,protocols)!=-1),attr_ok&&(attr_node=document.createAttribute(attr_name),attr_node.value=attr.value,this.current_element.setAttributeNode(attr_node)));if(this.config.add_attributes[name])for(attr_name in this.config.add_attributes[name])attr_node=document.createAttribute(attr_name),attr_node.value=this.config.add_attributes[name][attr_name],this.current_element.setAttributeNode(attr_node)}else if(_array_index(elem,this.whitelist_nodes)!=-1){for(this.current_element=elem.cloneNode(!0);this.current_element.childNodes.length>0;)this.current_element.removeChild(this.current_element.firstChild);parent_element.appendChild(this.current_element)}if(!this.config.remove_all_contents&&!this.config.remove_element_contents[name])for(i=0;i<elem.childNodes.length;i++)_clean.call(this,elem.childNodes[i]);this.current_element.normalize&&this.current_element.normalize(),this.current_element=parent_element}function _transform_element(node){var i,j,transform,output={attr_whitelist:[],node:node,whitelist:!1};for(i=0;i<this.transformers.length;i++)if(transform=this.transformers[i]({allowed_elements:this.allowed_elements,config:this.config,node:node,node_name:node.nodeName.toLowerCase(),whitelist_nodes:this.whitelist_nodes,dom:this.dom}),null!=transform){if("object"!=typeof transform)throw new Error("transformer output must be an object or null");if(transform.whitelist_nodes&&transform.whitelist_nodes instanceof Array)for(j=0;j<transform.whitelist_nodes.length;j++)_array_index(transform.whitelist_nodes[j],this.whitelist_nodes)==-1&&this.whitelist_nodes.push(transform.whitelist_nodes[j]);output.whitelist=!!transform.whitelist,transform.attr_whitelist&&(output.attr_whitelist=_merge_arrays_uniq(output.attr_whitelist,transform.attr_whitelist)),output.node=transform.node?transform.node:output.node}return output}var fragment=this.dom.createDocumentFragment();for(this.current_element=fragment,this.whitelist_nodes=[],i=0;i<container.childNodes.length;i++)_clean.call(this,container.childNodes[i]);return fragment.normalize&&fragment.normalize(),fragment},"function"==typeof define&&define("sanitize",[],function(){return Sanitize}),function(window,doc,undef){yepnope.injectCss=function(href,cb,attrs,timeout,err,internal){function poll(){try{for(var sheets=document.styleSheets,j=0,k=sheets.length;j<k;j++)if(sheets[j].ownerNode.id==id&&sheets[j].cssRules.length)return onload();throw new Error}catch(e){setTimeout(poll,20)}}var ref,done,i,link=document.createElement("link"),onload=function(){done||(done=1,link.removeAttribute("id"),setTimeout(cb,0))},id="yn"+ +new Date;cb=internal?yepnope.executeStack:cb||function(){},timeout=timeout||yepnope.errorTimeout,link.href=href,link.rel="stylesheet",link.type="text/css",link.id=id;for(i in attrs)link.setAttribute(i,attrs[i]);err||(ref=document.getElementsByTagName("base")[0]||document.getElementsByTagName("script")[0],ref.parentNode.insertBefore(link,ref),link.onload=onload,poll())}}(this,this.document),function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.TinyEmitter=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){function E(){}E.prototype={on:function(name,callback,ctx){var e=this.e||(this.e={});return(e[name]||(e[name]=[])).push({fn:callback,ctx:ctx}),this},once:function(name,callback,ctx){function listener(){self.off(name,listener),callback.apply(ctx,arguments)}var self=this;return listener._=callback,this.on(name,listener,ctx)},emit:function(name){var data=[].slice.call(arguments,1),evtArr=((this.e||(this.e={}))[name]||[]).slice(),i=0,len=evtArr.length;for(i;i<len;i++)evtArr[i].fn.apply(evtArr[i].ctx,data);return this},off:function(name,callback){var e=this.e||(this.e={}),evts=e[name],liveEvents=[];if(evts&&callback)for(var i=0,len=evts.length;i<len;i++)evts[i].fn!==callback&&evts[i].fn._!==callback&&liveEvents.push(evts[i]);return liveEvents.length?e[name]=liveEvents:delete e[name],this}},module.exports=E},{}]},{},[1])(1)}),!function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.baseComponent=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){(function(global){var _Components;!function(_Components){function applyMixins(derivedCtor,baseCtors){baseCtors.forEach(function(baseCtor){Object.getOwnPropertyNames(baseCtor.prototype).forEach(function(name){derivedCtor.prototype[name]=baseCtor.prototype[name]})})}var BaseComponent=function(){function BaseComponent(options){this.options=$.extend(this._getDefaultOptions(),options)}return BaseComponent.prototype._init=function(){return this._$element=$(this.options.element),this._$element.length?(this._$element.empty(),!0):(console.warn("element not found"),!1)},BaseComponent.prototype._getDefaultOptions=function(){return{}},BaseComponent.prototype._emit=function(event){for(var args=[],_i=1;_i<arguments.length;_i++)args[_i-1]=arguments[_i];return this.emit(event,args)},BaseComponent.prototype._resize=function(){},BaseComponent.prototype.databind=function(data){},BaseComponent}();_Components.BaseComponent=BaseComponent,_Components.applyMixins=applyMixins,applyMixins(BaseComponent,[TinyEmitter])}(_Components||(_Components={})),function(g){g._Components||(g._Components=_Components)}(global)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)}),function($){function documentHandler(){var $current=this===document?$(this):$(this).contents();$current.mousemove(function(e){jQuery.mlp={x:e.pageX,y:e.pageY}}),$current.find("iframe").load(documentHandler)}$.fn.checkboxButton=function(onClick){return this.each(function(){var $this=$(this);$this.on("click",function(e){var tagName=e.target.tagName,$checkbox=$(this).find(":checkbox");"INPUT"!==tagName&&(e.preventDefault(),$checkbox.prop("checked",!$checkbox.prop("checked")));var checked=$checkbox.is(":checked");onClick.call(this,checked)})})},$.fn.disable=function(){return this.each(function(){var $this=$(this);$this.addClass("disabled"),$this.data("tabindex",$this.attr("tabindex")),$this.removeAttr("tabindex")})},$.fn.ellipsis=function(chars){return this.each(function(){var $self=$(this),text=$self.text();if(text.length>chars){var trimmedText=text.substr(0,chars);trimmedText=trimmedText.substr(0,Math.min(trimmedText.length,trimmedText.lastIndexOf(" "))),$self.empty().html(trimmedText+"&hellip;")}})},$.fn.ellipsisFill=function(text){var textPassed=!0;return text||(textPassed=!1),this.each(function(){var $self=$(this);if(textPassed||(text=$self.text()),$self.empty(),$self.spanElem=$('<span title="'+text+'"></span>'),$self.append($self.spanElem),$self.css("overflow","hidden"),$self.spanElem.css("white-space","nowrap"),$self.spanElem.html(text),$self.spanElem.width()>$self.width())for(var lastText;$self.spanElem.width()>$self.width();){var t=$self.spanElem.html();if(t=t.substring(0,t.lastIndexOf(" "))+"&hellip;",t===lastText)break;$self.spanElem.html(t),lastText=t}})},$.fn.ellipsisFixed=function(chars,buttonText){return this.each(function(){var $self=$(this),text=$self.text();$self.empty();var $span=$("<span></span>"),$ellipsis=$('<a href="#" title="more" class="ellipsis"></a>');if(buttonText?$ellipsis.html(buttonText):$ellipsis.html("&hellip;"),$ellipsis.click(function(e){e.preventDefault();var $this=$(this);$span.html(text),$this.remove()}),text.length>chars){var trimmedText=text.substr(0,chars);trimmedText=trimmedText.substr(0,Math.min(trimmedText.length,trimmedText.lastIndexOf(" "))),$span.html(trimmedText+"&nbsp;"),$span.append($ellipsis)}else $span.html(text);$self.append($span)})},$.fn.ellipsisHtmlFixed=function(chars,cb){return this.each(function(){var $self=$(this),expandedText=$self.html(),$trunc=$("<span></span>");if($trunc.html($self.html().replace(/\s[\s]*/g," ").trim()),!($trunc.text().trim().length<=chars)){for(;$trunc.text().trim().length>chars;)$trunc.removeLastWord(chars);var collapsedText=$trunc.html(),expanded=!1;$self.toggle=function(){$self.empty();var $toggleButton=$('<a href="#" class="toggle"></a>');expanded?($self.html(expandedText+" "),$toggleButton.text("less"),$toggleButton.toggleClass("less","more")):($self.html(collapsedText+"&hellip; "),$toggleButton.text("more"),$toggleButton.toggleClass("more","less")),$toggleButton.one("click",function(e){e.preventDefault(),$self.toggle()}),expanded=!expanded,$self.append($toggleButton),cb&&cb()},$self.toggle()}})},$.fn.enable=function(){return this.each(function(){var $this=$(this);$this.removeClass("disabled"),$this.attr("tabindex",$this.data("tabindex"))})},$.fn.equaliseHeight=function(reset,average){var maxHeight=-1,minHeight=Number.MAX_VALUE,heights=[];reset&&this.each(function(){$(this).height("auto")}),this.each(function(){var currentHeight=$(this).height();heights.push(currentHeight),maxHeight=maxHeight>currentHeight?maxHeight:currentHeight,minHeight=minHeight<currentHeight?minHeight:currentHeight});var finalHeight=maxHeight;return average&&(finalHeight=Math.median(heights)),this.each(function(){$(this).height(finalHeight)}),this},$.fn.getVisibleElementWithGreatestTabIndex=function(){var $self=$(this),maxTabIndex=0,$elementWithGreatestTabIndex=null;return $self.find("*:visible[tabindex]").each(function(idx,el){var $el=$(el),tabIndex=parseInt($el.attr("tabindex"));tabIndex>maxTabIndex&&(maxTabIndex=tabIndex,$elementWithGreatestTabIndex=$el)}),$elementWithGreatestTabIndex},$.fn.horizontalMargins=function(){var $self=$(this);return parseInt($self.css("marginLeft"))+parseInt($self.css("marginRight"))},$.fn.leftMargin=function(){var $self=$(this);return parseInt($self.css("marginLeft"))},$.fn.rightMargin=function(){var $self=$(this);return parseInt($self.css("marginRight"))},$.fn.horizontalPadding=function(){var $self=$(this);return parseInt($self.css("paddingLeft"))+parseInt($self.css("paddingRight"))},$.fn.leftPadding=function(){var $self=$(this);return parseInt($self.css("paddingLeft"))},$.fn.rightPadding=function(){var $self=$(this);return parseInt($self.css("paddingRight"))},$.mlp={x:0,y:0},$(documentHandler),$.fn.ismouseover=function(overThis){var result=!1;return this.eq(0).each(function(){var $current=$(this).is("iframe")?$(this).contents().find("body"):$(this),offset=$current.offset();result=offset.left<=$.mlp.x&&offset.left+$current.outerWidth()>$.mlp.x&&offset.top<=$.mlp.y&&offset.top+$current.outerHeight()>$.mlp.y}),result};var timer,on=$.fn.on;$.fn.on=function(){var args=Array.apply(null,arguments),last=args[args.length-1];if(isNaN(last)||1===last&&args.pop())return on.apply(this,args);var delay=args.pop(),fn=args.pop();return args.push(function(){var self=this,params=arguments;clearTimeout(timer),timer=setTimeout(function(){fn.apply(self,params)},delay)}),on.apply(this,args)},$.fn.onEnter=function(cb){return this.each(function(){var $this=$(this);$this.on("keyup",function(e){13===e.keyCode&&(e.preventDefault(),cb())})})},$.fn.onPressed=function(cb){return this.each(function(){var $this=$(this);$this.on("touchstart click",function(e){e.preventDefault(),cb(e)}),$this.on("keyup",function(e){13===e.keyCode&&(e.preventDefault(),cb(e))})})},$.fn.removeLastWord=function(chars,depth){return"undefined"==typeof chars&&(chars=8),"undefined"==typeof depth&&(depth=0),this.each(function(){var $self=$(this);if($self.contents().length>0){var $lastElement=$self.contents().last();if(3===$lastElement[0].nodeType){var words=$lastElement.text().trim().split(" ");if(words.length>1)return words.splice(words.length-1,1),void($lastElement[0].data=words.join(" "));if("undefined"!=typeof chars&&1===words.length&&words[0].length>chars)return void($lastElement[0].data=words.join(" ").substring(0,chars))}$lastElement.removeLastWord(chars,depth+1)}else depth>0&&$self.remove()})},$.fn.swapClass=function(removeClass,addClass){return this.each(function(){$(this).removeClass(removeClass).addClass(addClass)})},$.fn.targetBlank=function(){return this.each(function(){$(this).find("a").prop("target","_blank")})},$.fn.toggleClass=function(class1,class2){return this.each(function(){var $this=$(this);$this.hasClass(class1)?$(this).removeClass(class1).addClass(class2):$(this).removeClass(class2).addClass(class1)})},$.fn.toggleExpandText=function(chars,lessText,moreText,cb){return this.each(function(){var $self=$(this),expandedText=$self.html();if(!(chars>expandedText.length)){var expanded=!1,collapsedText=expandedText.substr(0,chars);collapsedText=collapsedText.substr(0,Math.min(collapsedText.length,collapsedText.lastIndexOf(" "))),$self.toggle=function(){$self.empty();var $toggleButton=$('<a href="#" class="toggle"></a>');expanded?($self.html(expandedText+"&nbsp;"),$toggleButton.text(lessText),$toggleButton.toggleClass("less","more")):($self.html(collapsedText+"&nbsp;"),$toggleButton.text(moreText),$toggleButton.toggleClass("more","less")),$toggleButton.one("click",function(e){e.preventDefault(),$self.toggle()}),expanded=!expanded,$self.append($toggleButton),cb&&cb()},$self.toggle()}})},$.fn.toggleExpandTextByLines=function(lines,lessText,moreText,cb){return this.each(function(){for(var $self=$(this),expandedText=$self.html(),$buttonPad=$('<span>&hellip; <a href="#" class="toggle more">morepad</a></span>'),stringsByLine=[expandedText],lastHeight=$self.height();$self.text().length>0;){$self.removeLastWord();var html=$self.html();$self.append($buttonPad),lastHeight>$self.height()&&(stringsByLine.unshift(html),lastHeight=$self.height()),$buttonPad.remove()}if(stringsByLine.length<=lines)return void $self.html(expandedText);var collapsedText=stringsByLine[lines-1],expanded=!1;$self.toggle=function(){$self.empty();var $toggleButton=$('<a href="#" class="toggle"></a>');expanded?($self.html(expandedText+" "),$toggleButton.text(lessText),$toggleButton.toggleClass("less","more")):($self.html(collapsedText+"&hellip; "),$toggleButton.text(moreText),$toggleButton.toggleClass("more","less")),$toggleButton.one("click",function(e){e.preventDefault(),$self.toggle()}),expanded=!expanded,$self.append($toggleButton),cb&&cb()},$self.toggle()})},$.fn.toggleText=function(text1,text2){return this.each(function(){var $this=$(this);$this.text()===text1?$(this).text(text2):$(this).text(text1)})},$.fn.updateAttr=function(attrName,oldVal,newVal){return this.each(function(){var $this=$(this),attr=$this.attr(attrName);attr&&0===attr.indexOf(oldVal)&&(attr=attr.replace(oldVal,newVal),$this.attr(attrName,attr))})},$.fn.verticalMargins=function(){var $self=$(this);return parseInt($self.css("marginTop"))+parseInt($self.css("marginBottom"))},$.fn.verticalPadding=function(){var $self=$(this);return parseInt($self.css("paddingTop"))+parseInt($self.css("paddingBottom"))}}(jQuery),!function(a){var b=null;a.initPubSub=function(){b=a({})},a.subscribe=function(){b||a.initPubSub(),b.on.apply(b,arguments)},a.unsubscribe=function(){b||a.initPubSub(),b.off.apply(b,arguments)},a.disposePubSub=function(){b=null},a.publish=function(){b||a.initPubSub(),b.trigger.apply(b,arguments)}}(jQuery),function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.keyCodes=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){(function(global){var KeyCodes;!function(KeyCodes){var KeyDown;!function(KeyDown){KeyDown.Backspace=8,KeyDown.Tab=9,KeyDown.Enter=13,KeyDown.Shift=16,KeyDown.Ctrl=17,KeyDown.Alt=18,KeyDown.PauseBreak=19,KeyDown.CapsLock=20,KeyDown.Escape=27,KeyDown.Spacebar=32,KeyDown.PageUp=33,KeyDown.PageDown=34,KeyDown.End=35,KeyDown.Home=36,KeyDown.LeftArrow=37,KeyDown.UpArrow=38,KeyDown.RightArrow=39,KeyDown.DownArrow=40,KeyDown.PrintScrn=44,KeyDown.Insert=45,KeyDown.Delete=46,KeyDown.Zero=48,KeyDown.One=49,KeyDown.Two=50,KeyDown.Three=51,KeyDown.Four=52,KeyDown.Five=53,KeyDown.Six=54,KeyDown.Seven=55,KeyDown.Eight=56,KeyDown.Nine=57,
+KeyDown.a=65,KeyDown.b=66,KeyDown.c=67,KeyDown.d=68,KeyDown.e=69,KeyDown.f=70,KeyDown.g=71,KeyDown.h=72,KeyDown.i=73,KeyDown.j=74,KeyDown.k=75,KeyDown.l=76,KeyDown.m=77,KeyDown.n=78,KeyDown.o=79,KeyDown.p=80,KeyDown.q=81,KeyDown.r=82,KeyDown.s=83,KeyDown.t=84,KeyDown.u=85,KeyDown.v=86,KeyDown.w=87,KeyDown.x=88,KeyDown.y=89,KeyDown.z=90,KeyDown.LeftWindowKey=91,KeyDown.RightWindowKey=92,KeyDown.SelectKey=93,KeyDown.Numpad0=96,KeyDown.Numpad1=97,KeyDown.Numpad2=98,KeyDown.Numpad3=99,KeyDown.Numpad4=100,KeyDown.Numpad5=101,KeyDown.Numpad6=102,KeyDown.Numpad7=103,KeyDown.Numpad8=104,KeyDown.Numpad9=105,KeyDown.Multiply=106,KeyDown.NumpadPlus=107,KeyDown.NumpadMinus=109,KeyDown.DecimalPoint=110,KeyDown.Divide=111,KeyDown.F1=112,KeyDown.F2=113,KeyDown.F3=114,KeyDown.F4=115,KeyDown.F5=116,KeyDown.F6=117,KeyDown.F7=118,KeyDown.F8=119,KeyDown.F9=120,KeyDown.F10=121,KeyDown.F11=122,KeyDown.F12=123,KeyDown.NumLock=144,KeyDown.ScrollLock=145,KeyDown.Semicolon=186,KeyDown.Equals=187,KeyDown.Comma=188,KeyDown.LessThan=188,KeyDown.Dash=189,KeyDown.Period=190,KeyDown.GreaterThan=190,KeyDown.ForwardSlash=191,KeyDown.QuestionMark=191,KeyDown.GraveAccent=192,KeyDown.Tilde=192,KeyDown.OpenCurlyBracket=219,KeyDown.OpenSquareBracket=219,KeyDown.BackSlash=220,KeyDown.VerticalPipe=220,KeyDown.CloseCurlyBracket=221,KeyDown.CloseSquareBracket=221,KeyDown.Quote=222,KeyDown.CommandFF=224}(KeyDown=KeyCodes.KeyDown||(KeyCodes.KeyDown={}))}(KeyCodes||(KeyCodes={})),function(KeyCodes){var KeyPress;!function(KeyPress){KeyPress.Backspace=8,KeyPress.Enter=13,KeyPress.Spacebar=32,KeyPress.Hash=35,KeyPress.GraveAccent=39,KeyPress.DoubleQuote=34,KeyPress.Asterisk=42,KeyPress.Plus=43,KeyPress.Comma=44,KeyPress.Minus=45,KeyPress.Period=46,KeyPress.ForwardSlash=47,KeyPress.Zero=48,KeyPress.One=49,KeyPress.Two=50,KeyPress.Three=51,KeyPress.Four=52,KeyPress.Five=53,KeyPress.Six=54,KeyPress.Seven=55,KeyPress.Eight=56,KeyPress.Nine=57,KeyPress.Colon=58,KeyPress.Semicolon=59,KeyPress.LessThan=60,KeyPress.Equals=61,KeyPress.GreaterThan=62,KeyPress.QuestionMark=63,KeyPress.At=64,KeyPress.OpenSquareBracket=91,KeyPress.BackSlash=92,KeyPress.CloseSquareBracket=93,KeyPress.a=97,KeyPress.b=98,KeyPress.c=99,KeyPress.d=100,KeyPress.e=101,KeyPress.f=102,KeyPress.g=103,KeyPress.h=104,KeyPress.i=105,KeyPress.j=106,KeyPress.k=107,KeyPress.l=108,KeyPress.m=109,KeyPress.n=110,KeyPress.o=111,KeyPress.p=112,KeyPress.q=113,KeyPress.r=114,KeyPress.s=115,KeyPress.t=116,KeyPress.u=117,KeyPress.v=118,KeyPress.w=119,KeyPress.x=120,KeyPress.y=121,KeyPress.z=122,KeyPress.OpenCurlyBracket=123,KeyPress.VerticalPipe=124,KeyPress.CloseCurlyBracket=125,KeyPress.Tilde=126}(KeyPress=KeyCodes.KeyPress||(KeyCodes.KeyPress={}))}(KeyCodes||(KeyCodes={})),function(g){g.KeyCodes||(g.KeyCodes=KeyCodes)}(global)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)});var exjs;!function(r){r.version="0.4.0"}(exjs||(exjs={}));var exjs;!function(r){Array.isArray||(Array.isArray=function(r){return"[object Array]"===Object.prototype.toString.call(r)})}(exjs||(exjs={}));var exjs;!function(r){var e=function(){function r(){}return r.prototype.getEnumerator=function(){return{moveNext:function(){return!1},current:void 0}},r.prototype.aggregate=function(r,e){for(var t=r,n=this.getEnumerator();n.moveNext();)t=e(t,n.current);return t},r.prototype.all=function(r){if(r)for(var e=this.getEnumerator(),t=0;e.moveNext();){if(!r(e.current,t))return!1;t++}return!0},r.prototype.any=function(r){for(var e=this.getEnumerator(),t=0;e.moveNext();){if(!r)return!0;if(r(e.current,t))return!0;t++}return!1},r.prototype.append=function(){for(var r=[],e=0;e<arguments.length;e++)r[e-0]=arguments[e];throw new Error("Not implemented")},r.prototype.apply=function(r){throw new Error("Not implemented")},r.prototype.at=function(r){for(var e=this.getEnumerator(),t=0;e.moveNext();){if(t===r)return e.current;t++}},r.prototype.average=function(r){var e=0,t=0;r=r||function(r){if("number"!=typeof r)throw new Error("Object is not a number.");return r};for(var n=this.getEnumerator();n.moveNext();)t+=r(n.current),e++;return 0===e?0:t/e},r.prototype.concat=function(r){throw new Error("Not implemented")},r.prototype.count=function(r){for(var e=0,t=this.getEnumerator();t.moveNext();)(!r||r(t.current))&&e++;return e},r.prototype.difference=function(r,e){return e=e||function(r,e){return r===e},r instanceof Array&&(r=r.en()),{intersection:this.intersect(r,e).toArray().en(),aNotB:this.except(r,e).toArray().en(),bNotA:r.except(this,e).toArray().en()}},r.prototype.distinct=function(r){throw new Error("Not implemented")},r.prototype.except=function(r,e){throw new Error("Not implemented")},r.prototype.first=function(r){for(var e=this.getEnumerator();e.moveNext();)if(!r||r(e.current))return e.current},r.prototype.firstIndex=function(r){for(var e=this.getEnumerator(),t=0;e.moveNext();t++)if(!r||r(e.current))return t;return-1},r.prototype.forEach=function(r){for(var e=this.getEnumerator();e.moveNext();)r(e.current)},r.prototype.groupBy=function(r,e){throw new Error("Not implemented")},r.prototype.intersect=function(r,e){throw new Error("Not implemented")},r.prototype.join=function(r,e,t,n,o){throw new Error("Not implemented")},r.prototype.last=function(r){for(var e,t=this.getEnumerator();t.moveNext();)(!r||r(t.current))&&(e=t.current);return e},r.prototype.lastIndex=function(r){for(var e=-1,t=this.getEnumerator(),n=0;t.moveNext();n++)(!r||r(t.current))&&(e=n);return e},r.prototype.max=function(r){var e=this.getEnumerator();if(!e.moveNext())return 0;r=r||function(r){if("number"!=typeof r)throw new Error("Object is not a number.");return r};for(var t=r(e.current);e.moveNext();)t=Math.max(t,r(e.current));return t},r.prototype.min=function(r){var e=this.getEnumerator();if(!e.moveNext())return 0;r=r||function(r){if("number"!=typeof r)throw new Error("Object is not a number.");return r};for(var t=r(e.current);e.moveNext();)t=Math.min(t,r(e.current));return t},r.prototype.orderBy=function(r,e){throw new Error("Not implemented")},r.prototype.orderByDescending=function(r,e){throw new Error("Not implemented")},r.prototype.prepend=function(){for(var r=[],e=0;e<arguments.length;e++)r[e-0]=arguments[e];throw new Error("Not implemented")},r.prototype.reverse=function(){throw new Error("Not implemented")},r.prototype.select=function(r){throw new Error("Not implemented")},r.prototype.selectMany=function(r){throw new Error("Not implemented")},r.prototype.skip=function(r){throw new Error("Not implemented")},r.prototype.skipWhile=function(r){throw new Error("Not implemented")},r.prototype.standardDeviation=function(r){var e=this.average(r),t=0,n=0;r=r||function(r){if("number"!=typeof r)throw new Error("Object is not a number.");return r};for(var o=this.getEnumerator();o.moveNext();){var u=r(o.current)-e;t+=u*u,n++}return Math.sqrt(t/n)},r.prototype.sum=function(r){var e=0;r=r||function(r){if("number"!=typeof r)throw new Error("Object is not a number.");return r};for(var t=this.getEnumerator();t.moveNext();)e+=r(t.current);return e},r.prototype.take=function(r){throw new Error("Not implemented")},r.prototype.takeWhile=function(r){throw new Error("Not implemented")},r.prototype.traverse=function(r){throw new Error("Not implemented")},r.prototype.traverseUnique=function(r,e){throw new Error("Not implemented")},r.prototype.toArray=function(){for(var r=[],e=this.getEnumerator();e.moveNext();)r.push(e.current);return r},r.prototype.toMap=function(r,e){throw new Error("Not implemented")},r.prototype.toList=function(){throw new Error("Not implemented")},r.prototype.union=function(r,e){throw new Error("Not implemented")},r.prototype.where=function(r){throw new Error("Not implemented")},r.prototype.zip=function(r,e){throw new Error("Not implemented")},r}();r.Enumerable=e}(exjs||(exjs={}));var Symbol,exjs;!function(r){function e(r){var e;return{next:function(){var t={done:!0,value:void 0};return r&&(e=e||r.getEnumerator())?(t.done=!e.moveNext(),t.value=e.current,t):t}}}Symbol&&Symbol.iterator&&(r.Enumerable.prototype[Symbol.iterator]=function(){return e(this)})}(exjs||(exjs={}));var exjs;!function(r){var e=function(){function e(r){this.size=0,this._keys=[],this._values=[];var e;if(r instanceof Array?e=r.en():r&&r.getEnumerator instanceof Function&&(e=r),e)for(var t=e.getEnumerator();t&&t.moveNext();)this.set(t.current[0],t.current[1])}return e.prototype.clear=function(){this._keys.length=0,this._values.length=0,this.size=0},e.prototype["delete"]=function(r){var e=this._keys.indexOf(r);return e>-1&&(this._keys.splice(e,1),this._values.splice(e,1),this.size--,!0)},e.prototype.entries=function(){var e=this;return r.range(0,this.size).select(function(r){return[e._keys[r],e._values[r]]})},e.prototype.forEach=function(r,e){null==e&&(e=this);for(var t=0,n=this._keys,o=this._values,u=n.length;u>t;t++)r.call(e,o[t],n[t],this)},e.prototype.get=function(r){var e=this._keys.indexOf(r);return this._values[e]},e.prototype.has=function(r){return this._keys.indexOf(r)>-1},e.prototype.keys=function(){return this._keys.en()},e.prototype.set=function(r,e){var t=this._keys.indexOf(r);t>-1?this._values[t]=e:(this._keys.push(r),this._values.push(e),this.size++)},e.prototype.values=function(){return this._values.en()},e}();r.Map3=e,r.Enumerable.prototype.toMap=function(r,t){for(var n=new e,o=this.getEnumerator();o.moveNext();)n.set(r(o.current),t(o.current));return n},r.List&&(r.List.prototype.toMap=r.Enumerable.prototype.toMap)}(exjs||(exjs={})),function(r){r.Map||(r.Map=exjs.Map3)}("undefined"==typeof window?global:window);var exjs;!function(r){function e(e){var t=new r.Enumerable;return t.getEnumerator=function(){var r={current:void 0,moveNext:function(){return e(r)}};return r},t}r.anonymous=e}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n,o=1,u={current:void 0,moveNext:function(){if(2>o){if(t=t||r.getEnumerator(),t.moveNext())return u.current=t.current,!0;o++}return n=n||e.en().getEnumerator(),n.moveNext()?(u.current=n.current,!0):(u.current=void 0,!1)}};return u}r.Enumerable.prototype.append=function(){for(var t=this,n=[],o=0;o<arguments.length;o++)n[o-0]=arguments[o];var u=new r.Enumerable;return u.getEnumerator=function(){return e(t,n)},u},r.List&&(r.List.prototype.append=r.Enumerable.prototype.append)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n=0,o={current:void 0,moveNext:function(){return t||(t=r.getEnumerator()),!!t.moveNext()&&(e(o.current=t.current,n),n++,!0)}};return o}r.Enumerable.prototype.apply=function(t){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return e(n,t)},o},r.List&&(r.List.prototype.apply=r.Enumerable.prototype.apply)}(exjs||(exjs={}));var __extends=this&&this.__extends||function(r,e){function t(){this.constructor=r}for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);r.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)},exjs;!function(r){function e(r){var e=r.length,t={moveNext:void 0,current:void 0},n=-1;return t.moveNext=function(){return n++,n>=e?(t.current=void 0,!1):(t.current=r[n],!0)},t}function t(){return this&&Array.isArray(this)?new n(this):new r.Enumerable}var n=function(r){function t(t){r.call(this),this.getEnumerator=function(){return e(t)},this.toArray=function(){return t.slice(0)}}return __extends(t,r),t}(r.Enumerable);try{Object.defineProperty(Array.prototype,"en",{value:t,enumerable:!1,writable:!1,configurable:!1})}catch(o){Array.prototype.en=t}}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n=!1,o={current:void 0,moveNext:function(){return t||(t=r.getEnumerator()),o.current=void 0,t.moveNext()?(o.current=t.current,!0):!n&&(n=!0,t=e.getEnumerator(),!!t.moveNext()&&(o.current=t.current,!0))}};return o}r.Enumerable.prototype.concat=function(t){var n=this,o=t instanceof Array?t.en():t,u=new r.Enumerable;return u.getEnumerator=function(){return e(n,o)},u},r.List&&(r.List.prototype.concat=r.Enumerable.prototype.concat)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n=[],o={current:void 0,moveNext:function(){if(t||(t=r.getEnumerator()),o.current=void 0,!e){for(;t.moveNext();)if(n.indexOf(t.current)<0)return n.push(o.current=t.current),!0;return!1}for(;t.moveNext();){for(var u=0,i=n.length,c=!1;i>u&&!c;u++)c=!!e(n[u],t.current);if(!c)return n.push(o.current=t.current),!0}return!1}};return o}r.Enumerable.prototype.distinct=function(t){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return e(n,t)},o},r.List&&(r.List.prototype.distinct=r.Enumerable.prototype.distinct)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e,t){t=t||function(r,e){return r===e};var n,o={current:void 0,moveNext:function(){for(n||(n=r.getEnumerator()),o.current=void 0;n.moveNext();){for(var u=!1,i=e.getEnumerator();i.moveNext()&&!u;)u=t(n.current,i.current);if(!u)return o.current=n.current,!0}return!1}};return o}r.Enumerable.prototype.except=function(t,n){var o=this,u=t instanceof Array?t.en():t,i=new r.Enumerable;return i.getEnumerator=function(){return e(o,u,n)},i},r.List&&(r.List.prototype.except=r.Enumerable.prototype.except)}(exjs||(exjs={})),Function.prototype.fromJson=function(r,e){function t(r,e){if(null==r)return r;if(e instanceof Function)return e(r);if(e instanceof Array){if(e=e[0],!(e instanceof Function&&r instanceof Array))return;for(var t=[],n=0;n<r.length;n++)t.push(e(r[n]));return t}}var n=new this;if(null==r)return n;var o=[];for(var u in e){var i=t(r[u],e[u]);void 0!==i&&(n[u]=i,o.push(u))}for(var u in this.$jsonMappings)if(!(o.indexOf(u)>-1)){var i=t(r[u],this.$jsonMappings[u]);void 0!==i&&(n[u]=i,o.push(u))}for(var u in r)o.indexOf(u)>-1||(n[u]=r[u]);return n};var exjs;!function(r){function e(r,e,n){var o,u=0,i={current:void 0,moveNext:function(){return o||(o=t(r,e,n)),i.current=void 0,!(u>=o.length)&&(i.current=o[u],u++,!0)}};return i}function t(r,e,t){t=t||function(r,e){return r===e};for(var o,u=[],i=[],c=r.getEnumerator();c.moveNext();){o=e(c.current);for(var a=-1,p=0,s=i.length;s>p;p++)if(t(o,i[p])){a=p;break}var f;0>a?(i.push(o),u.push(f=new n(o))):f=u[a],f._add(c.current)}return u}var n=function(r){function e(e){var t=this;r.call(this),this.key=e,this._arr=[],this.getEnumerator=function(){return t._arr.en().getEnumerator()}}return __extends(e,r),e.prototype._add=function(r){this._arr.push(r)},e}(r.Enumerable);r.Enumerable.prototype.groupBy=function(t,n){var o=this,u=new r.Enumerable;return u.getEnumerator=function(){return e(o,t,n)},u},r.List&&(r.List.prototype.groupBy=r.Enumerable.prototype.groupBy)}(exjs||(exjs={}));var exjs;!function(r){function e(e,t,n){n=n||function(r,e){return r===e};var o,u={current:void 0,moveNext:function(){for(o||(o=r.en(e).distinct().getEnumerator()),u.current=void 0;o.moveNext();){for(var i=!1,c=t.getEnumerator();c.moveNext()&&!i;)i=n(o.current,c.current);if(i)return u.current=o.current,!0}return!1}};return u}r.Enumerable.prototype.intersect=function(t,n){var o=this,u=t instanceof Array?t.en():t,i=new r.Enumerable;return i.getEnumerator=function(){return e(o,u,n)},i},r.List&&(r.List.prototype.intersect=r.Enumerable.prototype.intersect)}(exjs||(exjs={}));var exjs;!function(r){function e(e,t,n,o,u,i){i=i||function(r,e){return r===e};var c,a,p=0,s={current:void 0,moveNext:function(){if(s.current=void 0,!c){if(c=e.getEnumerator(),!c.moveNext())return!1;a=r.en(t).toArray()}var f;do{for(;p<a.length;p++)if(f=a[p],i(n(c.current),o(f)))return p++,s.current=u(c.current,f),!0;p=0}while(c.moveNext());return!1}};return s}r.Enumerable.prototype.join=function(t,n,o,u,i){var c=this,a=t instanceof Array?t.en():t,p=new r.Enumerable;return p.getEnumerator=function(){return e(c,a,n,o,u,i)},p},r.List&&(r.List.prototype.join=r.Enumerable.prototype.join)}(exjs||(exjs={}));var exjs;!function(r){function e(){this.constructor=t}r.Enumerable.prototype.toList=function(){for(var r=new t,e=this.getEnumerator();e.moveNext();)r.push(e.current);return r};var t=function(r){function e(){r.apply(this,arguments)}return __extends(e,r),e.prototype.toString=function(){throw new Error("Not implemented")},e.prototype.toLocaleString=function(){throw new Error("Not implemented")},e.prototype.pop=function(){throw new Error("Not implemented")},e.prototype.push=function(){for(var r=[],e=0;e<arguments.length;e++)r[e-0]=arguments[e];throw new Error("Not implemented")},e.prototype.shift=function(){throw new Error("Not implemented")},e.prototype.slice=function(r,e){throw new Error("Not implemented")},e.prototype.sort=function(r){throw new Error("Not implemented")},e.prototype.splice=function(){throw new Error("Not implemented")},e.prototype.unshift=function(){for(var r=[],e=0;e<arguments.length;e++)r[e-0]=arguments[e];throw new Error("Not implemented")},e.prototype.indexOf=function(r,e){throw new Error("Not implemented")},e.prototype.lastIndexOf=function(r,e){throw new Error("Not implemented")},e.prototype.every=function(r,e){throw new Error("Not implemented")},e.prototype.some=function(r,e){throw new Error("Not implemented")},e.prototype.forEach=function(r,e){throw new Error("Not implemented")},e.prototype.map=function(r,e){throw new Error("Not implemented")},e.prototype.filter=function(r,e){throw new Error("Not implemented")},e.prototype.reduce=function(r,e){throw new Error("Not implemented")},e.prototype.reduceRight=function(r,e){throw new Error("Not implemented")},e.prototype.remove=function(r){throw new Error("Not implemented")},e.prototype.removeWhere=function(r){throw new Error("Not implemented")},e}(r.Enumerable);r.List=t;for(var n in Array)Array.hasOwnProperty(n)&&(t[n]=Array[n]);e.prototype=Array.prototype,t.prototype=new e;for(var o in r.Enumerable.prototype)"getEnumerator"!==o&&(t.prototype[o]=r.Enumerable.prototype[o]);t.prototype.getEnumerator=function(){var r=this,e=r.length,t={moveNext:void 0,current:void 0},n=-1;return t.moveNext=function(){return n++,n>=e?(t.current=void 0,!1):(t.current=r[n],!0)},t},t.prototype.remove=function(r){return this.removeWhere(function(e){return e===r}).any()},t.prototype.removeWhere=function(r){for(var e,t=[],n=this.length-1;n>=0;n--)e=this[n],r(e,n)===!0&&(this.splice(n,1),t.push(e));return t.en().reverse()}}(exjs||(exjs={}));var exjs;!function(r){function e(r,e,n,o){return new t(r,e,n,o)}var t=function(e){function t(r,t,n,o){e.call(this),this.Source=r,o=o||function(r,e){return r>e?1:e>r?-1:0};var u=n===!0?-1:1;this.Sorter=function(r,e){return u*o(t(r),t(e))}}return __extends(t,e),t.prototype.getEnumerator=function(){var e,t=this.Source,n=this.Sorter,o=0,u={current:void 0,moveNext:function(){return e||(e=r.en(t).toArray(),e.sort(n)),u.current=void 0,!(o>=e.length)&&(u.current=e[o],o++,!0)}};return u},t.prototype.thenBy=function(r,e){return new n(this,r,(!1),e)},t.prototype.thenByDescending=function(r,e){return new n(this,r,(!0),e)},t}(r.Enumerable),n=function(r){function e(e,t,n,o){r.call(this,e,t,n,o);var u=e.Sorter,i=this.Sorter;this.Sorter=function(r,e){return u(r,e)||i(r,e)}}return __extends(e,r),e}(t),o=r.Enumerable.prototype;o.orderBy=function(r,t){return e(this,r,!1,t)},o.orderByDescending=function(r,t){return e(this,r,!0,t)},r.List&&(r.List.prototype.orderBy=r.Enumerable.prototype.orderBy,r.List.prototype.orderByDescending=r.Enumerable.prototype.orderByDescending)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n,o=1,u={current:void 0,moveNext:function(){if(2>o){if(t=t||e.en().getEnumerator(),t.moveNext())return u.current=t.current,!0;o++}return n=n||r.getEnumerator(),n.moveNext()?(u.current=n.current,!0):(u.current=void 0,!1)}};return u}r.Enumerable.prototype.prepend=function(){for(var t=this,n=[],o=0;o<arguments.length;o++)n[o-0]=arguments[o];var u=new r.Enumerable;return u.getEnumerator=function(){return e(t,n)},u},r.List&&(r.List.prototype.prepend=r.Enumerable.prototype.prepend)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e,t){var n=r-t,o={current:void 0,moveNext:function(){return n+=t,!(n>=e)&&(o.current=n,!0)}};return o}function t(t,n,o){if(t=t||0,n=n||0,t>n)throw new Error("Start cannot be greater than end.");null==o&&(o=1);var u=new r.Enumerable;return u.getEnumerator=function(){return e(t,n,o)},u}r.range=t}(exjs||(exjs={}));var exjs;!function(r){function e(e){var t,n=0,o={current:void 0,moveNext:function(){return t||(t=r.en(e).toArray(),n=t.length),n--,o.current=t[n],n>=0}};return o}r.Enumerable.prototype.reverse=function(){var t=this,n=new r.Enumerable;return n.getEnumerator=function(){return e(t)},n},r.List&&(r.List.prototype.reverse=r.Enumerable.prototype.reverse)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){if(e=e||0,0===e)return Math.round(r);var t=Math.pow(10,e);return Math.round(r*t)/t}r.round=e}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n=0,o={current:void 0,moveNext:function(){return t||(t=r.getEnumerator()),!!t.moveNext()&&(o.current=e(t.current,n),n++,!0)}};return o}function t(e,t){var n,o,u={current:void 0,moveNext:function(){for(u.current=void 0,n||(n=e.getEnumerator());!o||!o.moveNext();){if(!n.moveNext())return!1;o=r.selectorEnumerator(t(n.current))}return u.current=o.current,!0}};return u}r.Enumerable.prototype.select=function(t){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return e(n,t)},o},r.Enumerable.prototype.selectMany=function(e){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return t(n,e)},o},r.List&&(r.List.prototype.select=r.Enumerable.prototype.select,r.List.prototype.selectMany=r.Enumerable.prototype.selectMany)}(exjs||(exjs={}));var exjs;!function(r){function e(r){return Array.isArray(r)?r.en().getEnumerator():null!=r&&"function"==typeof r.getEnumerator?r.getEnumerator():null}r.selectorEnumerator=e}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n={current:void 0,moveNext:function(){if(!t){t=r.getEnumerator();for(var o=0;e>o;o++)if(!t.moveNext())return!1}return t.moveNext()?(n.current=t.current,!0):(n.current=void 0,!1)}};return n}function t(r,e){var t,n={current:void 0,moveNext:function(){if(!t){t=r.getEnumerator();for(var o=0;t.moveNext();o++)if(!e(n.current=t.current,o))return!0;return n.current=void 0,!1}return t.moveNext()?(n.current=t.current,!0):(n.current=void 0,!1)}};return n}r.Enumerable.prototype.skip=function(t){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return e(n,t)},o},r.Enumerable.prototype.skipWhile=function(e){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return t(n,e)},o},r.List&&(r.List.prototype.skip=r.Enumerable.prototype.skip,r.List.prototype.skipWhile=r.Enumerable.prototype.skipWhile)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n=0,o={current:void 0,moveNext:function(){return t||(t=r.getEnumerator()),n++,!(n>e)&&(o.current=void 0,!!t.moveNext()&&(o.current=t.current,!0))}};return o}function t(r,e){var t,n=0,o={current:void 0,moveNext:function(){return t||(t=r.getEnumerator()),t.moveNext()&&e(t.current,n)?(n++,o.current=t.current,!0):(o.current=void 0,!1)}};return o}r.Enumerable.prototype.take=function(t){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return e(n,t)},o},r.Enumerable.prototype.takeWhile=function(e){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return t(n,e)},o},r.List&&(r.List.prototype.take=r.Enumerable.prototype.take,r.List.prototype.takeWhile=r.Enumerable.prototype.takeWhile)}(exjs||(exjs={}));var exjs;!function(r){function e(e,t){var n,o=!1,u=[],i={current:void 0,moveNext:function(){if(o){if(null==n)return!1;u.push(n),n=r.selectorEnumerator(t(i.current))}else n=e.getEnumerator(),o=!0;for(;!(n&&n.moveNext()||u.length<1);)n=u.pop();return i.current=null==n?void 0:n.current,void 0!==i.current}};return i}function t(e,t,n){var o,u=!1,i=[],c={current:void 0,moveNext:function(){if(u){if(null==o)return!1;i.push(o),o=r.selectorEnumerator(t(c.current))}else o=e.getEnumerator(),u=!0;do{for(;!(o&&o.moveNext()||i.length<1);)o=i.pop();c.current=null==o?void 0:o.current}while(n(c.current));return void 0!==c.current}};return c}r.Enumerable.prototype.traverse=function(t){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return e(n,t)},o},r.Enumerable.prototype.traverseUnique=function(e,n){var o=this,u=[],i=new r.Enumerable;return n?i.getEnumerator=function(){return t(o,e,function(r){return!!u.some(function(e){return n(r,e)})||(u.push(r),!1)})}:i.getEnumerator=function(){return t(o,e,function(r){return u.indexOf(r)>-1||(u.push(r),!1)})},i},r.List&&(r.List.prototype.traverse=r.Enumerable.prototype.traverse,r.List.prototype.traverseUnique=r.Enumerable.prototype.traverseUnique)}(exjs||(exjs={}));var exjs;!function(r){function e(e,t,n){n=n||function(r,e){return r===e};var o,u,i=[],c={current:void 0,moveNext:function(){if(o||(o=r.en(e).distinct().getEnumerator()),c.current=void 0,!u&&o.moveNext())return i.push(c.current=o.current),!0;for(u=u||r.en(t).distinct().getEnumerator();u.moveNext();){for(var a=0,p=!1,s=i.length;s>a&&!p;a++)p=n(i[a],u.current);if(!p)return c.current=u.current,!0}return!1}};return c}r.Enumerable.prototype.union=function(t,n){var o=this,u=t instanceof Array?t.en():t,i=new r.Enumerable;return i.getEnumerator=function(){return e(o,u,n)},i},r.List&&(r.List.prototype.union=r.Enumerable.prototype.union)}(exjs||(exjs={}));var exjs;!function(r){function e(r,e){var t,n={current:void 0,moveNext:function(){t||(t=r.getEnumerator());for(var o;t.moveNext();)if(e(o=t.current))return n.current=o,!0;return!1}};return n}r.Enumerable.prototype.where=function(t){var n=this,o=new r.Enumerable;return o.getEnumerator=function(){return e(n,t)},o},r.List&&(r.List.prototype.where=r.Enumerable.prototype.where)}(exjs||(exjs={}));var exjs;!function(r){function e(e){var n=new r.Enumerable;return n.getEnumerator=function(){return t(e)},n}function t(r){var e=r.getEnumerator(),t={current:void 0,moveNext:void 0};return t.moveNext=function(){return e.moveNext()?(t.current=e.current,!0):(t.current=void 0,!1)},t}r.en=e}(exjs||(exjs={}));var ex=exjs.en,exjs;!function(r){function e(r,e,t){var n,o,u={current:void 0,moveNext:function(){return n||(n=r.getEnumerator()),o||(o=e.getEnumerator()),u.current=void 0,!(!n.moveNext()||!o.moveNext())&&(u.current=t(n.current,o.current),!0)}};return u}r.Enumerable.prototype.zip=function(t,n){var o=this,u=t instanceof Array?t.en():t,i=new r.Enumerable;return i.getEnumerator=function(){return e(o,u,n)},i},r.List&&(r.List.prototype.zip=r.Enumerable.prototype.zip)}(exjs||(exjs={})),Array.prototype.clone||(Array.prototype.clone=function(){return this.slice(0)}),Array.prototype.contains||(Array.prototype.contains=function(val){return this.indexOf(val)!==-1}),Array.prototype.indexOf||(Array.prototype.indexOf=function(searchElement,fromIndex){var i=fromIndex||0,j=this.length;for(i;i<j;i++)if(this[i]===searchElement)return i;return-1}),Array.prototype.indexOfTest=function(test,fromIndex){var i=fromIndex||0,j=this.length;for(i;i<j;i++)if(test(this[i]))return i;return-1},Array.prototype.insert=function(item,index){this.splice(index,0,item)},Array.prototype.last||(Array.prototype.last=function(){return this[this.length-1]}),Array.prototype.map||(Array.prototype.map=function(callback,thisArg){var T,A,k;if(null==this)throw new TypeError(" this is null or not defined");var O=Object(this),len=O.length>>>0;if("function"!=typeof callback)throw new TypeError(callback+" is not a function");for(arguments.length>1&&(T=thisArg),A=new Array(len),k=0;k<len;){var kValue,mappedValue;k in O&&(kValue=O[k],mappedValue=callback.call(T,kValue,k,O),A[k]=mappedValue),k++}return A}),Array.prototype.move=function(fromIndex,toIndex){this.splice(toIndex,0,this.splice(fromIndex,1)[0])},Array.prototype.remove=function(item){var index=this.indexOf(item);index>-1&&this.splice(index,1)},Array.prototype.removeAt=function(index){this.splice(index,1)},Math.clamp=function(value,min,max){return Math.min(Math.max(value,min),max)},Math.constrain=function(value,low,high){return Math.clamp(value,low,high)},Math.degreesToRadians=function(degrees){return Math.TAU*(degrees/360)},Math.distanceBetween=function(x1,y1,x2,y2){return Math.sqrt(Math.sq(x2-x1)+Math.sq(y2-y1))},Math.lerp=function(start,stop,amount){return start+(stop-start)*amount},Math.mag=function(a,b,c){return Math.sqrt(a*a+b*b+c*c)},Math.map=function(value,start1,stop1,start2,stop2){return start2+(stop2-start2)*((value-start1)/(stop1-start1))},Math.median=function(values){values.sort(function(a,b){return a-b});var half=Math.floor(values.length/2);return values.length%2?values[half]:(values[half-1]+values[half])/2},Math.normalise=function(num,min,max){return(num-min)/(max-min)},Math.radiansToDegrees=function(radians){return 360*radians/Math.TAU},Math.randomBetween=function(low,high){return high||(high=low,low=0),low>=high?low:low+(high-low)*Math.random()},Math.roundToDecimalPlace=function(num,dec){return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec)},Math.sq=function(n){return n*n},Math.TAU=2*Math.PI,Number.prototype.isInteger||(Number.prototype.isInteger=function(){return this%1===0}),"function"!=typeof Object.create&&(Object.create=function(o,props){function F(){}F.prototype=o;var result=new F;if("object"==typeof props)for(var prop in props)props.hasOwnProperty(prop)&&(result[prop]=props[prop].value);return result}),Object.keys||(Object.keys=function(){var hasOwnProperty=Object.prototype.hasOwnProperty,hasDontEnumBug=!{toString:null}.propertyIsEnumerable("toString"),dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],dontEnumsLength=dontEnums.length;return function(obj){if("object"!=typeof obj&&"function"!=typeof obj||null===obj)throw new TypeError("Object.keys called on non-object");var result=[];for(var prop in obj)hasOwnProperty.call(obj,prop)&&result.push(prop);if(hasDontEnumBug)for(var i=0;i<dontEnumsLength;i++)hasOwnProperty.call(obj,dontEnums[i])&&result.push(dontEnums[i]);return result}}()),String.prototype.b64_to_utf8=function(){return decodeURIComponent(escape(window.atob(this)))},String.prototype.contains=function(str){return this.indexOf(str)!==-1},String.prototype.endsWith||(String.prototype.endsWith=function(str){return this.indexOf(str,this.length-str.length)!==-1}),String.format=function(){for(var s=arguments[0],i=0;i<arguments.length-1;i++){var reg=new RegExp("\\{"+i+"\\}","gm");s=s.replace(reg,arguments[i+1])}return s},String.prototype.hashCode=function(){var i,chr,len,hash=0;if(0===this.length)return hash.toString();for(i=0,len=this.length;i<len;i++)chr=this.charCodeAt(i),hash=(hash<<5)-hash+chr,hash|=0;return hash.toString()},String.prototype.isAlphanumeric=function(){return/^[a-zA-Z0-9]*$/.test(this)},String.prototype.ltrim=function(){return this.replace(/^\s+/,"")},String.prototype.rtrim=function(){return this.replace(/\s+$/,"")},String.prototype.startsWith||(String.prototype.startsWith=function(str){return 0==this.indexOf(str)}),String.prototype.toCssClass=function(){return this.replace(/[^a-z0-9]/g,function(s){var c=s.charCodeAt(0);return 32==c?"-":c>=65&&c<=90?"_"+s.toLowerCase():"__"+("000"+c.toString(16)).slice(-4)})},String.prototype.toFileName=function(){return this.replace(/[^a-z0-9]/gi,"_").toLowerCase()},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}),String.prototype.utf8_to_b64=function(){return window.btoa(unescape(encodeURIComponent(this)))};var HTTPStatusCode;!function(HTTPStatusCode){HTTPStatusCode.CONTINUE=100,HTTPStatusCode.SWITCHING_PROTOCOLS=101,HTTPStatusCode.PROCESSING=102,HTTPStatusCode.OK=200,HTTPStatusCode.CREATED=201,HTTPStatusCode.ACCEPTED=202,HTTPStatusCode.NON_AUTHORITATIVE_INFORMATION=203,HTTPStatusCode.NO_CONTENT=204,HTTPStatusCode.RESET_CONTENT=205,HTTPStatusCode.PARTIAL_CONTENT=206,HTTPStatusCode.MULTI_STATUS=207,HTTPStatusCode.MULTIPLE_CHOICES=300,HTTPStatusCode.MOVED_PERMANENTLY=301,HTTPStatusCode.MOVED_TEMPORARILY=302,HTTPStatusCode.SEE_OTHER=303,HTTPStatusCode.NOT_MODIFIED=304,HTTPStatusCode.USE_PROXY=305,HTTPStatusCode.TEMPORARY_REDIRECT=307,HTTPStatusCode.BAD_REQUEST=400,HTTPStatusCode.UNAUTHORIZED=401,HTTPStatusCode.PAYMENT_REQUIRED=402,
+HTTPStatusCode.FORBIDDEN=403,HTTPStatusCode.NOT_FOUND=404,HTTPStatusCode.METHOD_NOT_ALLOWED=405,HTTPStatusCode.NOT_ACCEPTABLE=406,HTTPStatusCode.PROXY_AUTHENTICATION_REQUIRED=407,HTTPStatusCode.REQUEST_TIME_OUT=408,HTTPStatusCode.CONFLICT=409,HTTPStatusCode.GONE=410,HTTPStatusCode.LENGTH_REQUIRED=411,HTTPStatusCode.PRECONDITION_FAILED=412,HTTPStatusCode.REQUEST_ENTITY_TOO_LARGE=413,HTTPStatusCode.REQUEST_URI_TOO_LARGE=414,HTTPStatusCode.UNSUPPORTED_MEDIA_TYPE=415,HTTPStatusCode.REQUESTED_RANGE_NOT_SATISFIABLE=416,HTTPStatusCode.EXPECTATION_FAILED=417,HTTPStatusCode.IM_A_TEAPOT=418,HTTPStatusCode.UNPROCESSABLE_ENTITY=422,HTTPStatusCode.LOCKED=423,HTTPStatusCode.FAILED_DEPENDENCY=424,HTTPStatusCode.UNORDERED_COLLECTION=425,HTTPStatusCode.UPGRADE_REQUIRED=426,HTTPStatusCode.PRECONDITION_REQUIRED=428,HTTPStatusCode.TOO_MANY_REQUESTS=429,HTTPStatusCode.REQUEST_HEADER_FIELDS_TOO_LARGE=431,HTTPStatusCode.INTERNAL_SERVER_ERROR=500,HTTPStatusCode.NOT_IMPLEMENTED=501,HTTPStatusCode.BAD_GATEWAY=502,HTTPStatusCode.SERVICE_UNAVAILABLE=503,HTTPStatusCode.GATEWAY_TIME_OUT=504,HTTPStatusCode.HTTP_VERSION_NOT_SUPPORTED=505,HTTPStatusCode.VARIANT_ALSO_NEGOTIATES=506,HTTPStatusCode.INSUFFICIENT_STORAGE=507,HTTPStatusCode.BANDWIDTH_LIMIT_EXCEEDED=509,HTTPStatusCode.NOT_EXTENDED=510,HTTPStatusCode.NETWORK_AUTHENTICATION_REQUIRED=511}(HTTPStatusCode||(HTTPStatusCode={})),function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.manifesto=f()}}(function(){var define;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){(function(global){var Manifesto;!function(Manifesto){var StringValue=function(){function StringValue(value){this.value="",value&&(this.value=value.toLowerCase())}return StringValue.prototype.toString=function(){return this.value},StringValue}();Manifesto.StringValue=StringValue}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var AnnotationMotivation=function(_super){function AnnotationMotivation(){_super.apply(this,arguments)}return __extends(AnnotationMotivation,_super),AnnotationMotivation.prototype.bookmarking=function(){return new AnnotationMotivation(AnnotationMotivation.BOOKMARKING.toString())},AnnotationMotivation.prototype.classifying=function(){return new AnnotationMotivation(AnnotationMotivation.CLASSIFYING.toString())},AnnotationMotivation.prototype.commenting=function(){return new AnnotationMotivation(AnnotationMotivation.COMMENTING.toString())},AnnotationMotivation.prototype.describing=function(){return new AnnotationMotivation(AnnotationMotivation.DESCRIBING.toString())},AnnotationMotivation.prototype.editing=function(){return new AnnotationMotivation(AnnotationMotivation.EDITING.toString())},AnnotationMotivation.prototype.highlighting=function(){return new AnnotationMotivation(AnnotationMotivation.HIGHLIGHTING.toString())},AnnotationMotivation.prototype.identifying=function(){return new AnnotationMotivation(AnnotationMotivation.IDENTIFYING.toString())},AnnotationMotivation.prototype.linking=function(){return new AnnotationMotivation(AnnotationMotivation.LINKING.toString())},AnnotationMotivation.prototype.moderating=function(){return new AnnotationMotivation(AnnotationMotivation.MODERATING.toString())},AnnotationMotivation.prototype.painting=function(){return new AnnotationMotivation(AnnotationMotivation.PAINTING.toString())},AnnotationMotivation.prototype.questioning=function(){return new AnnotationMotivation(AnnotationMotivation.QUESTIONING.toString())},AnnotationMotivation.prototype.replying=function(){return new AnnotationMotivation(AnnotationMotivation.REPLYING.toString())},AnnotationMotivation.prototype.tagging=function(){return new AnnotationMotivation(AnnotationMotivation.TAGGING.toString())},AnnotationMotivation.prototype.transcribing=function(){return new AnnotationMotivation(AnnotationMotivation.TRANSCRIBING.toString())},AnnotationMotivation.BOOKMARKING=new AnnotationMotivation("oa:bookmarking"),AnnotationMotivation.CLASSIFYING=new AnnotationMotivation("oa:classifying"),AnnotationMotivation.COMMENTING=new AnnotationMotivation("oa:commenting"),AnnotationMotivation.DESCRIBING=new AnnotationMotivation("oa:describing"),AnnotationMotivation.EDITING=new AnnotationMotivation("oa:editing"),AnnotationMotivation.HIGHLIGHTING=new AnnotationMotivation("oa:highlighting"),AnnotationMotivation.IDENTIFYING=new AnnotationMotivation("oa:identifying"),AnnotationMotivation.LINKING=new AnnotationMotivation("oa:linking"),AnnotationMotivation.MODERATING=new AnnotationMotivation("oa:moderating"),AnnotationMotivation.PAINTING=new AnnotationMotivation("sc:painting"),AnnotationMotivation.QUESTIONING=new AnnotationMotivation("oa:questioning"),AnnotationMotivation.REPLYING=new AnnotationMotivation("oa:replying"),AnnotationMotivation.TAGGING=new AnnotationMotivation("oa:tagging"),AnnotationMotivation.TRANSCRIBING=new AnnotationMotivation("oad:transcribing"),AnnotationMotivation}(Manifesto.StringValue);Manifesto.AnnotationMotivation=AnnotationMotivation}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ElementType=function(_super){function ElementType(){_super.apply(this,arguments)}return __extends(ElementType,_super),ElementType.prototype.canvas=function(){return new ElementType(ElementType.CANVAS.toString())},ElementType.prototype.document=function(){return new ElementType(ElementType.DOCUMENT.toString())},ElementType.prototype.image=function(){return new ElementType(ElementType.IMAGE.toString())},ElementType.prototype.movingimage=function(){return new ElementType(ElementType.MOVINGIMAGE.toString())},ElementType.prototype.physicalobject=function(){return new ElementType(ElementType.PHYSICALOBJECT.toString())},ElementType.prototype.sound=function(){return new ElementType(ElementType.SOUND.toString())},ElementType.CANVAS=new ElementType("sc:canvas"),ElementType.DOCUMENT=new ElementType("foaf:document"),ElementType.IMAGE=new ElementType("dcTypes:image"),ElementType.MOVINGIMAGE=new ElementType("dctypes:movingimage"),ElementType.PHYSICALOBJECT=new ElementType("dctypes:physicalobject"),ElementType.SOUND=new ElementType("dctypes:sound"),ElementType}(Manifesto.StringValue);Manifesto.ElementType=ElementType}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var IIIFResourceType=function(_super){function IIIFResourceType(){_super.apply(this,arguments)}return __extends(IIIFResourceType,_super),IIIFResourceType.prototype.annotation=function(){return new IIIFResourceType(IIIFResourceType.ANNOTATION.toString())},IIIFResourceType.prototype.canvas=function(){return new IIIFResourceType(IIIFResourceType.CANVAS.toString())},IIIFResourceType.prototype.collection=function(){return new IIIFResourceType(IIIFResourceType.COLLECTION.toString())},IIIFResourceType.prototype.manifest=function(){return new IIIFResourceType(IIIFResourceType.MANIFEST.toString())},IIIFResourceType.prototype.range=function(){return new IIIFResourceType(IIIFResourceType.RANGE.toString())},IIIFResourceType.prototype.sequence=function(){return new IIIFResourceType(IIIFResourceType.SEQUENCE.toString())},IIIFResourceType.ANNOTATION=new IIIFResourceType("oa:annotation"),IIIFResourceType.CANVAS=new IIIFResourceType("sc:canvas"),IIIFResourceType.COLLECTION=new IIIFResourceType("sc:collection"),IIIFResourceType.MANIFEST=new IIIFResourceType("sc:manifest"),IIIFResourceType.RANGE=new IIIFResourceType("sc:range"),IIIFResourceType.SEQUENCE=new IIIFResourceType("sc:sequence"),IIIFResourceType}(Manifesto.StringValue);Manifesto.IIIFResourceType=IIIFResourceType}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ManifestType=function(_super){function ManifestType(){_super.apply(this,arguments)}return __extends(ManifestType,_super),ManifestType.prototype.empty=function(){return new ManifestType(ManifestType.EMPTY.toString())},ManifestType.prototype.manuscript=function(){return new ManifestType(ManifestType.MANUSCRIPT.toString())},ManifestType.prototype.monograph=function(){return new ManifestType(ManifestType.MONOGRAPH.toString())},ManifestType.EMPTY=new ManifestType(""),ManifestType.MANUSCRIPT=new ManifestType("manuscript"),ManifestType.MONOGRAPH=new ManifestType("monograph"),ManifestType}(Manifesto.StringValue);Manifesto.ManifestType=ManifestType}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var RenderingFormat=function(_super){function RenderingFormat(){_super.apply(this,arguments)}return __extends(RenderingFormat,_super),RenderingFormat.prototype.pdf=function(){return new RenderingFormat(RenderingFormat.PDF.toString())},RenderingFormat.prototype.doc=function(){return new RenderingFormat(RenderingFormat.DOC.toString())},RenderingFormat.prototype.docx=function(){return new RenderingFormat(RenderingFormat.DOCX.toString())},RenderingFormat.PDF=new RenderingFormat("application/pdf"),RenderingFormat.DOC=new RenderingFormat("application/msword"),RenderingFormat.DOCX=new RenderingFormat("application/vnd.openxmlformats-officedocument.wordprocessingml.document"),RenderingFormat}(Manifesto.StringValue);Manifesto.RenderingFormat=RenderingFormat}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ResourceFormat=function(_super){function ResourceFormat(){_super.apply(this,arguments)}return __extends(ResourceFormat,_super),ResourceFormat.prototype.jpgimage=function(){return new ResourceFormat(ResourceFormat.JPGIMAGE.toString())},ResourceFormat.prototype.pdf=function(){return new ResourceFormat(ResourceFormat.PDF.toString())},ResourceFormat.JPGIMAGE=new ResourceFormat("image/jpeg"),ResourceFormat.PDF=new ResourceFormat("application/pdf"),ResourceFormat}(Manifesto.StringValue);Manifesto.ResourceFormat=ResourceFormat}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ResourceType=function(_super){function ResourceType(){_super.apply(this,arguments)}return __extends(ResourceType,_super),ResourceType.prototype.image=function(){return new ResourceType(ResourceType.IMAGE.toString())},ResourceType.IMAGE=new ResourceType("dctypes:image"),ResourceType}(Manifesto.StringValue);Manifesto.ResourceType=ResourceType}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ServiceProfile=function(_super){function ServiceProfile(){_super.apply(this,arguments)}return __extends(ServiceProfile,_super),ServiceProfile.prototype.autoComplete=function(){return new ServiceProfile(ServiceProfile.AUTOCOMPLETE.toString())},ServiceProfile.prototype.iiif1ImageLevel1=function(){return new ServiceProfile(ServiceProfile.IIIF1IMAGELEVEL1.toString())},ServiceProfile.prototype.iiif1ImageLevel2=function(){return new ServiceProfile(ServiceProfile.IIIF1IMAGELEVEL2.toString())},ServiceProfile.prototype.iiif2ImageLevel1=function(){return new ServiceProfile(ServiceProfile.IIIF2IMAGELEVEL1.toString())},ServiceProfile.prototype.iiif2ImageLevel2=function(){return new ServiceProfile(ServiceProfile.IIIF2IMAGELEVEL2.toString())},ServiceProfile.prototype.ixif=function(){return new ServiceProfile(ServiceProfile.IXIF.toString())},ServiceProfile.prototype.login=function(){return new ServiceProfile(ServiceProfile.LOGIN.toString())},ServiceProfile.prototype.clickThrough=function(){return new ServiceProfile(ServiceProfile.CLICKTHROUGH.toString())},ServiceProfile.prototype.restricted=function(){return new ServiceProfile(ServiceProfile.RESTRICTED.toString())},ServiceProfile.prototype.logout=function(){return new ServiceProfile(ServiceProfile.LOGOUT.toString())},ServiceProfile.prototype.otherManifestations=function(){return new ServiceProfile(ServiceProfile.OTHERMANIFESTATIONS.toString())},ServiceProfile.prototype.searchWithin=function(){return new ServiceProfile(ServiceProfile.SEARCHWITHIN.toString())},ServiceProfile.prototype.stanfordIIIFImageCompliance1=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE1.toString())},ServiceProfile.prototype.stanfordIIIFImageCompliance2=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE2.toString())},ServiceProfile.prototype.stanfordIIIFImageConformance1=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIFIMAGECONFORMANCE1.toString())},ServiceProfile.prototype.stanfordIIIFImageConformance2=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIFIMAGECONFORMANCE2.toString())},ServiceProfile.prototype.stanfordIIIF1ImageCompliance1=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE1.toString())},ServiceProfile.prototype.stanfordIIIF1ImageCompliance2=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE2.toString())},ServiceProfile.prototype.stanfordIIIF1ImageConformance1=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE1.toString())},ServiceProfile.prototype.stanfordIIIF1ImageConformance2=function(){return new ServiceProfile(ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE2.toString())},ServiceProfile.prototype.token=function(){return new ServiceProfile(ServiceProfile.TOKEN.toString())},ServiceProfile.prototype.trackingExtensions=function(){return new ServiceProfile(ServiceProfile.TRACKINGEXTENSIONS.toString())},ServiceProfile.prototype.uiExtensions=function(){return new ServiceProfile(ServiceProfile.UIEXTENSIONS.toString())},ServiceProfile.prototype.printExtensions=function(){return new ServiceProfile(ServiceProfile.PRINTEXTENSIONS.toString())},ServiceProfile.prototype.shareExtensions=function(){return new ServiceProfile(ServiceProfile.SHAREEXTENSIONS.toString())},ServiceProfile.AUTOCOMPLETE=new ServiceProfile("http://iiif.io/api/search/0/autocomplete"),ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE0=new ServiceProfile("http://library.stanford.edu/iiif/image-api/compliance.html#level0"),ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE1=new ServiceProfile("http://library.stanford.edu/iiif/image-api/compliance.html#level1"),ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE2=new ServiceProfile("http://library.stanford.edu/iiif/image-api/compliance.html#level2"),ServiceProfile.STANFORDIIIFIMAGECONFORMANCE0=new ServiceProfile("http://library.stanford.edu/iiif/image-api/conformance.html#level0"),ServiceProfile.STANFORDIIIFIMAGECONFORMANCE1=new ServiceProfile("http://library.stanford.edu/iiif/image-api/conformance.html#level1"),ServiceProfile.STANFORDIIIFIMAGECONFORMANCE2=new ServiceProfile("http://library.stanford.edu/iiif/image-api/conformance.html#level2"),ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE0=new ServiceProfile("http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0"),ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE1=new ServiceProfile("http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level1"),ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE2=new ServiceProfile("http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2"),ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE0=new ServiceProfile("http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level0"),ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE1=new ServiceProfile("http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level1"),ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE2=new ServiceProfile("http://library.stanford.edu/iiif/image-api/1.1/conformance.html#level2"),ServiceProfile.IIIF1IMAGELEVEL0=new ServiceProfile("http://iiif.io/api/image/1/level0.json"),ServiceProfile.IIIF1IMAGELEVEL0PROFILE=new ServiceProfile("http://iiif.io/api/image/1/profiles/level0.json"),ServiceProfile.IIIF1IMAGELEVEL1=new ServiceProfile("http://iiif.io/api/image/1/level1.json"),ServiceProfile.IIIF1IMAGELEVEL1PROFILE=new ServiceProfile("http://iiif.io/api/image/1/profiles/level1.json"),ServiceProfile.IIIF1IMAGELEVEL2=new ServiceProfile("http://iiif.io/api/image/1/level2.json"),ServiceProfile.IIIF1IMAGELEVEL2PROFILE=new ServiceProfile("http://iiif.io/api/image/1/profiles/level2.json"),ServiceProfile.IIIF2IMAGELEVEL0=new ServiceProfile("http://iiif.io/api/image/2/level0.json"),ServiceProfile.IIIF2IMAGELEVEL0PROFILE=new ServiceProfile("http://iiif.io/api/image/2/profiles/level0.json"),ServiceProfile.IIIF2IMAGELEVEL1=new ServiceProfile("http://iiif.io/api/image/2/level1.json"),ServiceProfile.IIIF2IMAGELEVEL1PROFILE=new ServiceProfile("http://iiif.io/api/image/2/profiles/level1.json"),ServiceProfile.IIIF2IMAGELEVEL2=new ServiceProfile("http://iiif.io/api/image/2/level2.json"),ServiceProfile.IIIF2IMAGELEVEL2PROFILE=new ServiceProfile("http://iiif.io/api/image/2/profiles/level2.json"),ServiceProfile.IXIF=new ServiceProfile("http://wellcomelibrary.org/ld/ixif/0/alpha.json"),ServiceProfile.LOGIN=new ServiceProfile("http://iiif.io/api/auth/0/login"),ServiceProfile.CLICKTHROUGH=new ServiceProfile("http://iiif.io/api/auth/0/login/clickthrough"),ServiceProfile.RESTRICTED=new ServiceProfile("http://iiif.io/api/auth/0/login/restricted"),ServiceProfile.LOGOUT=new ServiceProfile("http://iiif.io/api/auth/0/logout"),ServiceProfile.OTHERMANIFESTATIONS=new ServiceProfile("http://iiif.io/api/otherManifestations.json"),ServiceProfile.SEARCHWITHIN=new ServiceProfile("http://iiif.io/api/search/0/search"),ServiceProfile.TOKEN=new ServiceProfile("http://iiif.io/api/auth/0/token"),ServiceProfile.TRACKINGEXTENSIONS=new ServiceProfile("http://universalviewer.io/tracking-extensions-profile"),ServiceProfile.UIEXTENSIONS=new ServiceProfile("http://universalviewer.io/ui-extensions-profile"),ServiceProfile.PRINTEXTENSIONS=new ServiceProfile("http://universalviewer.io/print-extensions-profile"),ServiceProfile.SHAREEXTENSIONS=new ServiceProfile("http://universalviewer.io/share-extensions-profile"),ServiceProfile}(Manifesto.StringValue);Manifesto.ServiceProfile=ServiceProfile}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ViewingDirection=function(_super){function ViewingDirection(){_super.apply(this,arguments)}return __extends(ViewingDirection,_super),ViewingDirection.prototype.leftToRight=function(){return new ViewingDirection(ViewingDirection.LEFTTORIGHT.toString())},ViewingDirection.prototype.rightToLeft=function(){return new ViewingDirection(ViewingDirection.RIGHTTOLEFT.toString())},ViewingDirection.prototype.topToBottom=function(){return new ViewingDirection(ViewingDirection.TOPTOBOTTOM.toString())},ViewingDirection.prototype.bottomToTop=function(){return new ViewingDirection(ViewingDirection.BOTTOMTOTOP.toString())},ViewingDirection.LEFTTORIGHT=new ViewingDirection("left-to-right"),ViewingDirection.RIGHTTOLEFT=new ViewingDirection("right-to-left"),ViewingDirection.TOPTOBOTTOM=new ViewingDirection("top-to-bottom"),ViewingDirection.BOTTOMTOTOP=new ViewingDirection("bottom-to-top"),ViewingDirection}(Manifesto.StringValue);Manifesto.ViewingDirection=ViewingDirection}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ViewingHint=function(_super){function ViewingHint(){_super.apply(this,arguments)}return __extends(ViewingHint,_super),ViewingHint.prototype.continuous=function(){return new ViewingHint(ViewingHint.CONTINUOUS.toString())},ViewingHint.prototype.empty=function(){return new ViewingHint(ViewingHint.EMPTY.toString())},ViewingHint.prototype.individuals=function(){return new ViewingHint(ViewingHint.INDIVIDUALS.toString())},ViewingHint.prototype.nonPaged=function(){return new ViewingHint(ViewingHint.NONPAGED.toString())},ViewingHint.prototype.paged=function(){return new ViewingHint(ViewingHint.PAGED.toString())},ViewingHint.prototype.top=function(){return new ViewingHint(ViewingHint.TOP.toString())},ViewingHint.CONTINUOUS=new ViewingHint("continuous"),ViewingHint.EMPTY=new ViewingHint(""),ViewingHint.INDIVIDUALS=new ViewingHint("individuals"),ViewingHint.NONPAGED=new ViewingHint("non-paged"),ViewingHint.PAGED=new ViewingHint("paged"),ViewingHint.TOP=new ViewingHint("top"),ViewingHint}(Manifesto.StringValue);Manifesto.ViewingHint=ViewingHint}(Manifesto||(Manifesto={}));var Manifesto;!function(Manifesto){var JSONLDResource=function(){function JSONLDResource(jsonld){this.__jsonld=jsonld,this.context=this.getProperty("@context"),this.id=this.getProperty("@id")}return JSONLDResource.prototype.getProperty=function(name){return this.__jsonld?this.__jsonld[name]:null},JSONLDResource}();Manifesto.JSONLDResource=JSONLDResource}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var ManifestResource=function(_super){function ManifestResource(jsonld,options){_super.call(this,jsonld),this.options=options}return __extends(ManifestResource,_super),ManifestResource.prototype.getIIIFResourceType=function(){return new Manifesto.IIIFResourceType(this.getProperty("@type"))},ManifestResource.prototype.getLabel=function(){return Manifesto.TranslationCollection.parse(this.getProperty("label"),this.options.locale)},ManifestResource.prototype.getMetadata=function(){var _metadata=this.getProperty("metadata"),metadata=[];if(!_metadata)return metadata;for(var i=0;i<_metadata.length;i++){var item=_metadata[i],metadataItem=new Manifesto.MetadataItem(this.options.locale);metadataItem.parse(item),metadata.push(metadataItem)}return metadata},ManifestResource.prototype.getRendering=function(format){var renderings=this.getRenderings();"string"!=typeof format&&(format=format.toString());for(var i=0;i<renderings.length;i++){var rendering=renderings[i];if(rendering.getFormat().toString()===format)return rendering}return null},ManifestResource.prototype.getRenderings=function(){var rendering;rendering=this.__jsonld?this.__jsonld.rendering:this.rendering;var renderings=[];if(!rendering)return renderings;_isArray(rendering)||(rendering=[rendering]);for(var i=0;i<rendering.length;i++){var r=rendering[i];renderings.push(new Manifesto.Rendering(r,this.options))}return renderings},ManifestResource.prototype.getService=function(profile){return Manifesto.Utils.getService(this,profile)},ManifestResource.prototype.getServices=function(){return Manifesto.Utils.getServices(this)},ManifestResource.prototype.isAnnotation=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.ANNOTATION.toString()},ManifestResource.prototype.isCanvas=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.CANVAS.toString()},ManifestResource.prototype.isCollection=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.COLLECTION.toString()},ManifestResource.prototype.isManifest=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.MANIFEST.toString()},ManifestResource.prototype.isRange=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.RANGE.toString()},ManifestResource.prototype.isSequence=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.SEQUENCE.toString()},ManifestResource}(Manifesto.JSONLDResource);Manifesto.ManifestResource=ManifestResource}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var Element=function(_super){function Element(jsonld,options){_super.call(this,jsonld,options)}return __extends(Element,_super),Element.prototype.getResources=function(){var resources=[];if(!this.__jsonld.resources)return resources;for(var i=0;i<this.__jsonld.resources.length;i++){var a=this.__jsonld.resources[i],annotation=new Manifesto.Annotation(a,this.options);resources.push(annotation)}return resources},Element.prototype.getType=function(){return new Manifesto.ElementType(this.getProperty("@type"))},Element}(Manifesto.ManifestResource);Manifesto.Element=Element}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},_endsWith=require("lodash.endswith"),_last=require("lodash.last");!function(Manifesto){var Canvas=function(_super){function Canvas(jsonld,options){_super.call(this,jsonld,options)}return __extends(Canvas,_super),Canvas.prototype.getCanonicalImageUri=function(w){var id,size,region="full",rotation=0,quality="default",width=w;if(this.externalResource&&this.externalResource.data&&this.externalResource.data["@id"])id=this.externalResource.data["@id"],width||(width=this.externalResource.data.width),this.externalResource.data["@context"]&&(this.externalResource.data["@context"].indexOf("/1.0/context.json")>-1||this.externalResource.data["@context"].indexOf("/1.1/context.json")>-1||this.externalResource.data["@context"].indexOf("/1/context.json")>-1)&&(quality="native");else{var images=this.getImages();if(images&&images.length){var firstImage=images[0],resource=firstImage.getResource(),services=resource.getServices();if(width||(width=resource.getWidth()),services.length){var service=services[0];id=service.id,quality=Manifesto.Utils.getImageQuality(service.getProfile())}}if(!id)return"undefined"==typeof this.__jsonld.thumbnail?null:this.__jsonld.thumbnail}size=width+",";var uri=[id,region,size,rotation,quality+".jpg"].join("/");return uri},Canvas.prototype.getImages=function(){var images=[];if(!this.__jsonld.images)return images;for(var i=0;i<this.__jsonld.images.length;i++){var a=this.__jsonld.images[i],annotation=new Manifesto.Annotation(a,this.options);images.push(annotation)}return images},Canvas.prototype.getIndex=function(){return this.getProperty("index")},Canvas.prototype.getWidth=function(){return this.getProperty("width")},Canvas.prototype.getHeight=function(){return this.getProperty("height")},Canvas}(Manifesto.Element);Manifesto.Canvas=Canvas}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},_assign=require("lodash.assign");!function(Manifesto){var IIIFResource=function(_super){function IIIFResource(jsonld,options){_super.call(this,jsonld,options),this.index=-1,this.isLoaded=!1;var defaultOptions={defaultLabel:"-",locale:"en-GB",resource:this,pessimisticAccessControl:!1};this.options=_assign(defaultOptions,options)}return __extends(IIIFResource,_super),IIIFResource.prototype.getAttribution=function(){var attribution=this.getProperty("attribution");return attribution?Manifesto.TranslationCollection.parse(attribution,this.options.locale):[]},IIIFResource.prototype.getDescription=function(){var description=this.getProperty("description");return description?Manifesto.TranslationCollection.parse(description,this.options.locale):[]},IIIFResource.prototype.getIIIFResourceType=function(){return new Manifesto.IIIFResourceType(this.getProperty("@type"))},IIIFResource.prototype.getLogo=function(){var logo=this.getProperty("logo");return logo?_isString(logo)?logo:logo["@id"]:null},IIIFResource.prototype.getLicense=function(){return Manifesto.Utils.getLocalisedValue(this.getProperty("license"),this.options.locale)},IIIFResource.prototype.getNavDate=function(){return new Date(this.getProperty("navDate"))},IIIFResource.prototype.getRelated=function(){return this.getProperty("related")},IIIFResource.prototype.getSeeAlso=function(){return this.getProperty("seeAlso")},IIIFResource.prototype.getLabel=function(){var label=this.getProperty("label");return label?Manifesto.TranslationCollection.parse(label,this.options.locale):[]},IIIFResource.prototype.getDefaultTree=function(){return this.defaultTree=new Manifesto.TreeNode("root"),this.defaultTree.data=this,this.defaultTree},IIIFResource.prototype.isCollection=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.COLLECTION.toString()},IIIFResource.prototype.isManifest=function(){return this.getIIIFResourceType().toString()===Manifesto.IIIFResourceType.MANIFEST.toString()},IIIFResource.prototype.load=function(){var that=this;return new Promise(function(resolve,reject){if(that.isLoaded)resolve(that);else{var options=that.options;options.navDate=that.getNavDate(),Manifesto.Utils.loadResource(that.__jsonld["@id"]).then(function(data){that.parentLabel=Manifesto.TranslationCollection.getValue(that.getLabel(),options.locale);var parsed=Manifesto.Deserialiser.parse(data,options);that=_assign(that,parsed),that.index=options.index,resolve(that)})}})},IIIFResource}(Manifesto.ManifestResource);Manifesto.IIIFResource=IIIFResource}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},_isArray=require("lodash.isarray"),_map=require("lodash.map");!function(Manifesto){var Manifest=function(_super){function Manifest(jsonld,options){if(_super.call(this,jsonld,options),this.index=0,this._allRanges=null,this._sequences=null,this._topRanges=[],this.__jsonld.structures&&this.__jsonld.structures.length)for(var topRanges=this._getTopRanges(),i=0;i<topRanges.length;i++){var range=topRanges[i];this._parseRanges(range,String(i))}}return __extends(Manifest,_super),Manifest.prototype.getDefaultTree=function(){if(_super.prototype.getDefaultTree.call(this),this.defaultTree.data.type=Manifesto.TreeNodeType.MANIFEST.toString(),!this.isLoaded)return this.defaultTree;
+var topRanges=this.getTopRanges();return topRanges.length&&topRanges[0].getTree(this.defaultTree),Manifesto.Utils.generateTreeNodeIds(this.defaultTree),this.defaultTree},Manifest.prototype._getTopRanges=function(){var topRanges=[];if(this.__jsonld.structures&&this.__jsonld.structures.length){for(var i=0;i<this.__jsonld.structures.length;i++){var json=this.__jsonld.structures[i];json.viewingHint===Manifesto.ViewingHint.TOP.toString()&&topRanges.push(json)}if(!topRanges.length){var range={};range.ranges=this.__jsonld.structures,topRanges.push(range)}}return topRanges},Manifest.prototype.getTopRanges=function(){return this._topRanges},Manifest.prototype._getRangeById=function(id){if(this.__jsonld.structures&&this.__jsonld.structures.length)for(var i=0;i<this.__jsonld.structures.length;i++){var r=this.__jsonld.structures[i];if(r["@id"]===id)return r}return null},Manifest.prototype._parseRangeCanvas=function(json,range){},Manifest.prototype._parseRanges=function(r,path,parentRange){var range,id;if(_isString(r)&&(id=r,r=this._getRangeById(id)),!r)return void console.warn("Range:",id,"does not exist");if(range=new Manifesto.Range(r,this.options),range.parentRange=parentRange,range.path=path,parentRange?parentRange.members.push(range):this._topRanges.push(range),r.ranges)for(var i=0;i<r.ranges.length;i++)this._parseRanges(r.ranges[i],path+"/"+i,range);if(r.members)for(var _loop_1=function(i){var child=r.members[i];return r.members.en().where(function(m){return m.id===child.id}).first()?"continue":void("sc:range"===child["@type"].toLowerCase()&&this_1._parseRanges(child,path+"/"+i,range))},this_1=this,i=0;i<r.members.length;i++){_loop_1(i)}},Manifest.prototype.getAllRanges=function(){if(null!=this._allRanges)return this._allRanges;this._allRanges=[];for(var topRanges=this.getTopRanges(),i=0;i<topRanges.length;i++){var topRange=topRanges[i];topRange.id&&this._allRanges.push(topRange);var subRanges=topRange.getRanges();this._allRanges=this._allRanges.concat(subRanges.en().traverseUnique(function(range){return range.getRanges()}).toArray())}return this._allRanges},Manifest.prototype.getRangeById=function(id){for(var ranges=this.getAllRanges(),i=0;i<ranges.length;i++){var range=ranges[i];if(range.id===id)return range}return null},Manifest.prototype.getRangeByPath=function(path){for(var ranges=this.getAllRanges(),i=0;i<ranges.length;i++){var range=ranges[i];if(range.path===path)return range}return null},Manifest.prototype.getSequences=function(){if(null!=this._sequences)return this._sequences;this._sequences=[];var children=this.__jsonld.mediaSequences||this.__jsonld.sequences;if(children)for(var i=0;i<children.length;i++){var s=children[i],sequence=new Manifesto.Sequence(s,this.options);this._sequences.push(sequence)}return this._sequences},Manifest.prototype.getSequenceByIndex=function(sequenceIndex){return this.getSequences()[sequenceIndex]},Manifest.prototype.getTotalSequences=function(){return this.getSequences().length},Manifest.prototype.getManifestType=function(){var service=this.getService(Manifesto.ServiceProfile.UIEXTENSIONS);return service?new Manifesto.ManifestType(service.getProperty("manifestType")):new Manifesto.ManifestType("")},Manifest.prototype.getTrackingLabel=function(){var service=this.getService(Manifesto.ServiceProfile.TRACKINGEXTENSIONS);return service?service.getProperty("trackingLabel"):""},Manifest.prototype.isMultiSequence=function(){return this.getTotalSequences()>1},Manifest.prototype.isPagingEnabled=function(){return this.getViewingHint().toString()===Manifesto.ViewingHint.PAGED.toString()},Manifest.prototype.getViewingDirection=function(){return this.getProperty("viewingDirection")?new Manifesto.ViewingDirection(this.getProperty("viewingDirection")):Manifesto.ViewingDirection.LEFTTORIGHT},Manifest.prototype.getViewingHint=function(){return this.getProperty("viewingHint")?new Manifesto.ViewingHint(this.getProperty("viewingHint")):Manifesto.ViewingHint.EMPTY},Manifest}(Manifesto.IIIFResource);Manifesto.Manifest=Manifest}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var Collection=function(_super){function Collection(jsonld,options){_super.call(this,jsonld,options),this.members=[],this._collections=null,this._manifests=null,jsonld.__collection=this}return __extends(Collection,_super),Collection.prototype.getCollections=function(){return this._collections?this._collections:this._collections=this.members.en().where(function(m){return m.isCollection()}).toArray()},Collection.prototype.getManifests=function(){return this._manifests?this._manifests:this._manifests=this.members.en().where(function(m){return m.isManifest()}).toArray()},Collection.prototype.getCollectionByIndex=function(collectionIndex){var collection=this.getCollections()[collectionIndex];return collection.options.index=collectionIndex,collection.load()},Collection.prototype.getManifestByIndex=function(manifestIndex){var manifest=this.getManifests()[manifestIndex];return manifest.options.index=manifestIndex,manifest.load()},Collection.prototype.getTotalCollections=function(){return this.getCollections().length},Collection.prototype.getTotalManifests=function(){return this.getManifests().length},Collection.prototype.getTotalMembers=function(){return this.members.length},Collection.prototype.getDefaultTree=function(){return _super.prototype.getDefaultTree.call(this),this.defaultTree.data.type=Manifesto.TreeNodeType.COLLECTION.toString(),this._parseManifests(this),this._parseCollections(this),Manifesto.Utils.generateTreeNodeIds(this.defaultTree),this.defaultTree},Collection.prototype._parseManifests=function(parentCollection){if(parentCollection.getManifests()&&parentCollection.getManifests().length)for(var i=0;i<parentCollection.getManifests().length;i++){var manifest=parentCollection.getManifests()[i],tree=manifest.getDefaultTree();tree.label=manifest.parentLabel||Manifesto.TranslationCollection.getValue(manifest.getLabel(),this.options.locale)||"manifest "+(i+1),tree.navDate=manifest.getNavDate(),tree.data.id=manifest.id,tree.data.type=Manifesto.TreeNodeType.MANIFEST.toString(),parentCollection.defaultTree.addNode(tree)}},Collection.prototype._parseCollections=function(parentCollection){if(parentCollection.getCollections()&&parentCollection.getCollections().length)for(var i=0;i<parentCollection.getCollections().length;i++){var collection=parentCollection.getCollections()[i],tree=collection.getDefaultTree();tree.label=collection.parentLabel||Manifesto.TranslationCollection.getValue(collection.getLabel(),this.options.locale)||"collection "+(i+1),tree.navDate=collection.getNavDate(),tree.data.id=collection.id,tree.data.type=Manifesto.TreeNodeType.COLLECTION.toString(),parentCollection.defaultTree.addNode(tree),this._parseCollections(collection)}},Collection}(Manifesto.IIIFResource);Manifesto.Collection=Collection}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var Range=function(_super){function Range(jsonld,options){_super.call(this,jsonld,options),this._canvases=null,this._ranges=null,this.members=[]}return __extends(Range,_super),Range.prototype.getCanvasIds=function(){return this.__jsonld.canvases?this.__jsonld.canvases:[]},Range.prototype.getCanvases=function(){return this._canvases?this._canvases:this._canvases=this.members.en().where(function(m){return m.isCanvas()}).toArray()},Range.prototype.getRanges=function(){return this._ranges?this._ranges:this._ranges=this.members.en().where(function(m){return m.isRange()}).toArray()},Range.prototype.getViewingDirection=function(){return this.getProperty("viewingDirection")?new Manifesto.ViewingDirection(this.getProperty("viewingDirection")):null},Range.prototype.getViewingHint=function(){return this.getProperty("viewingHint")?new Manifesto.ViewingHint(this.getProperty("viewingHint")):null},Range.prototype.getTree=function(treeRoot){treeRoot.data=this,this.treeNode=treeRoot;var ranges=this.getRanges();if(ranges&&ranges.length)for(var i=0;i<ranges.length;i++){var range=ranges[i],node=new Manifesto.TreeNode;treeRoot.addNode(node),this._parseTreeNode(node,range)}return Manifesto.Utils.generateTreeNodeIds(treeRoot),treeRoot},Range.prototype._parseTreeNode=function(node,range){node.label=Manifesto.TranslationCollection.getValue(range.getLabel(),this.options.locale),node.data=range,node.data.type=Manifesto.TreeNodeType.RANGE.toString(),range.treeNode=node;var ranges=range.getRanges();if(ranges&&ranges.length)for(var i=0;i<ranges.length;i++){var childRange=ranges[i],childNode=new Manifesto.TreeNode;node.addNode(childNode),this._parseTreeNode(childNode,childRange)}},Range}(Manifesto.ManifestResource);Manifesto.Range=Range}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var Rendering=function(_super){function Rendering(jsonld,options){_super.call(this,jsonld,options)}return __extends(Rendering,_super),Rendering.prototype.getFormat=function(){return new Manifesto.RenderingFormat(this.getProperty("format"))},Rendering}(Manifesto.ManifestResource);Manifesto.Rendering=Rendering}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},_last=require("lodash.last");!function(Manifesto){var Sequence=function(_super){function Sequence(jsonld,options){_super.call(this,jsonld,options),this.canvases=null}return __extends(Sequence,_super),Sequence.prototype.getCanvases=function(){if(null!=this.canvases)return this.canvases;this.canvases=[];var children=this.__jsonld.elements||this.__jsonld.canvases;if(children)for(var i=0;i<children.length;i++){var c=children[i],canvas=new Manifesto.Canvas(c,this.options);canvas.index=i,this.canvases.push(canvas)}return this.canvases},Sequence.prototype.getCanvasById=function(id){for(var i=0;i<this.getTotalCanvases();i++){var canvas=this.getCanvasByIndex(i);if(canvas.id===id)return canvas}return null},Sequence.prototype.getCanvasByIndex=function(canvasIndex){return this.getCanvases()[canvasIndex]},Sequence.prototype.getCanvasIndexById=function(id){for(var i=0;i<this.getTotalCanvases();i++){var canvas=this.getCanvasByIndex(i);if(canvas.id===id)return i}return null},Sequence.prototype.getCanvasIndexByLabel=function(label,foliated){label=label.trim(),isNaN(label)||(label=parseInt(label,10).toString(),foliated&&(label+="r"));for(var match,regExp,regStr,labelPart1,labelPart2,doublePageRegExp=/(\d*)\D+(\d*)/,i=0;i<this.getTotalCanvases();i++){var canvas=this.getCanvasByIndex(i);if(Manifesto.TranslationCollection.getValue(canvas.getLabel(),this.options.locale)===label)return i;if(match=doublePageRegExp.exec(label),match&&(labelPart1=match[1],labelPart2=match[2],labelPart2&&(regStr="^"+labelPart1+"\\D+"+labelPart2+"$",regExp=new RegExp(regStr),regExp.test(canvas.getLabel()))))return i}return-1},Sequence.prototype.getLastCanvasLabel=function(alphanumeric){for(var i=this.getTotalCanvases()-1;i>=0;i--){var canvas=this.getCanvasByIndex(i),label=Manifesto.TranslationCollection.getValue(canvas.getLabel(),this.options.locale);if(alphanumeric){var regExp=/^[a-zA-Z0-9]*$/;if(regExp.test(label))return label}else if(label)return label}return this.options.defaultLabel},Sequence.prototype.getLastPageIndex=function(){return this.getTotalCanvases()-1},Sequence.prototype.getNextPageIndex=function(canvasIndex,pagingEnabled){var index;if(pagingEnabled){var indices=this.getPagedIndices(canvasIndex);index=this.getViewingDirection().toString()===Manifesto.ViewingDirection.RIGHTTOLEFT.toString()?indices[0]+1:_last(indices)+1}else index=canvasIndex+1;return index>this.getLastPageIndex()?-1:index},Sequence.prototype.getPagedIndices=function(canvasIndex,pagingEnabled){var indices=[];return pagingEnabled?(indices=this.isFirstCanvas(canvasIndex)||this.isLastCanvas(canvasIndex)?[canvasIndex]:canvasIndex%2?[canvasIndex,canvasIndex+1]:[canvasIndex-1,canvasIndex],this.getViewingDirection().toString()===Manifesto.ViewingDirection.RIGHTTOLEFT.toString()&&(indices=indices.reverse())):indices.push(canvasIndex),indices},Sequence.prototype.getPrevPageIndex=function(canvasIndex,pagingEnabled){var index;if(pagingEnabled){var indices=this.getPagedIndices(canvasIndex);index=this.getViewingDirection().toString()===Manifesto.ViewingDirection.RIGHTTOLEFT.toString()?_last(indices)-1:indices[0]-1}else index=canvasIndex-1;return index},Sequence.prototype.getStartCanvasIndex=function(){var startCanvas=this.getStartCanvas();if(startCanvas)for(var i=0;i<this.getTotalCanvases();i++){var canvas=this.getCanvasByIndex(i);if(canvas.id===startCanvas)return i}return 0},Sequence.prototype.getThumbs=function(width,height){for(var thumbs=[],totalCanvases=this.getTotalCanvases(),i=0;i<totalCanvases;i++){var canvas=this.getCanvasByIndex(i);thumbs.push(new Manifesto.Thumb(width,canvas))}return thumbs},Sequence.prototype.getStartCanvas=function(){return this.getProperty("startCanvas")},Sequence.prototype.getTotalCanvases=function(){return this.getCanvases().length},Sequence.prototype.getViewingDirection=function(){return this.getProperty("viewingDirection")?new Manifesto.ViewingDirection(this.getProperty("viewingDirection")):this.options.resource.getViewingDirection?this.options.resource.getViewingDirection():Manifesto.ViewingDirection.LEFTTORIGHT},Sequence.prototype.getViewingHint=function(){return this.getProperty("viewingHint")?new Manifesto.ViewingHint(this.getProperty("viewingHint")):Manifesto.ViewingHint.EMPTY},Sequence.prototype.isCanvasIndexOutOfRange=function(canvasIndex){return canvasIndex>this.getTotalCanvases()-1},Sequence.prototype.isFirstCanvas=function(canvasIndex){return 0===canvasIndex},Sequence.prototype.isLastCanvas=function(canvasIndex){return canvasIndex===this.getTotalCanvases()-1},Sequence.prototype.isMultiCanvas=function(){return this.getTotalCanvases()>1},Sequence.prototype.isPagingEnabled=function(){return this.getViewingHint().toString()===Manifesto.ViewingHint.PAGED.toString()},Sequence.prototype.isTotalCanvasesEven=function(){return this.getTotalCanvases()%2===0},Sequence}(Manifesto.ManifestResource);Manifesto.Sequence=Sequence}(Manifesto||(Manifesto={}));var Manifesto,_isString=require("lodash.isstring");!function(Manifesto){var Deserialiser=function(){function Deserialiser(){}return Deserialiser.parse=function(manifest,options){return this.parseJson(JSON.parse(manifest),options)},Deserialiser.parseJson=function(json,options){var resource;switch(options&&options.navDate&&!isNaN(options.navDate.getTime())&&(json.navDate=options.navDate.toString()),json["@type"]){case"sc:Collection":resource=this.parseCollection(json,options);break;case"sc:Manifest":resource=this.parseManifest(json,options);break;default:return null}return resource.isLoaded=!0,resource},Deserialiser.parseCollection=function(json,options){var collection=new Manifesto.Collection(json,options);return options?collection.index=options.index||0:collection.index=0,this.parseCollections(collection,options),this.parseManifests(collection,options),this.parseMembers(collection,options),collection},Deserialiser.parseCollections=function(collection,options){var children=collection.__jsonld.collections;if(children)for(var i=0;i<children.length;i++){options&&(options.index=i);var child=this.parseCollection(children[i],options);child.index=i,child.parentCollection=collection,collection.members.push(child)}},Deserialiser.parseManifest=function(json,options){var manifest=new Manifesto.Manifest(json,options);return manifest},Deserialiser.parseManifests=function(collection,options){var children=collection.__jsonld.manifests;if(children)for(var i=0;i<children.length;i++){var child=this.parseManifest(children[i],options);child.index=i,child.parentCollection=collection,collection.members.push(child)}},Deserialiser.parseMember=function(json,options){return"sc:manifest"===json["@type"].toLowerCase()?this.parseManifest(json,options):"sc:collection"===json["@type"].toLowerCase()?this.parseCollection(json,options):void 0},Deserialiser.parseMembers=function(collection,options){var children=collection.__jsonld.members;if(children)for(var i=0;i<children.length;i++){options&&(options.index=i);var child=this.parseMember(children[i],options);collection.members.en().where(function(m){return m.id===child.id}).first()||(child.index=i,child.parentCollection=collection,collection.members.push(child))}},Deserialiser}();Manifesto.Deserialiser=Deserialiser;var Serialiser=function(){function Serialiser(){}return Serialiser.serialise=function(manifest){return""},Serialiser}();Manifesto.Serialiser=Serialiser}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},_endsWith=require("lodash.endswith"),_isArray=require("lodash.isarray");!function(Manifesto){var Service=function(_super){function Service(jsonld,options){_super.call(this,jsonld,options)}return __extends(Service,_super),Service.prototype.getProfile=function(){var profile=this.getProperty("profile");return profile||(profile=this.getProperty("dcterms:conformsTo")),_isArray(profile)?new Manifesto.ServiceProfile(profile[0]):new Manifesto.ServiceProfile(profile)},Service.prototype.getDescription=function(){return Manifesto.Utils.getLocalisedValue(this.getProperty("description"),this.options.locale)},Service.prototype.getInfoUri=function(){var infoUri=this.id;return _endsWith(infoUri,"/")||(infoUri+="/"),infoUri+="info.json"},Service}(Manifesto.ManifestResource);Manifesto.Service=Service}(Manifesto||(Manifesto={}));var Manifesto;!function(Manifesto){var Thumb=function(){function Thumb(width,canvas){this.data=canvas,this.index=canvas.index,this.width=width;var heightRatio=canvas.getHeight()/canvas.getWidth();heightRatio?this.height=Math.floor(this.width*heightRatio):this.height=width,this.uri=canvas.getCanonicalImageUri(width),this.label=Manifesto.TranslationCollection.getValue(canvas.getLabel())}return Thumb}();Manifesto.Thumb=Thumb}(Manifesto||(Manifesto={}));var Manifesto;!function(Manifesto){var TreeNode=function(){function TreeNode(label,data){this.label=label,this.data=data||{},this.nodes=[]}return TreeNode.prototype.addNode=function(node){this.nodes.push(node),node.parentNode=this},TreeNode.prototype.isCollection=function(){return this.data.type===Manifesto.TreeNodeType.COLLECTION.toString()},TreeNode.prototype.isManifest=function(){return this.data.type===Manifesto.TreeNodeType.MANIFEST.toString()},TreeNode.prototype.isRange=function(){return this.data.type===Manifesto.TreeNodeType.RANGE.toString()},TreeNode}();Manifesto.TreeNode=TreeNode}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var TreeNodeType=function(_super){function TreeNodeType(){_super.apply(this,arguments)}return __extends(TreeNodeType,_super),TreeNodeType.prototype.collection=function(){return new TreeNodeType(TreeNodeType.COLLECTION.toString())},TreeNodeType.prototype.manifest=function(){return new TreeNodeType(TreeNodeType.MANIFEST.toString())},TreeNodeType.prototype.range=function(){return new TreeNodeType(TreeNodeType.RANGE.toString())},TreeNodeType.COLLECTION=new TreeNodeType("sc:collection"),TreeNodeType.MANIFEST=new TreeNodeType("sc:manifest"),TreeNodeType.RANGE=new TreeNodeType("sc:range"),TreeNodeType}(Manifesto.StringValue);Manifesto.TreeNodeType=TreeNodeType}(Manifesto||(Manifesto={}));var Manifesto,http=require("http"),https=require("https"),url=require("url");!function(Manifesto){var Utils=function(){function Utils(){}return Utils.getImageQuality=function(profile){var p=profile.toString();return p===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE1.toString()||p===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE2.toString()||p===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE1.toString()||p===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE2.toString()||p===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE1.toString()||p===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE2.toString()||p===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE1.toString()||p===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE2.toString()||p===Manifesto.ServiceProfile.IIIF1IMAGELEVEL1.toString()||p===Manifesto.ServiceProfile.IIIF1IMAGELEVEL1PROFILE.toString()||p===Manifesto.ServiceProfile.IIIF1IMAGELEVEL2.toString()||p===Manifesto.ServiceProfile.IIIF1IMAGELEVEL2PROFILE.toString()?"native":"default"},Utils.getInexactLocale=function(locale){return locale.indexOf("-")!==-1?locale.substr(0,locale.indexOf("-")):locale},Utils.getLocalisedValue=function(resource,locale){if(!_isArray(resource))return resource;for(var i=0;i<resource.length;i++){var value=resource[i],language=value["@language"];if(locale===language)return value["@value"]}for(var match=locale.substr(0,locale.indexOf("-")),i=0;i<resource.length;i++){var value=resource[i],language=value["@language"];if(language===match)return value["@value"]}return null},Utils.generateTreeNodeIds=function(treeNode,index){void 0===index&&(index=0);var id;id=treeNode.parentNode?treeNode.parentNode.id+"-"+index:"0",treeNode.id=id;for(var i=0;i<treeNode.nodes.length;i++){var n=treeNode.nodes[i];Utils.generateTreeNodeIds(n,i)}},Utils.isImageProfile=function(profile){return profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL0.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL0PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL1.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL1PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL2.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL2PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL0.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL0PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL1.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL1PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL2.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL2PROFILE.toString()},Utils.isLevel0ImageProfile=function(profile){return profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE0.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL0.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL0PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL0.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL0PROFILE.toString()},Utils.isLevel1ImageProfile=function(profile){return profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE1.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL1.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL1PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL1.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL1PROFILE.toString()},Utils.isLevel2ImageProfile=function(profile){return profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECOMPLIANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECOMPLIANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIFIMAGECONFORMANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.STANFORDIIIF1IMAGECONFORMANCE2.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL2.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF1IMAGELEVEL2PROFILE.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL2.toString()||profile.toString()===Manifesto.ServiceProfile.IIIF2IMAGELEVEL2PROFILE.toString()},Utils.loadResource=function(uri){return new Promise(function(resolve,reject){var request,u=url.parse(uri),opts={host:u.hostname,port:u.port,path:u.path,method:"GET",withCredentials:!1};request="https:"===u.protocol?https.request(opts,function(response){var result="";response.on("data",function(chunk){result+=chunk}),response.on("end",function(){resolve(result)})}):http.request(opts,function(response){var result="";response.on("data",function(chunk){result+=chunk}),response.on("end",function(){resolve(result)})}),request.on("error",function(error){reject(error)}),request.end()})},Utils.loadExternalResource=function(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,getStoredAccessToken,handleResourceResponse,options){return new Promise(function(resolve,reject){options&&options.pessimisticAccessControl?resource.getData().then(function(){resource.isAccessControlled()?resource.clickThroughService?resolve(clickThrough(resource)):resource.restrictedService?resolve(restricted(resource)):login(resource).then(function(){getAccessToken(resource,!0).then(function(token){resource.getData(token).then(function(){resolve(handleResourceResponse(resource))})["catch"](function(message){reject(Utils.createInternalServerError(message))})})["catch"](function(message){reject(Utils.createInternalServerError(message))})})["catch"](function(message){reject(Utils.createInternalServerError(message))}):resolve(resource)})["catch"](function(message){reject(Utils.createInternalServerError(message))}):getStoredAccessToken(resource,tokenStorageStrategy).then(function(storedAccessToken){storedAccessToken?resource.getData(storedAccessToken).then(function(){resource.status===HTTPStatusCode.OK?resolve(handleResourceResponse(resource)):Utils.authorize(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,getStoredAccessToken).then(function(){resolve(handleResourceResponse(resource))})["catch"](function(error){reject(resource.restrictedService?Utils.createRestrictedError():Utils.createAuthorizationFailedError())})})["catch"](function(error){reject(Utils.createAuthorizationFailedError())}):Utils.authorize(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,getStoredAccessToken).then(function(){resolve(handleResourceResponse(resource))})["catch"](function(error){reject(Utils.createAuthorizationFailedError())})})["catch"](function(error){reject(Utils.createAuthorizationFailedError())})})},Utils.createError=function(name,message){var error=new Error;return error.message=message,error.name=name,error},Utils.createAuthorizationFailedError=function(){return Utils.createError(manifesto.StatusCodes.AUTHORIZATION_FAILED.toString(),"Authorization failed")},Utils.createRestrictedError=function(){return Utils.createError(manifesto.StatusCodes.RESTRICTED.toString(),"Restricted")},Utils.createInternalServerError=function(message){return Utils.createError(manifesto.StatusCodes.INTERNAL_SERVER_ERROR.toString(),message)},Utils.loadExternalResources=function(resources,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,getStoredAccessToken,handleResourceResponse,options){return new Promise(function(resolve,reject){var promises=_map(resources,function(resource){return Utils.loadExternalResource(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,getStoredAccessToken,handleResourceResponse,options)});Promise.all(promises).then(function(){resolve(resources)})["catch"](function(error){reject(error)})})},Utils.authorize=function(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,getStoredAccessToken){return new Promise(function(resolve,reject){resource.getData().then(function(){resource.isAccessControlled()?getStoredAccessToken(resource,tokenStorageStrategy).then(function(storedAccessToken){storedAccessToken?resource.getData(storedAccessToken).then(function(){resource.status===HTTPStatusCode.OK?resolve(resource):Utils.showAuthInteraction(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,resolve,reject)})["catch"](function(message){reject(Utils.createInternalServerError(message))}):getAccessToken(resource,!1).then(function(accessToken){accessToken?storeAccessToken(resource,accessToken,tokenStorageStrategy).then(function(){resource.getData(accessToken).then(function(){resource.status===HTTPStatusCode.OK?resolve(resource):Utils.showAuthInteraction(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,resolve,reject)})["catch"](function(message){reject(Utils.createInternalServerError(message))})})["catch"](function(message){reject(Utils.createInternalServerError(message))}):Utils.showAuthInteraction(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,resolve,reject)})})["catch"](function(message){reject(Utils.createInternalServerError(message))}):resolve(resource)})})},Utils.showAuthInteraction=function(resource,tokenStorageStrategy,clickThrough,restricted,login,getAccessToken,storeAccessToken,resolve,reject){resource.status!==HTTPStatusCode.MOVED_TEMPORARILY||resource.isResponseHandled?resource.restrictedService?resolve(restricted(resource)):resource.clickThroughService&&!resource.isResponseHandled?clickThrough(resource).then(function(){getAccessToken(resource,!0).then(function(accessToken){storeAccessToken(resource,accessToken,tokenStorageStrategy).then(function(){resource.getData(accessToken).then(function(){resolve(resource)})["catch"](function(message){reject(Utils.createInternalServerError(message))})})["catch"](function(message){reject(Utils.createInternalServerError(message));
+})})["catch"](function(message){reject(Utils.createInternalServerError(message))})}):login(resource).then(function(){getAccessToken(resource,!0).then(function(accessToken){storeAccessToken(resource,accessToken,tokenStorageStrategy).then(function(){resource.getData(accessToken).then(function(){resolve(resource)})["catch"](function(message){reject(Utils.createInternalServerError(message))})})["catch"](function(message){reject(Utils.createInternalServerError(message))})})["catch"](function(message){reject(Utils.createInternalServerError(message))})}):resolve(resource)},Utils.getService=function(resource,profile){var services=this.getServices(resource);"string"!=typeof profile&&(profile=profile.toString());for(var i=0;i<services.length;i++){var service=services[i];if(service.getProfile().toString()===profile)return service}return null},Utils.getResourceById=function(parentResource,id){return[parentResource.__jsonld].en().traverseUnique(function(x){return Utils.getAllArrays(x)}).first(function(r){return r["@id"]===id})},Utils.getAllArrays=function(obj){var all=[].en();if(!obj)return all;for(var key in obj){var val=obj[key];_isArray(val)&&(all=all.concat(val))}return all},Utils.getServices=function(resource){var service;service=resource.__jsonld?resource.__jsonld.service:resource.service;var services=[];if(!service)return services;_isArray(service)||(service=[service]);for(var i=0;i<service.length;i++){var s=service[i];if(_isString(s)){var r=this.getResourceById(resource.options.resource,s);r&&services.push(new Manifesto.Service(r.__jsonld||r,resource.options))}else services.push(new Manifesto.Service(s,resource.options))}return services},Utils}();Manifesto.Utils=Utils}(Manifesto||(Manifesto={}));var Manifesto;!function(Manifesto){var MetadataItem=function(){function MetadataItem(defaultLocale){this.defaultLocale=defaultLocale}return MetadataItem.prototype.parse=function(resource){this.resource=resource,this.label=Manifesto.TranslationCollection.parse(this.resource.label,this.defaultLocale),this.value=Manifesto.TranslationCollection.parse(this.resource.value,this.defaultLocale)},MetadataItem.prototype.getLabel=function(){return this.label?Manifesto.TranslationCollection.getValue(this.label,this.defaultLocale):null},MetadataItem.prototype.setLabel=function(value){var _this=this;if(this.label&&this.label.length){var t=this.label.en().where(function(x){return x.locale===_this.defaultLocale||x.locale===Manifesto.Utils.getInexactLocale(_this.defaultLocale)}).first();t&&(t.value=value)}},MetadataItem.prototype.getValue=function(){if(this.value){var locale=this.defaultLocale;return this.label.length&&this.label[0].locale&&(locale=this.label[0].locale),Manifesto.TranslationCollection.getValue(this.value,locale)}return null},MetadataItem.prototype.setValue=function(value){var _this=this;if(this.value&&this.value.length){var t=this.value.en().where(function(x){return x.locale===_this.defaultLocale||x.locale===Manifesto.Utils.getInexactLocale(_this.defaultLocale)}).first();t&&(t.value=value)}},MetadataItem}();Manifesto.MetadataItem=MetadataItem}(Manifesto||(Manifesto={}));var Manifesto;!function(Manifesto){var Translation=function(){function Translation(value,locale){this.value=value,this.locale=locale}return Translation}();Manifesto.Translation=Translation}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var TranslationCollection=function(_super){function TranslationCollection(){_super.apply(this,arguments)}return __extends(TranslationCollection,_super),TranslationCollection.parse=function(translation,defaultLocale){var t,tc=[];if(!translation)return tc;if(!_isArray(translation))return _isString(translation)?(t=new Manifesto.Translation(translation,defaultLocale),tc.push(t),tc):(t=new Manifesto.Translation(translation["@value"],translation["@language"]||defaultLocale),tc.push(t),tc);for(var i=0;i<translation.length;i++){var value=translation[i];t=_isString(value)?new Manifesto.Translation(value,defaultLocale):new Manifesto.Translation(value["@value"],value["@language"]||defaultLocale),tc.push(t)}return tc},TranslationCollection.getValue=function(translationCollection,locale){if(translationCollection.length){if(locale){var translation=translationCollection.en().where(function(t){return t.locale===locale||Manifesto.Utils.getInexactLocale(t.locale)===Manifesto.Utils.getInexactLocale(locale)}).first();if(translation)return translation.value}return translationCollection[0].value}return null},TranslationCollection}(Array);Manifesto.TranslationCollection=TranslationCollection}(Manifesto||(Manifesto={})),global.manifesto=global.Manifesto=module.exports={AnnotationMotivation:new Manifesto.AnnotationMotivation,ElementType:new Manifesto.ElementType,IIIFResourceType:new Manifesto.IIIFResourceType,ManifestType:new Manifesto.ManifestType,MetadataItem:Manifesto.MetadataItem,RenderingFormat:new Manifesto.RenderingFormat,ResourceFormat:new Manifesto.ResourceFormat,ResourceType:new Manifesto.ResourceType,ServiceProfile:new Manifesto.ServiceProfile,Translation:Manifesto.Translation,TranslationCollection:Manifesto.TranslationCollection,TreeNode:Manifesto.TreeNode,TreeNodeType:new Manifesto.TreeNodeType,Utils:Manifesto.Utils,ViewingDirection:new Manifesto.ViewingDirection,ViewingHint:new Manifesto.ViewingHint,StatusCodes:{AUTHORIZATION_FAILED:1,FORBIDDEN:2,INTERNAL_SERVER_ERROR:3,RESTRICTED:4},create:function(manifest,options){return Manifesto.Deserialiser.parse(manifest,options)},loadManifest:function(uri){return Manifesto.Utils.loadResource(uri)}};var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var Annotation=function(_super){function Annotation(jsonld,options){_super.call(this,jsonld,options)}return __extends(Annotation,_super),Annotation.prototype.getMotivation=function(){var motivation=this.getProperty("motivation");return motivation?new Manifesto.AnnotationMotivation(motivation.toLowerCase()):null},Annotation.prototype.getOn=function(){return this.getProperty("on")},Annotation.prototype.getResource=function(){return new Manifesto.Resource(this.getProperty("resource"),this.options)},Annotation}(Manifesto.ManifestResource);Manifesto.Annotation=Annotation}(Manifesto||(Manifesto={}));var Manifesto,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifesto){var Resource=function(_super){function Resource(jsonld,options){_super.call(this,jsonld,options)}return __extends(Resource,_super),Resource.prototype.getFormat=function(){var format=this.getProperty("format");return format?new Manifesto.ResourceFormat(format.toLowerCase()):null},Resource.prototype.getType=function(){var type=this.getProperty("@type");return type?new Manifesto.ResourceType(type.toLowerCase()):null},Resource.prototype.getWidth=function(){return this.getProperty("width")},Resource.prototype.getHeight=function(){return this.getProperty("height")},Resource.prototype.getMaxWidth=function(){return this.getProperty("maxWidth")},Resource.prototype.getMaxHeight=function(){var maxHeight=this.getProperty("maxHeight");if(!maxHeight)return this.getMaxWidth()},Resource}(Manifesto.ManifestResource);Manifesto.Resource=Resource}(Manifesto||(Manifesto={}))}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{http:49,https:9,"lodash.assign":25,"lodash.endswith":26,"lodash.isarray":28,"lodash.isstring":29,"lodash.last":32,"lodash.map":33,url:55}],2:[function(require,module,exports){"use strict";function placeHoldersCount(b64){var len=b64.length;if(len%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===b64[len-2]?2:"="===b64[len-1]?1:0}function byteLength(b64){return 3*b64.length/4-placeHoldersCount(b64)}function toByteArray(b64){var i,j,l,tmp,placeHolders,arr,len=b64.length;placeHolders=placeHoldersCount(b64),arr=new Arr(3*len/4-placeHolders),l=placeHolders>0?len-4:len;var L=0;for(i=0,j=0;i<l;i+=4,j+=3)tmp=revLookup[b64.charCodeAt(i)]<<18|revLookup[b64.charCodeAt(i+1)]<<12|revLookup[b64.charCodeAt(i+2)]<<6|revLookup[b64.charCodeAt(i+3)],arr[L++]=tmp>>16&255,arr[L++]=tmp>>8&255,arr[L++]=255&tmp;return 2===placeHolders?(tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4,arr[L++]=255&tmp):1===placeHolders&&(tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2,arr[L++]=tmp>>8&255,arr[L++]=255&tmp),arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[63&num]}function encodeChunk(uint8,start,end){for(var tmp,output=[],i=start;i<end;i+=3)tmp=(uint8[i]<<16)+(uint8[i+1]<<8)+uint8[i+2],output.push(tripletToBase64(tmp));return output.join("")}function fromByteArray(uint8){for(var tmp,len=uint8.length,extraBytes=len%3,output="",parts=[],maxChunkLength=16383,i=0,len2=len-extraBytes;i<len2;i+=maxChunkLength)parts.push(encodeChunk(uint8,i,i+maxChunkLength>len2?len2:i+maxChunkLength));return 1===extraBytes?(tmp=uint8[len-1],output+=lookup[tmp>>2],output+=lookup[tmp<<4&63],output+="=="):2===extraBytes&&(tmp=(uint8[len-2]<<8)+uint8[len-1],output+=lookup[tmp>>10],output+=lookup[tmp>>4&63],output+=lookup[tmp<<2&63],output+="="),parts.push(output),parts.join("")}exports.byteLength=byteLength,exports.toByteArray=toByteArray,exports.fromByteArray=fromByteArray;for(var lookup=[],revLookup=[],Arr="undefined"!=typeof Uint8Array?Uint8Array:Array,code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,len=code.length;i<len;++i)lookup[i]=code[i],revLookup[code.charCodeAt(i)]=i;revLookup["-".charCodeAt(0)]=62,revLookup["_".charCodeAt(0)]=63},{}],3:[function(require,module,exports){},{}],4:[function(require,module,exports){(function(global){"use strict";var buffer=require("buffer"),Buffer=buffer.Buffer,SlowBuffer=buffer.SlowBuffer,MAX_LEN=buffer.kMaxLength||2147483647;exports.alloc=function(size,fill,encoding){if("function"==typeof Buffer.alloc)return Buffer.alloc(size,fill,encoding);if("number"==typeof encoding)throw new TypeError("encoding must not be number");if("number"!=typeof size)throw new TypeError("size must be a number");if(size>MAX_LEN)throw new RangeError("size is too large");var enc=encoding,_fill=fill;void 0===_fill&&(enc=void 0,_fill=0);var buf=new Buffer(size);if("string"==typeof _fill)for(var fillBuf=new Buffer(_fill,enc),flen=fillBuf.length,i=-1;++i<size;)buf[i]=fillBuf[i%flen];else buf.fill(_fill);return buf},exports.allocUnsafe=function(size){if("function"==typeof Buffer.allocUnsafe)return Buffer.allocUnsafe(size);if("number"!=typeof size)throw new TypeError("size must be a number");if(size>MAX_LEN)throw new RangeError("size is too large");return new Buffer(size)},exports.from=function(value,encodingOrOffset,length){if("function"==typeof Buffer.from&&(!global.Uint8Array||Uint8Array.from!==Buffer.from))return Buffer.from(value,encodingOrOffset,length);if("number"==typeof value)throw new TypeError('"value" argument must not be a number');if("string"==typeof value)return new Buffer(value,encodingOrOffset);if("undefined"!=typeof ArrayBuffer&&value instanceof ArrayBuffer){var offset=encodingOrOffset;if(1===arguments.length)return new Buffer(value);"undefined"==typeof offset&&(offset=0);var len=length;if("undefined"==typeof len&&(len=value.byteLength-offset),offset>=value.byteLength)throw new RangeError("'offset' is out of bounds");if(len>value.byteLength-offset)throw new RangeError("'length' is out of bounds");return new Buffer(value.slice(offset,offset+len))}if(Buffer.isBuffer(value)){var out=new Buffer(value.length);return value.copy(out,0,0,value.length),out}if(value){if(Array.isArray(value)||"undefined"!=typeof ArrayBuffer&&value.buffer instanceof ArrayBuffer||"length"in value)return new Buffer(value);if("Buffer"===value.type&&Array.isArray(value.data))return new Buffer(value.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")},exports.allocUnsafeSlow=function(size){if("function"==typeof Buffer.allocUnsafeSlow)return Buffer.allocUnsafeSlow(size);if("number"!=typeof size)throw new TypeError("size must be a number");if(size>=MAX_LEN)throw new RangeError("size is too large");return new SlowBuffer(size)}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{buffer:5}],5:[function(require,module,exports){(function(global){"use strict";function typedArraySupport(){try{var arr=new Uint8Array(1);return arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===arr.foo()&&"function"==typeof arr.subarray&&0===arr.subarray(1,1).byteLength}catch(e){return!1}}function kMaxLength(){return Buffer.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(that,length){if(kMaxLength()<length)throw new RangeError("Invalid typed array length");return Buffer.TYPED_ARRAY_SUPPORT?(that=new Uint8Array(length),that.__proto__=Buffer.prototype):(null===that&&(that=new Buffer(length)),that.length=length),that}function Buffer(arg,encodingOrOffset,length){if(!(Buffer.TYPED_ARRAY_SUPPORT||this instanceof Buffer))return new Buffer(arg,encodingOrOffset,length);if("number"==typeof arg){if("string"==typeof encodingOrOffset)throw new Error("If encoding is specified then the first argument must be a string");return allocUnsafe(this,arg)}return from(this,arg,encodingOrOffset,length)}function from(that,value,encodingOrOffset,length){if("number"==typeof value)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&value instanceof ArrayBuffer?fromArrayBuffer(that,value,encodingOrOffset,length):"string"==typeof value?fromString(that,value,encodingOrOffset):fromObject(that,value)}function assertSize(size){if("number"!=typeof size)throw new TypeError('"size" argument must be a number');if(size<0)throw new RangeError('"size" argument must not be negative')}function alloc(that,size,fill,encoding){return assertSize(size),size<=0?createBuffer(that,size):void 0!==fill?"string"==typeof encoding?createBuffer(that,size).fill(fill,encoding):createBuffer(that,size).fill(fill):createBuffer(that,size)}function allocUnsafe(that,size){if(assertSize(size),that=createBuffer(that,size<0?0:0|checked(size)),!Buffer.TYPED_ARRAY_SUPPORT)for(var i=0;i<size;++i)that[i]=0;return that}function fromString(that,string,encoding){if("string"==typeof encoding&&""!==encoding||(encoding="utf8"),!Buffer.isEncoding(encoding))throw new TypeError('"encoding" must be a valid string encoding');var length=0|byteLength(string,encoding);that=createBuffer(that,length);var actual=that.write(string,encoding);return actual!==length&&(that=that.slice(0,actual)),that}function fromArrayLike(that,array){var length=array.length<0?0:0|checked(array.length);that=createBuffer(that,length);for(var i=0;i<length;i+=1)that[i]=255&array[i];return that}function fromArrayBuffer(that,array,byteOffset,length){if(array.byteLength,byteOffset<0||array.byteLength<byteOffset)throw new RangeError("'offset' is out of bounds");if(array.byteLength<byteOffset+(length||0))throw new RangeError("'length' is out of bounds");return array=void 0===byteOffset&&void 0===length?new Uint8Array(array):void 0===length?new Uint8Array(array,byteOffset):new Uint8Array(array,byteOffset,length),Buffer.TYPED_ARRAY_SUPPORT?(that=array,that.__proto__=Buffer.prototype):that=fromArrayLike(that,array),that}function fromObject(that,obj){if(Buffer.isBuffer(obj)){var len=0|checked(obj.length);return that=createBuffer(that,len),0===that.length?that:(obj.copy(that,0,0,len),that)}if(obj){if("undefined"!=typeof ArrayBuffer&&obj.buffer instanceof ArrayBuffer||"length"in obj)return"number"!=typeof obj.length||isnan(obj.length)?createBuffer(that,0):fromArrayLike(that,obj);if("Buffer"===obj.type&&isArray(obj.data))return fromArrayLike(that,obj.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function checked(length){if(length>=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return 0|length}function SlowBuffer(length){return+length!=length&&(length=0),Buffer.alloc(+length)}function byteLength(string,encoding){if(Buffer.isBuffer(string))return string.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(string)||string instanceof ArrayBuffer))return string.byteLength;"string"!=typeof string&&(string=""+string);var len=string.length;if(0===len)return 0;for(var loweredCase=!1;;)switch(encoding){case"ascii":case"latin1":case"binary":return len;case"utf8":case"utf-8":case void 0:return utf8ToBytes(string).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*len;case"hex":return len>>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(""+encoding).toLowerCase(),loweredCase=!0}}function slowToString(encoding,start,end){var loweredCase=!1;if((void 0===start||start<0)&&(start=0),start>this.length)return"";if((void 0===end||end>this.length)&&(end=this.length),end<=0)return"";if(end>>>=0,start>>>=0,end<=start)return"";for(encoding||(encoding="utf8");;)switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"latin1":case"binary":return latin1Slice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase(),loweredCase=!0}}function swap(b,n,m){var i=b[n];b[n]=b[m],b[m]=i}function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){if(0===buffer.length)return-1;if("string"==typeof byteOffset?(encoding=byteOffset,byteOffset=0):byteOffset>2147483647?byteOffset=2147483647:byteOffset<-2147483648&&(byteOffset=-2147483648),byteOffset=+byteOffset,isNaN(byteOffset)&&(byteOffset=dir?0:buffer.length-1),byteOffset<0&&(byteOffset=buffer.length+byteOffset),byteOffset>=buffer.length){if(dir)return-1;byteOffset=buffer.length-1}else if(byteOffset<0){if(!dir)return-1;byteOffset=0}if("string"==typeof val&&(val=Buffer.from(val,encoding)),Buffer.isBuffer(val))return 0===val.length?-1:arrayIndexOf(buffer,val,byteOffset,encoding,dir);if("number"==typeof val)return val=255&val,Buffer.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?dir?Uint8Array.prototype.indexOf.call(buffer,val,byteOffset):Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset):arrayIndexOf(buffer,[val],byteOffset,encoding,dir);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(arr,val,byteOffset,encoding,dir){function read(buf,i){return 1===indexSize?buf[i]:buf.readUInt16BE(i*indexSize)}var indexSize=1,arrLength=arr.length,valLength=val.length;if(void 0!==encoding&&(encoding=String(encoding).toLowerCase(),"ucs2"===encoding||"ucs-2"===encoding||"utf16le"===encoding||"utf-16le"===encoding)){if(arr.length<2||val.length<2)return-1;indexSize=2,arrLength/=2,valLength/=2,byteOffset/=2}var i;if(dir){var foundIndex=-1;for(i=byteOffset;i<arrLength;i++)if(read(arr,i)===read(val,foundIndex===-1?0:i-foundIndex)){if(foundIndex===-1&&(foundIndex=i),i-foundIndex+1===valLength)return foundIndex*indexSize}else foundIndex!==-1&&(i-=i-foundIndex),foundIndex=-1}else for(byteOffset+valLength>arrLength&&(byteOffset=arrLength-valLength),i=byteOffset;i>=0;i--){for(var found=!0,j=0;j<valLength;j++)if(read(arr,i+j)!==read(val,j)){found=!1;break}if(found)return i}return-1}function hexWrite(buf,string,offset,length){offset=Number(offset)||0;var remaining=buf.length-offset;length?(length=Number(length),length>remaining&&(length=remaining)):length=remaining;var strLen=string.length;if(strLen%2!==0)throw new TypeError("Invalid hex string");length>strLen/2&&(length=strLen/2);for(var i=0;i<length;++i){var parsed=parseInt(string.substr(2*i,2),16);if(isNaN(parsed))return i;buf[offset+i]=parsed}return i}function utf8Write(buf,string,offset,length){return blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length)}function asciiWrite(buf,string,offset,length){return blitBuffer(asciiToBytes(string),buf,offset,length)}function latin1Write(buf,string,offset,length){return asciiWrite(buf,string,offset,length)}function base64Write(buf,string,offset,length){return blitBuffer(base64ToBytes(string),buf,offset,length)}function ucs2Write(buf,string,offset,length){return blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length)}function base64Slice(buf,start,end){return 0===start&&end===buf.length?base64.fromByteArray(buf):base64.fromByteArray(buf.slice(start,end))}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);for(var res=[],i=start;i<end;){var firstByte=buf[i],codePoint=null,bytesPerSequence=firstByte>239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:firstByte<128&&(codePoint=firstByte);break;case 2:secondByte=buf[i+1],128===(192&secondByte)&&(tempCodePoint=(31&firstByte)<<6|63&secondByte,tempCodePoint>127&&(codePoint=tempCodePoint));break;case 3:secondByte=buf[i+1],thirdByte=buf[i+2],128===(192&secondByte)&&128===(192&thirdByte)&&(tempCodePoint=(15&firstByte)<<12|(63&secondByte)<<6|63&thirdByte,tempCodePoint>2047&&(tempCodePoint<55296||tempCodePoint>57343)&&(codePoint=tempCodePoint));break;case 4:secondByte=buf[i+1],thirdByte=buf[i+2],fourthByte=buf[i+3],128===(192&secondByte)&&128===(192&thirdByte)&&128===(192&fourthByte)&&(tempCodePoint=(15&firstByte)<<18|(63&secondByte)<<12|(63&thirdByte)<<6|63&fourthByte,tempCodePoint>65535&&tempCodePoint<1114112&&(codePoint=tempCodePoint))}}null===codePoint?(codePoint=65533,bytesPerSequence=1):codePoint>65535&&(codePoint-=65536,res.push(codePoint>>>10&1023|55296),codePoint=56320|1023&codePoint),res.push(codePoint),i+=bytesPerSequence}return decodeCodePointsArray(res)}function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,codePoints);for(var res="",i=0;i<len;)res+=String.fromCharCode.apply(String,codePoints.slice(i,i+=MAX_ARGUMENTS_LENGTH));return res}function asciiSlice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;i<end;++i)ret+=String.fromCharCode(127&buf[i]);return ret}function latin1Slice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;i<end;++i)ret+=String.fromCharCode(buf[i]);return ret}function hexSlice(buf,start,end){var len=buf.length;(!start||start<0)&&(start=0),(!end||end<0||end>len)&&(end=len);for(var out="",i=start;i<end;++i)out+=toHex(buf[i]);return out}function utf16leSlice(buf,start,end){for(var bytes=buf.slice(start,end),res="",i=0;i<bytes.length;i+=2)res+=String.fromCharCode(bytes[i]+256*bytes[i+1]);return res}function checkOffset(offset,ext,length){if(offset%1!==0||offset<0)throw new RangeError("offset is not uint");if(offset+ext>length)throw new RangeError("Trying to access beyond buffer length")}function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||value<min)throw new RangeError('"value" argument is out of bounds');if(offset+ext>buf.length)throw new RangeError("Index out of range")}function objectWriteUInt16(buf,value,offset,littleEndian){value<0&&(value=65535+value+1);for(var i=0,j=Math.min(buf.length-offset,2);i<j;++i)buf[offset+i]=(value&255<<8*(littleEndian?i:1-i))>>>8*(littleEndian?i:1-i)}function objectWriteUInt32(buf,value,offset,littleEndian){value<0&&(value=4294967295+value+1);for(var i=0,j=Math.min(buf.length-offset,4);i<j;++i)buf[offset+i]=value>>>8*(littleEndian?i:3-i)&255}function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(offset<0)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38),ieee754.write(buf,value,offset,littleEndian,23,4),offset+4}function writeDouble(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308),ieee754.write(buf,value,offset,littleEndian,52,8),offset+8}function base64clean(str){if(str=stringtrim(str).replace(INVALID_BASE64_RE,""),str.length<2)return"";for(;str.length%4!==0;)str+="=";return str}function stringtrim(str){return str.trim?str.trim():str.replace(/^\s+|\s+$/g,"")}function toHex(n){return n<16?"0"+n.toString(16):n.toString(16)}function utf8ToBytes(string,units){units=units||1/0;for(var codePoint,length=string.length,leadSurrogate=null,bytes=[],i=0;i<length;++i){if(codePoint=string.charCodeAt(i),codePoint>55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){(units-=3)>-1&&bytes.push(239,191,189);continue}if(i+1===length){(units-=3)>-1&&bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){(units-=3)>-1&&bytes.push(239,191,189),leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else leadSurrogate&&(units-=3)>-1&&bytes.push(239,191,189);if(leadSurrogate=null,codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,63&codePoint|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,63&codePoint|128)}else{if(!(codePoint<1114112))throw new Error("Invalid code point");if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,63&codePoint|128)}}return bytes}function asciiToBytes(str){for(var byteArray=[],i=0;i<str.length;++i)byteArray.push(255&str.charCodeAt(i));return byteArray}function utf16leToBytes(str,units){for(var c,hi,lo,byteArray=[],i=0;i<str.length&&!((units-=2)<0);++i)c=str.charCodeAt(i),hi=c>>8,lo=c%256,byteArray.push(lo),byteArray.push(hi);return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){for(var i=0;i<length&&!(i+offset>=dst.length||i>=src.length);++i)dst[i+offset]=src[i];return i}function isnan(val){return val!==val}var base64=require("base64-js"),ieee754=require("ieee754"),isArray=require("isarray");exports.Buffer=Buffer,exports.SlowBuffer=SlowBuffer,exports.INSPECT_MAX_BYTES=50,Buffer.TYPED_ARRAY_SUPPORT=void 0!==global.TYPED_ARRAY_SUPPORT?global.TYPED_ARRAY_SUPPORT:typedArraySupport(),exports.kMaxLength=kMaxLength(),Buffer.poolSize=8192,Buffer._augment=function(arr){return arr.__proto__=Buffer.prototype,arr},Buffer.from=function(value,encodingOrOffset,length){return from(null,value,encodingOrOffset,length)},Buffer.TYPED_ARRAY_SUPPORT&&(Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&Buffer[Symbol.species]===Buffer&&Object.defineProperty(Buffer,Symbol.species,{value:null,configurable:!0})),Buffer.alloc=function(size,fill,encoding){return alloc(null,size,fill,encoding)},Buffer.allocUnsafe=function(size){return allocUnsafe(null,size)},Buffer.allocUnsafeSlow=function(size){return allocUnsafe(null,size)},Buffer.isBuffer=function(b){return!(null==b||!b._isBuffer)},Buffer.compare=function(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b))throw new TypeError("Arguments must be Buffers");if(a===b)return 0;for(var x=a.length,y=b.length,i=0,len=Math.min(x,y);i<len;++i)if(a[i]!==b[i]){x=a[i],y=b[i];break}return x<y?-1:y<x?1:0},Buffer.isEncoding=function(encoding){switch(String(encoding).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Buffer.concat=function(list,length){if(!isArray(list))throw new TypeError('"list" argument must be an Array of Buffers');if(0===list.length)return Buffer.alloc(0);var i;if(void 0===length)for(length=0,i=0;i<list.length;++i)length+=list[i].length;var buffer=Buffer.allocUnsafe(length),pos=0;for(i=0;i<list.length;++i){var buf=list[i];if(!Buffer.isBuffer(buf))throw new TypeError('"list" argument must be an Array of Buffers');buf.copy(buffer,pos),pos+=buf.length}return buffer},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function(){var len=this.length;if(len%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var i=0;i<len;i+=2)swap(this,i,i+1);return this},Buffer.prototype.swap32=function(){var len=this.length;if(len%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var i=0;i<len;i+=4)swap(this,i,i+3),swap(this,i+1,i+2);return this},Buffer.prototype.swap64=function(){var len=this.length;if(len%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var i=0;i<len;i+=8)swap(this,i,i+7),swap(this,i+1,i+6),swap(this,i+2,i+5),swap(this,i+3,i+4);return this},Buffer.prototype.toString=function(){var length=0|this.length;return 0===length?"":0===arguments.length?utf8Slice(this,0,length):slowToString.apply(this,arguments)},Buffer.prototype.equals=function(b){if(!Buffer.isBuffer(b))throw new TypeError("Argument must be a Buffer");return this===b||0===Buffer.compare(this,b)},Buffer.prototype.inspect=function(){var str="",max=exports.INSPECT_MAX_BYTES;return this.length>0&&(str=this.toString("hex",0,max).match(/.{2}/g).join(" "),this.length>max&&(str+=" ... ")),"<Buffer "+str+">"},Buffer.prototype.compare=function(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target))throw new TypeError("Argument must be a Buffer");if(void 0===start&&(start=0),void 0===end&&(end=target?target.length:0),void 0===thisStart&&(thisStart=0),void 0===thisEnd&&(thisEnd=this.length),start<0||end>target.length||thisStart<0||thisEnd>this.length)throw new RangeError("out of range index");if(thisStart>=thisEnd&&start>=end)return 0;if(thisStart>=thisEnd)return-1;if(start>=end)return 1;if(start>>>=0,end>>>=0,thisStart>>>=0,thisEnd>>>=0,this===target)return 0;for(var x=thisEnd-thisStart,y=end-start,len=Math.min(x,y),thisCopy=this.slice(thisStart,thisEnd),targetCopy=target.slice(start,end),i=0;i<len;++i)if(thisCopy[i]!==targetCopy[i]){x=thisCopy[i],y=targetCopy[i];break}return x<y?-1:y<x?1:0},Buffer.prototype.includes=function(val,byteOffset,encoding){return this.indexOf(val,byteOffset,encoding)!==-1},Buffer.prototype.indexOf=function(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,!0)},Buffer.prototype.lastIndexOf=function(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,!1)},Buffer.prototype.write=function(string,offset,length,encoding){if(void 0===offset)encoding="utf8",length=this.length,offset=0;else if(void 0===length&&"string"==typeof offset)encoding=offset,length=this.length,offset=0;else{if(!isFinite(offset))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");offset=0|offset,isFinite(length)?(length=0|length,void 0===encoding&&(encoding="utf8")):(encoding=length,length=void 0)}var remaining=this.length-offset;if((void 0===length||length>remaining)&&(length=remaining),string.length>0&&(length<0||offset<0)||offset>this.length)throw new RangeError("Attempt to write outside buffer bounds");encoding||(encoding="utf8");for(var loweredCase=!1;;)switch(encoding){case"hex":
+return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"latin1":case"binary":return latin1Write(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase(),loweredCase=!0}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;Buffer.prototype.slice=function(start,end){var len=this.length;start=~~start,end=void 0===end?len:~~end,start<0?(start+=len,start<0&&(start=0)):start>len&&(start=len),end<0?(end+=len,end<0&&(end=0)):end>len&&(end=len),end<start&&(end=start);var newBuf;if(Buffer.TYPED_ARRAY_SUPPORT)newBuf=this.subarray(start,end),newBuf.__proto__=Buffer.prototype;else{var sliceLen=end-start;newBuf=new Buffer(sliceLen,(void 0));for(var i=0;i<sliceLen;++i)newBuf[i]=this[i+start]}return newBuf},Buffer.prototype.readUIntLE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset],mul=1,i=0;++i<byteLength&&(mul*=256);)val+=this[offset+i]*mul;return val},Buffer.prototype.readUIntBE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset+--byteLength],mul=1;byteLength>0&&(mul*=256);)val+=this[offset+--byteLength]*mul;return val},Buffer.prototype.readUInt8=function(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),this[offset]},Buffer.prototype.readUInt16LE=function(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]|this[offset+1]<<8},Buffer.prototype.readUInt16BE=function(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]<<8|this[offset+1]},Buffer.prototype.readUInt32LE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+16777216*this[offset+3]},Buffer.prototype.readUInt32BE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),16777216*this[offset]+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])},Buffer.prototype.readIntLE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset],mul=1,i=0;++i<byteLength&&(mul*=256);)val+=this[offset+i]*mul;return mul*=128,val>=mul&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readIntBE=function(offset,byteLength,noAssert){offset=0|offset,byteLength=0|byteLength,noAssert||checkOffset(offset,byteLength,this.length);for(var i=byteLength,mul=1,val=this[offset+--i];i>0&&(mul*=256);)val+=this[offset+--i]*mul;return mul*=128,val>=mul&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readInt8=function(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),128&this[offset]?(255-this[offset]+1)*-1:this[offset]},Buffer.prototype.readInt16LE=function(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return 32768&val?4294901760|val:val},Buffer.prototype.readInt16BE=function(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return 32768&val?4294901760|val:val},Buffer.prototype.readInt32LE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24},Buffer.prototype.readInt32BE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]},Buffer.prototype.readFloatLE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!0,23,4)},Buffer.prototype.readFloatBE=function(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!1,23,4)},Buffer.prototype.readDoubleLE=function(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!0,52,8)},Buffer.prototype.readDoubleBE=function(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!1,52,8)},Buffer.prototype.writeUIntLE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,byteLength=0|byteLength,!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1,i=0;for(this[offset]=255&value;++i<byteLength&&(mul*=256);)this[offset+i]=value/mul&255;return offset+byteLength},Buffer.prototype.writeUIntBE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,byteLength=0|byteLength,!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var i=byteLength-1,mul=1;for(this[offset+i]=255&value;--i>=0&&(mul*=256);)this[offset+i]=value/mul&255;return offset+byteLength},Buffer.prototype.writeUInt8=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,1,255,0),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),this[offset]=255&value,offset+1},Buffer.prototype.writeUInt16LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeUInt16BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeUInt32LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset+3]=value>>>24,this[offset+2]=value>>>16,this[offset+1]=value>>>8,this[offset]=255&value):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeUInt32BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeIntLE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0,mul=1,sub=0;for(this[offset]=255&value;++i<byteLength&&(mul*=256);)value<0&&0===sub&&0!==this[offset+i-1]&&(sub=1),this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength},Buffer.prototype.writeIntBE=function(value,offset,byteLength,noAssert){if(value=+value,offset=0|offset,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1,mul=1,sub=0;for(this[offset+i]=255&value;--i>=0&&(mul*=256);)value<0&&0===sub&&0!==this[offset+i+1]&&(sub=1),this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength},Buffer.prototype.writeInt8=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),value<0&&(value=255+value+1),this[offset]=255&value,offset+1},Buffer.prototype.writeInt16LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeInt16BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeInt32LE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8,this[offset+2]=value>>>16,this[offset+3]=value>>>24):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeInt32BE=function(value,offset,noAssert){return value=+value,offset=0|offset,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),value<0&&(value=4294967295+value+1),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeFloatLE=function(value,offset,noAssert){return writeFloat(this,value,offset,!0,noAssert)},Buffer.prototype.writeFloatBE=function(value,offset,noAssert){return writeFloat(this,value,offset,!1,noAssert)},Buffer.prototype.writeDoubleLE=function(value,offset,noAssert){return writeDouble(this,value,offset,!0,noAssert)},Buffer.prototype.writeDoubleBE=function(value,offset,noAssert){return writeDouble(this,value,offset,!1,noAssert)},Buffer.prototype.copy=function(target,targetStart,start,end){if(start||(start=0),end||0===end||(end=this.length),targetStart>=target.length&&(targetStart=target.length),targetStart||(targetStart=0),end>0&&end<start&&(end=start),end===start)return 0;if(0===target.length||0===this.length)return 0;if(targetStart<0)throw new RangeError("targetStart out of bounds");if(start<0||start>=this.length)throw new RangeError("sourceStart out of bounds");if(end<0)throw new RangeError("sourceEnd out of bounds");end>this.length&&(end=this.length),target.length-targetStart<end-start&&(end=target.length-targetStart+start);var i,len=end-start;if(this===target&&start<targetStart&&targetStart<end)for(i=len-1;i>=0;--i)target[i+targetStart]=this[i+start];else if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT)for(i=0;i<len;++i)target[i+targetStart]=this[i+start];else Uint8Array.prototype.set.call(target,this.subarray(start,start+len),targetStart);return len},Buffer.prototype.fill=function(val,start,end,encoding){if("string"==typeof val){if("string"==typeof start?(encoding=start,start=0,end=this.length):"string"==typeof end&&(encoding=end,end=this.length),1===val.length){var code=val.charCodeAt(0);code<256&&(val=code)}if(void 0!==encoding&&"string"!=typeof encoding)throw new TypeError("encoding must be a string");if("string"==typeof encoding&&!Buffer.isEncoding(encoding))throw new TypeError("Unknown encoding: "+encoding)}else"number"==typeof val&&(val=255&val);if(start<0||this.length<start||this.length<end)throw new RangeError("Out of range index");if(end<=start)return this;start>>>=0,end=void 0===end?this.length:end>>>0,val||(val=0);var i;if("number"==typeof val)for(i=start;i<end;++i)this[i]=val;else{var bytes=Buffer.isBuffer(val)?val:utf8ToBytes(new Buffer(val,encoding).toString()),len=bytes.length;for(i=0;i<end-start;++i)this[i+start]=bytes[i%len]}return this};var INVALID_BASE64_RE=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":2,ieee754:10,isarray:13}],6:[function(require,module,exports){module.exports={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",208:"Already Reported",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",307:"Temporary Redirect",308:"Permanent Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",421:"Misdirected Request",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Unordered Collection",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",509:"Bandwidth Limit Exceeded",510:"Not Extended",511:"Network Authentication Required"}},{}],7:[function(require,module,exports){(function(Buffer){function isArray(arg){return Array.isArray?Array.isArray(arg):"[object Array]"===objectToString(arg)}function isBoolean(arg){return"boolean"==typeof arg}function isNull(arg){return null===arg}function isNullOrUndefined(arg){return null==arg}function isNumber(arg){return"number"==typeof arg}function isString(arg){return"string"==typeof arg}function isSymbol(arg){return"symbol"==typeof arg}function isUndefined(arg){return void 0===arg}function isRegExp(re){return"[object RegExp]"===objectToString(re)}function isObject(arg){return"object"==typeof arg&&null!==arg}function isDate(d){return"[object Date]"===objectToString(d)}function isError(e){return"[object Error]"===objectToString(e)||e instanceof Error}function isFunction(arg){return"function"==typeof arg}function isPrimitive(arg){return null===arg||"boolean"==typeof arg||"number"==typeof arg||"string"==typeof arg||"symbol"==typeof arg||"undefined"==typeof arg}function objectToString(o){return Object.prototype.toString.call(o)}exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=Buffer.isBuffer}).call(this,{isBuffer:require("../../is-buffer/index.js")})},{"../../is-buffer/index.js":12}],8:[function(require,module,exports){function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(arg){return"function"==typeof arg}function isNumber(arg){return"number"==typeof arg}function isObject(arg){return"object"==typeof arg&&null!==arg}function isUndefined(arg){return void 0===arg}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");return this._maxListeners=n,this},EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(this._events||(this._events={}),"error"===type&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(er=arguments[1],er instanceof Error)throw er;var err=new Error('Uncaught, unspecified "error" event. ('+er+")");throw err.context=er,err}if(handler=this._events[type],isUndefined(handler))return!1;if(isFunction(handler))switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:args=Array.prototype.slice.call(arguments,1),handler.apply(this,args)}else if(isObject(handler))for(args=Array.prototype.slice.call(arguments,1),listeners=handler.slice(),len=listeners.length,i=0;i<len;i++)listeners[i].apply(this,args);return!0},EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener),this._events[type]?isObject(this._events[type])?this._events[type].push(listener):this._events[type]=[this._events[type],listener]:this._events[type]=listener,isObject(this._events[type])&&!this._events[type].warned&&(m=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,m&&m>0&&this._events[type].length>m&&(this._events[type].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[type].length),"function"==typeof console.trace&&console.trace())),this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(type,listener){function g(){this.removeListener(type,g),fired||(fired=!0,listener.apply(this,arguments))}if(!isFunction(listener))throw TypeError("listener must be a function");var fired=!1;return g.listener=listener,this.on(type,g),this},EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;if(list=this._events[type],length=list.length,position=-1,list===listener||isFunction(list.listener)&&list.listener===listener)delete this._events[type],this._events.removeListener&&this.emit("removeListener",type,listener);else if(isObject(list)){for(i=length;i-- >0;)if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}if(position<0)return this;1===list.length?(list.length=0,delete this._events[type]):list.splice(position,1),this._events.removeListener&&this.emit("removeListener",type,listener)}return this},EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[type]&&delete this._events[type],this;if(0===arguments.length){for(key in this._events)"removeListener"!==key&&this.removeAllListeners(key);return this.removeAllListeners("removeListener"),this._events={},this}if(listeners=this._events[type],isFunction(listeners))this.removeListener(type,listeners);else if(listeners)for(;listeners.length;)this.removeListener(type,listeners[listeners.length-1]);return delete this._events[type],this},EventEmitter.prototype.listeners=function(type){var ret;return ret=this._events&&this._events[type]?isFunction(this._events[type])?[this._events[type]]:this._events[type].slice():[]},EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;if(evlistener)return evlistener.length}return 0},EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)}},{}],9:[function(require,module,exports){var http=require("http"),https=module.exports;for(var key in http)http.hasOwnProperty(key)&&(https[key]=http[key]);https.request=function(params,cb){return params||(params={}),params.scheme="https",params.protocol="https:",http.request.call(this,params,cb)}},{http:49}],10:[function(require,module,exports){exports.read=function(buffer,offset,isLE,mLen,nBytes){var e,m,eLen=8*nBytes-mLen-1,eMax=(1<<eLen)-1,eBias=eMax>>1,nBits=-7,i=isLE?nBytes-1:0,d=isLE?-1:1,s=buffer[offset+i];for(i+=d,e=s&(1<<-nBits)-1,s>>=-nBits,nBits+=eLen;nBits>0;e=256*e+buffer[offset+i],i+=d,nBits-=8);for(m=e&(1<<-nBits)-1,e>>=-nBits,nBits+=mLen;nBits>0;m=256*m+buffer[offset+i],i+=d,nBits-=8);if(0===e)e=1-eBias;else{if(e===eMax)return m?NaN:(s?-1:1)*(1/0);m+=Math.pow(2,mLen),e-=eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)},exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c,eLen=8*nBytes-mLen-1,eMax=(1<<eLen)-1,eBias=eMax>>1,rt=23===mLen?Math.pow(2,-24)-Math.pow(2,-77):0,i=isLE?0:nBytes-1,d=isLE?1:-1,s=value<0||0===value&&1/value<0?1:0;for(value=Math.abs(value),isNaN(value)||value===1/0?(m=isNaN(value)?1:0,e=eMax):(e=Math.floor(Math.log(value)/Math.LN2),value*(c=Math.pow(2,-e))<1&&(e--,c*=2),value+=e+eBias>=1?rt/c:rt*Math.pow(2,1-eBias),value*c>=2&&(e++,c/=2),e+eBias>=eMax?(m=0,e=eMax):e+eBias>=1?(m=(value*c-1)*Math.pow(2,mLen),e+=eBias):(m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen),e=0));mLen>=8;buffer[offset+i]=255&m,i+=d,m/=256,mLen-=8);for(e=e<<mLen|m,eLen+=mLen;eLen>0;buffer[offset+i]=255&e,i+=d,e/=256,eLen-=8);buffer[offset+i-d]|=128*s}},{}],11:[function(require,module,exports){"function"==typeof Object.create?module.exports=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype,ctor.prototype=new TempCtor,ctor.prototype.constructor=ctor}},{}],12:[function(require,module,exports){function isBuffer(obj){return!!obj.constructor&&"function"==typeof obj.constructor.isBuffer&&obj.constructor.isBuffer(obj)}function isSlowBuffer(obj){return"function"==typeof obj.readFloatLE&&"function"==typeof obj.slice&&isBuffer(obj.slice(0,0))}module.exports=function(obj){return null!=obj&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer)}},{}],13:[function(require,module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return"[object Array]"==toString.call(arr)}},{}],14:[function(require,module,exports){function arrayMap(array,iteratee){for(var index=-1,length=array.length,result=Array(length);++index<length;)result[index]=iteratee(array[index],index,array);return result}module.exports=arrayMap},{}],15:[function(require,module,exports){function baseAssign(object,source){return null==source?object:baseCopy(source,keys(source),object)}var baseCopy=require("lodash._basecopy"),keys=require("lodash.keys");module.exports=baseAssign},{"lodash._basecopy":17,"lodash.keys":31}],16:[function(require,module,exports){function baseToString(value){return null==value?"":value+""}function baseCallback(func,thisArg,argCount){var type=typeof func;return"function"==type?void 0===thisArg?func:bindCallback(func,thisArg,argCount):null==func?identity:"object"==type?baseMatches(func):void 0===thisArg?property(func):baseMatchesProperty(func,thisArg)}function baseGet(object,path,pathKey){if(null!=object){void 0!==pathKey&&pathKey in toObject(object)&&(path=[pathKey]);for(var index=0,length=path.length;null!=object&&index<length;)object=object[path[index++]];return index&&index==length?object:void 0}}function baseIsMatch(object,matchData,customizer){var index=matchData.length,length=index,noCustomizer=!customizer;if(null==object)return!length;for(object=toObject(object);index--;){var data=matchData[index];if(noCustomizer&&data[2]?data[1]!==object[data[0]]:!(data[0]in object))return!1}for(;++index<length;){data=matchData[index];var key=data[0],objValue=object[key],srcValue=data[1];if(noCustomizer&&data[2]){if(void 0===objValue&&!(key in object))return!1}else{var result=customizer?customizer(objValue,srcValue,key):void 0;if(!(void 0===result?baseIsEqual(srcValue,objValue,customizer,!0):result))return!1}}return!0}function baseMatches(source){var matchData=getMatchData(source);if(1==matchData.length&&matchData[0][2]){var key=matchData[0][0],value=matchData[0][1];return function(object){return null!=object&&(object[key]===value&&(void 0!==value||key in toObject(object)))}}return function(object){return baseIsMatch(object,matchData)}}function baseMatchesProperty(path,srcValue){var isArr=isArray(path),isCommon=isKey(path)&&isStrictComparable(srcValue),pathKey=path+"";return path=toPath(path),function(object){if(null==object)return!1;var key=pathKey;if(object=toObject(object),(isArr||!isCommon)&&!(key in object)){if(object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),null==object)return!1;key=last(path),object=toObject(object)}return object[key]===srcValue?void 0!==srcValue||key in object:baseIsEqual(srcValue,object[key],void 0,!0)}}function baseProperty(key){return function(object){return null==object?void 0:object[key]}}function basePropertyDeep(path){var pathKey=path+"";return path=toPath(path),function(object){return baseGet(object,path,pathKey)}}function baseSlice(array,start,end){var index=-1,length=array.length;start=null==start?0:+start||0,start<0&&(start=-start>length?0:length+start),end=void 0===end||end>length?length:+end||0,end<0&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);++index<length;)result[index]=array[index+start];return result}function getMatchData(object){for(var result=pairs(object),length=result.length;length--;)result[length][2]=isStrictComparable(result[length][1]);return result}function isKey(value,object){var type=typeof value;if("string"==type&&reIsPlainProp.test(value)||"number"==type)return!0;if(isArray(value))return!1;var result=!reIsDeepProp.test(value);return result||null!=object&&value in toObject(object)}function isStrictComparable(value){return value===value&&!isObject(value)}function toObject(value){return isObject(value)?value:Object(value)}function toPath(value){if(isArray(value))return value;var result=[];return baseToString(value).replace(rePropName,function(match,number,quote,string){result.push(quote?string.replace(reEscapeChar,"$1"):number||match)}),result}function last(array){var length=array?array.length:0;return length?array[length-1]:void 0}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}function identity(value){return value}function property(path){return isKey(path)?baseProperty(path):basePropertyDeep(path)}var baseIsEqual=require("lodash._baseisequal"),bindCallback=require("lodash._bindcallback"),isArray=require("lodash.isarray"),pairs=require("lodash.pairs"),reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/,rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,reEscapeChar=/\\(\\)?/g;module.exports=baseCallback},{"lodash._baseisequal":19,"lodash._bindcallback":20,"lodash.isarray":28,"lodash.pairs":34}],17:[function(require,module,exports){function baseCopy(source,props,object){object||(object={});for(var index=-1,length=props.length;++index<length;){var key=props[index];object[key]=source[key]}return object}module.exports=baseCopy},{}],18:[function(require,module,exports){function baseForOwn(object,iteratee){return baseFor(object,iteratee,keys)}function baseProperty(key){return function(object){return null==object?void 0:object[key]}}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){var length=collection?getLength(collection):0;if(!isLength(length))return eachFunc(collection,iteratee);for(var index=fromRight?length:-1,iterable=toObject(collection);(fromRight?index--:++index<length)&&iteratee(iterable[index],index,iterable)!==!1;);return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var iterable=toObject(object),props=keysFunc(object),length=props.length,index=fromRight?length:-1;fromRight?index--:++index<length;){var key=props[index];if(iteratee(iterable[key],key,iterable)===!1)break}return object}}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function toObject(value){return isObject(value)?value:Object(value)}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}var keys=require("lodash.keys"),MAX_SAFE_INTEGER=9007199254740991,baseEach=createBaseEach(baseForOwn),baseFor=createBaseFor(),getLength=baseProperty("length");module.exports=baseEach},{"lodash.keys":31}],19:[function(require,module,exports){function isObjectLike(value){return!!value&&"object"==typeof value}function arraySome(array,predicate){for(var index=-1,length=array.length;++index<length;)if(predicate(array[index],index,array))return!0;return!1}function baseIsEqual(value,other,customizer,isLoose,stackA,stackB){return value===other||(null==value||null==other||!isObject(value)&&!isObjectLike(other)?value!==value&&other!==other:baseIsEqualDeep(value,other,baseIsEqual,customizer,isLoose,stackA,stackB))}function baseIsEqualDeep(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=arrayTag,othTag=arrayTag;objIsArr||(objTag=objToString.call(object),objTag==argsTag?objTag=objectTag:objTag!=objectTag&&(objIsArr=isTypedArray(object))),othIsArr||(othTag=objToString.call(other),othTag==argsTag?othTag=objectTag:othTag!=objectTag&&(othIsArr=isTypedArray(other)));var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&!objIsArr&&!objIsObj)return equalByTag(object,other,objTag);if(!isLoose){var objIsWrapped=objIsObj&&hasOwnProperty.call(object,"__wrapped__"),othIsWrapped=othIsObj&&hasOwnProperty.call(other,"__wrapped__");if(objIsWrapped||othIsWrapped)return equalFunc(objIsWrapped?object.value():object,othIsWrapped?other.value():other,customizer,isLoose,stackA,stackB)}if(!isSameTag)return!1;stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==object)return stackB[length]==other;stackA.push(object),stackB.push(other);var result=(objIsArr?equalArrays:equalObjects)(object,other,equalFunc,customizer,isLoose,stackA,stackB);return stackA.pop(),stackB.pop(),result}function equalArrays(array,other,equalFunc,customizer,isLoose,stackA,stackB){var index=-1,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isLoose&&othLength>arrLength))return!1;for(;++index<arrLength;){var arrValue=array[index],othValue=other[index],result=customizer?customizer(isLoose?othValue:arrValue,isLoose?arrValue:othValue,index):void 0;if(void 0!==result){if(result)continue;return!1}if(isLoose){if(!arraySome(other,function(othValue){return arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB)}))return!1}else if(arrValue!==othValue&&!equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB))return!1}return!0}function equalByTag(object,other,tag){switch(tag){case boolTag:case dateTag:return+object==+other;case errorTag:return object.name==other.name&&object.message==other.message;case numberTag:return object!=+object?other!=+other:object==+other;case regexpTag:case stringTag:return object==other+""}return!1}function equalObjects(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objProps=keys(object),objLength=objProps.length,othProps=keys(other),othLength=othProps.length;if(objLength!=othLength&&!isLoose)return!1;for(var index=objLength;index--;){var key=objProps[index];if(!(isLoose?key in other:hasOwnProperty.call(other,key)))return!1}for(var skipCtor=isLoose;++index<objLength;){key=objProps[index];var objValue=object[key],othValue=other[key],result=customizer?customizer(isLoose?othValue:objValue,isLoose?objValue:othValue,key):void 0;if(!(void 0===result?equalFunc(objValue,othValue,customizer,isLoose,stackA,stackB):result))return!1;skipCtor||(skipCtor="constructor"==key)}if(!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;if(objCtor!=othCtor&&"constructor"in object&&"constructor"in other&&!("function"==typeof objCtor&&objCtor instanceof objCtor&&"function"==typeof othCtor&&othCtor instanceof othCtor))return!1}return!0}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}var isArray=require("lodash.isarray"),isTypedArray=require("lodash.istypedarray"),keys=require("lodash.keys"),argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",stringTag="[object String]",objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString;
+module.exports=baseIsEqual},{"lodash.isarray":28,"lodash.istypedarray":30,"lodash.keys":31}],20:[function(require,module,exports){function bindCallback(func,thisArg,argCount){if("function"!=typeof func)return identity;if(void 0===thisArg)return func;switch(argCount){case 1:return function(value){return func.call(thisArg,value)};case 3:return function(value,index,collection){return func.call(thisArg,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(thisArg,accumulator,value,index,collection)};case 5:return function(value,other,key,object,source){return func.call(thisArg,value,other,key,object,source)}}return function(){return func.apply(thisArg,arguments)}}function identity(value){return value}module.exports=bindCallback},{}],21:[function(require,module,exports){function createAssigner(assigner){return restParam(function(object,sources){var index=-1,length=null==object?0:sources.length,customizer=length>2?sources[length-2]:void 0,guard=length>2?sources[2]:void 0,thisArg=length>1?sources[length-1]:void 0;for("function"==typeof customizer?(customizer=bindCallback(customizer,thisArg,5),length-=2):(customizer="function"==typeof thisArg?thisArg:void 0,length-=customizer?1:0),guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=length<3?void 0:customizer,length=1);++index<length;){var source=sources[index];source&&assigner(object,source,customizer)}return object})}var bindCallback=require("lodash._bindcallback"),isIterateeCall=require("lodash._isiterateecall"),restParam=require("lodash.restparam");module.exports=createAssigner},{"lodash._bindcallback":20,"lodash._isiterateecall":23,"lodash.restparam":35}],22:[function(require,module,exports){function isObjectLike(value){return!!value&&"object"==typeof value}function getNative(object,key){var value=null==object?void 0:object[key];return isNative(value)?value:void 0}function isFunction(value){return isObject(value)&&objToString.call(value)==funcTag}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}function isNative(value){return null!=value&&(isFunction(value)?reIsNative.test(fnToString.call(value)):isObjectLike(value)&&reIsHostCtor.test(value))}var funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");module.exports=getNative},{}],23:[function(require,module,exports){function baseProperty(key){return function(object){return null==object?void 0:object[key]}}function isArrayLike(value){return null!=value&&isLength(getLength(value))}function isIndex(value,length){return value="number"==typeof value||reIsUint.test(value)?+value:-1,length=null==length?MAX_SAFE_INTEGER:length,value>-1&&value%1==0&&value<length}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;if("number"==type?isArrayLike(object)&&isIndex(index,object.length):"string"==type&&index in object){var other=object[index];return value===value?value===other:other!==other}return!1}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}var reIsUint=/^\d+$/,MAX_SAFE_INTEGER=9007199254740991,getLength=baseProperty("length");module.exports=isIterateeCall},{}],24:[function(require,module,exports){(function(global){function checkGlobal(value){return value&&value.Object===Object?value:null}var objectTypes={"function":!0,object:!0},freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType?exports:void 0,freeModule=objectTypes[typeof module]&&module&&!module.nodeType?module:void 0,freeGlobal=checkGlobal(freeExports&&freeModule&&"object"==typeof global&&global),freeSelf=checkGlobal(objectTypes[typeof self]&&self),freeWindow=checkGlobal(objectTypes[typeof window]&&window),thisGlobal=checkGlobal(objectTypes[typeof this]&&this),root=freeGlobal||freeWindow!==(thisGlobal&&thisGlobal.window)&&freeWindow||freeSelf||thisGlobal||Function("return this")();module.exports=root}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],25:[function(require,module,exports){function assignWith(object,source,customizer){for(var index=-1,props=keys(source),length=props.length;++index<length;){var key=props[index],value=object[key],result=customizer(value,source[key],key,object,source);(result===result?result===value:value!==value)&&(void 0!==value||key in object)||(object[key]=result)}return object}var baseAssign=require("lodash._baseassign"),createAssigner=require("lodash._createassigner"),keys=require("lodash.keys"),assign=createAssigner(function(object,source,customizer){return customizer?assignWith(object,source,customizer):baseAssign(object,source)});module.exports=assign},{"lodash._baseassign":15,"lodash._createassigner":21,"lodash.keys":31}],26:[function(require,module,exports){function baseClamp(number,lower,upper){return number===number&&(void 0!==upper&&(number=number<=upper?number:upper),void 0!==lower&&(number=number>=lower?number:lower)),number}function isFunction(value){var tag=isObject(value)?objectToString.call(value):"";return tag==funcTag||tag==genTag}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}function isObjectLike(value){return!!value&&"object"==typeof value}function isSymbol(value){return"symbol"==typeof value||isObjectLike(value)&&objectToString.call(value)==symbolTag}function toInteger(value){if(!value)return 0===value?value:0;if(value=toNumber(value),value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER}var remainder=value%1;return value===value?remainder?value-remainder:value:0}function toNumber(value){if(isObject(value)){var other=isFunction(value.valueOf)?value.valueOf():value;value=isObject(other)?other+"":other}if("string"!=typeof value)return 0===value?value:+value;value=value.replace(reTrim,"");var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value}function toString(value){if("string"==typeof value)return value;if(null==value)return"";if(isSymbol(value))return Symbol?symbolToString.call(value):"";var result=value+"";return"0"==result&&1/value==-INFINITY?"-0":result}function endsWith(string,target,position){string=toString(string),target="string"==typeof target?target:target+"";var length=string.length;return position=void 0===position?length:baseClamp(toInteger(position),0,length),position-=target.length,position>=0&&string.indexOf(target,position)==position}var root=require("lodash._root"),INFINITY=1/0,MAX_INTEGER=1.7976931348623157e308,NAN=NaN,funcTag="[object Function]",genTag="[object GeneratorFunction]",symbolTag="[object Symbol]",reTrim=/^\s+|\s+$/g,reIsBadHex=/^[-+]0x[0-9a-f]+$/i,reIsBinary=/^0b[01]+$/i,reIsOctal=/^0o[0-7]+$/i,freeParseInt=parseInt,objectProto=Object.prototype,objectToString=objectProto.toString,Symbol=root.Symbol,symbolProto=Symbol?Symbol.prototype:void 0,symbolToString=Symbol?symbolProto.toString:void 0;module.exports=endsWith},{"lodash._root":24}],27:[function(require,module,exports){function isArguments(value){return isArrayLikeObject(value)&&hasOwnProperty.call(value,"callee")&&(!propertyIsEnumerable.call(value,"callee")||objectToString.call(value)==argsTag)}function isArrayLike(value){return null!=value&&isLength(value.length)&&!isFunction(value)}function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value)}function isFunction(value){var tag=isObject(value)?objectToString.call(value):"";return tag==funcTag||tag==genTag}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}function isObjectLike(value){return!!value&&"object"==typeof value}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",funcTag="[object Function]",genTag="[object GeneratorFunction]",objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,objectToString=objectProto.toString,propertyIsEnumerable=objectProto.propertyIsEnumerable;module.exports=isArguments},{}],28:[function(require,module,exports){function isObjectLike(value){return!!value&&"object"==typeof value}function getNative(object,key){var value=null==object?void 0:object[key];return isNative(value)?value:void 0}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function isFunction(value){return isObject(value)&&objToString.call(value)==funcTag}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}function isNative(value){return null!=value&&(isFunction(value)?reIsNative.test(fnToString.call(value)):isObjectLike(value)&&reIsHostCtor.test(value))}var arrayTag="[object Array]",funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),nativeIsArray=getNative(Array,"isArray"),MAX_SAFE_INTEGER=9007199254740991,isArray=nativeIsArray||function(value){return isObjectLike(value)&&isLength(value.length)&&objToString.call(value)==arrayTag};module.exports=isArray},{}],29:[function(require,module,exports){function isObjectLike(value){return!!value&&"object"==typeof value}function isString(value){return"string"==typeof value||isObjectLike(value)&&objToString.call(value)==stringTag}var stringTag="[object String]",objectProto=Object.prototype,objToString=objectProto.toString;module.exports=isString},{}],30:[function(require,module,exports){function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function isObjectLike(value){return!!value&&"object"==typeof value}function isTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[objectToString.call(value)]}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var objectProto=Object.prototype,objectToString=objectProto.toString;module.exports=isTypedArray},{}],31:[function(require,module,exports){function baseProperty(key){return function(object){return null==object?void 0:object[key]}}function isArrayLike(value){return null!=value&&isLength(getLength(value))}function isIndex(value,length){return value="number"==typeof value||reIsUint.test(value)?+value:-1,length=null==length?MAX_SAFE_INTEGER:length,value>-1&&value%1==0&&value<length}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function shimKeys(object){for(var props=keysIn(object),propsLength=props.length,length=propsLength&&object.length,allowIndexes=!!length&&isLength(length)&&(isArray(object)||isArguments(object)),index=-1,result=[];++index<propsLength;){var key=props[index];(allowIndexes&&isIndex(key,length)||hasOwnProperty.call(object,key))&&result.push(key)}return result}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}function keysIn(object){if(null==object)return[];isObject(object)||(object=Object(object));var length=object.length;length=length&&isLength(length)&&(isArray(object)||isArguments(object))&&length||0;for(var Ctor=object.constructor,index=-1,isProto="function"==typeof Ctor&&Ctor.prototype===object,result=Array(length),skipIndexes=length>0;++index<length;)result[index]=index+"";for(var key in object)skipIndexes&&isIndex(key,length)||"constructor"==key&&(isProto||!hasOwnProperty.call(object,key))||result.push(key);return result}var getNative=require("lodash._getnative"),isArguments=require("lodash.isarguments"),isArray=require("lodash.isarray"),reIsUint=/^\d+$/,objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,nativeKeys=getNative(Object,"keys"),MAX_SAFE_INTEGER=9007199254740991,getLength=baseProperty("length"),keys=nativeKeys?function(object){var Ctor=null==object?void 0:object.constructor;return"function"==typeof Ctor&&Ctor.prototype===object||"function"!=typeof object&&isArrayLike(object)?shimKeys(object):isObject(object)?nativeKeys(object):[]}:shimKeys;module.exports=keys},{"lodash._getnative":22,"lodash.isarguments":27,"lodash.isarray":28}],32:[function(require,module,exports){function last(array){var length=array?array.length:0;return length?array[length-1]:void 0}module.exports=last},{}],33:[function(require,module,exports){function baseMap(collection,iteratee){var index=-1,result=isArrayLike(collection)?Array(collection.length):[];return baseEach(collection,function(value,key,collection){result[++index]=iteratee(value,key,collection)}),result}function baseProperty(key){return function(object){return null==object?void 0:object[key]}}function isArrayLike(value){return null!=value&&isLength(getLength(value))}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function map(collection,iteratee,thisArg){var func=isArray(collection)?arrayMap:baseMap;return iteratee=baseCallback(iteratee,thisArg,3),func(collection,iteratee)}var arrayMap=require("lodash._arraymap"),baseCallback=require("lodash._basecallback"),baseEach=require("lodash._baseeach"),isArray=require("lodash.isarray"),MAX_SAFE_INTEGER=9007199254740991,getLength=baseProperty("length");module.exports=map},{"lodash._arraymap":14,"lodash._basecallback":16,"lodash._baseeach":18,"lodash.isarray":28}],34:[function(require,module,exports){function toObject(value){return isObject(value)?value:Object(value)}function isObject(value){var type=typeof value;return!!value&&("object"==type||"function"==type)}function pairs(object){object=toObject(object);for(var index=-1,props=keys(object),length=props.length,result=Array(length);++index<length;){var key=props[index];result[index]=[key,object[key]]}return result}var keys=require("lodash.keys");module.exports=pairs},{"lodash.keys":31}],35:[function(require,module,exports){function restParam(func,start){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=nativeMax(void 0===start?func.length-1:+start||0,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),rest=Array(length);++index<length;)rest[index]=args[start+index];switch(start){case 0:return func.call(this,rest);case 1:return func.call(this,args[0],rest);case 2:return func.call(this,args[0],args[1],rest)}var otherArgs=Array(start+1);for(index=-1;++index<start;)otherArgs[index]=args[index];return otherArgs[start]=rest,func.apply(this,otherArgs)}}var FUNC_ERROR_TEXT="Expected a function",nativeMax=Math.max;module.exports=restParam},{}],36:[function(require,module,exports){(function(process){"use strict";function nextTick(fn,arg1,arg2,arg3){if("function"!=typeof fn)throw new TypeError('"callback" argument must be a function');var args,i,len=arguments.length;switch(len){case 0:case 1:return process.nextTick(fn);case 2:return process.nextTick(function(){fn.call(null,arg1)});case 3:return process.nextTick(function(){fn.call(null,arg1,arg2)});case 4:return process.nextTick(function(){fn.call(null,arg1,arg2,arg3)});default:for(args=new Array(len-1),i=0;i<args.length;)args[i++]=arguments[i];return process.nextTick(function(){fn.apply(null,args)})}}!process.version||0===process.version.indexOf("v0.")||0===process.version.indexOf("v1.")&&0!==process.version.indexOf("v1.8.")?module.exports=nextTick:module.exports=process.nextTick}).call(this,require("_process"))},{_process:37}],37:[function(require,module,exports){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(fun){if(cachedSetTimeout===setTimeout)return setTimeout(fun,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(fun,0);try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout)return clearTimeout(marker);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(marker);try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}function cleanUpNextTick(){draining&&currentQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var timeout=runTimeout(cleanUpNextTick);draining=!0;for(var len=queue.length;len;){for(currentQueue=queue,queue=[];++queueIndex<len;)currentQueue&&currentQueue[queueIndex].run();queueIndex=-1,len=queue.length}currentQueue=null,draining=!1,runClearTimeout(timeout)}}function Item(fun,array){this.fun=fun,this.array=array}function noop(){}var cachedSetTimeout,cachedClearTimeout,process=module.exports={};!function(){try{cachedSetTimeout="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){cachedSetTimeout=defaultSetTimout}try{cachedClearTimeout="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){cachedClearTimeout=defaultClearTimeout}}();var currentQueue,queue=[],draining=!1,queueIndex=-1;process.nextTick=function(fun){var args=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)args[i-1]=arguments[i];queue.push(new Item(fun,args)),1!==queue.length||draining||runTimeout(drainQueue)},Item.prototype.run=function(){this.fun.apply(null,this.array)},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.binding=function(name){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(dir){throw new Error("process.chdir is not supported")},process.umask=function(){return 0}},{}],38:[function(require,module,exports){(function(global){!function(root){function error(type){throw new RangeError(errors[type])}function map(array,fn){for(var length=array.length,result=[];length--;)result[length]=fn(array[length]);return result}function mapDomain(string,fn){var parts=string.split("@"),result="";parts.length>1&&(result=parts[0]+"@",string=parts[1]),string=string.replace(regexSeparators,".");var labels=string.split("."),encoded=map(labels,fn).join(".");return result+encoded}function ucs2decode(string){for(var value,extra,output=[],counter=0,length=string.length;counter<length;)value=string.charCodeAt(counter++),value>=55296&&value<=56319&&counter<length?(extra=string.charCodeAt(counter++),56320==(64512&extra)?output.push(((1023&value)<<10)+(1023&extra)+65536):(output.push(value),counter--)):output.push(value);return output}function ucs2encode(array){return map(array,function(value){var output="";return value>65535&&(value-=65536,output+=stringFromCharCode(value>>>10&1023|55296),value=56320|1023&value),output+=stringFromCharCode(value)}).join("")}function basicToDigit(codePoint){return codePoint-48<10?codePoint-22:codePoint-65<26?codePoint-65:codePoint-97<26?codePoint-97:base}function digitToBasic(digit,flag){return digit+22+75*(digit<26)-((0!=flag)<<5)}function adapt(delta,numPoints,firstTime){var k=0;for(delta=firstTime?floor(delta/damp):delta>>1,delta+=floor(delta/numPoints);delta>baseMinusTMin*tMax>>1;k+=base)delta=floor(delta/baseMinusTMin);return floor(k+(baseMinusTMin+1)*delta/(delta+skew))}function decode(input){var out,basic,j,index,oldi,w,k,digit,t,baseMinusT,output=[],inputLength=input.length,i=0,n=initialN,bias=initialBias;for(basic=input.lastIndexOf(delimiter),basic<0&&(basic=0),j=0;j<basic;++j)input.charCodeAt(j)>=128&&error("not-basic"),output.push(input.charCodeAt(j));for(index=basic>0?basic+1:0;index<inputLength;){for(oldi=i,w=1,k=base;index>=inputLength&&error("invalid-input"),digit=basicToDigit(input.charCodeAt(index++)),(digit>=base||digit>floor((maxInt-i)/w))&&error("overflow"),i+=digit*w,t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias,!(digit<t);k+=base)baseMinusT=base-t,w>floor(maxInt/baseMinusT)&&error("overflow"),w*=baseMinusT;out=output.length+1,bias=adapt(i-oldi,out,0==oldi),floor(i/out)>maxInt-n&&error("overflow"),n+=floor(i/out),i%=out,output.splice(i++,0,n)}return ucs2encode(output)}function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,inputLength,handledCPCountPlusOne,baseMinusT,qMinusT,output=[];for(input=ucs2decode(input),inputLength=input.length,n=initialN,delta=0,bias=initialBias,j=0;j<inputLength;++j)currentValue=input[j],currentValue<128&&output.push(stringFromCharCode(currentValue));for(handledCPCount=basicLength=output.length,basicLength&&output.push(delimiter);handledCPCount<inputLength;){for(m=maxInt,j=0;j<inputLength;++j)currentValue=input[j],currentValue>=n&&currentValue<m&&(m=currentValue);for(handledCPCountPlusOne=handledCPCount+1,m-n>floor((maxInt-delta)/handledCPCountPlusOne)&&error("overflow"),delta+=(m-n)*handledCPCountPlusOne,n=m,j=0;j<inputLength;++j)if(currentValue=input[j],currentValue<n&&++delta>maxInt&&error("overflow"),currentValue==n){for(q=delta,k=base;t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias,!(q<t);k+=base)qMinusT=q-t,baseMinusT=base-t,output.push(stringFromCharCode(digitToBasic(t+qMinusT%baseMinusT,0))),q=floor(qMinusT/baseMinusT);output.push(stringFromCharCode(digitToBasic(q,0))),bias=adapt(delta,handledCPCountPlusOne,handledCPCount==basicLength),delta=0,++handledCPCount}++delta,++n}return output.join("")}function toUnicode(input){return mapDomain(input,function(string){return regexPunycode.test(string)?decode(string.slice(4).toLowerCase()):string})}function toASCII(input){return mapDomain(input,function(string){return regexNonASCII.test(string)?"xn--"+encode(string):string})}var freeExports="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule="object"==typeof module&&module&&!module.nodeType&&module,freeGlobal="object"==typeof global&&global;freeGlobal.global!==freeGlobal&&freeGlobal.window!==freeGlobal&&freeGlobal.self!==freeGlobal||(root=freeGlobal);var punycode,key,maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter="-",regexPunycode=/^xn--/,regexNonASCII=/[^\x20-\x7E]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode;if(punycode={version:"1.4.1",ucs2:{decode:ucs2decode,encode:ucs2encode},decode:decode,encode:encode,toASCII:toASCII,toUnicode:toUnicode},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return punycode});else if(freeExports&&freeModule)if(module.exports==freeExports)freeModule.exports=punycode;else for(key in punycode)punycode.hasOwnProperty(key)&&(freeExports[key]=punycode[key]);else root.punycode=punycode}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],39:[function(require,module,exports){"use strict";function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}module.exports=function(qs,sep,eq,options){sep=sep||"&",eq=eq||"=";var obj={};if("string"!=typeof qs||0===qs.length)return obj;var regexp=/\+/g;qs=qs.split(sep);var maxKeys=1e3;options&&"number"==typeof options.maxKeys&&(maxKeys=options.maxKeys);var len=qs.length;maxKeys>0&&len>maxKeys&&(len=maxKeys);for(var i=0;i<len;++i){var kstr,vstr,k,v,x=qs[i].replace(regexp,"%20"),idx=x.indexOf(eq);idx>=0?(kstr=x.substr(0,idx),vstr=x.substr(idx+1)):(kstr=x,vstr=""),k=decodeURIComponent(kstr),v=decodeURIComponent(vstr),hasOwnProperty(obj,k)?isArray(obj[k])?obj[k].push(v):obj[k]=[obj[k],v]:obj[k]=v}return obj};var isArray=Array.isArray||function(xs){return"[object Array]"===Object.prototype.toString.call(xs)}},{}],40:[function(require,module,exports){"use strict";function map(xs,f){if(xs.map)return xs.map(f);for(var res=[],i=0;i<xs.length;i++)res.push(f(xs[i],i));return res}var stringifyPrimitive=function(v){switch(typeof v){case"string":return v;case"boolean":return v?"true":"false";case"number":return isFinite(v)?v:"";default:return""}};module.exports=function(obj,sep,eq,name){return sep=sep||"&",eq=eq||"=",null===obj&&(obj=void 0),"object"==typeof obj?map(objectKeys(obj),function(k){var ks=encodeURIComponent(stringifyPrimitive(k))+eq;return isArray(obj[k])?map(obj[k],function(v){return ks+encodeURIComponent(stringifyPrimitive(v))}).join(sep):ks+encodeURIComponent(stringifyPrimitive(obj[k]))}).join(sep):name?encodeURIComponent(stringifyPrimitive(name))+eq+encodeURIComponent(stringifyPrimitive(obj)):""};var isArray=Array.isArray||function(xs){return"[object Array]"===Object.prototype.toString.call(xs)},objectKeys=Object.keys||function(obj){var res=[];for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&res.push(key);return res}},{}],41:[function(require,module,exports){"use strict";exports.decode=exports.parse=require("./decode"),exports.encode=exports.stringify=require("./encode")},{"./decode":39,"./encode":40}],42:[function(require,module,exports){"use strict";function Duplex(options){return this instanceof Duplex?(Readable.call(this,options),Writable.call(this,options),options&&options.readable===!1&&(this.readable=!1),options&&options.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,options&&options.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once("end",onend)):new Duplex(options)}function onend(){this.allowHalfOpen||this._writableState.ended||processNextTick(onEndNT,this)}function onEndNT(self){self.end()}var objectKeys=Object.keys||function(obj){var keys=[];for(var key in obj)keys.push(key);return keys};module.exports=Duplex;var processNextTick=require("process-nextick-args"),util=require("core-util-is");util.inherits=require("inherits");var Readable=require("./_stream_readable"),Writable=require("./_stream_writable");util.inherits(Duplex,Readable);for(var keys=objectKeys(Writable.prototype),v=0;v<keys.length;v++){var method=keys[v];Duplex.prototype[method]||(Duplex.prototype[method]=Writable.prototype[method])}},{"./_stream_readable":44,"./_stream_writable":46,"core-util-is":7,inherits:11,"process-nextick-args":36}],43:[function(require,module,exports){"use strict";function PassThrough(options){return this instanceof PassThrough?void Transform.call(this,options):new PassThrough(options)}module.exports=PassThrough;var Transform=require("./_stream_transform"),util=require("core-util-is");util.inherits=require("inherits"),util.inherits(PassThrough,Transform),PassThrough.prototype._transform=function(chunk,encoding,cb){cb(null,chunk)}},{"./_stream_transform":45,"core-util-is":7,inherits:11}],44:[function(require,module,exports){(function(process){"use strict";function prependListener(emitter,event,fn){return"function"==typeof emitter.prependListener?emitter.prependListener(event,fn):void(emitter._events&&emitter._events[event]?isArray(emitter._events[event])?emitter._events[event].unshift(fn):emitter._events[event]=[fn,emitter._events[event]]:emitter.on(event,fn))}function ReadableState(options,stream){Duplex=Duplex||require("./_stream_duplex"),options=options||{},this.objectMode=!!options.objectMode,stream instanceof Duplex&&(this.objectMode=this.objectMode||!!options.readableObjectMode);var hwm=options.highWaterMark,defaultHwm=this.objectMode?16:16384;this.highWaterMark=hwm||0===hwm?hwm:defaultHwm,this.highWaterMark=~~this.highWaterMark,this.buffer=new BufferList,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=options.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,options.encoding&&(StringDecoder||(StringDecoder=require("string_decoder/").StringDecoder),this.decoder=new StringDecoder(options.encoding),this.encoding=options.encoding)}function Readable(options){return Duplex=Duplex||require("./_stream_duplex"),this instanceof Readable?(this._readableState=new ReadableState(options,this),this.readable=!0,options&&"function"==typeof options.read&&(this._read=options.read),void Stream.call(this)):new Readable(options)}function readableAddChunk(stream,state,chunk,encoding,addToFront){var er=chunkInvalid(state,chunk);if(er)stream.emit("error",er);else if(null===chunk)state.reading=!1,onEofChunk(stream,state);else if(state.objectMode||chunk&&chunk.length>0)if(state.ended&&!addToFront){var e=new Error("stream.push() after EOF");stream.emit("error",e)}else if(state.endEmitted&&addToFront){var _e=new Error("stream.unshift() after end event");stream.emit("error",_e)}else{var skipAdd;!state.decoder||addToFront||encoding||(chunk=state.decoder.write(chunk),skipAdd=!state.objectMode&&0===chunk.length),addToFront||(state.reading=!1),skipAdd||(state.flowing&&0===state.length&&!state.sync?(stream.emit("data",chunk),stream.read(0)):(state.length+=state.objectMode?1:chunk.length,addToFront?state.buffer.unshift(chunk):state.buffer.push(chunk),state.needReadable&&emitReadable(stream))),maybeReadMore(stream,state)}else addToFront||(state.reading=!1);return needMoreData(state)}function needMoreData(state){return!state.ended&&(state.needReadable||state.length<state.highWaterMark||0===state.length)}function computeNewHighWaterMark(n){return n>=MAX_HWM?n=MAX_HWM:(n--,n|=n>>>1,n|=n>>>2,n|=n>>>4,n|=n>>>8,n|=n>>>16,n++),n}function howMuchToRead(n,state){return n<=0||0===state.length&&state.ended?0:state.objectMode?1:n!==n?state.flowing&&state.length?state.buffer.head.data.length:state.length:(n>state.highWaterMark&&(state.highWaterMark=computeNewHighWaterMark(n)),
+n<=state.length?n:state.ended?state.length:(state.needReadable=!0,0))}function chunkInvalid(state,chunk){var er=null;return Buffer.isBuffer(chunk)||"string"==typeof chunk||null===chunk||void 0===chunk||state.objectMode||(er=new TypeError("Invalid non-string/buffer chunk")),er}function onEofChunk(stream,state){if(!state.ended){if(state.decoder){var chunk=state.decoder.end();chunk&&chunk.length&&(state.buffer.push(chunk),state.length+=state.objectMode?1:chunk.length)}state.ended=!0,emitReadable(stream)}}function emitReadable(stream){var state=stream._readableState;state.needReadable=!1,state.emittedReadable||(debug("emitReadable",state.flowing),state.emittedReadable=!0,state.sync?processNextTick(emitReadable_,stream):emitReadable_(stream))}function emitReadable_(stream){debug("emit readable"),stream.emit("readable"),flow(stream)}function maybeReadMore(stream,state){state.readingMore||(state.readingMore=!0,processNextTick(maybeReadMore_,stream,state))}function maybeReadMore_(stream,state){for(var len=state.length;!state.reading&&!state.flowing&&!state.ended&&state.length<state.highWaterMark&&(debug("maybeReadMore read 0"),stream.read(0),len!==state.length);)len=state.length;state.readingMore=!1}function pipeOnDrain(src){return function(){var state=src._readableState;debug("pipeOnDrain",state.awaitDrain),state.awaitDrain&&state.awaitDrain--,0===state.awaitDrain&&EElistenerCount(src,"data")&&(state.flowing=!0,flow(src))}}function nReadingNextTick(self){debug("readable nexttick read 0"),self.read(0)}function resume(stream,state){state.resumeScheduled||(state.resumeScheduled=!0,processNextTick(resume_,stream,state))}function resume_(stream,state){state.reading||(debug("resume read 0"),stream.read(0)),state.resumeScheduled=!1,state.awaitDrain=0,stream.emit("resume"),flow(stream),state.flowing&&!state.reading&&stream.read(0)}function flow(stream){var state=stream._readableState;for(debug("flow",state.flowing);state.flowing&&null!==stream.read(););}function fromList(n,state){if(0===state.length)return null;var ret;return state.objectMode?ret=state.buffer.shift():!n||n>=state.length?(ret=state.decoder?state.buffer.join(""):1===state.buffer.length?state.buffer.head.data:state.buffer.concat(state.length),state.buffer.clear()):ret=fromListPartial(n,state.buffer,state.decoder),ret}function fromListPartial(n,list,hasStrings){var ret;return n<list.head.data.length?(ret=list.head.data.slice(0,n),list.head.data=list.head.data.slice(n)):ret=n===list.head.data.length?list.shift():hasStrings?copyFromBufferString(n,list):copyFromBuffer(n,list),ret}function copyFromBufferString(n,list){var p=list.head,c=1,ret=p.data;for(n-=ret.length;p=p.next;){var str=p.data,nb=n>str.length?str.length:n;if(ret+=nb===str.length?str:str.slice(0,n),n-=nb,0===n){nb===str.length?(++c,p.next?list.head=p.next:list.head=list.tail=null):(list.head=p,p.data=str.slice(nb));break}++c}return list.length-=c,ret}function copyFromBuffer(n,list){var ret=bufferShim.allocUnsafe(n),p=list.head,c=1;for(p.data.copy(ret),n-=p.data.length;p=p.next;){var buf=p.data,nb=n>buf.length?buf.length:n;if(buf.copy(ret,ret.length-n,0,nb),n-=nb,0===n){nb===buf.length?(++c,p.next?list.head=p.next:list.head=list.tail=null):(list.head=p,p.data=buf.slice(nb));break}++c}return list.length-=c,ret}function endReadable(stream){var state=stream._readableState;if(state.length>0)throw new Error('"endReadable()" called on non-empty stream');state.endEmitted||(state.ended=!0,processNextTick(endReadableNT,state,stream))}function endReadableNT(state,stream){state.endEmitted||0!==state.length||(state.endEmitted=!0,stream.readable=!1,stream.emit("end"))}function forEach(xs,f){for(var i=0,l=xs.length;i<l;i++)f(xs[i],i)}function indexOf(xs,x){for(var i=0,l=xs.length;i<l;i++)if(xs[i]===x)return i;return-1}module.exports=Readable;var processNextTick=require("process-nextick-args"),isArray=require("isarray");Readable.ReadableState=ReadableState;var Stream,EElistenerCount=(require("events").EventEmitter,function(emitter,type){return emitter.listeners(type).length});!function(){try{Stream=require("stream")}catch(_){}finally{Stream||(Stream=require("events").EventEmitter)}}();var Buffer=require("buffer").Buffer,bufferShim=require("buffer-shims"),util=require("core-util-is");util.inherits=require("inherits");var debugUtil=require("util"),debug=void 0;debug=debugUtil&&debugUtil.debuglog?debugUtil.debuglog("stream"):function(){};var StringDecoder,BufferList=require("./internal/streams/BufferList");util.inherits(Readable,Stream);var Duplex,Duplex;Readable.prototype.push=function(chunk,encoding){var state=this._readableState;return state.objectMode||"string"!=typeof chunk||(encoding=encoding||state.defaultEncoding,encoding!==state.encoding&&(chunk=bufferShim.from(chunk,encoding),encoding="")),readableAddChunk(this,state,chunk,encoding,!1)},Readable.prototype.unshift=function(chunk){var state=this._readableState;return readableAddChunk(this,state,chunk,"",!0)},Readable.prototype.isPaused=function(){return this._readableState.flowing===!1},Readable.prototype.setEncoding=function(enc){return StringDecoder||(StringDecoder=require("string_decoder/").StringDecoder),this._readableState.decoder=new StringDecoder(enc),this._readableState.encoding=enc,this};var MAX_HWM=8388608;Readable.prototype.read=function(n){debug("read",n),n=parseInt(n,10);var state=this._readableState,nOrig=n;if(0!==n&&(state.emittedReadable=!1),0===n&&state.needReadable&&(state.length>=state.highWaterMark||state.ended))return debug("read: emitReadable",state.length,state.ended),0===state.length&&state.ended?endReadable(this):emitReadable(this),null;if(n=howMuchToRead(n,state),0===n&&state.ended)return 0===state.length&&endReadable(this),null;var doRead=state.needReadable;debug("need readable",doRead),(0===state.length||state.length-n<state.highWaterMark)&&(doRead=!0,debug("length less than watermark",doRead)),state.ended||state.reading?(doRead=!1,debug("reading or ended",doRead)):doRead&&(debug("do read"),state.reading=!0,state.sync=!0,0===state.length&&(state.needReadable=!0),this._read(state.highWaterMark),state.sync=!1,state.reading||(n=howMuchToRead(nOrig,state)));var ret;return ret=n>0?fromList(n,state):null,null===ret?(state.needReadable=!0,n=0):state.length-=n,0===state.length&&(state.ended||(state.needReadable=!0),nOrig!==n&&state.ended&&endReadable(this)),null!==ret&&this.emit("data",ret),ret},Readable.prototype._read=function(n){this.emit("error",new Error("not implemented"))},Readable.prototype.pipe=function(dest,pipeOpts){function onunpipe(readable){debug("onunpipe"),readable===src&&cleanup()}function onend(){debug("onend"),dest.end()}function cleanup(){debug("cleanup"),dest.removeListener("close",onclose),dest.removeListener("finish",onfinish),dest.removeListener("drain",ondrain),dest.removeListener("error",onerror),dest.removeListener("unpipe",onunpipe),src.removeListener("end",onend),src.removeListener("end",cleanup),src.removeListener("data",ondata),cleanedUp=!0,!state.awaitDrain||dest._writableState&&!dest._writableState.needDrain||ondrain()}function ondata(chunk){debug("ondata"),increasedAwaitDrain=!1;var ret=dest.write(chunk);!1!==ret||increasedAwaitDrain||((1===state.pipesCount&&state.pipes===dest||state.pipesCount>1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp&&(debug("false write response, pause",src._readableState.awaitDrain),src._readableState.awaitDrain++,increasedAwaitDrain=!0),src.pause())}function onerror(er){debug("onerror",er),unpipe(),dest.removeListener("error",onerror),0===EElistenerCount(dest,"error")&&dest.emit("error",er)}function onclose(){dest.removeListener("finish",onfinish),unpipe()}function onfinish(){debug("onfinish"),dest.removeListener("close",onclose),unpipe()}function unpipe(){debug("unpipe"),src.unpipe(dest)}var src=this,state=this._readableState;switch(state.pipesCount){case 0:state.pipes=dest;break;case 1:state.pipes=[state.pipes,dest];break;default:state.pipes.push(dest)}state.pipesCount+=1,debug("pipe count=%d opts=%j",state.pipesCount,pipeOpts);var doEnd=(!pipeOpts||pipeOpts.end!==!1)&&dest!==process.stdout&&dest!==process.stderr,endFn=doEnd?onend:cleanup;state.endEmitted?processNextTick(endFn):src.once("end",endFn),dest.on("unpipe",onunpipe);var ondrain=pipeOnDrain(src);dest.on("drain",ondrain);var cleanedUp=!1,increasedAwaitDrain=!1;return src.on("data",ondata),prependListener(dest,"error",onerror),dest.once("close",onclose),dest.once("finish",onfinish),dest.emit("pipe",src),state.flowing||(debug("pipe resume"),src.resume()),dest},Readable.prototype.unpipe=function(dest){var state=this._readableState;if(0===state.pipesCount)return this;if(1===state.pipesCount)return dest&&dest!==state.pipes?this:(dest||(dest=state.pipes),state.pipes=null,state.pipesCount=0,state.flowing=!1,dest&&dest.emit("unpipe",this),this);if(!dest){var dests=state.pipes,len=state.pipesCount;state.pipes=null,state.pipesCount=0,state.flowing=!1;for(var _i=0;_i<len;_i++)dests[_i].emit("unpipe",this);return this}var i=indexOf(state.pipes,dest);return i===-1?this:(state.pipes.splice(i,1),state.pipesCount-=1,1===state.pipesCount&&(state.pipes=state.pipes[0]),dest.emit("unpipe",this),this)},Readable.prototype.on=function(ev,fn){var res=Stream.prototype.on.call(this,ev,fn);if("data"===ev)this._readableState.flowing!==!1&&this.resume();else if("readable"===ev){var state=this._readableState;state.endEmitted||state.readableListening||(state.readableListening=state.needReadable=!0,state.emittedReadable=!1,state.reading?state.length&&emitReadable(this,state):processNextTick(nReadingNextTick,this))}return res},Readable.prototype.addListener=Readable.prototype.on,Readable.prototype.resume=function(){var state=this._readableState;return state.flowing||(debug("resume"),state.flowing=!0,resume(this,state)),this},Readable.prototype.pause=function(){return debug("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(debug("pause"),this._readableState.flowing=!1,this.emit("pause")),this},Readable.prototype.wrap=function(stream){var state=this._readableState,paused=!1,self=this;stream.on("end",function(){if(debug("wrapped end"),state.decoder&&!state.ended){var chunk=state.decoder.end();chunk&&chunk.length&&self.push(chunk)}self.push(null)}),stream.on("data",function(chunk){if(debug("wrapped data"),state.decoder&&(chunk=state.decoder.write(chunk)),(!state.objectMode||null!==chunk&&void 0!==chunk)&&(state.objectMode||chunk&&chunk.length)){var ret=self.push(chunk);ret||(paused=!0,stream.pause())}});for(var i in stream)void 0===this[i]&&"function"==typeof stream[i]&&(this[i]=function(method){return function(){return stream[method].apply(stream,arguments)}}(i));var events=["error","close","destroy","pause","resume"];return forEach(events,function(ev){stream.on(ev,self.emit.bind(self,ev))}),self._read=function(n){debug("wrapped _read",n),paused&&(paused=!1,stream.resume())},self},Readable._fromList=fromList}).call(this,require("_process"))},{"./_stream_duplex":42,"./internal/streams/BufferList":47,_process:37,buffer:5,"buffer-shims":4,"core-util-is":7,events:8,inherits:11,isarray:13,"process-nextick-args":36,"string_decoder/":53,util:3}],45:[function(require,module,exports){"use strict";function TransformState(stream){this.afterTransform=function(er,data){return afterTransform(stream,er,data)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function afterTransform(stream,er,data){var ts=stream._transformState;ts.transforming=!1;var cb=ts.writecb;if(!cb)return stream.emit("error",new Error("no writecb in Transform class"));ts.writechunk=null,ts.writecb=null,null!==data&&void 0!==data&&stream.push(data),cb(er);var rs=stream._readableState;rs.reading=!1,(rs.needReadable||rs.length<rs.highWaterMark)&&stream._read(rs.highWaterMark)}function Transform(options){if(!(this instanceof Transform))return new Transform(options);Duplex.call(this,options),this._transformState=new TransformState(this);var stream=this;this._readableState.needReadable=!0,this._readableState.sync=!1,options&&("function"==typeof options.transform&&(this._transform=options.transform),"function"==typeof options.flush&&(this._flush=options.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(er){done(stream,er)}):done(stream)})}function done(stream,er){if(er)return stream.emit("error",er);var ws=stream._writableState,ts=stream._transformState;if(ws.length)throw new Error("Calling transform done when ws.length != 0");if(ts.transforming)throw new Error("Calling transform done when still transforming");return stream.push(null)}module.exports=Transform;var Duplex=require("./_stream_duplex"),util=require("core-util-is");util.inherits=require("inherits"),util.inherits(Transform,Duplex),Transform.prototype.push=function(chunk,encoding){return this._transformState.needTransform=!1,Duplex.prototype.push.call(this,chunk,encoding)},Transform.prototype._transform=function(chunk,encoding,cb){throw new Error("Not implemented")},Transform.prototype._write=function(chunk,encoding,cb){var ts=this._transformState;if(ts.writecb=cb,ts.writechunk=chunk,ts.writeencoding=encoding,!ts.transforming){var rs=this._readableState;(ts.needTransform||rs.needReadable||rs.length<rs.highWaterMark)&&this._read(rs.highWaterMark)}},Transform.prototype._read=function(n){var ts=this._transformState;null!==ts.writechunk&&ts.writecb&&!ts.transforming?(ts.transforming=!0,this._transform(ts.writechunk,ts.writeencoding,ts.afterTransform)):ts.needTransform=!0}},{"./_stream_duplex":42,"core-util-is":7,inherits:11}],46:[function(require,module,exports){(function(process){"use strict";function nop(){}function WriteReq(chunk,encoding,cb){this.chunk=chunk,this.encoding=encoding,this.callback=cb,this.next=null}function WritableState(options,stream){Duplex=Duplex||require("./_stream_duplex"),options=options||{},this.objectMode=!!options.objectMode,stream instanceof Duplex&&(this.objectMode=this.objectMode||!!options.writableObjectMode);var hwm=options.highWaterMark,defaultHwm=this.objectMode?16:16384;this.highWaterMark=hwm||0===hwm?hwm:defaultHwm,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var noDecode=options.decodeStrings===!1;this.decodeStrings=!noDecode,this.defaultEncoding=options.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(er){onwrite(stream,er)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new CorkedRequest(this)}function Writable(options){return Duplex=Duplex||require("./_stream_duplex"),this instanceof Writable||this instanceof Duplex?(this._writableState=new WritableState(options,this),this.writable=!0,options&&("function"==typeof options.write&&(this._write=options.write),"function"==typeof options.writev&&(this._writev=options.writev)),void Stream.call(this)):new Writable(options)}function writeAfterEnd(stream,cb){var er=new Error("write after end");stream.emit("error",er),processNextTick(cb,er)}function validChunk(stream,state,chunk,cb){var valid=!0,er=!1;return null===chunk?er=new TypeError("May not write null values to stream"):Buffer.isBuffer(chunk)||"string"==typeof chunk||void 0===chunk||state.objectMode||(er=new TypeError("Invalid non-string/buffer chunk")),er&&(stream.emit("error",er),processNextTick(cb,er),valid=!1),valid}function decodeChunk(state,chunk,encoding){return state.objectMode||state.decodeStrings===!1||"string"!=typeof chunk||(chunk=bufferShim.from(chunk,encoding)),chunk}function writeOrBuffer(stream,state,chunk,encoding,cb){chunk=decodeChunk(state,chunk,encoding),Buffer.isBuffer(chunk)&&(encoding="buffer");var len=state.objectMode?1:chunk.length;state.length+=len;var ret=state.length<state.highWaterMark;if(ret||(state.needDrain=!0),state.writing||state.corked){var last=state.lastBufferedRequest;state.lastBufferedRequest=new WriteReq(chunk,encoding,cb),last?last.next=state.lastBufferedRequest:state.bufferedRequest=state.lastBufferedRequest,state.bufferedRequestCount+=1}else doWrite(stream,state,!1,len,chunk,encoding,cb);return ret}function doWrite(stream,state,writev,len,chunk,encoding,cb){state.writelen=len,state.writecb=cb,state.writing=!0,state.sync=!0,writev?stream._writev(chunk,state.onwrite):stream._write(chunk,encoding,state.onwrite),state.sync=!1}function onwriteError(stream,state,sync,er,cb){--state.pendingcb,sync?processNextTick(cb,er):cb(er),stream._writableState.errorEmitted=!0,stream.emit("error",er)}function onwriteStateUpdate(state){state.writing=!1,state.writecb=null,state.length-=state.writelen,state.writelen=0}function onwrite(stream,er){var state=stream._writableState,sync=state.sync,cb=state.writecb;if(onwriteStateUpdate(state),er)onwriteError(stream,state,sync,er,cb);else{var finished=needFinish(state);finished||state.corked||state.bufferProcessing||!state.bufferedRequest||clearBuffer(stream,state),sync?asyncWrite(afterWrite,stream,state,finished,cb):afterWrite(stream,state,finished,cb)}}function afterWrite(stream,state,finished,cb){finished||onwriteDrain(stream,state),state.pendingcb--,cb(),finishMaybe(stream,state)}function onwriteDrain(stream,state){0===state.length&&state.needDrain&&(state.needDrain=!1,stream.emit("drain"))}function clearBuffer(stream,state){state.bufferProcessing=!0;var entry=state.bufferedRequest;if(stream._writev&&entry&&entry.next){var l=state.bufferedRequestCount,buffer=new Array(l),holder=state.corkedRequestsFree;holder.entry=entry;for(var count=0;entry;)buffer[count]=entry,entry=entry.next,count+=1;doWrite(stream,state,!0,state.length,buffer,"",holder.finish),state.pendingcb++,state.lastBufferedRequest=null,holder.next?(state.corkedRequestsFree=holder.next,holder.next=null):state.corkedRequestsFree=new CorkedRequest(state)}else{for(;entry;){var chunk=entry.chunk,encoding=entry.encoding,cb=entry.callback,len=state.objectMode?1:chunk.length;if(doWrite(stream,state,!1,len,chunk,encoding,cb),entry=entry.next,state.writing)break}null===entry&&(state.lastBufferedRequest=null)}state.bufferedRequestCount=0,state.bufferedRequest=entry,state.bufferProcessing=!1}function needFinish(state){return state.ending&&0===state.length&&null===state.bufferedRequest&&!state.finished&&!state.writing}function prefinish(stream,state){state.prefinished||(state.prefinished=!0,stream.emit("prefinish"))}function finishMaybe(stream,state){var need=needFinish(state);return need&&(0===state.pendingcb?(prefinish(stream,state),state.finished=!0,stream.emit("finish")):prefinish(stream,state)),need}function endWritable(stream,state,cb){state.ending=!0,finishMaybe(stream,state),cb&&(state.finished?processNextTick(cb):stream.once("finish",cb)),state.ended=!0,stream.writable=!1}function CorkedRequest(state){var _this=this;this.next=null,this.entry=null,this.finish=function(err){var entry=_this.entry;for(_this.entry=null;entry;){var cb=entry.callback;state.pendingcb--,cb(err),entry=entry.next}state.corkedRequestsFree?state.corkedRequestsFree.next=_this:state.corkedRequestsFree=_this}}module.exports=Writable;var processNextTick=require("process-nextick-args"),asyncWrite=!process.browser&&["v0.10","v0.9."].indexOf(process.version.slice(0,5))>-1?setImmediate:processNextTick;Writable.WritableState=WritableState;var util=require("core-util-is");util.inherits=require("inherits");var Stream,internalUtil={deprecate:require("util-deprecate")};!function(){try{Stream=require("stream")}catch(_){}finally{Stream||(Stream=require("events").EventEmitter)}}();var Buffer=require("buffer").Buffer,bufferShim=require("buffer-shims");util.inherits(Writable,Stream);var Duplex;WritableState.prototype.getBuffer=function(){for(var current=this.bufferedRequest,out=[];current;)out.push(current),current=current.next;return out},function(){try{Object.defineProperty(WritableState.prototype,"buffer",{get:internalUtil.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(_){}}();var Duplex;Writable.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},Writable.prototype.write=function(chunk,encoding,cb){var state=this._writableState,ret=!1;return"function"==typeof encoding&&(cb=encoding,encoding=null),Buffer.isBuffer(chunk)?encoding="buffer":encoding||(encoding=state.defaultEncoding),"function"!=typeof cb&&(cb=nop),state.ended?writeAfterEnd(this,cb):validChunk(this,state,chunk,cb)&&(state.pendingcb++,ret=writeOrBuffer(this,state,chunk,encoding,cb)),ret},Writable.prototype.cork=function(){var state=this._writableState;state.corked++},Writable.prototype.uncork=function(){var state=this._writableState;state.corked&&(state.corked--,state.writing||state.corked||state.finished||state.bufferProcessing||!state.bufferedRequest||clearBuffer(this,state))},Writable.prototype.setDefaultEncoding=function(encoding){if("string"==typeof encoding&&(encoding=encoding.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((encoding+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+encoding);return this._writableState.defaultEncoding=encoding,this},Writable.prototype._write=function(chunk,encoding,cb){cb(new Error("not implemented"))},Writable.prototype._writev=null,Writable.prototype.end=function(chunk,encoding,cb){var state=this._writableState;"function"==typeof chunk?(cb=chunk,chunk=null,encoding=null):"function"==typeof encoding&&(cb=encoding,encoding=null),null!==chunk&&void 0!==chunk&&this.write(chunk,encoding),state.corked&&(state.corked=1,this.uncork()),state.ending||state.finished||endWritable(this,state,cb)}}).call(this,require("_process"))},{"./_stream_duplex":42,_process:37,buffer:5,"buffer-shims":4,"core-util-is":7,events:8,inherits:11,"process-nextick-args":36,"util-deprecate":57}],47:[function(require,module,exports){"use strict";function BufferList(){this.head=null,this.tail=null,this.length=0}var bufferShim=(require("buffer").Buffer,require("buffer-shims"));module.exports=BufferList,BufferList.prototype.push=function(v){var entry={data:v,next:null};this.length>0?this.tail.next=entry:this.head=entry,this.tail=entry,++this.length},BufferList.prototype.unshift=function(v){var entry={data:v,next:this.head};0===this.length&&(this.tail=entry),this.head=entry,++this.length},BufferList.prototype.shift=function(){if(0!==this.length){var ret=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,ret}},BufferList.prototype.clear=function(){this.head=this.tail=null,this.length=0},BufferList.prototype.join=function(s){if(0===this.length)return"";for(var p=this.head,ret=""+p.data;p=p.next;)ret+=s+p.data;return ret},BufferList.prototype.concat=function(n){if(0===this.length)return bufferShim.alloc(0);if(1===this.length)return this.head.data;for(var ret=bufferShim.allocUnsafe(n>>>0),p=this.head,i=0;p;)p.data.copy(ret,i),i+=p.data.length,p=p.next;return ret}},{buffer:5,"buffer-shims":4}],48:[function(require,module,exports){(function(process){var Stream=function(){try{return require("stream")}catch(_){}}();exports=module.exports=require("./lib/_stream_readable.js"),exports.Stream=Stream||exports,exports.Readable=exports,exports.Writable=require("./lib/_stream_writable.js"),exports.Duplex=require("./lib/_stream_duplex.js"),exports.Transform=require("./lib/_stream_transform.js"),exports.PassThrough=require("./lib/_stream_passthrough.js"),!process.browser&&"disable"===process.env.READABLE_STREAM&&Stream&&(module.exports=Stream)}).call(this,require("_process"))},{"./lib/_stream_duplex.js":42,"./lib/_stream_passthrough.js":43,"./lib/_stream_readable.js":44,"./lib/_stream_transform.js":45,"./lib/_stream_writable.js":46,_process:37}],49:[function(require,module,exports){(function(global){var ClientRequest=require("./lib/request"),extend=require("xtend"),statusCodes=require("builtin-status-codes"),url=require("url"),http=exports;http.request=function(opts,cb){opts="string"==typeof opts?url.parse(opts):extend(opts);var defaultProtocol=global.location.protocol.search(/^https?:$/)===-1?"http:":"",protocol=opts.protocol||defaultProtocol,host=opts.hostname||opts.host,port=opts.port,path=opts.path||"/";host&&host.indexOf(":")!==-1&&(host="["+host+"]"),opts.url=(host?protocol+"//"+host:"")+(port?":"+port:"")+path,opts.method=(opts.method||"GET").toUpperCase(),opts.headers=opts.headers||{};var req=new ClientRequest(opts);return cb&&req.on("response",cb),req},http.get=function(opts,cb){var req=http.request(opts,cb);return req.end(),req},http.Agent=function(){},http.Agent.defaultMaxSockets=4,http.STATUS_CODES=statusCodes,http.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"]}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./lib/request":51,"builtin-status-codes":6,url:55,xtend:58}],50:[function(require,module,exports){(function(global){function checkTypeSupport(type){try{return xhr.responseType=type,xhr.responseType===type}catch(e){}return!1}function isFunction(value){return"function"==typeof value}exports.fetch=isFunction(global.fetch)&&isFunction(global.ReadableStream),exports.blobConstructor=!1;try{new Blob([new ArrayBuffer(1)]),exports.blobConstructor=!0}catch(e){}var xhr=new global.XMLHttpRequest;xhr.open("GET",global.location.host?"/":"https://example.com");var haveArrayBuffer="undefined"!=typeof global.ArrayBuffer,haveSlice=haveArrayBuffer&&isFunction(global.ArrayBuffer.prototype.slice);exports.arraybuffer=haveArrayBuffer&&checkTypeSupport("arraybuffer"),exports.msstream=!exports.fetch&&haveSlice&&checkTypeSupport("ms-stream"),exports.mozchunkedarraybuffer=!exports.fetch&&haveArrayBuffer&&checkTypeSupport("moz-chunked-arraybuffer"),exports.overrideMimeType=isFunction(xhr.overrideMimeType),exports.vbArray=isFunction(global.VBArray),xhr=null}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],51:[function(require,module,exports){(function(process,global,Buffer){function decideMode(preferBinary,useFetch){return capability.fetch&&useFetch?"fetch":capability.mozchunkedarraybuffer?"moz-chunked-arraybuffer":capability.msstream?"ms-stream":capability.arraybuffer&&preferBinary?"arraybuffer":capability.vbArray&&preferBinary?"text:vbarray":"text"}function statusValid(xhr){try{var status=xhr.status;return null!==status&&0!==status}catch(e){return!1}}var capability=require("./capability"),inherits=require("inherits"),response=require("./response"),stream=require("readable-stream"),toArrayBuffer=require("to-arraybuffer"),IncomingMessage=response.IncomingMessage,rStates=response.readyStates,ClientRequest=module.exports=function(opts){var self=this;stream.Writable.call(self),self._opts=opts,self._body=[],self._headers={},opts.auth&&self.setHeader("Authorization","Basic "+new Buffer(opts.auth).toString("base64")),Object.keys(opts.headers).forEach(function(name){self.setHeader(name,opts.headers[name])});var preferBinary,useFetch=!0;if("disable-fetch"===opts.mode)useFetch=!1,preferBinary=!0;else if("prefer-streaming"===opts.mode)preferBinary=!1;else if("allow-wrong-content-type"===opts.mode)preferBinary=!capability.overrideMimeType;else{if(opts.mode&&"default"!==opts.mode&&"prefer-fast"!==opts.mode)throw new Error("Invalid value for opts.mode");preferBinary=!0}self._mode=decideMode(preferBinary,useFetch),self.on("finish",function(){self._onFinish()})};inherits(ClientRequest,stream.Writable),ClientRequest.prototype.setHeader=function(name,value){var self=this,lowerName=name.toLowerCase();unsafeHeaders.indexOf(lowerName)===-1&&(self._headers[lowerName]={name:name,value:value})},ClientRequest.prototype.getHeader=function(name){var self=this;return self._headers[name.toLowerCase()].value},ClientRequest.prototype.removeHeader=function(name){var self=this;delete self._headers[name.toLowerCase()]},ClientRequest.prototype._onFinish=function(){var self=this;if(!self._destroyed){var body,opts=self._opts,headersObj=self._headers;if("POST"!==opts.method&&"PUT"!==opts.method&&"PATCH"!==opts.method||(body=capability.blobConstructor?new global.Blob(self._body.map(function(buffer){return toArrayBuffer(buffer)}),{type:(headersObj["content-type"]||{}).value||""}):Buffer.concat(self._body).toString()),"fetch"===self._mode){var headers=Object.keys(headersObj).map(function(name){return[headersObj[name].name,headersObj[name].value]});global.fetch(self._opts.url,{method:self._opts.method,headers:headers,body:body,mode:"cors",credentials:opts.withCredentials?"include":"same-origin"}).then(function(response){self._fetchResponse=response,self._connect()},function(reason){self.emit("error",reason)})}else{var xhr=self._xhr=new global.XMLHttpRequest;try{xhr.open(self._opts.method,self._opts.url,!0)}catch(err){return void process.nextTick(function(){self.emit("error",err)})}"responseType"in xhr&&(xhr.responseType=self._mode.split(":")[0]),"withCredentials"in xhr&&(xhr.withCredentials=!!opts.withCredentials),"text"===self._mode&&"overrideMimeType"in xhr&&xhr.overrideMimeType("text/plain; charset=x-user-defined"),Object.keys(headersObj).forEach(function(name){xhr.setRequestHeader(headersObj[name].name,headersObj[name].value)}),self._response=null,xhr.onreadystatechange=function(){switch(xhr.readyState){case rStates.LOADING:case rStates.DONE:self._onXHRProgress()}},"moz-chunked-arraybuffer"===self._mode&&(xhr.onprogress=function(){self._onXHRProgress()}),xhr.onerror=function(){self._destroyed||self.emit("error",new Error("XHR error"))};try{xhr.send(body)}catch(err){return void process.nextTick(function(){self.emit("error",err)})}}}},ClientRequest.prototype._onXHRProgress=function(){var self=this;statusValid(self._xhr)&&!self._destroyed&&(self._response||self._connect(),self._response._onXHRProgress())},ClientRequest.prototype._connect=function(){var self=this;self._destroyed||(self._response=new IncomingMessage(self._xhr,self._fetchResponse,self._mode),self.emit("response",self._response))},ClientRequest.prototype._write=function(chunk,encoding,cb){var self=this;self._body.push(chunk),cb()},ClientRequest.prototype.abort=ClientRequest.prototype.destroy=function(){var self=this;self._destroyed=!0,self._response&&(self._response._destroyed=!0),self._xhr&&self._xhr.abort()},ClientRequest.prototype.end=function(data,encoding,cb){var self=this;"function"==typeof data&&(cb=data,data=void 0),stream.Writable.prototype.end.call(self,data,encoding,cb)},ClientRequest.prototype.flushHeaders=function(){},ClientRequest.prototype.setTimeout=function(){},ClientRequest.prototype.setNoDelay=function(){},ClientRequest.prototype.setSocketKeepAlive=function(){};var unsafeHeaders=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","date","dnt","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"]}).call(this,require("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},require("buffer").Buffer)},{"./capability":50,"./response":52,_process:37,buffer:5,inherits:11,"readable-stream":48,"to-arraybuffer":54}],52:[function(require,module,exports){(function(process,global,Buffer){var capability=require("./capability"),inherits=require("inherits"),stream=require("readable-stream"),rStates=exports.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},IncomingMessage=exports.IncomingMessage=function(xhr,response,mode){function read(){reader.read().then(function(result){if(!self._destroyed){if(result.done)return void self.push(null);
+self.push(new Buffer(result.value)),read()}})}var self=this;if(stream.Readable.call(self),self._mode=mode,self.headers={},self.rawHeaders=[],self.trailers={},self.rawTrailers=[],self.on("end",function(){process.nextTick(function(){self.emit("close")})}),"fetch"===mode){self._fetchResponse=response,self.url=response.url,self.statusCode=response.status,self.statusMessage=response.statusText;for(var header,_i,_it=response.headers[Symbol.iterator]();header=(_i=_it.next()).value,!_i.done;)self.headers[header[0].toLowerCase()]=header[1],self.rawHeaders.push(header[0],header[1]);var reader=response.body.getReader();read()}else{self._xhr=xhr,self._pos=0,self.url=xhr.responseURL,self.statusCode=xhr.status,self.statusMessage=xhr.statusText;var headers=xhr.getAllResponseHeaders().split(/\r?\n/);if(headers.forEach(function(header){var matches=header.match(/^([^:]+):\s*(.*)/);if(matches){var key=matches[1].toLowerCase();"set-cookie"===key?(void 0===self.headers[key]&&(self.headers[key]=[]),self.headers[key].push(matches[2])):void 0!==self.headers[key]?self.headers[key]+=", "+matches[2]:self.headers[key]=matches[2],self.rawHeaders.push(matches[1],matches[2])}}),self._charset="x-user-defined",!capability.overrideMimeType){var mimeType=self.rawHeaders["mime-type"];if(mimeType){var charsetMatch=mimeType.match(/;\s*charset=([^;])(;|$)/);charsetMatch&&(self._charset=charsetMatch[1].toLowerCase())}self._charset||(self._charset="utf-8")}}};inherits(IncomingMessage,stream.Readable),IncomingMessage.prototype._read=function(){},IncomingMessage.prototype._onXHRProgress=function(){var self=this,xhr=self._xhr,response=null;switch(self._mode){case"text:vbarray":if(xhr.readyState!==rStates.DONE)break;try{response=new global.VBArray(xhr.responseBody).toArray()}catch(e){}if(null!==response){self.push(new Buffer(response));break}case"text":try{response=xhr.responseText}catch(e){self._mode="text:vbarray";break}if(response.length>self._pos){var newData=response.substr(self._pos);if("x-user-defined"===self._charset){for(var buffer=new Buffer(newData.length),i=0;i<newData.length;i++)buffer[i]=255&newData.charCodeAt(i);self.push(buffer)}else self.push(newData,self._charset);self._pos=response.length}break;case"arraybuffer":if(xhr.readyState!==rStates.DONE||!xhr.response)break;response=xhr.response,self.push(new Buffer(new Uint8Array(response)));break;case"moz-chunked-arraybuffer":if(response=xhr.response,xhr.readyState!==rStates.LOADING||!response)break;self.push(new Buffer(new Uint8Array(response)));break;case"ms-stream":if(response=xhr.response,xhr.readyState!==rStates.LOADING)break;var reader=new global.MSStreamReader;reader.onprogress=function(){reader.result.byteLength>self._pos&&(self.push(new Buffer(new Uint8Array(reader.result.slice(self._pos)))),self._pos=reader.result.byteLength)},reader.onload=function(){self.push(null)},reader.readAsArrayBuffer(response)}self._xhr.readyState===rStates.DONE&&"ms-stream"!==self._mode&&self.push(null)}}).call(this,require("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},require("buffer").Buffer)},{"./capability":50,_process:37,buffer:5,inherits:11,"readable-stream":48}],53:[function(require,module,exports){function assertEncoding(encoding){if(encoding&&!isBufferEncoding(encoding))throw new Error("Unknown encoding: "+encoding)}function passThroughWrite(buffer){return buffer.toString(this.encoding)}function utf16DetectIncompleteChar(buffer){this.charReceived=buffer.length%2,this.charLength=this.charReceived?2:0}function base64DetectIncompleteChar(buffer){this.charReceived=buffer.length%3,this.charLength=this.charReceived?3:0}var Buffer=require("buffer").Buffer,isBufferEncoding=Buffer.isEncoding||function(encoding){switch(encoding&&encoding.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},StringDecoder=exports.StringDecoder=function(encoding){switch(this.encoding=(encoding||"utf8").toLowerCase().replace(/[-_]/,""),assertEncoding(encoding),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=utf16DetectIncompleteChar;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=base64DetectIncompleteChar;break;default:return void(this.write=passThroughWrite)}this.charBuffer=new Buffer(6),this.charReceived=0,this.charLength=0};StringDecoder.prototype.write=function(buffer){for(var charStr="";this.charLength;){var available=buffer.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:buffer.length;if(buffer.copy(this.charBuffer,this.charReceived,0,available),this.charReceived+=available,this.charReceived<this.charLength)return"";buffer=buffer.slice(available,buffer.length),charStr=this.charBuffer.slice(0,this.charLength).toString(this.encoding);var charCode=charStr.charCodeAt(charStr.length-1);if(!(charCode>=55296&&charCode<=56319)){if(this.charReceived=this.charLength=0,0===buffer.length)return charStr;break}this.charLength+=this.surrogateSize,charStr=""}this.detectIncompleteChar(buffer);var end=buffer.length;this.charLength&&(buffer.copy(this.charBuffer,0,buffer.length-this.charReceived,end),end-=this.charReceived),charStr+=buffer.toString(this.encoding,0,end);var end=charStr.length-1,charCode=charStr.charCodeAt(end);if(charCode>=55296&&charCode<=56319){var size=this.surrogateSize;return this.charLength+=size,this.charReceived+=size,this.charBuffer.copy(this.charBuffer,size,0,size),buffer.copy(this.charBuffer,0,0,size),charStr.substring(0,end)}return charStr},StringDecoder.prototype.detectIncompleteChar=function(buffer){for(var i=buffer.length>=3?3:buffer.length;i>0;i--){var c=buffer[buffer.length-i];if(1==i&&c>>5==6){this.charLength=2;break}if(i<=2&&c>>4==14){this.charLength=3;break}if(i<=3&&c>>3==30){this.charLength=4;break}}this.charReceived=i},StringDecoder.prototype.end=function(buffer){var res="";if(buffer&&buffer.length&&(res=this.write(buffer)),this.charReceived){var cr=this.charReceived,buf=this.charBuffer,enc=this.encoding;res+=buf.slice(0,cr).toString(enc)}return res}},{buffer:5}],54:[function(require,module,exports){var Buffer=require("buffer").Buffer;module.exports=function(buf){if(buf instanceof Uint8Array){if(0===buf.byteOffset&&buf.byteLength===buf.buffer.byteLength)return buf.buffer;if("function"==typeof buf.buffer.slice)return buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.byteLength)}if(Buffer.isBuffer(buf)){for(var arrayCopy=new Uint8Array(buf.length),len=buf.length,i=0;i<len;i++)arrayCopy[i]=buf[i];return arrayCopy.buffer}throw new Error("Argument must be a Buffer")}},{buffer:5}],55:[function(require,module,exports){"use strict";function Url(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function urlParse(url,parseQueryString,slashesDenoteHost){if(url&&util.isObject(url)&&url instanceof Url)return url;var u=new Url;return u.parse(url,parseQueryString,slashesDenoteHost),u}function urlFormat(obj){return util.isString(obj)&&(obj=urlParse(obj)),obj instanceof Url?obj.format():Url.prototype.format.call(obj)}function urlResolve(source,relative){return urlParse(source,!1,!0).resolve(relative)}function urlResolveObject(source,relative){return source?urlParse(source,!1,!0).resolveObject(relative):relative}var punycode=require("punycode"),util=require("./util");exports.parse=urlParse,exports.resolve=urlResolve,exports.resolveObject=urlResolveObject,exports.format=urlFormat,exports.Url=Url;var protocolPattern=/^([a-z0-9.+-]+:)/i,portPattern=/:[0-9]*$/,simplePathPattern=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,delims=["<",">",'"',"`"," ","\r","\n","\t"],unwise=["{","}","|","\\","^","`"].concat(delims),autoEscape=["'"].concat(unwise),nonHostChars=["%","/","?",";","#"].concat(autoEscape),hostEndingChars=["/","?","#"],hostnameMaxLen=255,hostnamePartPattern=/^[+a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,unsafeProtocol={javascript:!0,"javascript:":!0},hostlessProtocol={javascript:!0,"javascript:":!0},slashedProtocol={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},querystring=require("querystring");Url.prototype.parse=function(url,parseQueryString,slashesDenoteHost){if(!util.isString(url))throw new TypeError("Parameter 'url' must be a string, not "+typeof url);var queryIndex=url.indexOf("?"),splitter=queryIndex!==-1&&queryIndex<url.indexOf("#")?"?":"#",uSplit=url.split(splitter),slashRegex=/\\/g;uSplit[0]=uSplit[0].replace(slashRegex,"/"),url=uSplit.join(splitter);var rest=url;if(rest=rest.trim(),!slashesDenoteHost&&1===url.split("#").length){var simplePath=simplePathPattern.exec(rest);if(simplePath)return this.path=rest,this.href=rest,this.pathname=simplePath[1],simplePath[2]?(this.search=simplePath[2],parseQueryString?this.query=querystring.parse(this.search.substr(1)):this.query=this.search.substr(1)):parseQueryString&&(this.search="",this.query={}),this}var proto=protocolPattern.exec(rest);if(proto){proto=proto[0];var lowerProto=proto.toLowerCase();this.protocol=lowerProto,rest=rest.substr(proto.length)}if(slashesDenoteHost||proto||rest.match(/^\/\/[^@\/]+@[^@\/]+/)){var slashes="//"===rest.substr(0,2);!slashes||proto&&hostlessProtocol[proto]||(rest=rest.substr(2),this.slashes=!0)}if(!hostlessProtocol[proto]&&(slashes||proto&&!slashedProtocol[proto])){for(var hostEnd=-1,i=0;i<hostEndingChars.length;i++){var hec=rest.indexOf(hostEndingChars[i]);hec!==-1&&(hostEnd===-1||hec<hostEnd)&&(hostEnd=hec)}var auth,atSign;atSign=hostEnd===-1?rest.lastIndexOf("@"):rest.lastIndexOf("@",hostEnd),atSign!==-1&&(auth=rest.slice(0,atSign),rest=rest.slice(atSign+1),this.auth=decodeURIComponent(auth)),hostEnd=-1;for(var i=0;i<nonHostChars.length;i++){var hec=rest.indexOf(nonHostChars[i]);hec!==-1&&(hostEnd===-1||hec<hostEnd)&&(hostEnd=hec)}hostEnd===-1&&(hostEnd=rest.length),this.host=rest.slice(0,hostEnd),rest=rest.slice(hostEnd),this.parseHost(),this.hostname=this.hostname||"";var ipv6Hostname="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!ipv6Hostname)for(var hostparts=this.hostname.split(/\./),i=0,l=hostparts.length;i<l;i++){var part=hostparts[i];if(part&&!part.match(hostnamePartPattern)){for(var newpart="",j=0,k=part.length;j<k;j++)newpart+=part.charCodeAt(j)>127?"x":part[j];if(!newpart.match(hostnamePartPattern)){var validParts=hostparts.slice(0,i),notHost=hostparts.slice(i+1),bit=part.match(hostnamePartStart);bit&&(validParts.push(bit[1]),notHost.unshift(bit[2])),notHost.length&&(rest="/"+notHost.join(".")+rest),this.hostname=validParts.join(".");break}}}this.hostname.length>hostnameMaxLen?this.hostname="":this.hostname=this.hostname.toLowerCase(),ipv6Hostname||(this.hostname=punycode.toASCII(this.hostname));var p=this.port?":"+this.port:"",h=this.hostname||"";this.host=h+p,this.href+=this.host,ipv6Hostname&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==rest[0]&&(rest="/"+rest))}if(!unsafeProtocol[lowerProto])for(var i=0,l=autoEscape.length;i<l;i++){var ae=autoEscape[i];if(rest.indexOf(ae)!==-1){var esc=encodeURIComponent(ae);esc===ae&&(esc=escape(ae)),rest=rest.split(ae).join(esc)}}var hash=rest.indexOf("#");hash!==-1&&(this.hash=rest.substr(hash),rest=rest.slice(0,hash));var qm=rest.indexOf("?");if(qm!==-1?(this.search=rest.substr(qm),this.query=rest.substr(qm+1),parseQueryString&&(this.query=querystring.parse(this.query)),rest=rest.slice(0,qm)):parseQueryString&&(this.search="",this.query={}),rest&&(this.pathname=rest),slashedProtocol[lowerProto]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){var p=this.pathname||"",s=this.search||"";this.path=p+s}return this.href=this.format(),this},Url.prototype.format=function(){var auth=this.auth||"";auth&&(auth=encodeURIComponent(auth),auth=auth.replace(/%3A/i,":"),auth+="@");var protocol=this.protocol||"",pathname=this.pathname||"",hash=this.hash||"",host=!1,query="";this.host?host=auth+this.host:this.hostname&&(host=auth+(this.hostname.indexOf(":")===-1?this.hostname:"["+this.hostname+"]"),this.port&&(host+=":"+this.port)),this.query&&util.isObject(this.query)&&Object.keys(this.query).length&&(query=querystring.stringify(this.query));var search=this.search||query&&"?"+query||"";return protocol&&":"!==protocol.substr(-1)&&(protocol+=":"),this.slashes||(!protocol||slashedProtocol[protocol])&&host!==!1?(host="//"+(host||""),pathname&&"/"!==pathname.charAt(0)&&(pathname="/"+pathname)):host||(host=""),hash&&"#"!==hash.charAt(0)&&(hash="#"+hash),search&&"?"!==search.charAt(0)&&(search="?"+search),pathname=pathname.replace(/[?#]/g,function(match){return encodeURIComponent(match)}),search=search.replace("#","%23"),protocol+host+pathname+search+hash},Url.prototype.resolve=function(relative){return this.resolveObject(urlParse(relative,!1,!0)).format()},Url.prototype.resolveObject=function(relative){if(util.isString(relative)){var rel=new Url;rel.parse(relative,!1,!0),relative=rel}for(var result=new Url,tkeys=Object.keys(this),tk=0;tk<tkeys.length;tk++){var tkey=tkeys[tk];result[tkey]=this[tkey]}if(result.hash=relative.hash,""===relative.href)return result.href=result.format(),result;if(relative.slashes&&!relative.protocol){for(var rkeys=Object.keys(relative),rk=0;rk<rkeys.length;rk++){var rkey=rkeys[rk];"protocol"!==rkey&&(result[rkey]=relative[rkey])}return slashedProtocol[result.protocol]&&result.hostname&&!result.pathname&&(result.path=result.pathname="/"),result.href=result.format(),result}if(relative.protocol&&relative.protocol!==result.protocol){if(!slashedProtocol[relative.protocol]){for(var keys=Object.keys(relative),v=0;v<keys.length;v++){var k=keys[v];result[k]=relative[k]}return result.href=result.format(),result}if(result.protocol=relative.protocol,relative.host||hostlessProtocol[relative.protocol])result.pathname=relative.pathname;else{for(var relPath=(relative.pathname||"").split("/");relPath.length&&!(relative.host=relPath.shift()););relative.host||(relative.host=""),relative.hostname||(relative.hostname=""),""!==relPath[0]&&relPath.unshift(""),relPath.length<2&&relPath.unshift(""),result.pathname=relPath.join("/")}if(result.search=relative.search,result.query=relative.query,result.host=relative.host||"",result.auth=relative.auth,result.hostname=relative.hostname||relative.host,result.port=relative.port,result.pathname||result.search){var p=result.pathname||"",s=result.search||"";result.path=p+s}return result.slashes=result.slashes||relative.slashes,result.href=result.format(),result}var isSourceAbs=result.pathname&&"/"===result.pathname.charAt(0),isRelAbs=relative.host||relative.pathname&&"/"===relative.pathname.charAt(0),mustEndAbs=isRelAbs||isSourceAbs||result.host&&relative.pathname,removeAllDots=mustEndAbs,srcPath=result.pathname&&result.pathname.split("/")||[],relPath=relative.pathname&&relative.pathname.split("/")||[],psychotic=result.protocol&&!slashedProtocol[result.protocol];if(psychotic&&(result.hostname="",result.port=null,result.host&&(""===srcPath[0]?srcPath[0]=result.host:srcPath.unshift(result.host)),result.host="",relative.protocol&&(relative.hostname=null,relative.port=null,relative.host&&(""===relPath[0]?relPath[0]=relative.host:relPath.unshift(relative.host)),relative.host=null),mustEndAbs=mustEndAbs&&(""===relPath[0]||""===srcPath[0])),isRelAbs)result.host=relative.host||""===relative.host?relative.host:result.host,result.hostname=relative.hostname||""===relative.hostname?relative.hostname:result.hostname,result.search=relative.search,result.query=relative.query,srcPath=relPath;else if(relPath.length)srcPath||(srcPath=[]),srcPath.pop(),srcPath=srcPath.concat(relPath),result.search=relative.search,result.query=relative.query;else if(!util.isNullOrUndefined(relative.search)){if(psychotic){result.hostname=result.host=srcPath.shift();var authInHost=!!(result.host&&result.host.indexOf("@")>0)&&result.host.split("@");authInHost&&(result.auth=authInHost.shift(),result.host=result.hostname=authInHost.shift())}return result.search=relative.search,result.query=relative.query,util.isNull(result.pathname)&&util.isNull(result.search)||(result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")),result.href=result.format(),result}if(!srcPath.length)return result.pathname=null,result.search?result.path="/"+result.search:result.path=null,result.href=result.format(),result;for(var last=srcPath.slice(-1)[0],hasTrailingSlash=(result.host||relative.host||srcPath.length>1)&&("."===last||".."===last)||""===last,up=0,i=srcPath.length;i>=0;i--)last=srcPath[i],"."===last?srcPath.splice(i,1):".."===last?(srcPath.splice(i,1),up++):up&&(srcPath.splice(i,1),up--);if(!mustEndAbs&&!removeAllDots)for(;up--;up)srcPath.unshift("..");!mustEndAbs||""===srcPath[0]||srcPath[0]&&"/"===srcPath[0].charAt(0)||srcPath.unshift(""),hasTrailingSlash&&"/"!==srcPath.join("/").substr(-1)&&srcPath.push("");var isAbsolute=""===srcPath[0]||srcPath[0]&&"/"===srcPath[0].charAt(0);if(psychotic){result.hostname=result.host=isAbsolute?"":srcPath.length?srcPath.shift():"";var authInHost=!!(result.host&&result.host.indexOf("@")>0)&&result.host.split("@");authInHost&&(result.auth=authInHost.shift(),result.host=result.hostname=authInHost.shift())}return mustEndAbs=mustEndAbs||result.host&&srcPath.length,mustEndAbs&&!isAbsolute&&srcPath.unshift(""),srcPath.length?result.pathname=srcPath.join("/"):(result.pathname=null,result.path=null),util.isNull(result.pathname)&&util.isNull(result.search)||(result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")),result.auth=relative.auth||result.auth,result.slashes=result.slashes||relative.slashes,result.href=result.format(),result},Url.prototype.parseHost=function(){var host=this.host,port=portPattern.exec(host);port&&(port=port[0],":"!==port&&(this.port=port.substr(1)),host=host.substr(0,host.length-port.length)),host&&(this.hostname=host)}},{"./util":56,punycode:38,querystring:41}],56:[function(require,module,exports){"use strict";module.exports={isString:function(arg){return"string"==typeof arg},isObject:function(arg){return"object"==typeof arg&&null!==arg},isNull:function(arg){return null===arg},isNullOrUndefined:function(arg){return null==arg}}},{}],57:[function(require,module,exports){(function(global){function deprecate(fn,msg){function deprecated(){if(!warned){if(config("throwDeprecation"))throw new Error(msg);config("traceDeprecation")?console.trace(msg):console.warn(msg),warned=!0}return fn.apply(this,arguments)}if(config("noDeprecation"))return fn;var warned=!1;return deprecated}function config(name){try{if(!global.localStorage)return!1}catch(_){return!1}var val=global.localStorage[name];return null!=val&&"true"===String(val).toLowerCase()}module.exports=deprecate}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],58:[function(require,module,exports){function extend(){for(var target={},i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source)hasOwnProperty.call(source,key)&&(target[key]=source[key])}return target}module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty},{}]},{},[1])(1)}),function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.manifold=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){(function(global){var Manifold;!function(Manifold){var StringValue=function(){function StringValue(value){this.value="",value&&(this.value=value.toLowerCase())}return StringValue.prototype.toString=function(){return this.value},StringValue}();Manifold.StringValue=StringValue}(Manifold||(Manifold={}));var Manifold,__extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)};!function(Manifold){var TreeSortType=function(_super){function TreeSortType(){_super.apply(this,arguments)}return __extends(TreeSortType,_super),TreeSortType.prototype.date=function(){return new TreeSortType(TreeSortType.DATE.toString())},TreeSortType.prototype.none=function(){return new TreeSortType(TreeSortType.NONE.toString())},TreeSortType.DATE=new TreeSortType("date"),TreeSortType.NONE=new TreeSortType("none"),TreeSortType}(Manifold.StringValue);Manifold.TreeSortType=TreeSortType}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var Bootstrapper=function(){function Bootstrapper(options){this._options=options,this._options.locale=this._options.locale||"en-GB"}return Bootstrapper.prototype.bootstrap=function(){var that=this;return new Promise(function(resolve,reject){var msie=that._detectIE();if(msie===!1)manifesto.loadManifest(that._options.iiifResourceUri).then(function(json){that._loaded(that,json,resolve,reject)});else if(msie>0)if(9===msie){var settings={url:that._options.iiifResourceUri,type:"GET",dataType:"jsonp",jsonp:"callback",jsonpCallback:"manifestCallback"};$.ajax(settings),global.manifestCallback=function(json){that._loaded(that,JSON.stringify(json),resolve,reject)}}else $.getJSON(that._options.iiifResourceUri,function(json){that._loaded(that,JSON.stringify(json),resolve,reject)})})},Bootstrapper.prototype._loaded=function(bootstrapper,json,resolve,reject){var iiifResource=manifesto.create(json,{locale:bootstrapper._options.locale});if(bootstrapper._options.iiifResource||(bootstrapper._options.iiifResource=iiifResource),iiifResource.getIIIFResourceType().toString()===manifesto.IIIFResourceType.collection().toString()){var collections=iiifResource.getCollections();collections&&collections.length?iiifResource.getCollectionByIndex(bootstrapper._options.collectionIndex).then(function(collection){collection||reject("Collection index not found"),0===collection.getTotalManifests()&&0===bootstrapper._options.manifestIndex&&collection.getTotalCollections()>0&&(bootstrapper._options.collectionIndex=0,bootstrapper._options.iiifResourceUri=collection.id,bootstrapper.bootstrap()),collection.getManifestByIndex(bootstrapper._options.manifestIndex).then(function(manifest){bootstrapper._options.manifest=manifest;var helper=new Manifold.Helper(bootstrapper._options);resolve(helper)})}):iiifResource.getManifestByIndex(bootstrapper._options.manifestIndex).then(function(manifest){bootstrapper._options.manifest=manifest;var helper=new Manifold.Helper(bootstrapper._options);resolve(helper)})}else{bootstrapper._options.manifest=iiifResource;var helper=new Manifold.Helper(bootstrapper._options);resolve(helper)}},Bootstrapper.prototype._detectIE=function(){var ua=window.navigator.userAgent,msie=ua.indexOf("MSIE ");if(msie>0)return parseInt(ua.substring(msie+5,ua.indexOf(".",msie)),10);var trident=ua.indexOf("Trident/");if(trident>0){var rv=ua.indexOf("rv:");return parseInt(ua.substring(rv+3,ua.indexOf(".",rv)),10)}var edge=ua.indexOf("Edge/");return edge>0&&parseInt(ua.substring(edge+5,ua.indexOf(".",edge)),10)},Bootstrapper}();Manifold.Bootstrapper=Bootstrapper}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var ExternalResource=function(){function ExternalResource(resource,dataUriFunc){this.isResponseHandled=!1,resource.externalResource=this,this.dataUri=dataUriFunc(resource),this._parseAuthServices(resource)}return ExternalResource.prototype._parseAuthServices=function(resource){this.clickThroughService=manifesto.Utils.getService(resource,manifesto.ServiceProfile.clickThrough().toString()),this.loginService=manifesto.Utils.getService(resource,manifesto.ServiceProfile.login().toString()),this.restrictedService=manifesto.Utils.getService(resource,manifesto.ServiceProfile.restricted().toString()),this.clickThroughService?(this.logoutService=this.clickThroughService.getService(manifesto.ServiceProfile.logout().toString()),this.tokenService=this.clickThroughService.getService(manifesto.ServiceProfile.token().toString())):this.loginService?(this.logoutService=this.loginService.getService(manifesto.ServiceProfile.logout().toString()),this.tokenService=this.loginService.getService(manifesto.ServiceProfile.token().toString())):this.restrictedService&&(this.logoutService=this.restrictedService.getService(manifesto.ServiceProfile.logout().toString()),this.tokenService=this.restrictedService.getService(manifesto.ServiceProfile.token().toString()))},ExternalResource.prototype.isAccessControlled=function(){return!!(this.clickThroughService||this.loginService||this.restrictedService)},ExternalResource.prototype.hasServiceDescriptor=function(){return this.dataUri.endsWith("info.json")},ExternalResource.prototype.getData=function(accessToken){var that=this;return that.data={},new Promise(function(resolve,reject){var type="GET";if(!that.hasServiceDescriptor()){if(!that.isAccessControlled())return that.status=HTTPStatusCode.OK,void resolve(that);type="HEAD"}$.ajax({url:that.dataUri,type:type,dataType:"json",beforeSend:function(xhr){accessToken&&xhr.setRequestHeader("Authorization","Bearer "+accessToken.accessToken)}}).done(function(data){if(data){var uri=unescape(data["@id"]);that.data=data,that._parseAuthServices(that.data),uri.endsWith("/info.json")&&(uri=uri.substr(0,uri.lastIndexOf("/")));var dataUri=that.dataUri;dataUri.endsWith("/info.json")&&(dataUri=dataUri.substr(0,dataUri.lastIndexOf("/"))),uri!==dataUri&&that.loginService?that.status=HTTPStatusCode.MOVED_TEMPORARILY:that.status=HTTPStatusCode.OK,resolve(that)}else that.status=HTTPStatusCode.OK,resolve(that)}).fail(function(error){that.status=error.status,that.error=error,error.responseJSON&&that._parseAuthServices(error.responseJSON),resolve(that)})})},ExternalResource}();Manifold.ExternalResource=ExternalResource}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var Helper=function(){function Helper(options){this.options=options,this.iiifResource=this.options.iiifResource,this.iiifResourceUri=this.options.iiifResourceUri,this.manifest=this.options.manifest,this.collectionIndex=this.options.collectionIndex||0,this.manifestIndex=this.options.manifestIndex||0,this.sequenceIndex=this.options.sequenceIndex||0,this.canvasIndex=this.options.canvasIndex||0}return Helper.prototype.getAutoCompleteService=function(){var service=this.getSearchWithinService();return service?service.getService(manifesto.ServiceProfile.autoComplete()):null},Helper.prototype.getAttribution=function(){return Manifesto.TranslationCollection.getValue(this.manifest.getAttribution())},Helper.prototype.getCanvases=function(){return this.getCurrentSequence().getCanvases()},Helper.prototype.getCanvasById=function(id){return this.getCurrentSequence().getCanvasById(id)},Helper.prototype.getCanvasesById=function(ids){for(var canvases=[],i=0;i<ids.length;i++){var id=ids[i];canvases.push(this.getCanvasById(id))}return canvases},Helper.prototype.getCanvasByIndex=function(index){return this.getCurrentSequence().getCanvasByIndex(index)},Helper.prototype.getCanvasIndexById=function(id){return this.getCurrentSequence().getCanvasIndexById(id)},Helper.prototype.getCanvasIndexByLabel=function(label){var foliated=this.getManifestType().toString()===manifesto.ManifestType.manuscript().toString();return this.getCurrentSequence().getCanvasIndexByLabel(label,foliated)},Helper.prototype.getCanvasRange=function(canvas,path){var ranges=this.getCanvasRanges(canvas);if(path){for(var i=0;i<ranges.length;i++){var range=ranges[i];if(range.path===path)return range}return null}return ranges[0]},Helper.prototype.getCanvasRanges=function(canvas){return canvas.ranges?canvas.ranges:(canvas.ranges=this.manifest.getAllRanges().en().where(function(range){return range.getCanvasIds().en().any(function(c){return c===canvas.id})}).toArray(),canvas.ranges)},Helper.prototype.getCollectionIndex=function(iiifResource){var index;return iiifResource.parentCollection&&(index=iiifResource.parentCollection.index),index},Helper.prototype.getCurrentCanvas=function(){return this.getCurrentSequence().getCanvasByIndex(this.canvasIndex)},Helper.prototype.getCurrentElement=function(){return this.getCanvasByIndex(this.canvasIndex)},Helper.prototype.getCurrentSequence=function(){return this.getSequenceByIndex(this.sequenceIndex)},Helper.prototype.getElementType=function(element){return element||(element=this.getCurrentCanvas()),element.getType()},Helper.prototype.getFirstPageIndex=function(){return 0},Helper.prototype.getInfoUri=function(canvas){var images=canvas.getImages();if(images&&images.length){for(var infoUri,firstImage=images[0],resource=firstImage.getResource(),services=resource.getServices(),i=0;i<services.length;i++){var service=services[i],id=service.id;id.endsWith("/")||(id+="/"),manifesto.Utils.isImageProfile(service.getProfile())&&(infoUri=id+"info.json")}return infoUri}var service=canvas.getService(manifesto.ServiceProfile.ixif());return service?service.getInfoUri():canvas.id},Helper.prototype.getLabel=function(){return Manifesto.TranslationCollection.getValue(this.manifest.getLabel())},Helper.prototype.getLastCanvasLabel=function(alphanumeric){return this.getCurrentSequence().getLastCanvasLabel(alphanumeric)},Helper.prototype.getLastPageIndex=function(){return this.getTotalCanvases()-1},Helper.prototype.getLicense=function(){return this.manifest.getLicense()},Helper.prototype.getLogo=function(){return this.manifest.getLogo()},Helper.prototype.getManifestType=function(){var manifestType=this.manifest.getManifestType();return""===manifestType.toString()&&(manifestType=manifesto.ManifestType.monograph()),manifestType},Helper.prototype.getMetadata=function(options){var metadataGroups=[],manifestMetadata=this.manifest.getMetadata(),manifestGroup=new Manifold.MetadataGroup(this.manifest);if(manifestMetadata&&manifestMetadata.length&&manifestGroup.addMetadata(manifestMetadata,!0),this.manifest.getDescription().length){var metadataItem=new Manifesto.MetadataItem(this.options.locale);metadataItem.label=[new Manifesto.Translation("description",this.options.locale)],metadataItem.value=this.manifest.getDescription(),metadataItem.isRootLevel=!0,manifestGroup.addItem(metadataItem)}if(this.manifest.getAttribution().length){var metadataItem=new Manifesto.MetadataItem(this.options.locale);metadataItem.label=[new Manifesto.Translation("attribution",this.options.locale)],metadataItem.value=this.manifest.getAttribution(),metadataItem.isRootLevel=!0,manifestGroup.addItem(metadataItem)}if(this.manifest.getLicense()){var item={label:"license",value:options&&options.licenseFormatter?options.licenseFormatter.format(this.manifest.getLicense()):this.manifest.getLicense()},metadataItem=new Manifesto.MetadataItem(this.options.locale);metadataItem.parse(item),metadataItem.isRootLevel=!0,manifestGroup.addItem(metadataItem)}if(this.manifest.getLogo()){var item={label:"logo",value:'<img src="'+this.manifest.getLogo()+'"/>'},metadataItem=new Manifesto.MetadataItem(this.options.locale);metadataItem.parse(item),metadataItem.isRootLevel=!0,manifestGroup.addItem(metadataItem)}return metadataGroups.push(manifestGroup),options?this._parseMetadataOptions(options,metadataGroups):metadataGroups},Helper.prototype._parseMetadataOptions=function(options,metadataGroups){var sequence=this.getCurrentSequence(),sequenceMetadata=sequence.getMetadata();if(sequenceMetadata&&sequenceMetadata.length){var sequenceGroup=new Manifold.MetadataGroup(sequence);
+sequenceGroup.addMetadata(sequenceMetadata),metadataGroups.push(sequenceGroup)}if(options.range){var rangeGroups=this._getRangeMetadata([],options.range);rangeGroups=rangeGroups.reverse(),metadataGroups=metadataGroups.concat(rangeGroups)}if(options.canvases&&options.canvases.length)for(var i=0;i<options.canvases.length;i++){var canvas=options.canvases[i],canvasMetadata=canvas.getMetadata();if(canvasMetadata&&canvasMetadata.length){var canvasGroup=new Manifold.MetadataGroup(canvas);canvasGroup.addMetadata(canvas.getMetadata()),metadataGroups.push(canvasGroup)}for(var images=canvas.getImages(),j=0;j<images.length;j++){var image=images[j],imageMetadata=image.getMetadata();if(imageMetadata&&imageMetadata.length){var imageGroup=new Manifold.MetadataGroup(image);imageGroup.addMetadata(imageMetadata),metadataGroups.push(imageGroup)}}}return metadataGroups},Helper.prototype._getRangeMetadata=function(metadataGroups,range){var rangeMetadata=range.getMetadata();if(rangeMetadata&&rangeMetadata.length){var rangeGroup=new Manifold.MetadataGroup(range);rangeGroup.addMetadata(rangeMetadata),metadataGroups.push(rangeGroup)}return range.parentRange?this._getRangeMetadata(metadataGroups,range.parentRange):metadataGroups},Helper.prototype.getMultiSelectState=function(){return this._multiSelectState||(this._multiSelectState=new Manifold.MultiSelectState,this._multiSelectState.ranges=this.getRanges().clone(),this._multiSelectState.canvases=this.getCurrentSequence().getCanvases().clone()),this._multiSelectState},Helper.prototype.getRanges=function(){return this.manifest.getAllRanges()},Helper.prototype.getRangeByPath=function(path){return this.manifest.getRangeByPath(path)},Helper.prototype.getRangeCanvases=function(range){var ids=range.getCanvasIds();return this.getCanvasesById(ids)},Helper.prototype.getRelated=function(){return this.manifest.getRelated()},Helper.prototype.getResources=function(){var element=this.getCurrentElement();return element.getResources()},Helper.prototype.getSearchWithinService=function(){return this.manifest.getService(manifesto.ServiceProfile.searchWithin())},Helper.prototype.getSeeAlso=function(){return this.manifest.getSeeAlso()},Helper.prototype.getSequenceByIndex=function(index){return this.manifest.getSequenceByIndex(index)},Helper.prototype.getShareServiceUrl=function(){var url,shareService=this.manifest.getService(manifesto.ServiceProfile.shareExtensions());return shareService&&(shareService.length&&(shareService=shareService[0]),url=shareService.__jsonld.shareUrl),url},Helper.prototype.getSortedTreeNodesByDate=function(sortedTree,tree){var all=tree.nodes.en().traverseUnique(function(node){return node.nodes}).where(function(n){return n.data.type===manifesto.TreeNodeType.collection().toString()||n.data.type===manifesto.TreeNodeType.manifest().toString()}).toArray(),manifests=tree.nodes.en().traverseUnique(function(n){return n.nodes}).where(function(n){return n.data.type===manifesto.TreeNodeType.manifest().toString()}).toArray();this.createDecadeNodes(sortedTree,all),this.sortDecadeNodes(sortedTree),this.createYearNodes(sortedTree,all),this.sortYearNodes(sortedTree),this.createMonthNodes(sortedTree,manifests),this.sortMonthNodes(sortedTree),this.createDateNodes(sortedTree,manifests),this.pruneDecadeNodes(sortedTree)},Helper.prototype.getStartCanvasIndex=function(){return this.getCurrentSequence().getStartCanvasIndex()},Helper.prototype.getThumbs=function(width,height){return this.getCurrentSequence().getThumbs(width,height)},Helper.prototype.getTopRanges=function(){return this.manifest.getTopRanges()},Helper.prototype.getTotalCanvases=function(){return this.getCurrentSequence().getTotalCanvases()},Helper.prototype.getTrackingLabel=function(){return this.manifest.getTrackingLabel()},Helper.prototype.getTree=function(topRangeIndex,sortType){void 0===topRangeIndex&&(topRangeIndex=0),void 0===sortType&&(sortType=Manifold.TreeSortType.NONE);var tree;if(this.iiifResource.isCollection())tree=this.iiifResource.getDefaultTree();else{var topRanges=this.iiifResource.getTopRanges(),root=new manifesto.TreeNode;if(root.label="root",root.data=this.iiifResource,!topRanges.length)return root;var range=topRanges[topRangeIndex];tree=range.getTree(root)}var sortedTree=new manifesto.TreeNode;switch(sortType.toString()){case Manifold.TreeSortType.DATE.toString():if(this.treeHasNavDates(tree)){this.getSortedTreeNodesByDate(sortedTree,tree);break}default:sortedTree=tree}return sortedTree},Helper.prototype.treeHasNavDates=function(tree){var node=tree.nodes.en().traverseUnique(function(node){return node.nodes}).where(function(n){return!isNaN(n.navDate)}).first();return!!node},Helper.prototype.getViewingDirection=function(){var viewingDirection=this.getCurrentSequence().getViewingDirection();return viewingDirection.toString()||(viewingDirection=this.manifest.getViewingDirection()),viewingDirection},Helper.prototype.getViewingHint=function(){var viewingHint=this.getCurrentSequence().getViewingHint();return viewingHint.toString()||(viewingHint=this.manifest.getViewingHint()),viewingHint},Helper.prototype.hasParentCollection=function(){return!!this.manifest.parentCollection},Helper.prototype.hasRelatedPage=function(){var related=this.getRelated();return!!related&&(related.length&&(related=related[0]),"text/html"===related.format)},Helper.prototype.hasResources=function(){return this.getResources().length>0},Helper.prototype.isBottomToTop=function(){return this.getViewingDirection().toString()===manifesto.ViewingDirection.bottomToTop().toString()},Helper.prototype.isCanvasIndexOutOfRange=function(index){return this.getCurrentSequence().isCanvasIndexOutOfRange(index)},Helper.prototype.isContinuous=function(){return this.getViewingHint().toString()===manifesto.ViewingHint.continuous().toString()},Helper.prototype.isFirstCanvas=function(index){return"undefined"!=typeof index?this.getCurrentSequence().isFirstCanvas(index):this.getCurrentSequence().isFirstCanvas(this.canvasIndex)},Helper.prototype.isHorizontallyAligned=function(){return this.isLeftToRight()||this.isRightToLeft()},Helper.prototype.isLastCanvas=function(index){return"undefined"!=typeof index?this.getCurrentSequence().isLastCanvas(index):this.getCurrentSequence().isLastCanvas(this.canvasIndex)},Helper.prototype.isLeftToRight=function(){return this.getViewingDirection().toString()===manifesto.ViewingDirection.leftToRight().toString()},Helper.prototype.isMultiCanvas=function(){return this.getCurrentSequence().isMultiCanvas()},Helper.prototype.isMultiSequence=function(){return this.manifest.isMultiSequence()},Helper.prototype.isPaged=function(){return this.getViewingHint().toString()===manifesto.ViewingHint.paged().toString()},Helper.prototype.isPagingAvailable=function(){return this.isPagingEnabled()&&this.getTotalCanvases()>2},Helper.prototype.isPagingEnabled=function(){return this.manifest.isPagingEnabled()||this.getCurrentSequence().isPagingEnabled()},Helper.prototype.isRightToLeft=function(){return this.getViewingDirection().toString()===manifesto.ViewingDirection.rightToLeft().toString()},Helper.prototype.isTopToBottom=function(){return this.getViewingDirection().toString()===manifesto.ViewingDirection.topToBottom().toString()},Helper.prototype.isTotalCanvasesEven=function(){return this.getCurrentSequence().isTotalCanvasesEven()},Helper.prototype.isUIEnabled=function(name){var uiExtensions=this.manifest.getService(manifesto.ServiceProfile.uiExtensions());if(uiExtensions){var disableUI=uiExtensions.getProperty("disableUI");if(disableUI&&(disableUI.contains(name)||disableUI.contains(name.toLowerCase())))return!1}return!0},Helper.prototype.isVerticallyAligned=function(){return this.isTopToBottom()||this.isBottomToTop()},Helper.prototype.createDateNodes=function(rootNode,nodes){for(var i=0;i<nodes.length;i++){var node=nodes[i],year=this.getNodeYear(node),month=this.getNodeMonth(node),dateNode=new manifesto.TreeNode;dateNode.id=node.id,dateNode.label=this.getNodeDisplayDate(node),dateNode.data=node.data,dateNode.data.type=manifesto.TreeNodeType.manifest().toString(),dateNode.data.year=year,dateNode.data.month=month;var decadeNode=this.getDecadeNode(rootNode,year);if(decadeNode){var yearNode=this.getYearNode(decadeNode,year);if(yearNode){var monthNode=this.getMonthNode(yearNode,month);monthNode&&monthNode.addNode(dateNode)}}}},Helper.prototype.createDecadeNodes=function(rootNode,nodes){for(var decadeNode,i=0;i<nodes.length;i++){var node=nodes[i],year=this.getNodeYear(node),endYear=(Number(year.toString().substr(2,1)),Number(year.toString().substr(0,3)+"9"));this.getDecadeNode(rootNode,year)||(decadeNode=new manifesto.TreeNode,decadeNode.label=year+" - "+endYear,decadeNode.navDate=node.navDate,decadeNode.data.startYear=year,decadeNode.data.endYear=endYear,rootNode.addNode(decadeNode))}},Helper.prototype.createMonthNodes=function(rootNode,nodes){for(var monthNode,i=0;i<nodes.length;i++){var node=nodes[i],year=this.getNodeYear(node),month=this.getNodeMonth(node),decadeNode=this.getDecadeNode(rootNode,year),yearNode=this.getYearNode(decadeNode,year);decadeNode&&yearNode&&!this.getMonthNode(yearNode,month)&&(monthNode=new manifesto.TreeNode,monthNode.label=this.getNodeDisplayMonth(node),monthNode.navDate=node.navDate,monthNode.data.year=year,monthNode.data.month=month,yearNode.addNode(monthNode))}},Helper.prototype.createYearNodes=function(rootNode,nodes){for(var yearNode,i=0;i<nodes.length;i++){var node=nodes[i],year=this.getNodeYear(node),decadeNode=this.getDecadeNode(rootNode,year);decadeNode&&!this.getYearNode(decadeNode,year)&&(yearNode=new manifesto.TreeNode,yearNode.label=year.toString(),yearNode.navDate=node.navDate,yearNode.data.year=year,decadeNode.addNode(yearNode))}},Helper.prototype.getDecadeNode=function(rootNode,year){for(var i=0;i<rootNode.nodes.length;i++){var n=rootNode.nodes[i];if(year>=n.data.startYear&&year<=n.data.endYear)return n}return null},Helper.prototype.getMonthNode=function(yearNode,month){for(var i=0;i<yearNode.nodes.length;i++){var n=yearNode.nodes[i];if(month===this.getNodeMonth(n))return n}return null},Helper.prototype.getNodeDisplayDate=function(node){return node.navDate.toDateString()},Helper.prototype.getNodeDisplayMonth=function(node){var months=["January","February","March","April","May","June","July","August","September","October","November","December"];return months[node.navDate.getMonth()]},Helper.prototype.getNodeMonth=function(node){return node.navDate.getMonth()},Helper.prototype.getNodeYear=function(node){return node.navDate.getFullYear()},Helper.prototype.getYearNode=function(decadeNode,year){for(var i=0;i<decadeNode.nodes.length;i++){var n=decadeNode.nodes[i];if(year===this.getNodeYear(n))return n}return null},Helper.prototype.pruneDecadeNodes=function(rootNode){for(var pruned=[],i=0;i<rootNode.nodes.length;i++){var n=rootNode.nodes[i];n.nodes.length||pruned.push(n)}for(var j=0;j<pruned.length;j++){var p=pruned[j];rootNode.nodes.remove(p)}},Helper.prototype.sortDecadeNodes=function(rootNode){rootNode.nodes=rootNode.nodes.sort(function(a,b){return a.data.startYear-b.data.startYear})},Helper.prototype.sortMonthNodes=function(rootNode){for(var _this=this,i=0;i<rootNode.nodes.length;i++)for(var decadeNode=rootNode.nodes[i],j=0;j<decadeNode.nodes.length;j++){var monthNode=decadeNode.nodes[j];monthNode.nodes=monthNode.nodes.sort(function(a,b){return _this.getNodeMonth(a)-_this.getNodeMonth(b)})}},Helper.prototype.sortYearNodes=function(rootNode){for(var _this=this,i=0;i<rootNode.nodes.length;i++){var decadeNode=rootNode.nodes[i];decadeNode.nodes=decadeNode.nodes.sort(function(a,b){return _this.getNodeYear(a)-_this.getNodeYear(b)})}},Helper}();Manifold.Helper=Helper}(Manifold||(Manifold={}));var Manifold;!function(Manifold){function loadManifest(options){var bootstrapper=new Manifold.Bootstrapper(options);return bootstrapper.bootstrap()}Manifold.loadManifest=loadManifest}(Manifold||(Manifold={})),function(w){w.Manifold||(w.Manifold=Manifold)}(window);var Manifold;!function(Manifold){var MetadataGroup=function(){function MetadataGroup(resource,label){this.items=[],this.resource=resource,this.label=label}return MetadataGroup.prototype.addItem=function(item){this.items.push(item)},MetadataGroup.prototype.addMetadata=function(metadata,isRootLevel){void 0===isRootLevel&&(isRootLevel=!1);for(var i=0;i<metadata.length;i++){var item=metadata[i];item.isRootLevel=isRootLevel,this.addItem(item)}},MetadataGroup}();Manifold.MetadataGroup=MetadataGroup}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var MetadataOptions=function(){function MetadataOptions(){}return MetadataOptions}();Manifold.MetadataOptions=MetadataOptions}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var MultiSelectState=function(){function MultiSelectState(){this.isEnabled=!1,this.ranges=[],this.canvases=[]}return MultiSelectState.prototype.allCanvasesSelected=function(){return this.canvases.length>0&&this.getAllSelectedCanvases().length===this.canvases.length},MultiSelectState.prototype.allRangesSelected=function(){return this.ranges.length>0&&this.getAllSelectedRanges().length===this.ranges.length},MultiSelectState.prototype.allSelected=function(){return this.allRangesSelected()&&this.allCanvasesSelected()},MultiSelectState.prototype.getAll=function(){return this.canvases.concat(this.ranges)},MultiSelectState.prototype.getAllSelectedCanvases=function(){return this.canvases.en().where(function(c){return c.multiSelected}).toArray()},MultiSelectState.prototype.getAllSelectedRanges=function(){return this.ranges.en().where(function(r){return r.multiSelected}).toArray()},MultiSelectState.prototype.getCanvasById=function(id){return this.canvases.en().where(function(c){return c.id===id}).first()},MultiSelectState.prototype.getCanvasesByIds=function(ids){for(var canvases=[],i=0;i<ids.length;i++){var id=ids[i];canvases.push(this.getCanvasById(id))}return canvases},MultiSelectState.prototype.getRangeCanvases=function(range){var ids=range.getCanvasIds();return this.getCanvasesByIds(ids)},MultiSelectState.prototype.selectAll=function(selected){this.selectRanges(this.ranges,selected),this.selectCanvases(this.canvases,selected)},MultiSelectState.prototype.selectCanvas=function(canvas,selected){var c=this.canvases.en().where(function(c){return c.id===canvas.id}).first();c.multiSelected=selected},MultiSelectState.prototype.selectAllCanvases=function(selected){this.selectCanvases(this.canvases,selected)},MultiSelectState.prototype.selectCanvases=function(canvases,selected){for(var j=0;j<canvases.length;j++){var canvas=canvases[j];canvas.multiSelected=selected}},MultiSelectState.prototype.selectRange=function(range,selected){var r=this.ranges.en().where(function(r){return r.id===range.id}).first();r.multiSelected=selected;var canvases=this.getRangeCanvases(r);this.selectCanvases(canvases,selected)},MultiSelectState.prototype.selectAllRanges=function(selected){this.selectRanges(this.ranges,selected)},MultiSelectState.prototype.selectRanges=function(ranges,selected){for(var i=0;i<ranges.length;i++){var range=ranges[i];range.multiSelected=selected;var canvases=this.getCanvasesByIds(range.getCanvasIds());this.selectCanvases(canvases,selected)}},MultiSelectState.prototype.setEnabled=function(enabled){this.isEnabled=enabled;for(var items=this.getAll(),i=0;i<items.length;i++){var item=items[i];item.multiSelectEnabled=this.isEnabled,enabled||(item.multiSelected=!1)}},MultiSelectState}();Manifold.MultiSelectState=MultiSelectState}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var SearchResult=function(){function SearchResult(resource,canvasIndex){this.rects=[],this.canvasIndex=canvasIndex,this.addRect(resource)}return SearchResult.prototype.addRect=function(resource){var rect=new Manifold.SearchResultRect(resource);rect.canvasIndex=this.canvasIndex,rect.index=this.rects.length,this.rects.push(rect),this.rects.sort(function(a,b){return a.index-b.index})},SearchResult}();Manifold.SearchResult=SearchResult}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var SearchResultRect=function(){function SearchResultRect(result){this.isVisible=!0;var xywh=result.on.match(/.*xywh=(\d*),(\d*),(\d*),(\d*)/);this.x=Number(xywh[1]),this.y=Number(xywh[2]),this.width=Number(xywh[3]),this.height=Number(xywh[4]),this.chars=result.resource.chars}return SearchResultRect}();Manifold.SearchResultRect=SearchResultRect}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var Translation=function(){function Translation(value,locale){this.value=value,this.locale=locale}return Translation}();Manifold.Translation=Translation}(Manifold||(Manifold={}));var Manifold;!function(Manifold){var UriLabeller=function(){function UriLabeller(labels){this.labels=labels}return UriLabeller.prototype.format=function(url){if(url.indexOf("<a")!=-1)return url;var label=this.labels[url]?this.labels[url]:url;return'<a href="'+url+'">'+label+"</a>"},UriLabeller}();Manifold.UriLabeller=UriLabeller}(Manifold||(Manifold={}))}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)}),function(t,e,o){"use strict";function r(t,e,r,p){r=r||"width";var n,l,m,c=(e.match(s)||[])[2],f="px"===c?1:d[c+"toPx"],u=/r?em/i;if(f||u.test(c)&&!p)t=f?t:"rem"===c?i:"fontSize"===r?t.parentNode||t:t,f=f||parseFloat(a(t,"fontSize")),m=parseFloat(e)*f;else{n=t.style,l=n[r];try{n[r]=e}catch(x){return 0}m=n[r]?parseFloat(a(t,r)):0,n[r]=l!==o?l:null}return m}function a(t,e){var o,n,i,l,d,c=/^top|bottom/,f=["paddingTop","paddingBottom","borderTop","borderBottom"],u=4;if(o=m?m(t)[e]:(n=t.style["pixel"+e.charAt(0).toUpperCase()+e.slice(1)])?n+"px":"fontSize"===e?r(t,"1em","left",1)+"px":t.currentStyle[e],i=(o.match(s)||[])[2],"%"===i&&p)if(c.test(e)){for(l=(d=t.parentNode||t).offsetHeight;u--;)l-=parseFloat(a(d,f[u]));o=parseFloat(o)/100*l+"px"}else o=r(t,o);else("auto"===o||i&&"px"!==i)&&m?o=0:i&&"px"!==i&&!m&&(o=r(t,o)+"px");return o}var p,n=e.createElement("test"),i=e.documentElement,l=e.defaultView,m=l&&l.getComputedStyle,s=/^(-?[\d+\.\-]+)([a-z]+|%)$/i,d={},c=[1/25.4,1/2.54,1/72,1/6],f=["mm","cm","pt","pc","in","mozmm"],u=6;for(i.appendChild(n),m&&(n.style.marginTop="1%",p="1%"===m(n).marginTop);u--;)d[f[u]+"toPx"]=c[u]?c[u]*d.inToPx:r(n,"1"+f[u]);i.removeChild(n),n=o,t.Length={toPx:r}}(this,this.document);var Utils;!function(Utils){var Async=function(){function Async(){}return Async.waitFor=function(test,successCallback,failureCallback,interval,maxTries,numTries){interval||(interval=200),maxTries||(maxTries=100),numTries||(numTries=0),numTries+=1,numTries>maxTries?failureCallback&&failureCallback():test()?successCallback():setTimeout(function(){Async.waitFor(test,successCallback,failureCallback,interval,maxTries,numTries)},interval)},Async}();Utils.Async=Async}(Utils||(Utils={}));var Utils;!function(Utils){var Bools=function(){function Bools(){}return Bools.getBool=function(val,defaultVal){return null===val||"undefined"==typeof val?defaultVal:val},Bools}();Utils.Bools=Bools}(Utils||(Utils={}));var Utils;!function(Utils){var Clipboard=function(){function Clipboard(){}return Clipboard.copy=function(text){var $tempDiv=$("<div style='position:absolute;left:-9999px'>"),brRegex=/<br\s*[\/]?>/gi;text=text.replace(brRegex,"\n"),$("body").append($tempDiv),$tempDiv.append(text);var $tempInput=$("<textarea>");$tempDiv.append($tempInput),$tempInput.val($tempDiv.text()).select(),document.execCommand("copy"),$tempDiv.remove()},Clipboard.supportsCopy=function(){return document.queryCommandSupported&&document.queryCommandSupported("copy")},Clipboard}();Utils.Clipboard=Clipboard}(Utils||(Utils={}));var __extends=this&&this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)},Utils;!function(Utils){var Collections;!function(Collections){function defaultCompare(a,b){return a<b?-1:a===b?0:1}function defaultEquals(a,b){return a===b}function defaultToString(item){return null===item?"COLLECTION_NULL":collections.isUndefined(item)?"COLLECTION_UNDEFINED":collections.isString(item)?"$s"+item:"$o"+item.toString()}function makeString(item,join){if(void 0===join&&(join=","),null===item)return"COLLECTION_NULL";if(collections.isUndefined(item))return"COLLECTION_UNDEFINED";if(collections.isString(item))return item.toString();var toret="{",first=!0;for(var prop in item)has(item,prop)&&(first?first=!1:toret+=join,toret=toret+prop+":"+item[prop]);return toret+"}"}function isFunction(func){return"function"==typeof func}function isUndefined(obj){return"undefined"==typeof obj}function isString(obj){return"[object String]"===Object.prototype.toString.call(obj)}function reverseCompareFunction(compareFunction){return collections.isFunction(compareFunction)?function(d,v){return compareFunction(d,v)*-1}:function(a,b){return a<b?1:a===b?0:-1}}function compareToEquals(compareFunction){return function(a,b){return 0===compareFunction(a,b)}}var collections=Collections,_hasOwnProperty=Object.prototype.hasOwnProperty,has=function(obj,prop){return _hasOwnProperty.call(obj,prop)};Collections.defaultCompare=defaultCompare,Collections.defaultEquals=defaultEquals,Collections.defaultToString=defaultToString,Collections.makeString=makeString,Collections.isFunction=isFunction,Collections.isUndefined=isUndefined,Collections.isString=isString,Collections.reverseCompareFunction=reverseCompareFunction,Collections.compareToEquals=compareToEquals;var arrays;!function(arrays){function indexOf(array,item,equalsFunction){for(var equals=equalsFunction||collections.defaultEquals,length=array.length,i=0;i<length;i++)if(equals(array[i],item))return i;return-1}function lastIndexOf(array,item,equalsFunction){for(var equals=equalsFunction||collections.defaultEquals,length=array.length,i=length-1;i>=0;i--)if(equals(array[i],item))return i;return-1}function contains(array,item,equalsFunction){return arrays.indexOf(array,item,equalsFunction)>=0}function remove(array,item,equalsFunction){var index=arrays.indexOf(array,item,equalsFunction);return!(index<0)&&(array.splice(index,1),!0)}function frequency(array,item,equalsFunction){for(var equals=equalsFunction||collections.defaultEquals,length=array.length,freq=0,i=0;i<length;i++)equals(array[i],item)&&freq++;return freq}function equals(array1,array2,equalsFunction){var equals=equalsFunction||collections.defaultEquals;if(array1.length!==array2.length)return!1;for(var length=array1.length,i=0;i<length;i++)if(!equals(array1[i],array2[i]))return!1;return!0}function copy(array){return array.concat()}function swap(array,i,j){if(i<0||i>=array.length||j<0||j>=array.length)return!1;var temp=array[i];return array[i]=array[j],array[j]=temp,!0}function toString(array){return"["+array.toString()+"]"}function forEach(array,callback){for(var lenght=array.length,i=0;i<lenght;i++)if(callback(array[i])===!1)return}arrays.indexOf=indexOf,arrays.lastIndexOf=lastIndexOf,arrays.contains=contains,arrays.remove=remove,arrays.frequency=frequency,arrays.equals=equals,arrays.copy=copy,arrays.swap=swap,arrays.toString=toString,arrays.forEach=forEach}(arrays=Collections.arrays||(Collections.arrays={}));var LinkedList=function(){function LinkedList(){this.firstNode=null,this.lastNode=null,this.nElements=0}return LinkedList.prototype.add=function(item,index){if(collections.isUndefined(index)&&(index=this.nElements),index<0||index>this.nElements||collections.isUndefined(item))return!1;var newNode=this.createNode(item);if(0===this.nElements)this.firstNode=newNode,this.lastNode=newNode;else if(index===this.nElements)this.lastNode.next=newNode,this.lastNode=newNode;else if(0===index)newNode.next=this.firstNode,this.firstNode=newNode;else{var prev=this.nodeAtIndex(index-1);newNode.next=prev.next,prev.next=newNode}return this.nElements++,!0},LinkedList.prototype.first=function(){if(null!==this.firstNode)return this.firstNode.element},LinkedList.prototype.last=function(){if(null!==this.lastNode)return this.lastNode.element},LinkedList.prototype.elementAtIndex=function(index){var node=this.nodeAtIndex(index);if(null!==node)return node.element},LinkedList.prototype.indexOf=function(item,equalsFunction){var equalsF=equalsFunction||collections.defaultEquals;if(collections.isUndefined(item))return-1;for(var currentNode=this.firstNode,index=0;null!==currentNode;){if(equalsF(currentNode.element,item))return index;index++,currentNode=currentNode.next}return-1},LinkedList.prototype.contains=function(item,equalsFunction){return this.indexOf(item,equalsFunction)>=0},LinkedList.prototype.remove=function(item,equalsFunction){var equalsF=equalsFunction||collections.defaultEquals;if(this.nElements<1||collections.isUndefined(item))return!1;for(var previous=null,currentNode=this.firstNode;null!==currentNode;){if(equalsF(currentNode.element,item))return currentNode===this.firstNode?(this.firstNode=this.firstNode.next,currentNode===this.lastNode&&(this.lastNode=null)):currentNode===this.lastNode?(this.lastNode=previous,previous.next=currentNode.next,currentNode.next=null):(previous.next=currentNode.next,currentNode.next=null),this.nElements--,!0;previous=currentNode,currentNode=currentNode.next}return!1},LinkedList.prototype.clear=function(){this.firstNode=null,this.lastNode=null,this.nElements=0},LinkedList.prototype.equals=function(other,equalsFunction){var eqF=equalsFunction||collections.defaultEquals;return other instanceof collections.LinkedList&&(this.size()===other.size()&&this.equalsAux(this.firstNode,other.firstNode,eqF))},LinkedList.prototype.equalsAux=function(n1,n2,eqF){for(;null!==n1;){if(!eqF(n1.element,n2.element))return!1;n1=n1.next,n2=n2.next}return!0},LinkedList.prototype.removeElementAtIndex=function(index){if(!(index<0||index>=this.nElements)){var element;if(1===this.nElements)element=this.firstNode.element,this.firstNode=null,this.lastNode=null;else{var previous=this.nodeAtIndex(index-1);null===previous?(element=this.firstNode.element,this.firstNode=this.firstNode.next):previous.next===this.lastNode&&(element=this.lastNode.element,this.lastNode=previous),null!==previous&&(element=previous.next.element,previous.next=previous.next.next)}return this.nElements--,element}},LinkedList.prototype.forEach=function(callback){for(var currentNode=this.firstNode;null!==currentNode&&callback(currentNode.element)!==!1;)currentNode=currentNode.next},LinkedList.prototype.reverse=function(){for(var previous=null,current=this.firstNode,temp=null;null!==current;)temp=current.next,current.next=previous,previous=current,current=temp;temp=this.firstNode,this.firstNode=this.lastNode,this.lastNode=temp},LinkedList.prototype.toArray=function(){for(var array=[],currentNode=this.firstNode;null!==currentNode;)array.push(currentNode.element),currentNode=currentNode.next;return array},LinkedList.prototype.size=function(){return this.nElements},LinkedList.prototype.isEmpty=function(){return this.nElements<=0},LinkedList.prototype.toString=function(){return collections.arrays.toString(this.toArray())},LinkedList.prototype.nodeAtIndex=function(index){if(index<0||index>=this.nElements)return null;if(index===this.nElements-1)return this.lastNode;for(var node=this.firstNode,i=0;i<index;i++)node=node.next;return node},LinkedList.prototype.createNode=function(item){return{element:item,next:null}},LinkedList}();Collections.LinkedList=LinkedList;var Dictionary=function(){function Dictionary(toStrFunction){this.table={},this.nElements=0,this.toStr=toStrFunction||collections.defaultToString}return Dictionary.prototype.getValue=function(key){var pair=this.table["$"+this.toStr(key)];if(!collections.isUndefined(pair))return pair.value},Dictionary.prototype.setValue=function(key,value){if(!collections.isUndefined(key)&&!collections.isUndefined(value)){var ret,k="$"+this.toStr(key),previousElement=this.table[k];return collections.isUndefined(previousElement)?(this.nElements++,ret=void 0):ret=previousElement.value,this.table[k]={key:key,value:value},ret}},Dictionary.prototype.remove=function(key){var k="$"+this.toStr(key),previousElement=this.table[k];if(!collections.isUndefined(previousElement))return delete this.table[k],this.nElements--,previousElement.value},Dictionary.prototype.keys=function(){var array=[];for(var name in this.table)if(has(this.table,name)){var pair=this.table[name];array.push(pair.key)}return array},Dictionary.prototype.values=function(){var array=[];for(var name in this.table)if(has(this.table,name)){var pair=this.table[name];array.push(pair.value)}return array},Dictionary.prototype.forEach=function(callback){for(var name in this.table)if(has(this.table,name)){var pair=this.table[name],ret=callback(pair.key,pair.value);if(ret===!1)return}},Dictionary.prototype.containsKey=function(key){return!collections.isUndefined(this.getValue(key))},Dictionary.prototype.clear=function(){this.table={},this.nElements=0},Dictionary.prototype.size=function(){return this.nElements},Dictionary.prototype.isEmpty=function(){return this.nElements<=0},Dictionary.prototype.toString=function(){var toret="{";return this.forEach(function(k,v){toret=toret+"\n\t"+k.toString()+" : "+v.toString()}),toret+"\n}"},Dictionary}();Collections.Dictionary=Dictionary;var LinkedDictionaryPair=function(){function LinkedDictionaryPair(key,value){this.key=key,this.value=value}return LinkedDictionaryPair.prototype.unlink=function(){this.prev.next=this.next,this.next.prev=this.prev},LinkedDictionaryPair}(),LinkedDictionary=function(_super){function LinkedDictionary(toStrFunction){_super.call(this,toStrFunction),this.head=new LinkedDictionaryPair(null,null),this.tail=new LinkedDictionaryPair(null,null),this.head.next=this.tail,this.tail.prev=this.head}return __extends(LinkedDictionary,_super),LinkedDictionary.prototype.appendToTail=function(entry){var lastNode=this.tail.prev;lastNode.next=entry,entry.prev=lastNode,entry.next=this.tail,this.tail.prev=entry},LinkedDictionary.prototype.getLinkedDictionaryPair=function(key){if(!collections.isUndefined(key)){var k="$"+this.toStr(key),pair=this.table[k];return pair}},LinkedDictionary.prototype.getValue=function(key){var pair=this.getLinkedDictionaryPair(key);if(!collections.isUndefined(pair))return pair.value},LinkedDictionary.prototype.remove=function(key){var pair=this.getLinkedDictionaryPair(key);if(!collections.isUndefined(pair))return _super.prototype.remove.call(this,key),pair.unlink(),pair.value},LinkedDictionary.prototype.clear=function(){_super.prototype.clear.call(this),this.head.next=this.tail,this.tail.prev=this.head},LinkedDictionary.prototype.replace=function(oldPair,newPair){var k="$"+this.toStr(newPair.key);newPair.next=oldPair.next,newPair.prev=oldPair.prev,this.remove(oldPair.key),newPair.prev.next=newPair,newPair.next.prev=newPair,this.table[k]=newPair,++this.nElements},LinkedDictionary.prototype.setValue=function(key,value){if(!collections.isUndefined(key)&&!collections.isUndefined(value)){var existingPair=this.getLinkedDictionaryPair(key),newPair=new LinkedDictionaryPair(key,value),k="$"+this.toStr(key);return collections.isUndefined(existingPair)?(this.appendToTail(newPair),this.table[k]=newPair,void++this.nElements):(this.replace(existingPair,newPair),existingPair.value)}},LinkedDictionary.prototype.keys=function(){var array=[];return this.forEach(function(key,value){array.push(key)}),array},LinkedDictionary.prototype.values=function(){var array=[];return this.forEach(function(key,value){array.push(value)}),array},LinkedDictionary.prototype.forEach=function(callback){for(var crawlNode=this.head.next;null!=crawlNode.next;){var ret=callback(crawlNode.key,crawlNode.value);if(ret===!1)return;crawlNode=crawlNode.next}},LinkedDictionary}(Dictionary);Collections.LinkedDictionary=LinkedDictionary;var MultiDictionary=function(){function MultiDictionary(toStrFunction,valuesEqualsFunction,allowDuplicateValues){void 0===allowDuplicateValues&&(allowDuplicateValues=!1),this.dict=new Dictionary(toStrFunction),this.equalsF=valuesEqualsFunction||collections.defaultEquals,this.allowDuplicate=allowDuplicateValues;
+}return MultiDictionary.prototype.getValue=function(key){var values=this.dict.getValue(key);return collections.isUndefined(values)?[]:collections.arrays.copy(values)},MultiDictionary.prototype.setValue=function(key,value){if(collections.isUndefined(key)||collections.isUndefined(value))return!1;if(!this.containsKey(key))return this.dict.setValue(key,[value]),!0;var array=this.dict.getValue(key);return!(!this.allowDuplicate&&collections.arrays.contains(array,value,this.equalsF))&&(array.push(value),!0)},MultiDictionary.prototype.remove=function(key,value){if(collections.isUndefined(value)){var v=this.dict.remove(key);return!collections.isUndefined(v)}var array=this.dict.getValue(key);return!!collections.arrays.remove(array,value,this.equalsF)&&(0===array.length&&this.dict.remove(key),!0)},MultiDictionary.prototype.keys=function(){return this.dict.keys()},MultiDictionary.prototype.values=function(){for(var values=this.dict.values(),array=[],i=0;i<values.length;i++)for(var v=values[i],j=0;j<v.length;j++)array.push(v[j]);return array},MultiDictionary.prototype.containsKey=function(key){return this.dict.containsKey(key)},MultiDictionary.prototype.clear=function(){this.dict.clear()},MultiDictionary.prototype.size=function(){return this.dict.size()},MultiDictionary.prototype.isEmpty=function(){return this.dict.isEmpty()},MultiDictionary}();Collections.MultiDictionary=MultiDictionary;var Heap=function(){function Heap(compareFunction){this.data=[],this.compare=compareFunction||collections.defaultCompare}return Heap.prototype.leftChildIndex=function(nodeIndex){return 2*nodeIndex+1},Heap.prototype.rightChildIndex=function(nodeIndex){return 2*nodeIndex+2},Heap.prototype.parentIndex=function(nodeIndex){return Math.floor((nodeIndex-1)/2)},Heap.prototype.minIndex=function(leftChild,rightChild){return rightChild>=this.data.length?leftChild>=this.data.length?-1:leftChild:this.compare(this.data[leftChild],this.data[rightChild])<=0?leftChild:rightChild},Heap.prototype.siftUp=function(index){for(var parent=this.parentIndex(index);index>0&&this.compare(this.data[parent],this.data[index])>0;)collections.arrays.swap(this.data,parent,index),index=parent,parent=this.parentIndex(index)},Heap.prototype.siftDown=function(nodeIndex){for(var min=this.minIndex(this.leftChildIndex(nodeIndex),this.rightChildIndex(nodeIndex));min>=0&&this.compare(this.data[nodeIndex],this.data[min])>0;)collections.arrays.swap(this.data,min,nodeIndex),nodeIndex=min,min=this.minIndex(this.leftChildIndex(nodeIndex),this.rightChildIndex(nodeIndex))},Heap.prototype.peek=function(){return this.data.length>0?this.data[0]:void 0},Heap.prototype.add=function(element){if(!collections.isUndefined(element))return this.data.push(element),this.siftUp(this.data.length-1),!0},Heap.prototype.removeRoot=function(){if(this.data.length>0){var obj=this.data[0];return this.data[0]=this.data[this.data.length-1],this.data.splice(this.data.length-1,1),this.data.length>0&&this.siftDown(0),obj}},Heap.prototype.contains=function(element){var equF=collections.compareToEquals(this.compare);return collections.arrays.contains(this.data,element,equF)},Heap.prototype.size=function(){return this.data.length},Heap.prototype.isEmpty=function(){return this.data.length<=0},Heap.prototype.clear=function(){this.data.length=0},Heap.prototype.forEach=function(callback){collections.arrays.forEach(this.data,callback)},Heap}();Collections.Heap=Heap;var Stack=function(){function Stack(){this.list=new LinkedList}return Stack.prototype.push=function(elem){return this.list.add(elem,0)},Stack.prototype.add=function(elem){return this.list.add(elem,0)},Stack.prototype.pop=function(){return this.list.removeElementAtIndex(0)},Stack.prototype.peek=function(){return this.list.first()},Stack.prototype.size=function(){return this.list.size()},Stack.prototype.contains=function(elem,equalsFunction){return this.list.contains(elem,equalsFunction)},Stack.prototype.isEmpty=function(){return this.list.isEmpty()},Stack.prototype.clear=function(){this.list.clear()},Stack.prototype.forEach=function(callback){this.list.forEach(callback)},Stack}();Collections.Stack=Stack;var Queue=function(){function Queue(){this.list=new LinkedList}return Queue.prototype.enqueue=function(elem){return this.list.add(elem)},Queue.prototype.add=function(elem){return this.list.add(elem)},Queue.prototype.dequeue=function(){if(0!==this.list.size()){var el=this.list.first();return this.list.removeElementAtIndex(0),el}},Queue.prototype.peek=function(){if(0!==this.list.size())return this.list.first()},Queue.prototype.size=function(){return this.list.size()},Queue.prototype.contains=function(elem,equalsFunction){return this.list.contains(elem,equalsFunction)},Queue.prototype.isEmpty=function(){return this.list.size()<=0},Queue.prototype.clear=function(){this.list.clear()},Queue.prototype.forEach=function(callback){this.list.forEach(callback)},Queue}();Collections.Queue=Queue;var PriorityQueue=function(){function PriorityQueue(compareFunction){this.heap=new Heap(collections.reverseCompareFunction(compareFunction))}return PriorityQueue.prototype.enqueue=function(element){return this.heap.add(element)},PriorityQueue.prototype.add=function(element){return this.heap.add(element)},PriorityQueue.prototype.dequeue=function(){if(0!==this.heap.size()){var el=this.heap.peek();return this.heap.removeRoot(),el}},PriorityQueue.prototype.peek=function(){return this.heap.peek()},PriorityQueue.prototype.contains=function(element){return this.heap.contains(element)},PriorityQueue.prototype.isEmpty=function(){return this.heap.isEmpty()},PriorityQueue.prototype.size=function(){return this.heap.size()},PriorityQueue.prototype.clear=function(){this.heap.clear()},PriorityQueue.prototype.forEach=function(callback){this.heap.forEach(callback)},PriorityQueue}();Collections.PriorityQueue=PriorityQueue;var Set=function(){function Set(toStringFunction){this.dictionary=new Dictionary(toStringFunction)}return Set.prototype.contains=function(element){return this.dictionary.containsKey(element)},Set.prototype.add=function(element){return!this.contains(element)&&!collections.isUndefined(element)&&(this.dictionary.setValue(element,element),!0)},Set.prototype.intersection=function(otherSet){var set=this;this.forEach(function(element){return otherSet.contains(element)||set.remove(element),!0})},Set.prototype.union=function(otherSet){var set=this;otherSet.forEach(function(element){return set.add(element),!0})},Set.prototype.difference=function(otherSet){var set=this;otherSet.forEach(function(element){return set.remove(element),!0})},Set.prototype.isSubsetOf=function(otherSet){if(this.size()>otherSet.size())return!1;var isSub=!0;return this.forEach(function(element){return!!otherSet.contains(element)||(isSub=!1,!1)}),isSub},Set.prototype.remove=function(element){return!!this.contains(element)&&(this.dictionary.remove(element),!0)},Set.prototype.forEach=function(callback){this.dictionary.forEach(function(k,v){return callback(v)})},Set.prototype.toArray=function(){return this.dictionary.values()},Set.prototype.isEmpty=function(){return this.dictionary.isEmpty()},Set.prototype.size=function(){return this.dictionary.size()},Set.prototype.clear=function(){this.dictionary.clear()},Set.prototype.toString=function(){return collections.arrays.toString(this.toArray())},Set}();Collections.Set=Set;var Bag=function(){function Bag(toStrFunction){this.toStrF=toStrFunction||collections.defaultToString,this.dictionary=new Dictionary(this.toStrF),this.nElements=0}return Bag.prototype.add=function(element,nCopies){if(void 0===nCopies&&(nCopies=1),collections.isUndefined(element)||nCopies<=0)return!1;if(this.contains(element))this.dictionary.getValue(element).copies+=nCopies;else{var node={value:element,copies:nCopies};this.dictionary.setValue(element,node)}return this.nElements+=nCopies,!0},Bag.prototype.count=function(element){return this.contains(element)?this.dictionary.getValue(element).copies:0},Bag.prototype.contains=function(element){return this.dictionary.containsKey(element)},Bag.prototype.remove=function(element,nCopies){if(void 0===nCopies&&(nCopies=1),collections.isUndefined(element)||nCopies<=0)return!1;if(this.contains(element)){var node=this.dictionary.getValue(element);return nCopies>node.copies?this.nElements-=node.copies:this.nElements-=nCopies,node.copies-=nCopies,node.copies<=0&&this.dictionary.remove(element),!0}return!1},Bag.prototype.toArray=function(){for(var a=[],values=this.dictionary.values(),vl=values.length,i=0;i<vl;i++)for(var node=values[i],element=node.value,copies=node.copies,j=0;j<copies;j++)a.push(element);return a},Bag.prototype.toSet=function(){for(var toret=new Set(this.toStrF),elements=this.dictionary.values(),l=elements.length,i=0;i<l;i++){var value=elements[i].value;toret.add(value)}return toret},Bag.prototype.forEach=function(callback){this.dictionary.forEach(function(k,v){for(var value=v.value,copies=v.copies,i=0;i<copies;i++)if(callback(value)===!1)return!1;return!0})},Bag.prototype.size=function(){return this.nElements},Bag.prototype.isEmpty=function(){return 0===this.nElements},Bag.prototype.clear=function(){this.nElements=0,this.dictionary.clear()},Bag}();Collections.Bag=Bag;var BSTree=function(){function BSTree(compareFunction){this.root=null,this.compare=compareFunction||collections.defaultCompare,this.nElements=0}return BSTree.prototype.add=function(element){return!collections.isUndefined(element)&&(null!==this.insertNode(this.createNode(element))&&(this.nElements++,!0))},BSTree.prototype.clear=function(){this.root=null,this.nElements=0},BSTree.prototype.isEmpty=function(){return 0===this.nElements},BSTree.prototype.size=function(){return this.nElements},BSTree.prototype.contains=function(element){return!collections.isUndefined(element)&&null!==this.searchNode(this.root,element)},BSTree.prototype.remove=function(element){var node=this.searchNode(this.root,element);return null!==node&&(this.removeNode(node),this.nElements--,!0)},BSTree.prototype.inorderTraversal=function(callback){this.inorderTraversalAux(this.root,callback,{stop:!1})},BSTree.prototype.preorderTraversal=function(callback){this.preorderTraversalAux(this.root,callback,{stop:!1})},BSTree.prototype.postorderTraversal=function(callback){this.postorderTraversalAux(this.root,callback,{stop:!1})},BSTree.prototype.levelTraversal=function(callback){this.levelTraversalAux(this.root,callback)},BSTree.prototype.minimum=function(){if(!this.isEmpty())return this.minimumAux(this.root).element},BSTree.prototype.maximum=function(){if(!this.isEmpty())return this.maximumAux(this.root).element},BSTree.prototype.forEach=function(callback){this.inorderTraversal(callback)},BSTree.prototype.toArray=function(){var array=[];return this.inorderTraversal(function(element){return array.push(element),!0}),array},BSTree.prototype.height=function(){return this.heightAux(this.root)},BSTree.prototype.searchNode=function(node,element){for(var cmp=null;null!==node&&0!==cmp;)cmp=this.compare(element,node.element),cmp<0?node=node.leftCh:cmp>0&&(node=node.rightCh);return node},BSTree.prototype.transplant=function(n1,n2){null===n1.parent?this.root=n2:n1===n1.parent.leftCh?n1.parent.leftCh=n2:n1.parent.rightCh=n2,null!==n2&&(n2.parent=n1.parent)},BSTree.prototype.removeNode=function(node){if(null===node.leftCh)this.transplant(node,node.rightCh);else if(null===node.rightCh)this.transplant(node,node.leftCh);else{var y=this.minimumAux(node.rightCh);y.parent!==node&&(this.transplant(y,y.rightCh),y.rightCh=node.rightCh,y.rightCh.parent=y),this.transplant(node,y),y.leftCh=node.leftCh,y.leftCh.parent=y}},BSTree.prototype.inorderTraversalAux=function(node,callback,signal){null===node||signal.stop||(this.inorderTraversalAux(node.leftCh,callback,signal),signal.stop||(signal.stop=callback(node.element)===!1,signal.stop||this.inorderTraversalAux(node.rightCh,callback,signal)))},BSTree.prototype.levelTraversalAux=function(node,callback){var queue=new Queue;for(null!==node&&queue.enqueue(node);!queue.isEmpty();){if(node=queue.dequeue(),callback(node.element)===!1)return;null!==node.leftCh&&queue.enqueue(node.leftCh),null!==node.rightCh&&queue.enqueue(node.rightCh)}},BSTree.prototype.preorderTraversalAux=function(node,callback,signal){null===node||signal.stop||(signal.stop=callback(node.element)===!1,signal.stop||(this.preorderTraversalAux(node.leftCh,callback,signal),signal.stop||this.preorderTraversalAux(node.rightCh,callback,signal)))},BSTree.prototype.postorderTraversalAux=function(node,callback,signal){null===node||signal.stop||(this.postorderTraversalAux(node.leftCh,callback,signal),signal.stop||(this.postorderTraversalAux(node.rightCh,callback,signal),signal.stop||(signal.stop=callback(node.element)===!1)))},BSTree.prototype.minimumAux=function(node){for(;null!==node.leftCh;)node=node.leftCh;return node},BSTree.prototype.maximumAux=function(node){for(;null!==node.rightCh;)node=node.rightCh;return node},BSTree.prototype.heightAux=function(node){return null===node?-1:Math.max(this.heightAux(node.leftCh),this.heightAux(node.rightCh))+1},BSTree.prototype.insertNode=function(node){for(var parent=null,position=this.root,cmp=null;null!==position;){if(cmp=this.compare(node.element,position.element),0===cmp)return null;cmp<0?(parent=position,position=position.leftCh):(parent=position,position=position.rightCh)}return node.parent=parent,null===parent?this.root=node:this.compare(node.element,parent.element)<0?parent.leftCh=node:parent.rightCh=node,node},BSTree.prototype.createNode=function(element){return{element:element,leftCh:null,rightCh:null,parent:null}},BSTree}();Collections.BSTree=BSTree}(Collections=Utils.Collections||(Utils.Collections={}))}(Utils||(Utils={}));var Utils;!function(Utils){var Colors=function(){function Colors(){}return Colors.float32ColorToARGB=function(float32Color){var a=(4278190080&float32Color)>>>24,r=(16711680&float32Color)>>>16,g=(65280&float32Color)>>>8,b=255&float32Color,result=[a,r,g,b];return result},Colors._componentToHex=function(c){var hex=c.toString(16);return 1==hex.length?"0"+hex:hex},Colors.rgbToHexString=function(rgb){return Colors.coalesce(rgb),"#"+Colors._componentToHex(rgb[0])+Colors._componentToHex(rgb[1])+Colors._componentToHex(rgb[2])},Colors.argbToHexString=function(argb){return"#"+Colors._componentToHex(argb[0])+Colors._componentToHex(argb[1])+Colors._componentToHex(argb[2])+Colors._componentToHex(argb[3])},Colors.coalesce=function(arr){for(var i=1;i<arr.length;i++)"undefined"==typeof arr[i]&&(arr[i]=arr[i-1])},Colors}();Utils.Colors=Colors}(Utils||(Utils={}));var Utils;!function(Utils){var Dates=function(){function Dates(){}return Dates.getTimeStamp=function(){return(new Date).getTime()},Dates}();Utils.Dates=Dates}(Utils||(Utils={}));var Utils;!function(Utils){var Device=function(){function Device(){}return Device.getPixelRatio=function(ctx){var dpr=window.devicePixelRatio||1,bsr=ctx.webkitBackingStorePixelRatio||ctx.mozBackingStorePixelRatio||ctx.msBackingStorePixelRatio||ctx.oBackingStorePixelRatio||ctx.backingStorePixelRatio||1;return dpr/bsr},Device.isTouch=function(){return!!("ontouchstart"in window)||window.navigator.msMaxTouchPoints>0},Device}();Utils.Device=Device}(Utils||(Utils={}));var Utils;!function(Utils){var Documents=function(){function Documents(){}return Documents.isInIFrame=function(){try{return window.self!==window.top}catch(e){return!0}},Documents.supportsFullscreen=function(){var doc=document.documentElement,support=doc.requestFullscreen||doc.mozRequestFullScreen||doc.webkitRequestFullScreen||doc.msRequestFullscreen;return void 0!=support},Documents.isHidden=function(){var prop=Documents.getHiddenProp();return!!prop&&document[prop]},Documents.getHiddenProp=function(){var prefixes=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var i=0;i<prefixes.length;i++)if(prefixes[i]+"Hidden"in document)return prefixes[i]+"Hidden";return null},Documents}();Utils.Documents=Documents}(Utils||(Utils={}));var Utils;!function(Utils){var Events=function(){function Events(){}return Events.debounce=function(fn,debounceDuration){return debounceDuration=debounceDuration||100,function(){if(!fn.debouncing){var args=Array.prototype.slice.apply(arguments);fn.lastReturnVal=fn.apply(window,args),fn.debouncing=!0}return clearTimeout(fn.debounceTimeout),fn.debounceTimeout=setTimeout(function(){fn.debouncing=!1},debounceDuration),fn.lastReturnVal}},Events}();Utils.Events=Events}(Utils||(Utils={}));var Utils;!function(Utils){var Files=function(){function Files(){}return Files.simplifyMimeType=function(mime){switch(mime){case"text/plain":return"txt";case"image/jpeg":return"jpg";case"application/msword":return"doc";case"application/vnd.openxmlformats-officedocument.wordprocessingml.document":return"docx";default:var parts=mime.split("/");return parts[parts.length-1]}},Files}();Utils.Files=Files}(Utils||(Utils={}));var Utils;!function(Utils){var Keyboard=function(){function Keyboard(){}return Keyboard.getCharCode=function(e){var charCode="number"==typeof e.which?e.which:e.keyCode;return charCode},Keyboard}();Utils.Keyboard=Keyboard}(Utils||(Utils={}));var Utils;!function(Utils){var Maths;!function(Maths){var Vector=function(){function Vector(x,y){this.X=x,this.Y=y}return Vector.prototype.get=function(){return new Vector(this.X,this.Y)},Vector.prototype.set=function(x,y){this.X=x,this.Y=y},Vector.prototype.add=function(v){this.X+=v.X,this.Y+=v.Y},Vector.add=function(v1,v2){return new Vector(v1.X+v2.X,v1.Y+v2.Y)},Vector.prototype.sub=function(v){this.X-=v.X,this.Y-=v.Y},Vector.sub=function(v1,v2){return new Vector(v1.X-v2.X,v1.Y-v2.Y)},Vector.prototype.mult=function(n){this.X=this.X*n,this.Y=this.Y*n},Vector.mult=function(v1,v2){return new Vector(v1.X*v2.X,v1.Y*v2.Y)},Vector.multN=function(v1,n){return new Vector(v1.X*n,v1.Y*n)},Vector.prototype.Div=function(n){this.X=this.X/n,this.Y=this.Y/n},Vector.div=function(v1,v2){return new Vector(v1.X/v2.X,v1.Y/v2.Y)},Vector.divN=function(v1,n){return new Vector(v1.X/n,v1.Y/n)},Vector.prototype.mag=function(){return Math.sqrt(this.X*this.X+this.Y*this.Y)},Vector.prototype.magSq=function(){return this.X*this.X+this.Y*this.Y},Vector.prototype.normalise=function(){var m=this.mag();0!=m&&1!=m&&this.Div(m)},Vector.prototype.limit=function(max){this.magSq()>max*max&&(this.normalise(),this.mult(max))},Vector.prototype.equals=function(v){return this.X==v.X&&this.Y==v.Y},Vector.prototype.heading=function(){var angle=Math.atan2(-this.Y,this.X);return-1*angle},Vector.random2D=function(){return Vector.fromAngle(Math.random()*Math.TAU)},Vector.fromAngle=function(angle){return new Vector(Math.cos(angle),Math.sin(angle))},Vector}();Maths.Vector=Vector}(Maths=Utils.Maths||(Utils.Maths={}))}(Utils||(Utils={}));var Utils;!function(Utils){var Measurements;!function(Measurements){var Size=function(){function Size(width,height){this.width=width,this.height=height}return Size}();Measurements.Size=Size;var Dimensions=function(){function Dimensions(){}return Dimensions.fitRect=function(width1,height1,width2,height2){var width,height,scale,ratio1=height1/width1,ratio2=height2/width2;return ratio1<ratio2&&(scale=width2/width1,width=width1*scale,height=height1*scale),ratio2<ratio1&&(scale=height2/height1,width=width1*scale,height=height1*scale),new Size(Math.floor(width),Math.floor(height))},Dimensions.hitRect=function(x,y,w,h,mx,my){return mx>x&&mx<x+w&&my>y&&my<y+h},Dimensions}();Measurements.Dimensions=Dimensions}(Measurements=Utils.Measurements||(Utils.Measurements={}))}(Utils||(Utils={}));var Utils;!function(Utils){var Numbers=function(){function Numbers(){}return Numbers.numericalInput=function(event){return 46==event.keyCode||8==event.keyCode||9==event.keyCode||27==event.keyCode||65==event.keyCode&&event.ctrlKey===!0||event.keyCode>=35&&event.keyCode<=39||(!(event.shiftKey||(event.keyCode<48||event.keyCode>57)&&(event.keyCode<96||event.keyCode>105))||(event.preventDefault(),!1))},Numbers}();Utils.Numbers=Numbers}(Utils||(Utils={}));var Utils;!function(Utils){var Storage=function(){function Storage(){}return Storage.clear=function(storageType){switch(void 0===storageType&&(storageType=Utils.StorageType.memory),storageType.value){case Utils.StorageType.memory.value:this._memoryStorage={};break;case Utils.StorageType.session.value:sessionStorage.clear();break;case Utils.StorageType.local.value:localStorage.clear()}},Storage.clearExpired=function(storageType){void 0===storageType&&(storageType=Utils.StorageType.memory);for(var items=this.getItems(storageType),i=0;i<items.length;i++){var item=items[i];this._isExpired(item)&&this.remove(item.key)}},Storage.get=function(key,storageType){void 0===storageType&&(storageType=Utils.StorageType.memory);var data;switch(storageType.value){case Utils.StorageType.memory.value:data=this._memoryStorage[key];break;case Utils.StorageType.session.value:data=sessionStorage.getItem(key);break;case Utils.StorageType.local.value:data=localStorage.getItem(key)}if(!data)return null;var item=JSON.parse(data);return this._isExpired(item)?null:(item.key=key,item)},Storage._isExpired=function(item){return!((new Date).getTime()<item.expiresAt)},Storage.getItems=function(storageType){void 0===storageType&&(storageType=Utils.StorageType.memory);var items=[];switch(storageType.value){case Utils.StorageType.memory.value:for(var keys=Object.keys(this._memoryStorage),i=0;i<keys.length;i++){var item=this.get(keys[i],Utils.StorageType.memory);item&&items.push(item)}break;case Utils.StorageType.session.value:for(var i=0;i<sessionStorage.length;i++){var key=sessionStorage.key(i),item=this.get(key,Utils.StorageType.session);item&&items.push(item)}break;case Utils.StorageType.local.value:for(var i=0;i<localStorage.length;i++){var key=localStorage.key(i),item=this.get(key,Utils.StorageType.local);item&&items.push(item)}}return items},Storage.remove=function(key,storageType){switch(void 0===storageType&&(storageType=Utils.StorageType.memory),storageType.value){case Utils.StorageType.memory.value:delete this._memoryStorage[key];break;case Utils.StorageType.session.value:sessionStorage.removeItem(key);break;case Utils.StorageType.local.value:localStorage.removeItem(key)}},Storage.set=function(key,value,expirationSecs,storageType){void 0===storageType&&(storageType=Utils.StorageType.memory);var expirationMS=1e3*expirationSecs,record=new Utils.StorageItem;switch(record.value=value,record.expiresAt=(new Date).getTime()+expirationMS,storageType.value){case Utils.StorageType.memory.value:this._memoryStorage[key]=JSON.stringify(record);break;case Utils.StorageType.session.value:sessionStorage.setItem(key,JSON.stringify(record));break;case Utils.StorageType.local.value:localStorage.setItem(key,JSON.stringify(record))}return record},Storage._memoryStorage={},Storage}();Utils.Storage=Storage}(Utils||(Utils={}));var Utils;!function(Utils){var StorageItem=function(){function StorageItem(){}return StorageItem}();Utils.StorageItem=StorageItem}(Utils||(Utils={}));var Utils;!function(Utils){var StorageType=function(){function StorageType(value){this.value=value}return StorageType.prototype.toString=function(){return this.value},StorageType.memory=new StorageType("memory"),StorageType.session=new StorageType("session"),StorageType.local=new StorageType("local"),StorageType}();Utils.StorageType=StorageType}(Utils||(Utils={}));var Utils;!function(Utils){var Strings=function(){function Strings(){}return Strings.ellipsis=function(text,chars){if(text.length<=chars)return text;var trimmedText=text.substr(0,chars),lastSpaceIndex=trimmedText.lastIndexOf(" ");return lastSpaceIndex!=-1&&(trimmedText=trimmedText.substr(0,Math.min(trimmedText.length,lastSpaceIndex))),trimmedText+"&hellip;"},Strings.htmlDecode=function(encoded){var div=document.createElement("div");return div.innerHTML=encoded,div.firstChild.nodeValue},Strings}();Utils.Strings=Strings}(Utils||(Utils={}));var Utils;!function(Utils){var Urls=function(){function Urls(){}return Urls.getHashParameter=function(key,doc){doc||(doc=window.document);var regex=new RegExp("#.*[?&]"+key+"=([^&]+)(&|$)"),match=regex.exec(doc.location.hash);return match?decodeURIComponent(match[1].replace(/\+/g," ")):null},Urls.setHashParameter=function(key,value,doc){doc||(doc=window.document);var kvp=this.updateURIKeyValuePair(doc.location.hash.replace("#?",""),key,value),newHash="#?"+kvp,url=doc.URL,index=url.indexOf("#");index!=-1&&(url=url.substr(0,url.indexOf("#"))),doc.location.replace(url+newHash)},Urls.getQuerystringParameter=function(key,w){return w||(w=window),this.getQuerystringParameterFromString(key,w.location.search)},Urls.getQuerystringParameterFromString=function(key,querystring){key=key.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regex=new RegExp("[\\?&]"+key+"=([^&#]*)"),match=regex.exec(querystring);return match?decodeURIComponent(match[1].replace(/\+/g," ")):null},Urls.setQuerystringParameter=function(key,value,doc){doc||(doc=window.document);var kvp=this.updateURIKeyValuePair(doc.location.hash.replace("#?",""),key,value);window.location.search=kvp},Urls.updateURIKeyValuePair=function(uriSegment,key,value){key=encodeURIComponent(key),value=encodeURIComponent(value);var kvp=uriSegment.split("&");""==kvp[0]&&kvp.shift();for(var x,i=kvp.length;i--;)if(x=kvp[i].split("="),x[0]==key){x[1]=value,kvp[i]=x.join("=");break}return i<0&&(kvp[kvp.length]=[key,value].join("=")),kvp.join("&")},Urls.getUrlParts=function(url){var a=document.createElement("a");return a.href=url,a},Urls.convertToRelativeUrl=function(url){var parts=this.getUrlParts(url),relUri=parts.pathname+parts.searchWithin;return relUri.startsWith("/")||(relUri="/"+relUri),relUri},Urls}();Utils.Urls=Urls}(Utils||(Utils={}));
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/compatibility.js b/public/opac/js/universalviewer-2.0.2/lib/compatibility.js
new file mode 100644
index 0000000000000000000000000000000000000000..c17381313cae5b9d3d5ff46b33eda0c526923a99
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/compatibility.js
@@ -0,0 +1,559 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals VBArray, PDFJS */
+
+'use strict';
+
+// Initializing PDFJS global object here, it case if we need to change/disable
+// some PDF.js features, e.g. range requests
+if (typeof PDFJS === 'undefined') {
+  (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+// Checking if the typed arrays are supported
+(function checkTypedArrayCompatibility() {
+  if (typeof Uint8Array !== 'undefined') {
+    // some mobile versions do not support subarray (e.g. safari 5 / iOS)
+    if (typeof Uint8Array.prototype.subarray === 'undefined') {
+        Uint8Array.prototype.subarray = function subarray(start, end) {
+          return new Uint8Array(this.slice(start, end));
+        };
+        Float32Array.prototype.subarray = function subarray(start, end) {
+          return new Float32Array(this.slice(start, end));
+        };
+    }
+
+    // some mobile version might not support Float64Array
+    if (typeof Float64Array === 'undefined') {
+      window.Float64Array = Float32Array;
+    }
+    return;
+  }
+
+  function subarray(start, end) {
+    return new TypedArray(this.slice(start, end));
+  }
+
+  function setArrayOffset(array, offset) {
+    if (arguments.length < 2) {
+      offset = 0;
+    }
+    for (var i = 0, n = array.length; i < n; ++i, ++offset) {
+      this[offset] = array[i] & 0xFF;
+    }
+  }
+
+  function TypedArray(arg1) {
+    var result, i, n;
+    if (typeof arg1 === 'number') {
+      result = [];
+      for (i = 0; i < arg1; ++i) {
+        result[i] = 0;
+      }
+    } else if ('slice' in arg1) {
+      result = arg1.slice(0);
+    } else {
+      result = [];
+      for (i = 0, n = arg1.length; i < n; ++i) {
+        result[i] = arg1[i];
+      }
+    }
+
+    result.subarray = subarray;
+    result.buffer = result;
+    result.byteLength = result.length;
+    result.set = setArrayOffset;
+
+    if (typeof arg1 === 'object' && arg1.buffer) {
+      result.buffer = arg1.buffer;
+    }
+    return result;
+  }
+
+  window.Uint8Array = TypedArray;
+  window.Int8Array = TypedArray;
+
+  // we don't need support for set, byteLength for 32-bit array
+  // so we can use the TypedArray as well
+  window.Uint32Array = TypedArray;
+  window.Int32Array = TypedArray;
+  window.Uint16Array = TypedArray;
+  window.Float32Array = TypedArray;
+  window.Float64Array = TypedArray;
+})();
+
+// URL = URL || webkitURL
+(function normalizeURLObject() {
+  if (!window.URL) {
+    window.URL = window.webkitURL;
+  }
+})();
+
+// Object.create() ?
+(function checkObjectCreateCompatibility() {
+  if (typeof Object.create !== 'undefined') {
+    return;
+  }
+
+  Object.create = function objectCreate(proto) {
+    function Constructor() {}
+    Constructor.prototype = proto;
+    return new Constructor();
+  };
+})();
+
+// Object.defineProperty() ?
+(function checkObjectDefinePropertyCompatibility() {
+  if (typeof Object.defineProperty !== 'undefined') {
+    var definePropertyPossible = true;
+    try {
+      // some browsers (e.g. safari) cannot use defineProperty() on DOM objects
+      // and thus the native version is not sufficient
+      Object.defineProperty(new Image(), 'id', { value: 'test' });
+      // ... another test for android gb browser for non-DOM objects
+      var Test = function Test() {};
+      Test.prototype = { get id() { } };
+      Object.defineProperty(new Test(), 'id',
+        { value: '', configurable: true, enumerable: true, writable: false });
+    } catch (e) {
+      definePropertyPossible = false;
+    }
+    if (definePropertyPossible) {
+      return;
+    }
+  }
+
+  Object.defineProperty = function objectDefineProperty(obj, name, def) {
+    delete obj[name];
+    if ('get' in def) {
+      obj.__defineGetter__(name, def['get']);
+    }
+    if ('set' in def) {
+      obj.__defineSetter__(name, def['set']);
+    }
+    if ('value' in def) {
+      obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
+        this.__defineGetter__(name, function objectDefinePropertyGetter() {
+          return value;
+        });
+        return value;
+      });
+      obj[name] = def.value;
+    }
+  };
+})();
+
+// Object.keys() ?
+(function checkObjectKeysCompatibility() {
+  if (typeof Object.keys !== 'undefined') {
+    return;
+  }
+
+  Object.keys = function objectKeys(obj) {
+    var result = [];
+    for (var i in obj) {
+      if (obj.hasOwnProperty(i)) {
+        result.push(i);
+      }
+    }
+    return result;
+  };
+})();
+
+// No readAsArrayBuffer ?
+(function checkFileReaderReadAsArrayBuffer() {
+  if (typeof FileReader === 'undefined') {
+    return; // FileReader is not implemented
+  }
+  var frPrototype = FileReader.prototype;
+  // Older versions of Firefox might not have readAsArrayBuffer
+  if ('readAsArrayBuffer' in frPrototype) {
+    return; // readAsArrayBuffer is implemented
+  }
+  Object.defineProperty(frPrototype, 'readAsArrayBuffer', {
+    value: function fileReaderReadAsArrayBuffer(blob) {
+      var fileReader = new FileReader();
+      var originalReader = this;
+      fileReader.onload = function fileReaderOnload(evt) {
+        var data = evt.target.result;
+        var buffer = new ArrayBuffer(data.length);
+        var uint8Array = new Uint8Array(buffer);
+
+        for (var i = 0, ii = data.length; i < ii; i++) {
+          uint8Array[i] = data.charCodeAt(i);
+        }
+
+        Object.defineProperty(originalReader, 'result', {
+          value: buffer,
+          enumerable: true,
+          writable: false,
+          configurable: true
+        });
+
+        var event = document.createEvent('HTMLEvents');
+        event.initEvent('load', false, false);
+        originalReader.dispatchEvent(event);
+      };
+      fileReader.readAsBinaryString(blob);
+    }
+  });
+})();
+
+// No XMLHttpRequest.response ?
+(function checkXMLHttpRequestResponseCompatibility() {
+  var xhrPrototype = XMLHttpRequest.prototype;
+  if (!('overrideMimeType' in xhrPrototype)) {
+    // IE10 might have response, but not overrideMimeType
+    Object.defineProperty(xhrPrototype, 'overrideMimeType', {
+      value: function xmlHttpRequestOverrideMimeType(mimeType) {}
+    });
+  }
+  if ('response' in xhrPrototype ||
+      'mozResponseArrayBuffer' in xhrPrototype ||
+      'mozResponse' in xhrPrototype ||
+      'responseArrayBuffer' in xhrPrototype) {
+    return;
+  }
+  // IE9 ?
+  if (typeof VBArray !== 'undefined') {
+    Object.defineProperty(xhrPrototype, 'response', {
+      get: function xmlHttpRequestResponseGet() {
+        return new Uint8Array(new VBArray(this.responseBody).toArray());
+      }
+    });
+    return;
+  }
+
+  // other browsers
+  function responseTypeSetter() {
+    // will be only called to set "arraybuffer"
+    this.overrideMimeType('text/plain; charset=x-user-defined');
+  }
+  if (typeof xhrPrototype.overrideMimeType === 'function') {
+    Object.defineProperty(xhrPrototype, 'responseType',
+                          { set: responseTypeSetter });
+  }
+  function responseGetter() {
+    var text = this.responseText;
+    var i, n = text.length;
+    var result = new Uint8Array(n);
+    for (i = 0; i < n; ++i) {
+      result[i] = text.charCodeAt(i) & 0xFF;
+    }
+    return result;
+  }
+  Object.defineProperty(xhrPrototype, 'response', { get: responseGetter });
+})();
+
+// window.btoa (base64 encode function) ?
+(function checkWindowBtoaCompatibility() {
+  if ('btoa' in window) {
+    return;
+  }
+
+  var digits =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+  window.btoa = function windowBtoa(chars) {
+    var buffer = '';
+    var i, n;
+    for (i = 0, n = chars.length; i < n; i += 3) {
+      var b1 = chars.charCodeAt(i) & 0xFF;
+      var b2 = chars.charCodeAt(i + 1) & 0xFF;
+      var b3 = chars.charCodeAt(i + 2) & 0xFF;
+      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+      var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+      var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
+      buffer += (digits.charAt(d1) + digits.charAt(d2) +
+                 digits.charAt(d3) + digits.charAt(d4));
+    }
+    return buffer;
+  };
+})();
+
+// window.atob (base64 encode function) ?
+(function checkWindowAtobCompatibility() {
+  if ('atob' in window) {
+    return;
+  }
+
+  // https://github.com/davidchambers/Base64.js
+  var digits =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+  window.atob = function (input) {
+    input = input.replace(/=+$/, '');
+    if (input.length % 4 == 1) {
+      throw new Error('bad atob input');
+    }
+    for (
+      // initialize result and counters
+      var bc = 0, bs, buffer, idx = 0, output = '';
+      // get next character
+      buffer = input.charAt(idx++);
+      // character found in table?
+      // initialize bit storage and add its ascii value
+      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
+        // and if not first of each 4 characters,
+        // convert the first 8 bits to one ascii character
+        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
+    ) {
+      // try to find character in table (0-63, not found => -1)
+      buffer = digits.indexOf(buffer);
+    }
+    return output;
+  };
+})();
+
+// Function.prototype.bind ?
+(function checkFunctionPrototypeBindCompatibility() {
+  if (typeof Function.prototype.bind !== 'undefined') {
+    return;
+  }
+
+  Function.prototype.bind = function functionPrototypeBind(obj) {
+    var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);
+    var bound = function functionPrototypeBindBound() {
+      var args = headArgs.concat(Array.prototype.slice.call(arguments));
+      return fn.apply(obj, args);
+    };
+    return bound;
+  };
+})();
+
+// HTMLElement dataset property
+(function checkDatasetProperty() {
+  var div = document.createElement('div');
+  if ('dataset' in div) {
+    return; // dataset property exists
+  }
+
+  Object.defineProperty(HTMLElement.prototype, 'dataset', {
+    get: function() {
+      if (this._dataset) {
+        return this._dataset;
+      }
+
+      var dataset = {};
+      for (var j = 0, jj = this.attributes.length; j < jj; j++) {
+        var attribute = this.attributes[j];
+        if (attribute.name.substring(0, 5) != 'data-') {
+          continue;
+        }
+        var key = attribute.name.substring(5).replace(/\-([a-z])/g,
+          function(all, ch) {
+            return ch.toUpperCase();
+          });
+        dataset[key] = attribute.value;
+      }
+
+      Object.defineProperty(this, '_dataset', {
+        value: dataset,
+        writable: false,
+        enumerable: false
+      });
+      return dataset;
+    },
+    enumerable: true
+  });
+})();
+
+// HTMLElement classList property
+(function checkClassListProperty() {
+  var div = document.createElement('div');
+  if ('classList' in div) {
+    return; // classList property exists
+  }
+
+  function changeList(element, itemName, add, remove) {
+    var s = element.className || '';
+    var list = s.split(/\s+/g);
+    if (list[0] === '') {
+      list.shift();
+    }
+    var index = list.indexOf(itemName);
+    if (index < 0 && add) {
+      list.push(itemName);
+    }
+    if (index >= 0 && remove) {
+      list.splice(index, 1);
+    }
+    element.className = list.join(' ');
+    return (index >= 0);
+  }
+
+  var classListPrototype = {
+    add: function(name) {
+      changeList(this.element, name, true, false);
+    },
+    contains: function(name) {
+      return changeList(this.element, name, false, false);
+    },
+    remove: function(name) {
+      changeList(this.element, name, false, true);
+    },
+    toggle: function(name) {
+      changeList(this.element, name, true, true);
+    }
+  };
+
+  Object.defineProperty(HTMLElement.prototype, 'classList', {
+    get: function() {
+      if (this._classList) {
+        return this._classList;
+      }
+
+      var classList = Object.create(classListPrototype, {
+        element: {
+          value: this,
+          writable: false,
+          enumerable: true
+        }
+      });
+      Object.defineProperty(this, '_classList', {
+        value: classList,
+        writable: false,
+        enumerable: false
+      });
+      return classList;
+    },
+    enumerable: true
+  });
+})();
+
+// Check console compatibility
+(function checkConsoleCompatibility() {
+  if (!('console' in window)) {
+    window.console = {
+      log: function() {},
+      error: function() {},
+      warn: function() {}
+    };
+  } else if (!('bind' in console.log)) {
+    // native functions in IE9 might not have bind
+    console.log = (function(fn) {
+      return function(msg) { return fn(msg); };
+    })(console.log);
+    console.error = (function(fn) {
+      return function(msg) { return fn(msg); };
+    })(console.error);
+    console.warn = (function(fn) {
+      return function(msg) { return fn(msg); };
+    })(console.warn);
+  }
+})();
+
+// Check onclick compatibility in Opera
+(function checkOnClickCompatibility() {
+  // workaround for reported Opera bug DSK-354448:
+  // onclick fires on disabled buttons with opaque content
+  function ignoreIfTargetDisabled(event) {
+    if (isDisabled(event.target)) {
+      event.stopPropagation();
+    }
+  }
+  function isDisabled(node) {
+    return node.disabled || (node.parentNode && isDisabled(node.parentNode));
+  }
+  if (navigator.userAgent.indexOf('Opera') != -1) {
+    // use browser detection since we cannot feature-check this bug
+    document.addEventListener('click', ignoreIfTargetDisabled, true);
+  }
+})();
+
+// Checks if possible to use URL.createObjectURL()
+(function checkOnBlobSupport() {
+  // sometimes IE loosing the data created with createObjectURL(), see #3977
+  if (navigator.userAgent.indexOf('Trident') >= 0) {
+    PDFJS.disableCreateObjectURL = true;
+  }
+})();
+
+// Checks if navigator.language is supported
+(function checkNavigatorLanguage() {
+  if ('language' in navigator &&
+      /^[a-z]+(-[A-Z]+)?$/.test(navigator.language)) {
+    return;
+  }
+  function formatLocale(locale) {
+    var split = locale.split(/[-_]/);
+    split[0] = split[0].toLowerCase();
+    if (split.length > 1) {
+      split[1] = split[1].toUpperCase();
+    }
+    return split.join('-');
+  }
+  var language = navigator.language || navigator.userLanguage || 'en-US';
+  PDFJS.locale = formatLocale(language);
+})();
+
+(function checkRangeRequests() {
+  // Safari has issues with cached range requests see:
+  // https://github.com/mozilla/pdf.js/issues/3260
+  // Last tested with version 6.0.4.
+  var isSafari = Object.prototype.toString.call(
+                  window.HTMLElement).indexOf('Constructor') > 0;
+
+  // Older versions of Android (pre 3.0) has issues with range requests, see:
+  // https://github.com/mozilla/pdf.js/issues/3381.
+  // Make sure that we only match webkit-based Android browsers,
+  // since Firefox/Fennec works as expected.
+  var regex = /Android\s[0-2][^\d]/;
+  var isOldAndroid = regex.test(navigator.userAgent);
+
+  if (isSafari || isOldAndroid) {
+    PDFJS.disableRange = true;
+  }
+})();
+
+// Check if the browser supports manipulation of the history.
+(function checkHistoryManipulation() {
+  if (!window.history.pushState) {
+    PDFJS.disableHistory = true;
+  }
+})();
+
+(function checkSetPresenceInImageData() {
+  if (window.CanvasPixelArray) {
+    if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
+      window.CanvasPixelArray.prototype.set = function(arr) {
+        for (var i = 0, ii = this.length; i < ii; i++) {
+          this[i] = arr[i];
+        }
+      };
+    }
+  }
+})();
+
+(function checkStorages() {
+  // Feature test as per http://diveintohtml5.info/storage.html
+  // The additional localStorage call is to get around a FF quirk, see
+  // bug #495747 in bugzilla
+  try {
+    if ('localStorage' in window && window['localStorage'] !== null) {
+      return;
+    }
+  } catch (e) { }
+  window.localStorage = {
+    data: Object.create(null),
+    getItem: function (key) {
+      return this.data[key];
+    },
+    setItem: function (key, value) {
+      this.data[key] = value;
+    }
+  };
+})();
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/embed.js b/public/opac/js/universalviewer-2.0.2/lib/embed.js
new file mode 100644
index 0000000000000000000000000000000000000000..82d7eb48c4994704575a9ec1b8c6b27daf1129d9
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/embed.js
@@ -0,0 +1,553 @@
+// uv-2.0.2
+
+//https://raw.githubusercontent.com/jfriend00/docReady/master/docready.js
+(function(funcName, baseObj) {
+    // The public function name defaults to window.docReady
+    // but you can pass in your own object and own function name and those will be used
+    // if you want to put them in a different namespace
+    funcName = funcName || "docReady";
+    baseObj = baseObj || window;
+    var readyList = [];
+    var readyFired = false;
+    var readyEventHandlersInstalled = false;
+
+    // call this when the document is ready
+    // this function protects itself against being called more than once
+    function ready() {
+        if (!readyFired) {
+            // this must be set to true before we start calling callbacks
+            readyFired = true;
+            for (var i = 0; i < readyList.length; i++) {
+                // if a callback here happens to add new ready handlers,
+                // the docReady() function will see that it already fired
+                // and will schedule the callback to run right after
+                // this event loop finishes so all handlers will still execute
+                // in order and no new ones will be added to the readyList
+                // while we are processing the list
+                readyList[i].fn.call(window, readyList[i].ctx);
+            }
+            // allow any closures held by these functions to free
+            readyList = [];
+        }
+    }
+
+    function readyStateChange() {
+        if ( document.readyState === "complete" ) {
+            ready();
+        }
+    }
+
+    // This is the one public interface
+    // docReady(fn, context);
+    // the context argument is optional - if present, it will be passed
+    // as an argument to the callback
+    baseObj[funcName] = function(callback, context) {
+        // if ready has already fired, then just schedule the callback
+        // to fire asynchronously, but right away
+        if (readyFired) {
+            setTimeout(function() {callback(context);}, 1);
+            return;
+        } else {
+            // add the function and context to the list
+            readyList.push({fn: callback, ctx: context});
+        }
+        // if document already ready to go, schedule the ready function to run
+        if (document.readyState === "complete") {
+            setTimeout(ready, 1);
+        } else if (!readyEventHandlersInstalled) {
+            // otherwise if we don't have event handlers installed, install them
+            if (document.addEventListener) {
+                // first choice is DOMContentLoaded event
+                document.addEventListener("DOMContentLoaded", ready, false);
+                // backup is window load event
+                window.addEventListener("load", ready, false);
+            } else {
+                // must be IE
+                document.attachEvent("onreadystatechange", readyStateChange);
+                window.attachEvent("onload", ready);
+            }
+            readyEventHandlersInstalled = true;
+        }
+    }
+})("docReady", window);
+
+docReady(function() {
+    (function (window, document, version, callback) {
+
+        // only run this script once per page.
+        if (window.embedScriptIncluded) return;
+
+        window.embedScriptIncluded = true;
+
+        // get the script location.
+        var s = document.getElementById('embedUV');
+
+        if (!s){
+            var scripts = document.getElementsByTagName('script');
+            s = scripts[scripts.length - 1];
+        }
+
+        var scriptUri = (/.*src="(.*)"/).exec(s.outerHTML)[1];
+        var absScriptUri = s.src;
+
+        var j, d;
+        var loaded = false;
+
+        function isPositiveInteger(x) {
+            // http://stackoverflow.com/a/1019526/11236
+            return /^\d+$/.test(x);
+        }
+
+        /**
+         * Compare two software version numbers (e.g. 1.7.1)
+         * Returns:
+         *
+         *  0 if they're identical
+         *  negative if v1 < v2
+         *  positive if v1 > v2
+         *  Nan if they in the wrong format
+         *
+         *  E.g.:
+         *
+         *  assert(version_number_compare("1.7.1", "1.6.10") > 0);
+         *  assert(version_number_compare("1.7.1", "1.7.10") < 0);
+         *
+         *  "Unit tests": http://jsfiddle.net/ripper234/Xv9WL/28/
+         *
+         *  Taken from http://stackoverflow.com/a/6832721/11236
+         */
+        function compareVersionNumbers(v1, v2){
+            var v1parts = v1.split('.');
+            var v2parts = v2.split('.');
+
+            // First, validate both numbers are true version numbers
+            function validateParts(parts) {
+                for (var i = 0; i < parts.length; ++i) {
+                    if (!isPositiveInteger(parts[i])) {
+                        return false;
+                    }
+                }
+                return true;
+            }
+            if (!validateParts(v1parts) || !validateParts(v2parts)) {
+                return NaN;
+            }
+
+            for (var i = 0; i < v1parts.length; ++i) {
+                if (v2parts.length === i) {
+                    return 1;
+                }
+
+                if (v1parts[i] === v2parts[i]) {
+                    continue;
+                }
+                if (v1parts[i] > v2parts[i]) {
+                    return 1;
+                }
+                return -1;
+            }
+
+            if (v1parts.length != v2parts.length) {
+                return -1;
+            }
+
+            return 0;
+        }
+
+        // only load jQuery if not already included in page.
+        if (!(j = window.jQuery) || compareVersionNumbers(version, j.fn.jquery) || callback(j, scriptUri, absScriptUri, loaded)) {
+            var script = document.createElement("script");
+            script.type = "text/javascript";
+            script.src = "//cdnjs.cloudflare.com/ajax/libs/jquery/" + version + "/jquery.min.js";
+            script.onload = script.onreadystatechange = function () {
+                if (!loaded && (!(d = this.readyState) || d === "loaded" || d === "complete")) {
+                    callback((j = window.jQuery).noConflict(1), scriptUri, absScriptUri, loaded = true);
+                    j(script).remove();
+                }
+            };
+            document.getElementsByTagName("head")[0].appendChild(script);
+        }
+    })(window, document, "1.10.2", function ($, scriptUri, absScriptUri, jqueryLoaded) {
+
+        $.support.cors = true;
+
+        function createCookie(name, value, days) {
+            if (days) {
+                var date = new Date();
+                date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+                var expires = "; expires=" + date.toGMTString();
+            }
+            else var expires = "";
+            document.cookie = name + "=" + value + expires + "; path=/";
+        }
+
+        // get the part preceding 'lib/embed.js'
+        var baseUri = (/(.*)lib\/embed.js/).exec(scriptUri)[1];
+        appUri = baseUri + 'app.html';
+        easyXDMUri = 'https://cdnjs.cloudflare.com/ajax/libs/easyXDM/2.4.17.1/easyXDM.min.js';
+        json2Uri = 'https://cdnjs.cloudflare.com/ajax/libs/easyXDM/2.4.17.1/json2.min.js';
+
+        var a = document.createElement('a');
+        a.href = absScriptUri;
+        var domain = a.hostname;
+        window.isHomeDomain = document.domain === domain;
+
+        $.when($.getScript(easyXDMUri),
+               $.getScript(json2Uri)).done(function () {
+                   initPlayers($('.uv').not('[data-no-load*=true]'));
+               });
+
+        // find all players on a page and initialise them
+        window.initPlayers = function($players){
+            var isOnlyInstance = $players.length === 1;
+
+            for (var i = 0; i < $players.length; i++) {
+                app($players[i], isHomeDomain, isOnlyInstance);
+            }
+        }
+
+        function app(element, isHomeDomain, isOnlyInstance) {
+            var socket, $app, $img, $appFrame, manifestUri, collectionIndex, manifestIndex, sequenceIndex, canvasIndex, defaultToFullScreen, isLightbox, xywh, rotation, config, jsonp, locale, isFullScreen, dimensions, top, left, lastScroll, reload;
+
+            $app = $(element);
+
+            // Default to fullscreen
+            defaultToFullScreen = $app.attr('data-fullscreen') === 'true';
+
+            // Lightbox behaviour
+            isLightbox = $app.attr('data-lightbox') === 'true';
+
+            if(isLightbox){
+                $img = $app.find('img');
+                $img.css('cursor', 'pointer');
+                // add overflow:hidden style to container div.
+                $app.css('overflow', 'hidden');
+            } else {
+                // empty the container of any 'no javascript' messages.
+                $app.empty();
+            }
+
+            // get initial params from the container's 'data-' attributes.
+            manifestUri = $app.attr('data-uri') || "";
+            manifestUri = encodeURIComponent(manifestUri);
+            collectionIndex = $app.attr('data-collectionindex');
+            manifestIndex = $app.attr('data-manifestindex');
+            sequenceIndex = $app.attr('data-sequenceindex');
+            canvasIndex = $app.attr('data-canvasindex');
+            xywh = $app.attr('data-xywh');
+            rotation = $app.attr('data-rotation');
+            config = $app.attr('data-config');
+            jsonp = $app.attr('data-jsonp');
+            locale = $app.attr('data-locale') || "en-GB"; // todo: this should be defaulted in bootstrapper
+
+            isFullScreen = false;
+            var offset = $app.offset();
+            top = offset.top;
+            left = offset.left;
+
+            $(window).resize(function () {
+                resize();
+            });
+
+            window.onorientationchange = function () {
+                resize();
+            };
+
+            // if exiting full screen
+            $(document).on('fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', function (e) {
+                if (e.type === 'webkitfullscreenchange' && !document.webkitIsFullScreen ||
+                e.type === 'mozfullscreenchange' && !document.mozFullScreen ||
+                e.type === 'MSFullscreenChange' && document.msFullscreenElement === null) {
+                    triggerSocket('uv.onParentExitFullScreen');
+                }
+            });
+
+            createSocket();
+
+            function resize() {
+                if (!$appFrame) return;
+
+                if (isFullScreen) {
+                    var offset = getOffset();
+
+                    $appFrame.css({
+                        'top': offset.top,
+                        'left': offset.left
+                    });
+
+                    var viewport = getViewport();
+
+                    $appFrame.width(viewport.width);
+                    $appFrame.height(viewport.height);
+                } else {
+                    $appFrame.width($app.width());
+                    $appFrame.height($app.height());
+                }
+            }
+
+            function redirect(uri) {
+                // store current location in cookie.
+                createCookie('uvredirect', window.location.href);
+                window.location.replace(uri);
+            }
+
+            function refresh() {
+                window.location.reload();
+            }
+
+            function triggerSocket(eventName, eventObject) {
+                socket.postMessage(JSON.stringify({ eventName: eventName, eventObject: eventObject }));
+            }
+
+            function getDimensions() {
+                return {
+                    width: $app[0].style.width,
+                    height: $app[0].style.height
+                }
+            }
+
+            function toggleFullScreen(obj) {
+                isFullScreen = obj.isFullScreen;
+
+                if (obj.overrideFullScreen){
+                    return;
+                }
+
+                var elem = $app[0];
+
+                if (isFullScreen) {
+
+                    var requestFullScreen = getRequestFullScreen(elem);
+
+                    // if requestFullScreen is available
+                    if (requestFullScreen){
+                        dimensions = getDimensions();
+
+                        requestFullScreen.call(elem);
+                        $app.css("width", "");
+                        $app.css("height", "");
+                    } else {
+                        // use css
+
+                        // store current scroll position.
+                        lastScroll = $(document).scrollTop();
+
+                        $("html").css("overflow", "hidden");
+                        window.scrollTo(0, 0);
+
+                        var offset = getOffset();
+
+                        // todo: prevent parent from having overflow:hidden?
+
+                        $appFrame.css({
+                            'position': 'absolute',
+                            'z-index': 9999,
+                            'top': offset.top,
+                            'left': offset.left
+                        });
+                    }
+
+                } else {
+
+                    var exitFullScreen = getExitFullScreen();
+
+                    // if exitFullScreen is available
+                    if (exitFullScreen) {
+                        exitFullScreen.call(document);
+                        $app.width(dimensions.width);
+                        $app.height(dimensions.height);
+                    } else {
+                        // use css
+
+                        $("html").css("overflow", "auto");
+
+                        $appFrame.css({
+                            'position': 'static',
+                            'z-index': 'auto',
+                            'height': $app.height(),
+                            'width': '100%',
+                            'top': top,
+                            'left': left
+                        });
+
+                        // return to last scroll position.
+                        window.scrollTo(0, lastScroll);
+
+                        // if lightbox, hide iframe.
+                        if (isLightbox) hideLightbox();
+                    }
+                }
+
+                resize();
+            }
+
+            function getRequestFullScreen(elem) {
+
+                if (!isHomeDomain) return false;
+
+                if (elem.requestFullscreen) {
+                    return elem.requestFullscreen;
+                } else if (elem.msRequestFullscreen) {
+                    return elem.msRequestFullscreen;
+                } else if (elem.mozRequestFullScreen) {
+                    return elem.mozRequestFullScreen;
+                } else if (elem.webkitRequestFullscreen) {
+                    return elem.webkitRequestFullscreen;
+                }
+                return false;
+            }
+
+            function getExitFullScreen() {
+
+                if (!isHomeDomain) return false;
+
+                if (document.exitFullscreen) {
+                    return document.exitFullscreen;
+                } else if (document.msExitFullscreen) {
+                    return document.msExitFullscreen;
+                } else if (document.mozCancelFullScreen) {
+                    return document.mozCancelFullScreen;
+                } else if (document.webkitExitFullscreen) {
+                    return document.webkitExitFullscreen;
+                }
+                return false;
+            }
+
+            function getOffset() {
+
+                var offset = {
+                    top: 0,
+                    left: 0
+                };
+
+                // if $app has an offsetParent that isn't the root
+                var $offsetParent = $app.offsetParent();
+
+                if (!$offsetParent.is(':root') &&
+                    !$offsetParent.is('body')){
+                    offset.top = ($app.offset().top * -1) + $app.position().top;
+                    offset.left = ($app.offset().left * -1) + $app.position().left;
+                }
+
+                return offset;
+            }
+
+            function getViewport() {
+
+                var viewPortWidth;
+                var viewPortHeight;
+
+                // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
+                if (typeof window.innerWidth != 'undefined') {
+                    viewPortWidth = window.innerWidth;
+                    viewPortHeight = window.innerHeight;
+                }
+                // IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
+                else if (typeof document.documentElement != 'undefined'
+                    && typeof document.documentElement.clientWidth !=
+                    'undefined' && document.documentElement.clientWidth != 0) {
+                    viewPortWidth = document.documentElement.clientWidth;
+                    viewPortHeight = document.documentElement.clientHeight;
+                }
+                // older versions of IE
+                else {
+                    viewPortWidth = document.getElementsByTagName('body')[0].clientWidth;
+                    viewPortHeight = document.getElementsByTagName('body')[0].clientHeight;
+                }
+                return {width: viewPortWidth, height: viewPortHeight};
+            }
+
+            function showLightbox(){
+                $img.hide();
+                $appFrame.show();
+                triggerSocket('uv.onToggleFullScreen');
+            }
+
+            function hideLightbox(){
+                $appFrame.hide();
+                $img.show();
+            }
+
+            function createSocket() {
+
+                var uri = appUri +
+                    "?isHomeDomain=" + isHomeDomain +
+                    "&isOnlyInstance=" + isOnlyInstance +
+                    "&manifestUri=" + manifestUri +
+                    "&embedScriptUri=" + absScriptUri +
+                    "&embedDomain=" + document.domain +
+                    "&domain=" + domain +
+                    "&isLightbox=" + isLightbox +
+                    "&locale=" + locale;
+
+                if (reload) uri += "&reload=true";
+                if (config) uri += "&config=" + config;
+                if (jsonp) uri += "&jsonp=" + jsonp;
+
+                // these are values that getParam can either retrieve from the iframe querystring or parent document hash params
+                if (collectionIndex) uri += "&c=" + collectionIndex;
+                if (manifestIndex) uri += "&m=" + manifestIndex;
+                if (sequenceIndex) uri += "&s=" + sequenceIndex;
+                if (canvasIndex) uri += "&cv=" + canvasIndex;
+                if (xywh) uri += "&xywh=" + xywh;
+                if (rotation) uri += "&r=" + rotation;
+
+                socket = new easyXDM.Socket({
+                    remote: uri,
+                    container: $app.get(0),
+                    props: { style: { width: "100%", height: $app.height() + "px" }, scrolling: "no" },
+                    onReady: function () {
+                        $appFrame = $app.find('iframe');
+                        if (defaultToFullScreen) {
+                            toggleFullScreen({
+                                isFullScreen: true
+                            });
+                            triggerSocket('uv.onToggleFullScreen');
+                        }
+                        if (isLightbox) {
+                            $img.on('click', function(e){
+                                e.preventDefault();
+                                showLightbox();
+                            });
+                            $appFrame.hide();
+                        }
+                    },
+                    onMessage: function (message, origin) {
+                        message = $.parseJSON(message);
+
+                        try{
+                            jQuery(document).trigger(message.eventName, [message.eventObject]);
+                        } catch(e) {
+                            // do nothing
+                        }
+
+                        switch (message.eventName) {
+                            case "uv.onToggleFullScreen":
+                                toggleFullScreen(message.eventObject);
+                                break;
+                            case "uv.onSequenceIndexChanged":
+                                viewSequence(message.eventObject);
+                                break;
+                            case "uv.onRedirect":
+                                redirect(message.eventObject);
+                                break;
+                            case "uv.onRefresh":
+                                refresh();
+                                break;
+                            case "uv.onTrackEvent":
+                                if ("undefined" !== typeof (trackEvent)) {
+                                    trackEvent(message.eventObject.category, message.eventObject.action, message.eventObject.label, message.eventObject.value);
+                                }
+                                break;
+                            case "uv.onTrackVariable":
+                                if ("undefined" !== typeof (trackVariable)) {
+                                    trackVariable(message.eventObject.slot, message.eventObject.name, message.eventObject.value, message.eventObject.scope);
+                                }
+                                break;
+                        }
+                    }
+                });
+            }
+        }
+    });
+});
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/flashmediaelement.swf b/public/opac/js/universalviewer-2.0.2/lib/flashmediaelement.swf
new file mode 100644
index 0000000000000000000000000000000000000000..3e347aa23ba3808ecc1eb4ecf7dcc621e51e543d
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/lib/flashmediaelement.swf differ
diff --git a/public/opac/js/universalviewer-2.0.2/lib/iiif-gallery-component.js b/public/opac/js/universalviewer-2.0.2/lib/iiif-gallery-component.js
new file mode 100644
index 0000000000000000000000000000000000000000..c7a1428efcd1446ec1cd54f5446a72a9762442b1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/iiif-gallery-component.js
@@ -0,0 +1,474 @@
+// iiif-gallery-component v1.0.6 https://github.com/viewdir/iiif-gallery-component#readme
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.iiifGalleryComponent = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var IIIFComponents;
+(function (IIIFComponents) {
+    var GalleryComponent = (function (_super) {
+        __extends(GalleryComponent, _super);
+        function GalleryComponent(options) {
+            _super.call(this, options);
+            this._scrollStopDuration = 100;
+            this._init();
+            this._resize();
+        }
+        GalleryComponent.prototype._init = function () {
+            var _this = this;
+            var success = _super.prototype._init.call(this);
+            if (!success) {
+                console.error("Component failed to initialise");
+            }
+            this._$header = $('<div class="header"></div>');
+            this._$element.append(this._$header);
+            this._$leftOptions = $('<div class="left"></div>');
+            this._$header.append(this._$leftOptions);
+            this._$rightOptions = $('<div class="right"></div>');
+            this._$header.append(this._$rightOptions);
+            this._$sizeDownButton = $('<input class="btn btn-default size-down" type="button" value="-" />');
+            this._$leftOptions.append(this._$sizeDownButton);
+            this._$sizeRange = $('<input type="range" name="size" min="1" max="10" value="' + this.options.initialZoom + '" />');
+            this._$leftOptions.append(this._$sizeRange);
+            this._$sizeUpButton = $('<input class="btn btn-default size-up" type="button" value="+" />');
+            this._$leftOptions.append(this._$sizeUpButton);
+            this._$multiSelectOptions = $('<div class="multiSelectOptions"></div>');
+            this._$rightOptions.append(this._$multiSelectOptions);
+            this._$selectAllButton = $('<div class="multiSelectAll"><input id="multiSelectAll" type="checkbox" tabindex="0" /><label for="multiSelectAll">' + this.options.content.selectAll + '</label></div>');
+            this._$multiSelectOptions.append(this._$selectAllButton);
+            this._$selectAllButtonCheckbox = $(this._$selectAllButton.find('input:checkbox'));
+            this._$selectButton = $('<a class="select" href="#">' + this.options.content.select + '</a>');
+            this._$multiSelectOptions.append(this._$selectButton);
+            this._$main = $('<div class="main"></div>');
+            this._$element.append(this._$main);
+            this._$thumbs = $('<div class="thumbs"></div>');
+            this._$main.append(this._$thumbs);
+            this._$thumbs.addClass(this.options.helper.getViewingDirection().toString()); // defaults to "left-to-right"
+            this._$sizeDownButton.on('click', function () {
+                var val = Number(_this._$sizeRange.val()) - 1;
+                if (val >= Number(_this._$sizeRange.attr('min'))) {
+                    _this._$sizeRange.val(val.toString());
+                    _this._$sizeRange.trigger('change');
+                    _this._emit(GalleryComponent.Events.DECREASE_SIZE);
+                }
+            });
+            this._$sizeUpButton.on('click', function () {
+                var val = Number(_this._$sizeRange.val()) + 1;
+                if (val <= Number(_this._$sizeRange.attr('max'))) {
+                    _this._$sizeRange.val(val.toString());
+                    _this._$sizeRange.trigger('change');
+                    _this._emit(GalleryComponent.Events.INCREASE_SIZE);
+                }
+            });
+            this._$sizeRange.on('change', function () {
+                _this._updateThumbs();
+                _this._scrollToThumb(_this._getSelectedThumbIndex());
+            });
+            this._$selectAllButton.checkboxButton(function (checked) {
+                if (checked) {
+                    _this._getMultiSelectState().selectAll(true);
+                }
+                else {
+                    _this._getMultiSelectState().selectAll(false);
+                }
+                _this.databind();
+            });
+            this._$selectButton.on('click', function () {
+                var ids = _this._getMultiSelectState().getAllSelectedCanvases().map(function (canvas) {
+                    return canvas.id;
+                });
+                _this._emit(GalleryComponent.Events.MULTISELECTION_MADE, ids);
+            });
+            this._setRange();
+            $.templates({
+                galleryThumbsTemplate: '\
+                    <div class="{{:~galleryThumbClassName()}}" data-src="{{>uri}}" data-index="{{>index}}" data-visible="{{>visible}}" data-width="{{>width}}" data-height="{{>height}}" data-initialwidth="{{>initialWidth}}" data-initialheight="{{>initialHeight}}">\
+                        <div class="wrap" style="width:{{>initialWidth}}px; height:{{>initialHeight}}px" data-link="class{merge:multiSelected toggle=\'multiSelected\'}">\
+                        {^{if multiSelectEnabled}}\
+                            <input id="thumb-checkbox-{{>id}}" type="checkbox" data-link="checked{:multiSelected ? \'checked\' : \'\'}" class="multiSelect" />\
+                        {{/if}}\
+                        </div>\
+                        <div class="info">\
+                            <span class="index" style="width:{{>initialWidth}}px">{{:#index + 1}}</span>\
+                            <span class="label" style="width:{{>initialWidth}}px" title="{{>label}}">{{>label}}&nbsp;</span>\
+                            <span class="searchResults" title="{{:~galleryThumbSearchResultsTitle()}}">{{>data.searchResults}}</span>\
+                        </div>\
+                    </div>'
+            });
+            var that = this;
+            $.views.helpers({
+                galleryThumbClassName: function () {
+                    var className = "thumb preLoad";
+                    if (this.data.index === 0) {
+                        className += " first";
+                    }
+                    if (!this.data.uri) {
+                        className += " placeholder";
+                    }
+                    return className;
+                },
+                galleryThumbSearchResultsTitle: function () {
+                    var searchResults = Number(this.data.data.searchResults);
+                    if (searchResults) {
+                        if (searchResults > 1) {
+                            return String.format(that.options.content.searchResults, searchResults);
+                        }
+                        return String.format(that.options.content.searchResult, searchResults);
+                    }
+                }
+            });
+            // use unevent to detect scroll stop.
+            this._$main.on('scroll', function () {
+                _this._updateThumbs();
+            }, this.options.scrollStopDuration);
+            if (!this.options.sizingEnabled) {
+                this._$sizeRange.hide();
+            }
+            return success;
+        };
+        GalleryComponent.prototype._getDefaultOptions = function () {
+            return {
+                chunkedResizingThreshold: 400,
+                content: {
+                    searchResult: "{0} search result",
+                    searchResults: "{0} search results",
+                    select: "Select",
+                    selectAll: "Select All"
+                },
+                debug: false,
+                helper: null,
+                imageFadeInDuration: 300,
+                initialZoom: 6,
+                minLabelWidth: 20,
+                pageModeEnabled: false,
+                scrollStopDuration: 100,
+                searchResults: [],
+                sizingEnabled: true,
+                thumbHeight: 320,
+                thumbLoadPadding: 3,
+                thumbWidth: 200,
+                viewingDirection: manifesto.ViewingDirection.leftToRight()
+            };
+        };
+        GalleryComponent.prototype.databind = function () {
+            this._thumbs = this.options.helper.getThumbs(this.options.thumbWidth, this.options.thumbHeight);
+            if (this.options.viewingDirection.toString() === manifesto.ViewingDirection.bottomToTop().toString()) {
+                this._thumbs.reverse();
+            }
+            if (this.options.searchResults && this.options.searchResults.length) {
+                for (var i = 0; i < this.options.searchResults.length; i++) {
+                    var searchResult = this.options.searchResults[i];
+                    // find the thumb with the same canvasIndex and add the searchResult
+                    var thumb = this._thumbs.en().where(function (t) { return t.index === searchResult.canvasIndex; }).first();
+                    // clone the data so searchResults isn't persisted on the canvas.
+                    var data = $.extend(true, {}, thumb.data);
+                    data.searchResults = searchResult.rects.length;
+                    thumb.data = data;
+                }
+            }
+            this._thumbsCache = null; // delete cache
+            this._createThumbs();
+            this.selectIndex(this.options.helper.canvasIndex);
+            var multiSelectState = this._getMultiSelectState();
+            if (multiSelectState.isEnabled) {
+                this._$multiSelectOptions.show();
+                this._$thumbs.addClass("multiSelect");
+                for (var i = 0; i < multiSelectState.canvases.length; i++) {
+                    var canvas = multiSelectState.canvases[i];
+                    var thumb = this._getThumbByCanvas(canvas);
+                    this._setThumbMultiSelected(thumb, canvas.multiSelected);
+                }
+                // range selections override canvas selections
+                for (var i = 0; i < multiSelectState.ranges.length; i++) {
+                    var range = multiSelectState.ranges[i];
+                    var thumbs = this._getThumbsByRange(range);
+                    for (var i_1 = 0; i_1 < thumbs.length; i_1++) {
+                        var thumb = thumbs[i_1];
+                        this._setThumbMultiSelected(thumb, range.multiSelected);
+                    }
+                }
+            }
+            else {
+                this._$multiSelectOptions.hide();
+                this._$thumbs.removeClass("multiSelect");
+            }
+            this._update();
+        };
+        GalleryComponent.prototype._update = function () {
+            var multiSelectState = this._getMultiSelectState();
+            if (multiSelectState.isEnabled) {
+                // check/uncheck Select All checkbox
+                this._$selectAllButtonCheckbox.prop("checked", multiSelectState.allSelected());
+                var anySelected = multiSelectState.getAll().en().where(function (t) { return t.multiSelected; }).toArray().length > 0;
+                if (!anySelected) {
+                    this._$selectButton.hide();
+                }
+                else {
+                    this._$selectButton.show();
+                }
+            }
+        };
+        GalleryComponent.prototype._getMultiSelectState = function () {
+            return this.options.helper.getMultiSelectState();
+        };
+        GalleryComponent.prototype._createThumbs = function () {
+            var _this = this;
+            var that = this;
+            if (!this._thumbs)
+                return;
+            this._$thumbs.undelegate('.thumb', 'click');
+            this._$thumbs.empty();
+            var multiSelectState = this._getMultiSelectState();
+            // set initial thumb sizes
+            var heights = [];
+            for (var i = 0; i < this._thumbs.length; i++) {
+                var thumb = this._thumbs[i];
+                var initialWidth = thumb.width;
+                var initialHeight = thumb.height;
+                thumb.initialWidth = initialWidth;
+                //thumb.initialHeight = initialHeight;
+                heights.push(initialHeight);
+                thumb.multiSelectEnabled = multiSelectState.isEnabled;
+            }
+            var medianHeight = Math.median(heights);
+            for (var i = 0; i < this._thumbs.length; i++) {
+                var thumb = this._thumbs[i];
+                thumb.initialHeight = medianHeight;
+            }
+            this._$thumbs.link($.templates.galleryThumbsTemplate, this._thumbs);
+            if (!multiSelectState.isEnabled) {
+                // add a selection click event to all thumbs
+                this._$thumbs.delegate('.thumb', 'click', function (e) {
+                    e.preventDefault();
+                    var thumb = $.view(this).data;
+                    that._lastThumbClickedIndex = thumb.index;
+                    that._emit(GalleryComponent.Events.THUMB_SELECTED, thumb);
+                });
+            }
+            else {
+                // make each thumb a checkboxButton
+                $.each(this._$thumbs.find('.thumb'), function (index, thumb) {
+                    var that = _this;
+                    var $thumb = $(thumb);
+                    $thumb.checkboxButton(function (checked) {
+                        var thumb = $.view(this).data;
+                        that._setThumbMultiSelected(thumb, !thumb.multiSelected);
+                        var range = that.options.helper.getCanvasRange(thumb.data);
+                        var multiSelectState = that._getMultiSelectState();
+                        if (range) {
+                            multiSelectState.selectRange(range, thumb.multiSelected);
+                        }
+                        else {
+                            multiSelectState.selectCanvas(thumb.data, thumb.multiSelected);
+                        }
+                        that._update();
+                        that._emit(GalleryComponent.Events.THUMB_MULTISELECTED, thumb);
+                    });
+                });
+            }
+        };
+        GalleryComponent.prototype._getThumbByCanvas = function (canvas) {
+            return this._thumbs.en().where(function (c) { return c.data.id === canvas.id; }).first();
+        };
+        GalleryComponent.prototype._sizeThumb = function ($thumb) {
+            var initialWidth = $thumb.data().initialwidth;
+            var initialHeight = $thumb.data().initialheight;
+            var width = Number(initialWidth);
+            var height = Number(initialHeight);
+            var newWidth = Math.floor(width * this._range);
+            var newHeight = Math.floor(height * this._range);
+            var $wrap = $thumb.find('.wrap');
+            var $label = $thumb.find('.label');
+            var $index = $thumb.find('.index');
+            var $searchResults = $thumb.find('.searchResults');
+            var newLabelWidth = newWidth;
+            // if search results are visible, size index/label to accommodate it.
+            // if the resulting size is below options.minLabelWidth, hide search results.
+            if (this.options.searchResults && this.options.searchResults.length) {
+                $searchResults.show();
+                newLabelWidth = newWidth - $searchResults.outerWidth();
+                if (newLabelWidth < this.options.minLabelWidth) {
+                    $searchResults.hide();
+                    newLabelWidth = newWidth;
+                }
+                else {
+                    $searchResults.show();
+                }
+            }
+            if (this.options.pageModeEnabled) {
+                $index.hide();
+                $label.show();
+            }
+            else {
+                $index.show();
+                $label.hide();
+            }
+            $wrap.outerWidth(newWidth);
+            $wrap.outerHeight(newHeight);
+            $index.outerWidth(newLabelWidth);
+            $label.outerWidth(newLabelWidth);
+        };
+        GalleryComponent.prototype._loadThumb = function ($thumb, cb) {
+            var $wrap = $thumb.find('.wrap');
+            if ($wrap.hasClass('loading') || $wrap.hasClass('loaded'))
+                return;
+            $thumb.removeClass('preLoad');
+            // if no img has been added yet
+            var visible = $thumb.attr('data-visible');
+            var fadeDuration = this.options.imageFadeInDuration;
+            if (visible !== "false") {
+                $wrap.addClass('loading');
+                var src = $thumb.attr('data-src');
+                var $img = $('<img class="thumbImage" src="' + src + '" />');
+                // fade in on load.
+                $img.hide().load(function () {
+                    $(this).fadeIn(fadeDuration, function () {
+                        $(this).parent().swapClass('loading', 'loaded');
+                    });
+                });
+                $wrap.prepend($img);
+                if (cb)
+                    cb($img);
+            }
+            else {
+                $wrap.addClass('hidden');
+            }
+        };
+        GalleryComponent.prototype._getThumbsByRange = function (range) {
+            var thumbs = [];
+            for (var i = 0; i < this._thumbs.length; i++) {
+                var thumb = this._thumbs[i];
+                var canvas = thumb.data;
+                var r = this.options.helper.getCanvasRange(canvas, range.path);
+                if (r && r.id === range.id) {
+                    thumbs.push(thumb);
+                }
+            }
+            return thumbs;
+        };
+        GalleryComponent.prototype._updateThumbs = function () {
+            var debug = this.options.debug;
+            // cache range size
+            this._setRange();
+            var scrollTop = this._$main.scrollTop();
+            var scrollHeight = this._$main.height();
+            var scrollBottom = scrollTop + scrollHeight;
+            if (debug) {
+                console.log('scrollTop %s, scrollBottom %s', scrollTop, scrollBottom);
+            }
+            // test which thumbs are scrolled into view
+            var thumbs = this._getAllThumbs();
+            var numToUpdate = 0;
+            for (var i = 0; i < thumbs.length; i++) {
+                var $thumb = $(thumbs[i]);
+                var thumbTop = $thumb.position().top;
+                var thumbHeight = $thumb.outerHeight();
+                var thumbBottom = thumbTop + thumbHeight;
+                var padding = thumbHeight * this.options.thumbLoadPadding;
+                // check all thumbs to see if they are within the scroll area plus padding
+                if (thumbTop <= scrollBottom + padding && thumbBottom >= scrollTop - padding) {
+                    numToUpdate += 1;
+                    var $label = $thumb.find('span:visible').not('.searchResults');
+                    // if (debug) {
+                    //     $thumb.addClass('debug');
+                    //     $label.empty().append('t: ' + thumbTop + ', b: ' + thumbBottom);
+                    // } else {
+                    //     $thumb.removeClass('debug');
+                    // }
+                    this._sizeThumb($thumb);
+                    $thumb.addClass('insideScrollArea');
+                    // if (debug) {
+                    //     $label.append(', i: true');
+                    // }
+                    this._loadThumb($thumb);
+                }
+                else {
+                    $thumb.removeClass('insideScrollArea');
+                }
+            }
+            if (debug) {
+                console.log('number of thumbs to update: ' + numToUpdate);
+            }
+        };
+        GalleryComponent.prototype._getSelectedThumbIndex = function () {
+            return Number(this._$selectedThumb.data('index'));
+        };
+        GalleryComponent.prototype._getAllThumbs = function () {
+            if (!this._thumbsCache) {
+                this._thumbsCache = this._$thumbs.find('.thumb');
+            }
+            return this._thumbsCache;
+        };
+        GalleryComponent.prototype._getThumbByIndex = function (canvasIndex) {
+            return this._$thumbs.find('[data-index="' + canvasIndex + '"]');
+        };
+        GalleryComponent.prototype._scrollToThumb = function (canvasIndex) {
+            var $thumb = this._getThumbByIndex(canvasIndex);
+            this._$main.scrollTop($thumb.position().top);
+        };
+        // these don't work well because thumbs are loaded in chunks
+        // public searchPreviewStart(canvasIndex: number): void {
+        //     this._scrollToThumb(canvasIndex);
+        //     const $thumb: JQuery = this._getThumbByIndex(canvasIndex);
+        //     $thumb.addClass('searchpreview');
+        // }
+        // public searchPreviewFinish(): void {
+        //     this._scrollToThumb(this.options.helper.canvasIndex);
+        //     this._getAllThumbs().removeClass('searchpreview');
+        // }
+        GalleryComponent.prototype.selectIndex = function (index) {
+            if (!this._thumbs || !this._thumbs.length)
+                return;
+            this._getAllThumbs().removeClass('selected');
+            this._$selectedThumb = this._getThumbByIndex(index);
+            this._$selectedThumb.addClass('selected');
+            this._scrollToThumb(index);
+            // make sure visible images are loaded.
+            this._updateThumbs();
+        };
+        GalleryComponent.prototype._setRange = function () {
+            var norm = Math.normalise(Number(this._$sizeRange.val()), 0, 10);
+            this._range = Math.clamp(norm, 0.05, 1);
+        };
+        GalleryComponent.prototype._setThumbMultiSelected = function (thumb, selected) {
+            $.observable(thumb).setProperty("multiSelected", selected);
+        };
+        GalleryComponent.prototype._resize = function () {
+        };
+        return GalleryComponent;
+    }(_Components.BaseComponent));
+    IIIFComponents.GalleryComponent = GalleryComponent;
+})(IIIFComponents || (IIIFComponents = {}));
+var IIIFComponents;
+(function (IIIFComponents) {
+    var GalleryComponent;
+    (function (GalleryComponent) {
+        var Events = (function () {
+            function Events() {
+            }
+            Events.DECREASE_SIZE = 'decreaseSize';
+            Events.INCREASE_SIZE = 'increaseSize';
+            Events.MULTISELECTION_MADE = 'multiSelectionMade';
+            Events.THUMB_SELECTED = 'thumbSelected';
+            Events.THUMB_MULTISELECTED = 'thumbMultiSelected';
+            return Events;
+        }());
+        GalleryComponent.Events = Events;
+    })(GalleryComponent = IIIFComponents.GalleryComponent || (IIIFComponents.GalleryComponent = {}));
+})(IIIFComponents || (IIIFComponents = {}));
+(function (w) {
+    if (!w.IIIFComponents) {
+        w.IIIFComponents = IIIFComponents;
+    }
+    else {
+        w.IIIFComponents.GalleryComponent = IIIFComponents.GalleryComponent;
+    }
+})(window);
+
+
+
+
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/iiif-metadata-component.js b/public/opac/js/universalviewer-2.0.2/lib/iiif-metadata-component.js
new file mode 100644
index 0000000000000000000000000000000000000000..2223e4e5f786acee1b5fcf91e2573f77b570af55
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/iiif-metadata-component.js
@@ -0,0 +1,461 @@
+// iiif-metadata-component v1.0.10 https://github.com/viewdir/iiif-metadata-component#readme
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.iiifMetadataComponent = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+var IIIFComponents;
+(function (IIIFComponents) {
+    var StringValue = (function () {
+        function StringValue(value) {
+            this.value = "";
+            if (value) {
+                this.value = value.toLowerCase();
+            }
+        }
+        StringValue.prototype.toString = function () {
+            return this.value;
+        };
+        return StringValue;
+    }());
+    IIIFComponents.StringValue = StringValue;
+})(IIIFComponents || (IIIFComponents = {}));
+
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var IIIFComponents;
+(function (IIIFComponents) {
+    var MetadataComponentOptions;
+    (function (MetadataComponentOptions) {
+        var LimitType = (function (_super) {
+            __extends(LimitType, _super);
+            function LimitType() {
+                _super.apply(this, arguments);
+            }
+            LimitType.LINES = new LimitType("lines");
+            LimitType.CHARS = new LimitType("chars");
+            return LimitType;
+        }(IIIFComponents.StringValue));
+        MetadataComponentOptions.LimitType = LimitType;
+    })(MetadataComponentOptions = IIIFComponents.MetadataComponentOptions || (IIIFComponents.MetadataComponentOptions = {}));
+})(IIIFComponents || (IIIFComponents = {}));
+
+/// <reference path="./StringValue.ts" />
+/// <reference path="./LimitType.ts" /> 
+
+
+
+
+
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var MetadataGroup = Manifold.MetadataGroup;
+var IIIFComponents;
+(function (IIIFComponents) {
+    var MetadataComponent = (function (_super) {
+        __extends(MetadataComponent, _super);
+        function MetadataComponent(options) {
+            _super.call(this, options);
+            this._init();
+            this._resize();
+        }
+        MetadataComponent.prototype._init = function () {
+            var success = _super.prototype._init.call(this);
+            if (!success) {
+                console.error("Component failed to initialise");
+            }
+            this._$metadataGroupTemplate = $('<div class="group">\
+                                                   <div class="header"></div>\
+                                                   <div class="items"></div>\
+                                               </div>');
+            this._$metadataItemTemplate = $('<div class="item">\
+                                                   <div class="label"></div>\
+                                                   <div class="values"></div>\
+                                               </div>');
+            this._$metadataItemValueTemplate = $('<div class="value"></div>');
+            this._$metadataItemURIValueTemplate = $('<a class="value" href="" target="_blank"></a>');
+            this._$copyTextTemplate = $('<div class="copyText" alt="' + this.options.content.copyToClipboard + '" title="' + this.options.content.copyToClipboard + '">\
+                                                   <div class="copiedText">' + this.options.content.copiedToClipboard + ' </div>\
+                                               </div>');
+            this._$metadataGroups = $('<div class="groups"></div>');
+            this._$element.append(this._$metadataGroups);
+            this._$noData = $('<div class="noData">' + this.options.content.noData + '</div>');
+            this._$element.append(this._$noData);
+            return success;
+        };
+        MetadataComponent.prototype._getDefaultOptions = function () {
+            return {
+                aggregateValues: "",
+                canvases: null,
+                canvasDisplayOrder: "",
+                canvasExclude: "",
+                canvasLabels: "",
+                content: {
+                    attribution: "Attribution",
+                    canvasHeader: "About the canvas",
+                    copiedToClipboard: "Copied to clipboard",
+                    copyToClipboard: "Copy to clipboard",
+                    description: "Description",
+                    imageHeader: "About the image",
+                    less: "less",
+                    license: "License",
+                    logo: "Logo",
+                    manifestHeader: "About the item",
+                    more: "more",
+                    noData: "No data to display",
+                    rangeHeader: "About the range",
+                    sequenceHeader: "About the sequence"
+                },
+                copiedMessageDuration: 2000,
+                copyToClipboardEnabled: false,
+                helper: null,
+                licenseFormatter: null,
+                limit: 4,
+                limitType: IIIFComponents.MetadataComponentOptions.LimitType.LINES,
+                manifestDisplayOrder: "",
+                manifestExclude: "",
+                range: null,
+                rtlLanguageCodes: "ar, ara, dv, div, he, heb, ur, urd",
+                sanitizer: function (html) { return html; },
+                showAllLanguages: false
+            };
+        };
+        MetadataComponent.prototype._getManifestGroup = function () {
+            return this._metadataGroups.en().where(function (x) { return x.resource.isManifest(); }).first();
+        };
+        MetadataComponent.prototype._getCanvasGroups = function () {
+            return this._metadataGroups.en().where(function (x) { return x.resource.isCanvas(); }).toArray();
+        };
+        MetadataComponent.prototype.databind = function () {
+            var _this = this;
+            this._$metadataGroups.empty();
+            var options = {
+                canvases: this.options.canvases,
+                licenseFormatter: this.options.licenseFormatter,
+                range: this.options.range
+            };
+            this._metadataGroups = this.options.helper.getMetadata(options);
+            if (this.options.manifestDisplayOrder) {
+                var manifestGroup = this._getManifestGroup();
+                manifestGroup.items = this._sort(manifestGroup.items, this._readCSV(this.options.manifestDisplayOrder));
+            }
+            if (this.options.canvasDisplayOrder) {
+                var canvasGroups = this._getCanvasGroups();
+                $.each(canvasGroups, function (index, canvasGroup) {
+                    canvasGroup.items = _this._sort(canvasGroup.items, _this._readCSV(_this.options.canvasDisplayOrder));
+                });
+            }
+            if (this.options.canvasLabels) {
+                this._label(this._getCanvasGroups(), this._readCSV(this.options.canvasLabels, false));
+            }
+            if (this.options.manifestExclude) {
+                var manifestGroup = this._getManifestGroup();
+                manifestGroup.items = this._exclude(manifestGroup.items, this._readCSV(this.options.manifestExclude));
+            }
+            if (this.options.canvasExclude) {
+                var canvasGroups = this._getCanvasGroups();
+                $.each(canvasGroups, function (index, canvasGroup) {
+                    canvasGroup.items = _this._exclude(canvasGroup.items, _this._readCSV(_this.options.canvasExclude));
+                });
+            }
+            if (!this._metadataGroups.length) {
+                this._$noData.show();
+                return;
+            }
+            this._$noData.hide();
+            this._render();
+        };
+        MetadataComponent.prototype._sort = function (items, displayOrder) {
+            var _this = this;
+            var sorted = [];
+            var unsorted = items.clone();
+            $.each(displayOrder, function (index, item) {
+                var match = unsorted.en().where((function (x) { return _this._normalise(x.getLabel()) === item; })).first();
+                if (match) {
+                    sorted.push(match);
+                    unsorted.remove(match);
+                }
+            });
+            // add remaining items that were not in the displayOrder.
+            $.each(unsorted, function (index, item) {
+                sorted.push(item);
+            });
+            return sorted;
+        };
+        MetadataComponent.prototype._label = function (groups, labels) {
+            $.each(groups, function (index, group) {
+                group.label = labels[index];
+            });
+        };
+        MetadataComponent.prototype._exclude = function (items, excludeConfig) {
+            var _this = this;
+            $.each(excludeConfig, function (index, item) {
+                var match = items.en().where((function (x) { return _this._normalise(x.getLabel()) === item; })).first();
+                if (match) {
+                    items.remove(match);
+                }
+            });
+            return items;
+        };
+        // private _flatten(items: MetadataItem[]): MetadataItem[] {
+        //     // flatten metadata into array.
+        //     var flattened: MetadataItem[] = [];
+        //     $.each(items, (index: number, item: any) => {
+        //         if (Array.isArray(item.value)){
+        //             flattened = flattened.concat(<MetadataItem[]>item.value);
+        //         } else {
+        //             flattened.push(item);
+        //         }
+        //     });
+        //     return flattened;
+        // }
+        // merge any duplicate items into canvas metadata
+        // todo: needs to be more generic taking a single concatenated array
+        // private _aggregate(manifestMetadata: any[], canvasMetadata: any[]) {
+        //     if (this._aggregateValues.length) {
+        //         $.each(canvasMetadata, (index: number, canvasItem: any) => {
+        //             $.each(this._aggregateValues, (index: number, value: string) => {
+        //                 value = this._normalise(value);
+        //                 if (this._normalise(canvasItem.label) === value) {
+        //                     var manifestItem = manifestMetadata.en().where(x => this._normalise(x.label) === value).first();
+        //                     if (manifestItem) {
+        //                         canvasItem.value = manifestItem.value + canvasItem.value;
+        //                         manifestMetadata.remove(manifestItem);
+        //                     }
+        //                 }  
+        //             });
+        //         });
+        //     }
+        // }
+        MetadataComponent.prototype._normalise = function (value) {
+            if (value) {
+                return value.toLowerCase().replace(/ /g, "");
+            }
+            return null;
+        };
+        MetadataComponent.prototype._render = function () {
+            var _this = this;
+            $.each(this._metadataGroups, function (index, metadataGroup) {
+                var $metadataGroup = _this._buildMetadataGroup(metadataGroup);
+                _this._$metadataGroups.append($metadataGroup);
+                if (_this.options.limitType === IIIFComponents.MetadataComponentOptions.LimitType.LINES) {
+                    $metadataGroup.find('.value').toggleExpandTextByLines(_this.options.limit, _this.options.content.less, _this.options.content.more, function () { });
+                }
+                else if (_this.options.limitType === IIIFComponents.MetadataComponentOptions.LimitType.CHARS) {
+                    $metadataGroup.find('.value').ellipsisHtmlFixed(_this.options.limit, null);
+                }
+            });
+        };
+        MetadataComponent.prototype._buildMetadataGroup = function (metadataGroup) {
+            var $metadataGroup = this._$metadataGroupTemplate.clone();
+            var $header = $metadataGroup.find('>.header');
+            // add group header
+            if (metadataGroup.resource.isManifest() && this.options.content.manifestHeader) {
+                $header.html(this._sanitize(this.options.content.manifestHeader));
+            }
+            else if (metadataGroup.resource.isSequence() && this.options.content.sequenceHeader) {
+                $header.html(this._sanitize(this.options.content.sequenceHeader));
+            }
+            else if (metadataGroup.resource.isRange() && this.options.content.rangeHeader) {
+                $header.html(this._sanitize(this.options.content.rangeHeader));
+            }
+            else if (metadataGroup.resource.isCanvas() && (metadataGroup.label || this.options.content.canvasHeader)) {
+                var header = metadataGroup.label || this.options.content.canvasHeader;
+                $header.html(this._sanitize(header));
+            }
+            else if (metadataGroup.resource.isAnnotation() && this.options.content.imageHeader) {
+                $header.html(this._sanitize(this.options.content.imageHeader));
+            }
+            if (!$header.text()) {
+                $header.hide();
+            }
+            var $items = $metadataGroup.find('.items');
+            for (var i = 0; i < metadataGroup.items.length; i++) {
+                var item = metadataGroup.items[i];
+                var $metadataItem = this._buildMetadataItem(item);
+                $items.append($metadataItem);
+            }
+            return $metadataGroup;
+        };
+        MetadataComponent.prototype._buildMetadataItem = function (item) {
+            var $metadataItem = this._$metadataItemTemplate.clone();
+            var $label = $metadataItem.find('.label');
+            var $values = $metadataItem.find('.values');
+            var originalLabel = item.getLabel();
+            var label = originalLabel;
+            if (label && item.isRootLevel) {
+                switch (label.toLowerCase()) {
+                    case "attribution":
+                        label = this.options.content.attribution;
+                        break;
+                    case "description":
+                        label = this.options.content.description;
+                        break;
+                    case "license":
+                        label = this.options.content.license;
+                        break;
+                    case "logo":
+                        label = this.options.content.logo;
+                        break;
+                }
+            }
+            label = this._sanitize(label);
+            $label.html(label);
+            // rtl?
+            this._addReadingDirection($label, this._getItemLocale(item));
+            $metadataItem.addClass(label.toCssClass());
+            var value;
+            var $value;
+            // if the value is a URI
+            if (originalLabel && originalLabel.toLowerCase() === "license") {
+                $value = this._buildMetadataItemURIValue(item.value[0].value);
+                $values.append($value);
+            }
+            else {
+                if (this.options.showAllLanguages && item.value && item.value.length > 1) {
+                    // display all values in each locale
+                    for (var i = 0; i < item.value.length; i++) {
+                        var translation = item.value[i];
+                        $value = this._buildMetadataItemValue(translation.value, translation.locale);
+                        $values.append($value);
+                    }
+                }
+                else {
+                    var itemLocale = this._getItemLocale(item);
+                    var valueFound = false;
+                    // display all values in the item's locale
+                    for (var i = 0; i < item.value.length; i++) {
+                        var translation = item.value[i];
+                        if (itemLocale === translation.locale) {
+                            valueFound = true;
+                            $value = this._buildMetadataItemValue(translation.value, translation.locale);
+                            $values.append($value);
+                        }
+                    }
+                    // if no values were found in the current locale, default to the first.
+                    if (!valueFound) {
+                        var translation = item.value[0];
+                        if (translation) {
+                            $value = this._buildMetadataItemValue(translation.value, translation.locale);
+                            $values.append($value);
+                        }
+                    }
+                }
+            }
+            if (this.options.copyToClipboardEnabled && Utils.Clipboard.supportsCopy() && $label.text()) {
+                this._addCopyButton($metadataItem, $label, $values);
+            }
+            return $metadataItem;
+        };
+        MetadataComponent.prototype._getItemLocale = function (item) {
+            // the item's label locale takes precedence
+            return (item.label.length && item.label[0].locale) ? item.label[0].locale : item.defaultLocale || this.options.helper.options.locale;
+        };
+        MetadataComponent.prototype._buildMetadataItemValue = function (value, locale) {
+            value = this._sanitize(value);
+            value = value.replace('\n', '<br>'); // replace \n with <br>
+            var $value = this._$metadataItemValueTemplate.clone();
+            $value.html(value);
+            $value.targetBlank();
+            // rtl?
+            if (locale) {
+                this._addReadingDirection($value, locale);
+            }
+            return $value;
+        };
+        MetadataComponent.prototype._buildMetadataItemURIValue = function (value) {
+            value = this._sanitize(value);
+            var $value = this._$metadataItemURIValueTemplate.clone();
+            $value.prop('href', value);
+            $value.text(value);
+            return $value;
+        };
+        MetadataComponent.prototype._addReadingDirection = function ($elem, locale) {
+            locale = Manifesto.Utils.getInexactLocale(locale);
+            var rtlLanguages = this._readCSV(this.options.rtlLanguageCodes);
+            var match = rtlLanguages.en().where(function (x) { return x === locale; }).toArray().length > 0;
+            if (match) {
+                $elem.prop('dir', 'rtl');
+                $elem.addClass('rtl');
+            }
+        };
+        MetadataComponent.prototype._addCopyButton = function ($elem, $header, $values) {
+            var $copyBtn = this._$copyTextTemplate.clone();
+            var $copiedText = $copyBtn.children();
+            $header.append($copyBtn);
+            if (Utils.Device.isTouch()) {
+                $copyBtn.show();
+            }
+            else {
+                $elem.on('mouseenter', function () {
+                    $copyBtn.show();
+                });
+                $elem.on('mouseleave', function () {
+                    $copyBtn.hide();
+                });
+                $copyBtn.on('mouseleave', function () {
+                    $copiedText.hide();
+                });
+            }
+            var that = this;
+            var originalValue = $values.text();
+            $copyBtn.on('click', function (e) {
+                that._copyItemValues($copyBtn, originalValue);
+            });
+        };
+        MetadataComponent.prototype._copyItemValues = function ($copyButton, originalValue) {
+            Utils.Clipboard.copy(originalValue);
+            var $copiedText = $copyButton.find('.copiedText');
+            $copiedText.show();
+            setTimeout(function () {
+                $copiedText.hide();
+            }, this.options.copiedMessageDuration);
+        };
+        MetadataComponent.prototype._readCSV = function (config, normalise) {
+            if (normalise === void 0) { normalise = true; }
+            var csv = [];
+            if (config) {
+                csv = config.split(',');
+                if (normalise) {
+                    for (var i = 0; i < csv.length; i++) {
+                        csv[i] = this._normalise(csv[i]);
+                    }
+                }
+            }
+            return csv;
+        };
+        MetadataComponent.prototype._sanitize = function (html) {
+            return this.options.sanitizer(html);
+        };
+        MetadataComponent.prototype._resize = function () {
+        };
+        return MetadataComponent;
+    }(_Components.BaseComponent));
+    IIIFComponents.MetadataComponent = MetadataComponent;
+})(IIIFComponents || (IIIFComponents = {}));
+var IIIFComponents;
+(function (IIIFComponents) {
+    var MetadataComponent;
+    (function (MetadataComponent) {
+        var Events = (function () {
+            function Events() {
+            }
+            return Events;
+        }());
+        MetadataComponent.Events = Events;
+    })(MetadataComponent = IIIFComponents.MetadataComponent || (IIIFComponents.MetadataComponent = {}));
+})(IIIFComponents || (IIIFComponents = {}));
+(function (w) {
+    if (!w.IIIFComponents) {
+        w.IIIFComponents = IIIFComponents;
+    }
+    else {
+        w.IIIFComponents.MetadataComponent = IIIFComponents.MetadataComponent;
+        w.IIIFComponents.MetadataComponentOptions = IIIFComponents.MetadataComponentOptions;
+    }
+})(window);
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/iiif-tree-component.js b/public/opac/js/universalviewer-2.0.2/lib/iiif-tree-component.js
new file mode 100644
index 0000000000000000000000000000000000000000..40449ee5fca1c0f72f51fe6c9063f245d724169f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/iiif-tree-component.js
@@ -0,0 +1,294 @@
+// iiif-tree-component v1.0.7 https://github.com/viewdir/iiif-tree-component#readme
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.iiifTreeComponent = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+
+
+
+
+
+
+var __extends = (this && this.__extends) || function (d, b) {
+    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var IIIFComponents;
+(function (IIIFComponents) {
+    var TreeComponent = (function (_super) {
+        __extends(TreeComponent, _super);
+        function TreeComponent(options) {
+            _super.call(this, options);
+            this._init();
+        }
+        TreeComponent.prototype._init = function () {
+            var success = _super.prototype._init.call(this);
+            if (!success) {
+                console.error("TreeComponent failed to initialise");
+            }
+            var that = this;
+            this._$tree = $('<ul class="tree"></ul>');
+            this._$element.append(this._$tree);
+            $.templates({
+                pageTemplate: '{^{for nodes}}\
+                                {^{tree/}}\
+                            {{/for}}',
+                treeTemplate: '<li>\
+                                {^{if nodes && nodes.length}}\
+                                    <div class="toggle" data-link="class{merge:expanded toggle=\'expanded\'}"></div>\
+                                {{else}}\
+                                <div class="spacer"></div>\
+                                {{/if}}\
+                                {^{if multiSelectEnabled}}\
+                                    <input id="tree-checkbox-{{>id}}" type="checkbox" data-link="checked{:multiSelected ? \'checked\' : \'\'}" class="multiSelect" />\
+                                {{/if}}\
+                                {^{if selected}}\
+                                    <a id="tree-link-{{>id}}" href="#" title="{{>label}}" class="selected">{{>label}}</a>\
+                                {{else}}\
+                                    <a id="tree-link-{{>id}}" href="#" title="{{>label}}">{{>label}}</a>\
+                                {{/if}}\
+                            </li>\
+                            {^{if expanded}}\
+                                <li>\
+                                    <ul>\
+                                        {^{for nodes}}\
+                                            {^{tree/}}\
+                                        {{/for}}\
+                                    </ul>\
+                                </li>\
+                            {{/if}}'
+            });
+            $.views.tags({
+                tree: {
+                    toggleExpanded: function () {
+                        var node = this.data;
+                        that._setNodeExpanded(node, !node.expanded);
+                    },
+                    toggleMultiSelect: function () {
+                        var node = this.data;
+                        that._setNodeMultiSelected(node, !!!node.multiSelected);
+                        if (node.isRange()) {
+                            that._getMultiSelectState().selectRange(node.data, node.multiSelected);
+                        }
+                        that._emit(TreeComponent.Events.TREE_NODE_MULTISELECTED, node);
+                    },
+                    init: function (tagCtx, linkCtx, ctx) {
+                        this.data = tagCtx.view.data;
+                        //this.data.text = this.data.label;
+                    },
+                    onAfterLink: function () {
+                        var self = this;
+                        self.contents('li').first()
+                            .on('click', '.toggle', function () {
+                            self.toggleExpanded();
+                        }).on('click', 'a', function (e) {
+                            e.preventDefault();
+                            var node = self.data;
+                            if (node.nodes.length)
+                                self.toggleExpanded();
+                            if (node.multiSelectEnabled) {
+                                self.toggleMultiSelect();
+                            }
+                            else {
+                                if (!node.nodes.length) {
+                                    that._emit(TreeComponent.Events.TREE_NODE_SELECTED, node);
+                                    that.selectNode(node);
+                                }
+                                else if (that.options.branchNodesSelectable) {
+                                    that._emit(TreeComponent.Events.TREE_NODE_SELECTED, node);
+                                    that.selectNode(node);
+                                }
+                            }
+                        }).on('click', 'input.multiSelect', function (e) {
+                            self.toggleMultiSelect();
+                        });
+                    },
+                    template: $.templates.treeTemplate
+                }
+            });
+            return success;
+        };
+        TreeComponent.prototype.databind = function () {
+            this._rootNode = this.options.helper.getTree(this.options.topRangeIndex, this.options.treeSortType);
+            this._allNodes = null; // delete cache
+            this._multiSelectableNodes = null; // delete cache
+            this._$tree.link($.templates.pageTemplate, this._rootNode);
+        };
+        // todo: this should be removed in order to fit with the 'reactive' pattern
+        // all changes shold be a result of calling databind() with options/props. 
+        TreeComponent.prototype.updateMultiSelectState = function () {
+            var state = this._getMultiSelectState();
+            for (var i = 0; i < state.ranges.length; i++) {
+                var range = state.ranges[i];
+                var node = this._getMultiSelectableNodes().en().where(function (n) { return n.data.id === range.id; }).first();
+                if (node) {
+                    this._setNodeMultiSelectEnabled(node, range.multiSelectEnabled);
+                    this._setNodeMultiSelected(node, range.multiSelected);
+                }
+            }
+        };
+        TreeComponent.prototype._getMultiSelectState = function () {
+            return this.options.helper.getMultiSelectState();
+        };
+        TreeComponent.prototype._getDefaultOptions = function () {
+            return {
+                branchNodesSelectable: true,
+                helper: null,
+                topRangeIndex: 0,
+                treeSortType: Manifold.TreeSortType.NONE
+            };
+        };
+        TreeComponent.prototype.allNodesSelected = function () {
+            var applicableNodes = this._getMultiSelectableNodes();
+            var multiSelectedNodes = this.getMultiSelectedNodes();
+            return applicableNodes.length === multiSelectedNodes.length;
+        };
+        TreeComponent.prototype._getMultiSelectableNodes = function () {
+            var _this = this;
+            // if cached
+            if (this._multiSelectableNodes) {
+                return this._multiSelectableNodes;
+            }
+            return this._multiSelectableNodes = this._getAllNodes().en().where(function (n) { return _this._nodeIsMultiSelectable(n); }).toArray();
+        };
+        TreeComponent.prototype._nodeIsMultiSelectable = function (node) {
+            return (node.isManifest() && node.nodes.length > 0 || node.isRange());
+        };
+        TreeComponent.prototype._getAllNodes = function () {
+            // if cached
+            if (this._allNodes) {
+                return this._allNodes;
+            }
+            return this._allNodes = this._rootNode.nodes.en().traverseUnique(function (node) { return node.nodes; }).toArray();
+        };
+        TreeComponent.prototype.getMultiSelectedNodes = function () {
+            var _this = this;
+            return this._getAllNodes().en().where(function (n) { return _this._nodeIsMultiSelectable(n) && n.multiSelected; }).toArray();
+        };
+        TreeComponent.prototype.getNodeById = function (id) {
+            return this._getAllNodes().en().where(function (n) { return n.id === id; }).first();
+        };
+        TreeComponent.prototype._multiSelectTreeNode = function (node, isSelected) {
+            if (!this._nodeIsMultiSelectable(node))
+                return;
+            this._setNodeMultiSelected(node, isSelected);
+            // recursively select/deselect child nodes
+            for (var i = 0; i < node.nodes.length; i++) {
+                var n = node.nodes[i];
+                this._multiSelectTreeNode(n, isSelected);
+            }
+        };
+        // private _updateParentNodes(node: Manifold.ITreeNode): void {
+        //     var parentNode: Manifold.ITreeNode = <Manifold.ITreeNode>node.parentNode;
+        //     if (!parentNode) return;
+        //     // expand parents if selected
+        //     if (node.selected) {
+        //         this._expandParents(node);
+        //     }
+        //     // get the number of selected children.
+        //     var checkedCount: number = parentNode.nodes.en().where(n => (<Manifold.ITreeNode>n).multiSelected).count();
+        //     // if any are checked, check the parent.
+        //     this._setNodeMultiSelected(parentNode, checkedCount > 0);
+        //     var indeterminate: boolean = checkedCount > 0 && checkedCount < parentNode.nodes.length;
+        //     this._setNodeIndeterminate(parentNode, indeterminate);
+        //     // cascade up tree
+        //     this._updateParentNodes(parentNode);
+        // }
+        TreeComponent.prototype._expandParents = function (node) {
+            if (!node.parentNode)
+                return;
+            this._setNodeExpanded(node.parentNode, true);
+            this._expandParents(node.parentNode);
+        };
+        TreeComponent.prototype._setNodeSelected = function (node, selected) {
+            $.observable(node).setProperty("selected", selected);
+        };
+        TreeComponent.prototype._setNodeExpanded = function (node, expanded) {
+            $.observable(node).setProperty("expanded", expanded);
+        };
+        TreeComponent.prototype._setNodeMultiSelected = function (node, selected) {
+            $.observable(node).setProperty("multiSelected", selected);
+            // if (!selected){
+            //     this._setNodeIndeterminate(node, false);
+            // }
+        };
+        TreeComponent.prototype._setNodeMultiSelectEnabled = function (node, enabled) {
+            $.observable(node).setProperty("multiSelectEnabled", enabled);
+        };
+        // private _setNodeIndeterminate(node: Manifold.ITreeNode, indeterminate: boolean): void {
+        //     var $checkbox: JQuery = this._getNodeCheckbox(node);
+        //     $checkbox.prop("indeterminate", indeterminate);
+        // }
+        // private _getNodeCheckbox(node: Manifold.ITreeNode): JQuery {
+        //     return $("#tree-checkbox-" + node.id);
+        // }
+        // private _getNodeSiblings(node: Manifold.ITreeNode): Manifold.ITreeNode[] {
+        //     var siblings: Manifold.ITreeNode[] = [];
+        //     if (node.parentNode){
+        //         siblings = <Manifold.ITreeNode[]>node.parentNode.nodes.en().where(n => n !== node).toArray();
+        //     }
+        //     return siblings;
+        // }
+        TreeComponent.prototype.selectPath = function (path) {
+            if (!this._rootNode)
+                return;
+            var pathArr = path.split("/");
+            if (pathArr.length >= 1)
+                pathArr.shift();
+            var node = this.getNodeByPath(this._rootNode, pathArr);
+            this.selectNode(node);
+        };
+        TreeComponent.prototype.deselectCurrentNode = function () {
+            if (this._selectedNode)
+                this._setNodeSelected(this._selectedNode, false);
+        };
+        TreeComponent.prototype.selectNode = function (node) {
+            if (!this._rootNode)
+                return;
+            this.deselectCurrentNode();
+            this._selectedNode = node;
+            this._setNodeSelected(this._selectedNode, true);
+        };
+        // walks down the tree using the specified path e.g. [2,2,0]
+        TreeComponent.prototype.getNodeByPath = function (parentNode, path) {
+            if (path.length === 0)
+                return parentNode;
+            var index = path.shift();
+            var node = parentNode.nodes[index];
+            return this.getNodeByPath(node, path);
+        };
+        TreeComponent.prototype.show = function () {
+            this._$element.show();
+        };
+        TreeComponent.prototype.hide = function () {
+            this._$element.hide();
+        };
+        TreeComponent.prototype._resize = function () {
+        };
+        return TreeComponent;
+    }(_Components.BaseComponent));
+    IIIFComponents.TreeComponent = TreeComponent;
+})(IIIFComponents || (IIIFComponents = {}));
+var IIIFComponents;
+(function (IIIFComponents) {
+    var TreeComponent;
+    (function (TreeComponent) {
+        var Events = (function () {
+            function Events() {
+            }
+            Events.TREE_NODE_MULTISELECTED = 'treeNodeMultiSelected';
+            Events.TREE_NODE_SELECTED = 'treeNodeSelected';
+            return Events;
+        }());
+        TreeComponent.Events = Events;
+    })(TreeComponent = IIIFComponents.TreeComponent || (IIIFComponents.TreeComponent = {}));
+})(IIIFComponents || (IIIFComponents = {}));
+(function (w) {
+    if (!w.IIIFComponents) {
+        w.IIIFComponents = IIIFComponents;
+    }
+    else {
+        w.IIIFComponents.TreeComponent = IIIFComponents.TreeComponent;
+    }
+})(window);
+
+},{}]},{},[1])(1)
+});
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/l10n.js b/public/opac/js/universalviewer-2.0.2/lib/l10n.js
new file mode 100644
index 0000000000000000000000000000000000000000..e355dafe88d9a6ea68356a983b602bcefc39e716
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/l10n.js
@@ -0,0 +1,1007 @@
+/**
+ * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+/*
+  Additional modifications for PDF.js project:
+    - Disables language initialization on page loading;
+    - Removes consoleWarn and consoleLog and use console.log/warn directly.
+    - Removes window._ assignment.
+*/
+
+/*jshint browser: true, devel: true, globalstrict: true */
+'use strict';
+
+document.webL10n = (function(window, document, undefined) {
+  var gL10nData = {};
+  var gTextData = '';
+  var gTextProp = 'textContent';
+  var gLanguage = '';
+  var gMacros = {};
+  var gReadyState = 'loading';
+
+
+  /**
+   * Synchronously loading l10n resources significantly minimizes flickering
+   * from displaying the app with non-localized strings and then updating the
+   * strings. Although this will block all script execution on this page, we
+   * expect that the l10n resources are available locally on flash-storage.
+   *
+   * As synchronous XHR is generally considered as a bad idea, we're still
+   * loading l10n resources asynchronously -- but we keep this in a setting,
+   * just in case... and applications using this library should hide their
+   * content until the `localized' event happens.
+   */
+
+  var gAsyncResourceLoading = true; // read-only
+
+
+  /**
+   * DOM helpers for the so-called "HTML API".
+   *
+   * These functions are written for modern browsers. For old versions of IE,
+   * they're overridden in the 'startup' section at the end of this file.
+   */
+
+  function getL10nResourceLinks() {
+    return document.querySelectorAll('link[type="application/l10n"]');
+  }
+
+  function getL10nDictionary() {
+    var script = document.querySelector('script[type="application/l10n"]');
+    // TODO: support multiple and external JSON dictionaries
+    return script ? JSON.parse(script.innerHTML) : null;
+  }
+
+  function getTranslatableChildren(element) {
+    return element ? element.querySelectorAll('*[data-l10n-id]') : [];
+  }
+
+  function getL10nAttributes(element) {
+    if (!element)
+      return {};
+
+    var l10nId = element.getAttribute('data-l10n-id');
+    var l10nArgs = element.getAttribute('data-l10n-args');
+    var args = {};
+    if (l10nArgs) {
+      try {
+        args = JSON.parse(l10nArgs);
+      } catch (e) {
+        console.warn('could not parse arguments for #' + l10nId);
+      }
+    }
+    return { id: l10nId, args: args };
+  }
+
+  function fireL10nReadyEvent(lang) {
+    var evtObject = document.createEvent('Event');
+    evtObject.initEvent('localized', true, false);
+    evtObject.language = lang;
+    document.dispatchEvent(evtObject);
+  }
+
+  function xhrLoadText(url, onSuccess, onFailure, asynchronous) {
+    onSuccess = onSuccess || function _onSuccess(data) {};
+    onFailure = onFailure || function _onFailure() {
+      console.warn(url + ' not found.');
+    };
+
+    var xhr = new XMLHttpRequest();
+    xhr.open('GET', url, asynchronous);
+    if (xhr.overrideMimeType) {
+      xhr.overrideMimeType('text/plain; charset=utf-8');
+    }
+    xhr.onreadystatechange = function() {
+      if (xhr.readyState == 4) {
+        if (xhr.status == 200 || xhr.status === 0) {
+          onSuccess(xhr.responseText);
+        } else {
+          onFailure();
+        }
+      }
+    };
+    xhr.onerror = onFailure;
+    xhr.ontimeout = onFailure;
+
+    // in Firefox OS with the app:// protocol, trying to XHR a non-existing
+    // URL will raise an exception here -- hence this ugly try...catch.
+    try {
+      xhr.send(null);
+    } catch (e) {
+      onFailure();
+    }
+  }
+
+
+  /**
+   * l10n resource parser:
+   *  - reads (async XHR) the l10n resource matching `lang';
+   *  - imports linked resources (synchronously) when specified;
+   *  - parses the text data (fills `gL10nData' and `gTextData');
+   *  - triggers success/failure callbacks when done.
+   *
+   * @param {string} href
+   *    URL of the l10n resource to parse.
+   *
+   * @param {string} lang
+   *    locale (language) to parse.
+   *
+   * @param {Function} successCallback
+   *    triggered when the l10n resource has been successully parsed.
+   *
+   * @param {Function} failureCallback
+   *    triggered when the an error has occured.
+   *
+   * @return {void}
+   *    uses the following global variables: gL10nData, gTextData, gTextProp.
+   */
+
+  function parseResource(href, lang, successCallback, failureCallback) {
+    var baseURL = href.replace(/[^\/]*$/, '') || './';
+
+    // handle escaped characters (backslashes) in a string
+    function evalString(text) {
+      if (text.lastIndexOf('\\') < 0)
+        return text;
+      return text.replace(/\\\\/g, '\\')
+                 .replace(/\\n/g, '\n')
+                 .replace(/\\r/g, '\r')
+                 .replace(/\\t/g, '\t')
+                 .replace(/\\b/g, '\b')
+                 .replace(/\\f/g, '\f')
+                 .replace(/\\{/g, '{')
+                 .replace(/\\}/g, '}')
+                 .replace(/\\"/g, '"')
+                 .replace(/\\'/g, "'");
+    }
+
+    // parse *.properties text data into an l10n dictionary
+    function parseProperties(text) {
+      var dictionary = [];
+
+      // token expressions
+      var reBlank = /^\s*|\s*$/;
+      var reComment = /^\s*#|^\s*$/;
+      var reSection = /^\s*\[(.*)\]\s*$/;
+      var reImport = /^\s*@import\s+url\((.*)\)\s*$/i;
+      var reSplit = /^([^=\s]*)\s*=\s*(.+)$/; // TODO: escape EOLs with '\'
+
+      // parse the *.properties file into an associative array
+      function parseRawLines(rawText, extendedSyntax) {
+        var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
+        var currentLang = '*';
+        var genericLang = lang.replace(/-[a-z]+$/i, '');
+        var skipLang = false;
+        var match = '';
+
+        for (var i = 0; i < entries.length; i++) {
+          var line = entries[i];
+
+          // comment or blank line?
+          if (reComment.test(line))
+            continue;
+
+          // the extended syntax supports [lang] sections and @import rules
+          if (extendedSyntax) {
+            if (reSection.test(line)) { // section start?
+              match = reSection.exec(line);
+              currentLang = match[1];
+              skipLang = (currentLang !== '*') &&
+                  (currentLang !== lang) && (currentLang !== genericLang);
+              continue;
+            } else if (skipLang) {
+              continue;
+            }
+            if (reImport.test(line)) { // @import rule?
+              match = reImport.exec(line);
+              loadImport(baseURL + match[1]); // load the resource synchronously
+            }
+          }
+
+          // key-value pair
+          var tmp = line.match(reSplit);
+          if (tmp && tmp.length == 3) {
+            dictionary[tmp[1]] = evalString(tmp[2]);
+          }
+        }
+      }
+
+      // import another *.properties file
+      function loadImport(url) {
+        xhrLoadText(url, function(content) {
+          parseRawLines(content, false); // don't allow recursive imports
+        }, null, false); // load synchronously
+      }
+
+      // fill the dictionary
+      parseRawLines(text, true);
+      return dictionary;
+    }
+
+    // load and parse l10n data (warning: global variables are used here)
+    xhrLoadText(href, function(response) {
+      gTextData += response; // mostly for debug
+
+      // parse *.properties text data into an l10n dictionary
+      var data = parseProperties(response);
+
+      // find attribute descriptions, if any
+      for (var key in data) {
+        var id, prop, index = key.lastIndexOf('.');
+        if (index > 0) { // an attribute has been specified
+          id = key.substring(0, index);
+          prop = key.substr(index + 1);
+        } else { // no attribute: assuming text content by default
+          id = key;
+          prop = gTextProp;
+        }
+        if (!gL10nData[id]) {
+          gL10nData[id] = {};
+        }
+        gL10nData[id][prop] = data[key];
+      }
+
+      // trigger callback
+      if (successCallback) {
+        successCallback();
+      }
+    }, failureCallback, gAsyncResourceLoading);
+  }
+
+  // load and parse all resources for the specified locale
+  function loadLocale(lang, callback) {
+    console.log("load locale");
+    callback = callback || function _callback() {};
+
+    clear();
+    gLanguage = lang;
+
+    // check all <link type="application/l10n" href="..." /> nodes
+    // and load the resource files
+    var langLinks = getL10nResourceLinks();
+    var langCount = langLinks.length;
+    if (langCount === 0) {
+      // we might have a pre-compiled dictionary instead
+      var dict = getL10nDictionary();
+      if (dict && dict.locales && dict.default_locale) {
+        console.log('using the embedded JSON directory, early way out');
+        gL10nData = dict.locales[lang] || dict.locales[dict.default_locale];
+        callback();
+      } else {
+        console.log('no resource to load, early way out');
+      }
+      // early way out
+      fireL10nReadyEvent(lang);
+      gReadyState = 'complete';
+      return;
+    }
+
+    // start the callback when all resources are loaded
+    var onResourceLoaded = null;
+    var gResourceCount = 0;
+    onResourceLoaded = function() {
+      gResourceCount++;
+      if (gResourceCount >= langCount) {
+        callback();
+        fireL10nReadyEvent(lang);
+        gReadyState = 'complete';
+      }
+    };
+
+    // load all resource files
+    function L10nResourceLink(link) {
+      var href = link.href;
+      var type = link.type;
+      this.load = function(lang, callback) {
+        var applied = lang;
+        parseResource(href, lang, callback, function() {
+          console.warn(href + ' not found.');
+          applied = '';
+        });
+        return applied; // return lang if found, an empty string if not found
+      };
+    }
+
+    for (var i = 0; i < langCount; i++) {
+      var resource = new L10nResourceLink(langLinks[i]);
+      var rv = resource.load(lang, onResourceLoaded);
+      if (rv != lang) { // lang not found, used default resource instead
+        console.warn('"' + lang + '" resource not found');
+        gLanguage = '';
+      }
+    }
+  }
+
+  // clear all l10n data
+  function clear() {
+    gL10nData = {};
+    gTextData = '';
+    gLanguage = '';
+    // TODO: clear all non predefined macros.
+    // There's no such macro /yet/ but we're planning to have some...
+  }
+
+
+  /**
+   * Get rules for plural forms (shared with JetPack), see:
+   * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+   * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p
+   *
+   * @param {string} lang
+   *    locale (language) used.
+   *
+   * @return {Function}
+   *    returns a function that gives the plural form name for a given integer:
+   *       var fun = getPluralRules('en');
+   *       fun(1)    -> 'one'
+   *       fun(0)    -> 'other'
+   *       fun(1000) -> 'other'.
+   */
+
+  function getPluralRules(lang) {
+    var locales2rules = {
+      'af': 3,
+      'ak': 4,
+      'am': 4,
+      'ar': 1,
+      'asa': 3,
+      'az': 0,
+      'be': 11,
+      'bem': 3,
+      'bez': 3,
+      'bg': 3,
+      'bh': 4,
+      'bm': 0,
+      'bn': 3,
+      'bo': 0,
+      'br': 20,
+      'brx': 3,
+      'bs': 11,
+      'ca': 3,
+      'cgg': 3,
+      'chr': 3,
+      'cs': 12,
+      'cy': 17,
+      'da': 3,
+      'de': 3,
+      'dv': 3,
+      'dz': 0,
+      'ee': 3,
+      'el': 3,
+      'en': 3,
+      'eo': 3,
+      'es': 3,
+      'et': 3,
+      'eu': 3,
+      'fa': 0,
+      'ff': 5,
+      'fi': 3,
+      'fil': 4,
+      'fo': 3,
+      'fr': 5,
+      'fur': 3,
+      'fy': 3,
+      'ga': 8,
+      'gd': 24,
+      'gl': 3,
+      'gsw': 3,
+      'gu': 3,
+      'guw': 4,
+      'gv': 23,
+      'ha': 3,
+      'haw': 3,
+      'he': 2,
+      'hi': 4,
+      'hr': 11,
+      'hu': 0,
+      'id': 0,
+      'ig': 0,
+      'ii': 0,
+      'is': 3,
+      'it': 3,
+      'iu': 7,
+      'ja': 0,
+      'jmc': 3,
+      'jv': 0,
+      'ka': 0,
+      'kab': 5,
+      'kaj': 3,
+      'kcg': 3,
+      'kde': 0,
+      'kea': 0,
+      'kk': 3,
+      'kl': 3,
+      'km': 0,
+      'kn': 0,
+      'ko': 0,
+      'ksb': 3,
+      'ksh': 21,
+      'ku': 3,
+      'kw': 7,
+      'lag': 18,
+      'lb': 3,
+      'lg': 3,
+      'ln': 4,
+      'lo': 0,
+      'lt': 10,
+      'lv': 6,
+      'mas': 3,
+      'mg': 4,
+      'mk': 16,
+      'ml': 3,
+      'mn': 3,
+      'mo': 9,
+      'mr': 3,
+      'ms': 0,
+      'mt': 15,
+      'my': 0,
+      'nah': 3,
+      'naq': 7,
+      'nb': 3,
+      'nd': 3,
+      'ne': 3,
+      'nl': 3,
+      'nn': 3,
+      'no': 3,
+      'nr': 3,
+      'nso': 4,
+      'ny': 3,
+      'nyn': 3,
+      'om': 3,
+      'or': 3,
+      'pa': 3,
+      'pap': 3,
+      'pl': 13,
+      'ps': 3,
+      'pt': 3,
+      'rm': 3,
+      'ro': 9,
+      'rof': 3,
+      'ru': 11,
+      'rwk': 3,
+      'sah': 0,
+      'saq': 3,
+      'se': 7,
+      'seh': 3,
+      'ses': 0,
+      'sg': 0,
+      'sh': 11,
+      'shi': 19,
+      'sk': 12,
+      'sl': 14,
+      'sma': 7,
+      'smi': 7,
+      'smj': 7,
+      'smn': 7,
+      'sms': 7,
+      'sn': 3,
+      'so': 3,
+      'sq': 3,
+      'sr': 11,
+      'ss': 3,
+      'ssy': 3,
+      'st': 3,
+      'sv': 3,
+      'sw': 3,
+      'syr': 3,
+      'ta': 3,
+      'te': 3,
+      'teo': 3,
+      'th': 0,
+      'ti': 4,
+      'tig': 3,
+      'tk': 3,
+      'tl': 4,
+      'tn': 3,
+      'to': 0,
+      'tr': 0,
+      'ts': 3,
+      'tzm': 22,
+      'uk': 11,
+      'ur': 3,
+      've': 3,
+      'vi': 0,
+      'vun': 3,
+      'wa': 4,
+      'wae': 3,
+      'wo': 0,
+      'xh': 3,
+      'xog': 3,
+      'yo': 0,
+      'zh': 0,
+      'zu': 3
+    };
+
+    // utility functions for plural rules methods
+    function isIn(n, list) {
+      return list.indexOf(n) !== -1;
+    }
+    function isBetween(n, start, end) {
+      return start <= n && n <= end;
+    }
+
+    // list of all plural rules methods:
+    // map an integer to the plural form name to use
+    var pluralRules = {
+      '0': function(n) {
+        return 'other';
+      },
+      '1': function(n) {
+        if ((isBetween((n % 100), 3, 10)))
+          return 'few';
+        if (n === 0)
+          return 'zero';
+        if ((isBetween((n % 100), 11, 99)))
+          return 'many';
+        if (n == 2)
+          return 'two';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '2': function(n) {
+        if (n !== 0 && (n % 10) === 0)
+          return 'many';
+        if (n == 2)
+          return 'two';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '3': function(n) {
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '4': function(n) {
+        if ((isBetween(n, 0, 1)))
+          return 'one';
+        return 'other';
+      },
+      '5': function(n) {
+        if ((isBetween(n, 0, 2)) && n != 2)
+          return 'one';
+        return 'other';
+      },
+      '6': function(n) {
+        if (n === 0)
+          return 'zero';
+        if ((n % 10) == 1 && (n % 100) != 11)
+          return 'one';
+        return 'other';
+      },
+      '7': function(n) {
+        if (n == 2)
+          return 'two';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '8': function(n) {
+        if ((isBetween(n, 3, 6)))
+          return 'few';
+        if ((isBetween(n, 7, 10)))
+          return 'many';
+        if (n == 2)
+          return 'two';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '9': function(n) {
+        if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))
+          return 'few';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '10': function(n) {
+        if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))
+          return 'few';
+        if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))
+          return 'one';
+        return 'other';
+      },
+      '11': function(n) {
+        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
+          return 'few';
+        if ((n % 10) === 0 ||
+            (isBetween((n % 10), 5, 9)) ||
+            (isBetween((n % 100), 11, 14)))
+          return 'many';
+        if ((n % 10) == 1 && (n % 100) != 11)
+          return 'one';
+        return 'other';
+      },
+      '12': function(n) {
+        if ((isBetween(n, 2, 4)))
+          return 'few';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '13': function(n) {
+        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
+          return 'few';
+        if (n != 1 && (isBetween((n % 10), 0, 1)) ||
+            (isBetween((n % 10), 5, 9)) ||
+            (isBetween((n % 100), 12, 14)))
+          return 'many';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '14': function(n) {
+        if ((isBetween((n % 100), 3, 4)))
+          return 'few';
+        if ((n % 100) == 2)
+          return 'two';
+        if ((n % 100) == 1)
+          return 'one';
+        return 'other';
+      },
+      '15': function(n) {
+        if (n === 0 || (isBetween((n % 100), 2, 10)))
+          return 'few';
+        if ((isBetween((n % 100), 11, 19)))
+          return 'many';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '16': function(n) {
+        if ((n % 10) == 1 && n != 11)
+          return 'one';
+        return 'other';
+      },
+      '17': function(n) {
+        if (n == 3)
+          return 'few';
+        if (n === 0)
+          return 'zero';
+        if (n == 6)
+          return 'many';
+        if (n == 2)
+          return 'two';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '18': function(n) {
+        if (n === 0)
+          return 'zero';
+        if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)
+          return 'one';
+        return 'other';
+      },
+      '19': function(n) {
+        if ((isBetween(n, 2, 10)))
+          return 'few';
+        if ((isBetween(n, 0, 1)))
+          return 'one';
+        return 'other';
+      },
+      '20': function(n) {
+        if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(
+            isBetween((n % 100), 10, 19) ||
+            isBetween((n % 100), 70, 79) ||
+            isBetween((n % 100), 90, 99)
+            ))
+          return 'few';
+        if ((n % 1000000) === 0 && n !== 0)
+          return 'many';
+        if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))
+          return 'two';
+        if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))
+          return 'one';
+        return 'other';
+      },
+      '21': function(n) {
+        if (n === 0)
+          return 'zero';
+        if (n == 1)
+          return 'one';
+        return 'other';
+      },
+      '22': function(n) {
+        if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))
+          return 'one';
+        return 'other';
+      },
+      '23': function(n) {
+        if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)
+          return 'one';
+        return 'other';
+      },
+      '24': function(n) {
+        if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))
+          return 'few';
+        if (isIn(n, [2, 12]))
+          return 'two';
+        if (isIn(n, [1, 11]))
+          return 'one';
+        return 'other';
+      }
+    };
+
+    // return a function that gives the plural form name for a given integer
+    var index = locales2rules[lang.replace(/-.*$/, '')];
+    if (!(index in pluralRules)) {
+      console.warn('plural form unknown for [' + lang + ']');
+      return function() { return 'other'; };
+    }
+    return pluralRules[index];
+  }
+
+  // pre-defined 'plural' macro
+  gMacros.plural = function(str, param, key, prop) {
+    var n = parseFloat(param);
+    if (isNaN(n))
+      return str;
+
+    // TODO: support other properties (l20n still doesn't...)
+    if (prop != gTextProp)
+      return str;
+
+    // initialize _pluralRules
+    if (!gMacros._pluralRules) {
+      gMacros._pluralRules = getPluralRules(gLanguage);
+    }
+    var index = '[' + gMacros._pluralRules(n) + ']';
+
+    // try to find a [zero|one|two] key if it's defined
+    if (n === 0 && (key + '[zero]') in gL10nData) {
+      str = gL10nData[key + '[zero]'][prop];
+    } else if (n == 1 && (key + '[one]') in gL10nData) {
+      str = gL10nData[key + '[one]'][prop];
+    } else if (n == 2 && (key + '[two]') in gL10nData) {
+      str = gL10nData[key + '[two]'][prop];
+    } else if ((key + index) in gL10nData) {
+      str = gL10nData[key + index][prop];
+    } else if ((key + '[other]') in gL10nData) {
+      str = gL10nData[key + '[other]'][prop];
+    }
+
+    return str;
+  };
+
+
+  /**
+   * l10n dictionary functions
+   */
+
+  // fetch an l10n object, warn if not found, apply `args' if possible
+  function getL10nData(key, args, fallback) {
+    var data = gL10nData[key];
+    if (!data) {
+      console.warn('#' + key + ' is undefined.');
+      if (!fallback) {
+        return null;
+      }
+      data = fallback;
+    }
+
+    /** This is where l10n expressions should be processed.
+      * The plan is to support C-style expressions from the l20n project;
+      * until then, only two kinds of simple expressions are supported:
+      *   {[ index ]} and {{ arguments }}.
+      */
+    var rv = {};
+    for (var prop in data) {
+      var str = data[prop];
+      str = substIndexes(str, args, key, prop);
+      str = substArguments(str, args, key);
+      rv[prop] = str;
+    }
+    return rv;
+  }
+
+  // replace {[macros]} with their values
+  function substIndexes(str, args, key, prop) {
+    var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/;
+    var reMatch = reIndex.exec(str);
+    if (!reMatch || !reMatch.length)
+      return str;
+
+    // an index/macro has been found
+    // Note: at the moment, only one parameter is supported
+    var macroName = reMatch[1];
+    var paramName = reMatch[2];
+    var param;
+    if (args && paramName in args) {
+      param = args[paramName];
+    } else if (paramName in gL10nData) {
+      param = gL10nData[paramName];
+    }
+
+    // there's no macro parser yet: it has to be defined in gMacros
+    if (macroName in gMacros) {
+      var macro = gMacros[macroName];
+      str = macro(str, param, key, prop);
+    }
+    return str;
+  }
+
+  // replace {{arguments}} with their values
+  function substArguments(str, args, key) {
+    var reArgs = /\{\{\s*(.+?)\s*\}\}/;
+    var match = reArgs.exec(str);
+    while (match) {
+      if (!match || match.length < 2)
+        return str; // argument key not found
+
+      var arg = match[1];
+      var sub = '';
+      if (args && arg in args) {
+        sub = args[arg];
+      } else if (arg in gL10nData) {
+        sub = gL10nData[arg][gTextProp];
+      } else {
+        console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');
+        return str;
+      }
+
+      str = str.substring(0, match.index) + sub +
+            str.substr(match.index + match[0].length);
+      match = reArgs.exec(str);
+    }
+    return str;
+  }
+
+  // translate an HTML element
+  function translateElement(element) {
+    var l10n = getL10nAttributes(element);
+    if (!l10n.id)
+      return;
+
+    // get the related l10n object
+    var data = getL10nData(l10n.id, l10n.args);
+    if (!data) {
+      console.warn('#' + l10n.id + ' is undefined.');
+      return;
+    }
+
+    // translate element (TODO: security checks?)
+    if (data[gTextProp]) { // XXX
+      if (getChildElementCount(element) === 0) {
+        element[gTextProp] = data[gTextProp];
+      } else {
+        // this element has element children: replace the content of the first
+        // (non-empty) child textNode and clear other child textNodes
+        var children = element.childNodes;
+        var found = false;
+        for (var i = 0, l = children.length; i < l; i++) {
+          if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) {
+            if (found) {
+              children[i].nodeValue = '';
+            } else {
+              children[i].nodeValue = data[gTextProp];
+              found = true;
+            }
+          }
+        }
+        // if no (non-empty) textNode is found, insert a textNode before the
+        // first element child.
+        if (!found) {
+          var textNode = document.createTextNode(data[gTextProp]);
+          element.insertBefore(textNode, element.firstChild);
+        }
+      }
+      delete data[gTextProp];
+    }
+
+    for (var k in data) {
+      element[k] = data[k];
+    }
+  }
+
+  // webkit browsers don't currently support 'children' on SVG elements...
+  function getChildElementCount(element) {
+    if (element.children) {
+      return element.children.length;
+    }
+    if (typeof element.childElementCount !== 'undefined') {
+      return element.childElementCount;
+    }
+    var count = 0;
+    for (var i = 0; i < element.childNodes.length; i++) {
+      count += element.nodeType === 1 ? 1 : 0;
+    }
+    return count;
+  }
+
+  // translate an HTML subtree
+  function translateFragment(element) {
+    element = element || document.documentElement;
+
+    // check all translatable children (= w/ a `data-l10n-id' attribute)
+    var children = getTranslatableChildren(element);
+    var elementCount = children.length;
+    for (var i = 0; i < elementCount; i++) {
+      translateElement(children[i]);
+    }
+
+    // translate element itself if necessary
+    translateElement(element);
+  }
+
+  // cross-browser API (sorry, oldIE doesn't support getters & setters)
+  return {
+    // get a localized string
+    get: function(key, args, fallbackString) {
+      var index = key.lastIndexOf('.');
+      var prop = gTextProp;
+      if (index > 0) { // An attribute has been specified
+        prop = key.substr(index + 1);
+        key = key.substring(0, index);
+      }
+      var fallback;
+      if (fallbackString) {
+        fallback = {};
+        fallback[prop] = fallbackString;
+      }
+      var data = getL10nData(key, args, fallback);
+      if (data && prop in data) {
+        return data[prop];
+      }
+      return '{{' + key + '}}';
+    },
+
+    // debug
+    getData: function() { return gL10nData; },
+    getText: function() { return gTextData; },
+
+    // get|set the document language
+    getLanguage: function() { return gLanguage; },
+    setLanguage: function(lang) {
+      loadLocale(lang, translateFragment);
+    },
+
+    // get the direction (ltr|rtl) of the current language
+    getDirection: function() {
+      // http://www.w3.org/International/questions/qa-scripts
+      // Arabic, Hebrew, Farsi, Pashto, Urdu
+      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
+      return (rtlList.indexOf(gLanguage) >= 0) ? 'rtl' : 'ltr';
+    },
+
+    // translate an element or document fragment
+    translate: translateFragment,
+
+    // this can be used to prevent race conditions
+    getReadyState: function() { return gReadyState; },
+    ready: function(callback) {
+      if (!callback) {
+        return;
+      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {
+        window.setTimeout(callback);
+      } else if (document.addEventListener) {
+        document.addEventListener('localized', callback);
+      } else if (document.attachEvent) {
+        document.documentElement.attachEvent('onpropertychange', function(e) {
+          if (e.propertyName === 'localized') {
+            callback();
+          }
+        });
+      }
+    }
+  };
+}) (window, document);
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/mediaelement-and-player.js b/public/opac/js/universalviewer-2.0.2/lib/mediaelement-and-player.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe5c2e5427170681a1da4e6f2beebc43319cbd2f
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/mediaelement-and-player.js
@@ -0,0 +1,4288 @@
+/*!
+* MediaElement.js
+* HTML5 <video> and <audio> shim and player
+* http://mediaelementjs.com/
+*
+* Creates a JavaScript object that mimics HTML5 MediaElement API
+* for browsers that don't understand HTML5 or can't play the provided codec
+* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
+*
+* Copyright 2010-2012, John Dyer (http://j.hn)
+* Dual licensed under the MIT or GPL Version 2 licenses.
+*
+*/
+// Namespace
+var mejs = mejs || {};
+
+// version number
+mejs.version = '2.8.2';
+
+// player number (for missing, same id attr)
+mejs.meIndex = 0;
+
+// media types accepted by plugins
+mejs.plugins = {
+	silverlight: [
+		{version: [3,0], types: ['video/mp4','video/m4v','video/mov','video/wmv','audio/wma','audio/m4a','audio/mp3','audio/wav','audio/mpeg']}
+	],
+	flash: [
+		{version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a','audio/mpeg', 'video/youtube', 'video/x-youtube']}
+		//,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!)
+	],
+	youtube: [
+		{version: null, types: ['video/youtube', 'video/x-youtube']}
+	],
+	vimeo: [
+		{version: null, types: ['video/vimeo']}
+	]
+};
+
+/*
+Utility methods
+*/
+mejs.Utility = {
+	encodeUrl: function(url) {
+		return encodeURIComponent(url); //.replace(/\?/gi,'%3F').replace(/=/gi,'%3D').replace(/&/gi,'%26');
+	},
+	escapeHTML: function(s) {
+		return s.toString().split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
+	},
+	absolutizeUrl: function(url) {
+		var el = document.createElement('div');
+		el.innerHTML = '<a href="' + this.escapeHTML(url) + '">x</a>';
+		return el.firstChild.href;
+	},
+	getScriptPath: function(scriptNames) {
+		var
+			i = 0,
+			j,
+			path = '',
+			name = '',
+			script,
+			scripts = document.getElementsByTagName('script'),
+			il = scripts.length,
+			jl = scriptNames.length;
+
+		for (; i < il; i++) {
+			script = scripts[i].src;
+			for (j = 0; j < jl; j++) {
+				name = scriptNames[j];
+				if (script.indexOf(name) > -1) {
+					path = script.substring(0, script.indexOf(name));
+					break;
+				}
+			}
+			if (path !== '') {
+				break;
+			}
+		}
+		return path;
+	},
+	secondsToTimeCode: function(time, forceHours, showFrameCount, fps) {
+		//add framecount
+		if (typeof showFrameCount == 'undefined') {
+		    showFrameCount=false;
+		} else if(typeof fps == 'undefined') {
+		    fps = 25;
+		}
+
+		var hours = Math.floor(time / 3600) % 24,
+			minutes = Math.floor(time / 60) % 60,
+			seconds = Math.floor(time % 60),
+			frames = Math.floor(((time % 1)*fps).toFixed(3)),
+			result =
+					( (forceHours || hours > 0) ? (hours < 10 ? '0' + hours : hours) + ':' : '')
+						+ (minutes < 10 ? '0' + minutes : minutes) + ':'
+						+ (seconds < 10 ? '0' + seconds : seconds)
+						+ ((showFrameCount) ? ':' + (frames < 10 ? '0' + frames : frames) : '');
+
+		return result;
+	},
+
+	timeCodeToSeconds: function(hh_mm_ss_ff, forceHours, showFrameCount, fps){
+		if (typeof showFrameCount == 'undefined') {
+		    showFrameCount=false;
+		} else if(typeof fps == 'undefined') {
+		    fps = 25;
+		}
+
+		var tc_array = hh_mm_ss_ff.split(":"),
+			tc_hh = parseInt(tc_array[0], 10),
+			tc_mm = parseInt(tc_array[1], 10),
+			tc_ss = parseInt(tc_array[2], 10),
+			tc_ff = 0,
+			tc_in_seconds = 0;
+
+		if (showFrameCount) {
+		    tc_ff = parseInt(tc_array[3])/fps;
+		}
+
+		tc_in_seconds = ( tc_hh * 3600 ) + ( tc_mm * 60 ) + tc_ss + tc_ff;
+
+		return tc_in_seconds;
+	},
+
+	/* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */
+	removeSwf: function(id) {
+		var obj = document.getElementById(id);
+		if (obj && obj.nodeName == "OBJECT") {
+			if (mejs.MediaFeatures.isIE) {
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						mejs.Utility.removeObjectInIE(id);
+					} else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			} else {
+				obj.parentNode.removeChild(obj);
+			}
+		}
+	},
+	removeObjectInIE: function(id) {
+		var obj = document.getElementById(id);
+		if (obj) {
+			for (var i in obj) {
+				if (typeof obj[i] == "function") {
+					obj[i] = null;
+				}
+			}
+			obj.parentNode.removeChild(obj);
+		}
+	}
+};
+
+
+// Core detector, plugins are added below
+mejs.PluginDetector = {
+
+	// main public function to test a plug version number PluginDetector.hasPluginVersion('flash',[9,0,125]);
+	hasPluginVersion: function(plugin, v) {
+		var pv = this.plugins[plugin];
+		v[1] = v[1] || 0;
+		v[2] = v[2] || 0;
+		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+	},
+
+	// cached values
+	nav: window.navigator,
+	ua: window.navigator.userAgent.toLowerCase(),
+
+	// stored version numbers
+	plugins: [],
+
+	// runs detectPlugin() and stores the version number
+	addPlugin: function(p, pluginName, mimeType, activeX, axDetect) {
+		this.plugins[p] = this.detectPlugin(pluginName, mimeType, activeX, axDetect);
+	},
+
+	// get the version number from the mimetype (all but IE) or ActiveX (IE)
+	detectPlugin: function(pluginName, mimeType, activeX, axDetect) {
+
+		var version = [0,0,0],
+			description,
+			i,
+			ax;
+
+		// Firefox, Webkit, Opera
+		if (typeof(this.nav.plugins) != 'undefined' && typeof this.nav.plugins[pluginName] == 'object') {
+			description = this.nav.plugins[pluginName].description;
+			if (description && !(typeof this.nav.mimeTypes != 'undefined' && this.nav.mimeTypes[mimeType] && !this.nav.mimeTypes[mimeType].enabledPlugin)) {
+				version = description.replace(pluginName, '').replace(/^\s+/,'').replace(/\sr/gi,'.').split('.');
+				for (i=0; i<version.length; i++) {
+					version[i] = parseInt(version[i].match(/\d+/), 10);
+				}
+			}
+		// Internet Explorer / ActiveX
+		} else if (typeof(window.ActiveXObject) != 'undefined') {
+			try {
+				ax = new ActiveXObject(activeX);
+				if (ax) {
+					version = axDetect(ax);
+				}
+			}
+			catch (e) { }
+		}
+		return version;
+	}
+};
+
+// Add Flash detection
+mejs.PluginDetector.addPlugin('flash','Shockwave Flash','application/x-shockwave-flash','ShockwaveFlash.ShockwaveFlash', function(ax) {
+	// adapted from SWFObject
+	var version = [],
+		d = ax.GetVariable("$version");
+	if (d) {
+		d = d.split(" ")[1].split(",");
+		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+	}
+	return version;
+});
+
+// Add Silverlight detection
+mejs.PluginDetector.addPlugin('silverlight','Silverlight Plug-In','application/x-silverlight-2','AgControl.AgControl', function (ax) {
+	// Silverlight cannot report its version number to IE
+	// but it does have a isVersionSupported function, so we have to loop through it to get a version number.
+	// adapted from http://www.silverlightversion.com/
+	var v = [0,0,0,0],
+		loopMatch = function(ax, v, i, n) {
+			while(ax.isVersionSupported(v[0]+ "."+ v[1] + "." + v[2] + "." + v[3])){
+				v[i]+=n;
+			}
+			v[i] -= n;
+		};
+	loopMatch(ax, v, 0, 1);
+	loopMatch(ax, v, 1, 1);
+	loopMatch(ax, v, 2, 10000); // the third place in the version number is usually 5 digits (4.0.xxxxx)
+	loopMatch(ax, v, 2, 1000);
+	loopMatch(ax, v, 2, 100);
+	loopMatch(ax, v, 2, 10);
+	loopMatch(ax, v, 2, 1);
+	loopMatch(ax, v, 3, 1);
+
+	return v;
+});
+// add adobe acrobat
+/*
+PluginDetector.addPlugin('acrobat','Adobe Acrobat','application/pdf','AcroPDF.PDF', function (ax) {
+	var version = [],
+		d = ax.GetVersions().split(',')[0].split('=')[1].split('.');
+
+	if (d) {
+		version = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+	}
+	return version;
+});
+*/
+// necessary detection (fixes for <IE9)
+mejs.MediaFeatures = {
+	init: function() {
+		var
+			t = this,
+			d = document,
+			nav = mejs.PluginDetector.nav,
+			ua = mejs.PluginDetector.ua.toLowerCase(),
+			i,
+			v,
+			html5Elements = ['source','track','audio','video'];
+
+		// detect browsers (only the ones that have some kind of quirk we need to work around)
+		t.isiPad = (ua.match(/ipad/i) !== null);
+		t.isiPhone = (ua.match(/iphone/i) !== null);
+		t.isiOS = t.isiPhone || t.isiPad;
+		t.isAndroid = (ua.match(/android/i) !== null);
+		t.isBustedAndroid = (ua.match(/android 2\.[12]/) !== null);
+		t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1);
+		t.isChrome = (ua.match(/chrome/gi) !== null);
+		t.isFirefox = (ua.match(/firefox/gi) !== null);
+		t.isWebkit = (ua.match(/webkit/gi) !== null);
+		t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit;
+		t.isOpera = (ua.match(/opera/gi) !== null);
+		t.hasTouch = ('ontouchstart' in window);
+
+		// create HTML5 media elements for IE before 9, get a <video> element for fullscreen detection
+		for (i=0; i<html5Elements.length; i++) {
+			v = document.createElement(html5Elements[i]);
+		}
+
+		t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid);
+
+		// detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails)
+
+		// iOS
+		t.hasSemiNativeFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined');
+
+		// Webkit/firefox
+		t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined');
+		t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined');
+
+		t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen);
+		t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen;
+		if (t.hasMozNativeFullScreen) {
+			t.nativeFullScreenEnabled = v.mozFullScreenEnabled;
+		}
+
+
+		if (this.isChrome) {
+			t.hasSemiNativeFullScreen = false;
+		}
+
+		if (t.hasTrueNativeFullScreen) {
+			t.fullScreenEventName = (t.hasWebkitNativeFullScreen) ? 'webkitfullscreenchange' : 'mozfullscreenchange';
+
+
+			t.isFullScreen = function() {
+				if (v.mozRequestFullScreen) {
+					return d.mozFullScreen;
+				} else if (v.webkitRequestFullScreen) {
+					return d.webkitIsFullScreen;
+				}
+			}
+
+			t.requestFullScreen = function(el) {
+
+				if (t.hasWebkitNativeFullScreen) {
+					el.webkitRequestFullScreen();
+				} else if (t.hasMozNativeFullScreen) {
+					el.mozRequestFullScreen();
+				}
+			}
+
+			t.cancelFullScreen = function() {
+				if (t.hasWebkitNativeFullScreen) {
+					document.webkitCancelFullScreen();
+				} else if (t.hasMozNativeFullScreen) {
+					document.mozCancelFullScreen();
+				}
+			}
+
+		}
+
+
+		// OS X 10.5 can't do this even if it says it can :(
+		if (t.hasSemiNativeFullScreen && ua.match(/mac os x 10_5/i)) {
+			t.hasNativeFullScreen = false;
+			t.hasSemiNativeFullScreen = false;
+		}
+
+	}
+};
+mejs.MediaFeatures.init();
+
+
+/*
+extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below)
+*/
+mejs.HtmlMediaElement = {
+	pluginType: 'native',
+	isFullScreen: false,
+
+	setCurrentTime: function (time) {
+		this.currentTime = time;
+	},
+
+	setMuted: function (muted) {
+		this.muted = muted;
+	},
+
+	setVolume: function (volume) {
+		this.volume = volume;
+	},
+
+	// for parity with the plugin versions
+	stop: function () {
+		this.pause();
+	},
+
+	// This can be a url string
+	// or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
+	setSrc: function (url) {
+
+		// Fix for IE9 which can't set .src when there are <source> elements. Awesome, right?
+		var
+			existingSources = this.getElementsByTagName('source');
+		while (existingSources.length > 0){
+			this.removeChild(existingSources[0]);
+		}
+
+		if (typeof url == 'string') {
+			this.src = url;
+		} else {
+			var i, media;
+
+			for (i=0; i<url.length; i++) {
+				media = url[i];
+				if (this.canPlayType(media.type)) {
+					this.src = media.src;
+				}
+			}
+		}
+	},
+
+	setVideoSize: function (width, height) {
+		this.width = width;
+		this.height = height;
+	}
+};
+
+/*
+Mimics the <video/audio> element by calling Flash's External Interface or Silverlights [ScriptableMember]
+*/
+mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) {
+	this.id = pluginid;
+	this.pluginType = pluginType;
+	this.src = mediaUrl;
+	this.events = {};
+};
+
+// JavaScript values and ExternalInterface methods that match HTML5 video properties methods
+// http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/fl/video/FLVPlayback.html
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html
+mejs.PluginMediaElement.prototype = {
+
+	// special
+	pluginElement: null,
+	pluginType: '',
+	isFullScreen: false,
+
+	// not implemented :(
+	playbackRate: -1,
+	defaultPlaybackRate: -1,
+	seekable: [],
+	played: [],
+
+	// HTML5 read-only properties
+	paused: true,
+	ended: false,
+	seeking: false,
+	duration: 0,
+	error: null,
+	tagName: '',
+
+	// HTML5 get/set properties, but only set (updated by event handlers)
+	muted: false,
+	volume: 1,
+	currentTime: 0,
+
+	// HTML5 methods
+	play: function () {
+		if (this.pluginApi != null) {
+			if (this.pluginType == 'youtube') {
+				this.pluginApi.playVideo();
+			} else {
+				this.pluginApi.playMedia();
+			}
+			this.paused = false;
+		}
+	},
+	load: function () {
+		if (this.pluginApi != null) {
+			if (this.pluginType == 'youtube') {
+			} else {
+				this.pluginApi.loadMedia();
+			}
+
+			this.paused = false;
+		}
+	},
+	pause: function () {
+		if (this.pluginApi != null) {
+			if (this.pluginType == 'youtube') {
+				this.pluginApi.pauseVideo();
+			} else {
+				this.pluginApi.pauseMedia();
+			}
+
+
+			this.paused = true;
+		}
+	},
+	stop: function () {
+		if (this.pluginApi != null) {
+			if (this.pluginType == 'youtube') {
+				this.pluginApi.stopVideo();
+			} else {
+				this.pluginApi.stopMedia();
+			}
+			this.paused = true;
+		}
+	},
+	canPlayType: function(type) {
+		var i,
+			j,
+			pluginInfo,
+			pluginVersions = mejs.plugins[this.pluginType];
+
+		for (i=0; i<pluginVersions.length; i++) {
+			pluginInfo = pluginVersions[i];
+
+			// test if user has the correct plugin version
+			if (mejs.PluginDetector.hasPluginVersion(this.pluginType, pluginInfo.version)) {
+
+				// test for plugin playback types
+				for (j=0; j<pluginInfo.types.length; j++) {
+					// find plugin that can play the type
+					if (type == pluginInfo.types[j]) {
+						return true;
+					}
+				}
+			}
+		}
+
+		return false;
+	},
+
+	positionFullscreenButton: function(x,y,visibleAndAbove) {
+		if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) {
+			this.pluginApi.positionFullscreenButton(x,y,visibleAndAbove);
+		}
+	},
+
+	hideFullscreenButton: function() {
+		if (this.pluginApi != null && this.pluginApi.hideFullscreenButton) {
+			this.pluginApi.hideFullscreenButton();
+		}
+	},
+
+
+	// custom methods since not all JavaScript implementations support get/set
+
+	// This can be a url string
+	// or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
+	setSrc: function (url) {
+		if (typeof url == 'string') {
+			this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(url));
+			this.src = mejs.Utility.absolutizeUrl(url);
+		} else {
+			var i, media;
+
+			for (i=0; i<url.length; i++) {
+				media = url[i];
+				if (this.canPlayType(media.type)) {
+					this.pluginApi.setSrc(mejs.Utility.absolutizeUrl(media.src));
+					this.src = mejs.Utility.absolutizeUrl(url);
+				}
+			}
+		}
+
+	},
+	setCurrentTime: function (time) {
+		if (this.pluginApi != null) {
+			if (this.pluginType == 'youtube') {
+				this.pluginApi.seekTo(time);
+			} else {
+				this.pluginApi.setCurrentTime(time);
+			}
+
+
+
+			this.currentTime = time;
+		}
+	},
+	setVolume: function (volume) {
+		if (this.pluginApi != null) {
+			// same on YouTube and MEjs
+			if (this.pluginType == 'youtube') {
+				this.pluginApi.setVolume(volume * 100);
+			} else {
+				this.pluginApi.setVolume(volume);
+			}
+			this.volume = volume;
+		}
+	},
+	setMuted: function (muted) {
+		if (this.pluginApi != null) {
+			if (this.pluginType == 'youtube') {
+				if (muted) {
+					this.pluginApi.mute();
+				} else {
+					this.pluginApi.unMute();
+				}
+				this.muted = muted;
+				this.dispatchEvent('volumechange');
+			} else {
+				this.pluginApi.setMuted(muted);
+			}
+			this.muted = muted;
+		}
+	},
+
+	// additional non-HTML5 methods
+	setVideoSize: function (width, height) {
+
+		//if (this.pluginType == 'flash' || this.pluginType == 'silverlight') {
+			if ( this.pluginElement.style) {
+				this.pluginElement.style.width = width + 'px';
+				this.pluginElement.style.height = height + 'px';
+			}
+	        // altered by @edsilv
+			//if (this.pluginApi != null && this.pluginApi.setVideoSize) {
+	        if (this.pluginApi != null) {
+				this.pluginApi.setVideoSize(width, height);
+			}
+		//}
+	},
+
+	setFullscreen: function (fullscreen) {
+		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
+			this.pluginApi.setFullscreen(fullscreen);
+		}
+	},
+
+	enterFullScreen: function() {
+		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
+			this.setFullscreen(true);
+		}
+	},
+
+	exitFullScreen: function() {
+		if (this.pluginApi != null && this.pluginApi.setFullscreen) {
+			this.setFullscreen(false);
+		}
+	},
+
+	// start: fake events
+	addEventListener: function (eventName, callback, bubble) {
+		this.events[eventName] = this.events[eventName] || [];
+		this.events[eventName].push(callback);
+	},
+	removeEventListener: function (eventName, callback) {
+		if (!eventName) { this.events = {}; return true; }
+		var callbacks = this.events[eventName];
+		if (!callbacks) return true;
+		if (!callback) { this.events[eventName] = []; return true; }
+		for (i = 0; i < callbacks.length; i++) {
+			if (callbacks[i] === callback) {
+				this.events[eventName].splice(i, 1);
+				return true;
+			}
+		}
+		return false;
+	},
+	dispatchEvent: function (eventName) {
+        var i,
+			args,
+			callbacks = this.events[eventName];
+
+		if (callbacks) {
+			args = Array.prototype.slice.call(arguments, 1);
+			for (i = 0; i < callbacks.length; i++) {
+				callbacks[i].apply(null, args);
+			}
+		}
+	},
+	// end: fake events
+
+	// fake DOM attribute methods
+	attributes: {},
+	hasAttribute: function(name){
+		return (name in this.attributes);
+	},
+	removeAttribute: function(name){
+		delete this.attributes[name];
+	},
+	getAttribute: function(name){
+		if (this.hasAttribute(name)) {
+			return this.attributes[name];
+		}
+		return '';
+	},
+	setAttribute: function(name, value){
+		this.attributes[name] = value;
+	},
+
+	remove: function() {
+		mejs.Utility.removeSwf(this.pluginElement.id);
+	}
+};
+
+// Handles calls from Flash/Silverlight and reports them as native <video/audio> events and properties
+mejs.MediaPluginBridge = {
+
+	pluginMediaElements:{},
+	htmlMediaElements:{},
+
+	registerPluginElement: function (id, pluginMediaElement, htmlMediaElement) {
+		this.pluginMediaElements[id] = pluginMediaElement;
+		this.htmlMediaElements[id] = htmlMediaElement;
+	},
+
+	// when Flash/Silverlight is ready, it calls out to this method
+	initPlugin: function (id) {
+
+		var pluginMediaElement = this.pluginMediaElements[id],
+			htmlMediaElement = this.htmlMediaElements[id];
+
+		if (pluginMediaElement) {
+			// find the javascript bridge
+			switch (pluginMediaElement.pluginType) {
+				case "flash":
+					pluginMediaElement.pluginElement = pluginMediaElement.pluginApi = document.getElementById(id);
+					break;
+				case "silverlight":
+					pluginMediaElement.pluginElement = document.getElementById(pluginMediaElement.id);
+					pluginMediaElement.pluginApi = pluginMediaElement.pluginElement.Content.MediaElementJS;
+					break;
+			}
+
+			if (pluginMediaElement.pluginApi != null && pluginMediaElement.success) {
+				pluginMediaElement.success(pluginMediaElement, htmlMediaElement);
+			}
+		}
+	},
+
+	// receives events from Flash/Silverlight and sends them out as HTML5 media events
+	// http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html
+	fireEvent: function (id, eventName, values) {
+		var
+			e,
+			i,
+			bufferedTime,
+			pluginMediaElement = this.pluginMediaElements[id];
+
+		pluginMediaElement.ended = false;
+		pluginMediaElement.paused = true;
+
+		// fake event object to mimic real HTML media event.
+		e = {
+			type: eventName,
+			target: pluginMediaElement
+		};
+
+		// attach all values to element and event object
+		for (i in values) {
+			pluginMediaElement[i] = values[i];
+			e[i] = values[i];
+		}
+
+		// fake the newer W3C buffered TimeRange (loaded and total have been removed)
+		bufferedTime = values.bufferedTime || 0;
+
+		e.target.buffered = e.buffered = {
+			start: function(index) {
+				return 0;
+			},
+			end: function (index) {
+				return bufferedTime;
+			},
+			length: 1
+		};
+
+		pluginMediaElement.dispatchEvent(e.type, e);
+	}
+};
+
+/*
+Default options
+*/
+mejs.MediaElementDefaults = {
+	// allows testing on HTML5, flash, silverlight
+	// auto: attempts to detect what the browser can do
+	// native: forces HTML5 playback
+	// shim: disallows HTML5, will attempt either Flash or Silverlight
+	// none: forces fallback view
+	mode: 'auto',
+	// remove or reorder to change plugin priority and availability
+	plugins: ['flash','silverlight','youtube','vimeo'],
+	// shows debug errors on screen
+	enablePluginDebug: false,
+	// overrides the type specified, useful for dynamic instantiation
+	type: '',
+	// path to Flash and Silverlight plugins
+	// altered by @edsilv - include app.js
+	pluginPath: mejs.Utility.getScriptPath(['mediaelement.js','mediaelement.min.js','mediaelement-and-player.js','mediaelement-and-player.min.js', 'app.js']),
+	// name of flash file
+	flashName: 'flashmediaelement.swf',
+	// turns on the smoothing filter in Flash
+	enablePluginSmoothing: false,
+	// name of silverlight file
+	silverlightName: 'silverlightmediaelement.xap',
+	// default if the <video width> is not specified
+	defaultVideoWidth: 480,
+	// default if the <video height> is not specified
+	defaultVideoHeight: 270,
+	// overrides <video width>
+	pluginWidth: -1,
+	// overrides <video height>
+	pluginHeight: -1,
+	// additional plugin variables in 'key=value' form
+	pluginVars: [],
+	// rate in milliseconds for Flash and Silverlight to fire the timeupdate event
+	// larger number is less accurate, but less strain on plugin->JavaScript bridge
+	timerRate: 250,
+	// initial volume for player
+	startVolume: 0.8,
+	success: function () { },
+	error: function () { }
+};
+
+/*
+Determines if a browser supports the <video> or <audio> element
+and returns either the native element or a Flash/Silverlight version that
+mimics HTML5 MediaElement
+*/
+mejs.MediaElement = function (el, o) {
+	return mejs.HtmlMediaElementShim.create(el,o);
+};
+
+mejs.HtmlMediaElementShim = {
+
+	create: function(el, o) {
+		var
+			options = mejs.MediaElementDefaults,
+			htmlMediaElement = (typeof(el) == 'string') ? document.getElementById(el) : el,
+			tagName = htmlMediaElement.tagName.toLowerCase(),
+			isMediaTag = (tagName === 'audio' || tagName === 'video'),
+			src = (isMediaTag) ? htmlMediaElement.getAttribute('src') : htmlMediaElement.getAttribute('href'),
+			poster = htmlMediaElement.getAttribute('poster'),
+			autoplay =  htmlMediaElement.getAttribute('autoplay'),
+			preload =  htmlMediaElement.getAttribute('preload'),
+			controls =  htmlMediaElement.getAttribute('controls'),
+			playback,
+			prop;
+
+		// extend options
+		for (prop in o) {
+			options[prop] = o[prop];
+		}
+
+		// clean up attributes
+		src = 		(typeof src == 'undefined' 	|| src === null || src == '') ? null : src;
+		poster =	(typeof poster == 'undefined' 	|| poster === null) ? '' : poster;
+		preload = 	(typeof preload == 'undefined' 	|| preload === null || preload === 'false') ? 'none' : preload;
+		autoplay = 	!(typeof autoplay == 'undefined' || autoplay === null || autoplay === 'false');
+		controls = 	!(typeof controls == 'undefined' || controls === null || controls === 'false');
+
+		// test for HTML5 and plugin capabilities
+		playback = this.determinePlayback(htmlMediaElement, options, mejs.MediaFeatures.supportsMediaTag, isMediaTag, src);
+		playback.url = (playback.url !== null) ? mejs.Utility.absolutizeUrl(playback.url) : '';
+
+		if (playback.method == 'native') {
+			// second fix for android
+			if (mejs.MediaFeatures.isBustedAndroid) {
+				htmlMediaElement.src = playback.url;
+				htmlMediaElement.addEventListener('click', function() {
+					htmlMediaElement.play();
+				}, false);
+			}
+
+			// add methods to native HTMLMediaElement
+			return this.updateNative(playback, options, autoplay, preload);
+		} else if (playback.method !== '') {
+			// create plugin to mimic HTMLMediaElement
+
+			return this.createPlugin( playback,  options, poster, autoplay, preload, controls);
+		} else {
+			// boo, no HTML5, no Flash, no Silverlight.
+			this.createErrorMessage( playback, options, poster );
+
+			return this;
+		}
+	},
+
+	determinePlayback: function(htmlMediaElement, options, supportsMediaTag, isMediaTag, src) {
+		var
+			mediaFiles = [],
+			i,
+			j,
+			k,
+			l,
+			n,
+			type,
+			result = { method: '', url: '', htmlMediaElement: htmlMediaElement, isVideo: (htmlMediaElement.tagName.toLowerCase() != 'audio')},
+			pluginName,
+			pluginVersions,
+			pluginInfo,
+			dummy;
+
+		// STEP 1: Get URL and type from <video src> or <source src>
+
+		// supplied type overrides <video type> and <source type>
+		if (typeof options.type != 'undefined' && options.type !== '') {
+
+			// accept either string or array of types
+			if (typeof options.type == 'string') {
+				mediaFiles.push({type:options.type, url:src});
+			} else {
+
+				for (i=0; i<options.type.length; i++) {
+					mediaFiles.push({type:options.type[i], url:src});
+				}
+			}
+
+		// test for src attribute first
+		} else if (src !== null) {
+			type = this.formatType(src, htmlMediaElement.getAttribute('type'));
+			mediaFiles.push({type:type, url:src});
+
+		// then test for <source> elements
+		} else {
+			// test <source> types to see if they are usable
+			for (i = 0; i < htmlMediaElement.childNodes.length; i++) {
+				n = htmlMediaElement.childNodes[i];
+				if (n.nodeType == 1 && n.tagName.toLowerCase() == 'source') {
+					src = n.getAttribute('src');
+					type = this.formatType(src, n.getAttribute('type'));
+					mediaFiles.push({type:type, url:src});
+				}
+			}
+		}
+
+		// in the case of dynamicly created players
+		// check for audio types
+		if (!isMediaTag && mediaFiles.length > 0 && mediaFiles[0].url !== null && this.getTypeFromFile(mediaFiles[0].url).indexOf('audio') > -1) {
+			result.isVideo = false;
+		}
+
+
+		// STEP 2: Test for playback method
+
+		// special case for Android which sadly doesn't implement the canPlayType function (always returns '')
+		if (mejs.MediaFeatures.isBustedAndroid) {
+			htmlMediaElement.canPlayType = function(type) {
+				return (type.match(/video\/(mp4|m4v)/gi) !== null) ? 'maybe' : '';
+			};
+		}
+
+
+		// test for native playback first
+		if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'native')) {
+
+			if (!isMediaTag) {
+
+				// create a real HTML5 Media Element
+				dummy = document.createElement( result.isVideo ? 'video' : 'audio');
+				htmlMediaElement.parentNode.insertBefore(dummy, htmlMediaElement);
+				htmlMediaElement.style.display = 'none';
+
+				// use this one from now on
+				result.htmlMediaElement = htmlMediaElement = dummy;
+			}
+
+			for (i=0; i<mediaFiles.length; i++) {
+				// normal check
+				if (htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== ''
+					// special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg')
+					|| htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== '') {
+					result.method = 'native';
+					result.url = mediaFiles[i].url;
+					break;
+				}
+			}
+
+			if (result.method === 'native') {
+				if (result.url !== null) {
+					htmlMediaElement.src = result.url;
+				}
+
+				return result;
+			}
+		}
+
+		// if native playback didn't work, then test plugins
+		if (options.mode === 'auto' || options.mode === 'shim') {
+			for (i=0; i<mediaFiles.length; i++) {
+				type = mediaFiles[i].type;
+
+				// test all plugins in order of preference [silverlight, flash]
+				for (j=0; j<options.plugins.length; j++) {
+
+					pluginName = options.plugins[j];
+
+					// test version of plugin (for future features)
+					pluginVersions = mejs.plugins[pluginName];
+
+					for (k=0; k<pluginVersions.length; k++) {
+						pluginInfo = pluginVersions[k];
+
+						// test if user has the correct plugin version
+
+						// for youtube/vimeo
+						if (pluginInfo.version == null ||
+
+							mejs.PluginDetector.hasPluginVersion(pluginName, pluginInfo.version)) {
+
+							// test for plugin playback types
+							for (l=0; l<pluginInfo.types.length; l++) {
+								// find plugin that can play the type
+								if (type == pluginInfo.types[l]) {
+									result.method = pluginName;
+									result.url = mediaFiles[i].url;
+									return result;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		// what if there's nothing to play? just grab the first available
+		if (result.method === '' && mediaFiles.length > 0) {
+			result.url = mediaFiles[0].url;
+		}
+
+		return result;
+	},
+
+	formatType: function(url, type) {
+		var ext;
+
+		// if no type is supplied, fake it with the extension
+		if (url && !type) {
+			return this.getTypeFromFile(url);
+		} else {
+			// only return the mime part of the type in case the attribute contains the codec
+			// see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element
+			// `video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`
+
+			if (type && ~type.indexOf(';')) {
+				return type.substr(0, type.indexOf(';'));
+			} else {
+				return type;
+			}
+		}
+	},
+
+	getTypeFromFile: function(url) {
+		var ext = url.substring(url.lastIndexOf('.') + 1);
+		return (/(mp4|m4v|ogg|ogv|webm|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video' : 'audio') + '/' + ext;
+	},
+
+	createErrorMessage: function(playback, options, poster) {
+		var
+			htmlMediaElement = playback.htmlMediaElement,
+			errorContainer = document.createElement('div');
+
+		errorContainer.className = 'me-cannotplay';
+
+        // changed by @edsilv
+		//try {
+		//	errorContainer.style.width = htmlMediaElement.width + 'px';
+		//	errorContainer.style.height = htmlMediaElement.height + 'px';
+		//} catch (e) {}
+
+	    $(errorContainer).height($('.mejs-mediaelement').height());
+
+        // changed by @edsilv
+		//errorContainer.innerHTML = (poster !== '') ?
+		//	'<a href="' + playback.url + '"><img src="' + poster + '" width="100%" height="100%" /></a>' :
+		//	'<a href="' + playback.url + '"><span>Download File</span></a>';
+
+	    errorContainer.innerHTML = '<p>Please install the <a target="_blank" href="http://get.adobe.com/flashplayer/">Adobe Flash</a> plugin to view this content.</p>';
+
+		htmlMediaElement.parentNode.insertBefore(errorContainer, htmlMediaElement);
+		htmlMediaElement.style.display = 'none';
+
+		options.error(htmlMediaElement);
+	},
+
+	createPlugin:function(playback, options, poster, autoplay, preload, controls) {
+		var
+			htmlMediaElement = playback.htmlMediaElement,
+			width = 1,
+			height = 1,
+			pluginid = 'me_' + playback.method + '_' + (mejs.meIndex++),
+			pluginMediaElement = new mejs.PluginMediaElement(pluginid, playback.method, playback.url),
+			container = document.createElement('div'),
+			specialIEContainer,
+			node,
+			initVars;
+
+		// copy tagName from html media element
+		pluginMediaElement.tagName = htmlMediaElement.tagName
+
+		// copy attributes from html media element to plugin media element
+		for (var i = 0; i < htmlMediaElement.attributes.length; i++) {
+			var attribute = htmlMediaElement.attributes[i];
+			if (attribute.specified == true) {
+				pluginMediaElement.setAttribute(attribute.name, attribute.value);
+			}
+		}
+
+		// check for placement inside a <p> tag (sometimes WYSIWYG editors do this)
+		node = htmlMediaElement.parentNode;
+		while (node !== null && node.tagName.toLowerCase() != 'body') {
+			if (node.parentNode.tagName.toLowerCase() == 'p') {
+				node.parentNode.parentNode.insertBefore(node, node.parentNode);
+				break;
+			}
+			node = node.parentNode;
+		}
+
+		if (playback.isVideo) {
+			width = (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth;
+			height = (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight;
+
+			// in case of '%' make sure it's encoded
+			width = mejs.Utility.encodeUrl(width);
+			height = mejs.Utility.encodeUrl(height);
+
+		} else {
+			if (options.enablePluginDebug) {
+				width = 320;
+				height = 240;
+			}
+		}
+
+		// register plugin
+		pluginMediaElement.success = options.success;
+		mejs.MediaPluginBridge.registerPluginElement(pluginid, pluginMediaElement, htmlMediaElement);
+
+		// add container (must be added to DOM before inserting HTML for IE)
+		container.className = 'me-plugin';
+		container.id = pluginid + '_container';
+
+		if (playback.isVideo) {
+				htmlMediaElement.parentNode.insertBefore(container, htmlMediaElement);
+		} else {
+				document.body.insertBefore(container, document.body.childNodes[0]);
+		}
+
+		// flash/silverlight vars
+		initVars = [
+			'id=' + pluginid,
+			'isvideo=' + ((playback.isVideo) ? "true" : "false"),
+			'autoplay=' + ((autoplay) ? "true" : "false"),
+			'preload=' + preload,
+			'width=' + width,
+			'startvolume=' + options.startVolume,
+			'timerrate=' + options.timerRate,
+			'height=' + height];
+
+		if (playback.url !== null) {
+			if (playback.method == 'flash') {
+				initVars.push('file=' + mejs.Utility.encodeUrl(playback.url));
+			} else {
+				initVars.push('file=' + playback.url);
+			}
+		}
+		if (options.enablePluginDebug) {
+			initVars.push('debug=true');
+		}
+		if (options.enablePluginSmoothing) {
+			initVars.push('smoothing=true');
+		}
+		if (controls) {
+			initVars.push('controls=true'); // shows controls in the plugin if desired
+		}
+		if (options.pluginVars) {
+			initVars = initVars.concat(options.pluginVars);
+		}
+
+		switch (playback.method) {
+			case 'silverlight':
+				container.innerHTML =
+'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '">' +
+'<param name="initParams" value="' + initVars.join(',') + '" />' +
+'<param name="windowless" value="true" />' +
+'<param name="background" value="black" />' +
+'<param name="minRuntimeVersion" value="3.0.0.0" />' +
+'<param name="autoUpgrade" value="true" />' +
+'<param name="source" value="' + options.pluginPath + options.silverlightName + '" />' +
+'</object>';
+					break;
+
+			case 'flash':
+
+				if (mejs.MediaFeatures.isIE) {
+					specialIEContainer = document.createElement('div');
+					container.appendChild(specialIEContainer);
+					specialIEContainer.outerHTML =
+'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
+'id="' + pluginid + '" width="' + width + '" height="' + height + '">' +
+'<param name="movie" value="' + options.pluginPath + options.flashName + '?x=' + (new Date()) + '" />' +
+'<param name="flashvars" value="' + initVars.join('&amp;') + '" />' +
+'<param name="quality" value="high" />' +
+'<param name="bgcolor" value="#000000" />' +
+'<param name="wmode" value="transparent" />' +
+'<param name="allowScriptAccess" value="always" />' +
+'<param name="allowFullScreen" value="true" />' +
+'</object>';
+
+				} else {
+
+					container.innerHTML =
+'<embed id="' + pluginid + '" name="' + pluginid + '" ' +
+'play="true" ' +
+'loop="false" ' +
+'quality="high" ' +
+'bgcolor="#000000" ' +
+'wmode="transparent" ' +
+'allowScriptAccess="always" ' +
+'allowFullScreen="true" ' +
+'type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" ' +
+'src="' + options.pluginPath + options.flashName + '" ' +
+'flashvars="' + initVars.join('&') + '" ' +
+'width="' + width + '" ' +
+'height="' + height + '"></embed>';
+				}
+				break;
+
+			case 'youtube':
+
+
+				var
+					videoId = playback.url.substr(playback.url.lastIndexOf('=')+1);
+					youtubeSettings = {
+						container: container,
+						containerId: container.id,
+						pluginMediaElement: pluginMediaElement,
+						pluginId: pluginid,
+						videoId: videoId,
+						height: height,
+						width: width
+					};
+
+				if (mejs.PluginDetector.hasPluginVersion('flash', [10,0,0]) ) {
+					mejs.YouTubeApi.createFlash(youtubeSettings);
+				} else {
+					mejs.YouTubeApi.enqueueIframe(youtubeSettings);
+				}
+
+				break;
+
+			// DEMO Code. Does NOT work.
+			case 'vimeo':
+				console.log('vimeoid');
+
+				pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
+
+				container.innerHTML =
+					'<object width="' + width + '" height="' + height + '">' +
+						'<param name="allowfullscreen" value="true" />' +
+						'<param name="allowscriptaccess" value="always" />' +
+						'<param name="flashvars" value="api=1" />' +
+						'<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=' + pluginMediaElement.vimeoid  + '&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" />' +
+						'<embed src="//vimeo.com/moogaloop.swf?api=1&amp;clip_id=' + pluginMediaElement.vimeoid + '&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="' + width + '" height="' + height + '"></embed>' +
+					'</object>';
+
+				break;
+		}
+		// hide original element
+		htmlMediaElement.style.display = 'none';
+
+		// FYI: options.success will be fired by the MediaPluginBridge
+
+		return pluginMediaElement;
+	},
+
+	updateNative: function(playback, options, autoplay, preload) {
+
+		var htmlMediaElement = playback.htmlMediaElement,
+			m;
+
+
+		// add methods to video object to bring it into parity with Flash Object
+		for (m in mejs.HtmlMediaElement) {
+			htmlMediaElement[m] = mejs.HtmlMediaElement[m];
+		}
+
+		/*
+		Chrome now supports preload="none"
+		if (mejs.MediaFeatures.isChrome) {
+
+			// special case to enforce preload attribute (Chrome doesn't respect this)
+			if (preload === 'none' && !autoplay) {
+
+				// forces the browser to stop loading (note: fails in IE9)
+				htmlMediaElement.src = '';
+				htmlMediaElement.load();
+				htmlMediaElement.canceledPreload = true;
+
+				htmlMediaElement.addEventListener('play',function() {
+					if (htmlMediaElement.canceledPreload) {
+						htmlMediaElement.src = playback.url;
+						htmlMediaElement.load();
+						htmlMediaElement.play();
+						htmlMediaElement.canceledPreload = false;
+					}
+				}, false);
+			// for some reason Chrome forgets how to autoplay sometimes.
+			} else if (autoplay) {
+				htmlMediaElement.load();
+				htmlMediaElement.play();
+			}
+		}
+		*/
+
+		// fire success code
+		options.success(htmlMediaElement, htmlMediaElement);
+
+		return htmlMediaElement;
+	}
+};
+
+/*
+ - test on IE (object vs. embed)
+ - determine when to use iframe (Firefox, Safari, Mobile) vs. Flash (Chrome, IE)
+ - fullscreen?
+*/
+
+// YouTube Flash and Iframe API
+mejs.YouTubeApi = {
+	isIframeStarted: false,
+	isIframeLoaded: false,
+	loadIframeApi: function() {
+		if (!this.isIframeStarted) {
+			var tag = document.createElement('script');
+			tag.src = "http://www.youtube.com/player_api";
+			var firstScriptTag = document.getElementsByTagName('script')[0];
+			firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
+			this.isIframeStarted = true;
+		}
+	},
+	iframeQueue: [],
+	enqueueIframe: function(yt) {
+
+		if (this.isLoaded) {
+			this.createIframe(yt);
+		} else {
+			this.loadIframeApi();
+			this.iframeQueue.push(yt);
+		}
+	},
+	createIframe: function(settings) {
+
+		var
+		pluginMediaElement = settings.pluginMediaElement,
+		player = new YT.Player(settings.containerId, {
+			height: settings.height,
+			width: settings.width,
+			videoId: settings.videoId,
+			playerVars: {controls:0},
+			events: {
+				'onReady': function() {
+
+					// hook up iframe object to MEjs
+					settings.pluginMediaElement.pluginApi = player;
+
+					// init mejs
+					mejs.MediaPluginBridge.initPlugin(settings.pluginId);
+
+					// create timer
+					setInterval(function() {
+						mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
+					}, 250);
+				},
+				'onStateChange': function(e) {
+
+					mejs.YouTubeApi.handleStateChange(e.data, player, pluginMediaElement);
+
+				}
+			}
+		});
+	},
+
+	createEvent: function (player, pluginMediaElement, eventName) {
+        var obj = {
+			type: eventName,
+			target: pluginMediaElement
+		};
+
+		if (player && player.getDuration) {
+
+			// time
+			pluginMediaElement.currentTime = obj.currentTime = player.getCurrentTime();
+			pluginMediaElement.duration = obj.duration = player.getDuration();
+
+			// state
+			obj.paused = pluginMediaElement.paused;
+			obj.ended = pluginMediaElement.ended;
+
+			// sound
+			obj.muted = player.isMuted();
+			obj.volume = player.getVolume() / 100;
+
+			// progress
+			obj.bytesTotal = player.getVideoBytesTotal();
+			obj.bufferedBytes = player.getVideoBytesLoaded();
+
+			// fake the W3C buffered TimeRange
+			var bufferedTime = obj.bufferedBytes / obj.bytesTotal * obj.duration;
+
+			obj.target.buffered = obj.buffered = {
+				start: function(index) {
+					return 0;
+				},
+				end: function (index) {
+					return bufferedTime;
+				},
+				length: 1
+			};
+
+		}
+
+		// send event up the chain
+		pluginMediaElement.dispatchEvent(obj.type, obj);
+	},
+
+	iFrameReady: function() {
+
+		this.isLoaded = true;
+		this.isIframeLoaded = true;
+
+		while (this.iframeQueue.length > 0) {
+			var settings = this.iframeQueue.pop();
+			this.createIframe(settings);
+		}
+	},
+
+	// FLASH!
+	flashPlayers: {},
+	createFlash: function(settings) {
+
+		this.flashPlayers[settings.pluginId] = settings;
+
+		/*
+		settings.container.innerHTML =
+			'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="//www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0" ' +
+				'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; ">' +
+				'<param name="allowScriptAccess" value="always">' +
+				'<param name="wmode" value="transparent">' +
+			'</object>';
+		*/
+
+		var specialIEContainer,
+			youtubeUrl = 'http://www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0';
+
+		if (mejs.MediaFeatures.isIE) {
+
+			specialIEContainer = document.createElement('div');
+			settings.container.appendChild(specialIEContainer);
+			specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
+'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '">' +
+	'<param name="movie" value="' + youtubeUrl + '" />' +
+	'<param name="wmode" value="transparent" />' +
+	'<param name="allowScriptAccess" value="always" />' +
+	'<param name="allowFullScreen" value="true" />' +
+'</object>';
+		} else {
+		settings.container.innerHTML =
+			'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' +
+				'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; ">' +
+				'<param name="allowScriptAccess" value="always">' +
+				'<param name="wmode" value="transparent">' +
+			'</object>';
+		}
+
+	},
+
+	flashReady: function(id) {
+		var
+			settings = this.flashPlayers[id],
+			player = document.getElementById(id),
+			pluginMediaElement = settings.pluginMediaElement;
+
+		// hook up and return to MediaELementPlayer.success
+		pluginMediaElement.pluginApi =
+		pluginMediaElement.pluginElement = player;
+		mejs.MediaPluginBridge.initPlugin(id);
+
+		// load the youtube video
+		player.cueVideoById(settings.videoId);
+
+		var callbackName = settings.containerId + '_callback'
+
+		window[callbackName] = function(e) {
+			mejs.YouTubeApi.handleStateChange(e, player, pluginMediaElement);
+		}
+
+		player.addEventListener('onStateChange', callbackName);
+
+		setInterval(function() {
+			mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
+		}, 250);
+	},
+
+	handleStateChange: function(youTubeState, player, pluginMediaElement) {
+		switch (youTubeState) {
+			case -1: // not started
+				pluginMediaElement.paused = true;
+				pluginMediaElement.ended = true;
+				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'loadedmetadata');
+				//createYouTubeEvent(player, pluginMediaElement, 'loadeddata');
+				break;
+			case 0:
+				pluginMediaElement.paused = false;
+				pluginMediaElement.ended = true;
+				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'ended');
+				break;
+			case 1:
+				pluginMediaElement.paused = false;
+				pluginMediaElement.ended = false;
+				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'play');
+				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'playing');
+				break;
+			case 2:
+				pluginMediaElement.paused = true;
+				pluginMediaElement.ended = false;
+				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'pause');
+				break;
+			case 3: // buffering
+				mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'progress');
+				break;
+			case 5:
+				// cued?
+				break;
+
+		}
+
+	}
+}
+// IFRAME
+function onYouTubePlayerAPIReady() {
+	mejs.YouTubeApi.iFrameReady();
+}
+// FLASH
+function onYouTubePlayerReady(id) {
+	mejs.YouTubeApi.flashReady(id);
+}
+
+window.mejs = mejs;
+window.MediaElement = mejs.MediaElement;
+
+/*!
+ * MediaElementPlayer
+ * http://mediaelementjs.com/
+ *
+ * Creates a controller bar for HTML5 <video> add <audio> tags
+ * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
+ *
+ * Copyright 2010-2012, John Dyer (http://j.hn/)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ */
+if (typeof jQuery != 'undefined') {
+	mejs.$ = jQuery;
+} else if (typeof ender != 'undefined') {
+	mejs.$ = ender;
+}
+(function ($) {
+
+	// default player values
+	mejs.MepDefaults = {
+		// url to poster (to fix iOS 3.x)
+		poster: '',
+		// default if the <video width> is not specified
+		defaultVideoWidth: 480,
+		// default if the <video height> is not specified
+		defaultVideoHeight: 270,
+		// if set, overrides <video width>
+		videoWidth: -1,
+		// if set, overrides <video height>
+		videoHeight: -1,
+		// default if the user doesn't specify
+		defaultAudioWidth: 400,
+		// default if the user doesn't specify
+		defaultAudioHeight: 30,
+		// width of audio player
+		audioWidth: -1,
+		// height of audio player
+		audioHeight: -1,
+		// initial volume when the player starts (overrided by user cookie)
+		startVolume: 0.8,
+		// useful for <audio> player loops
+		loop: false,
+		// resize to media dimensions
+		enableAutosize: true,
+		// forces the hour marker (##:00:00)
+		alwaysShowHours: false,
+
+		// show framecount in timecode (##:00:00:00)
+		showTimecodeFrameCount: false,
+		// used when showTimecodeFrameCount is set to true
+		framesPerSecond: 25,
+
+		// automatically calculate the width of the progress bar based on the sizes of other elements
+		autosizeProgress : true,
+		// Hide controls when playing and mouse is not over the video
+		alwaysShowControls: false,
+		// force iPad's native controls
+		iPadUseNativeControls: false,
+		// force iPhone's native controls
+		iPhoneUseNativeControls: false,
+		// force Android's native controls
+		AndroidUseNativeControls: false,
+		// features to show
+		features: ['playpause','current','progress','duration','tracks','volume','fullscreen'],
+		// only for dynamic
+		isVideo: true,
+
+		// turns keyboard support on and off for this instance
+		enableKeyboard: true,
+
+		// whenthis player starts, it will pause other players
+		pauseOtherPlayers: true,
+
+		// array of keyboard actions such as play pause
+		keyActions: [
+				{
+						keys: [
+								32, // SPACE
+								179 // GOOGLE play/pause button
+							  ],
+						action: function(player, media) {
+								if (media.paused || media.ended) {
+										media.play();
+								} else {
+										media.pause();
+								}
+						}
+				},
+				{
+						keys: [38], // UP
+						action: function(player, media) {
+								var newVolume = Math.min(media.volume + 0.1, 1);
+								media.setVolume(newVolume);
+						}
+				},
+				{
+						keys: [40], // DOWN
+						action: function(player, media) {
+								var newVolume = Math.max(media.volume - 0.1, 0);
+								media.setVolume(newVolume);
+						}
+				},
+				{
+						keys: [
+								37, // LEFT
+								227 // Google TV rewind
+						],
+						action: function(player, media) {
+								if (!isNaN(media.duration) && media.duration > 0) {
+										if (player.isVideo) {
+												player.showControls();
+												player.startControlsTimer();
+										}
+
+										// 5%
+										var newTime = Math.max(media.currentTime - (media.duration * 0.05), 0);
+										media.setCurrentTime(newTime);
+								}
+						}
+				},
+				{
+						keys: [
+								39, // RIGHT
+								228 // Google TV forward
+						],
+						action: function(player, media) {
+								if (!isNaN(media.duration) && media.duration > 0) {
+										if (player.isVideo) {
+												player.showControls();
+												player.startControlsTimer();
+										}
+
+										// 5%
+										var newTime = Math.min(media.currentTime + (media.duration * 0.05), media.duration);
+										media.setCurrentTime(newTime);
+								}
+						}
+				},
+				{
+						keys: [70], // f
+						action: function(player, media) {
+								if (typeof player.enterFullScreen != 'undefined') {
+										if (player.isFullScreen) {
+												player.exitFullScreen();
+										} else {
+												player.enterFullScreen();
+										}
+								}
+						}
+				}
+		]
+	};
+
+	mejs.mepIndex = 0;
+
+	mejs.players = [];
+
+	// wraps a MediaElement object in player controls
+	mejs.MediaElementPlayer = function(node, o) {
+		// enforce object, even without "new" (via John Resig)
+		if ( !(this instanceof mejs.MediaElementPlayer) ) {
+			return new mejs.MediaElementPlayer(node, o);
+		}
+
+		var t = this;
+
+		// these will be reset after the MediaElement.success fires
+		t.$media = t.$node = $(node);
+		t.node = t.media = t.$media[0];
+
+		// check for existing player
+		if (typeof t.node.player != 'undefined') {
+			return t.node.player;
+		} else {
+			// attach player to DOM node for reference
+			t.node.player = t;
+		}
+
+
+		// try to get options from data-mejsoptions
+		if (typeof o == 'undefined') {
+			o = t.$node.data('mejsoptions');
+		}
+
+		// extend default options
+		t.options = $.extend({},mejs.MepDefaults,o);
+
+		// add to player array (for focus events)
+		mejs.players.push(t);
+
+		// start up
+		t.init();
+
+		return t;
+	};
+
+	// actual player
+	mejs.MediaElementPlayer.prototype = {
+
+		hasFocus: false,
+
+		controlsAreVisible: true,
+
+		init: function() {
+
+			var
+				t = this,
+				mf = mejs.MediaFeatures,
+				// options for MediaElement (shim)
+				meOptions = $.extend(true, {}, t.options, {
+					success: function(media, domNode) { t.meReady(media, domNode); },
+					error: function(e) { t.handleError(e);}
+				}),
+				tagName = t.media.tagName.toLowerCase();
+
+			t.isDynamic = (tagName !== 'audio' && tagName !== 'video');
+
+			if (t.isDynamic) {
+				// get video from src or href?
+				t.isVideo = t.options.isVideo;
+			} else {
+				t.isVideo = (tagName !== 'audio' && t.options.isVideo);
+			}
+
+			// use native controls in iPad, iPhone, and Android
+			if ((mf.isiPad && t.options.iPadUseNativeControls) || (mf.isiPhone && t.options.iPhoneUseNativeControls)) {
+
+				// add controls and stop
+				t.$media.attr('controls', 'controls');
+
+				// attempt to fix iOS 3 bug
+				//t.$media.removeAttr('poster');
+                                // no Issue found on iOS3 -ttroxell
+
+				// override Apple's autoplay override for iPads
+				if (mf.isiPad && t.media.getAttribute('autoplay') !== null) {
+					t.media.load();
+					t.media.play();
+				}
+
+			} else if (mf.isAndroid && t.AndroidUseNativeControls) {
+
+				// leave default player
+
+			} else {
+
+				// DESKTOP: use MediaElementPlayer controls
+
+				// remove native controls
+				t.$media.removeAttr('controls');
+
+				// unique ID
+				t.id = 'mep_' + mejs.mepIndex++;
+
+				// build container
+				t.container =
+					$('<div id="' + t.id + '" class="mejs-container">'+
+						'<div class="mejs-inner">'+
+							'<div class="mejs-mediaelement"></div>'+
+							'<div class="mejs-layers"></div>'+
+							'<div class="mejs-controls"></div>'+
+							'<div class="mejs-clear"></div>'+
+						'</div>' +
+					'</div>')
+					.addClass(t.$media[0].className)
+					.insertBefore(t.$media);
+
+				// add classes for user and content
+				t.container.addClass(
+					(mf.isAndroid ? 'mejs-android ' : '') +
+					(mf.isiOS ? 'mejs-ios ' : '') +
+					(mf.isiPad ? 'mejs-ipad ' : '') +
+					(mf.isiPhone ? 'mejs-iphone ' : '') +
+					(t.isVideo ? 'mejs-video ' : 'mejs-audio ')
+				);
+
+
+				// move the <video/video> tag into the right spot
+				if (mf.isiOS) {
+
+					// sadly, you can't move nodes in iOS, so we have to destroy and recreate it!
+					var $newMedia = t.$media.clone();
+
+					t.container.find('.mejs-mediaelement').append($newMedia);
+
+					t.$media.remove();
+					t.$node = t.$media = $newMedia;
+					t.node = t.media = $newMedia[0]
+
+				} else {
+
+					// normal way of moving it into place (doesn't work on iOS)
+					t.container.find('.mejs-mediaelement').append(t.$media);
+				}
+
+				// find parts
+				t.controls = t.container.find('.mejs-controls');
+				t.layers = t.container.find('.mejs-layers');
+
+				// determine the size
+
+				/* size priority:
+					(1) videoWidth (forced),
+					(2) style="width;height;"
+					(3) width attribute,
+					(4) defaultVideoWidth (for unspecified cases)
+				*/
+
+				var capsTagName = tagName.substring(0,1).toUpperCase() + tagName.substring(1);
+
+				if (t.options[tagName + 'Width'] > 0 || t.options[tagName + 'Width'].toString().indexOf('%') > -1) {
+					t.width = t.options[tagName + 'Width'];
+				} else if (t.media.style.width !== '' && t.media.style.width !== null) {
+					t.width = t.media.style.width;
+				} else if (t.media.getAttribute('width') !== null) {
+					t.width = t.$media.attr('width');
+				} else {
+					t.width = t.options['default' + capsTagName + 'Width'];
+				}
+
+				if (t.options[tagName + 'Height'] > 0 || t.options[tagName + 'Height'].toString().indexOf('%') > -1) {
+					t.height = t.options[tagName + 'Height'];
+				} else if (t.media.style.height !== '' && t.media.style.height !== null) {
+					t.height = t.media.style.height;
+				} else if (t.$media[0].getAttribute('height') !== null) {
+					t.height = t.$media.attr('height');
+				} else {
+					t.height = t.options['default' + capsTagName + 'Height'];
+				}
+
+				// set the size, while we wait for the plugins to load below
+				t.setPlayerSize(t.width, t.height);
+
+				// create MediaElementShim
+				meOptions.pluginWidth = t.height;
+				meOptions.pluginHeight = t.width;
+			}
+
+
+
+			// create MediaElement shim
+			mejs.MediaElement(t.$media[0], meOptions);
+		},
+
+		showControls: function(doAnimation) {
+			var t = this;
+
+			doAnimation = typeof doAnimation == 'undefined' || doAnimation;
+
+			if (t.controlsAreVisible)
+				return;
+
+			if (doAnimation) {
+				t.controls
+					.css('visibility','visible')
+					.stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});
+
+				// any additional controls people might add and want to hide
+				t.container.find('.mejs-control')
+					.css('visibility','visible')
+					.stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});
+
+			} else {
+				t.controls
+					.css('visibility','visible')
+					.css('display','block');
+
+				// any additional controls people might add and want to hide
+				t.container.find('.mejs-control')
+					.css('visibility','visible')
+					.css('display','block');
+
+				t.controlsAreVisible = true;
+			}
+
+			t.setControlsSize();
+
+		},
+
+		hideControls: function(doAnimation) {
+			var t = this;
+
+			doAnimation = typeof doAnimation == 'undefined' || doAnimation;
+
+			if (!t.controlsAreVisible)
+				return;
+
+			if (doAnimation) {
+				// fade out main controls
+				t.controls.stop(true, true).fadeOut(200, function() {
+					$(this)
+						.css('visibility','hidden')
+						.css('display','block');
+
+					t.controlsAreVisible = false;
+				});
+
+				// any additional controls people might add and want to hide
+				t.container.find('.mejs-control').stop(true, true).fadeOut(200, function() {
+					$(this)
+						.css('visibility','hidden')
+						.css('display','block');
+				});
+			} else {
+
+				// hide main controls
+				t.controls
+					.css('visibility','hidden')
+					.css('display','block');
+
+				// hide others
+				t.container.find('.mejs-control')
+					.css('visibility','hidden')
+					.css('display','block');
+
+				t.controlsAreVisible = false;
+			}
+		},
+
+		controlsTimer: null,
+
+		startControlsTimer: function(timeout) {
+
+			var t = this;
+
+			timeout = typeof timeout != 'undefined' ? timeout : 1500;
+
+			t.killControlsTimer('start');
+
+			t.controlsTimer = setTimeout(function() {
+				//console.log('timer fired');
+				t.hideControls();
+				t.killControlsTimer('hide');
+			}, timeout);
+		},
+
+		killControlsTimer: function(src) {
+
+			var t = this;
+
+			if (t.controlsTimer !== null) {
+				clearTimeout(t.controlsTimer);
+				delete t.controlsTimer;
+				t.controlsTimer = null;
+			}
+		},
+
+		controlsEnabled: true,
+
+		disableControls: function() {
+			var t= this;
+
+			t.killControlsTimer();
+			t.hideControls(false);
+			this.controlsEnabled = false;
+		},
+
+		enableControls: function() {
+			var t= this;
+
+			t.showControls(false);
+
+			t.controlsEnabled = true;
+		},
+
+
+		// Sets up all controls and events
+		meReady: function(media, domNode) {
+
+
+			var t = this,
+				mf = mejs.MediaFeatures,
+				autoplayAttr = domNode.getAttribute('autoplay'),
+				autoplay = !(typeof autoplayAttr == 'undefined' || autoplayAttr === null || autoplayAttr === 'false'),
+				featureIndex,
+				feature;
+
+			// make sure it can't create itself again if a plugin reloads
+			if (t.created)
+				return;
+			else
+				t.created = true;
+
+			t.media = media;
+			t.domNode = domNode;
+
+			if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) {
+
+				// two built in features
+				t.buildposter(t, t.controls, t.layers, t.media);
+				t.buildkeyboard(t, t.controls, t.layers, t.media);
+				t.buildoverlays(t, t.controls, t.layers, t.media);
+
+				// grab for use by features
+				t.findTracks();
+
+				// add user-defined features/controls
+				for (featureIndex in t.options.features) {
+					feature = t.options.features[featureIndex];
+					if (t['build' + feature]) {
+						try {
+							t['build' + feature](t, t.controls, t.layers, t.media);
+						} catch (e) {
+							// TODO: report control error
+							//throw e;
+							//console.log('error building ' + feature);
+							//console.log(e);
+						}
+					}
+				}
+
+				t.container.trigger('controlsready');
+
+				// reset all layers and controls
+				t.setPlayerSize(t.width, t.height);
+				t.setControlsSize();
+
+
+				// controls fade
+				if (t.isVideo) {
+
+					if (mejs.MediaFeatures.hasTouch) {
+
+						// for touch devices (iOS, Android)
+						// show/hide without animation on touch
+
+						t.$media.bind('touchstart', function() {
+
+
+							// toggle controls
+							if (t.controlsAreVisible) {
+								t.hideControls(false);
+							} else {
+								if (t.controlsEnabled) {
+									t.showControls(false);
+								}
+							}
+						});
+
+					} else {
+						// click controls
+						var clickElement = (t.media.pluginType == 'native') ? t.$media : $(t.media.pluginElement);
+
+						// click to play/pause
+						clickElement.click(function() {
+							if (media.paused) {
+								media.play();
+							} else {
+								media.pause();
+							}
+						});
+
+
+						// show/hide controls
+						t.container
+							.bind('mouseenter mouseover', function () {
+								if (t.controlsEnabled) {
+									if (!t.options.alwaysShowControls) {
+										t.killControlsTimer('enter');
+										t.showControls();
+										t.startControlsTimer(2500);
+									}
+								}
+							})
+							.bind('mousemove', function() {
+								if (t.controlsEnabled) {
+									if (!t.controlsAreVisible) {
+										t.showControls();
+									}
+									//t.killControlsTimer('move');
+									if (!t.options.alwaysShowControls) {
+										t.startControlsTimer(2500);
+									}
+								}
+							})
+							.bind('mouseleave', function () {
+								if (t.controlsEnabled) {
+									if (!t.media.paused && !t.options.alwaysShowControls) {
+										t.startControlsTimer(1000);
+									}
+								}
+							});
+					}
+
+					// check for autoplay
+					if (autoplay && !t.options.alwaysShowControls) {
+						t.hideControls();
+					}
+
+					// resizer
+					if (t.options.enableAutosize) {
+						t.media.addEventListener('loadedmetadata', function(e) {
+							// if the <video height> was not set and the options.videoHeight was not set
+							// then resize to the real dimensions
+							if (t.options.videoHeight <= 0 && t.domNode.getAttribute('height') === null && !isNaN(e.target.videoHeight)) {
+								t.setPlayerSize(e.target.videoWidth, e.target.videoHeight);
+								t.setControlsSize();
+								t.media.setVideoSize(e.target.videoWidth, e.target.videoHeight);
+							}
+						}, false);
+					}
+				}
+
+				// EVENTS
+
+				// FOCUS: when a video starts playing, it takes focus from other players (possibily pausing them)
+				media.addEventListener('play', function() {
+
+						// go through all other players
+						for (var i=0, il=mejs.players.length; i<il; i++) {
+							var p = mejs.players[i];
+							if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) {
+								p.pause();
+							}
+							p.hasFocus = false;
+						}
+
+						t.hasFocus = true;
+				},false);
+
+
+				// ended for all
+				t.media.addEventListener('ended', function (e) {
+					try{
+						t.media.setCurrentTime(0);
+					} catch (exp) {
+
+					}
+					t.media.pause();
+
+					if (t.setProgressRail)
+						t.setProgressRail();
+					if (t.setCurrentRail)
+						t.setCurrentRail();
+
+					if (t.options.loop) {
+						t.media.play();
+					} else if (!t.options.alwaysShowControls && t.controlsEnabled) {
+						t.showControls();
+					}
+				}, false);
+
+				// resize on the first play
+				t.media.addEventListener('loadedmetadata', function(e) {
+					if (t.updateDuration) {
+						t.updateDuration();
+					}
+					if (t.updateCurrent) {
+						t.updateCurrent();
+					}
+
+					if (!t.isFullScreen) {
+						t.setPlayerSize(t.width, t.height);
+						t.setControlsSize();
+					}
+				}, false);
+
+
+				// webkit has trouble doing this without a delay
+				setTimeout(function () {
+					t.setPlayerSize(t.width, t.height);
+					t.setControlsSize();
+				}, 50);
+
+				// adjust controls whenever window sizes (used to be in fullscreen only)
+				$(window).resize(function() {
+
+					// don't resize for fullscreen mode
+					if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) {
+						t.setPlayerSize(t.width, t.height);
+					}
+
+					// always adjust controls
+					t.setControlsSize();
+				});
+
+				// TEMP: needs to be moved somewhere else
+				if (t.media.pluginType == 'youtube') {
+					t.container.find('.mejs-overlay-play').hide();
+				}
+			}
+
+			// force autoplay for HTML5
+			if (autoplay && media.pluginType == 'native') {
+				media.load();
+				media.play();
+			}
+
+
+			if (t.options.success) {
+
+				if (typeof t.options.success == 'string') {
+						window[t.options.success](t.media, t.domNode, t);
+				} else {
+						t.options.success(t.media, t.domNode, t);
+				}
+			}
+		},
+
+		handleError: function(e) {
+			var t = this;
+
+			t.controls.hide();
+
+			// Tell user that the file cannot be played
+			if (t.options.error) {
+				t.options.error(e);
+			}
+		},
+
+		// added by @edsilv
+		resize: function() {
+			var t = this;
+
+			t.setPlayerSize();
+			t.setControlsSize();
+		},
+
+        // altered by @edsilv
+		setPlayerSize: function() {
+            var t = this;
+
+			if (typeof width != 'undefined')
+				t.width = width;
+
+			if (typeof height != 'undefined')
+				t.height = height;
+
+			// do we have the native dimensions yet?
+			var nativeWidth = (t.media.videoWidth && t.media.videoWidth > 0) ? t.media.videoWidth : t.options.defaultVideoWidth;
+            var nativeHeight = (t.media.videoHeight && t.media.videoHeight > 0) ? t.media.videoHeight : t.options.defaultVideoHeight;
+			var ratio = nativeHeight/nativeWidth;
+            var parentWidth = t.container.parent().width();
+            var parentHeight = t.container.parent().height();
+			var newHeight = parseInt(parentWidth * ratio, 10);
+            var newWidth = parentWidth;
+
+            if (newHeight > parentHeight){
+                newHeight = parentHeight;
+                newWidth = parseInt(parentHeight / ratio, 10);
+            }
+
+			// set outer container size
+			t.container
+				.width(newWidth)
+				.height(newHeight);
+
+			// set native <video>
+			t.$media
+				.width('100%')
+				.height('100%');
+
+			// set shims
+			t.container.find('object, embed, iframe')
+				.width('100%')
+				.height('100%');
+
+			// if shim is ready, send the size to the embeded plugin
+			if (t.media.setVideoSize)
+				t.media.setVideoSize(parentWidth, newHeight);
+
+			// set the layers
+			t.layers.children('.mejs-layer')
+				.width('100%')
+				.height('100%');
+		},
+
+		setControlsSize: function() {
+
+            var t = this,
+				usedWidth = 0,
+				railWidth = 0,
+                play = t.controls.find('.mejs-playpause-button'),
+				rail = t.controls.find('.mejs-time-rail'),
+				total = t.controls.find('.mejs-time-total'),
+				currentTime = t.controls.find('.mejs-currenttime-container'),
+                duration = t.controls.find('.mejs-duration-container'),
+				loaded = t.controls.find('.mejs-time-loaded'),
+                volume = t.controls.find('.mejs-volume-button'),
+                fullscreen = t.controls.find('.mejs-fullscreen-button'),
+                volumeSlider = t.controls.find('.mejs-horizontal-volume-slider');
+
+
+			// allow the size to come from custom CSS
+			if (t.options && !t.options.autosizeProgress) {
+				// Also, frontends devs can be more flexible
+				// due the opportunity of absolute positioning.
+				railWidth = parseInt(rail.css('width'));
+			}
+
+            // altered by @edsilv
+            t.controls.width(t.controls.parent().width() - 18);
+
+            railWidth = t.controls.width() - play.outerWidth(true) - currentTime.outerWidth(true) - duration.outerWidth(true) - volume.outerWidth(true) - volumeSlider.outerWidth(true) - fullscreen.outerWidth(true);
+
+            var railLeft = rail.position().left;
+
+            rail.css({
+                'left': play.outerWidth(true)
+            });
+
+            currentTime.css({
+                'left': railLeft + railWidth
+            });
+
+            var durationLeft = railLeft + railWidth + currentTime.outerWidth(true);
+
+            duration.css({
+                'left': durationLeft
+            });
+
+            var volumeLeft = railLeft + railWidth + currentTime.outerWidth(true) + duration.outerWidth(true);
+
+            volume.css({
+                'left': volumeLeft
+            });
+
+            var volumeSliderLeft = railLeft + railWidth + currentTime.outerWidth(true) + duration.outerWidth(true) + volume.outerWidth(true);
+
+            volumeSlider.css({
+                'left': volumeSliderLeft
+            });
+
+            var fullscreenLeft = railLeft + railWidth + currentTime.outerWidth(true) + duration.outerWidth(true) + volume.outerWidth(true) + volumeSlider.outerWidth(true);
+
+            fullscreen.css({
+                'left': fullscreenLeft
+            });
+
+			// outer area
+			rail.width(railWidth);
+			// dark space
+			total.width(railWidth - (total.outerWidth(true) - total.width()));
+
+			if (t.setProgressRail)
+				t.setProgressRail();
+			if (t.setCurrentRail)
+				t.setCurrentRail();
+		},
+
+
+		buildposter: function(player, controls, layers, media) {
+			var t = this,
+				poster =
+				$('<div class="mejs-poster mejs-layer">' +
+				'</div>')
+					.appendTo(layers),
+				posterUrl = player.$media.attr('poster');
+
+			// prioriy goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster)
+			if (player.options.poster !== '') {
+				posterUrl = player.options.poster;
+			}
+
+			// second, try the real poster
+			if (posterUrl !== '' && posterUrl != null) {
+				t.setPoster(posterUrl);
+			} else {
+				poster.hide();
+			}
+
+			media.addEventListener('play',function() {
+				poster.hide();
+			}, false);
+		},
+
+		setPoster: function(url) {
+			var t = this,
+				posterDiv = t.container.find('.mejs-poster'),
+				posterImg = posterDiv.find('img');
+
+			if (posterImg.length == 0) {
+				posterImg = $('<img width="100%" height="100%" />').appendTo(posterDiv);
+			}
+
+			posterImg.attr('src', url);
+		},
+
+		buildoverlays: function(player, controls, layers, media) {
+			if (!player.isVideo)
+				return;
+
+			var
+			loading =
+				$('<div class="mejs-overlay mejs-layer">'+
+					'<div class="mejs-overlay-loading"><span></span></div>'+
+				'</div>')
+				.hide() // start out hidden
+				.appendTo(layers),
+			error =
+				$('<div class="mejs-overlay mejs-layer">'+
+					'<div class="mejs-overlay-error"></div>'+
+				'</div>')
+				.hide() // start out hidden
+				.appendTo(layers),
+
+			// this needs to come last so it's on top
+			bigPlay =
+				$('<div class="mejs-overlay mejs-layer mejs-overlay-play">'+
+					'<div class="mejs-overlay-button"></div>'+
+				'</div>')
+				.appendTo(layers)
+				.click(function() {
+					if (media.paused) {
+						media.play();
+					} else {
+						media.pause();
+					}
+				});
+
+			/*
+			if (mejs.MediaFeatures.isiOS || mejs.MediaFeatures.isAndroid) {
+				bigPlay.remove();
+				loading.remove();
+			}
+			*/
+
+
+			// show/hide big play button
+			media.addEventListener('play',function() {
+				bigPlay.hide();
+				loading.hide();
+				error.hide();
+			}, false);
+
+			media.addEventListener('playing', function() {
+				bigPlay.hide();
+				loading.hide();
+				error.hide();
+			}, false);
+
+			media.addEventListener('pause',function() {
+				if (!mejs.MediaFeatures.isiPhone) {
+					bigPlay.show();
+				}
+			}, false);
+
+			media.addEventListener('waiting', function() {
+				loading.show();
+			}, false);
+
+
+			// show/hide loading
+			media.addEventListener('loadeddata',function() {
+				// for some reason Chrome is firing this event
+				//if (mejs.MediaFeatures.isChrome && media.getAttribute && media.getAttribute('preload') === 'none')
+				//	return;
+
+				loading.show();
+			}, false);
+			media.addEventListener('canplay',function() {
+				loading.hide();
+			}, false);
+
+			// error handling
+			media.addEventListener('error',function() {
+				loading.hide();
+				error.show();
+				error.find('mejs-overlay-error').html("Error loading this resource");
+			}, false);
+		},
+
+		buildkeyboard: function(player, controls, layers, media) {
+
+				var t = this;
+
+				// listen for key presses
+				$(document).keydown(function(e) {
+
+						if (player.hasFocus && player.options.enableKeyboard) {
+
+								// find a matching key
+								for (var i=0, il=player.options.keyActions.length; i<il; i++) {
+										var keyAction = player.options.keyActions[i];
+
+										for (var j=0, jl=keyAction.keys.length; j<jl; j++) {
+												if (e.keyCode == keyAction.keys[j]) {
+														e.preventDefault();
+														keyAction.action(player, media);
+														return false;
+												}
+										}
+								}
+						}
+
+						return true;
+				});
+
+				// check if someone clicked outside a player region, then kill its focus
+				$(document).click(function(event) {
+						if ($(event.target).closest('.mejs-container').length == 0) {
+								player.hasFocus = false;
+						}
+				});
+
+		},
+
+		findTracks: function() {
+			var t = this,
+				tracktags = t.$media.find('track');
+
+			// store for use by plugins
+			t.tracks = [];
+			tracktags.each(function(index, track) {
+
+				track = $(track);
+
+				t.tracks.push({
+					srclang: track.attr('srclang').toLowerCase(),
+					src: track.attr('src'),
+					kind: track.attr('kind'),
+					label: track.attr('label') || '',
+					entries: [],
+					isLoaded: false
+				});
+			});
+		},
+		changeSkin: function(className) {
+			this.container[0].className = 'mejs-container ' + className;
+			this.setPlayerSize(this.width, this.height);
+			this.setControlsSize();
+		},
+		play: function() {
+			this.media.play();
+		},
+		pause: function() {
+			this.media.pause();
+		},
+		load: function() {
+			this.media.load();
+		},
+		setMuted: function(muted) {
+			this.media.setMuted(muted);
+		},
+		setCurrentTime: function(time) {
+			this.media.setCurrentTime(time);
+		},
+		getCurrentTime: function() {
+			return this.media.currentTime;
+		},
+		setVolume: function(volume) {
+			this.media.setVolume(volume);
+		},
+		getVolume: function() {
+			return this.media.volume;
+		},
+		setSrc: function(src) {
+			this.media.setSrc(src);
+		},
+		remove: function() {
+			var t = this;
+
+			if (t.media.pluginType == 'flash') {
+				t.media.remove();
+			} else if (t.media.pluginType == 'native') {
+				t.media.prop('controls', true);
+			}
+
+			// grab video and put it back in place
+			if (!t.isDynamic) {
+				t.$node.insertBefore(t.container)
+			}
+
+			t.container.remove();
+		}
+	};
+
+	// turn into jQuery plugin
+	if (typeof jQuery != 'undefined') {
+		jQuery.fn.mediaelementplayer = function (options) {
+			return this.each(function () {
+				new mejs.MediaElementPlayer(this, options);
+			});
+		};
+	}
+
+	$(document).ready(function() {
+		// auto enable using JSON attribute
+		$('.mejs-player').mediaelementplayer();
+	});
+
+	// push out to window
+	window.MediaElementPlayer = mejs.MediaElementPlayer;
+
+})(mejs.$);
+
+(function($) {
+
+	$.extend(mejs.MepDefaults, {
+		playpauseText: 'Play/Pause'
+	});
+
+	// PLAY/pause BUTTON
+	$.extend(MediaElementPlayer.prototype, {
+		buildplaypause: function(player, controls, layers, media) {
+			var
+				t = this,
+				play =
+				$('<div class="mejs-button mejs-playpause-button mejs-play" >' +
+					'<button type="button" aria-controls="' + t.id + '" title="' + t.options.playpauseText + '"></button>' +
+				'</div>')
+				.appendTo(controls)
+				.click(function(e) {
+					e.preventDefault();
+
+					if (media.paused) {
+						media.play();
+					} else {
+						media.pause();
+					}
+
+					return false;
+				});
+
+			media.addEventListener('play',function() {
+				play.removeClass('mejs-play').addClass('mejs-pause');
+			}, false);
+			media.addEventListener('playing',function() {
+				play.removeClass('mejs-play').addClass('mejs-pause');
+			}, false);
+
+
+			media.addEventListener('pause',function() {
+				play.removeClass('mejs-pause').addClass('mejs-play');
+			}, false);
+			media.addEventListener('paused',function() {
+				play.removeClass('mejs-pause').addClass('mejs-play');
+			}, false);
+		}
+	});
+
+})(mejs.$);
+(function($) {
+
+	$.extend(mejs.MepDefaults, {
+		stopText: 'Stop'
+	});
+
+	// STOP BUTTON
+	$.extend(MediaElementPlayer.prototype, {
+		buildstop: function(player, controls, layers, media) {
+			var t = this,
+				stop =
+				$('<div class="mejs-button mejs-stop-button mejs-stop">' +
+					'<button type="button" aria-controls="' + t.id + '" title="' + t.options.stopText + '"></button>' +
+				'</div>')
+				.appendTo(controls)
+				.click(function() {
+					if (!media.paused) {
+						media.pause();
+					}
+					if (media.currentTime > 0) {
+						media.setCurrentTime(0);
+						controls.find('.mejs-time-current').width('0px');
+						controls.find('.mejs-time-handle').css('left', '0px');
+						controls.find('.mejs-time-float-current').html( mejs.Utility.secondsToTimeCode(0) );
+						controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0) );
+						layers.find('.mejs-poster').show();
+					}
+				});
+		}
+	});
+
+})(mejs.$);
+(function($) {
+	// progress/loaded bar
+	$.extend(MediaElementPlayer.prototype, {
+		buildprogress: function(player, controls, layers, media) {
+
+			$('<div class="mejs-time-rail">'+
+				'<span class="mejs-time-total">'+
+					'<span class="mejs-time-loaded"></span>'+
+					'<span class="mejs-time-current"></span>'+
+					'<span class="mejs-time-handle"></span>'+
+					'<div class="mejs-time-float">' +
+						'<div class="mejs-time-float-current">00:00</div>' +
+						'<div class="mejs-time-float-corner"></div>' +
+					'</div>'+
+				'</span>'+
+			'</div>')
+				.appendTo(controls);
+
+			var
+				t = this,
+				total = controls.find('.mejs-time-total'),
+				loaded  = controls.find('.mejs-time-loaded'),
+				current  = controls.find('.mejs-time-current'),
+				handle  = controls.find('.mejs-time-handle'),
+				timefloat  = controls.find('.mejs-time-float'),
+                timefloatcurrent  = controls.find('.mejs-time-float-current'),
+				handleMouseMove = function (e) {
+					// mouse position relative to the object
+
+					// touch handling added by @edsilv
+					var x;
+
+					if (e.type === 'touchmove'){
+						x = e.originalEvent.touches[0].pageX;
+					} else {
+						x = e.pageX;
+					}
+
+					var offset = total.offset(),
+						width = total.outerWidth(),
+						percentage = 0,
+						newTime = 0,
+						pos = x - offset.left;
+
+
+					if (x > offset.left && x <= width + offset.left && media.duration) {
+						percentage = ((x - offset.left) / width);
+						newTime = (percentage <= 0.02) ? 0 : percentage * media.duration;
+
+						// seek to where the mouse is
+						if (mouseIsDown) {
+							media.setCurrentTime(newTime);
+						}
+
+						// position floating time box
+						if (!mejs.MediaFeatures.hasTouch) {
+                            timefloat.css('left', pos);
+							timefloatcurrent.html( mejs.Utility.secondsToTimeCode(newTime) );
+							timefloat.show();
+						}
+					}
+				},
+				mouseIsDown = false,
+				mouseIsOver = false;
+
+			// handle clicks
+			//controls.find('.mejs-time-rail').delegate('span', 'click', handleMouseMove);
+			total
+				.bind('mousedown touchstart', function (e) {
+					// only handle left clicks
+					if (e.which === 1 || e.type === 'touchstart') {
+						mouseIsDown = true;
+						handleMouseMove(e);
+						return false;
+					}
+				});
+
+			controls.find('.mejs-time-total')
+				.bind('mouseenter', function(e) {
+					mouseIsOver = true;
+					if (!mejs.MediaFeatures.hasTouch) {
+						timefloat.show();
+					}
+				})
+				.bind('mouseleave',function(e) {
+					mouseIsOver = false;
+					timefloat.hide();
+				});
+
+			$(document)
+				.bind('mouseup touchend', function (e) {
+					mouseIsDown = false;
+					timefloat.hide();
+					//handleMouseMove(e);
+				})
+				.bind('mousemove touchmove', function (e) {
+					if (mouseIsDown || mouseIsOver) {
+						handleMouseMove(e);
+					}
+				});
+
+			// loading
+			media.addEventListener('progress', function (e) {
+				player.setProgressRail(e);
+				player.setCurrentRail(e);
+			}, false);
+
+			// current time
+			media.addEventListener('timeupdate', function(e) {
+				player.setProgressRail(e);
+				player.setCurrentRail(e);
+			}, false);
+
+
+			// store for later use
+			t.loaded = loaded;
+			t.total = total;
+			t.current = current;
+			t.handle = handle;
+		},
+		setProgressRail: function(e) {
+
+			var
+				t = this,
+				target = (e != undefined) ? e.target : t.media,
+				percent = null;
+
+			// newest HTML5 spec has buffered array (FF4, Webkit)
+			if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) {
+				// TODO: account for a real array with multiple values (only Firefox 4 has this so far)
+				percent = target.buffered.end(0) / target.duration;
+			}
+			// Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end()
+			// to be anything other than 0. If the byte count is available we use this instead.
+			// Browsers that support the else if do not seem to have the bufferedBytes value and
+			// should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8.
+			else if (target && target.bytesTotal != undefined && target.bytesTotal > 0 && target.bufferedBytes != undefined) {
+				percent = target.bufferedBytes / target.bytesTotal;
+			}
+			// Firefox 3 with an Ogg file seems to go this way
+			else if (e && e.lengthComputable && e.total != 0) {
+				percent = e.loaded/e.total;
+			}
+
+			// finally update the progress bar
+			if (percent !== null) {
+				percent = Math.min(1, Math.max(0, percent));
+				// update loaded bar
+				if (t.loaded && t.total) {
+					t.loaded.width(t.total.width() * percent);
+				}
+			}
+		},
+		setCurrentRail: function() {
+
+			var t = this;
+
+			if (t.media.currentTime != undefined && t.media.duration) {
+
+				// update bar and handle
+				if (t.total && t.handle) {
+					var
+						newWidth = t.total.width() * t.media.currentTime / t.media.duration,
+						handlePos = newWidth - (t.handle.outerWidth(true) / 2);
+
+					t.current.width(newWidth);
+					t.handle.css('left', handlePos);
+				}
+			}
+
+		}
+	});
+})(mejs.$);
+(function($) {
+
+	// options
+	$.extend(mejs.MepDefaults, {
+		duration: -1,
+		timeAndDurationSeparator: ' <span> | </span> '
+	});
+
+
+	// current and duration 00:00 / 00:00
+	$.extend(MediaElementPlayer.prototype, {
+		buildcurrent: function(player, controls, layers, media) {
+			var t = this;
+
+			$('<div class="mejs-time">'+
+					'<span class="mejs-currenttime">' + (player.options.alwaysShowHours ? '00:' : '')
+					+ (player.options.showTimecodeFrameCount? '00:00:00':'00:00')+ '</span><span class="slash">/</span>'+
+					'</div>')
+					.appendTo(controls);
+
+			t.currenttime = t.controls.find('.mejs-currenttime');
+
+			media.addEventListener('timeupdate',function() {
+				player.updateCurrent();
+			}, false);
+		},
+
+
+		buildduration: function(player, controls, layers, media) {
+			var t = this;
+
+			if (controls.children().last().find('.mejs-currenttime').length > 0) {
+				$(t.options.timeAndDurationSeparator +
+					'<span class="mejs-duration">' +
+						(t.options.duration > 0 ?
+							mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount,  t.options.framesPerSecond || 25) :
+				   			((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00'))
+				   		) +
+					'</span>')
+					.appendTo(controls.find('.mejs-time'));
+			} else {
+
+				// add class to current time
+				controls.find('.mejs-currenttime').parent().addClass('mejs-currenttime-container');
+
+				$('<div class="mejs-time mejs-duration-container">'+
+					'<span class="mejs-duration">' +
+						(t.options.duration > 0 ?
+							mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount,  t.options.framesPerSecond || 25) :
+				   			((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00'))
+				   		) +
+					'</span>' +
+				'</div>')
+				.appendTo(controls);
+			}
+
+			t.durationD = t.controls.find('.mejs-duration');
+
+			media.addEventListener('timeupdate',function() {
+				player.updateDuration();
+			}, false);
+		},
+
+		updateCurrent:  function() {
+			var t = this;
+
+			if (t.currenttime) {
+				t.currenttime.html(mejs.Utility.secondsToTimeCode(t.media.currentTime, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount,  t.options.framesPerSecond || 25));
+			}
+		},
+
+		updateDuration: function() {
+			var t = this;
+
+			if (t.media.duration && t.durationD) {
+				t.durationD.html(mejs.Utility.secondsToTimeCode(t.media.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25));
+			}
+		}
+	});
+
+})(mejs.$);
+(function($) {
+
+	$.extend(mejs.MepDefaults, {
+		muteText: 'Volume/mute toggle',
+		hideVolumeOnTouchDevices: true,
+
+		audioVolume: 'horizontal',
+		videoVolume: 'vertical'
+	});
+
+	$.extend(MediaElementPlayer.prototype, {
+		buildvolume: function(player, controls, layers, media) {
+
+			// Android and iOS don't support volume controls
+			if (mejs.MediaFeatures.hasTouch && this.options.hideVolumeOnTouchDevices)
+				return;
+
+			var t = this,
+				mode = (t.isVideo) ? t.options.videoVolume : t.options.audioVolume,
+				mute = (mode == 'horizontal') ?
+
+				// horizontal version
+				$('<div class="mejs-button mejs-volume-button mejs-mute">'+
+					'<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '"></button>'+
+				'</div>' +
+				'<div class="mejs-horizontal-volume-slider">'+ // outer background
+					'<div class="mejs-horizontal-volume-total"></div>'+ // line background
+					'<div class="mejs-horizontal-volume-current"></div>'+ // current volume
+					'<div class="mejs-horizontal-volume-handle"></div>'+ // handle
+				'</div>'
+				)
+					.appendTo(controls) :
+
+				// vertical version
+				$('<div class="mejs-button mejs-volume-button mejs-mute">'+
+					'<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '"></button>'+
+					'<div class="mejs-volume-slider">'+ // outer background
+						'<div class="mejs-volume-total"></div>'+ // line background
+						'<div class="mejs-volume-current"></div>'+ // current volume
+						'<div class="mejs-volume-handle"></div>'+ // handle
+					'</div>'+
+				'</div>')
+					.appendTo(controls),
+			volumeSlider = t.container.find('.mejs-volume-slider, .mejs-horizontal-volume-slider'),
+			volumeTotal = t.container.find('.mejs-volume-total, .mejs-horizontal-volume-total'),
+			volumeCurrent = t.container.find('.mejs-volume-current, .mejs-horizontal-volume-current'),
+			volumeHandle = t.container.find('.mejs-volume-handle, .mejs-horizontal-volume-handle'),
+
+			positionVolumeHandle = function(volume, secondTry) {
+
+				if (!volumeSlider.is(':visible') && typeof secondTry != 'undefined') {
+					volumeSlider.show();
+					positionVolumeHandle(volume, true);
+					volumeSlider.hide()
+					return;
+				}
+
+				// correct to 0-1
+				volume = Math.max(0,volume);
+				volume = Math.min(volume,1);
+
+				// ajust mute button style
+				if (volume == 0) {
+					mute.removeClass('mejs-mute').addClass('mejs-unmute');
+				} else {
+					mute.removeClass('mejs-unmute').addClass('mejs-mute');
+				}
+
+				// position slider
+				if (mode == 'vertical') {
+					var
+
+						// height of the full size volume slider background
+						totalHeight = volumeTotal.height(),
+
+						// top/left of full size volume slider background
+						totalPosition = volumeTotal.position(),
+
+						// the new top position based on the current volume
+						// 70% volume on 100px height == top:30px
+						newTop = totalHeight - (totalHeight * volume);
+
+					// handle
+					volumeHandle.css('top', totalPosition.top + newTop - (volumeHandle.height() / 2));
+
+					// show the current visibility
+					volumeCurrent.height(totalHeight - newTop );
+                    //volumeCurrent.height(totalHeight);
+                    //console.log(totalPosition.top);
+					volumeCurrent.css('top', totalPosition.top + newTop);
+                    //volumeCurrent.css('top', totalPosition.top);
+				} else {
+					var
+
+						// height of the full size volume slider background
+						totalWidth = volumeTotal.width(),
+
+						// top/left of full size volume slider background
+						totalPosition = volumeTotal.position(),
+
+						// the new left position based on the current volume
+						newLeft = totalWidth * volume;
+
+					// handle
+					volumeHandle.css('left', totalPosition.left + newLeft - (volumeHandle.width() / 2));
+
+					// rezize the current part of the volume bar
+					volumeCurrent.width( newLeft );
+				}
+			},
+			handleVolumeMove = function(e) {
+
+				var volume = null,
+					totalOffset = volumeTotal.offset();
+
+				// calculate the new volume based on the moust position
+				if (mode == 'vertical') {
+
+					var
+						railHeight = volumeTotal.height(),
+						totalTop = parseInt(volumeTotal.css('top').replace(/px/,''),10),
+						newY = e.pageY - totalOffset.top;
+
+					volume = (railHeight - newY) / railHeight;
+
+					// the controls just hide themselves (usually when mouse moves too far up)
+					if (totalOffset.top == 0 || totalOffset.left == 0)
+						return;
+
+				} else {
+					var
+						railWidth = volumeTotal.width(),
+						newX = e.pageX - totalOffset.left;
+
+					volume = newX / railWidth;
+				}
+
+				// ensure the volume isn't outside 0-1
+				volume = Math.max(0,volume);
+				volume = Math.min(volume,1);
+
+				// position the slider and handle
+				positionVolumeHandle(volume);
+
+				// set the media object (this will trigger the volumechanged event)
+				if (volume == 0) {
+					media.setMuted(true);
+				} else {
+					media.setMuted(false);
+				}
+				media.setVolume(volume);
+			},
+			mouseIsDown = false,
+			mouseIsOver = false;
+
+			// SLIDER
+
+			mute
+				.hover(function() {
+					volumeSlider.show();
+					mouseIsOver = true;
+				}, function() {
+					mouseIsOver = false;
+
+					if (!mouseIsDown && mode == 'vertical')	{
+						volumeSlider.hide();
+					}
+				});
+
+			volumeSlider
+				.bind('mouseover', function() {
+					mouseIsOver = true;
+				})
+				.bind('mousedown', function (e) {
+					handleVolumeMove(e);
+					mouseIsDown = true;
+
+					return false;
+				});
+
+			$(document)
+				.bind('mouseup', function (e) {
+					mouseIsDown = false;
+
+					if (!mouseIsOver && mode == 'vertical') {
+						volumeSlider.hide();
+					}
+				})
+				.bind('mousemove', function (e) {
+					if (mouseIsDown) {
+						handleVolumeMove(e);
+					}
+				});
+
+
+			// MUTE button
+			mute.find('button').click(function() {
+				media.setMuted( !media.muted );
+			});
+
+			// listen for volume change events from other sources
+			media.addEventListener('volumechange', function(e) {
+				if (!mouseIsDown) {
+					if (media.muted) {
+						positionVolumeHandle(0);
+						mute.removeClass('mejs-mute').addClass('mejs-unmute');
+					} else {
+						positionVolumeHandle(media.volume);
+						mute.removeClass('mejs-unmute').addClass('mejs-mute');
+					}
+				}
+			}, false);
+
+			if (t.container.is(':visible')) {
+				// set initial volume
+				positionVolumeHandle(player.options.startVolume);
+
+				// shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements
+				if (media.pluginType === 'native') {
+					media.setVolume(player.options.startVolume);
+				}
+			}
+		}
+	});
+
+})(mejs.$);
+
+(function($) {
+
+	$.extend(mejs.MepDefaults, {
+		usePluginFullScreen: true,
+		newWindowCallback: function() { return '';},
+		fullscreenText: 'Fullscreen'
+	});
+
+	$.extend(MediaElementPlayer.prototype, {
+
+		isFullScreen: false,
+
+		isNativeFullScreen: false,
+
+		docStyleOverflow: null,
+
+		isInIframe: false,
+
+		buildfullscreen: function(player, controls, layers, media) {
+
+			if (!player.isVideo)
+				return;
+
+			player.isInIframe = (window.location != window.parent.location);
+
+			// native events
+			if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
+
+				// chrome doesn't alays fire this in an iframe
+				player.container.bind(mejs.MediaFeatures.fullScreenEventName, function(e) {
+				//player.container.bind('webkitfullscreenchange', function(e) {
+
+
+					if (mejs.MediaFeatures.isFullScreen()) {
+						player.isNativeFullScreen = true;
+						// reset the controls once we are fully in full screen
+						player.setControlsSize();
+					} else {
+						player.isNativeFullScreen = false;
+						// when a user presses ESC
+						// make sure to put the player back into place
+						player.exitFullScreen();
+					}
+				});
+			}
+
+			var t = this,
+				normalHeight = 0,
+				normalWidth = 0,
+				container = player.container,
+				fullscreenBtn =
+					$('<div class="mejs-button mejs-fullscreen-button">' +
+						'<button type="button" aria-controls="' + t.id + '" title="' + t.options.fullscreenText + '"></button>' +
+					'</div>')
+					.appendTo(controls);
+
+				if (t.media.pluginType === 'native' || (!t.options.usePluginFullScreen && !mejs.MediaFeatures.isFirefox)) {
+
+					fullscreenBtn.click(function() {
+						var isFullScreen = (mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || player.isFullScreen;
+
+						if (isFullScreen) {
+							player.exitFullScreen();
+						} else {
+							player.enterFullScreen();
+						}
+					});
+
+				} else {
+
+                    // @edsilv: remove play overlay for flash version as it obscures full screen button.
+                    if (mejs.MediaFeatures.isFirefox){
+                        t.container.find('.mejs-overlay-play').remove();
+                    }
+
+					var hideTimeout = null,
+						supportsPointerEvents = (document.documentElement.style.pointerEvents === '');
+
+                    // @edsilv: IE7 and 8 don't support clicking through the fullscreen buttons
+                    // down to Flash.
+					if (supportsPointerEvents && !mejs.MediaFeatures.isOpera) { // opera doesn't allow this :(
+
+						// allows clicking through the fullscreen button and controls down directly to Flash
+
+						/*
+						 When a user puts his mouse over the fullscreen button, the controls are disabled
+						 So we put a div over the video and another one on iether side of the fullscreen button
+						 that caputre mouse movement
+						 and restore the controls once the mouse moves outside of the fullscreen button
+						*/
+
+						var fullscreenIsDisabled = false,
+							restoreControls = function() {
+								if (fullscreenIsDisabled) {
+									// hide the hovers
+									videoHoverDiv.hide();
+									controlsLeftHoverDiv.hide();
+									controlsRightHoverDiv.hide();
+
+									// restore the control bar
+									fullscreenBtn.css('pointer-events', '');
+									t.controls.css('pointer-events', '');
+
+									// store for later
+									fullscreenIsDisabled = false;
+								}
+							},
+							videoHoverDiv = $('<div class="mejs-fullscreen-hover" />').appendTo(t.container).mouseover(restoreControls),
+							controlsLeftHoverDiv = $('<div class="mejs-fullscreen-hover"  />').appendTo(t.container).mouseover(restoreControls),
+							controlsRightHoverDiv = $('<div class="mejs-fullscreen-hover"  />').appendTo(t.container).mouseover(restoreControls),
+							positionHoverDivs = function() {
+								var style = {position: 'absolute', top: 0, left: 0}; //, backgroundColor: '#f00'};
+								videoHoverDiv.css(style);
+								controlsLeftHoverDiv.css(style);
+								controlsRightHoverDiv.css(style);
+
+								// over video, but not controls
+								videoHoverDiv
+									.width( t.container.width() )
+									.height( t.container.height() - t.controls.height() );
+
+								// over controls, but not the fullscreen button
+								var fullScreenBtnOffset = fullscreenBtn.offset().left - t.container.offset().left;
+									fullScreenBtnWidth = fullscreenBtn.outerWidth(true);
+
+								controlsLeftHoverDiv
+									.width( fullScreenBtnOffset )
+									.height( t.controls.height() )
+									.css({top: t.container.height() - t.controls.height()});
+
+								// after the fullscreen button
+								controlsRightHoverDiv
+									.width( t.container.width() - fullScreenBtnOffset - fullScreenBtnWidth )
+									.height( t.controls.height() )
+									.css({top: t.container.height() - t.controls.height(),
+										 left: fullScreenBtnOffset + fullScreenBtnWidth});
+							};
+
+						$(document).resize(function() {
+							positionHoverDivs();
+						});
+
+						// on hover, kill the fullscreen button's HTML handling, allowing clicks down to Flash
+						fullscreenBtn
+							.mouseover(function() {
+
+								if (!t.isFullScreen) {
+
+									var buttonPos = fullscreenBtn.offset(),
+										containerPos = player.container.offset();
+
+									// move the button in Flash into place
+									media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, false);
+
+									// allows click through
+									fullscreenBtn.css('pointer-events', 'none');
+									t.controls.css('pointer-events', 'none');
+
+									// show the divs that will restore things
+									videoHoverDiv.show();
+									controlsRightHoverDiv.show();
+									controlsLeftHoverDiv.show();
+									positionHoverDivs();
+
+									fullscreenIsDisabled = true;
+								}
+
+							});
+
+						// restore controls anytime the user enters or leaves fullscreen
+						media.addEventListener('fullscreenchange', function(e) {
+							restoreControls();
+						});
+
+
+						// the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events
+						// so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button
+						/*
+						$(document).mousemove(function(e) {
+
+							// if the mouse is anywhere but the fullsceen button, then restore it all
+							if (fullscreenIsDisabled) {
+
+								var fullscreenBtnPos = fullscreenBtn.offset();
+
+
+								if (e.pageY < fullscreenBtnPos.top || e.pageY > fullscreenBtnPos.top + fullscreenBtn.outerHeight(true) ||
+									e.pageX < fullscreenBtnPos.left || e.pageX > fullscreenBtnPos.left + fullscreenBtn.outerWidth(true)
+									) {
+
+									fullscreenBtn.css('pointer-events', '');
+									t.controls.css('pointer-events', '');
+
+									fullscreenIsDisabled = false;
+								}
+							}
+						});
+						*/
+
+
+					} else {
+
+						// the hover state will show the fullscreen button in Flash to hover up and click
+
+						fullscreenBtn
+							.mouseover(function() {
+
+								if (hideTimeout !== null) {
+									clearTimeout(hideTimeout);
+									delete hideTimeout;
+								}
+
+								var buttonPos = fullscreenBtn.offset(),
+									containerPos = player.container.offset();
+
+								media.positionFullscreenButton(buttonPos.left - containerPos.left, buttonPos.top - containerPos.top, true);
+
+							})
+							.mouseout(function() {
+
+								if (hideTimeout !== null) {
+									clearTimeout(hideTimeout);
+									delete hideTimeout;
+								}
+
+								hideTimeout = setTimeout(function() {
+									media.hideFullscreenButton();
+								}, 1500);
+
+
+							});
+					}
+				}
+
+			player.fullscreenBtn = fullscreenBtn;
+
+			$(document).bind('keydown',function (e) {
+				if (((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen) && e.keyCode == 27) {
+					player.exitFullScreen();
+				}
+			});
+
+		},
+		enterFullScreen: function(dispatchEvent) {
+
+			var t = this;
+
+			// firefox+flash can't adjust plugin sizes without resetting :(
+			if (t.media.pluginType !== 'native' && (mejs.MediaFeatures.isFirefox || t.options.usePluginFullScreen)) {
+				//t.media.setFullscreen(true);
+				//player.isFullScreen = true;
+				return;
+			}
+
+			// store overflow
+			docStyleOverflow = document.documentElement.style.overflow;
+			// set it to not show scroll bars so 100% will work
+			document.documentElement.style.overflow = 'hidden';
+
+			// store sizing
+			normalHeight = t.container.height();
+			normalWidth = t.container.width();
+
+			// attempt to do true fullscreen (Safari 5.1 and Firefox Nightly only for now)
+			if (t.media.pluginType === 'native') {
+				if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
+
+					mejs.MediaFeatures.requestFullScreen(t.container[0]);
+					//return;
+
+					if (t.isInIframe) {
+						// sometimes exiting from fullscreen doesn't work
+						// notably in Chrome <iframe>. Fixed in version 17
+						setTimeout(function checkFullscreen() {
+
+							if (t.isNativeFullScreen) {
+
+								// check if the video is suddenly not really fullscreen
+								if ($(window).width() !== screen.width) {
+									// manually exit
+									t.exitFullScreen();
+								} else {
+									// test again
+									setTimeout(checkFullscreen, 500);
+								}
+							}
+
+
+						}, 500);
+					}
+
+				} else if (mejs.MediaFeatures.hasSemiNativeFullScreen) {
+					t.media.webkitEnterFullscreen();
+					return;
+				}
+			}
+
+			// check for iframe launch
+			if (t.isInIframe) {
+				var url = t.options.newWindowCallback(this);
+
+
+				if (url !== '') {
+
+					// launch immediately
+					if (!mejs.MediaFeatures.hasTrueNativeFullScreen) {
+						t.pause();
+						window.open(url, t.id, 'top=0,left=0,width=' + screen.availWidth + ',height=' + screen.availHeight + ',resizable=yes,scrollbars=no,status=no,toolbar=no');
+						return;
+					} else {
+						setTimeout(function() {
+							if (!t.isNativeFullScreen) {
+								t.pause();
+								window.open(url, t.id, 'top=0,left=0,width=' + screen.availWidth + ',height=' + screen.availHeight + ',resizable=yes,scrollbars=no,status=no,toolbar=no');
+							}
+						}, 250);
+					}
+				}
+
+			}
+
+			// full window code
+
+
+
+			// make full size
+			t.container
+				.addClass('mejs-container-fullscreen')
+				.width('100%')
+				.height('100%');
+				//.css({position: 'fixed', left: 0, top: 0, right: 0, bottom: 0, overflow: 'hidden', width: '100%', height: '100%', 'z-index': 1000});
+
+			// Only needed for safari 5.1 native full screen, can cause display issues elsewhere
+			// Actually, it seems to be needed for IE8, too
+			//if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
+				setTimeout(function() {
+					t.container.css({width: '100%', height: '100%'});
+					t.setControlsSize();
+				}, 500);
+			//}
+
+			if (t.pluginType === 'native') {
+				t.$media
+					.width('100%')
+					.height('100%');
+			} else {
+				t.container.find('object, embed, iframe')
+					.width('100%')
+					.height('100%');
+
+				//if (!mejs.MediaFeatures.hasTrueNativeFullScreen) {
+					t.media.setVideoSize($(window).width(),$(window).height());
+				//}
+			}
+
+			t.layers.children('div')
+				.width('100%')
+				.height('100%');
+
+			if (t.fullscreenBtn) {
+				t.fullscreenBtn
+					.removeClass('mejs-fullscreen')
+					.addClass('mejs-unfullscreen');
+			}
+
+			t.setControlsSize();
+			t.isFullScreen = true;
+
+            // added by @edsilv
+            if (dispatchEvent == false){
+                return;
+            }else{
+                $(window).trigger('enterfullscreen');
+            }
+		},
+
+        // altered by @edsilv
+		exitFullScreen: function(dispatchEvent) {
+
+			var t = this;
+
+			// firefox can't adjust plugins
+			if (t.media.pluginType !== 'native' && mejs.MediaFeatures.isFirefox) {
+				t.media.setFullscreen(false);
+				//player.isFullScreen = false;
+				return;
+			}
+
+			// come outo of native fullscreen
+			if (mejs.MediaFeatures.hasTrueNativeFullScreen && (mejs.MediaFeatures.isFullScreen() || t.isFullScreen)) {
+				mejs.MediaFeatures.cancelFullScreen();
+			}
+
+			// restore scroll bars to document
+            if (typeof(docStyleOverflow) !== 'undefined') document.documentElement.style.overflow = docStyleOverflow;
+
+            if (typeof(normalWidth) !== 'undefined' &&
+                typeof(normalHeight) !== 'undefined'){
+			    t.container
+				    .removeClass('mejs-container-fullscreen')
+				    .width(normalWidth)
+				    .height(normalHeight);
+				    //.css({position: '', left: '', top: '', right: '', bottom: '', overflow: 'inherit', width: normalWidth + 'px', height: normalHeight + 'px', 'z-index': 1});
+
+			    if (t.pluginType === 'native') {
+				    t.$media
+					    .width(normalWidth)
+					    .height(normalHeight);
+			    } else {
+				    t.container.find('object embed')
+					    .width(normalWidth)
+					    .height(normalHeight);
+
+				    t.media.setVideoSize(normalWidth, normalHeight);
+			    }
+
+			    t.layers.children('div')
+				    .width(normalWidth)
+				    .height(normalHeight);
+            }
+
+			t.fullscreenBtn
+				.removeClass('mejs-unfullscreen')
+				.addClass('mejs-fullscreen');
+
+			t.setControlsSize();
+			t.isFullScreen = false;
+
+            // added by @edsilv
+            if (dispatchEvent == false){
+                return;
+            }else{
+                $(window).trigger('enterfullscreen');
+            }
+		}
+	});
+
+})(mejs.$);
+
+(function($) {
+
+	// add extra default options
+	$.extend(mejs.MepDefaults, {
+		// this will automatically turn on a <track>
+		startLanguage: '',
+
+		tracksText: 'Captions/Subtitles'
+	});
+
+	$.extend(MediaElementPlayer.prototype, {
+
+		hasChapters: false,
+
+		buildtracks: function(player, controls, layers, media) {
+			if (!player.isVideo)
+				return;
+
+			if (player.tracks.length == 0)
+				return;
+
+			var t= this, i, options = '';
+
+			player.chapters =
+					$('<div class="mejs-chapters mejs-layer"></div>')
+						.prependTo(layers).hide();
+			player.captions =
+					$('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position"><span class="mejs-captions-text"></span></div></div>')
+						.prependTo(layers).hide();
+			player.captionsText = player.captions.find('.mejs-captions-text');
+			player.captionsButton =
+					$('<div class="mejs-button mejs-captions-button">'+
+						'<button type="button" aria-controls="' + t.id + '" title="' + t.options.tracksText + '"></button>'+
+						'<div class="mejs-captions-selector">'+
+							'<ul>'+
+								'<li>'+
+									'<input type="radio" name="' + player.id + '_captions" id="' + player.id + '_captions_none" value="none" checked="checked" />' +
+									'<label for="' + player.id + '_captions_none">None</label>'+
+								'</li>'	+
+							'</ul>'+
+						'</div>'+
+					'</div>')
+						.appendTo(controls)
+
+						// hover
+						.hover(function() {
+							$(this).find('.mejs-captions-selector').css('visibility','visible');
+						}, function() {
+							$(this).find('.mejs-captions-selector').css('visibility','hidden');
+						})
+
+						// handle clicks to the language radio buttons
+						.delegate('input[type=radio]','click',function() {
+							lang = this.value;
+
+							if (lang == 'none') {
+								player.selectedTrack = null;
+							} else {
+								for (i=0; i<player.tracks.length; i++) {
+									if (player.tracks[i].srclang == lang) {
+										player.selectedTrack = player.tracks[i];
+										player.captions.attr('lang', player.selectedTrack.srclang);
+										player.displayCaptions();
+										break;
+									}
+								}
+							}
+						});
+						//.bind('mouseenter', function() {
+						//	player.captionsButton.find('.mejs-captions-selector').css('visibility','visible')
+						//});
+
+			if (!player.options.alwaysShowControls) {
+				// move with controls
+				player.container
+					.bind('mouseenter', function () {
+						// push captions above controls
+						player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
+
+					})
+					.bind('mouseleave', function () {
+						if (!media.paused) {
+							// move back to normal place
+							player.container.find('.mejs-captions-position').removeClass('mejs-captions-position-hover');
+						}
+					});
+			} else {
+				player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
+			}
+
+			player.trackToLoad = -1;
+			player.selectedTrack = null;
+			player.isLoadingTrack = false;
+
+
+
+			// add to list
+			for (i=0; i<player.tracks.length; i++) {
+				if (player.tracks[i].kind == 'subtitles') {
+					player.addTrackButton(player.tracks[i].srclang, player.tracks[i].label);
+				}
+			}
+
+			player.loadNextTrack();
+
+
+			media.addEventListener('timeupdate',function(e) {
+				player.displayCaptions();
+			}, false);
+
+			media.addEventListener('loadedmetadata', function(e) {
+				player.displayChapters();
+			}, false);
+
+			player.container.hover(
+				function () {
+					// chapters
+					if (player.hasChapters) {
+						player.chapters.css('visibility','visible');
+						player.chapters.fadeIn(200);
+					}
+				},
+				function () {
+					if (player.hasChapters && !media.paused) {
+						player.chapters.fadeOut(200, function() {
+							$(this).css('visibility','hidden');
+							$(this).css('display','block');
+						});
+					}
+				});
+
+			// check for autoplay
+			if (player.node.getAttribute('autoplay') !== null) {
+				player.chapters.css('visibility','hidden');
+			}
+		},
+
+		loadNextTrack: function() {
+			var t = this;
+
+			t.trackToLoad++;
+			if (t.trackToLoad < t.tracks.length) {
+				t.isLoadingTrack = true;
+				t.loadTrack(t.trackToLoad);
+			} else {
+				// add done?
+				t.isLoadingTrack = false;
+			}
+		},
+
+		loadTrack: function(index){
+			var
+				t = this,
+				track = t.tracks[index],
+				after = function() {
+
+					track.isLoaded = true;
+
+					// create button
+					//t.addTrackButton(track.srclang);
+					t.enableTrackButton(track.srclang, track.label);
+
+					t.loadNextTrack();
+
+				};
+
+			if (track.isTranslation) {
+
+				// translate the first track
+				mejs.TrackFormatParser.translateTrackText(t.tracks[0].entries, t.tracks[0].srclang, track.srclang, t.options.googleApiKey, function(newOne) {
+
+					// store the new translation
+					track.entries = newOne;
+
+					after();
+				});
+
+			} else {
+				$.ajax({
+					url: track.src,
+					success: function(d) {
+
+						// parse the loaded file
+						track.entries = mejs.TrackFormatParser.parse(d);
+						after();
+
+						if (track.kind == 'chapters' && t.media.duration > 0) {
+							t.drawChapters(track);
+						}
+					},
+					error: function() {
+						t.loadNextTrack();
+					}
+				});
+			}
+		},
+
+		enableTrackButton: function(lang, label) {
+			var t = this;
+
+			if (label === '') {
+				label = mejs.language.codes[lang] || lang;
+			}
+
+			t.captionsButton
+				.find('input[value=' + lang + ']')
+					.prop('disabled',false)
+				.siblings('label')
+					.html( label );
+
+			// auto select
+			if (t.options.startLanguage == lang) {
+				$('#' + t.id + '_captions_' + lang).click();
+			}
+
+			t.adjustLanguageBox();
+		},
+
+		addTrackButton: function(lang, label) {
+			var t = this;
+			if (label === '') {
+				label = mejs.language.codes[lang] || lang;
+			}
+
+			t.captionsButton.find('ul').append(
+				$('<li>'+
+					'<input type="radio" name="' + t.id + '_captions" id="' + t.id + '_captions_' + lang + '" value="' + lang + '" disabled="disabled" />' +
+					'<label for="' + t.id + '_captions_' + lang + '">' + label + ' (loading)' + '</label>'+
+				'</li>')
+			);
+
+			t.adjustLanguageBox();
+
+			// remove this from the dropdownlist (if it exists)
+			t.container.find('.mejs-captions-translations option[value=' + lang + ']').remove();
+		},
+
+		adjustLanguageBox:function() {
+			var t = this;
+			// adjust the size of the outer box
+			t.captionsButton.find('.mejs-captions-selector').height(
+				t.captionsButton.find('.mejs-captions-selector ul').outerHeight(true) +
+				t.captionsButton.find('.mejs-captions-translations').outerHeight(true)
+			);
+		},
+
+		displayCaptions: function() {
+
+			if (typeof this.tracks == 'undefined')
+				return;
+
+			var
+				t = this,
+				i,
+				track = t.selectedTrack;
+
+			if (track != null && track.isLoaded) {
+				for (i=0; i<track.entries.times.length; i++) {
+					if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop){
+						t.captionsText.html(track.entries.text[i]);
+						t.captions.show();
+						return; // exit out if one is visible;
+					}
+				}
+				t.captions.hide();
+			} else {
+				t.captions.hide();
+			}
+		},
+
+		displayChapters: function() {
+			var
+				t = this,
+				i;
+
+			for (i=0; i<t.tracks.length; i++) {
+				if (t.tracks[i].kind == 'chapters' && t.tracks[i].isLoaded) {
+					t.drawChapters(t.tracks[i]);
+					t.hasChapters = true;
+					break;
+				}
+			}
+		},
+
+		drawChapters: function(chapters) {
+			var
+				t = this,
+				i,
+				dur,
+				//width,
+				//left,
+				percent = 0,
+				usedPercent = 0;
+
+			t.chapters.empty();
+
+			for (i=0; i<chapters.entries.times.length; i++) {
+				dur = chapters.entries.times[i].stop - chapters.entries.times[i].start;
+				percent = Math.floor(dur / t.media.duration * 100);
+				if (percent + usedPercent > 100 || // too large
+					i == chapters.entries.times.length-1 && percent + usedPercent < 100) // not going to fill it in
+					{
+					percent = 100 - usedPercent;
+				}
+				//width = Math.floor(t.width * dur / t.media.duration);
+				//left = Math.floor(t.width * chapters.entries.times[i].start / t.media.duration);
+				//if (left + width > t.width) {
+				//	width = t.width - left;
+				//}
+
+				t.chapters.append( $(
+					'<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' +
+						'<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' +
+							'<span class="ch-title">' + chapters.entries.text[i] + '</span>' +
+							'<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start) + '&ndash;' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop) + '</span>' +
+						'</div>' +
+					'</div>'));
+				usedPercent += percent;
+			}
+
+			t.chapters.find('div.mejs-chapter').click(function() {
+				t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) );
+				if (t.media.paused) {
+					t.media.play();
+				}
+			});
+
+			t.chapters.show();
+		}
+	});
+
+
+
+	mejs.language = {
+		codes:  {
+			af:'Afrikaans',
+			sq:'Albanian',
+			ar:'Arabic',
+			be:'Belarusian',
+			bg:'Bulgarian',
+			ca:'Catalan',
+			zh:'Chinese',
+			'zh-cn':'Chinese Simplified',
+			'zh-tw':'Chinese Traditional',
+			hr:'Croatian',
+			cs:'Czech',
+			da:'Danish',
+			nl:'Dutch',
+			en:'English',
+			et:'Estonian',
+			tl:'Filipino',
+			fi:'Finnish',
+			fr:'French',
+			gl:'Galician',
+			de:'German',
+			el:'Greek',
+			ht:'Haitian Creole',
+			iw:'Hebrew',
+			hi:'Hindi',
+			hu:'Hungarian',
+			is:'Icelandic',
+			id:'Indonesian',
+			ga:'Irish',
+			it:'Italian',
+			ja:'Japanese',
+			ko:'Korean',
+			lv:'Latvian',
+			lt:'Lithuanian',
+			mk:'Macedonian',
+			ms:'Malay',
+			mt:'Maltese',
+			no:'Norwegian',
+			fa:'Persian',
+			pl:'Polish',
+			pt:'Portuguese',
+			//'pt-pt':'Portuguese (Portugal)',
+			ro:'Romanian',
+			ru:'Russian',
+			sr:'Serbian',
+			sk:'Slovak',
+			sl:'Slovenian',
+			es:'Spanish',
+			sw:'Swahili',
+			sv:'Swedish',
+			tl:'Tagalog',
+			th:'Thai',
+			tr:'Turkish',
+			uk:'Ukrainian',
+			vi:'Vietnamese',
+			cy:'Welsh',
+			yi:'Yiddish'
+		}
+	};
+
+	/*
+	Parses WebVVT format which should be formatted as
+	================================
+	WEBVTT
+
+	1
+	00:00:01,1 --> 00:00:05,000
+	A line of text
+
+	2
+	00:01:15,1 --> 00:02:05,000
+	A second line of text
+
+	===============================
+
+	Adapted from: http://www.delphiki.com/html5/playr
+	*/
+	mejs.TrackFormatParser = {
+		// match start "chapter-" (or anythingelse)
+		pattern_identifier: /^([a-zA-z]+-)?[0-9]+$/,
+		pattern_timecode: /^([0-9]{2}:[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ([0-9]{2}:[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
+
+		split2: function (text, regex) {
+			// normal version for compliant browsers
+			// see below for IE fix
+			return text.split(regex);
+		},
+		parse: function(trackText) {
+			var
+				i = 0,
+				lines = this.split2(trackText, /\r?\n/),
+				entries = {text:[], times:[]},
+				timecode,
+				text;
+
+			for(; i<lines.length; i++) {
+				// check for the line number
+				if (this.pattern_identifier.exec(lines[i])){
+					// skip to the next line where the start --> end time code should be
+					i++;
+					timecode = this.pattern_timecode.exec(lines[i]);
+
+					if (timecode && i<lines.length){
+						i++;
+						// grab all the (possibly multi-line) text that follows
+						text = lines[i];
+						i++;
+						while(lines[i] !== '' && i<lines.length){
+							text = text + '\n' + lines[i];
+							i++;
+						}
+
+						// Text is in a different array so I can use .join
+						entries.text.push(text);
+						entries.times.push(
+						{
+							start: mejs.Utility.timeCodeToSeconds(timecode[1]),
+							stop: mejs.Utility.timeCodeToSeconds(timecode[3]),
+							settings: timecode[5]
+						});
+					}
+				}
+			}
+
+			return entries;
+		}
+	};
+
+	// test for browsers with bad String.split method.
+	if ('x\n\ny'.split(/\n/gi).length != 3) {
+		// add super slow IE8 and below version
+		mejs.TrackFormatParser.split2 = function(text, regex) {
+			var
+				parts = [],
+				chunk = '',
+				i;
+
+			for (i=0; i<text.length; i++) {
+				chunk += text.substring(i,i+1);
+				if (regex.test(chunk)) {
+					parts.push(chunk.replace(regex, ''));
+					chunk = '';
+				}
+			}
+			parts.push(chunk);
+			return parts;
+		}
+	}
+
+})(mejs.$);
+
+/*
+* ContextMenu Plugin
+*
+*
+*/
+
+(function($) {
+
+$.extend(mejs.MepDefaults,
+	{ 'contextMenuItems': [
+		// demo of a fullscreen option
+		{
+			render: function(player) {
+
+				// check for fullscreen plugin
+				if (typeof player.enterFullScreen == 'undefined')
+					return null;
+
+				if (player.isFullScreen) {
+					return "Turn off Fullscreen";
+				} else {
+					return "Go Fullscreen";
+				}
+			},
+			click: function(player) {
+				if (player.isFullScreen) {
+					player.exitFullScreen();
+				} else {
+					player.enterFullScreen();
+				}
+			}
+		}
+		,
+		// demo of a mute/unmute button
+		{
+			render: function(player) {
+				if (player.media.muted) {
+					return "Unmute";
+				} else {
+					return "Mute";
+				}
+			},
+			click: function(player) {
+				if (player.media.muted) {
+					player.setMuted(false);
+				} else {
+					player.setMuted(true);
+				}
+			}
+		},
+		// separator
+		{
+			isSeparator: true
+		}
+		,
+		// demo of simple download video
+		{
+			render: function(player) {
+				return "Download Video";
+			},
+			click: function(player) {
+				window.location.href = player.media.currentSrc;
+			}
+		}
+	]}
+);
+
+
+	$.extend(MediaElementPlayer.prototype, {
+		buildcontextmenu: function(player, controls, layers, media) {
+
+			// create context menu
+			player.contextMenu = $('<div class="mejs-contextmenu"></div>')
+								.appendTo($('body'))
+								.hide();
+
+			// create events for showing context menu
+			player.container.bind('contextmenu', function(e) {
+				if (player.isContextMenuEnabled) {
+					e.preventDefault();
+					player.renderContextMenu(e.clientX-1, e.clientY-1);
+					return false;
+				}
+			});
+			player.container.bind('click', function() {
+				player.contextMenu.hide();
+			});
+			player.contextMenu.bind('mouseleave', function() {
+
+				//console.log('context hover out');
+				player.startContextMenuTimer();
+
+			});
+		},
+
+		isContextMenuEnabled: true,
+		enableContextMenu: function() {
+			this.isContextMenuEnabled = true;
+		},
+		disableContextMenu: function() {
+			this.isContextMenuEnabled = false;
+		},
+
+		contextMenuTimeout: null,
+		startContextMenuTimer: function() {
+			//console.log('startContextMenuTimer');
+
+			var t = this;
+
+			t.killContextMenuTimer();
+
+			t.contextMenuTimer = setTimeout(function() {
+				t.hideContextMenu();
+				t.killContextMenuTimer();
+			}, 750);
+		},
+		killContextMenuTimer: function() {
+			var timer = this.contextMenuTimer;
+
+			//console.log('killContextMenuTimer', timer);
+
+			if (timer != null) {
+				clearTimeout(timer);
+				delete timer;
+				timer = null;
+			}
+		},
+
+		hideContextMenu: function() {
+			this.contextMenu.hide();
+		},
+
+		renderContextMenu: function(x,y) {
+
+			// alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly
+			var t = this,
+				html = '',
+				items = t.options.contextMenuItems;
+
+			for (var i=0, il=items.length; i<il; i++) {
+
+				if (items[i].isSeparator) {
+					html += '<div class="mejs-contextmenu-separator"></div>';
+				} else {
+
+					var rendered = items[i].render(t);
+
+					// render can return null if the item doesn't need to be used at the moment
+					if (rendered != null) {
+						html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random()*1000000) + '">' + rendered + '</div>';
+					}
+				}
+			}
+
+			// position and show the context menu
+			t.contextMenu
+				.empty()
+				.append($(html))
+				.css({top:y, left:x})
+				.show();
+
+			// bind events
+			t.contextMenu.find('.mejs-contextmenu-item').each(function() {
+
+				// which one is this?
+				var $dom = $(this),
+					itemIndex = parseInt( $dom.data('itemindex'), 10 ),
+					item = t.options.contextMenuItems[itemIndex];
+
+				// bind extra functionality?
+				if (typeof item.show != 'undefined')
+					item.show( $dom , t);
+
+				// bind click action
+				$dom.click(function() {
+					// perform click action
+					if (typeof item.click != 'undefined')
+						item.click(t);
+
+					// close
+					t.contextMenu.hide();
+				});
+			});
+
+			// stop the controls from hiding
+			setTimeout(function() {
+				t.killControlsTimer('rev3');
+			}, 100);
+
+		}
+	});
+
+})(mejs.$);
+
diff --git a/public/opac/js/universalviewer-2.0.2/lib/openseadragon.min.js b/public/opac/js/universalviewer-2.0.2/lib/openseadragon.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..4c6ce34314e17773ad67494c911e65f78b82f155
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/openseadragon.min.js
@@ -0,0 +1,15 @@
+//! openseadragon 2.2.1
+//! Built on 2016-07-01
+//! Git commit: v2.2.1-0-babdefd
+//! http://openseadragon.github.io
+//! License: http://openseadragon.github.io/license/
+
+
+window.OpenSeadragon=window.OpenSeadragon||function(a){return new OpenSeadragon.Viewer(a)};"function"==typeof define&&define.amd&&define(function(){return window.OpenSeadragon});!function(a){a.version={versionStr:"<%= osdVersion.versionStr %>",major:parseInt("<%= osdVersion.major %>",10),minor:parseInt("<%= osdVersion.minor %>",10),revision:parseInt("<%= osdVersion.revision %>",10)};var b={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regexp","[object Object]":"object"},c=Object.prototype.toString,d=Object.prototype.hasOwnProperty;a.isFunction=function(b){return"function"===a.type(b)};a.isArray=Array.isArray||function(b){return"array"===a.type(b)};a.isWindow=function(a){return a&&"object"==typeof a&&"setInterval"in a};a.type=function(a){return null===a||void 0===a?String(a):b[c.call(a)]||"object"};a.isPlainObject=function(b){if(!b||"object"!==OpenSeadragon.type(b)||b.nodeType||a.isWindow(b))return!1;if(b.constructor&&!d.call(b,"constructor")&&!d.call(b.constructor.prototype,"isPrototypeOf"))return!1;var c;for(var e in b)c=e;return void 0===c||d.call(b,c)};a.isEmptyObject=function(a){for(var b in a)return!1;return!0};a.freezeObject=function(b){Object.freeze?a.freezeObject=Object.freeze:a.freezeObject=function(a){return a};return a.freezeObject(b)};a.supportsCanvas=function(){var b=document.createElement("canvas");return!(!a.isFunction(b.getContext)||!b.getContext("2d"))}();a.isCanvasTainted=function(a){var b=!1;try{a.getContext("2d").getImageData(0,0,1,1)}catch(c){b=!0}return b};a.pixelDensityRatio=function(){if(a.supportsCanvas){var b=document.createElement("canvas").getContext("2d");var c=window.devicePixelRatio||1;var d=b.webkitBackingStorePixelRatio||b.mozBackingStorePixelRatio||b.msBackingStorePixelRatio||b.oBackingStorePixelRatio||b.backingStorePixelRatio||1;return c/d}return 1}()}(OpenSeadragon);!function($){function getOffsetParent(a,b){return b&&a!=document.body?document.body:a.offsetParent}$.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=arguments.length,i=!1,j=1;if("boolean"==typeof g){i=g;g=arguments[1]||{};j=2}"object"==typeof g||OpenSeadragon.isFunction(g)||(g={});if(h===j){g=this;--j}for(;h>j;j++){a=arguments[j];if(null!==a||void 0!==a)for(b in a){c=g[b];d=a[b];if(g!==d)if(i&&d&&(OpenSeadragon.isPlainObject(d)||(e=OpenSeadragon.isArray(d)))){if(e){e=!1;f=c&&OpenSeadragon.isArray(c)?c:[]}else f=c&&OpenSeadragon.isPlainObject(c)?c:{};g[b]=OpenSeadragon.extend(i,f,d)}else void 0!==d&&(g[b]=d)}}return g};var isIOSDevice=function(){if("object"!=typeof navigator)return!1;var a=navigator.userAgent;return"string"!=typeof a?!1:-1!==a.indexOf("iPhone")||-1!==a.indexOf("iPad")||-1!==a.indexOf("iPod")};$.extend($,{DEFAULT_SETTINGS:{xmlPath:null,tileSources:null,tileHost:null,initialPage:0,crossOriginPolicy:!1,ajaxWithCredentials:!1,panHorizontal:!0,panVertical:!0,constrainDuringPan:!1,wrapHorizontal:!1,wrapVertical:!1,visibilityRatio:.5,minPixelRatio:.5,defaultZoomLevel:0,minZoomLevel:null,maxZoomLevel:null,homeFillsViewer:!1,clickTimeThreshold:300,clickDistThreshold:5,dblClickTimeThreshold:300,dblClickDistThreshold:20,springStiffness:6.5,animationTime:1.2,gestureSettingsMouse:{scrollToZoom:!0,clickToZoom:!0,dblClickToZoom:!1,pinchToZoom:!1,flickEnabled:!1,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsTouch:{scrollToZoom:!1,clickToZoom:!1,dblClickToZoom:!0,pinchToZoom:!0,flickEnabled:!0,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsPen:{scrollToZoom:!1,clickToZoom:!0,dblClickToZoom:!1,pinchToZoom:!1,flickEnabled:!1,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsUnknown:{scrollToZoom:!1,clickToZoom:!1,dblClickToZoom:!0,pinchToZoom:!0,flickEnabled:!0,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},zoomPerClick:2,zoomPerScroll:1.2,zoomPerSecond:1,blendTime:0,alwaysBlend:!1,autoHideControls:!0,immediateRender:!1,minZoomImageRatio:.9,maxZoomPixelRatio:1.1,smoothTileEdgesMinZoom:1.1,iOSDevice:isIOSDevice(),pixelsPerWheelLine:40,autoResize:!0,preserveImageSizeOnResize:!1,minScrollDeltaTime:50,showSequenceControl:!0,sequenceControlAnchor:null,preserveViewport:!1,preserveOverlays:!1,navPrevNextWrap:!1,showNavigationControl:!0,navigationControlAnchor:null,showZoomControl:!0,showHomeControl:!0,showFullPageControl:!0,showRotationControl:!1,controlsFadeDelay:2e3,controlsFadeLength:1500,mouseNavEnabled:!0,showNavigator:!1,navigatorId:null,navigatorPosition:null,navigatorSizeRatio:.2,navigatorMaintainSizeRatio:!1,navigatorTop:null,navigatorLeft:null,navigatorHeight:null,navigatorWidth:null,navigatorAutoResize:!0,navigatorAutoFade:!0,navigatorRotate:!0,degrees:0,opacity:1,compositeOperation:null,placeholderFillStyle:null,showReferenceStrip:!1,referenceStripScroll:"horizontal",referenceStripElement:null,referenceStripHeight:null,referenceStripWidth:null,referenceStripPosition:"BOTTOM_LEFT",referenceStripSizeRatio:.2,collectionRows:3,collectionColumns:0,collectionLayout:"horizontal",collectionMode:!1,collectionTileSize:800,collectionTileMargin:80,imageLoaderLimit:0,maxImageCacheCount:200,timeout:3e4,useCanvas:!0,prefixUrl:"/images/",navImages:{zoomIn:{REST:"zoomin_rest.png",GROUP:"zoomin_grouphover.png",HOVER:"zoomin_hover.png",DOWN:"zoomin_pressed.png"},zoomOut:{REST:"zoomout_rest.png",GROUP:"zoomout_grouphover.png",HOVER:"zoomout_hover.png",DOWN:"zoomout_pressed.png"},home:{REST:"home_rest.png",GROUP:"home_grouphover.png",HOVER:"home_hover.png",DOWN:"home_pressed.png"},fullpage:{REST:"fullpage_rest.png",GROUP:"fullpage_grouphover.png",HOVER:"fullpage_hover.png",DOWN:"fullpage_pressed.png"},rotateleft:{REST:"rotateleft_rest.png",GROUP:"rotateleft_grouphover.png",HOVER:"rotateleft_hover.png",DOWN:"rotateleft_pressed.png"},rotateright:{REST:"rotateright_rest.png",GROUP:"rotateright_grouphover.png",HOVER:"rotateright_hover.png",DOWN:"rotateright_pressed.png"},previous:{REST:"previous_rest.png",GROUP:"previous_grouphover.png",HOVER:"previous_hover.png",DOWN:"previous_pressed.png"},next:{REST:"next_rest.png",GROUP:"next_grouphover.png",HOVER:"next_hover.png",DOWN:"next_pressed.png"}},debugMode:!1,debugGridColor:"#437AB2"},SIGNAL:"----seadragon----",delegate:function(a,b){return function(){var c=arguments;void 0===c&&(c=[]);return b.apply(a,c)}},BROWSERS:{UNKNOWN:0,IE:1,FIREFOX:2,SAFARI:3,CHROME:4,OPERA:5},getElement:function(a){"string"==typeof a&&(a=document.getElementById(a));return a},getElementPosition:function(a){var b,c,d=new $.Point;a=$.getElement(a);b="fixed"==$.getElementStyle(a).position;c=getOffsetParent(a,b);for(;c;){d.x+=a.offsetLeft;d.y+=a.offsetTop;b&&(d=d.plus($.getPageScroll()));a=c;b="fixed"==$.getElementStyle(a).position;c=getOffsetParent(a,b)}return d},getElementOffset:function(a){a=$.getElement(a);var b,c,d=a&&a.ownerDocument,e={top:0,left:0};if(!d)return new $.Point;b=d.documentElement;"undefined"!=typeof a.getBoundingClientRect&&(e=a.getBoundingClientRect());c=d==d.window?d:9===d.nodeType?d.defaultView||d.parentWindow:!1;return new $.Point(e.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0),e.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0))},getElementSize:function(a){a=$.getElement(a);return new $.Point(a.clientWidth,a.clientHeight)},getElementStyle:document.documentElement.currentStyle?function(a){a=$.getElement(a);return a.currentStyle}:function(a){a=$.getElement(a);return window.getComputedStyle(a,"")},getCssPropertyWithVendorPrefix:function(a){var b={};$.getCssPropertyWithVendorPrefix=function(a){if(void 0!==b[a])return b[a];var c=document.createElement("div").style;var d=null;if(void 0!==c[a])d=a;else{var e=["Webkit","Moz","MS","O","webkit","moz","ms","o"];var f=$.capitalizeFirstLetter(a);for(var g=0;g<e.length;g++){var h=e[g]+f;if(void 0!==c[h]){d=h;break}}}b[a]=d;return d};return $.getCssPropertyWithVendorPrefix(a)},capitalizeFirstLetter:function(a){return a.charAt(0).toUpperCase()+a.slice(1)},pointInElement:function(a,b){a=$.getElement(a);var c=$.getElementOffset(a),d=$.getElementSize(a);return b.x>=c.x&&b.x<c.x+d.x&&b.y<c.y+d.y&&b.y>=c.y},getEvent:function(a){a?$.getEvent=function(a){return a}:$.getEvent=function(){return window.event};return $.getEvent(a)},getMousePosition:function(a){if("number"==typeof a.pageX)$.getMousePosition=function(a){var b=new $.Point;a=$.getEvent(a);b.x=a.pageX;b.y=a.pageY;return b};else{if("number"!=typeof a.clientX)throw new Error("Unknown event mouse position, no known technique.");$.getMousePosition=function(a){var b=new $.Point;a=$.getEvent(a);b.x=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;b.y=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return b}}return $.getMousePosition(a)},getPageScroll:function(){var a=document.documentElement||{},b=document.body||{};if("number"==typeof window.pageXOffset)$.getPageScroll=function(){return new $.Point(window.pageXOffset,window.pageYOffset)};else if(b.scrollLeft||b.scrollTop)$.getPageScroll=function(){return new $.Point(document.body.scrollLeft,document.body.scrollTop)};else{if(!a.scrollLeft&&!a.scrollTop)return new $.Point(0,0);$.getPageScroll=function(){return new $.Point(document.documentElement.scrollLeft,document.documentElement.scrollTop)}}return $.getPageScroll()},setPageScroll:function(a){if("undefined"!=typeof window.scrollTo)$.setPageScroll=function(a){window.scrollTo(a.x,a.y)};else{var b=$.getPageScroll();if(b.x===a.x&&b.y===a.y)return;document.body.scrollLeft=a.x;document.body.scrollTop=a.y;var c=$.getPageScroll();if(c.x!==b.x&&c.y!==b.y){$.setPageScroll=function(a){document.body.scrollLeft=a.x;document.body.scrollTop=a.y};return}document.documentElement.scrollLeft=a.x;document.documentElement.scrollTop=a.y;c=$.getPageScroll();if(c.x!==b.x&&c.y!==b.y){$.setPageScroll=function(a){document.documentElement.scrollLeft=a.x;document.documentElement.scrollTop=a.y};return}$.setPageScroll=function(a){}}return $.setPageScroll(a)},getWindowSize:function(){var a=document.documentElement||{},b=document.body||{};if("number"==typeof window.innerWidth)$.getWindowSize=function(){return new $.Point(window.innerWidth,window.innerHeight)};else if(a.clientWidth||a.clientHeight)$.getWindowSize=function(){return new $.Point(document.documentElement.clientWidth,document.documentElement.clientHeight)};else{if(!b.clientWidth&&!b.clientHeight)throw new Error("Unknown window size, no known technique.");$.getWindowSize=function(){return new $.Point(document.body.clientWidth,document.body.clientHeight)}}return $.getWindowSize()},makeCenteredNode:function(a){a=$.getElement(a);var b=[$.makeNeutralElement("div"),$.makeNeutralElement("div"),$.makeNeutralElement("div")];$.extend(b[0].style,{display:"table",height:"100%",width:"100%"});$.extend(b[1].style,{display:"table-row"});$.extend(b[2].style,{display:"table-cell",verticalAlign:"middle",textAlign:"center"});b[0].appendChild(b[1]);b[1].appendChild(b[2]);b[2].appendChild(a);return b[0]},makeNeutralElement:function(a){var b=document.createElement(a),c=b.style;c.background="transparent none";c.border="none";c.margin="0px";c.padding="0px";c.position="static";return b},now:function(){Date.now?$.now=Date.now:$.now=function(){return(new Date).getTime()};return $.now()},makeTransparentImage:function(a){$.makeTransparentImage=function(a){var b=$.makeNeutralElement("img");b.src=a;return b};$.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<7&&($.makeTransparentImage=function(a){var b=$.makeNeutralElement("img"),c=null;c=$.makeNeutralElement("span");c.style.display="inline-block";b.onload=function(){c.style.width=c.style.width||b.width+"px";c.style.height=c.style.height||b.height+"px";b.onload=null;b=null};b.src=a;c.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+a+"', sizingMethod='scale')";return c});return $.makeTransparentImage(a)},setElementOpacity:function(a,b,c){var d,e;a=$.getElement(a);c&&!$.Browser.alpha&&(b=Math.round(b));if($.Browser.opacity)a.style.opacity=1>b?b:"";else if(1>b){d=Math.round(100*b);e="alpha(opacity="+d+")";a.style.filter=e}else a.style.filter=""},setElementTouchActionNone:function(a){a=$.getElement(a);"undefined"!=typeof a.style.touchAction?a.style.touchAction="none":"undefined"!=typeof a.style.msTouchAction&&(a.style.msTouchAction="none")},addClass:function(a,b){a=$.getElement(a);a.className?-1===(" "+a.className+" ").indexOf(" "+b+" ")&&(a.className+=" "+b):a.className=b},indexOf:function(a,b,c){Array.prototype.indexOf?this.indexOf=function(a,b,c){return a.indexOf(b,c)}:this.indexOf=function(a,b,c){var d,e,f=c?c:0;if(!a)throw new TypeError;e=a.length;if(0===e||f>=e)return-1;0>f&&(f=e-Math.abs(f));for(d=f;e>d;d++)if(a[d]===b)return d;return-1};return this.indexOf(a,b,c)},removeClass:function(a,b){var c,d,e=[];a=$.getElement(a);c=a.className.split(/\s+/);for(d=0;d<c.length;d++)c[d]&&c[d]!==b&&e.push(c[d]);a.className=e.join(" ")},addEvent:function(){if(window.addEventListener)return function(a,b,c,d){a=$.getElement(a);a.addEventListener(b,c,d)};if(window.attachEvent)return function(a,b,c,d){a=$.getElement(a);a.attachEvent("on"+b,c)};throw new Error("No known event model.")}(),removeEvent:function(){if(window.removeEventListener)return function(a,b,c,d){a=$.getElement(a);a.removeEventListener(b,c,d)};if(window.detachEvent)return function(a,b,c,d){a=$.getElement(a);a.detachEvent("on"+b,c)};throw new Error("No known event model.")}(),cancelEvent:function(a){a=$.getEvent(a);a.preventDefault?$.cancelEvent=function(a){a.preventDefault()}:$.cancelEvent=function(a){a=$.getEvent(a);a.cancel=!0;a.returnValue=!1};$.cancelEvent(a)},stopEvent:function(a){a=$.getEvent(a);a.stopPropagation?$.stopEvent=function(a){a.stopPropagation()}:$.stopEvent=function(a){a=$.getEvent(a);a.cancelBubble=!0};$.stopEvent(a)},createCallback:function(a,b){var c,d=[];for(c=2;c<arguments.length;c++)d.push(arguments[c]);return function(){var c,e=d.concat([]);for(c=0;c<arguments.length;c++)e.push(arguments[c]);return b.apply(a,e)}},getUrlParameter:function(a){var b=URLPARAMS[a];return b?b:null},getUrlProtocol:function(a){var b=a.match(/^([a-z]+:)\/\//i);return null===b?window.location.protocol:b[1].toLowerCase()},createAjaxRequest:function(a){var b;try{b=!!new ActiveXObject("Microsoft.XMLHTTP")}catch(c){b=!1}if(b)window.XMLHttpRequest?$.createAjaxRequest=function(a){return a?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest}:$.createAjaxRequest=function(){return new ActiveXObject("Microsoft.XMLHTTP")};else{if(!window.XMLHttpRequest)throw new Error("Browser doesn't support XMLHttpRequest.");$.createAjaxRequest=function(){return new XMLHttpRequest}}return $.createAjaxRequest(a)},makeAjaxRequest:function(a,b,c){var d;if($.isPlainObject(a)){b=a.success;c=a.error;d=a.withCredentials;a=a.url}var e=$.getUrlProtocol(a);var f=$.createAjaxRequest("file:"===e);if(!$.isFunction(b))throw new Error("makeAjaxRequest requires a success callback");f.onreadystatechange=function(){if(4==f.readyState){f.onreadystatechange=function(){};if(200===f.status||0===f.status&&"http:"!==e&&"https:"!==e)b(f);else{$.console.log("AJAX request returned %d: %s",f.status,a);$.isFunction(c)&&c(f)}}};d&&(f.withCredentials=!0);try{f.open("GET",a,!0);f.send(null)}catch(g){var h=g.message;var i=$.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<10;i&&"undefined"!=typeof g.number&&-2147024891==g.number&&(h+="\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain");$.console.log("%s while making AJAX request: %s",g.name,h);f.onreadystatechange=function(){};if(window.XDomainRequest){var j=new XDomainRequest;if(j){j.onload=function(a){$.isFunction(b)&&b({responseText:j.responseText,status:200,statusText:"OK"})};j.onerror=function(a){$.isFunction(c)&&c({responseText:j.responseText,status:444,statusText:"An error happened. Due to an XDomainRequest deficiency we can not extract any information about this error. Upgrade your browser."})};try{j.open("GET",a);j.send()}catch(k){$.isFunction(c)&&c(f,g)}}}else $.isFunction(c)&&c(f,g)}},jsonp:function(a){var b,c=a.url,d=document.head||document.getElementsByTagName("head")[0]||document.documentElement,e=a.callbackName||"openseadragon"+$.now(),f=window[e],g="$1"+e+"$2",h=a.param||"callback",i=a.callback;c=c.replace(/(\=)\?(&|$)|\?\?/i,g);c+=(/\?/.test(c)?"&":"?")+h+"="+e;window[e]=function(a){if(f)window[e]=f;else try{delete window[e]}catch(b){}i&&$.isFunction(i)&&i(a)};b=document.createElement("script");(void 0!==a.async||!1!==a.async)&&(b.async="async");a.scriptCharset&&(b.charset=a.scriptCharset);b.src=c;b.onload=b.onreadystatechange=function(a,c){if(c||!b.readyState||/loaded|complete/.test(b.readyState)){b.onload=b.onreadystatechange=null;d&&b.parentNode&&d.removeChild(b);b=void 0}};d.insertBefore(b,d.firstChild)},createFromDZI:function(){throw"OpenSeadragon.createFromDZI is deprecated, use Viewer.open."},parseXml:function(a){if(window.DOMParser)$.parseXml=function(a){var b,c=null;b=new DOMParser;c=b.parseFromString(a,"text/xml");return c};else{if(!window.ActiveXObject)throw new Error("Browser doesn't support XML DOM.");$.parseXml=function(a){var b=null;b=new ActiveXObject("Microsoft.XMLDOM");b.async=!1;b.loadXML(a);return b}}return $.parseXml(a)},parseJSON:function(string){window.JSON&&window.JSON.parse?$.parseJSON=window.JSON.parse:$.parseJSON=function(string){return eval("("+string+")")};return $.parseJSON(string)},imageFormatSupported:function(a){a=a?a:"";return!!FILEFORMATS[a.toLowerCase()]}});$.Browser={vendor:$.BROWSERS.UNKNOWN,version:0,alpha:!0};var FILEFORMATS={bmp:!1,jpeg:!0,jpg:!0,png:!0,tif:!1,wdp:!1},URLPARAMS={};!function(){var a,b=(navigator.appName,navigator.appVersion),c=navigator.userAgent;switch(navigator.appName){case"Microsoft Internet Explorer":if(window.attachEvent&&window.ActiveXObject){$.Browser.vendor=$.BROWSERS.IE;$.Browser.version=parseFloat(c.substring(c.indexOf("MSIE")+5,c.indexOf(";",c.indexOf("MSIE"))))}break;case"Netscape":if(window.addEventListener)if(c.indexOf("Firefox")>=0){$.Browser.vendor=$.BROWSERS.FIREFOX;$.Browser.version=parseFloat(c.substring(c.indexOf("Firefox")+8))}else if(c.indexOf("Safari")>=0){$.Browser.vendor=c.indexOf("Chrome")>=0?$.BROWSERS.CHROME:$.BROWSERS.SAFARI;$.Browser.version=parseFloat(c.substring(c.substring(0,c.indexOf("Safari")).lastIndexOf("/")+1,c.indexOf("Safari")))}else{a=new RegExp("Trident/.*rv:([0-9]{1,}[.0-9]{0,})");if(null!==a.exec(c)){$.Browser.vendor=$.BROWSERS.IE;$.Browser.version=parseFloat(RegExp.$1)}}break;case"Opera":$.Browser.vendor=$.BROWSERS.OPERA;$.Browser.version=parseFloat(b)}var d,e,f,g=window.location.search.substring(1),h=g.split("&");for(f=0;f<h.length;f++){d=h[f];e=d.indexOf("=");e>0&&(URLPARAMS[d.substring(0,e)]=decodeURIComponent(d.substring(e+1)))}$.Browser.alpha=!($.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<9||$.Browser.vendor==$.BROWSERS.CHROME&&$.Browser.version<2);$.Browser.opacity=!($.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<9)}();var nullfunction=function(a){};$.console=window.console||{log:nullfunction,debug:nullfunction,info:nullfunction,warn:nullfunction,error:nullfunction,assert:nullfunction};!function(a){var b=a.requestAnimationFrame||a.mozRequestAnimationFrame||a.webkitRequestAnimationFrame||a.msRequestAnimationFrame;var c=a.cancelAnimationFrame||a.mozCancelAnimationFrame||a.webkitCancelAnimationFrame||a.msCancelAnimationFrame;if(b&&c){$.requestAnimationFrame=function(){return b.apply(a,arguments)};$.cancelAnimationFrame=function(){return c.apply(a,arguments)}}else{var d,e=[],f=[],g=0;$.requestAnimationFrame=function(a){e.push([++g,a]);d||(d=setInterval(function(){if(e.length){var a=$.now();var b=f;f=e;e=b;for(;f.length;)f.shift()[1](a)}else{clearInterval(d);d=void 0}},20));return g};$.cancelAnimationFrame=function(a){var b,c;for(b=0,c=e.length;c>b;b+=1)if(e[b][0]===a){e.splice(b,1);return}for(b=0,c=f.length;c>b;b+=1)if(f[b][0]===a){f.splice(b,1);return}}}}(window)}(OpenSeadragon);!function(a){var b={supportsFullScreen:!1,isFullScreen:function(){return!1},getFullScreenElement:function(){return null},requestFullScreen:function(){},exitFullScreen:function(){},cancelFullScreen:function(){},fullScreenEventName:"",fullScreenErrorEventName:""};if(document.exitFullscreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.fullscreenElement};b.requestFullScreen=function(a){return a.requestFullscreen()};b.exitFullScreen=function(){document.exitFullscreen()};b.fullScreenEventName="fullscreenchange";b.fullScreenErrorEventName="fullscreenerror"}else if(document.msExitFullscreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.msFullscreenElement};b.requestFullScreen=function(a){return a.msRequestFullscreen()};b.exitFullScreen=function(){document.msExitFullscreen()};b.fullScreenEventName="MSFullscreenChange";b.fullScreenErrorEventName="MSFullscreenError"}else if(document.webkitExitFullscreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.webkitFullscreenElement};b.requestFullScreen=function(a){return a.webkitRequestFullscreen()};b.exitFullScreen=function(){document.webkitExitFullscreen()};b.fullScreenEventName="webkitfullscreenchange";b.fullScreenErrorEventName="webkitfullscreenerror"}else if(document.webkitCancelFullScreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.webkitCurrentFullScreenElement};b.requestFullScreen=function(a){return a.webkitRequestFullScreen()};b.exitFullScreen=function(){document.webkitCancelFullScreen()};b.fullScreenEventName="webkitfullscreenchange";b.fullScreenErrorEventName="webkitfullscreenerror"}else if(document.mozCancelFullScreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.mozFullScreenElement};b.requestFullScreen=function(a){return a.mozRequestFullScreen()};b.exitFullScreen=function(){document.mozCancelFullScreen()};b.fullScreenEventName="mozfullscreenchange";b.fullScreenErrorEventName="mozfullscreenerror"}b.isFullScreen=function(){return null!==b.getFullScreenElement()};b.cancelFullScreen=function(){a.console.error("cancelFullScreen is deprecated. Use exitFullScreen instead.");b.exitFullScreen()};a.extend(a,b)}(OpenSeadragon);!function(a){a.EventSource=function(){this.events={}};a.EventSource.prototype={addOnceHandler:function(a,b,c,d){var e=this;d=d||1;var f=0;var g=function(c){f++;f===d&&e.removeHandler(a,g);b(c)};this.addHandler(a,g,c)},addHandler:function(b,c,d){var e=this.events[b];e||(this.events[b]=e=[]);c&&a.isFunction(c)&&(e[e.length]={handler:c,userData:d||null})},removeHandler:function(b,c){var d,e=this.events[b],f=[];if(e&&a.isArray(e)){for(d=0;d<e.length;d++)e[d].handler!==c&&f.push(e[d]);this.events[b]=f}},removeAllHandlers:function(a){if(a)this.events[a]=[];else for(var b in this.events)this.events[b]=[]},getHandler:function(a){var b=this.events[a];if(!b||!b.length)return null;b=1===b.length?[b[0]]:Array.apply(null,b);return function(a,c){var d,e=b.length;for(d=0;e>d;d++)if(b[d]){c.eventSource=a;c.userData=b[d].userData;b[d].handler(c)}}},raiseEvent:function(a,b){var c=this.getHandler(a);if(c){b||(b={});c(this,b)}}}}(OpenSeadragon);!function(a){function b(b){var c,d=pa[b.hash],e=d.activePointersLists.length;for(c=0;e>c;c++)if(d.activePointersLists[c].captureCount>0){a.removeEvent(a.MouseTracker.captureElement,"mousemove",d.mousemovecaptured,!0);a.removeEvent(a.MouseTracker.captureElement,"mouseup",d.mouseupcaptured,!0);a.removeEvent(a.MouseTracker.captureElement,a.MouseTracker.unprefixedPointerEvents?"pointermove":"MSPointerMove",d.pointermovecaptured,!0);a.removeEvent(a.MouseTracker.captureElement,a.MouseTracker.unprefixedPointerEvents?"pointerup":"MSPointerUp",d.pointerupcaptured,!0);a.removeEvent(a.MouseTracker.captureElement,"touchmove",d.touchmovecaptured,!0);a.removeEvent(a.MouseTracker.captureElement,"touchend",d.touchendcaptured,!0);d.activePointersLists[c].captureCount=0}for(c=0;e>c;c++)d.activePointersLists.pop()}function c(c){var d,e,f=pa[c.hash];if(!f.tracking){for(e=0;e<a.MouseTracker.subscribeEvents.length;e++){d=a.MouseTracker.subscribeEvents[e];a.addEvent(c.element,d,f[d],!1)}b(c);f.tracking=!0}}function d(c){var d,e,f=pa[c.hash];if(f.tracking){for(e=0;e<a.MouseTracker.subscribeEvents.length;e++){d=a.MouseTracker.subscribeEvents[e];a.removeEvent(c.element,d,f[d],!1)}b(c);f.tracking=!1}}function e(b,c){var d=pa[b.hash];if("pointerevent"===c)return{upName:a.MouseTracker.unprefixedPointerEvents?"pointerup":"MSPointerUp",upHandler:d.pointerupcaptured,moveName:a.MouseTracker.unprefixedPointerEvents?"pointermove":"MSPointerMove",moveHandler:d.pointermovecaptured};if("mouse"===c)return{upName:"mouseup",upHandler:d.mouseupcaptured,moveName:"mousemove",moveHandler:d.mousemovecaptured};if("touch"===c)return{upName:"touchend",upHandler:d.touchendcaptured,moveName:"touchmove",moveHandler:d.touchmovecaptured};throw new Error("MouseTracker.getCaptureEventParams: Unknown pointer type.")}function f(b,c,d){var f,g=b.getActivePointersListByType(c);g.captureCount+=d||1;if(1===g.captureCount)if(a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9)b.element.setCapture(!0);else{f=e(b,a.MouseTracker.havePointerEvents?"pointerevent":c);qa&&na(window.top)&&a.addEvent(window.top,f.upName,f.upHandler,!0);a.addEvent(a.MouseTracker.captureElement,f.upName,f.upHandler,!0);a.addEvent(a.MouseTracker.captureElement,f.moveName,f.moveHandler,!0)}}function g(b,c,d){var f,g=b.getActivePointersListByType(c);g.captureCount-=d||1;if(0===g.captureCount)if(a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9)b.element.releaseCapture();else{f=e(b,a.MouseTracker.havePointerEvents?"pointerevent":c);qa&&na(window.top)&&a.removeEvent(window.top,f.upName,f.upHandler,!0);a.removeEvent(a.MouseTracker.captureElement,f.moveName,f.moveHandler,!0);a.removeEvent(a.MouseTracker.captureElement,f.upName,f.upHandler,!0)}}function h(b){var c;if(a.MouseTracker.unprefixedPointerEvents)c=b.pointerType;else switch(b.pointerType){case 2:c="touch";break;case 3:c="pen";break;case 4:c="mouse";break;default:c=""}return c}function i(b){return a.getMousePosition(b)}function j(a,b){return k(i(a),b)}function k(b,c){var d=a.getElementOffset(c);return b.minus(d)}function l(b,c){return new a.Point((b.x+c.x)/2,(b.y+c.y)/2)}function m(b,c){b.clickHandler&&a.cancelEvent(c)}function n(b,c){b.dblClickHandler&&a.cancelEvent(c)}function o(b,c){var d;if(b.keyDownHandler){c=a.getEvent(c);d=b.keyDownHandler({eventSource:b,keyCode:c.keyCode?c.keyCode:c.charCode,ctrl:c.ctrlKey,shift:c.shiftKey,alt:c.altKey,meta:c.metaKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d||a.cancelEvent(c)}}function p(b,c){var d;if(b.keyUpHandler){c=a.getEvent(c);d=b.keyUpHandler({eventSource:b,keyCode:c.keyCode?c.keyCode:c.charCode,ctrl:c.ctrlKey,shift:c.shiftKey,alt:c.altKey,meta:c.metaKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d||a.cancelEvent(c)}}function q(b,c){var d;if(b.keyHandler){c=a.getEvent(c);d=b.keyHandler({eventSource:b,keyCode:c.keyCode?c.keyCode:c.charCode,ctrl:c.ctrlKey,shift:c.shiftKey,alt:c.altKey,meta:c.metaKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d||a.cancelEvent(c)}}function r(b,c){var d;if(b.focusHandler){c=a.getEvent(c);d=b.focusHandler({eventSource:b,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d===!1&&a.cancelEvent(c)}}function s(b,c){var d;if(b.blurHandler){c=a.getEvent(c);d=b.blurHandler({eventSource:b,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d===!1&&a.cancelEvent(c)}}function t(a,b){v(a,b,b)}function u(b,c){c=a.getEvent(c);var d={target:c.target||c.srcElement,type:"wheel",shiftKey:c.shiftKey||!1,clientX:c.clientX,clientY:c.clientY,pageX:c.pageX?c.pageX:c.clientX,pageY:c.pageY?c.pageY:c.clientY,deltaMode:"MozMousePixelScroll"==c.type?0:1,deltaX:0,deltaZ:0};"mousewheel"==a.MouseTracker.wheelEventName?d.deltaY=-1/a.DEFAULT_SETTINGS.pixelsPerWheelLine*c.wheelDelta:d.deltaY=c.detail;v(b,d,c)}function v(b,c,d){var e,f=0;f=c.deltaY<0?1:-1;if(b.scrollHandler){e=b.scrollHandler({eventSource:b,pointerType:"mouse",position:j(c,b.element),scroll:f,shift:c.shiftKey,isTouchEvent:!1,originalEvent:d,preventDefaultAction:!1,userData:b.userData});e===!1&&a.cancelEvent(d)}}function w(a,b){if(a===b)return!1;for(;b&&b!==a;)b=b.parentNode;return b===a}function x(b,c){c=a.getEvent(c);z(b,c)}function y(b,c){c=a.getEvent(c);c.currentTarget===c.relatedTarget||w(c.currentTarget,c.relatedTarget)||z(b,c)}function z(b,c){var d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ga(b,c,[d])}function A(b,c){c=a.getEvent(c);C(b,c)}function B(b,c){c=a.getEvent(c);c.currentTarget===c.relatedTarget||w(c.currentTarget,c.relatedTarget)||C(b,c)}function C(b,c){var d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ha(b,c,[d])}function D(b){return a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9?1===b?0:2===b?2:4===b?1:-1:b}function E(b,c){var d;c=a.getEvent(c);d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};if(ia(b,c,[d],D(c.button))){a.stopEvent(c);f(b,"mouse")}(b.clickHandler||b.dblClickHandler||b.pressHandler||b.dragHandler||b.dragEndHandler)&&a.cancelEvent(c)}function F(a,b){H(a,b)}function G(b,c){H(b,c);a.stopEvent(c)}function H(b,c){var d;c=a.getEvent(c);d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ja(b,c,[d],D(c.button))&&g(b,"mouse")}function I(a,b){K(a,b)}function J(b,c){K(b,c);a.stopEvent(c)}function K(b,c){var d;c=a.getEvent(c);d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ka(b,c,[d])}function L(a,b,c){var d,e=c.getLength(),f=[];for(d=0;e>d;d++)f.push(c.getByIndex(d));if(f.length>0){ja(a,b,f,0);c.captureCount=1;g(a,"touch");ha(a,b,f)}}function M(b,c){var d,e,g,h,j=c.changedTouches.length,k=[],l=b.getActivePointersListByType("touch");d=a.now();if(l.getLength()>c.touches.length-j){a.console.warn("Tracked touch contact count doesn't match event.touches.length. Removing all tracked touch pointers.");L(b,c,l)}for(e=0;j>e;e++)k.push({id:c.changedTouches[e].identifier,type:"touch",currentPos:i(c.changedTouches[e]),currentTime:d});ga(b,c,k);for(e=0;e<oa.length;e++)if(oa[e]!==b&&oa[e].isTracking()&&w(oa[e].element,b.element)){h=[];for(g=0;j>g;g++)h.push({id:c.changedTouches[g].identifier,type:"touch",currentPos:i(c.changedTouches[g]),currentTime:d});ga(oa[e],c,h)}if(ia(b,c,k,0)){a.stopEvent(c);f(b,"touch",j)}a.cancelEvent(c)}function N(a,b){P(a,b)}function O(b,c){P(b,c);a.stopEvent(c)}function P(b,c){var d,e,f,h,j=c.changedTouches.length,k=[];d=a.now();for(e=0;j>e;e++)k.push({id:c.changedTouches[e].identifier,type:"touch",currentPos:i(c.changedTouches[e]),currentTime:d});ja(b,c,k,0)&&g(b,"touch",j);ha(b,c,k);for(e=0;e<oa.length;e++)if(oa[e]!==b&&oa[e].isTracking()&&w(oa[e].element,b.element)){h=[];for(f=0;j>f;f++)h.push({id:c.changedTouches[f].identifier,type:"touch",currentPos:i(c.changedTouches[f]),currentTime:d});ha(oa[e],c,h)}a.cancelEvent(c)}function Q(a,b){S(a,b)}function R(b,c){S(b,c);a.stopEvent(c)}function S(b,c){var d,e=c.changedTouches.length,f=[];for(d=0;e>d;d++)f.push({id:c.changedTouches[d].identifier,type:"touch",currentPos:i(c.changedTouches[d]),currentTime:a.now()});ka(b,c,f);a.cancelEvent(c)}function T(a,b){var c=(b.changedTouches.length,a.getActivePointersListByType("touch"));L(a,b,c)}function U(a,b){b.stopPropagation();b.preventDefault();return!1}function V(a,b){b.stopPropagation();b.preventDefault();return!1}function W(b,c){var d;if(c.currentTarget!==c.relatedTarget&&!w(c.currentTarget,c.relatedTarget)){d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ga(b,c,[d])}}function X(b,c){var d;if(c.currentTarget!==c.relatedTarget&&!w(c.currentTarget,c.relatedTarget)){d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ha(b,c,[d])}}function Y(b,c){var d;d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};if(ia(b,c,[d],c.button)){
+a.stopEvent(c);f(b,d.type)}(b.clickHandler||b.dblClickHandler||b.pressHandler||b.dragHandler||b.dragEndHandler||b.pinchHandler)&&a.cancelEvent(c)}function Z(a,b){_(a,b)}function $(b,c){var d=b.getActivePointersListByType(h(c));d.getById(c.pointerId)&&_(b,c);a.stopEvent(c)}function _(b,c){var d;d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ja(b,c,[d],c.button)&&g(b,d.type)}function aa(a,b){ca(a,b)}function ba(b,c){var d=b.getActivePointersListByType(h(c));d.getById(c.pointerId)&&ca(b,c);a.stopEvent(c)}function ca(b,c){var d;d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ka(b,c,[d])}function da(a,b){var c;c={id:b.pointerId,type:h(b)};la(a,b,[c])}function ea(a,b){b.hasOwnProperty("isPrimary")||(0===a.getLength()?b.isPrimary=!0:b.isPrimary=!1);b.speed=0;b.direction=0;b.contactPos=b.currentPos;b.contactTime=b.currentTime;b.lastPos=b.currentPos;b.lastTime=b.currentTime;return a.add(b)}function fa(a,b){var c,d;if(a.getById(b.id)){c=a.removeById(b.id);if(!b.hasOwnProperty("isPrimary")){d=a.getPrimary();if(!d){d=a.getByIndex(0);d&&(d.isPrimary=!0)}}}else c=a.getLength();return c}function ga(b,c,d){var e,f,g,h,i=b.getActivePointersListByType(d[0].type),j=d.length;for(e=0;j>e;e++){f=d[e];g=i.getById(f.id);if(g){g.insideElement=!0;g.lastPos=g.currentPos;g.lastTime=g.currentTime;g.currentPos=f.currentPos;g.currentTime=f.currentTime;f=g}else{f.captured=!1;f.insideElementPressed=!1;f.insideElement=!0;ea(i,f)}if(b.enterHandler){h=b.enterHandler({eventSource:b,pointerType:f.type,position:k(f.currentPos,b.element),buttons:i.buttons,pointers:b.getActivePointerCount(),insideElementPressed:f.insideElementPressed,buttonDownAny:0!==i.buttons,isTouchEvent:"touch"===f.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});h===!1&&a.cancelEvent(c)}}}function ha(b,c,d){var e,f,g,h,i=(pa[b.hash],b.getActivePointersListByType(d[0].type)),j=d.length;for(e=0;j>e;e++){f=d[e];g=i.getById(f.id);if(g){if(g.captured){g.insideElement=!1;g.lastPos=g.currentPos;g.lastTime=g.currentTime;g.currentPos=f.currentPos;g.currentTime=f.currentTime}else fa(i,g);f=g}if(b.exitHandler){h=b.exitHandler({eventSource:b,pointerType:f.type,position:k(f.currentPos,b.element),buttons:i.buttons,pointers:b.getActivePointerCount(),insideElementPressed:g?g.insideElementPressed:!1,buttonDownAny:0!==i.buttons,isTouchEvent:"touch"===f.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});h===!1&&a.cancelEvent(c)}}}function ia(b,c,d,e){var f,g,h,i,j=pa[b.hash],m=b.getActivePointersListByType(d[0].type),n=d.length;"undefined"!=typeof c.buttons?m.buttons=c.buttons:a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9?0===e?m.buttons+=1:1===e?m.buttons+=4:2===e?m.buttons+=2:3===e?m.buttons+=8:4===e?m.buttons+=16:5===e&&(m.buttons+=32):0===e?m.buttons|=1:1===e?m.buttons|=4:2===e?m.buttons|=2:3===e?m.buttons|=8:4===e?m.buttons|=16:5===e&&(m.buttons|=32);if(0!==e){if(b.nonPrimaryPressHandler){f=b.nonPrimaryPressHandler({eventSource:b,pointerType:d[0].type,position:k(d[0].currentPos,b.element),button:e,buttons:m.buttons,isTouchEvent:"touch"===d[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}return!1}for(g=0;n>g;g++){h=d[g];i=m.getById(h.id);if(i){i.captured=!0;i.insideElementPressed=!0;i.insideElement=!0;i.contactPos=h.currentPos;i.contactTime=h.currentTime;i.lastPos=i.currentPos;i.lastTime=i.currentTime;i.currentPos=h.currentPos;i.currentTime=h.currentTime;h=i}else{h.captured=!0;h.insideElementPressed=!0;h.insideElement=!0;ea(m,h)}m.contacts++;(b.dragHandler||b.dragEndHandler||b.pinchHandler)&&a.MouseTracker.gesturePointVelocityTracker.addPoint(b,h);if(1===m.contacts){if(b.pressHandler){f=b.pressHandler({eventSource:b,pointerType:h.type,position:k(h.contactPos,b.element),buttons:m.buttons,isTouchEvent:"touch"===h.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}}else if(2===m.contacts&&b.pinchHandler&&"touch"===h.type){j.pinchGPoints=m.asArray();j.lastPinchDist=j.currentPinchDist=j.pinchGPoints[0].currentPos.distanceTo(j.pinchGPoints[1].currentPos);j.lastPinchCenter=j.currentPinchCenter=l(j.pinchGPoints[0].currentPos,j.pinchGPoints[1].currentPos)}}return!0}function ja(b,c,d,e){var f,g,h,i,j,m,n,o=pa[b.hash],p=b.getActivePointersListByType(d[0].type),q=d.length,r=!1,s=!1;"undefined"!=typeof c.buttons?p.buttons=c.buttons:a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9?0===e?p.buttons-=1:1===e?p.buttons-=4:2===e?p.buttons-=2:3===e?p.buttons-=8:4===e?p.buttons-=16:5===e&&(p.buttons-=32):0===e?p.buttons^=-2:1===e?p.buttons^=-5:2===e?p.buttons^=-3:3===e?p.buttons^=-9:4===e?p.buttons^=-17:5===e&&(p.buttons^=-33);if(0!==e){if(b.nonPrimaryReleaseHandler){f=b.nonPrimaryReleaseHandler({eventSource:b,pointerType:d[0].type,position:k(d[0].currentPos,b.element),button:e,buttons:p.buttons,isTouchEvent:"touch"===d[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}return!1}for(i=0;q>i;i++){j=d[i];m=p.getById(j.id);if(m){if(m.captured){m.captured=!1;r=!0;s=!0}m.lastPos=m.currentPos;m.lastTime=m.currentTime;m.currentPos=j.currentPos;m.currentTime=j.currentTime;m.insideElement||fa(p,m);g=m.currentPos;h=m.currentTime;if(s){p.contacts--;(b.dragHandler||b.dragEndHandler||b.pinchHandler)&&a.MouseTracker.gesturePointVelocityTracker.removePoint(b,m);if(0===p.contacts){if(b.releaseHandler){f=b.releaseHandler({eventSource:b,pointerType:m.type,position:k(g,b.element),buttons:p.buttons,insideElementPressed:m.insideElementPressed,insideElementReleased:m.insideElement,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}if(b.dragEndHandler&&!m.currentPos.equals(m.contactPos)){f=b.dragEndHandler({eventSource:b,pointerType:m.type,position:k(m.currentPos,b.element),speed:m.speed,direction:m.direction,shift:c.shiftKey,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}if((b.clickHandler||b.dblClickHandler)&&m.insideElement){n=h-m.contactTime<=b.clickTimeThreshold&&m.contactPos.distanceTo(g)<=b.clickDistThreshold;if(b.clickHandler){f=b.clickHandler({eventSource:b,pointerType:m.type,position:k(m.currentPos,b.element),quick:n,shift:c.shiftKey,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}if(b.dblClickHandler&&n){p.clicks++;if(1===p.clicks){o.lastClickPos=g;o.dblClickTimeOut=setTimeout(function(){p.clicks=0},b.dblClickTimeThreshold)}else if(2===p.clicks){clearTimeout(o.dblClickTimeOut);p.clicks=0;if(o.lastClickPos.distanceTo(g)<=b.dblClickDistThreshold){f=b.dblClickHandler({eventSource:b,pointerType:m.type,position:k(m.currentPos,b.element),shift:c.shiftKey,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}o.lastClickPos=null}}}}else if(2===p.contacts&&b.pinchHandler&&"touch"===m.type){o.pinchGPoints=p.asArray();o.lastPinchDist=o.currentPinchDist=o.pinchGPoints[0].currentPos.distanceTo(o.pinchGPoints[1].currentPos);o.lastPinchCenter=o.currentPinchCenter=l(o.pinchGPoints[0].currentPos,o.pinchGPoints[1].currentPos)}}else if(b.releaseHandler){f=b.releaseHandler({eventSource:b,pointerType:m.type,position:k(g,b.element),buttons:p.buttons,insideElementPressed:m.insideElementPressed,insideElementReleased:m.insideElement,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}}}return r}function ka(b,c,d){var e,f,g,h,i,j,m=pa[b.hash],n=b.getActivePointersListByType(d[0].type),o=d.length;"undefined"!=typeof c.buttons&&(n.buttons=c.buttons);for(e=0;o>e;e++){f=d[e];g=n.getById(f.id);if(g){f.hasOwnProperty("isPrimary")&&(g.isPrimary=f.isPrimary);g.lastPos=g.currentPos;g.lastTime=g.currentTime;g.currentPos=f.currentPos;g.currentTime=f.currentTime}else{f.captured=!1;f.insideElementPressed=!1;f.insideElement=!0;ea(n,f)}}if(b.stopHandler&&"mouse"===d[0].type){clearTimeout(b.stopTimeOut);b.stopTimeOut=setTimeout(function(){ma(b,c,d[0].type)},b.stopDelay)}if(0===n.contacts){if(b.moveHandler){j=b.moveHandler({eventSource:b,pointerType:d[0].type,position:k(d[0].currentPos,b.element),buttons:n.buttons,isTouchEvent:"touch"===d[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}}else if(1===n.contacts){if(b.moveHandler){g=n.asArray()[0];j=b.moveHandler({eventSource:b,pointerType:g.type,position:k(g.currentPos,b.element),buttons:n.buttons,isTouchEvent:"touch"===g.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}if(b.dragHandler){g=n.asArray()[0];i=g.currentPos.minus(g.lastPos);j=b.dragHandler({eventSource:b,pointerType:g.type,position:k(g.currentPos,b.element),buttons:n.buttons,delta:i,speed:g.speed,direction:g.direction,shift:c.shiftKey,isTouchEvent:"touch"===g.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}}else if(2===n.contacts){if(b.moveHandler){h=n.asArray();j=b.moveHandler({eventSource:b,pointerType:h[0].type,position:k(l(h[0].currentPos,h[1].currentPos),b.element),buttons:n.buttons,isTouchEvent:"touch"===h[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}if(b.pinchHandler&&"touch"===d[0].type){i=m.pinchGPoints[0].currentPos.distanceTo(m.pinchGPoints[1].currentPos);if(i!=m.currentPinchDist){m.lastPinchDist=m.currentPinchDist;m.currentPinchDist=i;m.lastPinchCenter=m.currentPinchCenter;m.currentPinchCenter=l(m.pinchGPoints[0].currentPos,m.pinchGPoints[1].currentPos);j=b.pinchHandler({eventSource:b,pointerType:"touch",gesturePoints:m.pinchGPoints,lastCenter:k(m.lastPinchCenter,b.element),center:k(m.currentPinchCenter,b.element),lastDistance:m.lastPinchDist,distance:m.currentPinchDist,shift:c.shiftKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}}}}function la(a,b,c){ja(a,b,c,0);ha(a,b,c)}function ma(a,b,c){a.stopHandler&&a.stopHandler({eventSource:a,pointerType:c,position:j(b,a.element),buttons:a.getActivePointersListByType(c).buttons,isTouchEvent:"touch"===c,originalEvent:b,preventDefaultAction:!1,userData:a.userData})}function na(a){try{return a.addEventListener&&a.removeEventListener}catch(b){return!1}}var oa=[];var pa={};a.MouseTracker=function(b){oa.push(this);var c=arguments;a.isPlainObject(b)||(b={element:c[0],clickTimeThreshold:c[1],clickDistThreshold:c[2]});this.hash=Math.random();this.element=a.getElement(b.element);this.clickTimeThreshold=b.clickTimeThreshold||a.DEFAULT_SETTINGS.clickTimeThreshold;this.clickDistThreshold=b.clickDistThreshold||a.DEFAULT_SETTINGS.clickDistThreshold;this.dblClickTimeThreshold=b.dblClickTimeThreshold||a.DEFAULT_SETTINGS.dblClickTimeThreshold;this.dblClickDistThreshold=b.dblClickDistThreshold||a.DEFAULT_SETTINGS.dblClickDistThreshold;this.userData=b.userData||null;this.stopDelay=b.stopDelay||50;this.enterHandler=b.enterHandler||null;this.exitHandler=b.exitHandler||null;this.pressHandler=b.pressHandler||null;this.nonPrimaryPressHandler=b.nonPrimaryPressHandler||null;this.releaseHandler=b.releaseHandler||null;this.nonPrimaryReleaseHandler=b.nonPrimaryReleaseHandler||null;this.moveHandler=b.moveHandler||null;this.scrollHandler=b.scrollHandler||null;this.clickHandler=b.clickHandler||null;this.dblClickHandler=b.dblClickHandler||null;this.dragHandler=b.dragHandler||null;this.dragEndHandler=b.dragEndHandler||null;this.pinchHandler=b.pinchHandler||null;this.stopHandler=b.stopHandler||null;this.keyDownHandler=b.keyDownHandler||null;this.keyUpHandler=b.keyUpHandler||null;this.keyHandler=b.keyHandler||null;this.focusHandler=b.focusHandler||null;this.blurHandler=b.blurHandler||null;var d=this;pa[this.hash]={click:function(a){m(d,a)},dblclick:function(a){n(d,a)},keydown:function(a){o(d,a)},keyup:function(a){p(d,a)},keypress:function(a){q(d,a)},focus:function(a){r(d,a)},blur:function(a){s(d,a)},wheel:function(a){t(d,a)},mousewheel:function(a){u(d,a)},DOMMouseScroll:function(a){u(d,a)},MozMousePixelScroll:function(a){u(d,a)},mouseenter:function(a){x(d,a)},mouseleave:function(a){A(d,a)},mouseover:function(a){y(d,a)},mouseout:function(a){B(d,a)},mousedown:function(a){E(d,a)},mouseup:function(a){F(d,a)},mouseupcaptured:function(a){G(d,a)},mousemove:function(a){I(d,a)},mousemovecaptured:function(a){J(d,a)},touchstart:function(a){M(d,a)},touchend:function(a){N(d,a)},touchendcaptured:function(a){O(d,a)},touchmove:function(a){Q(d,a)},touchmovecaptured:function(a){R(d,a)},touchcancel:function(a){T(d,a)},gesturestart:function(a){U(d,a)},gesturechange:function(a){V(d,a)},pointerover:function(a){W(d,a)},MSPointerOver:function(a){W(d,a)},pointerout:function(a){X(d,a)},MSPointerOut:function(a){X(d,a)},pointerdown:function(a){Y(d,a)},MSPointerDown:function(a){Y(d,a)},pointerup:function(a){Z(d,a)},MSPointerUp:function(a){Z(d,a)},pointermove:function(a){aa(d,a)},MSPointerMove:function(a){aa(d,a)},pointercancel:function(a){da(d,a)},MSPointerCancel:function(a){da(d,a)},pointerupcaptured:function(a){$(d,a)},pointermovecaptured:function(a){ba(d,a)},tracking:!1,activePointersLists:[],lastClickPos:null,dblClickTimeOut:null,pinchGPoints:[],lastPinchDist:0,currentPinchDist:0,lastPinchCenter:null,currentPinchCenter:null};b.startDisabled||this.setTracking(!0)};a.MouseTracker.prototype={destroy:function(){var a;d(this);this.element=null;for(a=0;a<oa.length;a++)if(oa[a]===this){oa.splice(a,1);break}pa[this.hash]=null;delete pa[this.hash]},isTracking:function(){return pa[this.hash].tracking},setTracking:function(a){a?c(this):d(this);return this},getActivePointersListByType:function(b){var c,d,e=pa[this.hash],f=e.activePointersLists.length;for(c=0;f>c;c++)if(e.activePointersLists[c].type===b)return e.activePointersLists[c];d=new a.MouseTracker.GesturePointList(b);e.activePointersLists.push(d);return d},getActivePointerCount:function(){var a,b=pa[this.hash],c=b.activePointersLists.length,d=0;for(a=0;c>a;a++)d+=b.activePointersLists[a].getLength();return d},enterHandler:function(){},exitHandler:function(){},pressHandler:function(){},nonPrimaryPressHandler:function(){},releaseHandler:function(){},nonPrimaryReleaseHandler:function(){},moveHandler:function(){},scrollHandler:function(){},clickHandler:function(){},dblClickHandler:function(){},dragHandler:function(){},dragEndHandler:function(){},pinchHandler:function(){},stopHandler:function(){},keyDownHandler:function(){},keyUpHandler:function(){},keyHandler:function(){},focusHandler:function(){},blurHandler:function(){}};a.MouseTracker.gesturePointVelocityTracker=function(){var b=[],c=0,d=0;var e=function(a,b){return a.hash.toString()+b.type+b.id.toString()};var f=function(){var c,e,f,g,h,i,j=b.length,k=a.now();g=k-d;d=k;for(c=0;j>c;c++){e=b[c];f=e.gPoint;f.direction=Math.atan2(f.currentPos.y-e.lastPos.y,f.currentPos.x-e.lastPos.x);h=e.lastPos.distanceTo(f.currentPos);e.lastPos=f.currentPos;i=1e3*h/(g+1);f.speed=.75*i+.25*f.speed}};var g=function(g,h){var i=e(g,h);b.push({guid:i,gPoint:h,lastPos:h.currentPos});if(1===b.length){d=a.now();c=window.setInterval(f,50)}};var h=function(a,d){var f,g=e(a,d),h=b.length;for(f=0;h>f;f++)if(b[f].guid===g){b.splice(f,1);h--;0===h&&window.clearInterval(c);break}};return{addPoint:g,removePoint:h}}();a.MouseTracker.captureElement=document;a.MouseTracker.wheelEventName=a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version>8||"onwheel"in document.createElement("div")?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll";a.MouseTracker.supportsMouseCapture=function(){var b=document.createElement("div");return a.isFunction(b.setCapture)&&a.isFunction(b.releaseCapture)}();a.MouseTracker.subscribeEvents=["click","dblclick","keydown","keyup","keypress","focus","blur",a.MouseTracker.wheelEventName];"DOMMouseScroll"==a.MouseTracker.wheelEventName&&a.MouseTracker.subscribeEvents.push("MozMousePixelScroll");if(window.PointerEvent&&(window.navigator.pointerEnabled||a.Browser.vendor!==a.BROWSERS.IE)){a.MouseTracker.havePointerEvents=!0;a.MouseTracker.subscribeEvents.push("pointerover","pointerout","pointerdown","pointerup","pointermove","pointercancel");a.MouseTracker.unprefixedPointerEvents=!0;navigator.maxTouchPoints?a.MouseTracker.maxTouchPoints=navigator.maxTouchPoints:a.MouseTracker.maxTouchPoints=0;a.MouseTracker.haveMouseEnter=!1}else if(window.MSPointerEvent&&window.navigator.msPointerEnabled){a.MouseTracker.havePointerEvents=!0;a.MouseTracker.subscribeEvents.push("MSPointerOver","MSPointerOut","MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel");a.MouseTracker.unprefixedPointerEvents=!1;navigator.msMaxTouchPoints?a.MouseTracker.maxTouchPoints=navigator.msMaxTouchPoints:a.MouseTracker.maxTouchPoints=0;a.MouseTracker.haveMouseEnter=!1}else{a.MouseTracker.havePointerEvents=!1;if(a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9){a.MouseTracker.subscribeEvents.push("mouseenter","mouseleave");a.MouseTracker.haveMouseEnter=!0}else{a.MouseTracker.subscribeEvents.push("mouseover","mouseout");a.MouseTracker.haveMouseEnter=!1}a.MouseTracker.subscribeEvents.push("mousedown","mouseup","mousemove");"ontouchstart"in window&&a.MouseTracker.subscribeEvents.push("touchstart","touchend","touchmove","touchcancel");"ongesturestart"in window&&a.MouseTracker.subscribeEvents.push("gesturestart","gesturechange");a.MouseTracker.mousePointerId="legacy-mouse";a.MouseTracker.maxTouchPoints=10}a.MouseTracker.GesturePointList=function(a){this._gPoints=[];this.type=a;this.buttons=0;this.contacts=0;this.clicks=0;this.captureCount=0};a.MouseTracker.GesturePointList.prototype={getLength:function(){return this._gPoints.length},asArray:function(){return this._gPoints},add:function(a){return this._gPoints.push(a)},removeById:function(a){var b,c=this._gPoints.length;for(b=0;c>b;b++)if(this._gPoints[b].id===a){this._gPoints.splice(b,1);break}return this._gPoints.length},getByIndex:function(a){return a<this._gPoints.length?this._gPoints[a]:null},getById:function(a){var b,c=this._gPoints.length;for(b=0;c>b;b++)if(this._gPoints[b].id===a)return this._gPoints[b];return null},getPrimary:function(a){var b,c=this._gPoints.length;for(b=0;c>b;b++)if(this._gPoints[b].isPrimary)return this._gPoints[b];return null}};var qa=function(){try{return window.self!==window.top}catch(a){return!0}}()}(OpenSeadragon);!function(a){a.ControlAnchor={NONE:0,TOP_LEFT:1,TOP_RIGHT:2,BOTTOM_RIGHT:3,BOTTOM_LEFT:4,ABSOLUTE:5};a.Control=function(b,c,d){var e=b.parentNode;if("number"==typeof c){a.console.error("Passing an anchor directly into the OpenSeadragon.Control constructor is deprecated; please use an options object instead.  Support for this deprecated variant is scheduled for removal in December 2013");c={anchor:c}}c.attachToViewer="undefined"==typeof c.attachToViewer?!0:c.attachToViewer;this.autoFade="undefined"==typeof c.autoFade?!0:c.autoFade;this.element=b;this.anchor=c.anchor;this.container=d;if(this.anchor==a.ControlAnchor.ABSOLUTE){this.wrapper=a.makeNeutralElement("div");this.wrapper.style.position="absolute";this.wrapper.style.top="number"==typeof c.top?c.top+"px":c.top;this.wrapper.style.left="number"==typeof c.left?c.left+"px":c.left;this.wrapper.style.height="number"==typeof c.height?c.height+"px":c.height;this.wrapper.style.width="number"==typeof c.width?c.width+"px":c.width;this.wrapper.style.margin="0px";this.wrapper.style.padding="0px";this.element.style.position="relative";this.element.style.top="0px";this.element.style.left="0px";this.element.style.height="100%";this.element.style.width="100%"}else{this.wrapper=a.makeNeutralElement("div");this.wrapper.style.display="inline-block";this.anchor==a.ControlAnchor.NONE&&(this.wrapper.style.width=this.wrapper.style.height="100%")}this.wrapper.appendChild(this.element);c.attachToViewer?this.anchor==a.ControlAnchor.TOP_RIGHT||this.anchor==a.ControlAnchor.BOTTOM_RIGHT?this.container.insertBefore(this.wrapper,this.container.firstChild):this.container.appendChild(this.wrapper):e.appendChild(this.wrapper)};a.Control.prototype={destroy:function(){this.wrapper.removeChild(this.element);this.container.removeChild(this.wrapper)},isVisible:function(){return"none"!=this.wrapper.style.display},setVisible:function(b){this.wrapper.style.display=b?this.anchor==a.ControlAnchor.ABSOLUTE?"block":"inline-block":"none"},setOpacity:function(b){this.element[a.SIGNAL]&&a.Browser.vendor==a.BROWSERS.IE?a.setElementOpacity(this.element,b,!0):a.setElementOpacity(this.wrapper,b,!0)}}}(OpenSeadragon);!function(a){function b(a,b){var c,d=a.controls;for(c=d.length-1;c>=0;c--)if(d[c].element==b)return c;return-1}a.ControlDock=function(b){var c,d,e=["topleft","topright","bottomright","bottomleft"];a.extend(!0,this,{id:"controldock-"+a.now()+"-"+Math.floor(1e6*Math.random()),container:a.makeNeutralElement("div"),controls:[]},b);this.container.onsubmit=function(){return!1};if(this.element){this.element=a.getElement(this.element);this.element.appendChild(this.container);this.element.style.position="relative";this.container.style.width="100%";this.container.style.height="100%"}for(d=0;d<e.length;d++){c=e[d];this.controls[c]=a.makeNeutralElement("div");this.controls[c].style.position="absolute";c.match("left")&&(this.controls[c].style.left="0px");c.match("right")&&(this.controls[c].style.right="0px");c.match("top")&&(this.controls[c].style.top="0px");c.match("bottom")&&(this.controls[c].style.bottom="0px")}this.container.appendChild(this.controls.topleft);this.container.appendChild(this.controls.topright);this.container.appendChild(this.controls.bottomright);this.container.appendChild(this.controls.bottomleft)};a.ControlDock.prototype={addControl:function(c,d){c=a.getElement(c);var e=null;if(!(b(this,c)>=0)){switch(d.anchor){case a.ControlAnchor.TOP_RIGHT:e=this.controls.topright;c.style.position="relative";c.style.paddingRight="0px";c.style.paddingTop="0px";break;case a.ControlAnchor.BOTTOM_RIGHT:e=this.controls.bottomright;c.style.position="relative";c.style.paddingRight="0px";c.style.paddingBottom="0px";break;case a.ControlAnchor.BOTTOM_LEFT:e=this.controls.bottomleft;c.style.position="relative";c.style.paddingLeft="0px";c.style.paddingBottom="0px";break;case a.ControlAnchor.TOP_LEFT:e=this.controls.topleft;c.style.position="relative";c.style.paddingLeft="0px";c.style.paddingTop="0px";break;case a.ControlAnchor.ABSOLUTE:e=this.container;c.style.margin="0px";c.style.padding="0px";break;default:case a.ControlAnchor.NONE:e=this.container;c.style.margin="0px";c.style.padding="0px"}this.controls.push(new a.Control(c,d,e));c.style.display="inline-block"}},removeControl:function(c){c=a.getElement(c);var d=b(this,c);if(d>=0){this.controls[d].destroy();this.controls.splice(d,1)}return this},clearControls:function(){for(;this.controls.length>0;)this.controls.pop().destroy();return this},areControlsEnabled:function(){var a;for(a=this.controls.length-1;a>=0;a--)if(this.controls[a].isVisible())return!0;return!1},setControlsEnabled:function(a){var b;for(b=this.controls.length-1;b>=0;b--)this.controls[b].setVisible(a);return this}}}(OpenSeadragon);!function(a){a.Placement=a.freezeObject({CENTER:0,TOP_LEFT:1,TOP:2,TOP_RIGHT:3,RIGHT:4,BOTTOM_RIGHT:5,BOTTOM:6,BOTTOM_LEFT:7,LEFT:8,properties:{0:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!1,isVerticallyCentered:!0,isBottom:!1},1:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!0,isVerticallyCentered:!1,isBottom:!1},2:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!0,isVerticallyCentered:!1,isBottom:!1},3:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!0,isVerticallyCentered:!1,isBottom:!1},4:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!1,isVerticallyCentered:!0,isBottom:!1},5:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!1,isVerticallyCentered:!1,isBottom:!0},6:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!1,isVerticallyCentered:!1,isBottom:!0},7:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!1,isVerticallyCentered:!1,isBottom:!0},8:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!1,isVerticallyCentered:!0,isBottom:!1}}})}(OpenSeadragon);!function(a){function b(b){b=a.getElement(b);return new a.Point(0===b.clientWidth?1:b.clientWidth,0===b.clientHeight?1:b.clientHeight)}function c(b,c,d,e){function f(a,b){if(a.ready)d(a);else{a.addHandler("ready",function(){d(a)});a.addHandler("open-failed",function(a){e({message:a.message,source:b})})}}var g=b;"string"==a.type(c)&&(c.match(/\s*<.*/)?c=a.parseXml(c):c.match(/\s*[\{\[].*/)&&(c=a.parseJSON(c)));setTimeout(function(){if("string"==a.type(c)){c=new a.TileSource({url:c,crossOriginPolicy:b.crossOriginPolicy,ajaxWithCredentials:b.ajaxWithCredentials,useCanvas:b.useCanvas,success:function(a){d(a.tileSource)}});c.addHandler("open-failed",function(a){e(a)})}else if(a.isPlainObject(c)||c.nodeType){!c.crossOriginPolicy&&b.crossOriginPolicy&&(c.crossOriginPolicy=b.crossOriginPolicy);void 0===c.ajaxWithCredentials&&(c.ajaxWithCredentials=b.ajaxWithCredentials);void 0===c.useCanvas&&(c.useCanvas=b.useCanvas);if(a.isFunction(c.getTileUrl)){var h=new a.TileSource(c);h.getTileUrl=c.getTileUrl;d(h)}else{var i=a.TileSource.determineType(g,c);if(!i){e({message:"Unable to load TileSource",source:c});return}var j=i.prototype.configure.apply(g,[c]);f(new i(j),c)}}else f(c,c)})}function d(b,c){if(c instanceof a.Overlay)return c;var d=null;if(c.element)d=a.getElement(c.element);else{var e=c.id?c.id:"openseadragon-overlay-"+Math.floor(1e7*Math.random());d=a.getElement(c.id);if(!d){d=document.createElement("a");d.href="#/overlay/"+e}d.id=e;a.addClass(d,c.className?c.className:"openseadragon-overlay")}var f=c.location;var g=c.width;var h=c.height;if(!f){var i=c.x;var j=c.y;if(void 0!==c.px){var k=b.viewport.imageToViewportRectangle(new a.Rect(c.px,c.py,g||0,h||0));i=k.x;j=k.y;g=void 0!==g?k.width:void 0;h=void 0!==h?k.height:void 0}f=new a.Point(i,j)}var l=c.placement;l&&"string"===a.type(l)&&(l=a.Placement[c.placement.toUpperCase()]);return new a.Overlay({element:d,location:f,placement:l,onDraw:c.onDraw,checkResize:c.checkResize,width:g,height:h,rotationMode:c.rotationMode})}function e(a,b){var c;for(c=a.length-1;c>=0;c--)if(a[c].element===b)return c;return-1}function f(b,c){return a.requestAnimationFrame(function(){c(b)})}function g(b){a.requestAnimationFrame(function(){i(b)})}function h(b){if(b.autoHideControls){b.controlsShouldFade=!0;b.controlsFadeBeginTime=a.now()+b.controlsFadeDelay;window.setTimeout(function(){g(b)},b.controlsFadeDelay)}}function i(b){var c,d,e,f;if(b.controlsShouldFade){c=a.now();d=c-b.controlsFadeBeginTime;e=1-d/b.controlsFadeLength;e=Math.min(1,e);e=Math.max(0,e);for(f=b.controls.length-1;f>=0;f--)b.controls[f].autoFade&&b.controls[f].setOpacity(e);e>0&&g(b)}}function j(a){var b;a.controlsShouldFade=!1;for(b=a.controls.length-1;b>=0;b--)a.controls[b].setOpacity(1)}function k(){j(this)}function l(){h(this)}function m(b){if(b.preventDefaultAction||b.ctrl||b.alt||b.meta)return!0;switch(b.keyCode){case 38:b.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,-40)));this.viewport.applyConstraints();return!1;case 40:b.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,40)));this.viewport.applyConstraints();return!1;case 37:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(-40,0)));this.viewport.applyConstraints();return!1;case 39:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(40,0)));this.viewport.applyConstraints();return!1;default:return!0}}function n(b){if(b.preventDefaultAction||b.ctrl||b.alt||b.meta)return!0;switch(b.keyCode){case 43:case 61:this.viewport.zoomBy(1.1);this.viewport.applyConstraints();return!1;case 45:this.viewport.zoomBy(.9);this.viewport.applyConstraints();return!1;case 48:this.viewport.goHome();this.viewport.applyConstraints();return!1;case 119:case 87:b.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,-40)));this.viewport.applyConstraints();return!1;case 115:case 83:b.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,40)));this.viewport.applyConstraints();return!1;case 97:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(-40,0)));this.viewport.applyConstraints();return!1;case 100:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(40,0)));this.viewport.applyConstraints();return!1;default:return!0}}function o(a){var b;var c=document.activeElement==this.canvas;c||this.canvas.focus();if(!a.preventDefaultAction&&this.viewport&&a.quick){b=this.gestureSettingsByDeviceType(a.pointerType);if(b.clickToZoom){this.viewport.zoomBy(a.shift?1/this.zoomPerClick:this.zoomPerClick,this.viewport.pointFromPixel(a.position,!0));this.viewport.applyConstraints()}}this.raiseEvent("canvas-click",{tracker:a.eventSource,position:a.position,quick:a.quick,shift:a.shift,originalEvent:a.originalEvent})}function p(a){var b;if(!a.preventDefaultAction&&this.viewport){b=this.gestureSettingsByDeviceType(a.pointerType);if(b.dblClickToZoom){this.viewport.zoomBy(a.shift?1/this.zoomPerClick:this.zoomPerClick,this.viewport.pointFromPixel(a.position,!0));this.viewport.applyConstraints()}}this.raiseEvent("canvas-double-click",{tracker:a.eventSource,position:a.position,shift:a.shift,originalEvent:a.originalEvent})}function q(a){var b;if(!a.preventDefaultAction&&this.viewport){b=this.gestureSettingsByDeviceType(a.pointerType);this.panHorizontal||(a.delta.x=0);this.panVertical||(a.delta.y=0);this.viewport.panBy(this.viewport.deltaPointsFromPixels(a.delta.negate()),b.flickEnabled);this.constrainDuringPan&&this.viewport.applyConstraints()}this.raiseEvent("canvas-drag",{tracker:a.eventSource,position:a.position,delta:a.delta,speed:a.speed,direction:a.direction,shift:a.shift,originalEvent:a.originalEvent})}function r(b){if(!b.preventDefaultAction&&this.viewport){var c=this.gestureSettingsByDeviceType(b.pointerType);if(c.flickEnabled&&b.speed>=c.flickMinSpeed){var d=0;this.panHorizontal&&(d=c.flickMomentum*b.speed*Math.cos(b.direction));var e=0;this.panVertical&&(e=c.flickMomentum*b.speed*Math.sin(b.direction));var f=this.viewport.pixelFromPoint(this.viewport.getCenter(!0));var g=this.viewport.pointFromPixel(new a.Point(f.x-d,f.y-e));this.viewport.panTo(g,!1)}this.viewport.applyConstraints()}this.raiseEvent("canvas-drag-end",{tracker:b.eventSource,position:b.position,speed:b.speed,direction:b.direction,shift:b.shift,originalEvent:b.originalEvent})}function s(a){this.raiseEvent("canvas-enter",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function t(a){this.raiseEvent("canvas-exit",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function u(a){this.raiseEvent("canvas-press",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,insideElementPressed:a.insideElementPressed,insideElementReleased:a.insideElementReleased,originalEvent:a.originalEvent})}function v(a){this.raiseEvent("canvas-release",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,insideElementPressed:a.insideElementPressed,insideElementReleased:a.insideElementReleased,originalEvent:a.originalEvent})}function w(a){this.raiseEvent("canvas-nonprimary-press",{tracker:a.eventSource,position:a.position,pointerType:a.pointerType,button:a.button,buttons:a.buttons,originalEvent:a.originalEvent})}function x(a){this.raiseEvent("canvas-nonprimary-release",{tracker:a.eventSource,position:a.position,pointerType:a.pointerType,button:a.button,buttons:a.buttons,originalEvent:a.originalEvent})}function y(a){var b,c,d,e;if(!a.preventDefaultAction&&this.viewport){b=this.gestureSettingsByDeviceType(a.pointerType);
+if(b.pinchToZoom){c=this.viewport.pointFromPixel(a.center,!0);d=this.viewport.pointFromPixel(a.lastCenter,!0);e=d.minus(c);this.panHorizontal||(e.x=0);this.panVertical||(e.y=0);this.viewport.zoomBy(a.distance/a.lastDistance,c,!0);this.viewport.panBy(e,!0);this.viewport.applyConstraints()}if(b.pinchRotate){var f=Math.atan2(a.gesturePoints[0].currentPos.y-a.gesturePoints[1].currentPos.y,a.gesturePoints[0].currentPos.x-a.gesturePoints[1].currentPos.x);var g=Math.atan2(a.gesturePoints[0].lastPos.y-a.gesturePoints[1].lastPos.y,a.gesturePoints[0].lastPos.x-a.gesturePoints[1].lastPos.x);this.viewport.setRotation(this.viewport.getRotation()+(f-g)*(180/Math.PI))}}this.raiseEvent("canvas-pinch",{tracker:a.eventSource,gesturePoints:a.gesturePoints,lastCenter:a.lastCenter,center:a.center,lastDistance:a.lastDistance,distance:a.distance,shift:a.shift,originalEvent:a.originalEvent});return!1}function z(b){var c,d,e,f;e=a.now();f=e-this._lastScrollTime;if(f>this.minScrollDeltaTime){this._lastScrollTime=e;if(!b.preventDefaultAction&&this.viewport){c=this.gestureSettingsByDeviceType(b.pointerType);if(c.scrollToZoom){d=Math.pow(this.zoomPerScroll,b.scroll);this.viewport.zoomBy(d,this.viewport.pointFromPixel(b.position,!0));this.viewport.applyConstraints()}}this.raiseEvent("canvas-scroll",{tracker:b.eventSource,position:b.position,scroll:b.scroll,shift:b.shift,originalEvent:b.originalEvent});if(c&&c.scrollToZoom)return!1}else{c=this.gestureSettingsByDeviceType(b.pointerType);if(c&&c.scrollToZoom)return!1}}function A(a){U[this.hash].mouseInside=!0;j(this);this.raiseEvent("container-enter",{tracker:a.eventSource,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function B(a){if(a.pointers<1){U[this.hash].mouseInside=!1;U[this.hash].animating||h(this)}this.raiseEvent("container-exit",{tracker:a.eventSource,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function C(a){D(a);a.isOpen()?a._updateRequestId=f(a,C):a._updateRequestId=!1}function D(a){if(!a._opening){if(a.autoResize){var c=b(a.container);var d=U[a.hash].prevContainerSize;if(!c.equals(d)){var e=a.viewport;if(a.preserveImageSizeOnResize){var f=d.x/c.x;var g=e.getZoom()*f;var i=e.getCenter();e.resize(c,!1);e.zoomTo(g,null,!0);e.panTo(i,!0)}else{var k=e.getBounds();e.resize(c,!0);e.fitBoundsWithConstraints(k,!0)}U[a.hash].prevContainerSize=c;U[a.hash].forceRedraw=!0}}var l=a.viewport.update();var m=a.world.update()||l;l&&a.raiseEvent("viewport-change");a.referenceStrip&&(m=a.referenceStrip.update(a.viewport)||m);if(!U[a.hash].animating&&m){a.raiseEvent("animation-start");j(a)}if(m||U[a.hash].forceRedraw||a.world.needsDraw()){E(a);a._drawOverlays();a.navigator&&a.navigator.update(a.viewport);U[a.hash].forceRedraw=!1;m&&a.raiseEvent("animation")}if(U[a.hash].animating&&!m){a.raiseEvent("animation-finish");U[a.hash].mouseInside||h(a)}U[a.hash].animating=m}}function E(a){a.imageLoader.clear();a.drawer.clear();a.world.draw();a.raiseEvent("update-viewport",{})}function F(a,b){return a?a+b:b}function G(){U[this.hash].lastZoomTime=a.now();U[this.hash].zoomFactor=this.zoomPerSecond;U[this.hash].zooming=!0;J(this)}function H(){U[this.hash].lastZoomTime=a.now();U[this.hash].zoomFactor=1/this.zoomPerSecond;U[this.hash].zooming=!0;J(this)}function I(){U[this.hash].zooming=!1}function J(b){a.requestAnimationFrame(a.delegate(b,K))}function K(){var b,c,d;if(U[this.hash].zooming&&this.viewport){b=a.now();c=b-U[this.hash].lastZoomTime;d=Math.pow(U[this.hash].zoomFactor,c/1e3);this.viewport.zoomBy(d);this.viewport.applyConstraints();U[this.hash].lastZoomTime=b;J(this)}}function L(){if(this.viewport){U[this.hash].zooming=!1;this.viewport.zoomBy(this.zoomPerClick/1);this.viewport.applyConstraints()}}function M(){if(this.viewport){U[this.hash].zooming=!1;this.viewport.zoomBy(1/this.zoomPerClick);this.viewport.applyConstraints()}}function N(){this.buttons.emulateEnter();this.buttons.emulateExit()}function O(){this.viewport&&this.viewport.goHome()}function P(){this.isFullPage()&&!a.isFullScreen()?this.setFullPage(!1):this.setFullScreen(!this.isFullPage());this.buttons&&this.buttons.emulateExit();this.fullPageButton.element.focus();this.viewport&&this.viewport.applyConstraints()}function Q(){if(this.viewport){var a=this.viewport.getRotation();0===a?a=270:a-=90;this.viewport.setRotation(a)}}function R(){if(this.viewport){var a=this.viewport.getRotation();270===a?a=0:a+=90;this.viewport.setRotation(a)}}function S(){var a=this._sequenceIndex-1;this.navPrevNextWrap&&0>a&&(a+=this.tileSources.length);this.goToPage(a)}function T(){var a=this._sequenceIndex+1;this.navPrevNextWrap&&a>=this.tileSources.length&&(a=0);this.goToPage(a)}var U={};var V=1;a.Viewer=function(c){var d,e=arguments,g=this;a.isPlainObject(c)||(c={id:e[0],xmlPath:e.length>1?e[1]:void 0,prefixUrl:e.length>2?e[2]:void 0,controls:e.length>3?e[3]:void 0,overlays:e.length>4?e[4]:void 0});if(c.config){a.extend(!0,c,c.config);delete c.config}a.extend(!0,this,{id:c.id,hash:c.hash||V++,element:null,container:null,canvas:null,overlays:[],overlaysContainer:null,previousBody:[],customControls:[],source:null,drawer:null,world:null,viewport:null,navigator:null,collectionViewport:null,collectionDrawer:null,navImages:null,buttons:null,profiler:null},a.DEFAULT_SETTINGS,c);if("undefined"==typeof this.hash)throw new Error("A hash must be defined, either by specifying options.id or options.hash.");"undefined"!=typeof U[this.hash]&&a.console.warn("Hash "+this.hash+" has already been used.");U[this.hash]={fsBoundsDelta:new a.Point(1,1),prevContainerSize:null,animating:!1,forceRedraw:!1,mouseInside:!1,group:null,zooming:!1,zoomFactor:null,lastZoomTime:null,fullPage:!1,onfullscreenchange:null};this._sequenceIndex=0;this._firstOpen=!0;this._updateRequestId=null;this._loadQueue=[];this.currentOverlays=[];this._lastScrollTime=a.now();a.EventSource.call(this);this.addHandler("open-failed",function(b){var c=a.getString("Errors.OpenFailed",b.eventSource,b.message);g._showMessage(c)});a.ControlDock.call(this,c);this.xmlPath&&(this.tileSources=[this.xmlPath]);this.element=this.element||document.getElementById(this.id);this.canvas=a.makeNeutralElement("div");this.canvas.className="openseadragon-canvas";!function(a){a.width="100%";a.height="100%";a.overflow="hidden";a.position="absolute";a.top="0px";a.left="0px"}(this.canvas.style);a.setElementTouchActionNone(this.canvas);""!==c.tabIndex&&(this.canvas.tabIndex=void 0===c.tabIndex?0:c.tabIndex);this.container.className="openseadragon-container";!function(a){a.width="100%";a.height="100%";a.position="relative";a.overflow="hidden";a.left="0px";a.top="0px";a.textAlign="left"}(this.container.style);this.container.insertBefore(this.canvas,this.container.firstChild);this.element.appendChild(this.container);this.bodyWidth=document.body.style.width;this.bodyHeight=document.body.style.height;this.bodyOverflow=document.body.style.overflow;this.docOverflow=document.documentElement.style.overflow;this.innerTracker=new a.MouseTracker({element:this.canvas,startDisabled:this.mouseNavEnabled?!1:!0,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,keyDownHandler:a.delegate(this,m),keyHandler:a.delegate(this,n),clickHandler:a.delegate(this,o),dblClickHandler:a.delegate(this,p),dragHandler:a.delegate(this,q),dragEndHandler:a.delegate(this,r),enterHandler:a.delegate(this,s),exitHandler:a.delegate(this,t),pressHandler:a.delegate(this,u),releaseHandler:a.delegate(this,v),nonPrimaryPressHandler:a.delegate(this,w),nonPrimaryReleaseHandler:a.delegate(this,x),scrollHandler:a.delegate(this,z),pinchHandler:a.delegate(this,y)});this.outerTracker=new a.MouseTracker({element:this.container,startDisabled:this.mouseNavEnabled?!1:!0,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,enterHandler:a.delegate(this,A),exitHandler:a.delegate(this,B)});this.toolbar&&(this.toolbar=new a.ControlDock({element:this.toolbar}));this.bindStandardControls();U[this.hash].prevContainerSize=b(this.container);this.world=new a.World({viewer:this});this.world.addHandler("add-item",function(a){g.source=g.world.getItemAt(0).source;U[g.hash].forceRedraw=!0;g._updateRequestId||(g._updateRequestId=f(g,C))});this.world.addHandler("remove-item",function(a){g.world.getItemCount()?g.source=g.world.getItemAt(0).source:g.source=null;U[g.hash].forceRedraw=!0});this.world.addHandler("metrics-change",function(a){g.viewport&&g.viewport._setContentBounds(g.world.getHomeBounds(),g.world.getContentFactor())});this.world.addHandler("item-index-change",function(a){g.source=g.world.getItemAt(0).source});this.viewport=new a.Viewport({containerSize:U[this.hash].prevContainerSize,springStiffness:this.springStiffness,animationTime:this.animationTime,minZoomImageRatio:this.minZoomImageRatio,maxZoomPixelRatio:this.maxZoomPixelRatio,visibilityRatio:this.visibilityRatio,wrapHorizontal:this.wrapHorizontal,wrapVertical:this.wrapVertical,defaultZoomLevel:this.defaultZoomLevel,minZoomLevel:this.minZoomLevel,maxZoomLevel:this.maxZoomLevel,viewer:this,degrees:this.degrees,navigatorRotate:this.navigatorRotate,homeFillsViewer:this.homeFillsViewer,margins:this.viewportMargins});this.viewport._setContentBounds(this.world.getHomeBounds(),this.world.getContentFactor());this.imageLoader=new a.ImageLoader({jobLimit:this.imageLoaderLimit});this.tileCache=new a.TileCache({maxImageCacheCount:this.maxImageCacheCount});this.drawer=new a.Drawer({viewer:this,viewport:this.viewport,element:this.canvas,debugGridColor:this.debugGridColor});this.overlaysContainer=a.makeNeutralElement("div");this.canvas.appendChild(this.overlaysContainer);if(!this.drawer.canRotate()){if(this.rotateLeft){d=this.buttons.buttons.indexOf(this.rotateLeft);this.buttons.buttons.splice(d,1);this.buttons.element.removeChild(this.rotateLeft.element)}if(this.rotateRight){d=this.buttons.buttons.indexOf(this.rotateRight);this.buttons.buttons.splice(d,1);this.buttons.element.removeChild(this.rotateRight.element)}}this.showNavigator&&(this.navigator=new a.Navigator({id:this.navigatorId,position:this.navigatorPosition,sizeRatio:this.navigatorSizeRatio,maintainSizeRatio:this.navigatorMaintainSizeRatio,top:this.navigatorTop,left:this.navigatorLeft,width:this.navigatorWidth,height:this.navigatorHeight,autoResize:this.navigatorAutoResize,autoFade:this.navigatorAutoFade,prefixUrl:this.prefixUrl,viewer:this,navigatorRotate:this.navigatorRotate,crossOriginPolicy:this.crossOriginPolicy}));this.sequenceMode&&this.bindSequenceControls();this.tileSources&&this.open(this.tileSources);for(d=0;d<this.customControls.length;d++)this.addControl(this.customControls[d].id,{anchor:this.customControls[d].anchor});a.requestAnimationFrame(function(){h(g)})};a.extend(a.Viewer.prototype,a.EventSource.prototype,a.ControlDock.prototype,{isOpen:function(){return!!this.world.getItemCount()},openDzi:function(b){a.console.error("[Viewer.openDzi] this function is deprecated; use Viewer.open() instead.");return this.open(b)},openTileSource:function(b){a.console.error("[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead.");return this.open(b)},open:function(b){var c=this;this.close();if(b)if(this.sequenceMode&&a.isArray(b)){if(this.referenceStrip){this.referenceStrip.destroy();this.referenceStrip=null}this.tileSources=b;this._sequenceIndex=Math.max(0,Math.min(this.tileSources.length-1,this.initialPage));if(this.tileSources.length){this.open(this.tileSources[this._sequenceIndex]);this.showReferenceStrip&&(this.referenceStrip=new a.ReferenceStrip({id:this.referenceStripElement,position:this.referenceStripPosition,sizeRatio:this.referenceStripSizeRatio,scroll:this.referenceStripScroll,height:this.referenceStripHeight,width:this.referenceStripWidth,tileSources:this.tileSources,prefixUrl:this.prefixUrl,viewer:this}))}this._updateSequenceButtons(this._sequenceIndex)}else{a.isArray(b)||(b=[b]);if(b.length){this._opening=!0;var e=b.length;var f=0;var g=0;var h;var i=function(){if(f+g===e)if(f){if(c._firstOpen||!c.preserveViewport){c.viewport.goHome(!0);c.viewport.update()}c._firstOpen=!1;var a=b[0];a.tileSource&&(a=a.tileSource);if(c.overlays&&!c.preserveOverlays)for(var i=0;i<c.overlays.length;i++)c.currentOverlays[i]=d(c,c.overlays[i]);c._drawOverlays();c._opening=!1;c.raiseEvent("open",{source:a})}else{c._opening=!1;c.raiseEvent("open-failed",h)}};var j=function(b){a.isPlainObject(b)&&b.tileSource||(b={tileSource:b});if(void 0!==b.index){a.console.error("[Viewer.open] setting indexes here is not supported; use addTiledImage instead");delete b.index}void 0===b.collectionImmediately&&(b.collectionImmediately=!0);var d=b.success;b.success=function(a){f++;if(b.tileSource.overlays)for(var e=0;e<b.tileSource.overlays.length;e++)c.addOverlay(b.tileSource.overlays[e]);d&&d(a);i()};var e=b.error;b.error=function(a){g++;h||(h=a);e&&e(a);i()};c.addTiledImage(b)};for(var k=0;k<b.length;k++)j(b[k]);return this}}},close:function(){if(!U[this.hash])return this;this._opening=!1;this.navigator&&this.navigator.close();if(!this.preserveOverlays){this.clearOverlays();this.overlaysContainer.innerHTML=""}U[this.hash].animating=!1;this.world.removeAll();this.imageLoader.clear();this.raiseEvent("close");return this},destroy:function(){if(U[this.hash]){this.close();this.clearOverlays();this.overlaysContainer.innerHTML="";if(this.referenceStrip){this.referenceStrip.destroy();this.referenceStrip=null}if(null!==this._updateRequestId){a.cancelAnimationFrame(this._updateRequestId);this._updateRequestId=null}this.drawer&&this.drawer.destroy();this.removeAllHandlers();if(this.element)for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);this.innerTracker&&this.innerTracker.destroy();this.outerTracker&&this.outerTracker.destroy();U[this.hash]=null;delete U[this.hash];this.canvas=null;this.container=null;this.element=null}},isMouseNavEnabled:function(){return this.innerTracker.isTracking()},setMouseNavEnabled:function(a){this.innerTracker.setTracking(a);this.outerTracker.setTracking(a);this.raiseEvent("mouse-enabled",{enabled:a});return this},areControlsEnabled:function(){var a,b=this.controls.length;for(a=0;a<this.controls.length;a++)b=b&&this.controls[a].isVisibile();return b},setControlsEnabled:function(a){a?j(this):h(this);this.raiseEvent("controls-enabled",{enabled:a});return this},isFullPage:function(){return U[this.hash].fullPage},setFullPage:function(b){var c,d,e=document.body,f=e.style,g=document.documentElement.style,h=this;if(b==this.isFullPage())return this;var i={fullPage:b,preventDefaultAction:!1};this.raiseEvent("pre-full-page",i);if(i.preventDefaultAction)return this;if(b){this.elementSize=a.getElementSize(this.element);this.pageScroll=a.getPageScroll();this.elementMargin=this.element.style.margin;this.element.style.margin="0";this.elementPadding=this.element.style.padding;this.element.style.padding="0";this.bodyMargin=f.margin;this.docMargin=g.margin;f.margin="0";g.margin="0";this.bodyPadding=f.padding;this.docPadding=g.padding;f.padding="0";g.padding="0";this.bodyWidth=f.width;this.docWidth=g.width;f.width="100%";g.width="100%";this.bodyHeight=f.height;this.docHeight=g.height;f.height="100%";g.height="100%";this.previousBody=[];U[this.hash].prevElementParent=this.element.parentNode;U[this.hash].prevNextSibling=this.element.nextSibling;U[this.hash].prevElementWidth=this.element.style.width;U[this.hash].prevElementHeight=this.element.style.height;c=e.childNodes.length;for(d=0;c>d;d++){this.previousBody.push(e.childNodes[0]);e.removeChild(e.childNodes[0])}if(this.toolbar&&this.toolbar.element){this.toolbar.parentNode=this.toolbar.element.parentNode;this.toolbar.nextSibling=this.toolbar.element.nextSibling;e.appendChild(this.toolbar.element);a.addClass(this.toolbar.element,"fullpage")}a.addClass(this.element,"fullpage");e.appendChild(this.element);this.element.style.height=a.getWindowSize().y+"px";this.element.style.width=a.getWindowSize().x+"px";this.toolbar&&this.toolbar.element&&(this.element.style.height=a.getElementSize(this.element).y-a.getElementSize(this.toolbar.element).y+"px");U[this.hash].fullPage=!0;a.delegate(this,A)({})}else{this.element.style.margin=this.elementMargin;this.element.style.padding=this.elementPadding;f.margin=this.bodyMargin;g.margin=this.docMargin;f.padding=this.bodyPadding;g.padding=this.docPadding;f.width=this.bodyWidth;g.width=this.docWidth;f.height=this.bodyHeight;g.height=this.docHeight;e.removeChild(this.element);c=this.previousBody.length;for(d=0;c>d;d++)e.appendChild(this.previousBody.shift());a.removeClass(this.element,"fullpage");U[this.hash].prevElementParent.insertBefore(this.element,U[this.hash].prevNextSibling);if(this.toolbar&&this.toolbar.element){e.removeChild(this.toolbar.element);a.removeClass(this.toolbar.element,"fullpage");this.toolbar.parentNode.insertBefore(this.toolbar.element,this.toolbar.nextSibling);delete this.toolbar.parentNode;delete this.toolbar.nextSibling}this.element.style.width=U[this.hash].prevElementWidth;this.element.style.height=U[this.hash].prevElementHeight;var j=0;var k=function(){a.setPageScroll(h.pageScroll);var b=a.getPageScroll();j++;(10>j&&b.x!==h.pageScroll.x||b.y!==h.pageScroll.y)&&a.requestAnimationFrame(k)};a.requestAnimationFrame(k);U[this.hash].fullPage=!1;a.delegate(this,B)({})}this.navigator&&this.viewport&&this.navigator.update(this.viewport);this.raiseEvent("full-page",{fullPage:b});return this},setFullScreen:function(b){var c=this;if(!a.supportsFullScreen)return this.setFullPage(b);if(a.isFullScreen()===b)return this;var d={fullScreen:b,preventDefaultAction:!1};this.raiseEvent("pre-full-screen",d);if(d.preventDefaultAction)return this;if(b){this.setFullPage(!0);if(!this.isFullPage())return this;this.fullPageStyleWidth=this.element.style.width;this.fullPageStyleHeight=this.element.style.height;this.element.style.width="100%";this.element.style.height="100%";var e=function(){var b=a.isFullScreen();if(!b){a.removeEvent(document,a.fullScreenEventName,e);a.removeEvent(document,a.fullScreenErrorEventName,e);c.setFullPage(!1);if(c.isFullPage()){c.element.style.width=c.fullPageStyleWidth;c.element.style.height=c.fullPageStyleHeight}}c.navigator&&c.viewport&&c.navigator.update(c.viewport);c.raiseEvent("full-screen",{fullScreen:b})};a.addEvent(document,a.fullScreenEventName,e);a.addEvent(document,a.fullScreenErrorEventName,e);a.requestFullScreen(document.body)}else a.exitFullScreen();return this},isVisible:function(){return"hidden"!=this.container.style.visibility},setVisible:function(a){this.container.style.visibility=a?"":"hidden";this.raiseEvent("visible",{visible:a});return this},addTiledImage:function(b){function d(a){for(var c=0;c<f._loadQueue.length;c++)if(f._loadQueue[c]===g){f._loadQueue.splice(c,1);break}0===f._loadQueue.length&&e(g);f.raiseEvent("add-item-failed",a);b.error&&b.error(a)}function e(a){if(f.collectionMode){f.world.arrange({immediately:a.options.collectionImmediately,rows:f.collectionRows,columns:f.collectionColumns,layout:f.collectionLayout,tileSize:f.collectionTileSize,tileMargin:f.collectionTileMargin});f.world.setAutoRefigureSizes(!0)}}a.console.assert(b,"[Viewer.addTiledImage] options is required");a.console.assert(b.tileSource,"[Viewer.addTiledImage] options.tileSource is required");a.console.assert(!b.replace||b.index>-1&&b.index<this.world.getItemCount(),"[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world");var f=this;b.replace&&(b.replaceItem=f.world.getItemAt(b.index));this._hideMessage();void 0===b.placeholderFillStyle&&(b.placeholderFillStyle=this.placeholderFillStyle);void 0===b.opacity&&(b.opacity=this.opacity);void 0===b.compositeOperation&&(b.compositeOperation=this.compositeOperation);var g={options:b};if(a.isArray(b.tileSource))setTimeout(function(){d({message:"[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.",source:b.tileSource,options:b})});else{this._loadQueue.push(g);c(this,b.tileSource,function(b){g.tileSource=b;var c,d,h;for(;f._loadQueue.length;){c=f._loadQueue[0];if(!c.tileSource)break;f._loadQueue.splice(0,1);if(c.options.replace){var i=f.world.getIndexOfItem(c.options.replaceItem);-1!=i&&(c.options.index=i);f.world.removeItem(c.options.replaceItem)}d=new a.TiledImage({viewer:f,source:c.tileSource,viewport:f.viewport,drawer:f.drawer,tileCache:f.tileCache,imageLoader:f.imageLoader,x:c.options.x,y:c.options.y,width:c.options.width,height:c.options.height,fitBounds:c.options.fitBounds,fitBoundsPlacement:c.options.fitBoundsPlacement,clip:c.options.clip,placeholderFillStyle:c.options.placeholderFillStyle,opacity:c.options.opacity,compositeOperation:c.options.compositeOperation,springStiffness:f.springStiffness,animationTime:f.animationTime,minZoomImageRatio:f.minZoomImageRatio,wrapHorizontal:f.wrapHorizontal,wrapVertical:f.wrapVertical,immediateRender:f.immediateRender,blendTime:f.blendTime,alwaysBlend:f.alwaysBlend,minPixelRatio:f.minPixelRatio,smoothTileEdgesMinZoom:f.smoothTileEdgesMinZoom,iOSDevice:f.iOSDevice,crossOriginPolicy:f.crossOriginPolicy,debugMode:f.debugMode});f.collectionMode&&f.world.setAutoRefigureSizes(!1);f.world.addItem(d,{index:c.options.index});0===f._loadQueue.length&&e(c);1!==f.world.getItemCount()||f.preserveViewport||f.viewport.goHome(!0);if(f.navigator){h=a.extend({},c.options,{replace:!1,originalTiledImage:d,tileSource:c.tileSource});f.navigator.addTiledImage(h)}c.options.success&&c.options.success({item:d})}},function(a){a.options=b;d(a)})}},addSimpleImage:function(b){a.console.assert(b,"[Viewer.addSimpleImage] options is required");a.console.assert(b.url,"[Viewer.addSimpleImage] options.url is required");var c=a.extend({},b,{tileSource:{type:"image",url:b.url}});delete c.url;this.addTiledImage(c)},addLayer:function(b){var c=this;a.console.error("[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.");var d=a.extend({},b,{success:function(a){c.raiseEvent("add-layer",{options:b,drawer:a.item})},error:function(a){c.raiseEvent("add-layer-failed",a)}});this.addTiledImage(d);return this},getLayerAtLevel:function(b){a.console.error("[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.");return this.world.getItemAt(b)},getLevelOfLayer:function(b){a.console.error("[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.");return this.world.getIndexOfItem(b)},getLayersCount:function(){a.console.error("[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.");return this.world.getItemCount()},setLayerLevel:function(b,c){a.console.error("[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.");return this.world.setItemIndex(b,c)},removeLayer:function(b){a.console.error("[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.");return this.world.removeItem(b)},forceRedraw:function(){U[this.hash].forceRedraw=!0;return this},bindSequenceControls:function(){var b=a.delegate(this,k),c=a.delegate(this,l),d=a.delegate(this,T),e=a.delegate(this,S),f=this.navImages,g=!0;if(this.showSequenceControl){(this.previousButton||this.nextButton)&&(g=!1);this.previousButton=new a.Button({element:this.previousButton?a.getElement(this.previousButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.PreviousPage"),srcRest:F(this.prefixUrl,f.previous.REST),srcGroup:F(this.prefixUrl,f.previous.GROUP),srcHover:F(this.prefixUrl,f.previous.HOVER),srcDown:F(this.prefixUrl,f.previous.DOWN),onRelease:e,onFocus:b,onBlur:c});this.nextButton=new a.Button({element:this.nextButton?a.getElement(this.nextButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.NextPage"),srcRest:F(this.prefixUrl,f.next.REST),srcGroup:F(this.prefixUrl,f.next.GROUP),srcHover:F(this.prefixUrl,f.next.HOVER),srcDown:F(this.prefixUrl,f.next.DOWN),onRelease:d,onFocus:b,onBlur:c});this.navPrevNextWrap||this.previousButton.disable();this.tileSources&&this.tileSources.length||this.nextButton.disable();if(g){this.paging=new a.ButtonGroup({buttons:[this.previousButton,this.nextButton],clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold});this.pagingControl=this.paging.element;this.toolbar?this.toolbar.addControl(this.pagingControl,{anchor:a.ControlAnchor.BOTTOM_RIGHT}):this.addControl(this.pagingControl,{anchor:this.sequenceControlAnchor||a.ControlAnchor.TOP_LEFT})}}return this},bindStandardControls:function(){var b=a.delegate(this,G),c=a.delegate(this,I),d=a.delegate(this,L),e=a.delegate(this,H),f=a.delegate(this,M),g=a.delegate(this,O),h=a.delegate(this,P),i=a.delegate(this,Q),j=a.delegate(this,R),m=a.delegate(this,k),n=a.delegate(this,l),o=this.navImages,p=[],q=!0;if(this.showNavigationControl){(this.zoomInButton||this.zoomOutButton||this.homeButton||this.fullPageButton||this.rotateLeftButton||this.rotateRightButton)&&(q=!1);if(this.showZoomControl){p.push(this.zoomInButton=new a.Button({element:this.zoomInButton?a.getElement(this.zoomInButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.ZoomIn"),srcRest:F(this.prefixUrl,o.zoomIn.REST),srcGroup:F(this.prefixUrl,o.zoomIn.GROUP),srcHover:F(this.prefixUrl,o.zoomIn.HOVER),srcDown:F(this.prefixUrl,o.zoomIn.DOWN),onPress:b,onRelease:c,onClick:d,onEnter:b,onExit:c,onFocus:m,onBlur:n}));p.push(this.zoomOutButton=new a.Button({element:this.zoomOutButton?a.getElement(this.zoomOutButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.ZoomOut"),srcRest:F(this.prefixUrl,o.zoomOut.REST),srcGroup:F(this.prefixUrl,o.zoomOut.GROUP),srcHover:F(this.prefixUrl,o.zoomOut.HOVER),srcDown:F(this.prefixUrl,o.zoomOut.DOWN),onPress:e,onRelease:c,onClick:f,onEnter:e,onExit:c,onFocus:m,onBlur:n}))}this.showHomeControl&&p.push(this.homeButton=new a.Button({element:this.homeButton?a.getElement(this.homeButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.Home"),srcRest:F(this.prefixUrl,o.home.REST),srcGroup:F(this.prefixUrl,o.home.GROUP),srcHover:F(this.prefixUrl,o.home.HOVER),srcDown:F(this.prefixUrl,o.home.DOWN),onRelease:g,onFocus:m,onBlur:n}));this.showFullPageControl&&p.push(this.fullPageButton=new a.Button({element:this.fullPageButton?a.getElement(this.fullPageButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.FullPage"),srcRest:F(this.prefixUrl,o.fullpage.REST),srcGroup:F(this.prefixUrl,o.fullpage.GROUP),srcHover:F(this.prefixUrl,o.fullpage.HOVER),srcDown:F(this.prefixUrl,o.fullpage.DOWN),onRelease:h,onFocus:m,onBlur:n}));if(this.showRotationControl){p.push(this.rotateLeftButton=new a.Button({element:this.rotateLeftButton?a.getElement(this.rotateLeftButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.RotateLeft"),srcRest:F(this.prefixUrl,o.rotateleft.REST),srcGroup:F(this.prefixUrl,o.rotateleft.GROUP),srcHover:F(this.prefixUrl,o.rotateleft.HOVER),srcDown:F(this.prefixUrl,o.rotateleft.DOWN),onRelease:i,onFocus:m,onBlur:n}));p.push(this.rotateRightButton=new a.Button({element:this.rotateRightButton?a.getElement(this.rotateRightButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.RotateRight"),srcRest:F(this.prefixUrl,o.rotateright.REST),srcGroup:F(this.prefixUrl,o.rotateright.GROUP),srcHover:F(this.prefixUrl,o.rotateright.HOVER),srcDown:F(this.prefixUrl,o.rotateright.DOWN),onRelease:j,onFocus:m,onBlur:n}))}if(q){this.buttons=new a.ButtonGroup({buttons:p,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold});this.navControl=this.buttons.element;this.addHandler("open",a.delegate(this,N));this.toolbar?this.toolbar.addControl(this.navControl,{anchor:a.ControlAnchor.TOP_LEFT}):this.addControl(this.navControl,{anchor:this.navigationControlAnchor||a.ControlAnchor.TOP_LEFT})}}return this},currentPage:function(){return this._sequenceIndex},goToPage:function(a){if(this.tileSources&&a>=0&&a<this.tileSources.length){this.raiseEvent("page",{page:a});this._sequenceIndex=a;this._updateSequenceButtons(a);this.open(this.tileSources[a]);this.referenceStrip&&this.referenceStrip.setFocus(a)}return this},addOverlay:function(b,c,f,g){var h;h=a.isPlainObject(b)?b:{element:b,location:c,placement:f,onDraw:g};b=a.getElement(h.element);if(e(this.currentOverlays,b)>=0)return this;var i=d(this,h);this.currentOverlays.push(i);i.drawHTML(this.overlaysContainer,this.viewport);this.raiseEvent("add-overlay",{element:b,location:h.location,placement:h.placement});return this},updateOverlay:function(b,c,d){var f;b=a.getElement(b);f=e(this.currentOverlays,b);if(f>=0){this.currentOverlays[f].update(c,d);U[this.hash].forceRedraw=!0;this.raiseEvent("update-overlay",{element:b,location:c,placement:d})}return this},removeOverlay:function(b){var c;b=a.getElement(b);c=e(this.currentOverlays,b);if(c>=0){this.currentOverlays[c].destroy();this.currentOverlays.splice(c,1);U[this.hash].forceRedraw=!0;this.raiseEvent("remove-overlay",{element:b})}return this},clearOverlays:function(){for(;this.currentOverlays.length>0;)this.currentOverlays.pop().destroy();U[this.hash].forceRedraw=!0;this.raiseEvent("clear-overlay",{});return this},getOverlayById:function(b){var c;b=a.getElement(b);c=e(this.currentOverlays,b);return c>=0?this.currentOverlays[c]:null},_updateSequenceButtons:function(a){this.nextButton&&(this.tileSources&&this.tileSources.length-1!==a?this.nextButton.enable():this.navPrevNextWrap||this.nextButton.disable());this.previousButton&&(a>0?this.previousButton.enable():this.navPrevNextWrap||this.previousButton.disable())},_showMessage:function(b){this._hideMessage();var c=a.makeNeutralElement("div");c.appendChild(document.createTextNode(b));this.messageDiv=a.makeCenteredNode(c);a.addClass(this.messageDiv,"openseadragon-message");this.container.appendChild(this.messageDiv)},_hideMessage:function(){var a=this.messageDiv;if(a){a.parentNode.removeChild(a);delete this.messageDiv}},gestureSettingsByDeviceType:function(a){switch(a){case"mouse":return this.gestureSettingsMouse;case"touch":return this.gestureSettingsTouch;case"pen":return this.gestureSettingsPen;default:return this.gestureSettingsUnknown}},_drawOverlays:function(){var a,b=this.currentOverlays.length;for(a=0;b>a;a++)this.currentOverlays[a].drawHTML(this.overlaysContainer,this.viewport)},_cancelPendingImages:function(){this._loadQueue=[]}})}(OpenSeadragon);!function(a){function b(a){if(a.quick&&this.viewer.viewport){this.viewer.viewport.panTo(this.viewport.pointFromPixel(a.position));this.viewer.viewport.applyConstraints()}}function c(a){if(this.viewer.viewport){this.panHorizontal||(a.delta.x=0);this.panVertical||(a.delta.y=0);this.viewer.viewport.panBy(this.viewport.deltaPointsFromPixels(a.delta))}}function d(a){a.insideElementPressed&&this.viewer.viewport&&this.viewer.viewport.applyConstraints()}function e(a){this.viewer.raiseEvent("navigator-scroll",{tracker:a.eventSource,position:a.position,scroll:a.scroll,shift:a.shift,originalEvent:a.originalEvent});return!1}function f(a,b){a.style.webkitTransform="rotate("+b+"deg)";a.style.mozTransform="rotate("+b+"deg)";a.style.msTransform="rotate("+b+"deg)";a.style.oTransform="rotate("+b+"deg)";a.style.transform="rotate("+b+"deg)"}a.Navigator=function(g){function h(a){f(l.displayRegionContainer,a);
+f(l.displayRegion,-a);l.viewport.setRotation(a)}var i,j,k=g.viewer,l=this;if(g.id){this.element=document.getElementById(g.id);g.controlOptions={anchor:a.ControlAnchor.NONE,attachToViewer:!1,autoFade:!1}}else{g.id="navigator-"+a.now();this.element=a.makeNeutralElement("div");g.controlOptions={anchor:a.ControlAnchor.TOP_RIGHT,attachToViewer:!0,autoFade:g.autoFade};if(g.position)if("BOTTOM_RIGHT"==g.position)g.controlOptions.anchor=a.ControlAnchor.BOTTOM_RIGHT;else if("BOTTOM_LEFT"==g.position)g.controlOptions.anchor=a.ControlAnchor.BOTTOM_LEFT;else if("TOP_RIGHT"==g.position)g.controlOptions.anchor=a.ControlAnchor.TOP_RIGHT;else if("TOP_LEFT"==g.position)g.controlOptions.anchor=a.ControlAnchor.TOP_LEFT;else if("ABSOLUTE"==g.position){g.controlOptions.anchor=a.ControlAnchor.ABSOLUTE;g.controlOptions.top=g.top;g.controlOptions.left=g.left;g.controlOptions.height=g.height;g.controlOptions.width=g.width}}this.element.id=g.id;this.element.className+=" navigator";g=a.extend(!0,{sizeRatio:a.DEFAULT_SETTINGS.navigatorSizeRatio},g,{element:this.element,tabIndex:-1,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0,autoResize:g.autoResize,minZoomImageRatio:1});g.minPixelRatio=this.minPixelRatio=k.minPixelRatio;a.setElementTouchActionNone(this.element);this.borderWidth=2;this.fudge=new a.Point(1,1);this.totalBorderWidths=new a.Point(2*this.borderWidth,2*this.borderWidth).minus(this.fudge);g.controlOptions.anchor!=a.ControlAnchor.NONE&&!function(a,b){a.margin="0px";a.border=b+"px solid #555";a.padding="0px";a.background="#000";a.opacity=.8;a.overflow="hidden"}(this.element.style,this.borderWidth);this.displayRegion=a.makeNeutralElement("div");this.displayRegion.id=this.element.id+"-displayregion";this.displayRegion.className="displayregion";!function(a,b){a.position="relative";a.top="0px";a.left="0px";a.fontSize="0px";a.overflow="hidden";a.border=b+"px solid #900";a.margin="0px";a.padding="0px";a.background="transparent";a["float"]="left";a.cssFloat="left";a.styleFloat="left";a.zIndex=999999999;a.cursor="default"}(this.displayRegion.style,this.borderWidth);this.displayRegionContainer=a.makeNeutralElement("div");this.displayRegionContainer.id=this.element.id+"-displayregioncontainer";this.displayRegionContainer.className="displayregioncontainer";this.displayRegionContainer.style.width="100%";this.displayRegionContainer.style.height="100%";k.addControl(this.element,g.controlOptions);this._resizeWithViewer=g.controlOptions.anchor!=a.ControlAnchor.ABSOLUTE&&g.controlOptions.anchor!=a.ControlAnchor.NONE;if(this._resizeWithViewer){if(g.width&&g.height){this.element.style.height="number"==typeof g.height?g.height+"px":g.height;this.element.style.width="number"==typeof g.width?g.width+"px":g.width}else{i=a.getElementSize(k.element);this.element.style.height=Math.round(i.y*g.sizeRatio)+"px";this.element.style.width=Math.round(i.x*g.sizeRatio)+"px";this.oldViewerSize=i}j=a.getElementSize(this.element);this.elementArea=j.x*j.y}this.oldContainerSize=new a.Point(0,0);a.Viewer.apply(this,[g]);this.displayRegionContainer.appendChild(this.displayRegion);this.element.getElementsByTagName("div")[0].appendChild(this.displayRegionContainer);if(g.navigatorRotate){var m=g.viewer.viewport?g.viewer.viewport.getRotation():g.viewer.degrees||0;h(m);g.viewer.addHandler("rotate",function(a){h(a.degrees)})}this.innerTracker.destroy();this.innerTracker=new a.MouseTracker({element:this.element,dragHandler:a.delegate(this,c),clickHandler:a.delegate(this,b),releaseHandler:a.delegate(this,d),scrollHandler:a.delegate(this,e)});this.addHandler("reset-size",function(){l.viewport&&l.viewport.goHome(!0)});k.world.addHandler("item-index-change",function(a){var b=l.world.getItemAt(a.previousIndex);l.world.setItemIndex(b,a.newIndex)});k.world.addHandler("remove-item",function(a){var b=a.item;var c=l._getMatchingItem(b);c&&l.world.removeItem(c)});this.update(k.viewport)};a.extend(a.Navigator.prototype,a.EventSource.prototype,a.Viewer.prototype,{updateSize:function(){if(this.viewport){var b=new a.Point(0===this.container.clientWidth?1:this.container.clientWidth,0===this.container.clientHeight?1:this.container.clientHeight);if(!b.equals(this.oldContainerSize)){this.viewport.resize(b,!0);this.viewport.goHome(!0);this.oldContainerSize=b;this.drawer.clear();this.world.draw()}}},update:function(b){var c,d,e,f,g,h;c=a.getElementSize(this.viewer.element);if(this._resizeWithViewer&&c.x&&c.y&&!c.equals(this.oldViewerSize)){this.oldViewerSize=c;if(this.maintainSizeRatio||!this.elementArea){d=c.x*this.sizeRatio;e=c.y*this.sizeRatio}else{d=Math.sqrt(this.elementArea*(c.x/c.y));e=this.elementArea/d}this.element.style.width=Math.round(d)+"px";this.element.style.height=Math.round(e)+"px";this.elementArea||(this.elementArea=d*e);this.updateSize()}if(b&&this.viewport){f=b.getBoundsNoRotate(!0);g=this.viewport.pixelFromPointNoRotate(f.getTopLeft(),!1);h=this.viewport.pixelFromPointNoRotate(f.getBottomRight(),!1).minus(this.totalBorderWidths);var i=this.displayRegion.style;i.display=this.world.getItemCount()?"block":"none";i.top=Math.round(g.y)+"px";i.left=Math.round(g.x)+"px";var j=Math.abs(g.x-h.x);var k=Math.abs(g.y-h.y);i.width=Math.round(Math.max(j,0))+"px";i.height=Math.round(Math.max(k,0))+"px"}},addTiledImage:function(b){var c=this;var d=b.originalTiledImage;delete b.original;var e=a.extend({},b,{success:function(a){var b=a.item;b._originalForNavigator=d;c._matchBounds(b,d,!0);d.addHandler("bounds-change",function(){c._matchBounds(b,d)})}});return a.Viewer.prototype.addTiledImage.apply(this,[e])},_getMatchingItem:function(a){var b=this.world.getItemCount();var c;for(var d=0;b>d;d++){c=this.world.getItemAt(d);if(c._originalForNavigator===a)return c}return null},_matchBounds:function(a,b,c){var d=b.getBounds();a.setPosition(d.getTopLeft(),c);a.setWidth(d.width,c)}})}(OpenSeadragon);!function(a){var b={Errors:{Dzc:"Sorry, we don't support Deep Zoom Collections!",Dzi:"Hmm, this doesn't appear to be a valid Deep Zoom Image.",Xml:"Hmm, this doesn't appear to be a valid Deep Zoom Image.",ImageFormat:"Sorry, we don't support {0}-based Deep Zoom Images.",Security:"It looks like a security restriction stopped us from loading this Deep Zoom Image.",Status:"This space unintentionally left blank ({0} {1}).",OpenFailed:"Unable to open {0}: {1}"},Tooltips:{FullPage:"Toggle full page",Home:"Go home",ZoomIn:"Zoom in",ZoomOut:"Zoom out",NextPage:"Next page",PreviousPage:"Previous page",RotateLeft:"Rotate left",RotateRight:"Rotate right"}};a.extend(a,{getString:function(c){var d,e=c.split("."),f=null,g=arguments,h=b;for(d=0;d<e.length-1;d++)h=h[e[d]]||{};f=h[e[d]];if("string"!=typeof f){a.console.debug("Untranslated source string:",c);f=""}return f.replace(/\{\d+\}/g,function(a){var b=parseInt(a.match(/\d+/),10)+1;return b<g.length?g[b]:""})},setString:function(a,c){var d,e=a.split("."),f=b;for(d=0;d<e.length-1;d++){f[e[d]]||(f[e[d]]={});f=f[e[d]]}f[e[d]]=c}})}(OpenSeadragon);!function(a){a.Point=function(a,b){this.x="number"==typeof a?a:0;this.y="number"==typeof b?b:0};a.Point.prototype={clone:function(){return new a.Point(this.x,this.y)},plus:function(b){return new a.Point(this.x+b.x,this.y+b.y)},minus:function(b){return new a.Point(this.x-b.x,this.y-b.y)},times:function(b){return new a.Point(this.x*b,this.y*b)},divide:function(b){return new a.Point(this.x/b,this.y/b)},negate:function(){return new a.Point(-this.x,-this.y)},distanceTo:function(a){return Math.sqrt(Math.pow(this.x-a.x,2)+Math.pow(this.y-a.y,2))},apply:function(b){return new a.Point(b(this.x),b(this.y))},equals:function(b){return b instanceof a.Point&&this.x===b.x&&this.y===b.y},rotate:function(b,c){c=c||new a.Point(0,0);var d;var e;if(b%90===0){var f=b%360;0>f&&(f+=360);switch(f){case 0:d=1;e=0;break;case 90:d=0;e=1;break;case 180:d=-1;e=0;break;case 270:d=0;e=-1}}else{var g=b*Math.PI/180;d=Math.cos(g);e=Math.sin(g)}var h=d*(this.x-c.x)-e*(this.y-c.y)+c.x;var i=e*(this.x-c.x)+d*(this.y-c.y)+c.y;return new a.Point(h,i)},toString:function(){return"("+Math.round(100*this.x)/100+","+Math.round(100*this.y)/100+")"}}}(OpenSeadragon);!function(a){function b(b){var c,d,e=b.responseText,f=b.status;if(!b)throw new Error(a.getString("Errors.Security"));if(200!==b.status&&0!==b.status){f=b.status;c=404==f?"Not Found":b.statusText;throw new Error(a.getString("Errors.Status",f,c))}if(e.match(/\s*<.*/))try{d=b.responseXML&&b.responseXML.documentElement?b.responseXML:a.parseXml(e)}catch(g){d=b.responseText}else d=e.match(/\s*[\{\[].*/)?a.parseJSON(e):e;return d}a.TileSource=function(b,c,d,e,f,g){var h=this;var i,j,k=arguments;i=a.isPlainObject(b)?b:{width:k[0],height:k[1],tileSize:k[2],tileOverlap:k[3],minLevel:k[4],maxLevel:k[5]};a.EventSource.call(this);a.extend(!0,this,i);if(!this.success)for(j=0;j<arguments.length;j++)if(a.isFunction(arguments[j])){this.success=arguments[j];break}this.success&&this.addHandler("ready",function(a){h.success(a)});"string"==a.type(arguments[0])&&(this.url=arguments[0]);if(this.url){this.aspectRatio=1;this.dimensions=new a.Point(10,10);this._tileWidth=0;this._tileHeight=0;this.tileOverlap=0;this.minLevel=0;this.maxLevel=0;this.ready=!1;this.getImageInfo(this.url)}else{this.ready=!0;this.aspectRatio=i.width&&i.height?i.width/i.height:1;this.dimensions=new a.Point(i.width,i.height);if(this.tileSize){this._tileWidth=this._tileHeight=this.tileSize;delete this.tileSize}else{if(this.tileWidth){this._tileWidth=this.tileWidth;delete this.tileWidth}else this._tileWidth=0;if(this.tileHeight){this._tileHeight=this.tileHeight;delete this.tileHeight}else this._tileHeight=0}this.tileOverlap=i.tileOverlap?i.tileOverlap:0;this.minLevel=i.minLevel?i.minLevel:0;this.maxLevel=void 0!==i.maxLevel&&null!==i.maxLevel?i.maxLevel:i.width&&i.height?Math.ceil(Math.log(Math.max(i.width,i.height))/Math.log(2)):0;this.success&&a.isFunction(this.success)&&this.success(this)}};a.TileSource.prototype={getTileSize:function(b){a.console.error("[TileSource.getTileSize] is deprecated.Use TileSource.getTileWidth() and TileSource.getTileHeight() instead");return this._tileWidth},getTileWidth:function(a){return this._tileWidth?this._tileWidth:this.getTileSize(a)},getTileHeight:function(a){return this._tileHeight?this._tileHeight:this.getTileSize(a)},getLevelScale:function(a){var b,c={};for(b=0;b<=this.maxLevel;b++)c[b]=1/Math.pow(2,this.maxLevel-b);this.getLevelScale=function(a){return c[a]};return this.getLevelScale(a)},getNumTiles:function(b){var c=this.getLevelScale(b),d=Math.ceil(c*this.dimensions.x/this.getTileWidth(b)),e=Math.ceil(c*this.dimensions.y/this.getTileHeight(b));return new a.Point(d,e)},getPixelRatio:function(b){var c=this.dimensions.times(this.getLevelScale(b)),d=1/c.x,e=1/c.y;return new a.Point(d,e)},getClosestLevel:function(b){var c,d,e;for(c=this.minLevel;c<this.maxLevel;c++){e=this.getNumTiles(c);d=new a.Point(Math.floor(b.x/this.getTileWidth(c)),Math.floor(b.y/this.getTileHeight(c)));if(e.x+1>=d.x&&e.y+1>=d.y)break}return Math.max(0,c-1)},getTileAtPoint:function(b,c){var d=c.times(this.dimensions.x).times(this.getLevelScale(b)),e=Math.floor(d.x/this.getTileWidth(b)),f=Math.floor(d.y/this.getTileHeight(b));return new a.Point(e,f)},getTileBounds:function(b,c,d){var e=this.dimensions.times(this.getLevelScale(b)),f=this.getTileWidth(b),g=this.getTileHeight(b),h=0===c?0:f*c-this.tileOverlap,i=0===d?0:g*d-this.tileOverlap,j=f+(0===c?1:2)*this.tileOverlap,k=g+(0===d?1:2)*this.tileOverlap,l=1/e.x;j=Math.min(j,e.x-h);k=Math.min(k,e.y-i);return new a.Rect(h*l,i*l,j*l,k*l)},getImageInfo:function(c){var d,e,f,g,h,i,j,k=this;if(c){h=c.split("/");i=h[h.length-1];j=i.lastIndexOf(".");j>-1&&(h[h.length-1]=i.slice(0,j))}e=function(b){"string"==typeof b&&(b=a.parseXml(b));var d=a.TileSource.determineType(k,b,c);if(d){g=d.prototype.configure.apply(k,[b,c]);void 0===g.ajaxWithCredentials&&(g.ajaxWithCredentials=k.ajaxWithCredentials);f=new d(g);k.ready=!0;k.raiseEvent("ready",{tileSource:f})}else k.raiseEvent("open-failed",{message:"Unable to load TileSource",source:c})};if(c.match(/\.js$/)){d=c.split("/").pop().replace(".js","");a.jsonp({url:c,async:!1,callbackName:d,callback:e})}else a.makeAjaxRequest({url:c,withCredentials:this.ajaxWithCredentials,success:function(a){var c=b(a);e(c)},error:function(a,b){var d;try{d="HTTP "+a.status+" attempting to load TileSource"}catch(e){var f;f="undefined"!=typeof b&&b.toString?b.toString():"Unknown error";d=f+" attempting to load TileSource"}k.raiseEvent("open-failed",{message:d,source:c})}})},supports:function(a,b){return!1},configure:function(a,b){throw new Error("Method not implemented.")},getTileUrl:function(a,b,c){throw new Error("Method not implemented.")},tileExists:function(a,b,c){var d=this.getNumTiles(a);return a>=this.minLevel&&a<=this.maxLevel&&b>=0&&c>=0&&b<d.x&&c<d.y}};a.extend(!0,a.TileSource.prototype,a.EventSource.prototype);a.TileSource.determineType=function(b,c,d){var e;for(e in OpenSeadragon)if(e.match(/.+TileSource$/)&&a.isFunction(OpenSeadragon[e])&&a.isFunction(OpenSeadragon[e].prototype.supports)&&OpenSeadragon[e].prototype.supports.call(b,c,d))return OpenSeadragon[e];a.console.error("No TileSource was able to open %s %s",d,c)}}(OpenSeadragon);!function(a){function b(b,d){if(!d||!d.documentElement)throw new Error(a.getString("Errors.Xml"));var e,f,g,h,i,j=d.documentElement,k=j.localName||j.tagName,l=d.documentElement.namespaceURI,m=null,n=[];if("Image"==k)try{h=j.getElementsByTagName("Size")[0];void 0===h&&(h=j.getElementsByTagNameNS(l,"Size")[0]);m={Image:{xmlns:"http://schemas.microsoft.com/deepzoom/2008",Url:j.getAttribute("Url"),Format:j.getAttribute("Format"),DisplayRect:null,Overlap:parseInt(j.getAttribute("Overlap"),10),TileSize:parseInt(j.getAttribute("TileSize"),10),Size:{Height:parseInt(h.getAttribute("Height"),10),Width:parseInt(h.getAttribute("Width"),10)}}};if(!a.imageFormatSupported(m.Image.Format))throw new Error(a.getString("Errors.ImageFormat",m.Image.Format.toUpperCase()));e=j.getElementsByTagName("DisplayRect");void 0===e&&(e=j.getElementsByTagNameNS(l,"DisplayRect")[0]);for(i=0;i<e.length;i++){f=e[i];g=f.getElementsByTagName("Rect")[0];void 0===g&&(g=f.getElementsByTagNameNS(l,"Rect")[0]);n.push({Rect:{X:parseInt(g.getAttribute("X"),10),Y:parseInt(g.getAttribute("Y"),10),Width:parseInt(g.getAttribute("Width"),10),Height:parseInt(g.getAttribute("Height"),10),MinLevel:parseInt(f.getAttribute("MinLevel"),10),MaxLevel:parseInt(f.getAttribute("MaxLevel"),10)}})}n.length&&(m.Image.DisplayRect=n);return c(b,m)}catch(o){throw o instanceof Error?o:new Error(a.getString("Errors.Dzi"))}else{if("Collection"==k)throw new Error(a.getString("Errors.Dzc"));if("Error"==k){var p=j.getElementsByTagName("Message")[0];var q=p.firstChild.nodeValue;throw new Error(q)}}throw new Error(a.getString("Errors.Dzi"))}function c(b,c){var d,e,f=c.Image,g=f.Url,h=f.Format,i=f.Size,j=f.DisplayRect||[],k=parseInt(i.Width,10),l=parseInt(i.Height,10),m=parseInt(f.TileSize,10),n=parseInt(f.Overlap,10),o=[];for(e=0;e<j.length;e++){d=j[e].Rect;o.push(new a.DisplayRect(parseInt(d.X,10),parseInt(d.Y,10),parseInt(d.Width,10),parseInt(d.Height,10),parseInt(d.MinLevel,10),parseInt(d.MaxLevel,10)))}return a.extend(!0,{width:k,height:l,tileSize:m,tileOverlap:n,minLevel:null,maxLevel:null,tilesUrl:g,fileFormat:h,displayRects:o},c)}a.DziTileSource=function(b,c,d,e,f,g,h,i,j){var k,l,m,n;n=a.isPlainObject(b)?b:{width:arguments[0],height:arguments[1],tileSize:arguments[2],tileOverlap:arguments[3],tilesUrl:arguments[4],fileFormat:arguments[5],displayRects:arguments[6],minLevel:arguments[7],maxLevel:arguments[8]};this._levelRects={};this.tilesUrl=n.tilesUrl;this.fileFormat=n.fileFormat;this.displayRects=n.displayRects;if(this.displayRects)for(k=this.displayRects.length-1;k>=0;k--){l=this.displayRects[k];for(m=l.minLevel;m<=l.maxLevel;m++){this._levelRects[m]||(this._levelRects[m]=[]);this._levelRects[m].push(l)}}a.TileSource.apply(this,[n])};a.extend(a.DziTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){var c;a.Image?c=a.Image.xmlns:a.documentElement&&("Image"==a.documentElement.localName||"Image"==a.documentElement.tagName)&&(c=a.documentElement.namespaceURI);return"http://schemas.microsoft.com/deepzoom/2008"==c||"http://schemas.microsoft.com/deepzoom/2009"==c},configure:function(d,e){var f;f=a.isPlainObject(d)?c(this,d):b(this,d);if(e&&!f.tilesUrl){f.tilesUrl=e.replace(/([^\/]+?)(\.(dzi|xml|js))?\/?(\?.*)?$/,"$1_files/");-1!=e.search(/\.(dzi|xml|js)\?/)?f.queryParams=e.match(/\?.*/):f.queryParams=""}return f},getTileUrl:function(a,b,c){return[this.tilesUrl,a,"/",b,"_",c,".",this.fileFormat,this.queryParams].join("")},tileExists:function(a,b,c){var d,e,f,g,h,i,j,k=this._levelRects[a];if(!k||!k.length)return!0;for(j=k.length-1;j>=0;j--){d=k[j];if(!(a<d.minLevel||a>d.maxLevel)){e=this.getLevelScale(a);f=d.x*e;g=d.y*e;h=f+d.width*e;i=g+d.height*e;f=Math.floor(f/this.tileSize);g=Math.floor(g/this.tileSize);h=Math.ceil(h/this.tileSize);i=Math.ceil(i/this.tileSize);if(b>=f&&h>b&&c>=g&&i>c)return!0}}return!1}})}(OpenSeadragon);!function(a){function b(a){var b=["http://library.stanford.edu/iiif/image-api/compliance.html#level0","http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0","http://iiif.io/api/image/2/level0.json"];var c=-1!=b.indexOf(a[0]);return!c||-1!=a.indexOf("sizeByW")}function c(a){var b=[];for(var c=0;c<a.sizes.length;c++)b.push({url:a["@id"]+"/full/"+a.sizes[c].width+",/0/default.jpg",width:a.sizes[c].width,height:a.sizes[c].height});return b.sort(function(a,b){return a.width-b.width})}function d(b){if(!b||!b.documentElement)throw new Error(a.getString("Errors.Xml"));var c=b.documentElement,d=c.tagName,f=null;if("info"==d)try{f={};e(c,f);return f}catch(g){throw g instanceof Error?g:new Error(a.getString("Errors.IIIF"))}throw new Error(a.getString("Errors.IIIF"))}function e(b,c,d){var f,g;if(3==b.nodeType&&d){g=b.nodeValue.trim();g.match(/^\d*$/)&&(g=Number(g));if(c[d]){a.isArray(c[d])||(c[d]=[c[d]]);c[d].push(g)}else c[d]=g}else if(1==b.nodeType)for(f=0;f<b.childNodes.length;f++)e(b.childNodes[f],c,b.nodeName)}a.IIIFTileSource=function(d){a.extend(!0,this,d);if(!(this.height&&this.width&&this["@id"]))throw new Error("IIIF required parameters not provided.");d.tileSizePerScaleFactor={};if(this.tile_width&&this.tile_height){d.tileWidth=this.tile_width;d.tileHeight=this.tile_height}else if(this.tile_width)d.tileSize=this.tile_width;else if(this.tile_height)d.tileSize=this.tile_height;else if(this.tiles)if(1==this.tiles.length){d.tileWidth=this.tiles[0].width;d.tileHeight=this.tiles[0].height||this.tiles[0].width;this.scale_factors=this.tiles[0].scaleFactors}else{this.scale_factors=[];for(var e=0;e<this.tiles.length;e++)for(var f=0;f<this.tiles[e].scaleFactors.length;f++){var g=this.tiles[e].scaleFactors[f];this.scale_factors.push(g);d.tileSizePerScaleFactor[g]={width:this.tiles[e].width,height:this.tiles[e].height||this.tiles[e].width}}}else if(b(d.profile)){var h=Math.min(this.height,this.width),i=[256,512,1024],j=[];for(var k=0;k<i.length;k++)i[k]<=h&&j.push(i[k]);j.length>0?d.tileSize=Math.max.apply(null,j):d.tileSize=h}else if(this.sizes&&this.sizes.length>0){this.emulateLegacyImagePyramid=!0;d.levels=c(this);a.extend(!0,d,{width:d.levels[d.levels.length-1].width,height:d.levels[d.levels.length-1].height,tileSize:Math.max(d.height,d.width),tileOverlap:0,minLevel:0,maxLevel:d.levels.length-1});this.levels=d.levels}else a.console.error("Nothing in the info.json to construct image pyramids from");d.maxLevel||this.emulateLegacyImagePyramid||(this.scale_factors?d.maxLevel=Math.floor(Math.pow(Math.max.apply(null,this.scale_factors),.5)):d.maxLevel=Number(Math.ceil(Math.log(Math.max(this.width,this.height),2))));a.TileSource.apply(this,[d])};a.extend(a.IIIFTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.protocol&&"http://iiif.io/api/image"==a.protocol?!0:!a["@context"]||"http://library.stanford.edu/iiif/image-api/1.1/context.json"!=a["@context"]&&"http://iiif.io/api/image/1/context.json"!=a["@context"]?a.profile&&0===a.profile.indexOf("http://library.stanford.edu/iiif/image-api/compliance.html")?!0:a.identifier&&a.width&&a.height?!0:a.documentElement&&"info"==a.documentElement.tagName&&"http://library.stanford.edu/iiif/image-api/ns/"==a.documentElement.namespaceURI?!0:!1:!0},configure:function(b,c){if(a.isPlainObject(b)){if(b["@context"])return b;b["@context"]="http://iiif.io/api/image/1.0/context.json";b["@id"]=c.replace("/info.json","");return b}var e=d(b);e["@context"]="http://iiif.io/api/image/1.0/context.json";e["@id"]=c.replace("/info.xml","");return e},getTileWidth:function(b){if(this.emulateLegacyImagePyramid)return a.TileSource.prototype.getTileWidth.call(this,b);var c=Math.pow(2,this.maxLevel-b);return this.tileSizePerScaleFactor&&this.tileSizePerScaleFactor[c]?this.tileSizePerScaleFactor[c].width:this._tileWidth},getTileHeight:function(b){if(this.emulateLegacyImagePyramid)return a.TileSource.prototype.getTileHeight.call(this,b);var c=Math.pow(2,this.maxLevel-b);return this.tileSizePerScaleFactor&&this.tileSizePerScaleFactor[c]?this.tileSizePerScaleFactor[c].height:this._tileHeight},getLevelScale:function(b){if(this.emulateLegacyImagePyramid){var c=NaN;this.levels.length>0&&b>=this.minLevel&&b<=this.maxLevel&&(c=this.levels[b].width/this.levels[this.maxLevel].width);return c}return a.TileSource.prototype.getLevelScale.call(this,b)},getNumTiles:function(b){if(this.emulateLegacyImagePyramid){var c=this.getLevelScale(b);return c?new a.Point(1,1):new a.Point(0,0)}return a.TileSource.prototype.getNumTiles.call(this,b)},getTileAtPoint:function(b,c){return this.emulateLegacyImagePyramid?new a.Point(0,0):a.TileSource.prototype.getTileAtPoint.call(this,b,c)},getTileUrl:function(a,b,c){if(this.emulateLegacyImagePyramid){var d=null;this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].url);return d}var e,f,g,h,i,j,k,l,m,n,o,p,q="0",r=Math.pow(.5,this.maxLevel-a),s=Math.ceil(this.width*r),t=Math.ceil(this.height*r);e=this.getTileWidth(a);f=this.getTileHeight(a);g=Math.ceil(e/r);h=Math.ceil(f/r);o=this["@context"].indexOf("/1.0/context.json")>-1||this["@context"].indexOf("/1.1/context.json")>-1||this["@context"].indexOf("/1/context.json")>-1?"native.jpg":"default.jpg";if(e>s&&f>t){n=s+",";i="full"}else{j=b*g;k=c*h;l=Math.min(g,this.width-j);m=Math.min(h,this.height-k);n=Math.ceil(l*r)+",";i=[j,k,l,m].join(",")}p=[this["@id"],i,n,q,o].join("/");return p}})}(OpenSeadragon);!function(a){a.OsmTileSource=function(b,c,d,e,f){var g;g=a.isPlainObject(b)?b:{width:arguments[0],height:arguments[1],tileSize:arguments[2],tileOverlap:arguments[3],tilesUrl:arguments[4]};if(!g.width||!g.height){g.width=65572864;g.height=65572864}if(!g.tileSize){g.tileSize=256;g.tileOverlap=0}g.tilesUrl||(g.tilesUrl="http://tile.openstreetmap.org/");g.minLevel=8;a.TileSource.apply(this,[g])};a.extend(a.OsmTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.type&&"openstreetmaps"==a.type},configure:function(a,b){return a},getTileUrl:function(a,b,c){return this.tilesUrl+(a-8)+"/"+b+"/"+c+".png"}})}(OpenSeadragon);!function(a){a.TmsTileSource=function(b,c,d,e,f){var g;g=a.isPlainObject(b)?b:{width:arguments[0],height:arguments[1],tileSize:arguments[2],tileOverlap:arguments[3],tilesUrl:arguments[4]};var h,i=256*Math.ceil(g.width/256),j=256*Math.ceil(g.height/256);h=i>j?i/256:j/256;g.maxLevel=Math.ceil(Math.log(h)/Math.log(2))-1;g.tileSize=256;g.width=i;g.height=j;a.TileSource.apply(this,[g])};a.extend(a.TmsTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.type&&"tiledmapservice"==a.type},configure:function(a,b){return a},getTileUrl:function(a,b,c){var d=this.getNumTiles(a).y-1;return this.tilesUrl+a+"/"+b+"/"+(d-c)+".png"}})}(OpenSeadragon);!function(a){function b(b){var c,d,e=[];for(d=0;d<b.length;d++){c=b[d];c.height&&c.width&&c.url&&(c.url.toLowerCase().match(/^.*\.(png|jpg|jpeg|gif)(?:\?.*)?$/)||c.mimetype&&c.mimetype.toLowerCase().match(/^.*\/(png|jpg|jpeg|gif)$/))?e.push({url:c.url,width:Number(c.width),height:Number(c.height)}):a.console.error("Unsupported image format: %s",c.url?c.url:"<no URL>")}return e.sort(function(a,b){return a.height-b.height})}function c(b,c){if(!c||!c.documentElement)throw new Error(a.getString("Errors.Xml"));var e,f,g=c.documentElement,h=g.tagName,i=null,j=[];if("image"==h)try{i={type:g.getAttribute("type"),levels:[]};j=g.getElementsByTagName("level");for(f=0;f<j.length;f++){e=j[f];i.levels.push({url:e.getAttribute("url"),width:parseInt(e.getAttribute("width"),10),height:parseInt(e.getAttribute("height"),10)})}return d(b,i)}catch(k){throw k instanceof Error?k:new Error("Unknown error parsing Legacy Image Pyramid XML.")}else{if("collection"==h)throw new Error("Legacy Image Pyramid Collections not yet supported.");if("error"==h)throw new Error("Error: "+c)}throw new Error("Unknown element "+h)}function d(a,b){return b.levels}a.LegacyTileSource=function(c){var d,e,f;a.isArray(c)&&(d={type:"legacy-image-pyramid",levels:c});d.levels=b(d.levels);if(d.levels.length>0){e=d.levels[d.levels.length-1].width;f=d.levels[d.levels.length-1].height}else{e=0;f=0;a.console.error("No supported image formats found")}a.extend(!0,d,{width:e,height:f,tileSize:Math.max(f,e),tileOverlap:0,minLevel:0,maxLevel:d.levels.length>0?d.levels.length-1:0});a.TileSource.apply(this,[d]);this.levels=d.levels};a.extend(a.LegacyTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.type&&"legacy-image-pyramid"==a.type||a.documentElement&&"legacy-image-pyramid"==a.documentElement.getAttribute("type")},configure:function(b,e){var f;f=a.isPlainObject(b)?d(this,b):c(this,b);return f},getLevelScale:function(a){var b=NaN;this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(b=this.levels[a].width/this.levels[this.maxLevel].width);return b},getNumTiles:function(b){var c=this.getLevelScale(b);return c?new a.Point(1,1):new a.Point(0,0)},getTileAtPoint:function(b,c){return new a.Point(0,0)},getTileUrl:function(a,b,c){var d=null;this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].url);return d}})}(OpenSeadragon);!function(a){a.ImageTileSource=function(b){b=a.extend({buildPyramid:!0,crossOriginPolicy:!1,ajaxWithCredentials:!1,useCanvas:!0},b);a.TileSource.apply(this,[b])};a.extend(a.ImageTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.type&&"image"===a.type},configure:function(a,b){return a},getImageInfo:function(b){var c=this._image=new Image;var d=this;this.crossOriginPolicy&&(c.crossOrigin=this.crossOriginPolicy);this.ajaxWithCredentials&&(c.useCredentials=this.ajaxWithCredentials);a.addEvent(c,"load",function(){d.width=c.naturalWidth;d.height=c.naturalHeight;d.aspectRatio=d.width/d.height;d.dimensions=new a.Point(d.width,d.height);d._tileWidth=d.width;d._tileHeight=d.height;d.tileOverlap=0;d.minLevel=0;d.levels=d._buildLevels();d.maxLevel=d.levels.length-1;d.ready=!0;d.raiseEvent("ready",{tileSource:d})});a.addEvent(c,"error",function(){d.raiseEvent("open-failed",{message:"Error loading image at "+b,source:b})});c.src=b},getLevelScale:function(a){var b=NaN;a>=this.minLevel&&a<=this.maxLevel&&(b=this.levels[a].width/this.levels[this.maxLevel].width);return b},getNumTiles:function(b){var c=this.getLevelScale(b);return c?new a.Point(1,1):new a.Point(0,0)},getTileAtPoint:function(b,c){return new a.Point(0,0)},getTileUrl:function(a,b,c){var d=null;a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].url);return d},getContext2D:function(a,b,c){var d=null;a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].context2D);return d},_buildLevels:function(){var b=[{url:this._image.src,width:this._image.naturalWidth,height:this._image.naturalHeight}];if(!this.buildPyramid||!a.supportsCanvas||!this.useCanvas){delete this._image;return b}var c=this._image.naturalWidth;var d=this._image.naturalHeight;var e=document.createElement("canvas");var f=e.getContext("2d");e.width=c;e.height=d;f.drawImage(this._image,0,0,c,d);b[0].context2D=f;delete this._image;if(a.isCanvasTainted(e))return b;for(;c>=2&&d>=2;){c=Math.floor(c/2);d=Math.floor(d/2);var g=document.createElement("canvas");var h=g.getContext("2d");g.width=c;g.height=d;h.drawImage(e,0,0,c,d);b.splice(0,0,{context2D:h,width:c,height:d});e=g;f=h}return b}})}(OpenSeadragon);!function(a){a.TileSourceCollection=function(b,c,d,e){a.console.error("TileSourceCollection is deprecated; use World instead")}}(OpenSeadragon);!function(a){function b(b){a.requestAnimationFrame(function(){c(b)})}function c(c){var d,e,f;if(c.shouldFade){d=a.now();e=d-c.fadeBeginTime;f=1-e/c.fadeLength;f=Math.min(1,f);f=Math.max(0,f);c.imgGroup&&a.setElementOpacity(c.imgGroup,f,!0);f>0&&b(c)}}function d(c){c.shouldFade=!0;c.fadeBeginTime=a.now()+c.fadeDelay;window.setTimeout(function(){b(c)},c.fadeDelay)}function e(b){b.shouldFade=!1;b.imgGroup&&a.setElementOpacity(b.imgGroup,1,!0)}function f(b,c){if(!b.element.disabled){if(c>=a.ButtonState.GROUP&&b.currentState==a.ButtonState.REST){e(b);b.currentState=a.ButtonState.GROUP}if(c>=a.ButtonState.HOVER&&b.currentState==a.ButtonState.GROUP){b.imgHover&&(b.imgHover.style.visibility="");b.currentState=a.ButtonState.HOVER}if(c>=a.ButtonState.DOWN&&b.currentState==a.ButtonState.HOVER){b.imgDown&&(b.imgDown.style.visibility="");b.currentState=a.ButtonState.DOWN}}}function g(b,c){if(!b.element.disabled){if(c<=a.ButtonState.HOVER&&b.currentState==a.ButtonState.DOWN){b.imgDown&&(b.imgDown.style.visibility="hidden");b.currentState=a.ButtonState.HOVER}if(c<=a.ButtonState.GROUP&&b.currentState==a.ButtonState.HOVER){b.imgHover&&(b.imgHover.style.visibility="hidden");b.currentState=a.ButtonState.GROUP}if(c<=a.ButtonState.REST&&b.currentState==a.ButtonState.GROUP){d(b);b.currentState=a.ButtonState.REST}}}a.ButtonState={REST:0,GROUP:1,HOVER:2,DOWN:3};a.Button=function(b){var c=this;a.EventSource.call(this);a.extend(!0,this,{tooltip:null,srcRest:null,srcGroup:null,srcHover:null,srcDown:null,clickTimeThreshold:a.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:a.DEFAULT_SETTINGS.clickDistThreshold,fadeDelay:0,fadeLength:2e3,onPress:null,onRelease:null,onClick:null,onEnter:null,onExit:null,onFocus:null,onBlur:null},b);this.element=b.element||a.makeNeutralElement("div");if(!b.element){this.imgRest=a.makeTransparentImage(this.srcRest);this.imgGroup=a.makeTransparentImage(this.srcGroup);this.imgHover=a.makeTransparentImage(this.srcHover);this.imgDown=a.makeTransparentImage(this.srcDown);this.imgRest.alt=this.imgGroup.alt=this.imgHover.alt=this.imgDown.alt=this.tooltip;this.element.style.position="relative";a.setElementTouchActionNone(this.element);this.imgGroup.style.position=this.imgHover.style.position=this.imgDown.style.position="absolute";this.imgGroup.style.top=this.imgHover.style.top=this.imgDown.style.top="0px";this.imgGroup.style.left=this.imgHover.style.left=this.imgDown.style.left="0px";this.imgHover.style.visibility=this.imgDown.style.visibility="hidden";a.Browser.vendor==a.BROWSERS.FIREFOX&&a.Browser.version<3&&(this.imgGroup.style.top=this.imgHover.style.top=this.imgDown.style.top="");this.element.appendChild(this.imgRest);this.element.appendChild(this.imgGroup);this.element.appendChild(this.imgHover);this.element.appendChild(this.imgDown)}this.addHandler("press",this.onPress);this.addHandler("release",this.onRelease);this.addHandler("click",this.onClick);this.addHandler("enter",this.onEnter);this.addHandler("exit",this.onExit);this.addHandler("focus",this.onFocus);this.addHandler("blur",this.onBlur);this.currentState=a.ButtonState.GROUP;this.fadeBeginTime=null;this.shouldFade=!1;this.element.style.display="inline-block";this.element.style.position="relative";this.element.title=this.tooltip;this.tracker=new a.MouseTracker({element:this.element,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:function(b){if(b.insideElementPressed){f(c,a.ButtonState.DOWN);c.raiseEvent("enter",{originalEvent:b.originalEvent})}else b.buttonDownAny||f(c,a.ButtonState.HOVER);
+},focusHandler:function(a){this.enterHandler(a);c.raiseEvent("focus",{originalEvent:a.originalEvent})},exitHandler:function(b){g(c,a.ButtonState.GROUP);b.insideElementPressed&&c.raiseEvent("exit",{originalEvent:b.originalEvent})},blurHandler:function(a){this.exitHandler(a);c.raiseEvent("blur",{originalEvent:a.originalEvent})},pressHandler:function(b){f(c,a.ButtonState.DOWN);c.raiseEvent("press",{originalEvent:b.originalEvent})},releaseHandler:function(b){if(b.insideElementPressed&&b.insideElementReleased){g(c,a.ButtonState.HOVER);c.raiseEvent("release",{originalEvent:b.originalEvent})}else b.insideElementPressed?g(c,a.ButtonState.GROUP):f(c,a.ButtonState.HOVER)},clickHandler:function(a){a.quick&&c.raiseEvent("click",{originalEvent:a.originalEvent})},keyHandler:function(a){if(13===a.keyCode){c.raiseEvent("click",{originalEvent:a.originalEvent});c.raiseEvent("release",{originalEvent:a.originalEvent});return!1}return!0}});g(this,a.ButtonState.REST)};a.extend(a.Button.prototype,a.EventSource.prototype,{notifyGroupEnter:function(){f(this,a.ButtonState.GROUP)},notifyGroupExit:function(){g(this,a.ButtonState.REST)},disable:function(){this.notifyGroupExit();this.element.disabled=!0;a.setElementOpacity(this.element,.2,!0)},enable:function(){this.element.disabled=!1;a.setElementOpacity(this.element,1,!0);this.notifyGroupEnter()}})}(OpenSeadragon);!function(a){a.ButtonGroup=function(b){a.extend(!0,this,{buttons:[],clickTimeThreshold:a.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:a.DEFAULT_SETTINGS.clickDistThreshold,labelText:""},b);var c,d=this.buttons.concat([]),e=this;this.element=b.element||a.makeNeutralElement("div");if(!b.group){this.label=a.makeNeutralElement("label");this.element.style.display="inline-block";this.element.appendChild(this.label);for(c=0;c<d.length;c++)this.element.appendChild(d[c].element)}a.setElementTouchActionNone(this.element);this.tracker=new a.MouseTracker({element:this.element,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:function(a){var b;for(b=0;b<e.buttons.length;b++)e.buttons[b].notifyGroupEnter()},exitHandler:function(a){var b;if(!a.insideElementPressed)for(b=0;b<e.buttons.length;b++)e.buttons[b].notifyGroupExit()}})};a.ButtonGroup.prototype={emulateEnter:function(){this.tracker.enterHandler({eventSource:this.tracker})},emulateExit:function(){this.tracker.exitHandler({eventSource:this.tracker})}}}(OpenSeadragon);!function(a){a.Rect=function(a,b,c,d,e){this.x="number"==typeof a?a:0;this.y="number"==typeof b?b:0;this.width="number"==typeof c?c:0;this.height="number"==typeof d?d:0;this.degrees="number"==typeof e?e:0;this.degrees=this.degrees%360;this.degrees<0&&(this.degrees+=360);var f,g;if(this.degrees>=270){f=this.getTopRight();this.x=f.x;this.y=f.y;g=this.height;this.height=this.width;this.width=g;this.degrees-=270}else if(this.degrees>=180){f=this.getBottomRight();this.x=f.x;this.y=f.y;this.degrees-=180}else if(this.degrees>=90){f=this.getBottomLeft();this.x=f.x;this.y=f.y;g=this.height;this.height=this.width;this.width=g;this.degrees-=90}};a.Rect.fromSummits=function(b,c,d){var e=b.distanceTo(c);var f=b.distanceTo(d);var g=c.minus(b);var h=Math.atan(g.y/g.x);g.x<0?h+=Math.PI:g.y<0&&(h+=2*Math.PI);return new a.Rect(b.x,b.y,e,f,h/Math.PI*180)};a.Rect.prototype={clone:function(){return new a.Rect(this.x,this.y,this.width,this.height,this.degrees)},getAspectRatio:function(){return this.width/this.height},getTopLeft:function(){return new a.Point(this.x,this.y)},getBottomRight:function(){return new a.Point(this.x+this.width,this.y+this.height).rotate(this.degrees,this.getTopLeft())},getTopRight:function(){return new a.Point(this.x+this.width,this.y).rotate(this.degrees,this.getTopLeft())},getBottomLeft:function(){return new a.Point(this.x,this.y+this.height).rotate(this.degrees,this.getTopLeft())},getCenter:function(){return new a.Point(this.x+this.width/2,this.y+this.height/2).rotate(this.degrees,this.getTopLeft())},getSize:function(){return new a.Point(this.width,this.height)},equals:function(b){return b instanceof a.Rect&&this.x===b.x&&this.y===b.y&&this.width===b.width&&this.height===b.height&&this.degrees===b.degrees},times:function(b){return new a.Rect(this.x*b,this.y*b,this.width*b,this.height*b,this.degrees)},translate:function(b){return new a.Rect(this.x+b.x,this.y+b.y,this.width,this.height,this.degrees)},union:function(b){var c=this.getBoundingBox();var d=b.getBoundingBox();var e=Math.min(c.x,d.x);var f=Math.min(c.y,d.y);var g=Math.max(c.x+c.width,d.x+d.width);var h=Math.max(c.y+c.height,d.y+d.height);return new a.Rect(e,f,g-e,h-f)},intersection:function(b){function c(b,c,e,f){var g=c.minus(b);var h=f.minus(e);var i=-h.x*g.y+g.x*h.y;if(0===i)return null;var j=(g.x*(b.y-e.y)-g.y*(b.x-e.x))/i;var k=(h.x*(b.y-e.y)-h.y*(b.x-e.x))/i;return j>=-d&&1-d>=j&&k>=-d&&1-d>=k?new a.Point(b.x+k*g.x,b.y+k*g.y):null}var d=1e-10;var e=[];var f=this.getTopLeft();b.containsPoint(f,d)&&e.push(f);var g=this.getTopRight();b.containsPoint(g,d)&&e.push(g);var h=this.getBottomLeft();b.containsPoint(h,d)&&e.push(h);var i=this.getBottomRight();b.containsPoint(i,d)&&e.push(i);var j=b.getTopLeft();this.containsPoint(j,d)&&e.push(j);var k=b.getTopRight();this.containsPoint(k,d)&&e.push(k);var l=b.getBottomLeft();this.containsPoint(l,d)&&e.push(l);var m=b.getBottomRight();this.containsPoint(m,d)&&e.push(m);var n=this._getSegments();var o=b._getSegments();for(var p=0;p<n.length;p++){var q=n[p];for(var r=0;r<o.length;r++){var s=o[r];var t=c(q[0],q[1],s[0],s[1]);t&&e.push(t)}}if(0===e.length)return null;var u=e[0].x;var v=e[0].x;var w=e[0].y;var x=e[0].y;for(var y=1;y<e.length;y++){var z=e[y];z.x<u&&(u=z.x);z.x>v&&(v=z.x);z.y<w&&(w=z.y);z.y>x&&(x=z.y)}return new a.Rect(u,w,v-u,x-w)},_getSegments:function(){var a=this.getTopLeft();var b=this.getTopRight();var c=this.getBottomLeft();var d=this.getBottomRight();return[[a,b],[b,d],[d,c],[c,a]]},rotate:function(b,c){b%=360;if(0===b)return this.clone();0>b&&(b+=360);c=c||this.getCenter();var d=this.getTopLeft().rotate(b,c);var e=this.getTopRight().rotate(b,c);var f=e.minus(d);var g=Math.atan(f.y/f.x);f.x<0?g+=Math.PI:f.y<0&&(g+=2*Math.PI);return new a.Rect(d.x,d.y,this.width,this.height,g/Math.PI*180)},getBoundingBox:function(){if(0===this.degrees)return this.clone();var b=this.getTopLeft();var c=this.getTopRight();var d=this.getBottomLeft();var e=this.getBottomRight();var f=Math.min(b.x,c.x,d.x,e.x);var g=Math.max(b.x,c.x,d.x,e.x);var h=Math.min(b.y,c.y,d.y,e.y);var i=Math.max(b.y,c.y,d.y,e.y);return new a.Rect(f,h,g-f,i-h)},getIntegerBoundingBox:function(){var b=this.getBoundingBox();var c=Math.floor(b.x);var d=Math.floor(b.y);var e=Math.ceil(b.width+b.x-c);var f=Math.ceil(b.height+b.y-d);return new a.Rect(c,d,e,f)},containsPoint:function(a,b){b=b||0;var c=this.getTopLeft();var d=this.getTopRight();var e=this.getBottomLeft();var f=d.minus(c);var g=e.minus(c);return(a.x-c.x)*f.x+(a.y-c.y)*f.y>=-b&&(a.x-d.x)*f.x+(a.y-d.y)*f.y<=b&&(a.x-c.x)*g.x+(a.y-c.y)*g.y>=-b&&(a.x-e.x)*g.x+(a.y-e.y)*g.y<=b},toString:function(){return"["+Math.round(100*this.x)/100+", "+Math.round(100*this.y)/100+", "+Math.round(100*this.width)/100+"x"+Math.round(100*this.height)/100+", "+Math.round(100*this.degrees)/100+"deg]"}}}(OpenSeadragon);!function(a){function b(b){var c=Number(this.element.style.marginLeft.replace("px","")),e=Number(this.element.style.marginTop.replace("px","")),f=Number(this.element.style.width.replace("px","")),g=Number(this.element.style.height.replace("px","")),h=a.getElementSize(this.viewer.canvas);this.dragging=!0;if(this.element)if("horizontal"==this.scroll){if(-b.delta.x>0){if(c>-(f-h.x)){this.element.style.marginLeft=c+2*b.delta.x+"px";d(this,h.x,c+2*b.delta.x)}}else if(-b.delta.x<0&&0>c){this.element.style.marginLeft=c+2*b.delta.x+"px";d(this,h.x,c+2*b.delta.x)}}else if(-b.delta.y>0){if(e>-(g-h.y)){this.element.style.marginTop=e+2*b.delta.y+"px";d(this,h.y,e+2*b.delta.y)}}else if(-b.delta.y<0&&0>e){this.element.style.marginTop=e+2*b.delta.y+"px";d(this,h.y,e+2*b.delta.y)}return!1}function c(b){var c=Number(this.element.style.marginLeft.replace("px","")),e=Number(this.element.style.marginTop.replace("px","")),f=Number(this.element.style.width.replace("px","")),g=Number(this.element.style.height.replace("px","")),h=a.getElementSize(this.viewer.canvas);if(this.element)if("horizontal"==this.scroll){if(b.scroll>0){if(c>-(f-h.x)){this.element.style.marginLeft=c-60*b.scroll+"px";d(this,h.x,c-60*b.scroll)}}else if(b.scroll<0&&0>c){this.element.style.marginLeft=c-60*b.scroll+"px";d(this,h.x,c-60*b.scroll)}}else if(b.scroll<0){if(e>h.y-g){this.element.style.marginTop=e+60*b.scroll+"px";d(this,h.y,e+60*b.scroll)}}else if(b.scroll>0&&0>e){this.element.style.marginTop=e+60*b.scroll+"px";d(this,h.y,e+60*b.scroll)}return!1}function d(b,c,d){var e,f,g,h,i,j,k;e="horizontal"==b.scroll?b.panelWidth:b.panelHeight;f=Math.ceil(c/e)+5;g=Math.ceil((Math.abs(d)+c)/e)+1;f=g-f;f=0>f?0:f;for(j=f;g>j&&j<b.panels.length;j++){k=b.panels[j];if(!k.activePanel){h=new a.Viewer({id:k.id,tileSources:[b.viewer.tileSources[j]],element:k,navigatorSizeRatio:b.sizeRatio,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0});h.displayRegion=a.makeNeutralElement("div");h.displayRegion.id=k.id+"-displayregion";h.displayRegion.className="displayregion";i=h.displayRegion.style;i.position="relative";i.top="0px";i.left="0px";i.fontSize="0px";i.overflow="hidden";i["float"]="left";i.cssFloat="left";i.styleFloat="left";i.zIndex=999999999;i.cursor="default";i.width=b.panelWidth-4+"px";i.height=b.panelHeight-4+"px";h.displayRegion.innerTracker=new a.MouseTracker({element:h.displayRegion,startDisabled:!0});k.getElementsByTagName("div")[0].appendChild(h.displayRegion);k.activePanel=!0}}}function e(a){var b=a.eventSource.element;"horizontal"==this.scroll?b.style.marginBottom="0px":b.style.marginLeft="0px";return!1}function f(b){var c=b.eventSource.element;"horizontal"==this.scroll?c.style.marginBottom="-"+a.getElementSize(c).y/2+"px":c.style.marginLeft="-"+a.getElementSize(c).x/2+"px";return!1}function g(a){if(a.preventDefaultAction||a.ctrl||a.alt||a.meta)return!0;switch(a.keyCode){case 38:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 40:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 37:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 39:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;default:return!0}}function h(a){if(a.preventDefaultAction||a.ctrl||a.alt||a.meta)return!0;switch(a.keyCode){case 61:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 45:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 48:case 119:case 87:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 115:case 83:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 97:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 100:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;default:return!0}}var i={};a.ReferenceStrip=function(j){var k,l,m,n=this,o=j.viewer,p=a.getElementSize(o.element);if(!j.id){j.id="referencestrip-"+a.now();this.element=a.makeNeutralElement("div");this.element.id=j.id;this.element.className="referencestrip"}j=a.extend(!0,{sizeRatio:a.DEFAULT_SETTINGS.referenceStripSizeRatio,position:a.DEFAULT_SETTINGS.referenceStripPosition,scroll:a.DEFAULT_SETTINGS.referenceStripScroll,clickTimeThreshold:a.DEFAULT_SETTINGS.clickTimeThreshold},j,{element:this.element,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1});a.extend(this,j);i[this.id]={animating:!1};this.minPixelRatio=this.viewer.minPixelRatio;l=this.element.style;l.marginTop="0px";l.marginRight="0px";l.marginBottom="0px";l.marginLeft="0px";l.left="0px";l.bottom="0px";l.border="0px";l.background="#000";l.position="relative";a.setElementTouchActionNone(this.element);a.setElementOpacity(this.element,.8);this.viewer=o;this.innerTracker=new a.MouseTracker({element:this.element,dragHandler:a.delegate(this,b),scrollHandler:a.delegate(this,c),enterHandler:a.delegate(this,e),exitHandler:a.delegate(this,f),keyDownHandler:a.delegate(this,g),keyHandler:a.delegate(this,h)});if(j.width&&j.height){this.element.style.width=j.width+"px";this.element.style.height=j.height+"px";o.addControl(this.element,{anchor:a.ControlAnchor.BOTTOM_LEFT})}else if("horizontal"==j.scroll){this.element.style.width=p.x*j.sizeRatio*o.tileSources.length+12*o.tileSources.length+"px";this.element.style.height=p.y*j.sizeRatio+"px";o.addControl(this.element,{anchor:a.ControlAnchor.BOTTOM_LEFT})}else{this.element.style.height=p.y*j.sizeRatio*o.tileSources.length+12*o.tileSources.length+"px";this.element.style.width=p.x*j.sizeRatio+"px";o.addControl(this.element,{anchor:a.ControlAnchor.TOP_LEFT})}this.panelWidth=p.x*this.sizeRatio+8;this.panelHeight=p.y*this.sizeRatio+8;this.panels=[];for(m=0;m<o.tileSources.length;m++){k=a.makeNeutralElement("div");k.id=this.element.id+"-"+m;k.style.width=n.panelWidth+"px";k.style.height=n.panelHeight+"px";k.style.display="inline";k.style["float"]="left";k.style.cssFloat="left";k.style.styleFloat="left";k.style.padding="2px";a.setElementTouchActionNone(k);k.innerTracker=new a.MouseTracker({element:k,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,pressHandler:function(b){b.eventSource.dragging=a.now()},releaseHandler:function(b){var c=b.eventSource,d=c.element.id,e=Number(d.split("-")[2]),f=a.now();if(b.insideElementPressed&&b.insideElementReleased&&c.dragging&&f-c.dragging<c.clickTimeThreshold){c.dragging=null;o.goToPage(e)}}});this.element.appendChild(k);k.activePanel=!1;this.panels.push(k)}d(this,"vertical"==this.scroll?p.y:p.x,0);this.setFocus(0)};a.extend(a.ReferenceStrip.prototype,a.EventSource.prototype,a.Viewer.prototype,{setFocus:function(b){var c,f=a.getElement(this.element.id+"-"+b),g=a.getElementSize(this.viewer.canvas),h=Number(this.element.style.width.replace("px","")),i=Number(this.element.style.height.replace("px","")),j=-Number(this.element.style.marginLeft.replace("px","")),k=-Number(this.element.style.marginTop.replace("px",""));if(this.currentSelected!==f){this.currentSelected&&(this.currentSelected.style.background="#000");this.currentSelected=f;this.currentSelected.style.background="#999";if("horizontal"==this.scroll){c=Number(b)*(this.panelWidth+3);if(c>j+g.x-this.panelWidth){c=Math.min(c,h-g.x);this.element.style.marginLeft=-c+"px";d(this,g.x,-c)}else if(j>c){c=Math.max(0,c-g.x/2);this.element.style.marginLeft=-c+"px";d(this,g.x,-c)}}else{c=Number(b)*(this.panelHeight+3);if(c>k+g.y-this.panelHeight){c=Math.min(c,i-g.y);this.element.style.marginTop=-c+"px";d(this,g.y,-c)}else if(k>c){c=Math.max(0,c-g.y/2);this.element.style.marginTop=-c+"px";d(this,g.y,-c)}}this.currentPage=b;e.call(this,{eventSource:this.innerTracker})}},update:function(){if(i[this.id].animating){a.console.log("image reference strip update");return!0}return!1},destroy:function(){this.element&&this.element.parentNode.removeChild(this.element)}})}(OpenSeadragon);!function(a){a.DisplayRect=function(b,c,d,e,f,g){a.Rect.apply(this,[b,c,d,e]);this.minLevel=f;this.maxLevel=g};a.extend(a.DisplayRect.prototype,a.Rect.prototype)}(OpenSeadragon);!function(a){function b(a,b){return(1-Math.exp(a*-b))/(1-Math.exp(-a))}a.Spring=function(b){var c=arguments;"object"!=typeof b&&(b={initial:c.length&&"number"==typeof c[0]?c[0]:void 0,springStiffness:c.length>1?c[1].springStiffness:5,animationTime:c.length>1?c[1].animationTime:1.5});a.console.assert("number"==typeof b.springStiffness&&0!==b.springStiffness,"[OpenSeadragon.Spring] options.springStiffness must be a non-zero number");a.console.assert("number"==typeof b.animationTime&&b.animationTime>=0,"[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0");if(b.exponential){this._exponential=!0;delete b.exponential}a.extend(!0,this,b);this.current={value:"number"==typeof this.initial?this.initial:this._exponential?0:1,time:a.now()};a.console.assert(!this._exponential||0!==this.current.value,"[OpenSeadragon.Spring] value must be non-zero for exponential springs");this.start={value:this.current.value,time:this.current.time};this.target={value:this.current.value,time:this.current.time};if(this._exponential){this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value);this.current._logValue=Math.log(this.current.value)}};a.Spring.prototype={resetTo:function(b){a.console.assert(!this._exponential||0!==b,"[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs");this.start.value=this.target.value=this.current.value=b;this.start.time=this.target.time=this.current.time=a.now();if(this._exponential){this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value);this.current._logValue=Math.log(this.current.value)}},springTo:function(b){a.console.assert(!this._exponential||0!==b,"[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs");this.start.value=this.current.value;this.start.time=this.current.time;this.target.value=b;this.target.time=this.start.time+1e3*this.animationTime;if(this._exponential){this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value)}},shiftBy:function(b){this.start.value+=b;this.target.value+=b;if(this._exponential){a.console.assert(0!==this.target.value&&0!==this.start.value,"[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs");this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value)}},setExponential:function(b){this._exponential=b;if(this._exponential){a.console.assert(0!==this.current.value&&0!==this.target.value&&0!==this.start.value,"[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs");this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value);this.current._logValue=Math.log(this.current.value)}},update:function(){this.current.time=a.now();var c,d;if(this._exponential){c=this.start._logValue;d=this.target._logValue}else{c=this.start.value;d=this.target.value}var e=this.current.time>=this.target.time?d:c+(d-c)*b(this.springStiffness,(this.current.time-this.start.time)/(this.target.time-this.start.time));this._exponential?this.current.value=Math.exp(e):this.current.value=e},isAtTargetValue:function(){return this.current.value===this.target.value}}}(OpenSeadragon);!function(a){function b(b){a.extend(!0,this,{timeout:a.DEFAULT_SETTINGS.timeout,jobId:null},b);this.image=null}function c(a,b,c){var d;a.jobsInProgress--;if((!a.jobLimit||a.jobsInProgress<a.jobLimit)&&a.jobQueue.length>0){d=a.jobQueue.shift();d.start();a.jobsInProgress++}c(b.image,b.errorMsg)}b.prototype={errorMsg:null,start:function(){var a=this;this.image=new Image;this.crossOriginPolicy!==!1&&(this.image.crossOrigin=this.crossOriginPolicy);this.image.onload=function(){a.finish(!0)};this.image.onabort=this.image.onerror=function(){a.errorMsg="Image load aborted";a.finish(!1)};this.jobId=window.setTimeout(function(){a.errorMsg="Image load exceeded timeout";a.finish(!1)},this.timeout);this.image.src=this.src},finish:function(a){this.image.onload=this.image.onerror=this.image.onabort=null;a||(this.image=null);this.jobId&&window.clearTimeout(this.jobId);this.callback(this)}};a.ImageLoader=function(b){a.extend(!0,this,{jobLimit:a.DEFAULT_SETTINGS.imageLoaderLimit,jobQueue:[],jobsInProgress:0},b)};a.ImageLoader.prototype={addJob:function(a){var d=this,e=function(b){c(d,b,a.callback)},f={src:a.src,crossOriginPolicy:a.crossOriginPolicy,callback:e,abort:a.abort},g=new b(f);if(!this.jobLimit||this.jobsInProgress<this.jobLimit){g.start();this.jobsInProgress++}else this.jobQueue.push(g)},clear:function(){for(var a=0;a<this.jobQueue.length;a++){var b=this.jobQueue[a];"function"==typeof b.abort&&b.abort()}this.jobQueue=[]}}}(OpenSeadragon);!function(a){a.Tile=function(a,b,c,d,e,f,g){this.level=a;this.x=b;this.y=c;this.bounds=d;this.exists=e;this.url=f;this.context2D=g;this.loaded=!1;this.loading=!1;this.element=null;this.imgElement=null;this.image=null;this.style=null;this.position=null;this.size=null;this.blendStart=null;this.opacity=null;this.distance=null;this.visibility=null;this.beingDrawn=!1;this.lastTouchTime=0};a.Tile.prototype={toString:function(){return this.level+"/"+this.x+"_"+this.y},_hasTransparencyChannel:function(){return!!this.context2D||this.url.match(".png")},drawHTML:function(b){if(this.cacheImageRecord)if(this.loaded){if(!this.element){this.element=a.makeNeutralElement("div");this.imgElement=this.cacheImageRecord.getImage().cloneNode();this.imgElement.style.msInterpolationMode="nearest-neighbor";this.imgElement.style.width="100%";this.imgElement.style.height="100%";this.style=this.element.style;this.style.position="absolute"}this.element.parentNode!=b&&b.appendChild(this.element);this.imgElement.parentNode!=this.element&&this.element.appendChild(this.imgElement);this.style.top=this.position.y+"px";this.style.left=this.position.x+"px";this.style.height=this.size.y+"px";this.style.width=this.size.x+"px";a.setElementOpacity(this.element,this.opacity)}else a.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString());else a.console.warn("[Tile.drawHTML] attempting to draw tile %s when it's not cached",this.toString())},drawCanvas:function(b,c,d,e){var f,g=this.position.times(a.pixelDensityRatio),h=this.size.times(a.pixelDensityRatio);if(this.context2D||this.cacheImageRecord){f=this.context2D||this.cacheImageRecord.getRenderedContext();if(this.loaded&&f){b.save();b.globalAlpha=this.opacity;if("number"==typeof d&&1!==d){g=g.times(d);h=h.times(d)}e instanceof a.Point&&(g=g.plus(e));1===b.globalAlpha&&this._hasTransparencyChannel()&&b.clearRect(g.x+1,g.y+1,h.x-2,h.y-2);c({context:b,tile:this,rendered:f});b.drawImage(f.canvas,0,0,f.canvas.width,f.canvas.height,g.x,g.y,h.x,h.y);b.restore()}else a.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString())}else a.console.warn("[Tile.drawCanvas] attempting to draw tile %s when it's not cached",this.toString())},getScaleForEdgeSmoothing:function(){var b;if(this.cacheImageRecord)b=this.cacheImageRecord.getRenderedContext();else{if(!this.context2D){a.console.warn("[Tile.drawCanvas] attempting to get tile scale %s when tile's not cached",this.toString());return 1}b=this.context2D}return b.canvas.width/(this.size.x*a.pixelDensityRatio)},getTranslationForEdgeSmoothing:function(b,c,d){var e=Math.max(1,Math.ceil((d.x-c.x)/2));var f=Math.max(1,Math.ceil((d.y-c.y)/2));return new a.Point(e,f).minus(this.position.times(a.pixelDensityRatio).times(b||1).apply(function(a){return a%1}))},unload:function(){this.imgElement&&this.imgElement.parentNode&&this.imgElement.parentNode.removeChild(this.imgElement);this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element);this.element=null;this.imgElement=null;this.loaded=!1;this.loading=!1}}}(OpenSeadragon);!function(a){a.OverlayPlacement=a.Placement;a.OverlayRotationMode=a.freezeObject({NO_ROTATION:1,EXACT:2,BOUNDING_BOX:3});a.Overlay=function(b,c,d){var e;e=a.isPlainObject(b)?b:{element:b,location:c,placement:d};this.element=e.element;this.style=e.element.style;this._init(e)};a.Overlay.prototype={_init:function(b){this.location=b.location;this.placement=void 0===b.placement?a.Placement.TOP_LEFT:b.placement;this.onDraw=b.onDraw;this.checkResize=void 0===b.checkResize?!0:b.checkResize;this.width=void 0===b.width?null:b.width;this.height=void 0===b.height?null:b.height;this.rotationMode=b.rotationMode||a.OverlayRotationMode.EXACT;if(this.location instanceof a.Rect){this.width=this.location.width;this.height=this.location.height;this.location=this.location.getTopLeft();this.placement=a.Placement.TOP_LEFT}this.scales=null!==this.width&&null!==this.height;this.bounds=new a.Rect(this.location.x,this.location.y,this.width,this.height);this.position=this.location},adjust:function(b,c){var d=a.Placement.properties[this.placement];if(d){d.isHorizontallyCentered?b.x-=c.x/2:d.isRight&&(b.x-=c.x);d.isVerticallyCentered?b.y-=c.y/2:d.isBottom&&(b.y-=c.y)}},destroy:function(){var b=this.element;var c=this.style;if(b.parentNode){b.parentNode.removeChild(b);if(b.prevElementParent){c.display="none";document.body.appendChild(b)}}this.onDraw=null;c.top="";c.left="";c.position="";null!==this.width&&(c.width="");null!==this.height&&(c.height="");var d=a.getCssPropertyWithVendorPrefix("transformOrigin");var e=a.getCssPropertyWithVendorPrefix("transform");if(d&&e){c[d]="";c[e]=""}},drawHTML:function(b,c){var d=this.element;if(d.parentNode!==b){d.prevElementParent=d.parentNode;d.prevNextSibling=d.nextSibling;b.appendChild(d);this.size=a.getElementSize(d)}var e=this._getOverlayPositionAndSize(c);var f=e.position;var g=this.size=e.size;var h=e.rotate;if(this.onDraw)this.onDraw(f,g,this.element);else{var i=this.style;i.left=f.x+"px";i.top=f.y+"px";null!==this.width&&(i.width=g.x+"px");null!==this.height&&(i.height=g.y+"px");var j=a.getCssPropertyWithVendorPrefix("transformOrigin");var k=a.getCssPropertyWithVendorPrefix("transform");if(j&&k)if(h){i[j]=this._getTransformOrigin();i[k]="rotate("+h+"deg)"}else{i[j]="";i[k]=""}i.position="absolute";"none"!==i.display&&(i.display="block")}},_getOverlayPositionAndSize:function(b){var c=b.pixelFromPoint(this.location,!0);var d=this._getSizeInPixels(b);this.adjust(c,d);var e=0;if(b.degrees&&this.rotationMode!==a.OverlayRotationMode.NO_ROTATION)if(this.rotationMode===a.OverlayRotationMode.BOUNDING_BOX&&null!==this.width&&null!==this.height){var f=new a.Rect(c.x,c.y,d.x,d.y);var g=this._getBoundingBox(f,b.degrees);c=g.getTopLeft();d=g.getSize()}else e=b.degrees;return{position:c,size:d,rotate:e}},_getSizeInPixels:function(b){var c=this.size.x;var d=this.size.y;if(null!==this.width||null!==this.height){var e=b.deltaPixelsFromPointsNoRotate(new a.Point(this.width||0,this.height||0),!0);null!==this.width&&(c=e.x);null!==this.height&&(d=e.y)}if(this.checkResize&&(null===this.width||null===this.height)){var f=this.size=a.getElementSize(this.element);null===this.width&&(c=f.x);null===this.height&&(d=f.y)}return new a.Point(c,d)},_getBoundingBox:function(a,b){var c=this._getPlacementPoint(a);return a.rotate(b,c).getBoundingBox()},_getPlacementPoint:function(b){var c=new a.Point(b.x,b.y);var d=a.Placement.properties[this.placement];if(d){d.isHorizontallyCentered?c.x+=b.width/2:d.isRight&&(c.x+=b.width);d.isVerticallyCentered?c.y+=b.height/2:d.isBottom&&(c.y+=b.height)}return c},_getTransformOrigin:function(){var b="";var c=a.Placement.properties[this.placement];if(!c)return b;c.isLeft?b="left":c.isRight&&(b="right");c.isTop?b+=" top":c.isBottom&&(b+=" bottom");return b},update:function(b,c){var d=a.isPlainObject(b)?b:{location:b,placement:c};this._init({location:d.location||this.location,placement:void 0!==d.placement?d.placement:this.placement,onDraw:d.onDraw||this.onDraw,checkResize:d.checkResize||this.checkResize,width:void 0!==d.width?d.width:this.width,height:void 0!==d.height?d.height:this.height,rotationMode:d.rotationMode||this.rotationMode})},getBounds:function(b){a.console.assert(b,"A viewport must now be passed to Overlay.getBounds.");var c=this.width;var d=this.height;if(null===c||null===d){var e=b.deltaPointsFromPixelsNoRotate(this.size,!0);null===c&&(c=e.x);null===d&&(d=e.y)}var f=this.location.clone();this.adjust(f,new a.Point(c,d));return this._adjustBoundsForRotation(b,new a.Rect(f.x,f.y,c,d))},_adjustBoundsForRotation:function(b,c){if(!b||0===b.degrees||this.rotationMode===a.OverlayRotationMode.EXACT)return c;if(this.rotationMode===a.OverlayRotationMode.BOUNDING_BOX){if(null===this.width||null===this.height)return c;var d=this._getOverlayPositionAndSize(b);return b.viewerElementToViewportRectangle(new a.Rect(d.position.x,d.position.y,d.size.x,d.size.y))}return c.rotate(-b.degrees,this._getPlacementPoint(c))}}}(OpenSeadragon);!function(a){a.Drawer=function(b){a.console.assert(b.viewer,"[Drawer] options.viewer is required");var c=arguments;a.isPlainObject(b)||(b={source:c[0],viewport:c[1],element:c[2]});a.console.assert(b.viewport,"[Drawer] options.viewport is required");a.console.assert(b.element,"[Drawer] options.element is required");b.source&&a.console.error("[Drawer] options.source is no longer accepted; use TiledImage instead");this.viewer=b.viewer;this.viewport=b.viewport;this.debugGridColor=b.debugGridColor||a.DEFAULT_SETTINGS.debugGridColor;b.opacity&&a.console.error("[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead");this.useCanvas=a.supportsCanvas&&(this.viewer?this.viewer.useCanvas:!0);this.container=a.getElement(b.element);this.canvas=a.makeNeutralElement(this.useCanvas?"canvas":"div");this.context=this.useCanvas?this.canvas.getContext("2d"):null;this.sketchCanvas=null;this.sketchContext=null;this.element=this.container;this.container.dir="ltr";if(this.useCanvas){var d=this._calculateCanvasSize();this.canvas.width=d.x;this.canvas.height=d.y}this.canvas.style.width="100%";this.canvas.style.height="100%";this.canvas.style.position="absolute";a.setElementOpacity(this.canvas,this.opacity,!0);this.container.style.textAlign="left";this.container.appendChild(this.canvas)};a.Drawer.prototype={addOverlay:function(b,c,d,e){a.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead.");this.viewer.addOverlay(b,c,d,e);return this},updateOverlay:function(b,c,d){a.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.");this.viewer.updateOverlay(b,c,d);return this},removeOverlay:function(b){a.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.");this.viewer.removeOverlay(b);return this},clearOverlays:function(){a.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.");this.viewer.clearOverlays();return this},setOpacity:function(b){a.console.error("drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.");var c=this.viewer.world;for(var d=0;d<c.getItemCount();d++)c.getItemAt(d).setOpacity(b);return this},getOpacity:function(){a.console.error("drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.");var b=this.viewer.world;var c=0;for(var d=0;d<b.getItemCount();d++){var e=b.getItemAt(d).getOpacity();e>c&&(c=e)}return c},needsUpdate:function(){a.console.error("[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead.");return this.viewer.world.needsDraw()},numTilesLoaded:function(){a.console.error("[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead.");return this.viewer.tileCache.numTilesLoaded()},reset:function(){a.console.error("[Drawer.reset] this function is deprecated. Use World.resetItems instead.");this.viewer.world.resetItems();return this},update:function(){a.console.error("[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead.");this.clear();this.viewer.world.draw();return this},canRotate:function(){return this.useCanvas},destroy:function(){this.canvas.width=1;this.canvas.height=1;this.sketchCanvas=null;this.sketchContext=null},clear:function(){this.canvas.innerHTML="";if(this.useCanvas){var a=this._calculateCanvasSize();if(this.canvas.width!=a.x||this.canvas.height!=a.y){this.canvas.width=a.x;this.canvas.height=a.y;if(null!==this.sketchCanvas){var b=this._calculateSketchCanvasSize();this.sketchCanvas.width=b.x;this.sketchCanvas.height=b.y}}this._clear()}},_clear:function(a,b){if(this.useCanvas){var c=this._getContext(a);if(b)c.clearRect(b.x,b.y,b.width,b.height);else{var d=c.canvas;c.clearRect(0,0,d.width,d.height);
+}}},viewportToDrawerRectangle:function(b){var c=this.viewport.pixelFromPointNoRotate(b.getTopLeft(),!0);var d=this.viewport.deltaPixelsFromPointsNoRotate(b.getSize(),!0);return new a.Rect(c.x*a.pixelDensityRatio,c.y*a.pixelDensityRatio,d.x*a.pixelDensityRatio,d.y*a.pixelDensityRatio)},drawTile:function(b,c,d,e,f){a.console.assert(b,"[Drawer.drawTile] tile is required");a.console.assert(c,"[Drawer.drawTile] drawingHandler is required");if(this.useCanvas){var g=this._getContext(d);e=e||1;b.drawCanvas(g,c,e,f)}else b.drawHTML(this.canvas)},_getContext:function(a){var b=this.context;if(a){if(null===this.sketchCanvas){this.sketchCanvas=document.createElement("canvas");var c=this._calculateSketchCanvasSize();this.sketchCanvas.width=c.x;this.sketchCanvas.height=c.y;this.sketchContext=this.sketchCanvas.getContext("2d");if(0===this.viewport.getRotation()){var d=this;this.viewer.addHandler("rotate",function e(){d.viewer.removeHandler("rotate",e);var a=d._calculateSketchCanvasSize();d.sketchCanvas.width=a.x;d.sketchCanvas.height=a.y})}}b=this.sketchContext}return b},saveContext:function(a){this.useCanvas&&this._getContext(a).save()},restoreContext:function(a){this.useCanvas&&this._getContext(a).restore()},setClip:function(a,b){if(this.useCanvas){var c=this._getContext(b);c.beginPath();c.rect(a.x,a.y,a.width,a.height);c.clip()}},drawRectangle:function(a,b,c){if(this.useCanvas){var d=this._getContext(c);d.save();d.fillStyle=b;d.fillRect(a.x,a.y,a.width,a.height);d.restore()}},blendSketch:function(b,c,d,e){var f=b;a.isPlainObject(f)||(f={opacity:b,scale:c,translate:d,compositeOperation:e});if(this.useCanvas&&this.sketchCanvas){b=f.opacity;e=f.compositeOperation;var g=f.bounds;this.context.save();this.context.globalAlpha=b;e&&(this.context.globalCompositeOperation=e);if(g)this.context.drawImage(this.sketchCanvas,g.x,g.y,g.width,g.height,g.x,g.y,g.width,g.height);else{c=f.scale||1;d=f.translate;var h=d instanceof a.Point?d:new a.Point(0,0);var i=0;var j=0;if(d){var k=this.sketchCanvas.width-this.canvas.width;var l=this.sketchCanvas.height-this.canvas.height;i=Math.round(k/2);j=Math.round(l/2)}this.context.drawImage(this.sketchCanvas,h.x-i*c,h.y-j*c,(this.canvas.width+2*i)*c,(this.canvas.height+2*j)*c,-i,-j,this.canvas.width+2*i,this.canvas.height+2*j)}this.context.restore()}},drawDebugInfo:function(b,c,d){if(this.useCanvas){var e=this.context;e.save();e.lineWidth=2*a.pixelDensityRatio;e.font="small-caps bold "+13*a.pixelDensityRatio+"px arial";e.strokeStyle=this.debugGridColor;e.fillStyle=this.debugGridColor;0!==this.viewport.degrees&&this._offsetForRotation(this.viewport.degrees);e.strokeRect(b.position.x*a.pixelDensityRatio,b.position.y*a.pixelDensityRatio,b.size.x*a.pixelDensityRatio,b.size.y*a.pixelDensityRatio);var f=(b.position.x+b.size.x/2)*a.pixelDensityRatio;var g=(b.position.y+b.size.y/2)*a.pixelDensityRatio;e.translate(f,g);e.rotate(Math.PI/180*-this.viewport.degrees);e.translate(-f,-g);if(0===b.x&&0===b.y){e.fillText("Zoom: "+this.viewport.getZoom(),b.position.x*a.pixelDensityRatio,(b.position.y-30)*a.pixelDensityRatio);e.fillText("Pan: "+this.viewport.getBounds().toString(),b.position.x*a.pixelDensityRatio,(b.position.y-20)*a.pixelDensityRatio)}e.fillText("Level: "+b.level,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+20)*a.pixelDensityRatio);e.fillText("Column: "+b.x,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+30)*a.pixelDensityRatio);e.fillText("Row: "+b.y,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+40)*a.pixelDensityRatio);e.fillText("Order: "+d+" of "+c,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+50)*a.pixelDensityRatio);e.fillText("Size: "+b.size.toString(),(b.position.x+10)*a.pixelDensityRatio,(b.position.y+60)*a.pixelDensityRatio);e.fillText("Position: "+b.position.toString(),(b.position.x+10)*a.pixelDensityRatio,(b.position.y+70)*a.pixelDensityRatio);0!==this.viewport.degrees&&this._restoreRotationChanges();e.restore()}},debugRect:function(b){if(this.useCanvas){var c=this.context;c.save();c.lineWidth=2*a.pixelDensityRatio;c.strokeStyle=this.debugGridColor;c.fillStyle=this.debugGridColor;c.strokeRect(b.x*a.pixelDensityRatio,b.y*a.pixelDensityRatio,b.width*a.pixelDensityRatio,b.height*a.pixelDensityRatio);c.restore()}},getCanvasSize:function(b){var c=this._getContext(b).canvas;return new a.Point(c.width,c.height)},_offsetForRotation:function(a,b){var c=this.canvas.width/2;var d=this.canvas.height/2;var e=this._getContext(b);e.save();e.translate(c,d);e.rotate(Math.PI/180*a);e.translate(-c,-d)},_restoreRotationChanges:function(a){var b=this._getContext(a);b.restore()},_calculateCanvasSize:function(){var b=a.pixelDensityRatio;var c=this.viewport.getContainerSize();return{x:c.x*b,y:c.y*b}},_calculateSketchCanvasSize:function(){var a=this._calculateCanvasSize();if(0===this.viewport.getRotation())return a;var b=Math.ceil(Math.sqrt(a.x*a.x+a.y*a.y));return{x:b,y:b}}}}(OpenSeadragon);!function(a){a.Viewport=function(b){var c=arguments;c.length&&c[0]instanceof a.Point&&(b={containerSize:c[0],contentSize:c[1],config:c[2]});if(b.config){a.extend(!0,b,b.config);delete b.config}this._margins=a.extend({left:0,top:0,right:0,bottom:0},b.margins||{});delete b.margins;a.extend(!0,this,{containerSize:null,contentSize:null,zoomPoint:null,viewer:null,springStiffness:a.DEFAULT_SETTINGS.springStiffness,animationTime:a.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:a.DEFAULT_SETTINGS.minZoomImageRatio,maxZoomPixelRatio:a.DEFAULT_SETTINGS.maxZoomPixelRatio,visibilityRatio:a.DEFAULT_SETTINGS.visibilityRatio,wrapHorizontal:a.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:a.DEFAULT_SETTINGS.wrapVertical,defaultZoomLevel:a.DEFAULT_SETTINGS.defaultZoomLevel,minZoomLevel:a.DEFAULT_SETTINGS.minZoomLevel,maxZoomLevel:a.DEFAULT_SETTINGS.maxZoomLevel,degrees:a.DEFAULT_SETTINGS.degrees,homeFillsViewer:a.DEFAULT_SETTINGS.homeFillsViewer},b);this._updateContainerInnerSize();this.centerSpringX=new a.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime});this.centerSpringY=new a.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime});this.zoomSpring=new a.Spring({exponential:!0,initial:1,springStiffness:this.springStiffness,animationTime:this.animationTime});this._oldCenterX=this.centerSpringX.current.value;this._oldCenterY=this.centerSpringY.current.value;this._oldZoom=this.zoomSpring.current.value;this._setContentBounds(new a.Rect(0,0,1,1),1);this.goHome(!0);this.update()};a.Viewport.prototype={resetContentSize:function(b){a.console.assert(b,"[Viewport.resetContentSize] contentSize is required");a.console.assert(b instanceof a.Point,"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point");a.console.assert(b.x>0,"[Viewport.resetContentSize] contentSize.x must be greater than 0");a.console.assert(b.y>0,"[Viewport.resetContentSize] contentSize.y must be greater than 0");this._setContentBounds(new a.Rect(0,0,1,b.y/b.x),b.x);return this},setHomeBounds:function(b,c){a.console.error("[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.");this._setContentBounds(b,c)},_setContentBounds:function(b,c){a.console.assert(b,"[Viewport._setContentBounds] bounds is required");a.console.assert(b instanceof a.Rect,"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect");a.console.assert(b.width>0,"[Viewport._setContentBounds] bounds.width must be greater than 0");a.console.assert(b.height>0,"[Viewport._setContentBounds] bounds.height must be greater than 0");this._contentBoundsNoRotate=b.clone();this._contentSizeNoRotate=this._contentBoundsNoRotate.getSize().times(c);this._contentBounds=b.rotate(this.degrees).getBoundingBox();this._contentSize=this._contentBounds.getSize().times(c);this._contentAspectRatio=this._contentSize.x/this._contentSize.y;this.viewer&&this.viewer.raiseEvent("reset-size",{contentSize:this._contentSizeNoRotate.clone(),contentFactor:c,homeBounds:this._contentBoundsNoRotate.clone(),contentBounds:this._contentBounds.clone()})},getHomeZoom:function(){if(this.defaultZoomLevel)return this.defaultZoomLevel;var a=this._contentAspectRatio/this.getAspectRatio();var b;b=this.homeFillsViewer?a>=1?a:1:a>=1?1:a;return b/this._contentBounds.width},getHomeBounds:function(){return this.getHomeBoundsNoRotate().rotate(-this.getRotation())},getHomeBoundsNoRotate:function(){var b=this._contentBounds.getCenter();var c=1/this.getHomeZoom();var d=c/this.getAspectRatio();return new a.Rect(b.x-c/2,b.y-d/2,c,d)},goHome:function(a){this.viewer&&this.viewer.raiseEvent("home",{immediately:a});return this.fitBounds(this.getHomeBounds(),a)},getMinZoom:function(){var a=this.getHomeZoom(),b=this.minZoomLevel?this.minZoomLevel:this.minZoomImageRatio*a;return b},getMaxZoom:function(){var a=this.maxZoomLevel;if(!a){a=this._contentSize.x*this.maxZoomPixelRatio/this._containerInnerSize.x;a/=this._contentBounds.width}return Math.max(a,this.getHomeZoom())},getAspectRatio:function(){return this._containerInnerSize.x/this._containerInnerSize.y},getContainerSize:function(){return new a.Point(this.containerSize.x,this.containerSize.y)},getMargins:function(){return a.extend({},this._margins)},setMargins:function(b){a.console.assert("object"===a.type(b),"[Viewport.setMargins] margins must be an object");this._margins=a.extend({left:0,top:0,right:0,bottom:0},b);this._updateContainerInnerSize();this.viewer&&this.viewer.forceRedraw()},getBounds:function(a){return this.getBoundsNoRotate(a).rotate(-this.getRotation())},getBoundsNoRotate:function(b){var c=this.getCenter(b);var d=1/this.getZoom(b);var e=d/this.getAspectRatio();return new a.Rect(c.x-d/2,c.y-e/2,d,e)},getBoundsWithMargins:function(a){return this.getBoundsNoRotateWithMargins(a).rotate(-this.getRotation(),this.getCenter(a))},getBoundsNoRotateWithMargins:function(a){var b=this.getBoundsNoRotate(a);var c=this._containerInnerSize.x*this.getZoom(a);b.x-=this._margins.left/c;b.y-=this._margins.top/c;b.width+=(this._margins.left+this._margins.right)/c;b.height+=(this._margins.top+this._margins.bottom)/c;return b},getCenter:function(b){var c,d,e,f,g,h,i,j,k=new a.Point(this.centerSpringX.current.value,this.centerSpringY.current.value),l=new a.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);if(b)return k;if(!this.zoomPoint)return l;c=this.pixelFromPoint(this.zoomPoint,!0);d=this.getZoom();e=1/d;f=e/this.getAspectRatio();g=new a.Rect(k.x-e/2,k.y-f/2,e,f);h=this._pixelFromPoint(this.zoomPoint,g);i=h.minus(c);j=i.divide(this._containerInnerSize.x*d);return l.plus(j)},getZoom:function(a){return a?this.zoomSpring.current.value:this.zoomSpring.target.value},_applyZoomConstraints:function(a){return Math.max(Math.min(a,this.getMaxZoom()),this.getMinZoom())},_applyBoundaryConstraints:function(b,c){var d=new a.Rect(b.x,b.y,b.width,b.height);if(this.wrapHorizontal);else{var e=this.visibilityRatio*d.width;var f=d.x+d.width;var g=this._contentBoundsNoRotate.x+this._contentBoundsNoRotate.width;var h=this._contentBoundsNoRotate.x-f+e;var i=g-d.x-e;e>this._contentBoundsNoRotate.width?d.x+=(h+i)/2:0>i?d.x+=i:h>0&&(d.x+=h)}if(this.wrapVertical);else{var j=this.visibilityRatio*d.height;var k=d.y+d.height;var l=this._contentBoundsNoRotate.y+this._contentBoundsNoRotate.height;var m=this._contentBoundsNoRotate.y-k+j;var n=l-d.y-j;j>this._contentBoundsNoRotate.height?d.y+=(m+n)/2:0>n?d.y+=n:m>0&&(d.y+=m)}this.viewer&&this.viewer.raiseEvent("constrain",{immediately:c});return d},applyConstraints:function(a){var b=this.getZoom();var c=this._applyZoomConstraints(b);b!==c&&this.zoomTo(c,this.zoomPoint,a);var d=this.getBoundsNoRotate();var e=this._applyBoundaryConstraints(d,a);(d.x!==e.x||d.y!==e.y||a)&&this.fitBounds(e.rotate(-this.getRotation()),a);return this},ensureVisible:function(a){return this.applyConstraints(a)},_fitBounds:function(b,c){c=c||{};var d=c.immediately||!1;var e=c.constraints||!1;var f=this.getAspectRatio();var g=b.getCenter();var h=new a.Rect(b.x,b.y,b.width,b.height,b.degrees+this.getRotation()).getBoundingBox();h.getAspectRatio()>=f?h.height=h.width/f:h.width=h.height*f;h.x=g.x-h.width/2;h.y=g.y-h.height/2;var i=1/h.width;if(e){var j=h.getAspectRatio();var k=this._applyZoomConstraints(i);if(i!==k){i=k;h.width=1/i;h.x=g.x-h.width/2;h.height=h.width/j;h.y=g.y-h.height/2}h=this._applyBoundaryConstraints(h,d);g=h.getCenter()}if(d){this.panTo(g,!0);return this.zoomTo(i,null,!0)}this.panTo(this.getCenter(!0),!0);this.zoomTo(this.getZoom(!0),null,!0);var l=this.getBounds();var m=this.getZoom();if(0===m||Math.abs(i/m-1)<1e-8){this.zoomTo(i,!0);return this.panTo(g,d)}h=h.rotate(-this.getRotation());var n=h.getTopLeft().times(i).minus(l.getTopLeft().times(m)).divide(i-m);return this.zoomTo(i,n,d)},fitBounds:function(a,b){return this._fitBounds(a,{immediately:b,constraints:!1})},fitBoundsWithConstraints:function(a,b){return this._fitBounds(a,{immediately:b,constraints:!0})},fitVertically:function(b){var c=new a.Rect(this._contentBounds.x+this._contentBounds.width/2,this._contentBounds.y,0,this._contentBounds.height);return this.fitBounds(c,b)},fitHorizontally:function(b){var c=new a.Rect(this._contentBounds.x,this._contentBounds.y+this._contentBounds.height/2,this._contentBounds.width,0);return this.fitBounds(c,b)},panBy:function(b,c){var d=new a.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);return this.panTo(d.plus(b),c)},panTo:function(a,b){if(b){this.centerSpringX.resetTo(a.x);this.centerSpringY.resetTo(a.y)}else{this.centerSpringX.springTo(a.x);this.centerSpringY.springTo(a.y)}this.viewer&&this.viewer.raiseEvent("pan",{center:a,immediately:b});return this},zoomBy:function(a,b,c){return this.zoomTo(this.zoomSpring.target.value*a,b,c)},zoomTo:function(b,c,d){this.zoomPoint=c instanceof a.Point&&!isNaN(c.x)&&!isNaN(c.y)?c:null;d?this.zoomSpring.resetTo(b):this.zoomSpring.springTo(b);this.viewer&&this.viewer.raiseEvent("zoom",{zoom:b,refPoint:c,immediately:d});return this},setRotation:function(a){if(!this.viewer||!this.viewer.drawer.canRotate())return this;a%=360;0>a&&(a+=360);this.degrees=a;this._setContentBounds(this.viewer.world.getHomeBounds(),this.viewer.world.getContentFactor());this.viewer.forceRedraw();this.viewer.raiseEvent("rotate",{degrees:a});return this},getRotation:function(){return this.degrees},resize:function(a,b){var c,d=this.getBoundsNoRotate(),e=d;this.containerSize.x=a.x;this.containerSize.y=a.y;this._updateContainerInnerSize();if(b){c=a.x/this.containerSize.x;e.width=d.width*c;e.height=e.width/this.getAspectRatio()}this.viewer&&this.viewer.raiseEvent("resize",{newContainerSize:a,maintain:b});return this.fitBounds(e,!0)},_updateContainerInnerSize:function(){this._containerInnerSize=new a.Point(Math.max(1,this.containerSize.x-(this._margins.left+this._margins.right)),Math.max(1,this.containerSize.y-(this._margins.top+this._margins.bottom)))},update:function(){if(this.zoomPoint){var a=this.pixelFromPoint(this.zoomPoint,!0);this.zoomSpring.update();var b=this.pixelFromPoint(this.zoomPoint,!0);var c=b.minus(a);var d=this.deltaPointsFromPixels(c,!0);this.centerSpringX.shiftBy(d.x);this.centerSpringY.shiftBy(d.y);this.zoomSpring.isAtTargetValue()&&(this.zoomPoint=null)}else this.zoomSpring.update();this.centerSpringX.update();this.centerSpringY.update();var e=this.centerSpringX.current.value!==this._oldCenterX||this.centerSpringY.current.value!==this._oldCenterY||this.zoomSpring.current.value!==this._oldZoom;this._oldCenterX=this.centerSpringX.current.value;this._oldCenterY=this.centerSpringY.current.value;this._oldZoom=this.zoomSpring.current.value;return e},deltaPixelsFromPointsNoRotate:function(a,b){return a.times(this._containerInnerSize.x*this.getZoom(b))},deltaPixelsFromPoints:function(a,b){return this.deltaPixelsFromPointsNoRotate(a.rotate(this.getRotation()),b)},deltaPointsFromPixelsNoRotate:function(a,b){return a.divide(this._containerInnerSize.x*this.getZoom(b))},deltaPointsFromPixels:function(a,b){return this.deltaPointsFromPixelsNoRotate(a,b).rotate(-this.getRotation())},pixelFromPointNoRotate:function(a,b){return this._pixelFromPointNoRotate(a,this.getBoundsNoRotate(b))},pixelFromPoint:function(a,b){return this._pixelFromPoint(a,this.getBoundsNoRotate(b))},_pixelFromPointNoRotate:function(b,c){return b.minus(c.getTopLeft()).times(this._containerInnerSize.x/c.width).plus(new a.Point(this._margins.left,this._margins.top))},_pixelFromPoint:function(a,b){return this._pixelFromPointNoRotate(a.rotate(this.getRotation(),this.getCenter(!0)),b)},pointFromPixelNoRotate:function(b,c){var d=this.getBoundsNoRotate(c);return b.minus(new a.Point(this._margins.left,this._margins.top)).divide(this._containerInnerSize.x/d.width).plus(d.getTopLeft())},pointFromPixel:function(a,b){return this.pointFromPixelNoRotate(a,b).rotate(-this.getRotation(),this.getCenter(!0))},_viewportToImageDelta:function(b,c){var d=this._contentBoundsNoRotate.width;return new a.Point(b*this._contentSizeNoRotate.x/d,c*this._contentSizeNoRotate.x/d)},viewportToImageCoordinates:function(b,c){if(b instanceof a.Point)return this.viewportToImageCoordinates(b.x,b.y);if(this.viewer){var d=this.viewer.world.getItemCount();if(d>1)a.console.error("[Viewport.viewportToImageCoordinates] is not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.");else if(1===d){var e=this.viewer.world.getItemAt(0);return e.viewportToImageCoordinates(b,c,!0)}}return this._viewportToImageDelta(b-this._contentBoundsNoRotate.x,c-this._contentBoundsNoRotate.y)},_imageToViewportDelta:function(b,c){var d=this._contentBoundsNoRotate.width;return new a.Point(b/this._contentSizeNoRotate.x*d,c/this._contentSizeNoRotate.x*d)},imageToViewportCoordinates:function(b,c){if(b instanceof a.Point)return this.imageToViewportCoordinates(b.x,b.y);if(this.viewer){var d=this.viewer.world.getItemCount();if(d>1)a.console.error("[Viewport.imageToViewportCoordinates] is not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.");else if(1===d){var e=this.viewer.world.getItemAt(0);return e.imageToViewportCoordinates(b,c,!0)}}var f=this._imageToViewportDelta(b,c);f.x+=this._contentBoundsNoRotate.x;f.y+=this._contentBoundsNoRotate.y;return f},imageToViewportRectangle:function(b,c,d,e){var f=b;f instanceof a.Rect||(f=new a.Rect(b,c,d,e));if(this.viewer){var g=this.viewer.world.getItemCount();if(g>1)a.console.error("[Viewport.imageToViewportRectangle] is not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.");else if(1===g){var h=this.viewer.world.getItemAt(0);return h.imageToViewportRectangle(b,c,d,e,!0)}}var i=this.imageToViewportCoordinates(f.x,f.y);var j=this._imageToViewportDelta(f.width,f.height);return new a.Rect(i.x,i.y,j.x,j.y,f.degrees)},viewportToImageRectangle:function(b,c,d,e){var f=b;f instanceof a.Rect||(f=new a.Rect(b,c,d,e));if(this.viewer){var g=this.viewer.world.getItemCount();if(g>1)a.console.error("[Viewport.viewportToImageRectangle] is not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.");else if(1===g){var h=this.viewer.world.getItemAt(0);return h.viewportToImageRectangle(b,c,d,e,!0)}}var i=this.viewportToImageCoordinates(f.x,f.y);var j=this._viewportToImageDelta(f.width,f.height);return new a.Rect(i.x,i.y,j.x,j.y,f.degrees)},viewerElementToImageCoordinates:function(a){var b=this.pointFromPixel(a,!0);return this.viewportToImageCoordinates(b)},imageToViewerElementCoordinates:function(a){var b=this.imageToViewportCoordinates(a);return this.pixelFromPoint(b,!0)},windowToImageCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.windowToImageCoordinates] the viewport must have a viewer.");var c=b.minus(a.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(c)},imageToWindowCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.");var c=this.imageToViewerElementCoordinates(b);return c.plus(a.getElementPosition(this.viewer.element))},viewerElementToViewportCoordinates:function(a){return this.pointFromPixel(a,!0)},viewportToViewerElementCoordinates:function(a){return this.pixelFromPoint(a,!0)},viewerElementToViewportRectangle:function(b){return a.Rect.fromSummits(this.pointFromPixel(b.getTopLeft(),!0),this.pointFromPixel(b.getTopRight(),!0),this.pointFromPixel(b.getBottomLeft(),!0))},viewportToViewerElementRectangle:function(b){return a.Rect.fromSummits(this.pixelFromPoint(b.getTopLeft(),!0),this.pixelFromPoint(b.getTopRight(),!0),this.pixelFromPoint(b.getBottomLeft(),!0))},windowToViewportCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.");var c=b.minus(a.getElementPosition(this.viewer.element));return this.viewerElementToViewportCoordinates(c)},viewportToWindowCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.");var c=this.viewportToViewerElementCoordinates(b);return c.plus(a.getElementPosition(this.viewer.element))},viewportToImageZoom:function(b){if(this.viewer){var c=this.viewer.world.getItemCount();if(c>1)a.console.error("[Viewport.viewportToImageZoom] is not accurate with multi-image.");else if(1===c){var d=this.viewer.world.getItemAt(0);return d.viewportToImageZoom(b)}}var e=this._contentSizeNoRotate.x;var f=this._containerInnerSize.x;var g=this._contentBoundsNoRotate.width;var h=f/e*g;return b*h},imageToViewportZoom:function(b){if(this.viewer){var c=this.viewer.world.getItemCount();if(c>1)a.console.error("[Viewport.imageToViewportZoom] is not accurate with multi-image.");else if(1===c){var d=this.viewer.world.getItemAt(0);return d.imageToViewportZoom(b)}}var e=this._contentSizeNoRotate.x;var f=this._containerInnerSize.x;var g=this._contentBoundsNoRotate.width;var h=e/f/g;return b*h}}}(OpenSeadragon);!function(a){function b(b){b._needsDraw=!1;var d,e,g,h,i,j,l,m,n=null,o=!1,q=a.now(),r=b.viewport.getBoundsWithMargins(!0),s=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(0),!0).x*b._scaleSpring.current.value,t=Math.max(b.source.minLevel,Math.floor(Math.log(b.minZoomImageRatio)/Math.log(2))),u=Math.min(Math.abs(b.source.maxLevel),Math.abs(Math.floor(Math.log(s/b.minPixelRatio)/Math.log(2))));for(;b.lastDrawn.length>0;){d=b.lastDrawn.pop();d.beingDrawn=!1}if(!b.wrapHorizontal&&!b.wrapVertical){var v=b.getClippedBounds(!0);var w=r.intersection(v);if(null===w)return;r=w}r=r.getBoundingBox();r.x-=b._xSpring.current.value;r.y-=b._ySpring.current.value;var x=r.getTopLeft();var y=r.getBottomRight();if((b.wrapHorizontal||!(y.x<0||x.x>b._worldWidthCurrent))&&(b.wrapVertical||!(y.y<0||x.y>b._worldHeightCurrent))){if(!b.wrapHorizontal){x.x=Math.max(x.x,0);y.x=Math.min(y.x,b._worldWidthCurrent)}if(!b.wrapVertical){x.y=Math.max(x.y,0);y.y=Math.min(y.y,b._worldHeightCurrent)}t=Math.min(t,u);var z;for(e=u;e>=t;e--){z=!1;g=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(e),!0).x*b._scaleSpring.current.value;if(!o&&g>=b.minPixelRatio||e==t){z=!0;o=!0}else if(!o)continue;h=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(e),!1).x*b._scaleSpring.current.value;i=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(Math.max(b.source.getClosestLevel(b.viewport.containerSize)-1,0)),!1).x*b._scaleSpring.current.value;j=b.immediateRender?1:i;l=Math.min(1,(g-.5)/.5);m=j/Math.abs(j-h);n=c(b,o,z,e,l,m,x,y,q,n);if(k(b.coverage,e))break}p(b,b.lastDrawn);n&&!n.context2D&&f(b,n,q)}}function c(a,b,c,e,f,g,h,i,j,k){var l,m,o,p,q,r=a.viewport.pixelFromPoint(a.viewport.getCenter());a.viewer&&a.viewer.raiseEvent("update-level",{tiledImage:a,havedrawn:b,level:e,opacity:f,visibility:g,topleft:h,bottomright:i,currenttime:j,best:k});o=a.source.getTileAtPoint(e,h.divide(a._scaleSpring.current.value));p=a.source.getTileAtPoint(e,i.divide(a._scaleSpring.current.value));q=a.source.getNumTiles(e);n(a.coverage,e);a.wrapHorizontal||(p.x=Math.min(p.x,q.x-1));a.wrapVertical||(p.y=Math.min(p.y,q.y-1));for(l=o.x;l<=p.x;l++)for(m=o.y;m<=p.y;m++)k=d(a,c,b,l,m,e,f,g,r,q,j,k);return k}function d(a,b,c,d,f,g,k,n,p,q,r,s){var t=e(d,f,g,a.source,a.tilesMatrix,r,q,a._worldWidthCurrent,a._worldHeightCurrent),u=b;a.viewer&&a.viewer.raiseEvent("update-tile",{tiledImage:a,tile:t});m(a.coverage,g,d,f,!1);if(!t.exists)return s;c&&!u&&(l(a.coverage,g,d,f)?m(a.coverage,g,d,f,!0):u=!0);if(!u)return s;i(t,a.source.tileOverlap,a.viewport,p,n,a);if(!t.loaded)if(t.context2D)h(a,t);else{var v=a._tileCache.getImageRecord(t.url);if(v){var w=v.getImage();h(a,t,w)}}if(t.loaded){var x=j(a,t,d,f,g,k,r);x&&(a._needsDraw=!0)}else t.loading||(s=o(s,t));return s}function e(b,c,d,e,f,g,h,i,j){var k,l,m,n,o,p,q;f[d]||(f[d]={});f[d][b]||(f[d][b]={});if(!f[d][b][c]){k=(h.x+b%h.x)%h.x;l=(h.y+c%h.y)%h.y;m=e.getTileBounds(d,k,l);n=e.tileExists(d,k,l);o=e.getTileUrl(d,k,l);p=e.getContext2D?e.getContext2D(d,k,l):void 0;m.x+=(b-k)/h.x;m.y+=j/i*((c-l)/h.y);f[d][b][c]=new a.Tile(d,b,c,m,n,o,p)}q=f[d][b][c];q.lastTouchTime=g;return q}function f(a,b,c){b.loading=!0;a._imageLoader.addJob({src:b.url,crossOriginPolicy:a.crossOriginPolicy,callback:function(d,e){g(a,b,c,d,e)},abort:function(){b.loading=!1}})}function g(b,c,d,e,f){if(e)if(d<b.lastResetTime){a.console.log("Ignoring tile %s loaded before reset: %s",c,c.url);c.loading=!1}else{var g=function(){var a=Math.ceil(Math.log(b.source.getTileWidth(c.level))/Math.log(2));h(b,c,e,a)};b._midDraw?window.setTimeout(g,1):g()}else{a.console.log("Tile %s failed to load: %s - error: %s",c,c.url,f);b.viewer.raiseEvent("tile-load-failed",{tile:c,tiledImage:b,time:d,message:f});c.loading=!1;c.exists=!1}}function h(a,b,c,d){function e(){g++;return f}function f(){g--;if(0===g){b.loading=!1;b.loaded=!0;b.context2D||a._tileCache.cacheTile({image:c,tile:b,cutoff:d,tiledImage:a});a._needsDraw=!0}}var g=0;a.viewer.raiseEvent("tile-loaded",{tile:b,tiledImage:a,image:c,getCompletionCallback:e});e()()}function i(b,c,d,e,f,g){var h=b.bounds.getTopLeft();h.x*=g._scaleSpring.current.value;h.y*=g._scaleSpring.current.value;h.x+=g._xSpring.current.value;h.y+=g._ySpring.current.value;var i=b.bounds.getSize();i.x*=g._scaleSpring.current.value;i.y*=g._scaleSpring.current.value;var j=d.pixelFromPointNoRotate(h,!0),k=d.pixelFromPointNoRotate(h,!1),l=d.deltaPixelsFromPointsNoRotate(i,!0),m=d.deltaPixelsFromPointsNoRotate(i,!1),n=k.plus(m.divide(2)),o=e.distanceTo(n);c||(l=l.plus(new a.Point(1,1)));b.position=j;b.size=l;b.distance=o;b.visibility=f}function j(a,b,c,d,e,f,g){var h,i,j=1e3*a.blendTime;b.blendStart||(b.blendStart=g);h=g-b.blendStart;i=j?Math.min(1,h/j):1;a.alwaysBlend&&(i*=f);b.opacity=i;a.lastDrawn.push(b);if(1==i){m(a.coverage,e,c,d,!0);a._hasOpaqueTile=!0}else if(j>h)return!0;return!1}function k(a,b,c,d){var e,f,g,h;if(!a[b])return!1;if(void 0===c||void 0===d){e=a[b];for(g in e)if(e.hasOwnProperty(g)){f=e[g];for(h in f)if(f.hasOwnProperty(h)&&!f[h])return!1}return!0}return void 0===a[b][c]||void 0===a[b][c][d]||a[b][c][d]===!0}function l(a,b,c,d){return void 0===c||void 0===d?k(a,b+1):k(a,b+1,2*c,2*d)&&k(a,b+1,2*c,2*d+1)&&k(a,b+1,2*c+1,2*d)&&k(a,b+1,2*c+1,2*d+1)}function m(b,c,d,e,f){if(b[c]){b[c][d]||(b[c][d]={});b[c][d][e]=f}else a.console.warn("Setting coverage for a tile before its level's coverage has been reset: %s",c)}function n(a,b){a[b]={}}function o(a,b){return a?b.visibility>a.visibility?b:b.visibility==a.visibility&&b.distance<a.distance?b:a:b}function p(b,c){if(0!==c.length){var d=c[0];var e=b.opacity<1||b.compositeOperation&&"source-over"!==b.compositeOperation||!b._isBottomItem()&&d._hasTransparencyChannel();var f;var g;var h=b.viewport.getZoom(!0);var i=b.viewportToImageZoom(h);if(i>b.smoothTileEdgesMinZoom&&!b.iOSDevice){e=!0;f=d.getScaleForEdgeSmoothing();g=d.getTranslationForEdgeSmoothing(f,b._drawer.getCanvasSize(!1),b._drawer.getCanvasSize(!0))}var j;if(e){f||(j=b.viewport.viewportToViewerElementRectangle(b.getClippedBounds(!0)).getIntegerBoundingBox().times(a.pixelDensityRatio));b._drawer._clear(!0,j)}0===b.viewport.degrees||f||b._drawer._offsetForRotation(b.viewport.degrees,e);var k=!1;if(b._clip){b._drawer.saveContext(e);var l=b.imageToViewportRectangle(b._clip,!0);var m=b._drawer.viewportToDrawerRectangle(l);f&&(m=m.times(f));g&&(m=m.translate(g));b._drawer.setClip(m,e);k=!0}if(b.placeholderFillStyle&&b._hasOpaqueTile===!1){var n=b._drawer.viewportToDrawerRectangle(b.getBounds(!0));f&&(n=n.times(f));g&&(n=n.translate(g));var o=null;o="function"==typeof b.placeholderFillStyle?b.placeholderFillStyle(b,b._drawer.context):b.placeholderFillStyle;b._drawer.drawRectangle(n,o,e)}for(var p=c.length-1;p>=0;p--){d=c[p];b._drawer.drawTile(d,b._drawingHandler,e,f,g);d.beingDrawn=!0;b.viewer&&b.viewer.raiseEvent("tile-drawn",{tiledImage:b,tile:d})}k&&b._drawer.restoreContext(e);0===b.viewport.degrees||f||b._drawer._restoreRotationChanges(e);if(e){var r=0!==b.viewport.degrees&&f;r&&b._drawer._offsetForRotation(b.viewport.degrees,!1);b._drawer.blendSketch({opacity:b.opacity,scale:f,translate:g,compositeOperation:b.compositeOperation,bounds:j});r&&b._drawer._restoreRotationChanges(!1)}q(b,c)}}function q(b,c){if(b.debugMode)for(var d=c.length-1;d>=0;d--){var e=c[d];try{b._drawer.drawDebugInfo(e,c.length,d)}catch(f){a.console.error(f)}}}a.TiledImage=function(b){var c=this;a.console.assert(b.tileCache,"[TiledImage] options.tileCache is required");a.console.assert(b.drawer,"[TiledImage] options.drawer is required");a.console.assert(b.viewer,"[TiledImage] options.viewer is required");a.console.assert(b.imageLoader,"[TiledImage] options.imageLoader is required");a.console.assert(b.source,"[TiledImage] options.source is required");a.console.assert(!b.clip||b.clip instanceof a.Rect,"[TiledImage] options.clip must be an OpenSeadragon.Rect if present");a.EventSource.call(this);this._tileCache=b.tileCache;delete b.tileCache;this._drawer=b.drawer;delete b.drawer;this._imageLoader=b.imageLoader;delete b.imageLoader;b.clip instanceof a.Rect&&(this._clip=b.clip.clone());delete b.clip;var d=b.x||0;delete b.x;var e=b.y||0;delete b.y;this.normHeight=b.source.dimensions.y/b.source.dimensions.x;this.contentAspectX=b.source.dimensions.x/b.source.dimensions.y;var f=1;if(b.width){f=b.width;delete b.width;if(b.height){a.console.error("specifying both width and height to a tiledImage is not supported");delete b.height}}else if(b.height){f=b.height/this.normHeight;delete b.height}var g=b.fitBounds;delete b.fitBounds;var h=b.fitBoundsPlacement||OpenSeadragon.Placement.CENTER;delete b.fitBoundsPlacement;a.extend(!0,this,{viewer:null,tilesMatrix:{},coverage:{},lastDrawn:[],lastResetTime:0,_midDraw:!1,_needsDraw:!0,_hasOpaqueTile:!1,springStiffness:a.DEFAULT_SETTINGS.springStiffness,animationTime:a.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:a.DEFAULT_SETTINGS.minZoomImageRatio,wrapHorizontal:a.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:a.DEFAULT_SETTINGS.wrapVertical,immediateRender:a.DEFAULT_SETTINGS.immediateRender,blendTime:a.DEFAULT_SETTINGS.blendTime,alwaysBlend:a.DEFAULT_SETTINGS.alwaysBlend,minPixelRatio:a.DEFAULT_SETTINGS.minPixelRatio,smoothTileEdgesMinZoom:a.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,iOSDevice:a.DEFAULT_SETTINGS.iOSDevice,debugMode:a.DEFAULT_SETTINGS.debugMode,crossOriginPolicy:a.DEFAULT_SETTINGS.crossOriginPolicy,placeholderFillStyle:a.DEFAULT_SETTINGS.placeholderFillStyle,opacity:a.DEFAULT_SETTINGS.opacity,compositeOperation:a.DEFAULT_SETTINGS.compositeOperation},b);this._xSpring=new a.Spring({initial:d,springStiffness:this.springStiffness,animationTime:this.animationTime});this._ySpring=new a.Spring({initial:e,springStiffness:this.springStiffness,animationTime:this.animationTime});this._scaleSpring=new a.Spring({initial:f,springStiffness:this.springStiffness,animationTime:this.animationTime});this._updateForScale();g&&this.fitBounds(g,h,!0);this._drawingHandler=function(b){c.viewer.raiseEvent("tile-drawing",a.extend({tiledImage:c},b))}};a.extend(a.TiledImage.prototype,a.EventSource.prototype,{needsDraw:function(){return this._needsDraw},reset:function(){this._tileCache.clearTilesFor(this);this.lastResetTime=a.now();
+this._needsDraw=!0},update:function(){var a=this._xSpring.current.value;var b=this._ySpring.current.value;var c=this._scaleSpring.current.value;this._xSpring.update();this._ySpring.update();this._scaleSpring.update();if(this._xSpring.current.value!==a||this._ySpring.current.value!==b||this._scaleSpring.current.value!==c){this._updateForScale();this._needsDraw=!0;return!0}return!1},draw:function(){if(0!==this.opacity){this._midDraw=!0;b(this);this._midDraw=!1}},destroy:function(){this.reset()},getBounds:function(b){return b?new a.Rect(this._xSpring.current.value,this._ySpring.current.value,this._worldWidthCurrent,this._worldHeightCurrent):new a.Rect(this._xSpring.target.value,this._ySpring.target.value,this._worldWidthTarget,this._worldHeightTarget)},getWorldBounds:function(){a.console.error("[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead");return this.getBounds()},getClippedBounds:function(b){var c=this.getBounds(b);if(this._clip){var d=this._worldWidthCurrent/this.source.dimensions.x;var e=this._clip.times(d);c=new a.Rect(c.x+e.x,c.y+e.y,e.width,e.height)}return c},getContentSize:function(){return new a.Point(this.source.dimensions.x,this.source.dimensions.y)},_viewportToImageDelta:function(b,c,d){var e=d?this._scaleSpring.current.value:this._scaleSpring.target.value;return new a.Point(b*(this.source.dimensions.x/e),c*(this.source.dimensions.y*this.contentAspectX/e))},viewportToImageCoordinates:function(b,c,d){if(b instanceof a.Point){d=c;c=b.y;b=b.x}return d?this._viewportToImageDelta(b-this._xSpring.current.value,c-this._ySpring.current.value):this._viewportToImageDelta(b-this._xSpring.target.value,c-this._ySpring.target.value)},_imageToViewportDelta:function(b,c,d){var e=d?this._scaleSpring.current.value:this._scaleSpring.target.value;return new a.Point(b/this.source.dimensions.x*e,c/this.source.dimensions.y/this.contentAspectX*e)},imageToViewportCoordinates:function(b,c,d){if(b instanceof a.Point){d=c;c=b.y;b=b.x}var e=this._imageToViewportDelta(b,c);if(d){e.x+=this._xSpring.current.value;e.y+=this._ySpring.current.value}else{e.x+=this._xSpring.target.value;e.y+=this._ySpring.target.value}return e},imageToViewportRectangle:function(b,c,d,e,f){var g=b;g instanceof a.Rect?f=c:g=new a.Rect(b,c,d,e);var h=this.imageToViewportCoordinates(g.getTopLeft(),f);var i=this._imageToViewportDelta(g.width,g.height,f);return new a.Rect(h.x,h.y,i.x,i.y,g.degrees)},viewportToImageRectangle:function(b,c,d,e,f){var g=b;b instanceof a.Rect?f=c:g=new a.Rect(b,c,d,e);var h=this.viewportToImageCoordinates(g.getTopLeft(),f);var i=this._viewportToImageDelta(g.width,g.height,f);return new a.Rect(h.x,h.y,i.x,i.y,g.degrees)},viewerElementToImageCoordinates:function(a){var b=this.viewport.pointFromPixel(a,!0);return this.viewportToImageCoordinates(b)},imageToViewerElementCoordinates:function(a){var b=this.imageToViewportCoordinates(a);return this.viewport.pixelFromPoint(b,!0)},windowToImageCoordinates:function(a){var b=a.minus(OpenSeadragon.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(b)},imageToWindowCoordinates:function(a){var b=this.imageToViewerElementCoordinates(a);return b.plus(OpenSeadragon.getElementPosition(this.viewer.element))},viewportToImageZoom:function(a){var b=this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x;return b*a},imageToViewportZoom:function(a){var b=this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x;return a/b},setPosition:function(a,b){var c=this._xSpring.target.value===a.x&&this._ySpring.target.value===a.y;if(b){if(c&&this._xSpring.current.value===a.x&&this._ySpring.current.value===a.y)return;this._xSpring.resetTo(a.x);this._ySpring.resetTo(a.y);this._needsDraw=!0}else{if(c)return;this._xSpring.springTo(a.x);this._ySpring.springTo(a.y);this._needsDraw=!0}c||this._raiseBoundsChange()},setWidth:function(a,b){this._setScale(a,b)},setHeight:function(a,b){this._setScale(a/this.normHeight,b)},fitBounds:function(b,c,d){c=c||a.Placement.CENTER;var e=a.Placement.properties[c];var f=this.contentAspectX;var g=0;var h=0;var i=1;var j=1;if(this._clip){f=this._clip.getAspectRatio();i=this._clip.width/this.source.dimensions.x;j=this._clip.height/this.source.dimensions.y;if(b.getAspectRatio()>f){g=this._clip.x/this._clip.height*b.height;h=this._clip.y/this._clip.height*b.height}else{g=this._clip.x/this._clip.width*b.width;h=this._clip.y/this._clip.width*b.width}}if(b.getAspectRatio()>f){var k=b.height/j;var l=0;e.isHorizontallyCentered?l=(b.width-b.height*f)/2:e.isRight&&(l=b.width-b.height*f);this.setPosition(new a.Point(b.x-g+l,b.y-h),d);this.setHeight(k,d)}else{var m=b.width/i;var n=0;e.isVerticallyCentered?n=(b.height-b.width/f)/2:e.isBottom&&(n=b.height-b.width/f);this.setPosition(new a.Point(b.x-g,b.y-h+n),d);this.setWidth(m,d)}},getClip:function(){return this._clip?this._clip.clone():null},setClip:function(b){a.console.assert(!b||b instanceof a.Rect,"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null");b instanceof a.Rect?this._clip=b.clone():this._clip=null;this._needsDraw=!0},getOpacity:function(){return this.opacity},setOpacity:function(a){this.opacity=a;this._needsDraw=!0},getCompositeOperation:function(){return this.compositeOperation},setCompositeOperation:function(a){this.compositeOperation=a;this._needsDraw=!0},_setScale:function(a,b){var c=this._scaleSpring.target.value===a;if(b){if(c&&this._scaleSpring.current.value===a)return;this._scaleSpring.resetTo(a);this._updateForScale();this._needsDraw=!0}else{if(c)return;this._scaleSpring.springTo(a);this._updateForScale();this._needsDraw=!0}c||this._raiseBoundsChange()},_updateForScale:function(){this._worldWidthTarget=this._scaleSpring.target.value;this._worldHeightTarget=this.normHeight*this._scaleSpring.target.value;this._worldWidthCurrent=this._scaleSpring.current.value;this._worldHeightCurrent=this.normHeight*this._scaleSpring.current.value},_raiseBoundsChange:function(){this.raiseEvent("bounds-change")},_isBottomItem:function(){return this.viewer.world.getItemAt(0)===this}})}(OpenSeadragon);!function(a){var b=function(b){a.console.assert(b,"[TileCache.cacheTile] options is required");a.console.assert(b.tile,"[TileCache.cacheTile] options.tile is required");a.console.assert(b.tiledImage,"[TileCache.cacheTile] options.tiledImage is required");this.tile=b.tile;this.tiledImage=b.tiledImage};var c=function(b){a.console.assert(b,"[ImageRecord] options is required");a.console.assert(b.image,"[ImageRecord] options.image is required");this._image=b.image;this._tiles=[]};c.prototype={destroy:function(){this._image=null;this._renderedContext=null;this._tiles=null},getImage:function(){return this._image},getRenderedContext:function(){if(!this._renderedContext){var a=document.createElement("canvas");a.width=this._image.width;a.height=this._image.height;this._renderedContext=a.getContext("2d");this._renderedContext.drawImage(this._image,0,0);this._image=null}return this._renderedContext},setRenderedContext:function(b){a.console.error("ImageRecord.setRenderedContext is deprecated. The rendered context should be created by the ImageRecord itself when calling ImageRecord.getRenderedContext.");this._renderedContext=b},addTile:function(b){a.console.assert(b,"[ImageRecord.addTile] tile is required");this._tiles.push(b)},removeTile:function(b){for(var c=0;c<this._tiles.length;c++)if(this._tiles[c]===b){this._tiles.splice(c,1);return}a.console.warn("[ImageRecord.removeTile] trying to remove unknown tile",b)},getTileCount:function(){return this._tiles.length}};a.TileCache=function(b){b=b||{};this._maxImageCacheCount=b.maxImageCacheCount||a.DEFAULT_SETTINGS.maxImageCacheCount;this._tilesLoaded=[];this._imagesLoaded=[];this._imagesLoadedCount=0};a.TileCache.prototype={numTilesLoaded:function(){return this._tilesLoaded.length},cacheTile:function(d){a.console.assert(d,"[TileCache.cacheTile] options is required");a.console.assert(d.tile,"[TileCache.cacheTile] options.tile is required");a.console.assert(d.tile.url,"[TileCache.cacheTile] options.tile.url is required");a.console.assert(d.tiledImage,"[TileCache.cacheTile] options.tiledImage is required");var e=d.cutoff||0;var f=this._tilesLoaded.length;var g=this._imagesLoaded[d.tile.url];if(!g){a.console.assert(d.image,"[TileCache.cacheTile] options.image is required to create an ImageRecord");g=this._imagesLoaded[d.tile.url]=new c({image:d.image});this._imagesLoadedCount++}g.addTile(d.tile);d.tile.cacheImageRecord=g;if(this._imagesLoadedCount>this._maxImageCacheCount){var h=null;var i=-1;var j=null;var k,l,m,n,o,p;for(var q=this._tilesLoaded.length-1;q>=0;q--){p=this._tilesLoaded[q];k=p.tile;if(!(k.level<=e||k.beingDrawn))if(h){n=k.lastTouchTime;l=h.lastTouchTime;o=k.level;m=h.level;if(l>n||n==l&&o>m){h=k;i=q;j=p}}else{h=k;i=q;j=p}}if(h&&i>=0){this._unloadTile(j);f=i}}this._tilesLoaded[f]=new b({tile:d.tile,tiledImage:d.tiledImage})},clearTilesFor:function(b){a.console.assert(b,"[TileCache.clearTilesFor] tiledImage is required");var c;for(var d=0;d<this._tilesLoaded.length;++d){c=this._tilesLoaded[d];if(c.tiledImage===b){this._unloadTile(c);this._tilesLoaded.splice(d,1);d--}}},getImageRecord:function(b){a.console.assert(b,"[TileCache.getImageRecord] url is required");return this._imagesLoaded[b]},_unloadTile:function(b){a.console.assert(b,"[TileCache._unloadTile] tileRecord is required");var c=b.tile;var d=b.tiledImage;c.unload();c.cacheImageRecord=null;var e=this._imagesLoaded[c.url];e.removeTile(c);if(!e.getTileCount()){e.destroy();delete this._imagesLoaded[c.url];this._imagesLoadedCount--}d.viewer.raiseEvent("tile-unloaded",{tile:c,tiledImage:d})}}}(OpenSeadragon);!function(a){a.World=function(b){var c=this;a.console.assert(b.viewer,"[World] options.viewer is required");a.EventSource.call(this);this.viewer=b.viewer;this._items=[];this._needsDraw=!1;this._autoRefigureSizes=!0;this._needsSizesFigured=!1;this._delegatedFigureSizes=function(a){c._autoRefigureSizes?c._figureSizes():c._needsSizesFigured=!0};this._figureSizes()};a.extend(a.World.prototype,a.EventSource.prototype,{addItem:function(b,c){a.console.assert(b,"[World.addItem] item is required");a.console.assert(b instanceof a.TiledImage,"[World.addItem] only TiledImages supported at this time");c=c||{};if(void 0!==c.index){var d=Math.max(0,Math.min(this._items.length,c.index));this._items.splice(d,0,b)}else this._items.push(b);this._autoRefigureSizes?this._figureSizes():this._needsSizesFigured=!0;this._needsDraw=!0;b.addHandler("bounds-change",this._delegatedFigureSizes);this.raiseEvent("add-item",{item:b})},getItemAt:function(b){a.console.assert(void 0!==b,"[World.getItemAt] index is required");return this._items[b]},getIndexOfItem:function(b){a.console.assert(b,"[World.getIndexOfItem] item is required");return a.indexOf(this._items,b)},getItemCount:function(){return this._items.length},setItemIndex:function(b,c){a.console.assert(b,"[World.setItemIndex] item is required");a.console.assert(void 0!==c,"[World.setItemIndex] index is required");var d=this.getIndexOfItem(b);if(c>=this._items.length)throw new Error("Index bigger than number of layers.");if(c!==d&&-1!==d){this._items.splice(d,1);this._items.splice(c,0,b);this._needsDraw=!0;this.raiseEvent("item-index-change",{item:b,previousIndex:d,newIndex:c})}},removeItem:function(b){a.console.assert(b,"[World.removeItem] item is required");var c=a.indexOf(this._items,b);if(-1!==c){b.removeHandler("bounds-change",this._delegatedFigureSizes);b.destroy();this._items.splice(c,1);this._figureSizes();this._needsDraw=!0;this._raiseRemoveItem(b)}},removeAll:function(){this.viewer._cancelPendingImages();var a;for(var b=0;b<this._items.length;b++){a=this._items[b];a.removeHandler("bounds-change",this._delegatedFigureSizes);a.destroy()}var c=this._items;this._items=[];this._figureSizes();this._needsDraw=!0;for(b=0;b<c.length;b++){a=c[b];this._raiseRemoveItem(a)}},resetItems:function(){for(var a=0;a<this._items.length;a++)this._items[a].reset()},update:function(){var a=!1;for(var b=0;b<this._items.length;b++)a=this._items[b].update()||a;return a},draw:function(){for(var a=0;a<this._items.length;a++)this._items[a].draw();this._needsDraw=!1},needsDraw:function(){for(var a=0;a<this._items.length;a++)if(this._items[a].needsDraw())return!0;return this._needsDraw},getHomeBounds:function(){return this._homeBounds.clone()},getContentFactor:function(){return this._contentFactor},setAutoRefigureSizes:function(a){this._autoRefigureSizes=a;if(a&this._needsSizesFigured){this._figureSizes();this._needsSizesFigured=!1}},arrange:function(b){b=b||{};var c=b.immediately||!1;var d=b.layout||a.DEFAULT_SETTINGS.collectionLayout;var e=b.rows||a.DEFAULT_SETTINGS.collectionRows;var f=b.columns||a.DEFAULT_SETTINGS.collectionColumns;var g=b.tileSize||a.DEFAULT_SETTINGS.collectionTileSize;var h=b.tileMargin||a.DEFAULT_SETTINGS.collectionTileMargin;var i=g+h;var j;j=!b.rows&&f?f:Math.ceil(this._items.length/e);var k=0;var l=0;var m,n,o,p,q;this.setAutoRefigureSizes(!1);for(var r=0;r<this._items.length;r++){if(r&&r%j===0)if("horizontal"===d){l+=i;k=0}else{k+=i;l=0}m=this._items[r];n=m.getBounds();o=n.width>n.height?g:g*(n.width/n.height);p=o*(n.height/n.width);q=new a.Point(k+(g-o)/2,l+(g-p)/2);m.setPosition(q,c);m.setWidth(o,c);"horizontal"===d?k+=i:l+=i}this.setAutoRefigureSizes(!0)},_figureSizes:function(){var b=this._homeBounds?this._homeBounds.clone():null;var c=this._contentSize?this._contentSize.clone():null;var d=this._contentFactor||0;if(this._items.length){var e=this._items[0];var f=e.getBounds();this._contentFactor=e.getContentSize().x/f.width;var g=e.getClippedBounds();var h=g.x;var i=g.y;var j=g.x+g.width;var k=g.y+g.height;for(var l=1;l<this._items.length;l++){e=this._items[l];f=e.getBounds();this._contentFactor=Math.max(this._contentFactor,e.getContentSize().x/f.width);g=e.getClippedBounds();h=Math.min(h,g.x);i=Math.min(i,g.y);j=Math.max(j,g.x+g.width);k=Math.max(k,g.y+g.height)}this._homeBounds=new a.Rect(h,i,j-h,k-i);this._contentSize=new a.Point(this._homeBounds.width*this._contentFactor,this._homeBounds.height*this._contentFactor)}else{this._homeBounds=new a.Rect(0,0,1,1);this._contentSize=new a.Point(1,1);this._contentFactor=1}this._contentFactor===d&&this._homeBounds.equals(b)&&this._contentSize.equals(c)||this.raiseEvent("metrics-change",{})},_raiseRemoveItem:function(a){this.raiseEvent("remove-item",{item:a})}})}(OpenSeadragon);
+//# sourceMappingURL=openseadragon.min.js.map
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/pdf.js b/public/opac/js/universalviewer-2.0.2/lib/pdf.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d25cc490c784a63a6584db6a585220d424aa658
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/pdf.js
@@ -0,0 +1,8568 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*jshint globalstrict: false */
+
+// Initializing PDFJS global object (if still undefined)
+if (typeof PDFJS === 'undefined') {
+  (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+PDFJS.version = '1.0.83';
+PDFJS.build = '0045325';
+
+(function pdfjsWrapper() {
+  // Use strict in our context only - users might not want it
+  'use strict';
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,
+           Promise */
+
+'use strict';
+
+var globalScope = (typeof window === 'undefined') ? this : window;
+
+var isWorker = (typeof window == 'undefined');
+
+var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+
+var TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7,
+  FILL_STROKE_MASK: 3,
+  ADD_TO_PATH_FLAG: 4
+};
+
+var ImageKind = {
+  GRAYSCALE_1BPP: 1,
+  RGB_24BPP: 2,
+  RGBA_32BPP: 3
+};
+
+// The global PDFJS object exposes the API
+// In production, it will be declared outside a global wrapper
+// In development, it will be declared here
+if (!globalScope.PDFJS) {
+  globalScope.PDFJS = {};
+}
+
+globalScope.PDFJS.pdfBug = false;
+
+PDFJS.VERBOSITY_LEVELS = {
+  errors: 0,
+  warnings: 1,
+  infos: 5
+};
+
+// All the possible operations for an operator list.
+var OPS = PDFJS.OPS = {
+  // Intentionally start from 1 so it is easy to spot bad operators that will be
+  // 0's.
+  dependency: 1,
+  setLineWidth: 2,
+  setLineCap: 3,
+  setLineJoin: 4,
+  setMiterLimit: 5,
+  setDash: 6,
+  setRenderingIntent: 7,
+  setFlatness: 8,
+  setGState: 9,
+  save: 10,
+  restore: 11,
+  transform: 12,
+  moveTo: 13,
+  lineTo: 14,
+  curveTo: 15,
+  curveTo2: 16,
+  curveTo3: 17,
+  closePath: 18,
+  rectangle: 19,
+  stroke: 20,
+  closeStroke: 21,
+  fill: 22,
+  eoFill: 23,
+  fillStroke: 24,
+  eoFillStroke: 25,
+  closeFillStroke: 26,
+  closeEOFillStroke: 27,
+  endPath: 28,
+  clip: 29,
+  eoClip: 30,
+  beginText: 31,
+  endText: 32,
+  setCharSpacing: 33,
+  setWordSpacing: 34,
+  setHScale: 35,
+  setLeading: 36,
+  setFont: 37,
+  setTextRenderingMode: 38,
+  setTextRise: 39,
+  moveText: 40,
+  setLeadingMoveText: 41,
+  setTextMatrix: 42,
+  nextLine: 43,
+  showText: 44,
+  showSpacedText: 45,
+  nextLineShowText: 46,
+  nextLineSetSpacingShowText: 47,
+  setCharWidth: 48,
+  setCharWidthAndBounds: 49,
+  setStrokeColorSpace: 50,
+  setFillColorSpace: 51,
+  setStrokeColor: 52,
+  setStrokeColorN: 53,
+  setFillColor: 54,
+  setFillColorN: 55,
+  setStrokeGray: 56,
+  setFillGray: 57,
+  setStrokeRGBColor: 58,
+  setFillRGBColor: 59,
+  setStrokeCMYKColor: 60,
+  setFillCMYKColor: 61,
+  shadingFill: 62,
+  beginInlineImage: 63,
+  beginImageData: 64,
+  endInlineImage: 65,
+  paintXObject: 66,
+  markPoint: 67,
+  markPointProps: 68,
+  beginMarkedContent: 69,
+  beginMarkedContentProps: 70,
+  endMarkedContent: 71,
+  beginCompat: 72,
+  endCompat: 73,
+  paintFormXObjectBegin: 74,
+  paintFormXObjectEnd: 75,
+  beginGroup: 76,
+  endGroup: 77,
+  beginAnnotations: 78,
+  endAnnotations: 79,
+  beginAnnotation: 80,
+  endAnnotation: 81,
+  paintJpegXObject: 82,
+  paintImageMaskXObject: 83,
+  paintImageMaskXObjectGroup: 84,
+  paintImageXObject: 85,
+  paintInlineImageXObject: 86,
+  paintInlineImageXObjectGroup: 87,
+  paintImageXObjectRepeat: 88,
+  paintImageMaskXObjectRepeat: 89,
+  paintSolidColorImageMask: 90
+};
+
+// A notice for devs. These are good for things that are helpful to devs, such
+// as warning that Workers were disabled, which is important to devs but not
+// end users.
+function info(msg) {
+  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {
+    console.log('Info: ' + msg);
+  }
+}
+
+// Non-fatal warnings.
+function warn(msg) {
+  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {
+    console.log('Warning: ' + msg);
+  }
+}
+
+// Fatal errors that should trigger the fallback UI and halt execution by
+// throwing an exception.
+function error(msg) {
+  // If multiple arguments were passed, pass them all to the log function.
+  if (arguments.length > 1) {
+    var logArguments = ['Error:'];
+    logArguments.push.apply(logArguments, arguments);
+    console.log.apply(console, logArguments);
+    // Join the arguments into a single string for the lines below.
+    msg = [].join.call(arguments, ' ');
+  } else {
+    console.log('Error: ' + msg);
+  }
+  console.log(backtrace());
+  UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);
+  throw new Error(msg);
+}
+
+function backtrace() {
+  try {
+    throw new Error();
+  } catch (e) {
+    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
+  }
+}
+
+function assert(cond, msg) {
+  if (!cond) {
+    error(msg);
+  }
+}
+
+var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
+  unknown: 'unknown',
+  forms: 'forms',
+  javaScript: 'javaScript',
+  smask: 'smask',
+  shadingPattern: 'shadingPattern',
+  font: 'font'
+};
+
+var UnsupportedManager = PDFJS.UnsupportedManager =
+  (function UnsupportedManagerClosure() {
+  var listeners = [];
+  return {
+    listen: function (cb) {
+      listeners.push(cb);
+    },
+    notify: function (featureId) {
+      warn('Unsupported feature "' + featureId + '"');
+      for (var i = 0, ii = listeners.length; i < ii; i++) {
+        listeners[i](featureId);
+      }
+    }
+  };
+})();
+
+// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
+// absolute URL, it will be returned as is.
+function combineUrl(baseUrl, url) {
+  if (!url) {
+    return baseUrl;
+  }
+  if (/^[a-z][a-z0-9+\-.]*:/i.test(url)) {
+    return url;
+  }
+  var i;
+  if (url.charAt(0) == '/') {
+    // absolute path
+    i = baseUrl.indexOf('://');
+    if (url.charAt(1) === '/') {
+      ++i;
+    } else {
+      i = baseUrl.indexOf('/', i + 3);
+    }
+    return baseUrl.substring(0, i) + url;
+  } else {
+    // relative path
+    var pathLength = baseUrl.length;
+    i = baseUrl.lastIndexOf('#');
+    pathLength = i >= 0 ? i : pathLength;
+    i = baseUrl.lastIndexOf('?', pathLength);
+    pathLength = i >= 0 ? i : pathLength;
+    var prefixLength = baseUrl.lastIndexOf('/', pathLength);
+    return baseUrl.substring(0, prefixLength + 1) + url;
+  }
+}
+
+// Validates if URL is safe and allowed, e.g. to avoid XSS.
+function isValidUrl(url, allowRelative) {
+  if (!url) {
+    return false;
+  }
+  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
+  // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+  var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
+  if (!protocol) {
+    return allowRelative;
+  }
+  protocol = protocol[0].toLowerCase();
+  switch (protocol) {
+    case 'http':
+    case 'https':
+    case 'ftp':
+    case 'mailto':
+      return true;
+    default:
+      return false;
+  }
+}
+PDFJS.isValidUrl = isValidUrl;
+
+function shadow(obj, prop, value) {
+  Object.defineProperty(obj, prop, { value: value,
+                                     enumerable: true,
+                                     configurable: true,
+                                     writable: false });
+  return value;
+}
+
+var PasswordResponses = PDFJS.PasswordResponses = {
+  NEED_PASSWORD: 1,
+  INCORRECT_PASSWORD: 2
+};
+
+var PasswordException = (function PasswordExceptionClosure() {
+  function PasswordException(msg, code) {
+    this.name = 'PasswordException';
+    this.message = msg;
+    this.code = code;
+  }
+
+  PasswordException.prototype = new Error();
+  PasswordException.constructor = PasswordException;
+
+  return PasswordException;
+})();
+
+var UnknownErrorException = (function UnknownErrorExceptionClosure() {
+  function UnknownErrorException(msg, details) {
+    this.name = 'UnknownErrorException';
+    this.message = msg;
+    this.details = details;
+  }
+
+  UnknownErrorException.prototype = new Error();
+  UnknownErrorException.constructor = UnknownErrorException;
+
+  return UnknownErrorException;
+})();
+
+var InvalidPDFException = (function InvalidPDFExceptionClosure() {
+  function InvalidPDFException(msg) {
+    this.name = 'InvalidPDFException';
+    this.message = msg;
+  }
+
+  InvalidPDFException.prototype = new Error();
+  InvalidPDFException.constructor = InvalidPDFException;
+
+  return InvalidPDFException;
+})();
+
+var MissingPDFException = (function MissingPDFExceptionClosure() {
+  function MissingPDFException(msg) {
+    this.name = 'MissingPDFException';
+    this.message = msg;
+  }
+
+  MissingPDFException.prototype = new Error();
+  MissingPDFException.constructor = MissingPDFException;
+
+  return MissingPDFException;
+})();
+
+var NotImplementedException = (function NotImplementedExceptionClosure() {
+  function NotImplementedException(msg) {
+    this.message = msg;
+  }
+
+  NotImplementedException.prototype = new Error();
+  NotImplementedException.prototype.name = 'NotImplementedException';
+  NotImplementedException.constructor = NotImplementedException;
+
+  return NotImplementedException;
+})();
+
+var MissingDataException = (function MissingDataExceptionClosure() {
+  function MissingDataException(begin, end) {
+    this.begin = begin;
+    this.end = end;
+    this.message = 'Missing data [' + begin + ', ' + end + ')';
+  }
+
+  MissingDataException.prototype = new Error();
+  MissingDataException.prototype.name = 'MissingDataException';
+  MissingDataException.constructor = MissingDataException;
+
+  return MissingDataException;
+})();
+
+var XRefParseException = (function XRefParseExceptionClosure() {
+  function XRefParseException(msg) {
+    this.message = msg;
+  }
+
+  XRefParseException.prototype = new Error();
+  XRefParseException.prototype.name = 'XRefParseException';
+  XRefParseException.constructor = XRefParseException;
+
+  return XRefParseException;
+})();
+
+
+function bytesToString(bytes) {
+  var length = bytes.length;
+  var MAX_ARGUMENT_COUNT = 8192;
+  if (length < MAX_ARGUMENT_COUNT) {
+    return String.fromCharCode.apply(null, bytes);
+  }
+  var strBuf = [];
+  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+    var chunk = bytes.subarray(i, chunkEnd);
+    strBuf.push(String.fromCharCode.apply(null, chunk));
+  }
+  return strBuf.join('');
+}
+
+function stringToArray(str) {
+  var length = str.length;
+  var array = [];
+  for (var i = 0; i < length; ++i) {
+    array[i] = str.charCodeAt(i);
+  }
+  return array;
+}
+
+function stringToBytes(str) {
+  var length = str.length;
+  var bytes = new Uint8Array(length);
+  for (var i = 0; i < length; ++i) {
+    bytes[i] = str.charCodeAt(i) & 0xFF;
+  }
+  return bytes;
+}
+
+function string32(value) {
+  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
+                             (value >> 8) & 0xff, value & 0xff);
+}
+
+function log2(x) {
+  var n = 1, i = 0;
+  while (x > n) {
+    n <<= 1;
+    i++;
+  }
+  return i;
+}
+
+function readInt8(data, start) {
+  return (data[start] << 24) >> 24;
+}
+
+function readUint16(data, offset) {
+  return (data[offset] << 8) | data[offset + 1];
+}
+
+function readUint32(data, offset) {
+  return ((data[offset] << 24) | (data[offset + 1] << 16) |
+         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;
+}
+
+// Lazy test the endianness of the platform
+// NOTE: This will be 'true' for simulated TypedArrays
+function isLittleEndian() {
+  var buffer8 = new Uint8Array(2);
+  buffer8[0] = 1;
+  var buffer16 = new Uint16Array(buffer8.buffer);
+  return (buffer16[0] === 1);
+}
+
+Object.defineProperty(PDFJS, 'isLittleEndian', {
+  configurable: true,
+  get: function PDFJS_isLittleEndian() {
+    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());
+  }
+});
+
+  // Lazy test if the userAgant support CanvasTypedArrays
+function hasCanvasTypedArrays() {
+  var canvas = document.createElement('canvas');
+  canvas.width = canvas.height = 1;
+  var ctx = canvas.getContext('2d');
+  var imageData = ctx.createImageData(1, 1);
+  return (typeof imageData.data.buffer !== 'undefined');
+}
+
+Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {
+  configurable: true,
+  get: function PDFJS_hasCanvasTypedArrays() {
+    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());
+  }
+});
+
+var Uint32ArrayView = (function Uint32ArrayViewClosure() {
+
+  function Uint32ArrayView(buffer, length) {
+    this.buffer = buffer;
+    this.byteLength = buffer.length;
+    this.length = length === undefined ? (this.byteLength >> 2) : length;
+    ensureUint32ArrayViewProps(this.length);
+  }
+  Uint32ArrayView.prototype = Object.create(null);
+
+  var uint32ArrayViewSetters = 0;
+  function createUint32ArrayProp(index) {
+    return {
+      get: function () {
+        var buffer = this.buffer, offset = index << 2;
+        return (buffer[offset] | (buffer[offset + 1] << 8) |
+          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;
+      },
+      set: function (value) {
+        var buffer = this.buffer, offset = index << 2;
+        buffer[offset] = value & 255;
+        buffer[offset + 1] = (value >> 8) & 255;
+        buffer[offset + 2] = (value >> 16) & 255;
+        buffer[offset + 3] = (value >>> 24) & 255;
+      }
+    };
+  }
+
+  function ensureUint32ArrayViewProps(length) {
+    while (uint32ArrayViewSetters < length) {
+      Object.defineProperty(Uint32ArrayView.prototype,
+        uint32ArrayViewSetters,
+        createUint32ArrayProp(uint32ArrayViewSetters));
+      uint32ArrayViewSetters++;
+    }
+  }
+
+  return Uint32ArrayView;
+})();
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+
+var Util = PDFJS.Util = (function UtilClosure() {
+  function Util() {}
+
+  Util.makeCssRgb = function Util_makeCssRgb(rgb) {
+    return 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';
+  };
+
+  Util.makeCssCmyk = function Util_makeCssCmyk(cmyk) {
+    var rgb = ColorSpace.singletons.cmyk.getRgb(cmyk, 0);
+    return Util.makeCssRgb(rgb);
+  };
+
+  // Concatenates two transformation matrices together and returns the result.
+  Util.transform = function Util_transform(m1, m2) {
+    return [
+      m1[0] * m2[0] + m1[2] * m2[1],
+      m1[1] * m2[0] + m1[3] * m2[1],
+      m1[0] * m2[2] + m1[2] * m2[3],
+      m1[1] * m2[2] + m1[3] * m2[3],
+      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
+      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
+    ];
+  };
+
+  // For 2d affine transforms
+  Util.applyTransform = function Util_applyTransform(p, m) {
+    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+    return [xt, yt];
+  };
+
+  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+    return [xt, yt];
+  };
+
+  // Applies the transform to the rectangle and finds the minimum axially
+  // aligned bounding box.
+  Util.getAxialAlignedBoundingBox =
+    function Util_getAxialAlignedBoundingBox(r, m) {
+
+    var p1 = Util.applyTransform(r, m);
+    var p2 = Util.applyTransform(r.slice(2, 4), m);
+    var p3 = Util.applyTransform([r[0], r[3]], m);
+    var p4 = Util.applyTransform([r[2], r[1]], m);
+    return [
+      Math.min(p1[0], p2[0], p3[0], p4[0]),
+      Math.min(p1[1], p2[1], p3[1], p4[1]),
+      Math.max(p1[0], p2[0], p3[0], p4[0]),
+      Math.max(p1[1], p2[1], p3[1], p4[1])
+    ];
+  };
+
+  Util.inverseTransform = function Util_inverseTransform(m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
+      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+  };
+
+  // Apply a generic 3d matrix M on a 3-vector v:
+  //   | a b c |   | X |
+  //   | d e f | x | Y |
+  //   | g h i |   | Z |
+  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
+  // with v as [X,Y,Z]
+  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
+    return [
+      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
+      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
+      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
+    ];
+  };
+
+  // This calculation uses Singular Value Decomposition.
+  // The SVD can be represented with formula A = USV. We are interested in the
+  // matrix S here because it represents the scale values.
+  Util.singularValueDecompose2dScale =
+    function Util_singularValueDecompose2dScale(m) {
+
+    var transpose = [m[0], m[2], m[1], m[3]];
+
+    // Multiply matrix m with its transpose.
+    var a = m[0] * transpose[0] + m[1] * transpose[2];
+    var b = m[0] * transpose[1] + m[1] * transpose[3];
+    var c = m[2] * transpose[0] + m[3] * transpose[2];
+    var d = m[2] * transpose[1] + m[3] * transpose[3];
+
+    // Solve the second degree polynomial to get roots.
+    var first = (a + d) / 2;
+    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+    var sx = first + second || 1;
+    var sy = first - second || 1;
+
+    // Scale values are the square roots of the eigenvalues.
+    return [Math.sqrt(sx), Math.sqrt(sy)];
+  };
+
+  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
+  // For coordinate systems whose origin lies in the bottom-left, this
+  // means normalization to (BL,TR) ordering. For systems with origin in the
+  // top-left, this means (TL,BR) ordering.
+  Util.normalizeRect = function Util_normalizeRect(rect) {
+    var r = rect.slice(0); // clone rect
+    if (rect[0] > rect[2]) {
+      r[0] = rect[2];
+      r[2] = rect[0];
+    }
+    if (rect[1] > rect[3]) {
+      r[1] = rect[3];
+      r[3] = rect[1];
+    }
+    return r;
+  };
+
+  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
+  // intersection of rect1 and rect2. If no intersection, returns 'false'
+  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
+  Util.intersect = function Util_intersect(rect1, rect2) {
+    function compare(a, b) {
+      return a - b;
+    }
+
+    // Order points along the axes
+    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
+        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
+        result = [];
+
+    rect1 = Util.normalizeRect(rect1);
+    rect2 = Util.normalizeRect(rect2);
+
+    // X: first and second points belong to different rectangles?
+    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
+        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
+      // Intersection must be between second and third points
+      result[0] = orderedX[1];
+      result[2] = orderedX[2];
+    } else {
+      return false;
+    }
+
+    // Y: first and second points belong to different rectangles?
+    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
+        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
+      // Intersection must be between second and third points
+      result[1] = orderedY[1];
+      result[3] = orderedY[2];
+    } else {
+      return false;
+    }
+
+    return result;
+  };
+
+  Util.sign = function Util_sign(num) {
+    return num < 0 ? -1 : 1;
+  };
+
+  // TODO(mack): Rename appendToArray
+  Util.concatenateToArray = function concatenateToArray(arr1, arr2) {
+    Array.prototype.push.apply(arr1, arr2);
+  };
+
+  Util.prependToArray = function concatenateToArray(arr1, arr2) {
+    Array.prototype.unshift.apply(arr1, arr2);
+  };
+
+  Util.extendObj = function extendObj(obj1, obj2) {
+    for (var key in obj2) {
+      obj1[key] = obj2[key];
+    }
+  };
+
+  Util.getInheritableProperty = function Util_getInheritableProperty(dict,
+                                                                     name) {
+    while (dict && !dict.has(name)) {
+      dict = dict.get('Parent');
+    }
+    if (!dict) {
+      return null;
+    }
+    return dict.get(name);
+  };
+
+  Util.inherit = function Util_inherit(sub, base, prototype) {
+    sub.prototype = Object.create(base.prototype);
+    sub.prototype.constructor = sub;
+    for (var prop in prototype) {
+      sub.prototype[prop] = prototype[prop];
+    }
+  };
+
+  Util.loadScript = function Util_loadScript(src, callback) {
+    var script = document.createElement('script');
+    var loaded = false;
+    script.setAttribute('src', src);
+    if (callback) {
+      script.onload = function() {
+        if (!loaded) {
+          callback();
+        }
+        loaded = true;
+      };
+    }
+    document.getElementsByTagName('head')[0].appendChild(script);
+  };
+
+  return Util;
+})();
+
+var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
+  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
+    this.viewBox = viewBox;
+    this.scale = scale;
+    this.rotation = rotation;
+    this.offsetX = offsetX;
+    this.offsetY = offsetY;
+
+    // creating transform to convert pdf coordinate system to the normal
+    // canvas like coordinates taking in account scale and rotation
+    var centerX = (viewBox[2] + viewBox[0]) / 2;
+    var centerY = (viewBox[3] + viewBox[1]) / 2;
+    var rotateA, rotateB, rotateC, rotateD;
+    rotation = rotation % 360;
+    rotation = rotation < 0 ? rotation + 360 : rotation;
+    switch (rotation) {
+      case 180:
+        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
+        break;
+      case 90:
+        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
+        break;
+      case 270:
+        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
+        break;
+      //case 0:
+      default:
+        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
+        break;
+    }
+
+    if (dontFlip) {
+      rotateC = -rotateC; rotateD = -rotateD;
+    }
+
+    var offsetCanvasX, offsetCanvasY;
+    var width, height;
+    if (rotateA === 0) {
+      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
+      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
+      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
+    } else {
+      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
+      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
+      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
+    }
+    // creating transform for the following operations:
+    // translate(-centerX, -centerY), rotate and flip vertically,
+    // scale, and translate(offsetCanvasX, offsetCanvasY)
+    this.transform = [
+      rotateA * scale,
+      rotateB * scale,
+      rotateC * scale,
+      rotateD * scale,
+      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
+      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
+    ];
+
+    this.width = width;
+    this.height = height;
+    this.fontScale = scale;
+  }
+  PageViewport.prototype = {
+    clone: function PageViewPort_clone(args) {
+      args = args || {};
+      var scale = 'scale' in args ? args.scale : this.scale;
+      var rotation = 'rotation' in args ? args.rotation : this.rotation;
+      return new PageViewport(this.viewBox.slice(), scale, rotation,
+                              this.offsetX, this.offsetY, args.dontFlip);
+    },
+    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
+      return Util.applyTransform([x, y], this.transform);
+    },
+    convertToViewportRectangle:
+      function PageViewport_convertToViewportRectangle(rect) {
+      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
+      var br = Util.applyTransform([rect[2], rect[3]], this.transform);
+      return [tl[0], tl[1], br[0], br[1]];
+    },
+    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
+      return Util.applyInverseTransform([x, y], this.transform);
+    }
+  };
+  return PageViewport;
+})();
+
+var PDFStringTranslateTable = [
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
+  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
+  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
+  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
+];
+
+function stringToPDFString(str) {
+  var i, n = str.length, strBuf = [];
+  if (str[0] === '\xFE' && str[1] === '\xFF') {
+    // UTF16BE BOM
+    for (i = 2; i < n; i += 2) {
+      strBuf.push(String.fromCharCode(
+        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));
+    }
+  } else {
+    for (i = 0; i < n; ++i) {
+      var code = PDFStringTranslateTable[str.charCodeAt(i)];
+      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+    }
+  }
+  return strBuf.join('');
+}
+
+function stringToUTF8String(str) {
+  return decodeURIComponent(escape(str));
+}
+
+function isEmptyObj(obj) {
+  for (var key in obj) {
+    return false;
+  }
+  return true;
+}
+
+function isBool(v) {
+  return typeof v == 'boolean';
+}
+
+function isInt(v) {
+  return typeof v == 'number' && ((v | 0) == v);
+}
+
+function isNum(v) {
+  return typeof v == 'number';
+}
+
+function isString(v) {
+  return typeof v == 'string';
+}
+
+function isNull(v) {
+  return v === null;
+}
+
+function isName(v) {
+  return v instanceof Name;
+}
+
+function isCmd(v, cmd) {
+  return v instanceof Cmd && (!cmd || v.cmd == cmd);
+}
+
+function isDict(v, type) {
+  if (!(v instanceof Dict)) {
+    return false;
+  }
+  if (!type) {
+    return true;
+  }
+  var dictType = v.get('Type');
+  return isName(dictType) && dictType.name == type;
+}
+
+function isArray(v) {
+  return v instanceof Array;
+}
+
+function isStream(v) {
+  return typeof v == 'object' && v !== null && v !== undefined &&
+         ('getBytes' in v);
+}
+
+function isArrayBuffer(v) {
+  return typeof v == 'object' && v !== null && v !== undefined &&
+         ('byteLength' in v);
+}
+
+function isRef(v) {
+  return v instanceof Ref;
+}
+
+function isPDFFunction(v) {
+  var fnDict;
+  if (typeof v != 'object') {
+    return false;
+  } else if (isDict(v)) {
+    fnDict = v;
+  } else if (isStream(v)) {
+    fnDict = v.dict;
+  } else {
+    return false;
+  }
+  return fnDict.has('FunctionType');
+}
+
+/**
+ * Legacy support for PDFJS Promise implementation.
+ * TODO remove eventually
+ * @ignore
+ */
+var LegacyPromise = PDFJS.LegacyPromise = (function LegacyPromiseClosure() {
+  return function LegacyPromise() {
+    var resolve, reject;
+    var promise = new Promise(function (resolve_, reject_) {
+      resolve = resolve_;
+      reject = reject_;
+    });
+    promise.resolve = resolve;
+    promise.reject = reject;
+    return promise;
+  };
+})();
+
+/**
+ * Polyfill for Promises:
+ * The following promise implementation tries to generally implment the
+ * Promise/A+ spec. Some notable differences from other promise libaries are:
+ * - There currently isn't a seperate deferred and promise object.
+ * - Unhandled rejections eventually show an error if they aren't handled.
+ *
+ * Based off of the work in:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=810490
+ */
+(function PromiseClosure() {
+  if (globalScope.Promise) {
+    // Promises existing in the DOM/Worker, checking presence of all/resolve
+    if (typeof globalScope.Promise.all !== 'function') {
+      globalScope.Promise.all = function (iterable) {
+        var count = 0, results = [], resolve, reject;
+        var promise = new globalScope.Promise(function (resolve_, reject_) {
+          resolve = resolve_;
+          reject = reject_;
+        });
+        iterable.forEach(function (p, i) {
+          count++;
+          p.then(function (result) {
+            results[i] = result;
+            count--;
+            if (count === 0) {
+              resolve(results);
+            }
+          }, reject);
+        });
+        if (count === 0) {
+          resolve(results);
+        }
+        return promise;
+      };
+    }
+    if (typeof globalScope.Promise.resolve !== 'function') {
+      globalScope.Promise.resolve = function (x) {
+        return new globalScope.Promise(function (resolve) { resolve(x); });
+      };
+    }
+    return;
+  }
+  var STATUS_PENDING = 0;
+  var STATUS_RESOLVED = 1;
+  var STATUS_REJECTED = 2;
+
+  // In an attempt to avoid silent exceptions, unhandled rejections are
+  // tracked and if they aren't handled in a certain amount of time an
+  // error is logged.
+  var REJECTION_TIMEOUT = 500;
+
+  var HandlerManager = {
+    handlers: [],
+    running: false,
+    unhandledRejections: [],
+    pendingRejectionCheck: false,
+
+    scheduleHandlers: function scheduleHandlers(promise) {
+      if (promise._status == STATUS_PENDING) {
+        return;
+      }
+
+      this.handlers = this.handlers.concat(promise._handlers);
+      promise._handlers = [];
+
+      if (this.running) {
+        return;
+      }
+      this.running = true;
+
+      setTimeout(this.runHandlers.bind(this), 0);
+    },
+
+    runHandlers: function runHandlers() {
+      var RUN_TIMEOUT = 1; // ms
+      var timeoutAt = Date.now() + RUN_TIMEOUT;
+      while (this.handlers.length > 0) {
+        var handler = this.handlers.shift();
+
+        var nextStatus = handler.thisPromise._status;
+        var nextValue = handler.thisPromise._value;
+
+        try {
+          if (nextStatus === STATUS_RESOLVED) {
+            if (typeof(handler.onResolve) == 'function') {
+              nextValue = handler.onResolve(nextValue);
+            }
+          } else if (typeof(handler.onReject) === 'function') {
+              nextValue = handler.onReject(nextValue);
+              nextStatus = STATUS_RESOLVED;
+
+              if (handler.thisPromise._unhandledRejection) {
+                this.removeUnhandeledRejection(handler.thisPromise);
+              }
+          }
+        } catch (ex) {
+          nextStatus = STATUS_REJECTED;
+          nextValue = ex;
+        }
+
+        handler.nextPromise._updateStatus(nextStatus, nextValue);
+        if (Date.now() >= timeoutAt) {
+          break;
+        }
+      }
+
+      if (this.handlers.length > 0) {
+        setTimeout(this.runHandlers.bind(this), 0);
+        return;
+      }
+
+      this.running = false;
+    },
+
+    addUnhandledRejection: function addUnhandledRejection(promise) {
+      this.unhandledRejections.push({
+        promise: promise,
+        time: Date.now()
+      });
+      this.scheduleRejectionCheck();
+    },
+
+    removeUnhandeledRejection: function removeUnhandeledRejection(promise) {
+      promise._unhandledRejection = false;
+      for (var i = 0; i < this.unhandledRejections.length; i++) {
+        if (this.unhandledRejections[i].promise === promise) {
+          this.unhandledRejections.splice(i);
+          i--;
+        }
+      }
+    },
+
+    scheduleRejectionCheck: function scheduleRejectionCheck() {
+      if (this.pendingRejectionCheck) {
+        return;
+      }
+      this.pendingRejectionCheck = true;
+      setTimeout(function rejectionCheck() {
+        this.pendingRejectionCheck = false;
+        var now = Date.now();
+        for (var i = 0; i < this.unhandledRejections.length; i++) {
+          if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {
+            var unhandled = this.unhandledRejections[i].promise._value;
+            var msg = 'Unhandled rejection: ' + unhandled;
+            if (unhandled.stack) {
+              msg += '\n' + unhandled.stack;
+            }
+            warn(msg);
+            this.unhandledRejections.splice(i);
+            i--;
+          }
+        }
+        if (this.unhandledRejections.length) {
+          this.scheduleRejectionCheck();
+        }
+      }.bind(this), REJECTION_TIMEOUT);
+    }
+  };
+
+  function Promise(resolver) {
+    this._status = STATUS_PENDING;
+    this._handlers = [];
+    resolver.call(this, this._resolve.bind(this), this._reject.bind(this));
+  }
+  /**
+   * Builds a promise that is resolved when all the passed in promises are
+   * resolved.
+   * @param {array} array of data and/or promises to wait for.
+   * @return {Promise} New dependant promise.
+   */
+  Promise.all = function Promise_all(promises) {
+    var resolveAll, rejectAll;
+    var deferred = new Promise(function (resolve, reject) {
+      resolveAll = resolve;
+      rejectAll = reject;
+    });
+    var unresolved = promises.length;
+    var results = [];
+    if (unresolved === 0) {
+      resolveAll(results);
+      return deferred;
+    }
+    function reject(reason) {
+      if (deferred._status === STATUS_REJECTED) {
+        return;
+      }
+      results = [];
+      rejectAll(reason);
+    }
+    for (var i = 0, ii = promises.length; i < ii; ++i) {
+      var promise = promises[i];
+      var resolve = (function(i) {
+        return function(value) {
+          if (deferred._status === STATUS_REJECTED) {
+            return;
+          }
+          results[i] = value;
+          unresolved--;
+          if (unresolved === 0) {
+            resolveAll(results);
+          }
+        };
+      })(i);
+      if (Promise.isPromise(promise)) {
+        promise.then(resolve, reject);
+      } else {
+        resolve(promise);
+      }
+    }
+    return deferred;
+  };
+
+  /**
+   * Checks if the value is likely a promise (has a 'then' function).
+   * @return {boolean} true if x is thenable
+   */
+  Promise.isPromise = function Promise_isPromise(value) {
+    return value && typeof value.then === 'function';
+  };
+  /**
+   * Creates resolved promise
+   * @param x resolve value
+   * @returns {Promise}
+   */
+  Promise.resolve = function Promise_resolve(x) {
+    return new Promise(function (resolve) { resolve(x); });
+  };
+
+  Promise.prototype = {
+    _status: null,
+    _value: null,
+    _handlers: null,
+    _unhandledRejection: null,
+
+    _updateStatus: function Promise__updateStatus(status, value) {
+      if (this._status === STATUS_RESOLVED ||
+          this._status === STATUS_REJECTED) {
+        return;
+      }
+
+      if (status == STATUS_RESOLVED &&
+          Promise.isPromise(value)) {
+        value.then(this._updateStatus.bind(this, STATUS_RESOLVED),
+                   this._updateStatus.bind(this, STATUS_REJECTED));
+        return;
+      }
+
+      this._status = status;
+      this._value = value;
+
+      if (status === STATUS_REJECTED && this._handlers.length === 0) {
+        this._unhandledRejection = true;
+        HandlerManager.addUnhandledRejection(this);
+      }
+
+      HandlerManager.scheduleHandlers(this);
+    },
+
+    _resolve: function Promise_resolve(value) {
+      this._updateStatus(STATUS_RESOLVED, value);
+    },
+
+    _reject: function Promise_reject(reason) {
+      this._updateStatus(STATUS_REJECTED, reason);
+    },
+
+    then: function Promise_then(onResolve, onReject) {
+      var nextPromise = new Promise(function (resolve, reject) {
+        this.resolve = reject;
+        this.reject = reject;
+      });
+      this._handlers.push({
+        thisPromise: this,
+        onResolve: onResolve,
+        onReject: onReject,
+        nextPromise: nextPromise
+      });
+      HandlerManager.scheduleHandlers(this);
+      return nextPromise;
+    }
+  };
+
+  globalScope.Promise = Promise;
+})();
+
+var StatTimer = (function StatTimerClosure() {
+  function rpad(str, pad, length) {
+    while (str.length < length) {
+      str += pad;
+    }
+    return str;
+  }
+  function StatTimer() {
+    this.started = {};
+    this.times = [];
+    this.enabled = true;
+  }
+  StatTimer.prototype = {
+    time: function StatTimer_time(name) {
+      if (!this.enabled) {
+        return;
+      }
+      if (name in this.started) {
+        warn('Timer is already running for ' + name);
+      }
+      this.started[name] = Date.now();
+    },
+    timeEnd: function StatTimer_timeEnd(name) {
+      if (!this.enabled) {
+        return;
+      }
+      if (!(name in this.started)) {
+        warn('Timer has not been started for ' + name);
+      }
+      this.times.push({
+        'name': name,
+        'start': this.started[name],
+        'end': Date.now()
+      });
+      // Remove timer from started so it can be called again.
+      delete this.started[name];
+    },
+    toString: function StatTimer_toString() {
+      var i, ii;
+      var times = this.times;
+      var out = '';
+      // Find the longest name for padding purposes.
+      var longest = 0;
+      for (i = 0, ii = times.length; i < ii; ++i) {
+        var name = times[i]['name'];
+        if (name.length > longest) {
+          longest = name.length;
+        }
+      }
+      for (i = 0, ii = times.length; i < ii; ++i) {
+        var span = times[i];
+        var duration = span.end - span.start;
+        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
+      }
+      return out;
+    }
+  };
+  return StatTimer;
+})();
+
+PDFJS.createBlob = function createBlob(data, contentType) {
+  if (typeof Blob !== 'undefined') {
+    return new Blob([data], { type: contentType });
+  }
+  // Blob builder is deprecated in FF14 and removed in FF18.
+  var bb = new MozBlobBuilder();
+  bb.append(data);
+  return bb.getBlob(contentType);
+};
+
+PDFJS.createObjectURL = (function createObjectURLClosure() {
+  // Blob/createObjectURL is not available, falling back to data schema.
+  var digits =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+  return function createObjectURL(data, contentType) {
+    if (!PDFJS.disableCreateObjectURL &&
+        typeof URL !== 'undefined' && URL.createObjectURL) {
+      var blob = PDFJS.createBlob(data, contentType);
+      return URL.createObjectURL(blob);
+    }
+
+    var buffer = 'data:' + contentType + ';base64,';
+    for (var i = 0, ii = data.length; i < ii; i += 3) {
+      var b1 = data[i] & 0xFF;
+      var b2 = data[i + 1] & 0xFF;
+      var b3 = data[i + 2] & 0xFF;
+      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;
+      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+    }
+    return buffer;
+  };
+})();
+
+function MessageHandler(name, comObj) {
+  this.name = name;
+  this.comObj = comObj;
+  this.callbackIndex = 1;
+  this.postMessageTransfers = true;
+  var callbacks = this.callbacks = {};
+  var ah = this.actionHandler = {};
+
+  ah['console_log'] = [function ahConsoleLog(data) {
+    console.log.apply(console, data);
+  }];
+  ah['console_error'] = [function ahConsoleError(data) {
+    console.error.apply(console, data);
+  }];
+  ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {
+    UnsupportedManager.notify(data);
+  }];
+
+  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+    var data = event.data;
+    if (data.isReply) {
+      var callbackId = data.callbackId;
+      if (data.callbackId in callbacks) {
+        var callback = callbacks[callbackId];
+        delete callbacks[callbackId];
+        callback(data.data);
+      } else {
+        error('Cannot resolve callback ' + callbackId);
+      }
+    } else if (data.action in ah) {
+      var action = ah[data.action];
+      if (data.callbackId) {
+        var deferred = {};
+        var promise = new Promise(function (resolve, reject) {
+          deferred.resolve = resolve;
+          deferred.reject = reject;
+        });
+        deferred.promise = promise;
+        promise.then(function(resolvedData) {
+          comObj.postMessage({
+            isReply: true,
+            callbackId: data.callbackId,
+            data: resolvedData
+          });
+        });
+        action[0].call(action[1], data.data, deferred);
+      } else {
+        action[0].call(action[1], data.data);
+      }
+    } else {
+      error('Unkown action from worker: ' + data.action);
+    }
+  };
+}
+
+MessageHandler.prototype = {
+  on: function messageHandlerOn(actionName, handler, scope) {
+    var ah = this.actionHandler;
+    if (ah[actionName]) {
+      error('There is already an actionName called "' + actionName + '"');
+    }
+    ah[actionName] = [handler, scope];
+  },
+  /**
+   * Sends a message to the comObj to invoke the action with the supplied data.
+   * @param {String} actionName Action to call.
+   * @param {JSON} data JSON data to send.
+   * @param {function} [callback] Optional callback that will handle a reply.
+   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers
+   */
+  send: function messageHandlerSend(actionName, data, callback, transfers) {
+    var message = {
+      action: actionName,
+      data: data
+    };
+    if (callback) {
+      var callbackId = this.callbackIndex++;
+      this.callbacks[callbackId] = callback;
+      message.callbackId = callbackId;
+    }
+    if (transfers && this.postMessageTransfers) {
+      this.comObj.postMessage(message, transfers);
+    } else {
+      this.comObj.postMessage(message);
+    }
+  }
+};
+
+function loadJpegStream(id, imageUrl, objs) {
+  var img = new Image();
+  img.onload = (function loadJpegStream_onloadClosure() {
+    objs.resolve(id, img);
+  });
+  img.src = imageUrl;
+}
+
+
+var ColorSpace = (function ColorSpaceClosure() {
+  // Constructor should define this.numComps, this.defaultColor, this.name
+  function ColorSpace() {
+    error('should not call ColorSpace constructor');
+  }
+
+  ColorSpace.prototype = {
+    /**
+     * Converts the color value to the RGB color. The color components are
+     * located in the src array starting from the srcOffset. Returns the array
+     * of the rgb components, each value ranging from [0,255].
+     */
+    getRgb: function ColorSpace_getRgb(src, srcOffset) {
+      var rgb = new Uint8Array(3);
+      this.getRgbItem(src, srcOffset, rgb, 0);
+      return rgb;
+    },
+    /**
+     * Converts the color value to the RGB color, similar to the getRgb method.
+     * The result placed into the dest array starting from the destOffset.
+     */
+    getRgbItem: function ColorSpace_getRgbItem(src, srcOffset,
+                                               dest, destOffset) {
+      error('Should not call ColorSpace.getRgbItem');
+    },
+    /**
+     * Converts the specified number of the color values to the RGB colors.
+     * The colors are located in the src array starting from the srcOffset.
+     * The result is placed into the dest array starting from the destOffset.
+     * The src array items shall be in [0,2^bits) range, the dest array items
+     * will be in [0,255] range. alpha01 indicates how many alpha components
+     * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA
+     * array).
+     */
+    getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count,
+                                                   dest, destOffset, bits,
+                                                   alpha01) {
+      error('Should not call ColorSpace.getRgbBuffer');
+    },
+    /**
+     * Determines the number of bytes required to store the result of the
+     * conversion done by the getRgbBuffer method. As in getRgbBuffer,
+     * |alpha01| is either 0 (RGB output) or 1 (RGBA output).
+     */
+    getOutputLength: function ColorSpace_getOutputLength(inputLength,
+                                                         alpha01) {
+      error('Should not call ColorSpace.getOutputLength');
+    },
+    /**
+     * Returns true if source data will be equal the result/output data.
+     */
+    isPassthrough: function ColorSpace_isPassthrough(bits) {
+      return false;
+    },
+    /**
+     * Fills in the RGB colors in the destination buffer.  alpha01 indicates
+     * how many alpha components there are in the dest array; it will be either
+     * 0 (RGB array) or 1 (RGBA array).
+     */
+    fillRgb: function ColorSpace_fillRgb(dest, originalWidth,
+                                         originalHeight, width, height,
+                                         actualHeight, bpc, comps, alpha01) {
+      var count = originalWidth * originalHeight;
+      var rgbBuf = null;
+      var numComponentColors = 1 << bpc;
+      var needsResizing = originalHeight != height || originalWidth != width;
+      var i, ii;
+
+      if (this.isPassthrough(bpc)) {
+        rgbBuf = comps;
+      } else if (this.numComps === 1 && count > numComponentColors &&
+          this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {
+        // Optimization: create a color map when there is just one component and
+        // we are converting more colors than the size of the color map. We
+        // don't build the map if the colorspace is gray or rgb since those
+        // methods are faster than building a map. This mainly offers big speed
+        // ups for indexed and alternate colorspaces.
+        //
+        // TODO it may be worth while to cache the color map. While running
+        // testing I never hit a cache so I will leave that out for now (perhaps
+        // we are reparsing colorspaces too much?).
+        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) :
+                                   new Uint16Array(numComponentColors);
+        var key;
+        for (i = 0; i < numComponentColors; i++) {
+          allColors[i] = i;
+        }
+        var colorMap = new Uint8Array(numComponentColors * 3);
+        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc,
+                          /* alpha01 = */ 0);
+
+        var destPos, rgbPos;
+        if (!needsResizing) {
+          // Fill in the RGB values directly into |dest|.
+          destPos = 0;
+          for (i = 0; i < count; ++i) {
+            key = comps[i] * 3;
+            dest[destPos++] = colorMap[key];
+            dest[destPos++] = colorMap[key + 1];
+            dest[destPos++] = colorMap[key + 2];
+            destPos += alpha01;
+          }
+        } else {
+          rgbBuf = new Uint8Array(count * 3);
+          rgbPos = 0;
+          for (i = 0; i < count; ++i) {
+            key = comps[i] * 3;
+            rgbBuf[rgbPos++] = colorMap[key];
+            rgbBuf[rgbPos++] = colorMap[key + 1];
+            rgbBuf[rgbPos++] = colorMap[key + 2];
+          }
+        }
+      } else {
+        if (!needsResizing) {
+          // Fill in the RGB values directly into |dest|.
+          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc,
+                            alpha01);
+        } else {
+          rgbBuf = new Uint8Array(count * 3);
+          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc,
+                            /* alpha01 = */ 0);
+        }
+      }
+
+      if (rgbBuf) {
+        if (needsResizing) {
+          PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width,
+                          height, dest, alpha01);
+        } else {
+          rgbPos = 0;
+          destPos = 0;
+          for (i = 0, ii = width * actualHeight; i < ii; i++) {
+            dest[destPos++] = rgbBuf[rgbPos++];
+            dest[destPos++] = rgbBuf[rgbPos++];
+            dest[destPos++] = rgbBuf[rgbPos++];
+            destPos += alpha01;
+          }
+        }
+      }
+    },
+    /**
+     * True if the colorspace has components in the default range of [0, 1].
+     * This should be true for all colorspaces except for lab color spaces
+     * which are [0,100], [-128, 127], [-128, 127].
+     */
+    usesZeroToOneRange: true
+  };
+
+  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
+    var IR = ColorSpace.parseToIR(cs, xref, res);
+    if (IR instanceof AlternateCS) {
+      return IR;
+    }
+    return ColorSpace.fromIR(IR);
+  };
+
+  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
+    var name = isArray(IR) ? IR[0] : IR;
+    var whitePoint, blackPoint;
+
+    switch (name) {
+      case 'DeviceGrayCS':
+        return this.singletons.gray;
+      case 'DeviceRgbCS':
+        return this.singletons.rgb;
+      case 'DeviceCmykCS':
+        return this.singletons.cmyk;
+      case 'CalGrayCS':
+        whitePoint = IR[1].WhitePoint;
+        blackPoint = IR[1].BlackPoint;
+        var gamma = IR[1].Gamma;
+        return new CalGrayCS(whitePoint, blackPoint, gamma);
+      case 'PatternCS':
+        var basePatternCS = IR[1];
+        if (basePatternCS) {
+          basePatternCS = ColorSpace.fromIR(basePatternCS);
+        }
+        return new PatternCS(basePatternCS);
+      case 'IndexedCS':
+        var baseIndexedCS = IR[1];
+        var hiVal = IR[2];
+        var lookup = IR[3];
+        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
+      case 'AlternateCS':
+        var numComps = IR[1];
+        var alt = IR[2];
+        var tintFnIR = IR[3];
+
+        return new AlternateCS(numComps, ColorSpace.fromIR(alt),
+                                PDFFunction.fromIR(tintFnIR));
+      case 'LabCS':
+        whitePoint = IR[1].WhitePoint;
+        blackPoint = IR[1].BlackPoint;
+        var range = IR[1].Range;
+        return new LabCS(whitePoint, blackPoint, range);
+      default:
+        error('Unkown name ' + name);
+    }
+    return null;
+  };
+
+  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
+    if (isName(cs)) {
+      var colorSpaces = res.get('ColorSpace');
+      if (isDict(colorSpaces)) {
+        var refcs = colorSpaces.get(cs.name);
+        if (refcs) {
+          cs = refcs;
+        }
+      }
+    }
+
+    cs = xref.fetchIfRef(cs);
+    var mode;
+
+    if (isName(cs)) {
+      mode = cs.name;
+      this.mode = mode;
+
+      switch (mode) {
+        case 'DeviceGray':
+        case 'G':
+          return 'DeviceGrayCS';
+        case 'DeviceRGB':
+        case 'RGB':
+          return 'DeviceRgbCS';
+        case 'DeviceCMYK':
+        case 'CMYK':
+          return 'DeviceCmykCS';
+        case 'Pattern':
+          return ['PatternCS', null];
+        default:
+          error('unrecognized colorspace ' + mode);
+      }
+    } else if (isArray(cs)) {
+      mode = cs[0].name;
+      this.mode = mode;
+      var numComps, params;
+
+      switch (mode) {
+        case 'DeviceGray':
+        case 'G':
+          return 'DeviceGrayCS';
+        case 'DeviceRGB':
+        case 'RGB':
+          return 'DeviceRgbCS';
+        case 'DeviceCMYK':
+        case 'CMYK':
+          return 'DeviceCmykCS';
+        case 'CalGray':
+          params = cs[1].getAll();
+          return ['CalGrayCS', params];
+        case 'CalRGB':
+          return 'DeviceRgbCS';
+        case 'ICCBased':
+          var stream = xref.fetchIfRef(cs[1]);
+          var dict = stream.dict;
+          numComps = dict.get('N');
+          if (numComps == 1) {
+            return 'DeviceGrayCS';
+          } else if (numComps == 3) {
+            return 'DeviceRgbCS';
+          } else if (numComps == 4) {
+            return 'DeviceCmykCS';
+          }
+          break;
+        case 'Pattern':
+          var basePatternCS = cs[1];
+          if (basePatternCS) {
+            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+          }
+          return ['PatternCS', basePatternCS];
+        case 'Indexed':
+        case 'I':
+          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
+          var hiVal = cs[2] + 1;
+          var lookup = xref.fetchIfRef(cs[3]);
+          if (isStream(lookup)) {
+            lookup = lookup.getBytes();
+          }
+          return ['IndexedCS', baseIndexedCS, hiVal, lookup];
+        case 'Separation':
+        case 'DeviceN':
+          var name = cs[1];
+          numComps = 1;
+          if (isName(name)) {
+            numComps = 1;
+          } else if (isArray(name)) {
+            numComps = name.length;
+          }
+          var alt = ColorSpace.parseToIR(cs[2], xref, res);
+          var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
+          return ['AlternateCS', numComps, alt, tintFnIR];
+        case 'Lab':
+          params = cs[1].getAll();
+          return ['LabCS', params];
+        default:
+          error('unimplemented color space object "' + mode + '"');
+      }
+    } else {
+      error('unrecognized color space object: "' + cs + '"');
+    }
+    return null;
+  };
+  /**
+   * Checks if a decode map matches the default decode map for a color space.
+   * This handles the general decode maps where there are two values per
+   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
+   * This does not handle Lab, Indexed, or Pattern decode maps since they are
+   * slightly different.
+   * @param {Array} decode Decode map (usually from an image).
+   * @param {Number} n Number of components the color space has.
+   */
+  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
+    if (!decode) {
+      return true;
+    }
+
+    if (n * 2 !== decode.length) {
+      warn('The decode map is not the correct length');
+      return true;
+    }
+    for (var i = 0, ii = decode.length; i < ii; i += 2) {
+      if (decode[i] !== 0 || decode[i + 1] != 1) {
+        return false;
+      }
+    }
+    return true;
+  };
+
+  ColorSpace.singletons = {
+    get gray() {
+      return shadow(this, 'gray', new DeviceGrayCS());
+    },
+    get rgb() {
+      return shadow(this, 'rgb', new DeviceRgbCS());
+    },
+    get cmyk() {
+      return shadow(this, 'cmyk', new DeviceCmykCS());
+    }
+  };
+
+  return ColorSpace;
+})();
+
+/**
+ * Alternate color space handles both Separation and DeviceN color spaces.  A
+ * Separation color space is actually just a DeviceN with one color component.
+ * Both color spaces use a tinting function to convert colors to a base color
+ * space.
+ */
+var AlternateCS = (function AlternateCSClosure() {
+  function AlternateCS(numComps, base, tintFn) {
+    this.name = 'Alternate';
+    this.numComps = numComps;
+    this.defaultColor = new Float32Array(numComps);
+    for (var i = 0; i < numComps; ++i) {
+      this.defaultColor[i] = 1;
+    }
+    this.base = base;
+    this.tintFn = tintFn;
+  }
+
+  AlternateCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function AlternateCS_getRgbItem(src, srcOffset,
+                                                dest, destOffset) {
+      var baseNumComps = this.base.numComps;
+      var input = 'subarray' in src ?
+        src.subarray(srcOffset, srcOffset + this.numComps) :
+        Array.prototype.slice.call(src, srcOffset, srcOffset + this.numComps);
+      var tinted = this.tintFn(input);
+      this.base.getRgbItem(tinted, 0, dest, destOffset);
+    },
+    getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count,
+                                                    dest, destOffset, bits,
+                                                    alpha01) {
+      var tintFn = this.tintFn;
+      var base = this.base;
+      var scale = 1 / ((1 << bits) - 1);
+      var baseNumComps = base.numComps;
+      var usesZeroToOneRange = base.usesZeroToOneRange;
+      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) &&
+                          alpha01 === 0;
+      var pos = isPassthrough ? destOffset : 0;
+      var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count);
+      var numComps = this.numComps;
+
+      var scaled = new Float32Array(numComps);
+      var i, j;
+      for (i = 0; i < count; i++) {
+        for (j = 0; j < numComps; j++) {
+          scaled[j] = src[srcOffset++] * scale;
+        }
+        var tinted = tintFn(scaled);
+        if (usesZeroToOneRange) {
+          for (j = 0; j < baseNumComps; j++) {
+            baseBuf[pos++] = tinted[j] * 255;
+          }
+        } else {
+          base.getRgbItem(tinted, 0, baseBuf, pos);
+          pos += baseNumComps;
+        }
+      }
+      if (!isPassthrough) {
+        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
+      }
+    },
+    getOutputLength: function AlternateCS_getOutputLength(inputLength,
+                                                          alpha01) {
+      return this.base.getOutputLength(inputLength *
+                                       this.base.numComps / this.numComps,
+                                       alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+
+  return AlternateCS;
+})();
+
+var PatternCS = (function PatternCSClosure() {
+  function PatternCS(baseCS) {
+    this.name = 'Pattern';
+    this.base = baseCS;
+  }
+  PatternCS.prototype = {};
+
+  return PatternCS;
+})();
+
+var IndexedCS = (function IndexedCSClosure() {
+  function IndexedCS(base, highVal, lookup) {
+    this.name = 'Indexed';
+    this.numComps = 1;
+    this.defaultColor = new Uint8Array([0]);
+    this.base = base;
+    this.highVal = highVal;
+
+    var baseNumComps = base.numComps;
+    var length = baseNumComps * highVal;
+    var lookupArray;
+
+    if (isStream(lookup)) {
+      lookupArray = new Uint8Array(length);
+      var bytes = lookup.getBytes(length);
+      lookupArray.set(bytes);
+    } else if (isString(lookup)) {
+      lookupArray = new Uint8Array(length);
+      for (var i = 0; i < length; ++i) {
+        lookupArray[i] = lookup.charCodeAt(i);
+      }
+    } else if (lookup instanceof Uint8Array || lookup instanceof Array) {
+      lookupArray = lookup;
+    } else {
+      error('Unrecognized lookup table: ' + lookup);
+    }
+    this.lookup = lookupArray;
+  }
+
+  IndexedCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function IndexedCS_getRgbItem(src, srcOffset,
+                                              dest, destOffset) {
+      var numComps = this.base.numComps;
+      var start = src[srcOffset] * numComps;
+      this.base.getRgbItem(this.lookup, start, dest, destOffset);
+    },
+    getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count,
+                                                  dest, destOffset, bits,
+                                                  alpha01) {
+      var base = this.base;
+      var numComps = base.numComps;
+      var outputDelta = base.getOutputLength(numComps, alpha01);
+      var lookup = this.lookup;
+
+      for (var i = 0; i < count; ++i) {
+        var lookupPos = src[srcOffset++] * numComps;
+        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
+        destOffset += outputDelta;
+      }
+    },
+    getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) {
+      return this.base.getOutputLength(inputLength * this.base.numComps,
+                                       alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
+      // indexed color maps shouldn't be changed
+      return true;
+    },
+    usesZeroToOneRange: true
+  };
+  return IndexedCS;
+})();
+
+var DeviceGrayCS = (function DeviceGrayCSClosure() {
+  function DeviceGrayCS() {
+    this.name = 'DeviceGray';
+    this.numComps = 1;
+    this.defaultColor = new Float32Array([0]);
+  }
+
+  DeviceGrayCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset,
+                                                 dest, destOffset) {
+      var c = (src[srcOffset] * 255) | 0;
+      c = c < 0 ? 0 : c > 255 ? 255 : c;
+      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
+    },
+    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count,
+                                                     dest, destOffset, bits,
+                                                     alpha01) {
+      var scale = 255 / ((1 << bits) - 1);
+      var j = srcOffset, q = destOffset;
+      for (var i = 0; i < count; ++i) {
+        var c = (scale * src[j++]) | 0;
+        dest[q++] = c;
+        dest[q++] = c;
+        dest[q++] = c;
+        q += alpha01;
+      }
+    },
+    getOutputLength: function DeviceGrayCS_getOutputLength(inputLength,
+                                                           alpha01) {
+      return inputLength * (3 + alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+  return DeviceGrayCS;
+})();
+
+var DeviceRgbCS = (function DeviceRgbCSClosure() {
+  function DeviceRgbCS() {
+    this.name = 'DeviceRGB';
+    this.numComps = 3;
+    this.defaultColor = new Float32Array([0, 0, 0]);
+  }
+  DeviceRgbCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset,
+                                                dest, destOffset) {
+      var r = (src[srcOffset] * 255) | 0;
+      var g = (src[srcOffset + 1] * 255) | 0;
+      var b = (src[srcOffset + 2] * 255) | 0;
+      dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r;
+      dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g;
+      dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b;
+    },
+    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count,
+                                                    dest, destOffset, bits,
+                                                    alpha01) {
+      if (bits === 8 && alpha01 === 0) {
+        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
+        return;
+      }
+      var scale = 255 / ((1 << bits) - 1);
+      var j = srcOffset, q = destOffset;
+      for (var i = 0; i < count; ++i) {
+        dest[q++] = (scale * src[j++]) | 0;
+        dest[q++] = (scale * src[j++]) | 0;
+        dest[q++] = (scale * src[j++]) | 0;
+        q += alpha01;
+      }
+    },
+    getOutputLength: function DeviceRgbCS_getOutputLength(inputLength,
+                                                          alpha01) {
+      return (inputLength * (3 + alpha01) / 3) | 0;
+    },
+    isPassthrough: function DeviceRgbCS_isPassthrough(bits) {
+      return bits == 8;
+    },
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+  return DeviceRgbCS;
+})();
+
+var DeviceCmykCS = (function DeviceCmykCSClosure() {
+  // The coefficients below was found using numerical analysis: the method of
+  // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors,
+  // where color_value is the tabular value from the table of sampled RGB colors
+  // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding
+  // CMYK color conversion using the estimation below:
+  //   f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255
+  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
+    var c = src[srcOffset + 0] * srcScale;
+    var m = src[srcOffset + 1] * srcScale;
+    var y = src[srcOffset + 2] * srcScale;
+    var k = src[srcOffset + 3] * srcScale;
+
+    var r =
+      (c * (-4.387332384609988 * c + 54.48615194189176 * m +
+            18.82290502165302 * y + 212.25662451639585 * k +
+            -285.2331026137004) +
+       m * (1.7149763477362134 * m - 5.6096736904047315 * y +
+            -17.873870861415444 * k - 5.497006427196366) +
+       y * (-2.5217340131683033 * y - 21.248923337353073 * k +
+            17.5119270841813) +
+       k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0;
+    var g =
+      (c * (8.841041422036149 * c + 60.118027045597366 * m +
+            6.871425592049007 * y + 31.159100130055922 * k +
+            -79.2970844816548) +
+       m * (-15.310361306967817 * m + 17.575251261109482 * y +
+            131.35250912493976 * k - 190.9453302588951) +
+       y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) +
+       k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0;
+    var b =
+      (c * (0.8842522430003296 * c + 8.078677503112928 * m +
+            30.89978309703729 * y - 0.23883238689178934 * k +
+            -14.183576799673286) +
+       m * (10.49593273432072 * m + 63.02378494754052 * y +
+            50.606957656360734 * k - 112.23884253719248) +
+       y * (0.03296041114873217 * y + 115.60384449646641 * k +
+            -193.58209356861505) +
+       k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0;
+
+    dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r;
+    dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;
+    dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;
+  }
+
+  function DeviceCmykCS() {
+    this.name = 'DeviceCMYK';
+    this.numComps = 4;
+    this.defaultColor = new Float32Array([0, 0, 0, 1]);
+  }
+  DeviceCmykCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset,
+                                                 dest, destOffset) {
+      convertToRgb(src, srcOffset, 1, dest, destOffset);
+    },
+    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count,
+                                                     dest, destOffset, bits,
+                                                     alpha01) {
+      var scale = 1 / ((1 << bits) - 1);
+      for (var i = 0; i < count; i++) {
+        convertToRgb(src, srcOffset, scale, dest, destOffset);
+        srcOffset += 4;
+        destOffset += 3 + alpha01;
+      }
+    },
+    getOutputLength: function DeviceCmykCS_getOutputLength(inputLength,
+                                                           alpha01) {
+      return (inputLength / 4 * (3 + alpha01)) | 0;
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+
+  return DeviceCmykCS;
+})();
+
+//
+// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245
+//
+var CalGrayCS = (function CalGrayCSClosure() {
+  function CalGrayCS(whitePoint, blackPoint, gamma) {
+    this.name = 'CalGray';
+    this.numComps = 1;
+    this.defaultColor = new Float32Array([0]);
+
+    if (!whitePoint) {
+      error('WhitePoint missing - required for color space CalGray');
+    }
+    blackPoint = blackPoint || [0, 0, 0];
+    gamma = gamma || 1;
+
+    // Translate arguments to spec variables.
+    this.XW = whitePoint[0];
+    this.YW = whitePoint[1];
+    this.ZW = whitePoint[2];
+
+    this.XB = blackPoint[0];
+    this.YB = blackPoint[1];
+    this.ZB = blackPoint[2];
+
+    this.G = gamma;
+
+    // Validate variables as per spec.
+    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+      error('Invalid WhitePoint components for ' + this.name +
+            ', no fallback available');
+    }
+
+    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+      info('Invalid BlackPoint for ' + this.name + ', falling back to default');
+      this.XB = this.YB = this.ZB = 0;
+    }
+
+    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
+      warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB +
+           ', ZB: ' + this.ZB + ', only default values are supported.');
+    }
+
+    if (this.G < 1) {
+      info('Invalid Gamma: ' + this.G + ' for ' + this.name +
+           ', falling back to default');
+      this.G = 1;
+    }
+  }
+
+  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+    // A represents a gray component of a calibrated gray space.
+    // A <---> AG in the spec
+    var A = src[srcOffset] * scale;
+    var AG = Math.pow(A, cs.G);
+
+    // Computes intermediate variables M, L, N as per spec.
+    // Except if other than default BlackPoint values are used.
+    var M = cs.XW * AG;
+    var L = cs.YW * AG;
+    var N = cs.ZW * AG;
+
+    // Decode XYZ, as per spec.
+    var X = M;
+    var Y = L;
+    var Z = N;
+
+    // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.
+    // This yields values in range [0, 100].
+    var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0);
+
+    // Convert values to rgb range [0, 255].
+    dest[destOffset] = Lstar * 255 / 100;
+    dest[destOffset + 1] = Lstar * 255 / 100;
+    dest[destOffset + 2] = Lstar * 255 / 100;
+  }
+
+  CalGrayCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset,
+                                              dest, destOffset) {
+      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+    },
+    getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count,
+                                                  dest, destOffset, bits,
+                                                  alpha01) {
+      var scale = 1 / ((1 << bits) - 1);
+
+      for (var i = 0; i < count; ++i) {
+        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+        srcOffset += 1;
+        destOffset += 3 + alpha01;
+      }
+    },
+    getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) {
+      return inputLength * (3 + alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+  return CalGrayCS;
+})();
+
+//
+// LabCS: Based on "PDF Reference, Sixth Ed", p.250
+//
+var LabCS = (function LabCSClosure() {
+  function LabCS(whitePoint, blackPoint, range) {
+    this.name = 'Lab';
+    this.numComps = 3;
+    this.defaultColor = new Float32Array([0, 0, 0]);
+
+    if (!whitePoint) {
+      error('WhitePoint missing - required for color space Lab');
+    }
+    blackPoint = blackPoint || [0, 0, 0];
+    range = range || [-100, 100, -100, 100];
+
+    // Translate args to spec variables
+    this.XW = whitePoint[0];
+    this.YW = whitePoint[1];
+    this.ZW = whitePoint[2];
+    this.amin = range[0];
+    this.amax = range[1];
+    this.bmin = range[2];
+    this.bmax = range[3];
+
+    // These are here just for completeness - the spec doesn't offer any
+    // formulas that use BlackPoint in Lab
+    this.XB = blackPoint[0];
+    this.YB = blackPoint[1];
+    this.ZB = blackPoint[2];
+
+    // Validate vars as per spec
+    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+      error('Invalid WhitePoint components, no fallback available');
+    }
+
+    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+      info('Invalid BlackPoint, falling back to default');
+      this.XB = this.YB = this.ZB = 0;
+    }
+
+    if (this.amin > this.amax || this.bmin > this.bmax) {
+      info('Invalid Range, falling back to defaults');
+      this.amin = -100;
+      this.amax = 100;
+      this.bmin = -100;
+      this.bmax = 100;
+    }
+  }
+
+  // Function g(x) from spec
+  function fn_g(x) {
+    if (x >= 6 / 29) {
+      return x * x * x;
+    } else {
+      return (108 / 841) * (x - 4 / 29);
+    }
+  }
+
+  function decode(value, high1, low2, high2) {
+    return low2 + (value) * (high2 - low2) / (high1);
+  }
+
+  // If decoding is needed maxVal should be 2^bits per component - 1.
+  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
+    // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax]
+    // not the usual [0, 1]. If a command like setFillColor is used the src
+    // values will already be within the correct range. However, if we are
+    // converting an image we have to map the values to the correct range given
+    // above.
+    // Ls,as,bs <---> L*,a*,b* in the spec
+    var Ls = src[srcOffset];
+    var as = src[srcOffset + 1];
+    var bs = src[srcOffset + 2];
+    if (maxVal !== false) {
+      Ls = decode(Ls, maxVal, 0, 100);
+      as = decode(as, maxVal, cs.amin, cs.amax);
+      bs = decode(bs, maxVal, cs.bmin, cs.bmax);
+    }
+
+    // Adjust limits of 'as' and 'bs'
+    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;
+    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;
+
+    // Computes intermediate variables X,Y,Z as per spec
+    var M = (Ls + 16) / 116;
+    var L = M + (as / 500);
+    var N = M - (bs / 200);
+
+    var X = cs.XW * fn_g(L);
+    var Y = cs.YW * fn_g(M);
+    var Z = cs.ZW * fn_g(N);
+
+    var r, g, b;
+    // Using different conversions for D50 and D65 white points,
+    // per http://www.color.org/srgb.pdf
+    if (cs.ZW < 1) {
+      // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249)
+      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;
+      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;
+      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;
+    } else {
+      // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888)
+      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
+      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
+      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;
+    }
+    // clamp color values to [0,1] range then convert to [0,255] range.
+    dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0;
+    dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0;
+    dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0;
+  }
+
+  LabCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) {
+      convertToRgb(this, src, srcOffset, false, dest, destOffset);
+    },
+    getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count,
+                                              dest, destOffset, bits,
+                                              alpha01) {
+      var maxVal = (1 << bits) - 1;
+      for (var i = 0; i < count; i++) {
+        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
+        srcOffset += 3;
+        destOffset += 3 + alpha01;
+      }
+    },
+    getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) {
+      return (inputLength * (3 + alpha01) / 3) | 0;
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
+      // XXX: Decoding is handled with the lab conversion because of the strange
+      // ranges that are used.
+      return true;
+    },
+    usesZeroToOneRange: false
+  };
+  return LabCS;
+})();
+
+
+
+var PDFFunction = (function PDFFunctionClosure() {
+  var CONSTRUCT_SAMPLED = 0;
+  var CONSTRUCT_INTERPOLATED = 2;
+  var CONSTRUCT_STICHED = 3;
+  var CONSTRUCT_POSTSCRIPT = 4;
+
+  return {
+    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
+                                                       str) {
+      var i, ii;
+      var length = 1;
+      for (i = 0, ii = size.length; i < ii; i++) {
+        length *= size[i];
+      }
+      length *= outputSize;
+
+      var array = [];
+      var codeSize = 0;
+      var codeBuf = 0;
+      // 32 is a valid bps so shifting won't work
+      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+
+      var strBytes = str.getBytes((length * bps + 7) / 8);
+      var strIdx = 0;
+      for (i = 0; i < length; i++) {
+        while (codeSize < bps) {
+          codeBuf <<= 8;
+          codeBuf |= strBytes[strIdx++];
+          codeSize += 8;
+        }
+        codeSize -= bps;
+        array.push((codeBuf >> codeSize) * sampleMul);
+        codeBuf &= (1 << codeSize) - 1;
+      }
+      return array;
+    },
+
+    getIR: function PDFFunction_getIR(xref, fn) {
+      var dict = fn.dict;
+      if (!dict) {
+        dict = fn;
+      }
+
+      var types = [this.constructSampled,
+                   null,
+                   this.constructInterpolated,
+                   this.constructStiched,
+                   this.constructPostScript];
+
+      var typeNum = dict.get('FunctionType');
+      var typeFn = types[typeNum];
+      if (!typeFn) {
+        error('Unknown type of function');
+      }
+
+      return typeFn.call(this, fn, dict, xref);
+    },
+
+    fromIR: function PDFFunction_fromIR(IR) {
+      var type = IR[0];
+      switch (type) {
+        case CONSTRUCT_SAMPLED:
+          return this.constructSampledFromIR(IR);
+        case CONSTRUCT_INTERPOLATED:
+          return this.constructInterpolatedFromIR(IR);
+        case CONSTRUCT_STICHED:
+          return this.constructStichedFromIR(IR);
+        //case CONSTRUCT_POSTSCRIPT:
+        default:
+          return this.constructPostScriptFromIR(IR);
+      }
+    },
+
+    parse: function PDFFunction_parse(xref, fn) {
+      var IR = this.getIR(xref, fn);
+      return this.fromIR(IR);
+    },
+
+    constructSampled: function PDFFunction_constructSampled(str, dict) {
+      function toMultiArray(arr) {
+        var inputLength = arr.length;
+        var out = [];
+        var index = 0;
+        for (var i = 0; i < inputLength; i += 2) {
+          out[index] = [arr[i], arr[i + 1]];
+          ++index;
+        }
+        return out;
+      }
+      var domain = dict.get('Domain');
+      var range = dict.get('Range');
+
+      if (!domain || !range) {
+        error('No domain or range');
+      }
+
+      var inputSize = domain.length / 2;
+      var outputSize = range.length / 2;
+
+      domain = toMultiArray(domain);
+      range = toMultiArray(range);
+
+      var size = dict.get('Size');
+      var bps = dict.get('BitsPerSample');
+      var order = dict.get('Order') || 1;
+      if (order !== 1) {
+        // No description how cubic spline interpolation works in PDF32000:2008
+        // As in poppler, ignoring order, linear interpolation may work as good
+        info('No support for cubic spline interpolation: ' + order);
+      }
+
+      var encode = dict.get('Encode');
+      if (!encode) {
+        encode = [];
+        for (var i = 0; i < inputSize; ++i) {
+          encode.push(0);
+          encode.push(size[i] - 1);
+        }
+      }
+      encode = toMultiArray(encode);
+
+      var decode = dict.get('Decode');
+      if (!decode) {
+        decode = range;
+      } else {
+        decode = toMultiArray(decode);
+      }
+
+      var samples = this.getSampleArray(size, outputSize, bps, str);
+
+      return [
+        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
+        outputSize, Math.pow(2, bps) - 1, range
+      ];
+    },
+
+    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
+      // See chapter 3, page 109 of the PDF reference
+      function interpolate(x, xmin, xmax, ymin, ymax) {
+        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
+      }
+
+      return function constructSampledFromIRResult(args) {
+        // See chapter 3, page 110 of the PDF reference.
+        var m = IR[1];
+        var domain = IR[2];
+        var encode = IR[3];
+        var decode = IR[4];
+        var samples = IR[5];
+        var size = IR[6];
+        var n = IR[7];
+        //var mask = IR[8];
+        var range = IR[9];
+
+        if (m != args.length) {
+          error('Incorrect number of arguments: ' + m + ' != ' +
+                args.length);
+        }
+
+        var x = args;
+
+        // Building the cube vertices: its part and sample index
+        // http://rjwagner49.com/Mathematics/Interpolation.pdf
+        var cubeVertices = 1 << m;
+        var cubeN = new Float64Array(cubeVertices);
+        var cubeVertex = new Uint32Array(cubeVertices);
+        var i, j;
+        for (j = 0; j < cubeVertices; j++) {
+          cubeN[j] = 1;
+        }
+
+        var k = n, pos = 1;
+        // Map x_i to y_j for 0 <= i < m using the sampled function.
+        for (i = 0; i < m; ++i) {
+          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
+          var domain_2i = domain[i][0];
+          var domain_2i_1 = domain[i][1];
+          var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
+
+          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
+          //                   Encode_2i, Encode_2i+1)
+          var e = interpolate(xi, domain_2i, domain_2i_1,
+                              encode[i][0], encode[i][1]);
+
+          // e_i' = min(max(e_i, 0), Size_i - 1)
+          var size_i = size[i];
+          e = Math.min(Math.max(e, 0), size_i - 1);
+
+          // Adjusting the cube: N and vertex sample index
+          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
+          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
+          var n1 = e - e0; // (e - e0) / (e1 - e0);
+          var offset0 = e0 * k;
+          var offset1 = offset0 + k; // e1 * k
+          for (j = 0; j < cubeVertices; j++) {
+            if (j & pos) {
+              cubeN[j] *= n1;
+              cubeVertex[j] += offset1;
+            } else {
+              cubeN[j] *= n0;
+              cubeVertex[j] += offset0;
+            }
+          }
+
+          k *= size_i;
+          pos <<= 1;
+        }
+
+        var y = new Float64Array(n);
+        for (j = 0; j < n; ++j) {
+          // Sum all cube vertices' samples portions
+          var rj = 0;
+          for (i = 0; i < cubeVertices; i++) {
+            rj += samples[cubeVertex[i] + j] * cubeN[i];
+          }
+
+          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
+          //                    Decode_2j, Decode_2j+1)
+          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
+
+          // y_j = min(max(r_j, range_2j), range_2j+1)
+          y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
+        }
+
+        return y;
+      };
+    },
+
+    constructInterpolated: function PDFFunction_constructInterpolated(str,
+                                                                      dict) {
+      var c0 = dict.get('C0') || [0];
+      var c1 = dict.get('C1') || [1];
+      var n = dict.get('N');
+
+      if (!isArray(c0) || !isArray(c1)) {
+        error('Illegal dictionary for interpolated function');
+      }
+
+      var length = c0.length;
+      var diff = [];
+      for (var i = 0; i < length; ++i) {
+        diff.push(c1[i] - c0[i]);
+      }
+
+      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+    },
+
+    constructInterpolatedFromIR:
+      function PDFFunction_constructInterpolatedFromIR(IR) {
+      var c0 = IR[1];
+      var diff = IR[2];
+      var n = IR[3];
+
+      var length = diff.length;
+
+      return function constructInterpolatedFromIRResult(args) {
+        var x = n == 1 ? args[0] : Math.pow(args[0], n);
+
+        var out = [];
+        for (var j = 0; j < length; ++j) {
+          out.push(c0[j] + (x * diff[j]));
+        }
+
+        return out;
+
+      };
+    },
+
+    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
+      var domain = dict.get('Domain');
+
+      if (!domain) {
+        error('No domain');
+      }
+
+      var inputSize = domain.length / 2;
+      if (inputSize != 1) {
+        error('Bad domain for stiched function');
+      }
+
+      var fnRefs = dict.get('Functions');
+      var fns = [];
+      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
+        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
+      }
+
+      var bounds = dict.get('Bounds');
+      var encode = dict.get('Encode');
+
+      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+    },
+
+    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
+      var domain = IR[1];
+      var bounds = IR[2];
+      var encode = IR[3];
+      var fnsIR = IR[4];
+      var fns = [];
+
+      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
+        fns.push(PDFFunction.fromIR(fnsIR[i]));
+      }
+
+      return function constructStichedFromIRResult(args) {
+        var clip = function constructStichedFromIRClip(v, min, max) {
+          if (v > max) {
+            v = max;
+          } else if (v < min) {
+            v = min;
+          }
+          return v;
+        };
+
+        // clip to domain
+        var v = clip(args[0], domain[0], domain[1]);
+        // calulate which bound the value is in
+        for (var i = 0, ii = bounds.length; i < ii; ++i) {
+          if (v < bounds[i]) {
+            break;
+          }
+        }
+
+        // encode value into domain of function
+        var dmin = domain[0];
+        if (i > 0) {
+          dmin = bounds[i - 1];
+        }
+        var dmax = domain[1];
+        if (i < bounds.length) {
+          dmax = bounds[i];
+        }
+
+        var rmin = encode[2 * i];
+        var rmax = encode[2 * i + 1];
+
+        var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+
+        // call the appropriate function
+        return fns[i]([v2]);
+      };
+    },
+
+    constructPostScript: function PDFFunction_constructPostScript(fn, dict,
+                                                                  xref) {
+      var domain = dict.get('Domain');
+      var range = dict.get('Range');
+
+      if (!domain) {
+        error('No domain.');
+      }
+
+      if (!range) {
+        error('No range.');
+      }
+
+      var lexer = new PostScriptLexer(fn);
+      var parser = new PostScriptParser(lexer);
+      var code = parser.parse();
+
+      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
+    },
+
+    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
+                                          IR) {
+      var domain = IR[1];
+      var range = IR[2];
+      var code = IR[3];
+      var numOutputs = range.length / 2;
+      var evaluator = new PostScriptEvaluator(code);
+      // Cache the values for a big speed up, the cache size is limited though
+      // since the number of possible values can be huge from a PS function.
+      var cache = new FunctionCache();
+      return function constructPostScriptFromIRResult(args) {
+        var initialStack = [];
+        for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
+          initialStack.push(args[i]);
+        }
+
+        var key = initialStack.join('_');
+        if (cache.has(key)) {
+          return cache.get(key);
+        }
+
+        var stack = evaluator.execute(initialStack);
+        var transformed = [];
+        for (i = numOutputs - 1; i >= 0; --i) {
+          var out = stack.pop();
+          var rangeIndex = 2 * i;
+          if (out < range[rangeIndex]) {
+            out = range[rangeIndex];
+          } else if (out > range[rangeIndex + 1]) {
+            out = range[rangeIndex + 1];
+          }
+          transformed[i] = out;
+        }
+        cache.set(key, transformed);
+        return transformed;
+      };
+    }
+  };
+})();
+
+var FunctionCache = (function FunctionCacheClosure() {
+  // Of 10 PDF's with type4 functions the maxium number of distinct values seen
+  // was 256. This still may need some tweaking in the future though.
+  var MAX_CACHE_SIZE = 1024;
+  function FunctionCache() {
+    this.cache = {};
+    this.total = 0;
+  }
+  FunctionCache.prototype = {
+    has: function FunctionCache_has(key) {
+      return key in this.cache;
+    },
+    get: function FunctionCache_get(key) {
+      return this.cache[key];
+    },
+    set: function FunctionCache_set(key, value) {
+      if (this.total < MAX_CACHE_SIZE) {
+        this.cache[key] = value;
+        this.total++;
+      }
+    }
+  };
+  return FunctionCache;
+})();
+
+var PostScriptStack = (function PostScriptStackClosure() {
+  var MAX_STACK_SIZE = 100;
+  function PostScriptStack(initialStack) {
+    this.stack = initialStack || [];
+  }
+
+  PostScriptStack.prototype = {
+    push: function PostScriptStack_push(value) {
+      if (this.stack.length >= MAX_STACK_SIZE) {
+        error('PostScript function stack overflow.');
+      }
+      this.stack.push(value);
+    },
+    pop: function PostScriptStack_pop() {
+      if (this.stack.length <= 0) {
+        error('PostScript function stack underflow.');
+      }
+      return this.stack.pop();
+    },
+    copy: function PostScriptStack_copy(n) {
+      if (this.stack.length + n >= MAX_STACK_SIZE) {
+        error('PostScript function stack overflow.');
+      }
+      var stack = this.stack;
+      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
+        stack.push(stack[i]);
+      }
+    },
+    index: function PostScriptStack_index(n) {
+      this.push(this.stack[this.stack.length - n - 1]);
+    },
+    // rotate the last n stack elements p times
+    roll: function PostScriptStack_roll(n, p) {
+      var stack = this.stack;
+      var l = stack.length - n;
+      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
+      for (i = l, j = r; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+      for (i = l, j = c - 1; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+      for (i = c, j = r; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+    }
+  };
+  return PostScriptStack;
+})();
+var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
+  function PostScriptEvaluator(operators) {
+    this.operators = operators;
+  }
+  PostScriptEvaluator.prototype = {
+    execute: function PostScriptEvaluator_execute(initialStack) {
+      var stack = new PostScriptStack(initialStack);
+      var counter = 0;
+      var operators = this.operators;
+      var length = operators.length;
+      var operator, a, b;
+      while (counter < length) {
+        operator = operators[counter++];
+        if (typeof operator == 'number') {
+          // Operator is really an operand and should be pushed to the stack.
+          stack.push(operator);
+          continue;
+        }
+        switch (operator) {
+          // non standard ps operators
+          case 'jz': // jump if false
+            b = stack.pop();
+            a = stack.pop();
+            if (!a) {
+              counter = b;
+            }
+            break;
+          case 'j': // jump
+            a = stack.pop();
+            counter = a;
+            break;
+
+          // all ps operators in alphabetical order (excluding if/ifelse)
+          case 'abs':
+            a = stack.pop();
+            stack.push(Math.abs(a));
+            break;
+          case 'add':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a + b);
+            break;
+          case 'and':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a && b);
+            } else {
+              stack.push(a & b);
+            }
+            break;
+          case 'atan':
+            a = stack.pop();
+            stack.push(Math.atan(a));
+            break;
+          case 'bitshift':
+            b = stack.pop();
+            a = stack.pop();
+            if (a > 0) {
+              stack.push(a << b);
+            } else {
+              stack.push(a >> b);
+            }
+            break;
+          case 'ceiling':
+            a = stack.pop();
+            stack.push(Math.ceil(a));
+            break;
+          case 'copy':
+            a = stack.pop();
+            stack.copy(a);
+            break;
+          case 'cos':
+            a = stack.pop();
+            stack.push(Math.cos(a));
+            break;
+          case 'cvi':
+            a = stack.pop() | 0;
+            stack.push(a);
+            break;
+          case 'cvr':
+            // noop
+            break;
+          case 'div':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a / b);
+            break;
+          case 'dup':
+            stack.copy(1);
+            break;
+          case 'eq':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a == b);
+            break;
+          case 'exch':
+            stack.roll(2, 1);
+            break;
+          case 'exp':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(Math.pow(a, b));
+            break;
+          case 'false':
+            stack.push(false);
+            break;
+          case 'floor':
+            a = stack.pop();
+            stack.push(Math.floor(a));
+            break;
+          case 'ge':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a >= b);
+            break;
+          case 'gt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a > b);
+            break;
+          case 'idiv':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push((a / b) | 0);
+            break;
+          case 'index':
+            a = stack.pop();
+            stack.index(a);
+            break;
+          case 'le':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a <= b);
+            break;
+          case 'ln':
+            a = stack.pop();
+            stack.push(Math.log(a));
+            break;
+          case 'log':
+            a = stack.pop();
+            stack.push(Math.log(a) / Math.LN10);
+            break;
+          case 'lt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a < b);
+            break;
+          case 'mod':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a % b);
+            break;
+          case 'mul':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a * b);
+            break;
+          case 'ne':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a != b);
+            break;
+          case 'neg':
+            a = stack.pop();
+            stack.push(-b);
+            break;
+          case 'not':
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a && b);
+            } else {
+              stack.push(a & b);
+            }
+            break;
+          case 'or':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a || b);
+            } else {
+              stack.push(a | b);
+            }
+            break;
+          case 'pop':
+            stack.pop();
+            break;
+          case 'roll':
+            b = stack.pop();
+            a = stack.pop();
+            stack.roll(a, b);
+            break;
+          case 'round':
+            a = stack.pop();
+            stack.push(Math.round(a));
+            break;
+          case 'sin':
+            a = stack.pop();
+            stack.push(Math.sin(a));
+            break;
+          case 'sqrt':
+            a = stack.pop();
+            stack.push(Math.sqrt(a));
+            break;
+          case 'sub':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a - b);
+            break;
+          case 'true':
+            stack.push(true);
+            break;
+          case 'truncate':
+            a = stack.pop();
+            a = a < 0 ? Math.ceil(a) : Math.floor(a);
+            stack.push(a);
+            break;
+          case 'xor':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a != b);
+            } else {
+              stack.push(a ^ b);
+            }
+            break;
+          default:
+            error('Unknown operator ' + operator);
+            break;
+        }
+      }
+      return stack.stack;
+    }
+  };
+  return PostScriptEvaluator;
+})();
+
+
+var DEFAULT_ICON_SIZE = 22; // px
+var HIGHLIGHT_OFFSET = 4; // px
+var SUPPORTED_TYPES = ['Link', 'Text', 'Widget'];
+
+var Annotation = (function AnnotationClosure() {
+  // 12.5.5: Algorithm: Appearance streams
+  function getTransformMatrix(rect, bbox, matrix) {
+    var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);
+    var minX = bounds[0];
+    var minY = bounds[1];
+    var maxX = bounds[2];
+    var maxY = bounds[3];
+
+    if (minX === maxX || minY === maxY) {
+      // From real-life file, bbox was [0, 0, 0, 0]. In this case,
+      // just apply the transform for rect
+      return [1, 0, 0, 1, rect[0], rect[1]];
+    }
+
+    var xRatio = (rect[2] - rect[0]) / (maxX - minX);
+    var yRatio = (rect[3] - rect[1]) / (maxY - minY);
+    return [
+      xRatio,
+      0,
+      0,
+      yRatio,
+      rect[0] - minX * xRatio,
+      rect[1] - minY * yRatio
+    ];
+  }
+
+  function getDefaultAppearance(dict) {
+    var appearanceState = dict.get('AP');
+    if (!isDict(appearanceState)) {
+      return;
+    }
+
+    var appearance;
+    var appearances = appearanceState.get('N');
+    if (isDict(appearances)) {
+      var as = dict.get('AS');
+      if (as && appearances.has(as.name)) {
+        appearance = appearances.get(as.name);
+      }
+    } else {
+      appearance = appearances;
+    }
+    return appearance;
+  }
+
+  function Annotation(params) {
+    if (params.data) {
+      this.data = params.data;
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data = {};
+
+    data.subtype = dict.get('Subtype').name;
+    var rect = dict.get('Rect') || [0, 0, 0, 0];
+    data.rect = Util.normalizeRect(rect);
+    data.annotationFlags = dict.get('F');
+
+    var color = dict.get('C');
+    if (isArray(color) && color.length === 3) {
+      // TODO(mack): currently only supporting rgb; need support different
+      // colorspaces
+      data.color = color;
+    } else {
+      data.color = [0, 0, 0];
+    }
+
+    // Some types of annotations have border style dict which has more
+    // info than the border array
+    if (dict.has('BS')) {
+      var borderStyle = dict.get('BS');
+      data.borderWidth = borderStyle.has('W') ? borderStyle.get('W') : 1;
+    } else {
+      var borderArray = dict.get('Border') || [0, 0, 1];
+      data.borderWidth = borderArray[2] || 0;
+
+      // TODO: implement proper support for annotations with line dash patterns.
+      var dashArray = borderArray[3];
+      if (data.borderWidth > 0 && dashArray && isArray(dashArray)) {
+        var dashArrayLength = dashArray.length;
+        if (dashArrayLength > 0) {
+          // According to the PDF specification: the elements in a dashArray
+          // shall be numbers that are nonnegative and not all equal to zero.
+          var isInvalid = false;
+          var numPositive = 0;
+          for (var i = 0; i < dashArrayLength; i++) {
+            var validNumber = (+dashArray[i] >= 0);
+            if (!validNumber) {
+              isInvalid = true;
+              break;
+            } else if (dashArray[i] > 0) {
+              numPositive++;
+            }
+          }
+          if (isInvalid || numPositive === 0) {
+            data.borderWidth = 0;
+          }
+        }
+      }
+    }
+
+    this.appearance = getDefaultAppearance(dict);
+    data.hasAppearance = !!this.appearance;
+    data.id = params.ref.num;
+  }
+
+  Annotation.prototype = {
+
+    getData: function Annotation_getData() {
+      return this.data;
+    },
+
+    hasHtml: function Annotation_hasHtml() {
+      return false;
+    },
+
+    getHtmlElement: function Annotation_getHtmlElement(commonObjs) {
+      throw new NotImplementedException(
+        'getHtmlElement() should be implemented in subclass');
+    },
+
+    // TODO(mack): Remove this, it's not really that helpful.
+    getEmptyContainer: function Annotation_getEmptyContainer(tagName, rect,
+                                                             borderWidth) {
+      assert(!isWorker,
+        'getEmptyContainer() should be called from main thread');
+
+      var bWidth = borderWidth || 0;
+
+      rect = rect || this.data.rect;
+      var element = document.createElement(tagName);
+      element.style.borderWidth = bWidth + 'px';
+      var width = rect[2] - rect[0] - 2 * bWidth;
+      var height = rect[3] - rect[1] - 2 * bWidth;
+      element.style.width = width + 'px';
+      element.style.height = height + 'px';
+      return element;
+    },
+
+    isInvisible: function Annotation_isInvisible() {
+      var data = this.data;
+      if (data && SUPPORTED_TYPES.indexOf(data.subtype) !== -1) {
+        return false;
+      } else {
+        return !!(data &&
+                  data.annotationFlags &&            // Default: not invisible
+                  data.annotationFlags & 0x1);       // Invisible
+      }
+    },
+
+    isViewable: function Annotation_isViewable() {
+      var data = this.data;
+      return !!(!this.isInvisible() &&
+                data &&
+                (!data.annotationFlags ||
+                 !(data.annotationFlags & 0x22)) &&  // Hidden or NoView
+                data.rect);                          // rectangle is nessessary
+    },
+
+    isPrintable: function Annotation_isPrintable() {
+      var data = this.data;
+      return !!(!this.isInvisible() &&
+                data &&
+                data.annotationFlags &&              // Default: not printable
+                data.annotationFlags & 0x4 &&        // Print
+                data.rect);                          // rectangle is nessessary
+    },
+
+    loadResources: function(keys) {
+      var promise = new LegacyPromise();
+      this.appearance.dict.getAsync('Resources').then(function(resources) {
+        if (!resources) {
+          promise.resolve();
+          return;
+        }
+        var objectLoader = new ObjectLoader(resources.map,
+                                            keys,
+                                            resources.xref);
+        objectLoader.load().then(function() {
+          promise.resolve(resources);
+        });
+      }.bind(this));
+
+      return promise;
+    },
+
+    getOperatorList: function Annotation_getOperatorList(evaluator) {
+
+      var promise = new LegacyPromise();
+
+      if (!this.appearance) {
+        promise.resolve(new OperatorList());
+        return promise;
+      }
+
+      var data = this.data;
+
+      var appearanceDict = this.appearance.dict;
+      var resourcesPromise = this.loadResources([
+        'ExtGState',
+        'ColorSpace',
+        'Pattern',
+        'Shading',
+        'XObject',
+        'Font'
+        // ProcSet
+        // Properties
+      ]);
+      var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1];
+      var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0];
+      var transform = getTransformMatrix(data.rect, bbox, matrix);
+
+      resourcesPromise.then(function(resources) {
+        var opList = new OperatorList();
+        opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]);
+        evaluator.getOperatorList(this.appearance, resources, opList);
+        opList.addOp(OPS.endAnnotation, []);
+        promise.resolve(opList);
+
+        this.appearance.reset();
+      }.bind(this));
+
+      return promise;
+    }
+  };
+
+  Annotation.getConstructor =
+      function Annotation_getConstructor(subtype, fieldType) {
+
+    if (!subtype) {
+      return;
+    }
+
+    // TODO(mack): Implement FreeText annotations
+    if (subtype === 'Link') {
+      return LinkAnnotation;
+    } else if (subtype === 'Text') {
+      return TextAnnotation;
+    } else if (subtype === 'Widget') {
+      if (!fieldType) {
+        return;
+      }
+
+      if (fieldType === 'Tx') {
+        return TextWidgetAnnotation;
+      } else {
+        return WidgetAnnotation;
+      }
+    } else {
+      return Annotation;
+    }
+  };
+
+  // TODO(mack): Support loading annotation from data
+  Annotation.fromData = function Annotation_fromData(data) {
+    var subtype = data.subtype;
+    var fieldType = data.fieldType;
+    var Constructor = Annotation.getConstructor(subtype, fieldType);
+    if (Constructor) {
+      return new Constructor({ data: data });
+    }
+  };
+
+  Annotation.fromRef = function Annotation_fromRef(xref, ref) {
+
+    var dict = xref.fetchIfRef(ref);
+    if (!isDict(dict)) {
+      return;
+    }
+
+    var subtype = dict.get('Subtype');
+    subtype = isName(subtype) ? subtype.name : '';
+    if (!subtype) {
+      return;
+    }
+
+    var fieldType = Util.getInheritableProperty(dict, 'FT');
+    fieldType = isName(fieldType) ? fieldType.name : '';
+
+    var Constructor = Annotation.getConstructor(subtype, fieldType);
+    if (!Constructor) {
+      return;
+    }
+
+    var params = {
+      dict: dict,
+      ref: ref,
+    };
+
+    var annotation = new Constructor(params);
+
+    if (annotation.isViewable() || annotation.isPrintable()) {
+      return annotation;
+    } else {
+      warn('unimplemented annotation type: ' + subtype);
+    }
+  };
+
+  Annotation.appendToOperatorList = function Annotation_appendToOperatorList(
+      annotations, opList, pdfManager, partialEvaluator, intent) {
+
+    function reject(e) {
+      annotationsReadyPromise.reject(e);
+    }
+
+    var annotationsReadyPromise = new LegacyPromise();
+
+    var annotationPromises = [];
+    for (var i = 0, n = annotations.length; i < n; ++i) {
+      if (intent === 'display' && annotations[i].isViewable() ||
+          intent === 'print' && annotations[i].isPrintable()) {
+        annotationPromises.push(
+          annotations[i].getOperatorList(partialEvaluator));
+      }
+    }
+    Promise.all(annotationPromises).then(function(datas) {
+      opList.addOp(OPS.beginAnnotations, []);
+      for (var i = 0, n = datas.length; i < n; ++i) {
+        var annotOpList = datas[i];
+        opList.addOpList(annotOpList);
+      }
+      opList.addOp(OPS.endAnnotations, []);
+      annotationsReadyPromise.resolve();
+    }, reject);
+
+    return annotationsReadyPromise;
+  };
+
+  return Annotation;
+})();
+PDFJS.Annotation = Annotation;
+
+
+var WidgetAnnotation = (function WidgetAnnotationClosure() {
+
+  function WidgetAnnotation(params) {
+    Annotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data;
+
+    data.fieldValue = stringToPDFString(
+      Util.getInheritableProperty(dict, 'V') || '');
+    data.alternativeText = stringToPDFString(dict.get('TU') || '');
+    data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || '';
+    var fieldType = Util.getInheritableProperty(dict, 'FT');
+    data.fieldType = isName(fieldType) ? fieldType.name : '';
+    data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0;
+    this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty;
+
+    // Building the full field name by collecting the field and
+    // its ancestors 'T' data and joining them using '.'.
+    var fieldName = [];
+    var namedItem = dict;
+    var ref = params.ref;
+    while (namedItem) {
+      var parent = namedItem.get('Parent');
+      var parentRef = namedItem.getRaw('Parent');
+      var name = namedItem.get('T');
+      if (name) {
+        fieldName.unshift(stringToPDFString(name));
+      } else {
+        // The field name is absent, that means more than one field
+        // with the same name may exist. Replacing the empty name
+        // with the '`' plus index in the parent's 'Kids' array.
+        // This is not in the PDF spec but necessary to id the
+        // the input controls.
+        var kids = parent.get('Kids');
+        var j, jj;
+        for (j = 0, jj = kids.length; j < jj; j++) {
+          var kidRef = kids[j];
+          if (kidRef.num == ref.num && kidRef.gen == ref.gen) {
+            break;
+          }
+        }
+        fieldName.unshift('`' + j);
+      }
+      namedItem = parent;
+      ref = parentRef;
+    }
+    data.fullName = fieldName.join('.');
+  }
+
+  var parent = Annotation.prototype;
+  Util.inherit(WidgetAnnotation, Annotation, {
+    isViewable: function WidgetAnnotation_isViewable() {
+      if (this.data.fieldType === 'Sig') {
+        warn('unimplemented annotation type: Widget signature');
+        return false;
+      }
+
+      return parent.isViewable.call(this);
+    }
+  });
+
+  return WidgetAnnotation;
+})();
+
+var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
+  function TextWidgetAnnotation(params) {
+    WidgetAnnotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q');
+  }
+
+  // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont()
+  function setTextStyles(element, item, fontObj) {
+
+    var style = element.style;
+    style.fontSize = item.fontSize + 'px';
+    style.direction = item.fontDirection < 0 ? 'rtl': 'ltr';
+
+    if (!fontObj) {
+      return;
+    }
+
+    style.fontWeight = fontObj.black ?
+                            (fontObj.bold ? 'bolder' : 'bold') :
+                            (fontObj.bold ? 'bold' : 'normal');
+    style.fontStyle = fontObj.italic ? 'italic' : 'normal';
+
+    var fontName = fontObj.loadedName;
+    var fontFamily = fontName ? '"' + fontName + '", ' : '';
+    // Use a reasonable default font if the font doesn't specify a fallback
+    var fallbackName = fontObj.fallbackName || 'Helvetica, sans-serif';
+    style.fontFamily = fontFamily + fallbackName;
+  }
+
+
+  Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {
+    hasHtml: function TextWidgetAnnotation_hasHtml() {
+      return !this.data.hasAppearance && !!this.data.fieldValue;
+    },
+
+    getHtmlElement: function TextWidgetAnnotation_getHtmlElement(commonObjs) {
+      assert(!isWorker, 'getHtmlElement() shall be called from main thread');
+
+      var item = this.data;
+
+      var element = this.getEmptyContainer('div');
+      element.style.display = 'table';
+
+      var content = document.createElement('div');
+      content.textContent = item.fieldValue;
+      var textAlignment = item.textAlignment;
+      content.style.textAlign = ['left', 'center', 'right'][textAlignment];
+      content.style.verticalAlign = 'middle';
+      content.style.display = 'table-cell';
+
+      var fontObj = item.fontRefName ?
+                    commonObjs.getData(item.fontRefName) : null;
+      setTextStyles(content, item, fontObj);
+
+      element.appendChild(content);
+
+      return element;
+    },
+
+    getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator) {
+      if (this.appearance) {
+        return Annotation.prototype.getOperatorList.call(this, evaluator);
+      }
+
+      var promise = new LegacyPromise();
+      var opList = new OperatorList();
+      var data = this.data;
+
+      // Even if there is an appearance stream, ignore it. This is the
+      // behaviour used by Adobe Reader.
+
+      var defaultAppearance = data.defaultAppearance;
+      if (!defaultAppearance) {
+        promise.resolve(opList);
+        return promise;
+      }
+
+      // Include any font resources found in the default appearance
+
+      var stream = new Stream(stringToBytes(defaultAppearance));
+      evaluator.getOperatorList(stream, this.fieldResources, opList);
+      var appearanceFnArray = opList.fnArray;
+      var appearanceArgsArray = opList.argsArray;
+      var fnArray = [];
+
+      // TODO(mack): Add support for stroke color
+      data.rgb = [0, 0, 0];
+      // TODO THIS DOESN'T MAKE ANY SENSE SINCE THE fnArray IS EMPTY!
+      for (var i = 0, n = fnArray.length; i < n; ++i) {
+        var fnId = appearanceFnArray[i];
+        var args = appearanceArgsArray[i];
+
+        if (fnId === OPS.setFont) {
+          data.fontRefName = args[0];
+          var size = args[1];
+          if (size < 0) {
+            data.fontDirection = -1;
+            data.fontSize = -size;
+          } else {
+            data.fontDirection = 1;
+            data.fontSize = size;
+          }
+        } else if (fnId === OPS.setFillRGBColor) {
+          data.rgb = args;
+        } else if (fnId === OPS.setFillGray) {
+          var rgbValue = args[0] * 255;
+          data.rgb = [rgbValue, rgbValue, rgbValue];
+        }
+      }
+      promise.resolve(opList);
+      return promise;
+    }
+  });
+
+  return TextWidgetAnnotation;
+})();
+
+var InteractiveAnnotation = (function InteractiveAnnotationClosure() {
+  function InteractiveAnnotation(params) {
+    Annotation.call(this, params);
+  }
+
+  Util.inherit(InteractiveAnnotation, Annotation, {
+    hasHtml: function InteractiveAnnotation_hasHtml() {
+      return true;
+    },
+
+    highlight: function InteractiveAnnotation_highlight() {
+      if (this.highlightElement &&
+         this.highlightElement.hasAttribute('hidden')) {
+        this.highlightElement.removeAttribute('hidden');
+      }
+    },
+
+    unhighlight: function InteractiveAnnotation_unhighlight() {
+      if (this.highlightElement &&
+         !this.highlightElement.hasAttribute('hidden')) {
+        this.highlightElement.setAttribute('hidden', true);
+      }
+    },
+
+    initContainer: function InteractiveAnnotation_initContainer() {
+
+      var item = this.data;
+      var rect = item.rect;
+
+      var container = this.getEmptyContainer('section', rect, item.borderWidth);
+      container.style.backgroundColor = item.color;
+
+      var color = item.color;
+      var rgb = [];
+      for (var i = 0; i < 3; ++i) {
+        rgb[i] = Math.round(color[i] * 255);
+      }
+      item.colorCssRgb = Util.makeCssRgb(rgb);
+
+      var highlight = document.createElement('div');
+      highlight.className = 'annotationHighlight';
+      highlight.style.left = highlight.style.top = -HIGHLIGHT_OFFSET + 'px';
+      highlight.style.right = highlight.style.bottom = -HIGHLIGHT_OFFSET + 'px';
+      highlight.setAttribute('hidden', true);
+
+      this.highlightElement = highlight;
+      container.appendChild(this.highlightElement);
+
+      return container;
+    }
+  });
+
+  return InteractiveAnnotation;
+})();
+
+var TextAnnotation = (function TextAnnotationClosure() {
+  function TextAnnotation(params) {
+    InteractiveAnnotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data;
+
+    var content = dict.get('Contents');
+    var title = dict.get('T');
+    data.content = stringToPDFString(content || '');
+    data.title = stringToPDFString(title || '');
+
+    if (data.hasAppearance) {
+      data.name = 'NoIcon';
+    } else {
+      data.rect[1] = data.rect[3] - DEFAULT_ICON_SIZE;
+      data.rect[2] = data.rect[0] + DEFAULT_ICON_SIZE;
+      data.name = dict.has('Name') ? dict.get('Name').name : 'Note';
+    }
+
+    if (dict.has('C')) {
+      data.hasBgColor = true;
+    }
+  }
+
+  var ANNOT_MIN_SIZE = 10;
+
+  Util.inherit(TextAnnotation, InteractiveAnnotation, {
+
+    getHtmlElement: function TextAnnotation_getHtmlElement(commonObjs) {
+      assert(!isWorker, 'getHtmlElement() shall be called from main thread');
+
+      var item = this.data;
+      var rect = item.rect;
+
+      // sanity check because of OOo-generated PDFs
+      if ((rect[3] - rect[1]) < ANNOT_MIN_SIZE) {
+        rect[3] = rect[1] + ANNOT_MIN_SIZE;
+      }
+      if ((rect[2] - rect[0]) < ANNOT_MIN_SIZE) {
+        rect[2] = rect[0] + (rect[3] - rect[1]); // make it square
+      }
+
+      var container = this.initContainer();
+      container.className = 'annotText';
+
+      var image  = document.createElement('img');
+      image.style.height = container.style.height;
+      image.style.width = container.style.width;
+      var iconName = item.name;
+      image.src = PDFJS.imageResourcesPath + 'annotation-' +
+        iconName.toLowerCase() + '.svg';
+      image.alt = '[{{type}} Annotation]';
+      image.dataset.l10nId = 'text_annotation_type';
+      image.dataset.l10nArgs = JSON.stringify({type: iconName});
+
+      var contentWrapper = document.createElement('div');
+      contentWrapper.className = 'annotTextContentWrapper';
+      contentWrapper.style.left = Math.floor(rect[2] - rect[0] + 5) + 'px';
+      contentWrapper.style.top = '-10px';
+
+      var content = document.createElement('div');
+      content.className = 'annotTextContent';
+      content.setAttribute('hidden', true);
+
+      var i, ii;
+      if (item.hasBgColor) {
+        var color = item.color;
+        var rgb = [];
+        for (i = 0; i < 3; ++i) {
+          // Enlighten the color (70%)
+          var c = Math.round(color[i] * 255);
+          rgb[i] = Math.round((255 - c) * 0.7) + c;
+        }
+        content.style.backgroundColor = Util.makeCssRgb(rgb);
+      }
+
+      var title = document.createElement('h1');
+      var text = document.createElement('p');
+      title.textContent = item.title;
+
+      if (!item.content && !item.title) {
+        content.setAttribute('hidden', true);
+      } else {
+        var e = document.createElement('span');
+        var lines = item.content.split(/(?:\r\n?|\n)/);
+        for (i = 0, ii = lines.length; i < ii; ++i) {
+          var line = lines[i];
+          e.appendChild(document.createTextNode(line));
+          if (i < (ii - 1)) {
+            e.appendChild(document.createElement('br'));
+          }
+        }
+        text.appendChild(e);
+
+        var pinned = false;
+
+        var showAnnotation = function showAnnotation(pin) {
+          if (pin) {
+            pinned = true;
+          }
+          if (content.hasAttribute('hidden')) {
+            container.style.zIndex += 1;
+            content.removeAttribute('hidden');
+          }
+        };
+
+        var hideAnnotation = function hideAnnotation(unpin) {
+          if (unpin) {
+            pinned = false;
+          }
+          if (!content.hasAttribute('hidden') && !pinned) {
+            container.style.zIndex -= 1;
+            content.setAttribute('hidden', true);
+          }
+        };
+
+        var toggleAnnotation = function toggleAnnotation() {
+          if (pinned) {
+            hideAnnotation(true);
+          } else {
+            showAnnotation(true);
+          }
+        };
+
+        image.addEventListener('click', function image_clickHandler() {
+          toggleAnnotation();
+        }, false);
+        image.addEventListener('mouseover', function image_mouseOverHandler() {
+          showAnnotation();
+        }, false);
+        image.addEventListener('mouseout', function image_mouseOutHandler() {
+          hideAnnotation();
+        }, false);
+
+        content.addEventListener('click', function content_clickHandler() {
+          hideAnnotation(true);
+        }, false);
+      }
+
+      content.appendChild(title);
+      content.appendChild(text);
+      contentWrapper.appendChild(content);
+      container.appendChild(image);
+      container.appendChild(contentWrapper);
+
+      return container;
+    }
+  });
+
+  return TextAnnotation;
+})();
+
+var LinkAnnotation = (function LinkAnnotationClosure() {
+  function LinkAnnotation(params) {
+    InteractiveAnnotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data;
+
+    var action = dict.get('A');
+    if (action) {
+      var linkType = action.get('S').name;
+      if (linkType === 'URI') {
+        var url = action.get('URI');
+        if (isName(url)) {
+          // Some bad PDFs do not put parentheses around relative URLs.
+          url = '/' + url.name;
+        } else if (url) {
+          url = addDefaultProtocolToUrl(url);
+        }
+        // TODO: pdf spec mentions urls can be relative to a Base
+        // entry in the dictionary.
+        if (!isValidUrl(url, false)) {
+          url = '';
+        }
+        data.url = url;
+      } else if (linkType === 'GoTo') {
+        data.dest = action.get('D');
+      } else if (linkType === 'GoToR') {
+        var urlDict = action.get('F');
+        if (isDict(urlDict)) {
+          // We assume that the 'url' is a Filspec dictionary
+          // and fetch the url without checking any further
+          url = urlDict.get('F') || '';
+        }
+
+        // TODO: pdf reference says that GoToR
+        // can also have 'NewWindow' attribute
+        if (!isValidUrl(url, false)) {
+          url = '';
+        }
+        data.url = url;
+        data.dest = action.get('D');
+      } else if (linkType === 'Named') {
+        data.action = action.get('N').name;
+      } else {
+        warn('unrecognized link type: ' + linkType);
+      }
+    } else if (dict.has('Dest')) {
+      // simple destination link
+      var dest = dict.get('Dest');
+      data.dest = isName(dest) ? dest.name : dest;
+    }
+  }
+
+  // Lets URLs beginning with 'www.' default to using the 'http://' protocol.
+  function addDefaultProtocolToUrl(url) {
+    if (url && url.indexOf('www.') === 0) {
+      return ('http://' + url);
+    }
+    return url;
+  }
+
+  Util.inherit(LinkAnnotation, InteractiveAnnotation, {
+    hasOperatorList: function LinkAnnotation_hasOperatorList() {
+      return false;
+    },
+
+    getHtmlElement: function LinkAnnotation_getHtmlElement(commonObjs) {
+
+      var container = this.initContainer();
+      container.className = 'annotLink';
+
+      var item = this.data;
+
+      container.style.borderColor = item.colorCssRgb;
+      container.style.borderStyle = 'solid';
+
+      var link = document.createElement('a');
+      link.href = link.title = this.data.url || '';
+
+      container.appendChild(link);
+
+      return container;
+    }
+  });
+
+  return LinkAnnotation;
+})();
+
+
+/**
+ * The maximum allowed image size in total pixels e.g. width * height. Images
+ * above this value will not be drawn. Use -1 for no limit.
+ * @var {number}
+ */
+PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ?
+                      -1 : PDFJS.maxImageSize);
+
+/**
+ * The url of where the predefined Adobe CMaps are located. Include trailing
+ * slash.
+ * @var {string}
+ */
+PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl);
+
+/**
+ * Specifies if CMaps are binary packed.
+ * @var {boolean}
+ */
+PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;
+
+/*
+ * By default fonts are converted to OpenType fonts and loaded via font face
+ * rules. If disabled, the font will be rendered using a built in font renderer
+ * that constructs the glyphs with primitive path commands.
+ * @var {boolean}
+ */
+PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ?
+                         false : PDFJS.disableFontFace);
+
+/**
+ * Path for image resources, mainly for annotation icons. Include trailing
+ * slash.
+ * @var {string}
+ */
+PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ?
+                            '' : PDFJS.imageResourcesPath);
+
+/**
+ * Disable the web worker and run all code on the main thread. This will happen
+ * automatically if the browser doesn't support workers or sending typed arrays
+ * to workers.
+ * @var {boolean}
+ */
+PDFJS.disableWorker = (PDFJS.disableWorker === undefined ?
+                       false : PDFJS.disableWorker);
+
+/**
+ * Path and filename of the worker file. Required when the worker is enabled in
+ * development mode. If unspecified in the production build, the worker will be
+ * loaded based on the location of the pdf.js file.
+ * @var {string}
+ */
+PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);
+
+/**
+ * Disable range request loading of PDF files. When enabled and if the server
+ * supports partial content requests then the PDF will be fetched in chunks.
+ * Enabled (false) by default.
+ * @var {boolean}
+ */
+PDFJS.disableRange = (PDFJS.disableRange === undefined ?
+                      false : PDFJS.disableRange);
+
+/**
+ * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js
+ * will automatically keep fetching more data even if it isn't needed to display
+ * the current page. This default behavior can be disabled.
+ * @var {boolean}
+ */
+PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ?
+                          false : PDFJS.disableAutoFetch);
+
+/**
+ * Enables special hooks for debugging PDF.js.
+ * @var {boolean}
+ */
+PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug);
+
+/**
+ * Enables transfer usage in postMessage for ArrayBuffers.
+ * @var {boolean}
+ */
+PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ?
+                              true : PDFJS.postMessageTransfers);
+
+/**
+ * Disables URL.createObjectURL usage.
+ * @var {boolean}
+ */
+PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ?
+                                false : PDFJS.disableCreateObjectURL);
+
+/**
+ * Disables WebGL usage.
+ * @var {boolean}
+ */
+PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ?
+                      true : PDFJS.disableWebGL);
+
+/**
+ * Controls the logging level.
+ * The constants from PDFJS.VERBOSITY_LEVELS should be used:
+ * - errors
+ * - warnings [default]
+ * - infos
+ * @var {number}
+ */
+PDFJS.verbosity = (PDFJS.verbosity === undefined ?
+                   PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);
+
+/**
+ * Document initialization / loading parameters object.
+ *
+ * @typedef {Object} DocumentInitParameters
+ * @property {string}     url   - The URL of the PDF.
+ * @property {TypedArray} data  - A typed array with PDF data.
+ * @property {Object}     httpHeaders - Basic authentication headers.
+ * @property {boolean}    withCredentials - Indicates whether or not cross-site
+ *   Access-Control requests should be made using credentials such as cookies
+ *   or authorization headers. The default is false.
+ * @property {string}     password - For decrypting password-protected PDFs.
+ * @property {TypedArray} initialData - A typed array with the first portion or
+ *   all of the pdf data. Used by the extension since some data is already
+ *   loaded before the switch to range requests.
+ */
+
+/**
+ * This is the main entry point for loading a PDF and interacting with it.
+ * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
+ * is used, which means it must follow the same origin rules that any XHR does
+ * e.g. No cross domain requests without CORS.
+ *
+ * @param {string|TypedArray|DocumentInitParameters} source Can be a url to
+ * where a PDF is located, a typed array (Uint8Array) already populated with
+ * data or parameter object.
+ *
+ * @param {Object} pdfDataRangeTransport is optional. It is used if you want
+ * to manually serve range requests for data in the PDF. See viewer.js for
+ * an example of pdfDataRangeTransport's interface.
+ *
+ * @param {function} passwordCallback is optional. It is used to request a
+ * password if wrong or no password was provided. The callback receives two
+ * parameters: function that needs to be called with new password and reason
+ * (see {PasswordResponses}).
+ *
+ * @return {Promise} A promise that is resolved with {@link PDFDocumentProxy}
+ *   object.
+ */
+PDFJS.getDocument = function getDocument(source,
+                                         pdfDataRangeTransport,
+                                         passwordCallback,
+                                         progressCallback) {
+  var workerInitializedPromise, workerReadyPromise, transport;
+
+  if (typeof source === 'string') {
+    source = { url: source };
+  } else if (isArrayBuffer(source)) {
+    source = { data: source };
+  } else if (typeof source !== 'object') {
+    error('Invalid parameter in getDocument, need either Uint8Array, ' +
+          'string or a parameter object');
+  }
+
+  if (!source.url && !source.data) {
+    error('Invalid parameter array, need either .data or .url');
+  }
+
+  // copy/use all keys as is except 'url' -- full path is required
+  var params = {};
+  for (var key in source) {
+    if (key === 'url' && typeof window !== 'undefined') {
+      params[key] = combineUrl(window.location.href, source[key]);
+      continue;
+    }
+    params[key] = source[key];
+  }
+
+  workerInitializedPromise = new PDFJS.LegacyPromise();
+  workerReadyPromise = new PDFJS.LegacyPromise();
+  transport = new WorkerTransport(workerInitializedPromise, workerReadyPromise,
+                                  pdfDataRangeTransport, progressCallback);
+  workerInitializedPromise.then(function transportInitialized() {
+    transport.passwordCallback = passwordCallback;
+    transport.fetchDocument(params);
+  });
+  return workerReadyPromise;
+};
+
+/**
+ * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
+ * properties that can be read synchronously.
+ * @class
+ */
+var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
+  function PDFDocumentProxy(pdfInfo, transport) {
+    this.pdfInfo = pdfInfo;
+    this.transport = transport;
+  }
+  PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {
+    /**
+     * @return {number} Total number of pages the PDF contains.
+     */
+    get numPages() {
+      return this.pdfInfo.numPages;
+    },
+    /**
+     * @return {string} A unique ID to identify a PDF. Not guaranteed to be
+     * unique.
+     */
+    get fingerprint() {
+      return this.pdfInfo.fingerprint;
+    },
+    /**
+     * @param {number} pageNumber The page number to get. The first page is 1.
+     * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}
+     * object.
+     */
+    getPage: function PDFDocumentProxy_getPage(pageNumber) {
+      return this.transport.getPage(pageNumber);
+    },
+    /**
+     * @param {{num: number, gen: number}} ref The page reference. Must have
+     *   the 'num' and 'gen' properties.
+     * @return {Promise} A promise that is resolved with the page index that is
+     * associated with the reference.
+     */
+    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {
+      return this.transport.getPageIndex(ref);
+    },
+    /**
+     * @return {Promise} A promise that is resolved with a lookup table for
+     * mapping named destinations to reference numbers.
+     */
+    getDestinations: function PDFDocumentProxy_getDestinations() {
+      return this.transport.getDestinations();
+    },
+    /**
+     * @return {Promise} A promise that is resolved with a lookup table for
+     * mapping named attachments to their content.
+     */
+    getAttachments: function PDFDocumentProxy_getAttachments() {
+      return this.transport.getAttachments();
+    },
+    /**
+     * @return {Promise} A promise that is resolved with an array of all the
+     * JavaScript strings in the name tree.
+     */
+    getJavaScript: function PDFDocumentProxy_getJavaScript() {
+      var promise = new PDFJS.LegacyPromise();
+      var js = this.pdfInfo.javaScript;
+      promise.resolve(js);
+      return promise;
+    },
+    /**
+     * @return {Promise} A promise that is resolved with an {Array} that is a
+     * tree outline (if it has one) of the PDF. The tree is in the format of:
+     * [
+     *  {
+     *   title: string,
+     *   bold: boolean,
+     *   italic: boolean,
+     *   color: rgb array,
+     *   dest: dest obj,
+     *   items: array of more items like this
+     *  },
+     *  ...
+     * ].
+     */
+    getOutline: function PDFDocumentProxy_getOutline() {
+      var promise = new PDFJS.LegacyPromise();
+      var outline = this.pdfInfo.outline;
+      promise.resolve(outline);
+      return promise;
+    },
+    /**
+     * @return {Promise} A promise that is resolved with an {Object} that has
+     * info and metadata properties.  Info is an {Object} filled with anything
+     * available in the information dictionary and similarly metadata is a
+     * {Metadata} object with information from the metadata section of the PDF.
+     */
+    getMetadata: function PDFDocumentProxy_getMetadata() {
+      var promise = new PDFJS.LegacyPromise();
+      var info = this.pdfInfo.info;
+      var metadata = this.pdfInfo.metadata;
+      promise.resolve({
+        info: info,
+        metadata: (metadata ? new PDFJS.Metadata(metadata) : null)
+      });
+      return promise;
+    },
+    /**
+     * @return {Promise} A promise that is resolved with a TypedArray that has
+     * the raw data from the PDF.
+     */
+    getData: function PDFDocumentProxy_getData() {
+      var promise = new PDFJS.LegacyPromise();
+      this.transport.getData(promise);
+      return promise;
+    },
+    /**
+     * @return {Promise} A promise that is resolved when the document's data
+     * is loaded. It is resolved with an {Object} that contains the length
+     * property that indicates size of the PDF data in bytes.
+     */
+    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {
+      return this.transport.downloadInfoPromise;
+    },
+    /**
+     * Cleans up resources allocated by the document, e.g. created @font-face.
+     */
+    cleanup: function PDFDocumentProxy_cleanup() {
+      this.transport.startCleanup();
+    },
+    /**
+     * Destroys current document instance and terminates worker.
+     */
+    destroy: function PDFDocumentProxy_destroy() {
+      this.transport.destroy();
+    }
+  };
+  return PDFDocumentProxy;
+})();
+
+/**
+ * Page text content.
+ *
+ * @typedef {Object} TextContent
+ * @property {array} items - array of {@link TextItem}
+ * @property {Object} styles - {@link TextStyles} objects, indexed by font
+ *                    name.
+ */
+
+/**
+ * Page text content part.
+ *
+ * @typedef {Object} TextItem
+ * @property {string} str - text content.
+ * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.
+ * @property {array} transform - transformation matrix.
+ * @property {number} width - width in device space.
+ * @property {number} height - height in device space.
+ * @property {string} fontName - font name used by pdf.js for converted font.
+ */
+
+/**
+ * Text style.
+ *
+ * @typedef {Object} TextStyle
+ * @property {number} ascent - font ascent.
+ * @property {number} descent - font descent.
+ * @property {boolean} vertical - text is in vertical mode.
+ * @property {string} fontFamily - possible font family
+ */
+
+/**
+ * Page render parameters.
+ *
+ * @typedef {Object} RenderParameters
+ * @property {Object} canvasContext - A 2D context of a DOM Canvas object.
+ * @property {PageViewport} viewport - Rendering viewport obtained by
+ *                          calling of PDFPage.getViewport method.
+ * @property {string} intent - Rendering intent, can be 'display' or 'print'
+ *                    (default value is 'display').
+ * @property {Object} imageLayer - (optional) An object that has beginLayout,
+ *                    endLayout and appendImage functions.
+ * @property {function} continueCallback - (optional) A function that will be
+ *                      called each time the rendering is paused.  To continue
+ *                      rendering call the function that is the first argument
+ *                      to the callback.
+ */
+
+/**
+ * Proxy to a PDFPage in the worker thread.
+ * @class
+ */
+var PDFPageProxy = (function PDFPageProxyClosure() {
+  function PDFPageProxy(pageInfo, transport) {
+    this.pageInfo = pageInfo;
+    this.transport = transport;
+    this.stats = new StatTimer();
+    this.stats.enabled = !!globalScope.PDFJS.enableStats;
+    this.commonObjs = transport.commonObjs;
+    this.objs = new PDFObjects();
+    this.cleanupAfterRender = false;
+    this.pendingDestroy = false;
+    this.intentStates = {};
+  }
+  PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {
+    /**
+     * @return {number} Page number of the page. First page is 1.
+     */
+    get pageNumber() {
+      return this.pageInfo.pageIndex + 1;
+    },
+    /**
+     * @return {number} The number of degrees the page is rotated clockwise.
+     */
+    get rotate() {
+      return this.pageInfo.rotate;
+    },
+    /**
+     * @return {Object} The reference that points to this page. It has 'num' and
+     * 'gen' properties.
+     */
+    get ref() {
+      return this.pageInfo.ref;
+    },
+    /**
+     * @return {Array} An array of the visible portion of the PDF page in the
+     * user space units - [x1, y1, x2, y2].
+     */
+    get view() {
+      return this.pageInfo.view;
+    },
+    /**
+     * @param {number} scale The desired scale of the viewport.
+     * @param {number} rotate Degrees to rotate the viewport. If omitted this
+     * defaults to the page rotation.
+     * @return {PageViewport} Contains 'width' and 'height' properties along
+     * with transforms required for rendering.
+     */
+    getViewport: function PDFPageProxy_getViewport(scale, rotate) {
+      if (arguments.length < 2) {
+        rotate = this.rotate;
+      }
+      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
+    },
+    /**
+     * @return {Promise} A promise that is resolved with an {Array} of the
+     * annotation objects.
+     */
+    getAnnotations: function PDFPageProxy_getAnnotations() {
+      if (this.annotationsPromise) {
+        return this.annotationsPromise;
+      }
+
+      var promise = new PDFJS.LegacyPromise();
+      this.annotationsPromise = promise;
+      this.transport.getAnnotations(this.pageInfo.pageIndex);
+      return promise;
+    },
+    /**
+     * Begins the process of rendering a page to the desired context.
+     * @param {RenderParameters} params Page render parameters.
+     * @return {RenderTask} An object that contains the promise, which
+     *                      is resolved when the page finishes rendering.
+     */
+    render: function PDFPageProxy_render(params) {
+      var stats = this.stats;
+      stats.time('Overall');
+
+      // If there was a pending destroy cancel it so no cleanup happens during
+      // this call to render.
+      this.pendingDestroy = false;
+
+      var renderingIntent = ('intent' in params ?
+        (params.intent == 'print' ? 'print' : 'display') : 'display');
+
+      if (!this.intentStates[renderingIntent]) {
+        this.intentStates[renderingIntent] = {};
+      }
+      var intentState = this.intentStates[renderingIntent];
+
+      // If there is no displayReadyPromise yet, then the operatorList was never
+      // requested before. Make the request and create the promise.
+      if (!intentState.displayReadyPromise) {
+        intentState.receivingOperatorList = true;
+        intentState.displayReadyPromise = new LegacyPromise();
+        intentState.operatorList = {
+          fnArray: [],
+          argsArray: [],
+          lastChunk: false
+        };
+
+        this.stats.time('Page Request');
+        this.transport.messageHandler.send('RenderPageRequest', {
+          pageIndex: this.pageNumber - 1,
+          intent: renderingIntent
+        });
+      }
+
+      var internalRenderTask = new InternalRenderTask(complete, params,
+                                                      this.objs,
+                                                      this.commonObjs,
+                                                      intentState.operatorList,
+                                                      this.pageNumber);
+      if (!intentState.renderTasks) {
+        intentState.renderTasks = [];
+      }
+      intentState.renderTasks.push(internalRenderTask);
+      var renderTask = new RenderTask(internalRenderTask);
+
+      var self = this;
+      intentState.displayReadyPromise.then(
+        function pageDisplayReadyPromise(transparency) {
+          if (self.pendingDestroy) {
+            complete();
+            return;
+          }
+          stats.time('Rendering');
+          internalRenderTask.initalizeGraphics(transparency);
+          internalRenderTask.operatorListChanged();
+        },
+        function pageDisplayReadPromiseError(reason) {
+          complete(reason);
+        }
+      );
+
+      function complete(error) {
+        var i = intentState.renderTasks.indexOf(internalRenderTask);
+        if (i >= 0) {
+          intentState.renderTasks.splice(i, 1);
+        }
+
+        if (self.cleanupAfterRender) {
+          self.pendingDestroy = true;
+        }
+        self._tryDestroy();
+
+        if (error) {
+          renderTask.promise.reject(error);
+        } else {
+          renderTask.promise.resolve();
+        }
+        stats.timeEnd('Rendering');
+        stats.timeEnd('Overall');
+      }
+
+      return renderTask;
+    },
+    /**
+     * @return {Promise} That is resolved a {@link TextContent}
+     * object that represent the page text content.
+     */
+    getTextContent: function PDFPageProxy_getTextContent() {
+      var promise = new PDFJS.LegacyPromise();
+      this.transport.messageHandler.send('GetTextContent', {
+          pageIndex: this.pageNumber - 1
+        },
+        function textContentCallback(textContent) {
+          promise.resolve(textContent);
+        }
+      );
+      return promise;
+    },
+    /**
+     * Destroys resources allocated by the page.
+     */
+    destroy: function PDFPageProxy_destroy() {
+      this.pendingDestroy = true;
+      this._tryDestroy();
+    },
+    /**
+     * For internal use only. Attempts to clean up if rendering is in a state
+     * where that's possible.
+     * @ignore
+     */
+    _tryDestroy: function PDFPageProxy__destroy() {
+      if (!this.pendingDestroy ||
+          Object.keys(this.intentStates).some(function(intent) {
+            var intentState = this.intentStates[intent];
+            return (intentState.renderTasks.length !== 0 ||
+                    intentState.receivingOperatorList);
+          }, this)) {
+        return;
+      }
+
+      Object.keys(this.intentStates).forEach(function(intent) {
+        delete this.intentStates[intent];
+      }, this);
+      this.objs.clear();
+      this.pendingDestroy = false;
+    },
+    /**
+     * For internal use only.
+     * @ignore
+     */
+    _startRenderPage: function PDFPageProxy_startRenderPage(transparency,
+                                                            intent) {
+      var intentState = this.intentStates[intent];
+      intentState.displayReadyPromise.resolve(transparency);
+    },
+    /**
+     * For internal use only.
+     * @ignore
+     */
+    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,
+                                                            intent) {
+      var intentState = this.intentStates[intent];
+      var i, ii;
+      // Add the new chunk to the current operator list.
+      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
+        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
+        intentState.operatorList.argsArray.push(
+          operatorListChunk.argsArray[i]);
+      }
+      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
+
+      // Notify all the rendering tasks there are more operators to be consumed.
+      for (i = 0; i < intentState.renderTasks.length; i++) {
+        intentState.renderTasks[i].operatorListChanged();
+      }
+
+      if (operatorListChunk.lastChunk) {
+        intentState.receivingOperatorList = false;
+        this._tryDestroy();
+      }
+    }
+  };
+  return PDFPageProxy;
+})();
+
+/**
+ * For internal use only.
+ * @ignore
+ */
+var WorkerTransport = (function WorkerTransportClosure() {
+  function WorkerTransport(workerInitializedPromise, workerReadyPromise,
+                           pdfDataRangeTransport, progressCallback) {
+    this.pdfDataRangeTransport = pdfDataRangeTransport;
+
+    this.workerReadyPromise = workerReadyPromise;
+    this.progressCallback = progressCallback;
+    this.commonObjs = new PDFObjects();
+
+    this.pageCache = [];
+    this.pagePromises = [];
+    this.downloadInfoPromise = new PDFJS.LegacyPromise();
+    this.passwordCallback = null;
+
+    // If worker support isn't disabled explicit and the browser has worker
+    // support, create a new web worker and test if it/the browser fullfills
+    // all requirements to run parts of pdf.js in a web worker.
+    // Right now, the requirement is, that an Uint8Array is still an Uint8Array
+    // as it arrives on the worker. Chrome added this with version 15.
+    if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
+      var workerSrc = PDFJS.workerSrc;
+      if (!workerSrc) {
+        error('No PDFJS.workerSrc specified');
+      }
+
+      try {
+        // Some versions of FF can't create a worker on localhost, see:
+        // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
+        var worker = new Worker(workerSrc);
+        var messageHandler = new MessageHandler('main', worker);
+        this.messageHandler = messageHandler;
+
+        messageHandler.on('test', function transportTest(data) {
+          var supportTypedArray = data && data.supportTypedArray;
+          if (supportTypedArray) {
+            this.worker = worker;
+            if (!data.supportTransfers) {
+              PDFJS.postMessageTransfers = false;
+            }
+            this.setupMessageHandler(messageHandler);
+            workerInitializedPromise.resolve();
+          } else {
+            globalScope.PDFJS.disableWorker = true;
+            this.loadFakeWorkerFiles().then(function() {
+              this.setupFakeWorker();
+              workerInitializedPromise.resolve();
+            }.bind(this));
+          }
+        }.bind(this));
+
+        var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]);
+        // Some versions of Opera throw a DATA_CLONE_ERR on serializing the
+        // typed array. Also, checking if we can use transfers.
+        try {
+          messageHandler.send('test', testObj, null, [testObj.buffer]);
+        } catch (ex) {
+          info('Cannot use postMessage transfers');
+          testObj[0] = 0;
+          messageHandler.send('test', testObj);
+        }
+        return;
+      } catch (e) {
+        info('The worker has been disabled.');
+      }
+    }
+    // Either workers are disabled, not supported or have thrown an exception.
+    // Thus, we fallback to a faked worker.
+    globalScope.PDFJS.disableWorker = true;
+    this.loadFakeWorkerFiles().then(function() {
+      this.setupFakeWorker();
+      workerInitializedPromise.resolve();
+    }.bind(this));
+  }
+  WorkerTransport.prototype = {
+    destroy: function WorkerTransport_destroy() {
+      this.pageCache = [];
+      this.pagePromises = [];
+      var self = this;
+      this.messageHandler.send('Terminate', null, function () {
+        FontLoader.clear();
+        if (self.worker) {
+          self.worker.terminate();
+        }
+      });
+    },
+
+    loadFakeWorkerFiles: function WorkerTransport_loadFakeWorkerFiles() {
+      if (!PDFJS.fakeWorkerFilesLoadedPromise) {
+        PDFJS.fakeWorkerFilesLoadedPromise = new LegacyPromise();
+        // In the developer build load worker_loader which in turn loads all the
+        // other files and resolves the promise. In production only the
+        // pdf.worker.js file is needed.
+        Util.loadScript(PDFJS.workerSrc, function() {
+          PDFJS.fakeWorkerFilesLoadedPromise.resolve();
+        });
+      }
+      return PDFJS.fakeWorkerFilesLoadedPromise;
+    },
+
+    setupFakeWorker: function WorkerTransport_setupFakeWorker() {
+      warn('Setting up fake worker.');
+      // If we don't use a worker, just post/sendMessage to the main thread.
+      var fakeWorker = {
+        postMessage: function WorkerTransport_postMessage(obj) {
+          fakeWorker.onmessage({data: obj});
+        },
+        terminate: function WorkerTransport_terminate() {}
+      };
+
+      var messageHandler = new MessageHandler('main', fakeWorker);
+      this.setupMessageHandler(messageHandler);
+
+      // If the main thread is our worker, setup the handling for the messages
+      // the main thread sends to it self.
+      PDFJS.WorkerMessageHandler.setup(messageHandler);
+    },
+
+    setupMessageHandler:
+      function WorkerTransport_setupMessageHandler(messageHandler) {
+      this.messageHandler = messageHandler;
+
+      function updatePassword(password) {
+        messageHandler.send('UpdatePassword', password);
+      }
+
+      var pdfDataRangeTransport = this.pdfDataRangeTransport;
+      if (pdfDataRangeTransport) {
+        pdfDataRangeTransport.addRangeListener(function(begin, chunk) {
+          messageHandler.send('OnDataRange', {
+            begin: begin,
+            chunk: chunk
+          });
+        });
+
+        pdfDataRangeTransport.addProgressListener(function(loaded) {
+          messageHandler.send('OnDataProgress', {
+            loaded: loaded
+          });
+        });
+
+        messageHandler.on('RequestDataRange',
+          function transportDataRange(data) {
+            pdfDataRangeTransport.requestDataRange(data.begin, data.end);
+          }, this);
+      }
+
+      messageHandler.on('GetDoc', function transportDoc(data) {
+        var pdfInfo = data.pdfInfo;
+        this.numPages = data.pdfInfo.numPages;
+        var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
+        this.pdfDocument = pdfDocument;
+        this.workerReadyPromise.resolve(pdfDocument);
+      }, this);
+
+      messageHandler.on('NeedPassword', function transportPassword(data) {
+        if (this.passwordCallback) {
+          return this.passwordCallback(updatePassword,
+                                       PasswordResponses.NEED_PASSWORD);
+        }
+        this.workerReadyPromise.reject(data.exception.information, data.exception);
+      }, this);
+
+      messageHandler.on('IncorrectPassword', function transportBadPass(data) {
+        if (this.passwordCallback) {
+          return this.passwordCallback(updatePassword,
+                                       PasswordResponses.INCORRECT_PASSWORD);
+        }
+        this.workerReadyPromise.reject(data.exception.information, data.exception);
+      }, this);
+
+      messageHandler.on('InvalidPDF', function transportInvalidPDF(data) {
+        this.workerReadyPromise.reject(data.exception.name, data.exception);
+      }, this);
+
+      messageHandler.on('MissingPDF', function transportMissingPDF(data) {
+        this.workerReadyPromise.reject(data.exception.information, data.exception);
+      }, this);
+
+      messageHandler.on('UnknownError', function transportUnknownError(data) {
+        this.workerReadyPromise.reject(data.exception.information, data.exception);
+      }, this);
+
+      messageHandler.on('DataLoaded', function transportPage(data) {
+        this.downloadInfoPromise.resolve(data);
+      }, this);
+
+      messageHandler.on('GetPage', function transportPage(data) {
+        var pageInfo = data.pageInfo;
+        var page = new PDFPageProxy(pageInfo, this);
+        this.pageCache[pageInfo.pageIndex] = page;
+        var promise = this.pagePromises[pageInfo.pageIndex];
+        promise.resolve(page);
+      }, this);
+
+      messageHandler.on('GetAnnotations', function transportAnnotations(data) {
+        var annotations = data.annotations;
+        var promise = this.pageCache[data.pageIndex].annotationsPromise;
+        promise.resolve(annotations);
+      }, this);
+
+      messageHandler.on('StartRenderPage', function transportRender(data) {
+        var page = this.pageCache[data.pageIndex];
+
+        page.stats.timeEnd('Page Request');
+        page._startRenderPage(data.transparency, data.intent);
+      }, this);
+
+      messageHandler.on('RenderPageChunk', function transportRender(data) {
+        var page = this.pageCache[data.pageIndex];
+
+        page._renderPageChunk(data.operatorList, data.intent);
+      }, this);
+
+      messageHandler.on('commonobj', function transportObj(data) {
+        var id = data[0];
+        var type = data[1];
+        if (this.commonObjs.hasData(id)) {
+          return;
+        }
+
+        switch (type) {
+          case 'Font':
+            var exportedData = data[2];
+
+            var font;
+            if ('error' in exportedData) {
+              var error = exportedData.error;
+              warn('Error during font loading: ' + error);
+              this.commonObjs.resolve(id, error);
+              break;
+            } else {
+              font = new FontFace(exportedData);
+            }
+
+            FontLoader.bind(
+              [font],
+              function fontReady(fontObjs) {
+                this.commonObjs.resolve(id, font);
+              }.bind(this)
+            );
+            break;
+          case 'FontPath':
+            this.commonObjs.resolve(id, data[2]);
+            break;
+          default:
+            error('Got unknown common object type ' + type);
+        }
+      }, this);
+
+      messageHandler.on('obj', function transportObj(data) {
+        var id = data[0];
+        var pageIndex = data[1];
+        var type = data[2];
+        var pageProxy = this.pageCache[pageIndex];
+        var imageData;
+        if (pageProxy.objs.hasData(id)) {
+          return;
+        }
+
+        switch (type) {
+          case 'JpegStream':
+            imageData = data[3];
+            loadJpegStream(id, imageData, pageProxy.objs);
+            break;
+          case 'Image':
+            imageData = data[3];
+            pageProxy.objs.resolve(id, imageData);
+
+            // heuristics that will allow not to store large data
+            var MAX_IMAGE_SIZE_TO_STORE = 8000000;
+            if (imageData && 'data' in imageData &&
+                imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
+              pageProxy.cleanupAfterRender = true;
+            }
+            break;
+          default:
+            error('Got unknown object type ' + type);
+        }
+      }, this);
+
+      messageHandler.on('DocProgress', function transportDocProgress(data) {
+        if (this.progressCallback) {
+          this.progressCallback({
+            loaded: data.loaded,
+            total: data.total
+          });
+        }
+      }, this);
+
+      messageHandler.on('DocError', function transportDocError(data) {
+        this.workerReadyPromise.reject(data);
+      }, this);
+
+      messageHandler.on('PageError', function transportError(data, intent) {
+        var page = this.pageCache[data.pageNum - 1];
+        var intentState = page.intentStates[intent];
+        if (intentState.displayReadyPromise) {
+          intentState.displayReadyPromise.reject(data.error);
+        } else {
+          error(data.error);
+        }
+      }, this);
+
+      messageHandler.on('JpegDecode', function(data, deferred) {
+        var imageUrl = data[0];
+        var components = data[1];
+        if (components != 3 && components != 1) {
+          error('Only 3 component or 1 component can be returned');
+        }
+
+        var img = new Image();
+        img.onload = (function messageHandler_onloadClosure() {
+          var width = img.width;
+          var height = img.height;
+          var size = width * height;
+          var rgbaLength = size * 4;
+          var buf = new Uint8Array(size * components);
+          var tmpCanvas = createScratchCanvas(width, height);
+          var tmpCtx = tmpCanvas.getContext('2d');
+          tmpCtx.drawImage(img, 0, 0);
+          var data = tmpCtx.getImageData(0, 0, width, height).data;
+          var i, j;
+
+          if (components == 3) {
+            for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
+              buf[j] = data[i];
+              buf[j + 1] = data[i + 1];
+              buf[j + 2] = data[i + 2];
+            }
+          } else if (components == 1) {
+            for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
+              buf[j] = data[i];
+            }
+          }
+          deferred.resolve({ data: buf, width: width, height: height});
+        }).bind(this);
+        img.src = imageUrl;
+      });
+    },
+
+    fetchDocument: function WorkerTransport_fetchDocument(source) {
+      source.disableAutoFetch = PDFJS.disableAutoFetch;
+      source.chunkedViewerLoading = !!this.pdfDataRangeTransport;
+      this.messageHandler.send('GetDocRequest', {
+        source: source,
+        disableRange: PDFJS.disableRange,
+        maxImageSize: PDFJS.maxImageSize,
+        cMapUrl: PDFJS.cMapUrl,
+        cMapPacked: PDFJS.cMapPacked,
+        disableFontFace: PDFJS.disableFontFace,
+        disableCreateObjectURL: PDFJS.disableCreateObjectURL,
+        verbosity: PDFJS.verbosity
+      });
+    },
+
+    getData: function WorkerTransport_getData(promise) {
+      this.messageHandler.send('GetData', null, function(data) {
+        promise.resolve(data);
+      });
+    },
+
+    getPage: function WorkerTransport_getPage(pageNumber, promise) {
+      if (pageNumber <= 0 || pageNumber > this.numPages ||
+          (pageNumber|0) !== pageNumber) {
+        var pagePromise = new PDFJS.LegacyPromise();
+        pagePromise.reject(new Error('Invalid page request'));
+        return pagePromise;
+      }
+
+      var pageIndex = pageNumber - 1;
+      if (pageIndex in this.pagePromises) {
+        return this.pagePromises[pageIndex];
+      }
+      promise = new PDFJS.LegacyPromise();
+      this.pagePromises[pageIndex] = promise;
+      this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
+      return promise;
+    },
+
+    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
+      var promise = new PDFJS.LegacyPromise();
+      this.messageHandler.send('GetPageIndex', { ref: ref },
+        function (pageIndex) {
+          promise.resolve(pageIndex);
+        }
+      );
+      return promise;
+    },
+
+    getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
+      this.messageHandler.send('GetAnnotationsRequest',
+        { pageIndex: pageIndex });
+    },
+
+    getDestinations: function WorkerTransport_getDestinations() {
+      var promise = new PDFJS.LegacyPromise();
+      this.messageHandler.send('GetDestinations', null,
+        function transportDestinations(destinations) {
+          promise.resolve(destinations);
+        }
+      );
+      return promise;
+    },
+
+    getAttachments: function WorkerTransport_getAttachments() {
+      var promise = new PDFJS.LegacyPromise();
+      this.messageHandler.send('GetAttachments', null,
+        function transportAttachments(attachments) {
+          promise.resolve(attachments);
+        }
+      );
+      return promise;
+    },
+
+    startCleanup: function WorkerTransport_startCleanup() {
+      this.messageHandler.send('Cleanup', null,
+        function endCleanup() {
+          for (var i = 0, ii = this.pageCache.length; i < ii; i++) {
+            var page = this.pageCache[i];
+            if (page) {
+              page.destroy();
+            }
+          }
+          this.commonObjs.clear();
+          FontLoader.clear();
+        }.bind(this)
+      );
+    }
+  };
+  return WorkerTransport;
+
+})();
+
+/**
+ * A PDF document and page is built of many objects. E.g. there are objects
+ * for fonts, images, rendering code and such. These objects might get processed
+ * inside of a worker. The `PDFObjects` implements some basic functions to
+ * manage these objects.
+ * @ignore
+ */
+var PDFObjects = (function PDFObjectsClosure() {
+  function PDFObjects() {
+    this.objs = {};
+  }
+
+  PDFObjects.prototype = {
+    /**
+     * Internal function.
+     * Ensures there is an object defined for `objId`.
+     */
+    ensureObj: function PDFObjects_ensureObj(objId) {
+      if (this.objs[objId]) {
+        return this.objs[objId];
+      }
+
+      var obj = {
+        promise: new LegacyPromise(),
+        data: null,
+        resolved: false
+      };
+      this.objs[objId] = obj;
+
+      return obj;
+    },
+
+    /**
+     * If called *without* callback, this returns the data of `objId` but the
+     * object needs to be resolved. If it isn't, this function throws.
+     *
+     * If called *with* a callback, the callback is called with the data of the
+     * object once the object is resolved. That means, if you call this
+     * function and the object is already resolved, the callback gets called
+     * right away.
+     */
+    get: function PDFObjects_get(objId, callback) {
+      // If there is a callback, then the get can be async and the object is
+      // not required to be resolved right now
+      if (callback) {
+        this.ensureObj(objId).promise.then(callback);
+        return null;
+      }
+
+      // If there isn't a callback, the user expects to get the resolved data
+      // directly.
+      var obj = this.objs[objId];
+
+      // If there isn't an object yet or the object isn't resolved, then the
+      // data isn't ready yet!
+      if (!obj || !obj.resolved) {
+        error('Requesting object that isn\'t resolved yet ' + objId);
+      }
+
+      return obj.data;
+    },
+
+    /**
+     * Resolves the object `objId` with optional `data`.
+     */
+    resolve: function PDFObjects_resolve(objId, data) {
+      var obj = this.ensureObj(objId);
+
+      obj.resolved = true;
+      obj.data = data;
+      obj.promise.resolve(data);
+    },
+
+    isResolved: function PDFObjects_isResolved(objId) {
+      var objs = this.objs;
+
+      if (!objs[objId]) {
+        return false;
+      } else {
+        return objs[objId].resolved;
+      }
+    },
+
+    hasData: function PDFObjects_hasData(objId) {
+      return this.isResolved(objId);
+    },
+
+    /**
+     * Returns the data of `objId` if object exists, null otherwise.
+     */
+    getData: function PDFObjects_getData(objId) {
+      var objs = this.objs;
+      if (!objs[objId] || !objs[objId].resolved) {
+        return null;
+      } else {
+        return objs[objId].data;
+      }
+    },
+
+    clear: function PDFObjects_clear() {
+      this.objs = {};
+    }
+  };
+  return PDFObjects;
+})();
+
+/**
+ * Allows controlling of the rendering tasks.
+ * @class
+ */
+var RenderTask = (function RenderTaskClosure() {
+  function RenderTask(internalRenderTask) {
+    this.internalRenderTask = internalRenderTask;
+    /**
+     * Promise for rendering task completion.
+     * @type {Promise}
+     */
+    this.promise = new PDFJS.LegacyPromise();
+  }
+
+  RenderTask.prototype = /** @lends RenderTask.prototype */ {
+    /**
+     * Cancels the rendering task. If the task is currently rendering it will
+     * not be cancelled until graphics pauses with a timeout. The promise that
+     * this object extends will resolved when cancelled.
+     */
+    cancel: function RenderTask_cancel() {
+      this.internalRenderTask.cancel();
+      this.promise.reject(new Error('Rendering is cancelled'));
+    },
+
+    /**
+     * Registers callback to indicate the rendering task completion.
+     *
+     * @param {function} onFulfilled The callback for the rendering completion.
+     * @param {function} onRejected The callback for the rendering failure.
+     * @return {Promise} A promise that is resolved after the onFulfilled or
+     *                   onRejected callback.
+     */
+    then: function RenderTask_then(onFulfilled, onRejected) {
+      return this.promise.then(onFulfilled, onRejected);
+    }
+  };
+
+  return RenderTask;
+})();
+
+/**
+ * For internal use only.
+ * @ignore
+ */
+var InternalRenderTask = (function InternalRenderTaskClosure() {
+
+  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
+                              pageNumber) {
+    this.callback = callback;
+    this.params = params;
+    this.objs = objs;
+    this.commonObjs = commonObjs;
+    this.operatorListIdx = null;
+    this.operatorList = operatorList;
+    this.pageNumber = pageNumber;
+    this.running = false;
+    this.graphicsReadyCallback = null;
+    this.graphicsReady = false;
+    this.cancelled = false;
+  }
+
+  InternalRenderTask.prototype = {
+
+    initalizeGraphics:
+        function InternalRenderTask_initalizeGraphics(transparency) {
+
+      if (this.cancelled) {
+        return;
+      }
+      if (PDFJS.pdfBug && 'StepperManager' in globalScope &&
+          globalScope.StepperManager.enabled) {
+        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);
+        this.stepper.init(this.operatorList);
+        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
+      }
+
+      var params = this.params;
+      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
+                                    this.objs, params.imageLayer);
+
+      this.gfx.beginDrawing(params.viewport, transparency);
+      this.operatorListIdx = 0;
+      this.graphicsReady = true;
+      if (this.graphicsReadyCallback) {
+        this.graphicsReadyCallback();
+      }
+    },
+
+    cancel: function InternalRenderTask_cancel() {
+      this.running = false;
+      this.cancelled = true;
+      this.callback('cancelled');
+    },
+
+    operatorListChanged: function InternalRenderTask_operatorListChanged() {
+      if (!this.graphicsReady) {
+        if (!this.graphicsReadyCallback) {
+          this.graphicsReadyCallback = this._continue.bind(this);
+        }
+        return;
+      }
+
+      if (this.stepper) {
+        this.stepper.updateOperatorList(this.operatorList);
+      }
+
+      if (this.running) {
+        return;
+      }
+      this._continue();
+    },
+
+    _continue: function InternalRenderTask__continue() {
+      this.running = true;
+      if (this.cancelled) {
+        return;
+      }
+      if (this.params.continueCallback) {
+        this.params.continueCallback(this._next.bind(this));
+      } else {
+        this._next();
+      }
+    },
+
+    _next: function InternalRenderTask__next() {
+      if (this.cancelled) {
+        return;
+      }
+      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,
+                                        this.operatorListIdx,
+                                        this._continue.bind(this),
+                                        this.stepper);
+      if (this.operatorListIdx === this.operatorList.argsArray.length) {
+        this.running = false;
+        if (this.operatorList.lastChunk) {
+          this.gfx.endDrawing();
+          this.callback();
+        }
+      }
+    }
+
+  };
+
+  return InternalRenderTask;
+})();
+
+
+var Metadata = PDFJS.Metadata = (function MetadataClosure() {
+  function fixMetadata(meta) {
+    return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
+      var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
+                                function(code, d1, d2, d3) {
+        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
+      });
+      var chars = '';
+      for (var i = 0; i < bytes.length; i += 2) {
+        var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
+        chars += code >= 32 && code < 127 && code != 60 && code != 62 &&
+          code != 38 && false ? String.fromCharCode(code) :
+          '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
+      }
+      return '>' + chars;
+    });
+  }
+
+  function Metadata(meta) {
+    if (typeof meta === 'string') {
+      // Ghostscript produces invalid metadata
+      meta = fixMetadata(meta);
+
+      var parser = new DOMParser();
+      meta = parser.parseFromString(meta, 'application/xml');
+    } else if (!(meta instanceof Document)) {
+      error('Metadata: Invalid metadata object');
+    }
+
+    this.metaDocument = meta;
+    this.metadata = {};
+    this.parse();
+  }
+
+  Metadata.prototype = {
+    parse: function Metadata_parse() {
+      var doc = this.metaDocument;
+      var rdf = doc.documentElement;
+
+      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
+        rdf = rdf.firstChild;
+        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {
+          rdf = rdf.nextSibling;
+        }
+      }
+
+      var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
+      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {
+        return;
+      }
+
+      var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength;
+      for (i = 0, length = children.length; i < length; i++) {
+        desc = children[i];
+        if (desc.nodeName.toLowerCase() !== 'rdf:description') {
+          continue;
+        }
+
+        for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
+          if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {
+            entry = desc.childNodes[ii];
+            name = entry.nodeName.toLowerCase();
+            this.metadata[name] = entry.textContent.trim();
+          }
+        }
+      }
+    },
+
+    get: function Metadata_get(name) {
+      return this.metadata[name] || null;
+    },
+
+    has: function Metadata_has(name) {
+      return typeof this.metadata[name] !== 'undefined';
+    }
+  };
+
+  return Metadata;
+})();
+
+
+// <canvas> contexts store most of the state we need natively.
+// However, PDF needs a bit more state, which we store here.
+
+// Minimal font size that would be used during canvas fillText operations.
+var MIN_FONT_SIZE = 16;
+var MAX_GROUP_SIZE = 4096;
+
+var COMPILE_TYPE3_GLYPHS = true;
+
+function createScratchCanvas(width, height) {
+  var canvas = document.createElement('canvas');
+  canvas.width = width;
+  canvas.height = height;
+  return canvas;
+}
+
+function addContextCurrentTransform(ctx) {
+  // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
+  if (!ctx.mozCurrentTransform) {
+    // Store the original context
+    ctx._scaleX = ctx._scaleX || 1.0;
+    ctx._scaleY = ctx._scaleY || 1.0;
+    ctx._originalSave = ctx.save;
+    ctx._originalRestore = ctx.restore;
+    ctx._originalRotate = ctx.rotate;
+    ctx._originalScale = ctx.scale;
+    ctx._originalTranslate = ctx.translate;
+    ctx._originalTransform = ctx.transform;
+    ctx._originalSetTransform = ctx.setTransform;
+
+    ctx._transformMatrix = [ctx._scaleX, 0, 0, ctx._scaleY, 0, 0];
+    ctx._transformStack = [];
+
+    Object.defineProperty(ctx, 'mozCurrentTransform', {
+      get: function getCurrentTransform() {
+        return this._transformMatrix;
+      }
+    });
+
+    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
+      get: function getCurrentTransformInverse() {
+        // Calculation done using WolframAlpha:
+        // http://www.wolframalpha.com/input/?
+        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
+
+        var m = this._transformMatrix;
+        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
+
+        var ad_bc = a * d - b * c;
+        var bc_ad = b * c - a * d;
+
+        return [
+          d / ad_bc,
+          b / bc_ad,
+          c / bc_ad,
+          a / ad_bc,
+          (d * e - c * f) / bc_ad,
+          (b * e - a * f) / ad_bc
+        ];
+      }
+    });
+
+    ctx.save = function ctxSave() {
+      var old = this._transformMatrix;
+      this._transformStack.push(old);
+      this._transformMatrix = old.slice(0, 6);
+
+      this._originalSave();
+    };
+
+    ctx.restore = function ctxRestore() {
+      var prev = this._transformStack.pop();
+      if (prev) {
+        this._transformMatrix = prev;
+        this._originalRestore();
+      }
+    };
+
+    ctx.translate = function ctxTranslate(x, y) {
+      var m = this._transformMatrix;
+      m[4] = m[0] * x + m[2] * y + m[4];
+      m[5] = m[1] * x + m[3] * y + m[5];
+
+      this._originalTranslate(x, y);
+    };
+
+    ctx.scale = function ctxScale(x, y) {
+      var m = this._transformMatrix;
+      m[0] = m[0] * x;
+      m[1] = m[1] * x;
+      m[2] = m[2] * y;
+      m[3] = m[3] * y;
+
+      this._originalScale(x, y);
+    };
+
+    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
+      var m = this._transformMatrix;
+      this._transformMatrix = [
+        m[0] * a + m[2] * b,
+        m[1] * a + m[3] * b,
+        m[0] * c + m[2] * d,
+        m[1] * c + m[3] * d,
+        m[0] * e + m[2] * f + m[4],
+        m[1] * e + m[3] * f + m[5]
+      ];
+
+      ctx._originalTransform(a, b, c, d, e, f);
+    };
+
+    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
+      this._transformMatrix = [a, b, c, d, e, f];
+
+      ctx._originalSetTransform(a, b, c, d, e, f);
+    };
+
+    ctx.rotate = function ctxRotate(angle) {
+      var cosValue = Math.cos(angle);
+      var sinValue = Math.sin(angle);
+
+      var m = this._transformMatrix;
+      this._transformMatrix = [
+        m[0] * cosValue + m[2] * sinValue,
+        m[1] * cosValue + m[3] * sinValue,
+        m[0] * (-sinValue) + m[2] * cosValue,
+        m[1] * (-sinValue) + m[3] * cosValue,
+        m[4],
+        m[5]
+      ];
+
+      this._originalRotate(angle);
+    };
+  }
+}
+
+var CachedCanvases = (function CachedCanvasesClosure() {
+  var cache = {};
+  return {
+    getCanvas: function CachedCanvases_getCanvas(id, width, height,
+                                                 trackTransform) {
+      var canvasEntry;
+      if (id in cache) {
+        canvasEntry = cache[id];
+        canvasEntry.canvas.width = width;
+        canvasEntry.canvas.height = height;
+        // reset canvas transform for emulated mozCurrentTransform, if needed
+        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
+      } else {
+        var canvas = createScratchCanvas(width, height);
+        var ctx = canvas.getContext('2d');
+        if (trackTransform) {
+          addContextCurrentTransform(ctx);
+        }
+        cache[id] = canvasEntry = {canvas: canvas, context: ctx};
+      }
+      return canvasEntry;
+    },
+    clear: function () {
+      cache = {};
+    }
+  };
+})();
+
+function compileType3Glyph(imgData) {
+  var POINT_TO_PROCESS_LIMIT = 1000;
+
+  var width = imgData.width, height = imgData.height;
+  var i, j, j0, width1 = width + 1;
+  var points = new Uint8Array(width1 * (height + 1));
+  var POINT_TYPES =
+      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
+
+  // decodes bit-packed mask data
+  var lineSize = (width + 7) & ~7, data0 = imgData.data;
+  var data = new Uint8Array(lineSize * height), pos = 0, ii;
+  for (i = 0, ii = data0.length; i < ii; i++) {
+    var mask = 128, elem = data0[i];
+    while (mask > 0) {
+      data[pos++] = (elem & mask) ? 0 : 255;
+      mask >>= 1;
+    }
+  }
+
+  // finding iteresting points: every point is located between mask pixels,
+  // so there will be points of the (width + 1)x(height + 1) grid. Every point
+  // will have flags assigned based on neighboring mask pixels:
+  //   4 | 8
+  //   --P--
+  //   2 | 1
+  // We are interested only in points with the flags:
+  //   - outside corners: 1, 2, 4, 8;
+  //   - inside corners: 7, 11, 13, 14;
+  //   - and, intersections: 5, 10.
+  var count = 0;
+  pos = 0;
+  if (data[pos] !== 0) {
+    points[0] = 1;
+    ++count;
+  }
+  for (j = 1; j < width; j++) {
+    if (data[pos] !== data[pos + 1]) {
+      points[j] = data[pos] ? 2 : 1;
+      ++count;
+    }
+    pos++;
+  }
+  if (data[pos] !== 0) {
+    points[j] = 2;
+    ++count;
+  }
+  for (i = 1; i < height; i++) {
+    pos = i * lineSize;
+    j0 = i * width1;
+    if (data[pos - lineSize] !== data[pos]) {
+      points[j0] = data[pos] ? 1 : 8;
+      ++count;
+    }
+    // 'sum' is the position of the current pixel configuration in the 'TYPES'
+    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).
+    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
+    for (j = 1; j < width; j++) {
+      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +
+            (data[pos - lineSize + 1] ? 8 : 0);
+      if (POINT_TYPES[sum]) {
+        points[j0 + j] = POINT_TYPES[sum];
+        ++count;
+      }
+      pos++;
+    }
+    if (data[pos - lineSize] !== data[pos]) {
+      points[j0 + j] = data[pos] ? 2 : 4;
+      ++count;
+    }
+
+    if (count > POINT_TO_PROCESS_LIMIT) {
+      return null;
+    }
+  }
+
+  pos = lineSize * (height - 1);
+  j0 = i * width1;
+  if (data[pos] !== 0) {
+    points[j0] = 8;
+    ++count;
+  }
+  for (j = 1; j < width; j++) {
+    if (data[pos] !== data[pos + 1]) {
+      points[j0 + j] = data[pos] ? 4 : 8;
+      ++count;
+    }
+    pos++;
+  }
+  if (data[pos] !== 0) {
+    points[j0 + j] = 4;
+    ++count;
+  }
+  if (count > POINT_TO_PROCESS_LIMIT) {
+    return null;
+  }
+
+  // building outlines
+  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
+  var outlines = [];
+  for (i = 0; count && i <= height; i++) {
+    var p = i * width1;
+    var end = p + width;
+    while (p < end && !points[p]) {
+      p++;
+    }
+    if (p === end) {
+      continue;
+    }
+    var coords = [p % width1, i];
+
+    var type = points[p], p0 = p, pp;
+    do {
+      var step = steps[type];
+      do {
+        p += step;
+      } while (!points[p]);
+
+      pp = points[p];
+      if (pp !== 5 && pp !== 10) {
+        // set new direction
+        type = pp;
+        // delete mark
+        points[p] = 0;
+      } else { // type is 5 or 10, ie, a crossing
+        // set new direction
+        type = pp & ((0x33 * type) >> 4);
+        // set new type for "future hit"
+        points[p] &= (type >> 2 | type << 2);
+      }
+
+      coords.push(p % width1);
+      coords.push((p / width1) | 0);
+      --count;
+    } while (p0 !== p);
+    outlines.push(coords);
+    --i;
+  }
+
+  var drawOutline = function(c) {
+    c.save();
+    // the path shall be painted in [0..1]x[0..1] space
+    c.scale(1 / width, -1 / height);
+    c.translate(0, -height);
+    c.beginPath();
+    for (var i = 0, ii = outlines.length; i < ii; i++) {
+      var o = outlines[i];
+      c.moveTo(o[0], o[1]);
+      for (var j = 2, jj = o.length; j < jj; j += 2) {
+        c.lineTo(o[j], o[j+1]);
+      }
+    }
+    c.fill();
+    c.beginPath();
+    c.restore();
+  };
+
+  return drawOutline;
+}
+
+var CanvasExtraState = (function CanvasExtraStateClosure() {
+  function CanvasExtraState(old) {
+    // Are soft masks and alpha values shapes or opacities?
+    this.alphaIsShape = false;
+    this.fontSize = 0;
+    this.fontSizeScale = 1;
+    this.textMatrix = IDENTITY_MATRIX;
+    this.fontMatrix = FONT_IDENTITY_MATRIX;
+    this.leading = 0;
+    // Current point (in user coordinates)
+    this.x = 0;
+    this.y = 0;
+    // Start of text line (in text coordinates)
+    this.lineX = 0;
+    this.lineY = 0;
+    // Character and word spacing
+    this.charSpacing = 0;
+    this.wordSpacing = 0;
+    this.textHScale = 1;
+    this.textRenderingMode = TextRenderingMode.FILL;
+    this.textRise = 0;
+    // Color spaces
+    this.fillColorSpace = ColorSpace.singletons.gray;
+    this.fillColorSpaceObj = null;
+    this.strokeColorSpace = ColorSpace.singletons.gray;
+    this.strokeColorSpaceObj = null;
+    this.fillColorObj = null;
+    this.strokeColorObj = null;
+    // Default fore and background colors
+    this.fillColor = '#000000';
+    this.strokeColor = '#000000';
+    // Note: fill alpha applies to all non-stroking operations
+    this.fillAlpha = 1;
+    this.strokeAlpha = 1;
+    this.lineWidth = 1;
+    this.activeSMask = null; // nonclonable field (see the save method below)
+
+    this.old = old;
+  }
+
+  CanvasExtraState.prototype = {
+    clone: function CanvasExtraState_clone() {
+      return Object.create(this);
+    },
+    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
+      this.x = x;
+      this.y = y;
+    }
+  };
+  return CanvasExtraState;
+})();
+
+var CanvasGraphics = (function CanvasGraphicsClosure() {
+  // Defines the time the executeOperatorList is going to be executing
+  // before it stops and shedules a continue of execution.
+  var EXECUTION_TIME = 15;
+
+  function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {
+    this.ctx = canvasCtx;
+    this.current = new CanvasExtraState();
+    this.stateStack = [];
+    this.pendingClip = null;
+    this.pendingEOFill = false;
+    this.res = null;
+    this.xobjs = null;
+    this.commonObjs = commonObjs;
+    this.objs = objs;
+    this.imageLayer = imageLayer;
+    this.groupStack = [];
+    this.processingType3 = null;
+    // Patterns are painted relative to the initial page/form transform, see pdf
+    // spec 8.7.2 NOTE 1.
+    this.baseTransform = null;
+    this.baseTransformStack = [];
+    this.groupLevel = 0;
+    this.smaskStack = [];
+    this.smaskCounter = 0;
+    this.tempSMask = null;
+    if (canvasCtx) {
+      addContextCurrentTransform(canvasCtx);
+    }
+  }
+
+  function putBinaryImageData(ctx, imgData) {
+    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
+      ctx.putImageData(imgData, 0, 0);
+      return;
+    }
+
+    // Put the image data to the canvas in chunks, rather than putting the
+    // whole image at once.  This saves JS memory, because the ImageData object
+    // is smaller. It also possibly saves C++ memory within the implementation
+    // of putImageData(). (E.g. in Firefox we make two short-lived copies of
+    // the data passed to putImageData()). |n| shouldn't be too small, however,
+    // because too many putImageData() calls will slow things down.
+    //
+    // Note: as written, if the last chunk is partial, the putImageData() call
+    // will (conceptually) put pixels past the bounds of the canvas.  But
+    // that's ok; any such pixels are ignored.
+
+    var height = imgData.height, width = imgData.width;
+    var fullChunkHeight = 16;
+    var fracChunks = height / fullChunkHeight;
+    var fullChunks = Math.floor(fracChunks);
+    var totalChunks = Math.ceil(fracChunks);
+    var partialChunkHeight = height - fullChunks * fullChunkHeight;
+
+    var chunkImgData = ctx.createImageData(width, fullChunkHeight);
+    var srcPos = 0, destPos;
+    var src = imgData.data;
+    var dest = chunkImgData.data;
+    var i, j, thisChunkHeight, elemsInThisChunk;
+
+    // There are multiple forms in which the pixel data can be passed, and
+    // imgData.kind tells us which one this is.
+    if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {
+      // Grayscale, 1 bit per pixel (i.e. black-and-white).
+      var srcLength = src.byteLength;
+      var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) :
+        new Uint32ArrayView(dest);
+      var dest32DataLength = dest32.length;
+      var fullSrcDiff = (width + 7) >> 3;
+      var white = 0xFFFFFFFF;
+      var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ?
+        0xFF000000 : 0x000000FF;
+      for (i = 0; i < totalChunks; i++) {
+        thisChunkHeight =
+          (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
+        destPos = 0;
+        for (j = 0; j < thisChunkHeight; j++) {
+          var srcDiff = srcLength - srcPos;
+          var k = 0;
+          var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;
+          var kEndUnrolled = kEnd & ~7;
+          var mask = 0;
+          var srcByte = 0;
+          for (; k < kEndUnrolled; k += 8) {
+            srcByte = src[srcPos++];
+            dest32[destPos++] = (srcByte & 128) ? white : black;
+            dest32[destPos++] = (srcByte & 64) ? white : black;
+            dest32[destPos++] = (srcByte & 32) ? white : black;
+            dest32[destPos++] = (srcByte & 16) ? white : black;
+            dest32[destPos++] = (srcByte & 8) ? white : black;
+            dest32[destPos++] = (srcByte & 4) ? white : black;
+            dest32[destPos++] = (srcByte & 2) ? white : black;
+            dest32[destPos++] = (srcByte & 1) ? white : black;
+          }
+          for (; k < kEnd; k++) {
+             if (mask === 0) {
+               srcByte = src[srcPos++];
+               mask = 128;
+             }
+
+            dest32[destPos++] = (srcByte & mask) ? white : black;
+            mask >>= 1;
+          }
+        }
+        // We ran out of input. Make all remaining pixels transparent.
+        while (destPos < dest32DataLength) {
+          dest32[destPos++] = 0;
+        }
+
+        ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
+      }
+    } else if (imgData.kind === ImageKind.RGBA_32BPP) {
+      // RGBA, 32-bits per pixel.
+
+      for (i = 0; i < totalChunks; i++) {
+        thisChunkHeight =
+          (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
+        elemsInThisChunk = imgData.width * thisChunkHeight * 4;
+
+        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
+        srcPos += elemsInThisChunk;
+
+        ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
+      }
+    } else if (imgData.kind === ImageKind.RGB_24BPP) {
+      // RGB, 24-bits per pixel.
+      for (i = 0; i < totalChunks; i++) {
+        thisChunkHeight =
+          (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
+        elemsInThisChunk = imgData.width * thisChunkHeight * 3;
+        destPos = 0;
+        for (j = 0; j < elemsInThisChunk; j += 3) {
+          dest[destPos++] = src[srcPos++];
+          dest[destPos++] = src[srcPos++];
+          dest[destPos++] = src[srcPos++];
+          dest[destPos++] = 255;
+        }
+        ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
+      }
+    } else {
+      error('bad image kind: ' + imgData.kind);
+    }
+  }
+
+  function putBinaryImageMask(ctx, imgData) {
+    var height = imgData.height, width = imgData.width;
+    var fullChunkHeight = 16;
+    var fracChunks = height / fullChunkHeight;
+    var fullChunks = Math.floor(fracChunks);
+    var totalChunks = Math.ceil(fracChunks);
+    var partialChunkHeight = height - fullChunks * fullChunkHeight;
+
+    var chunkImgData = ctx.createImageData(width, fullChunkHeight);
+    var srcPos = 0;
+    var src = imgData.data;
+    var dest = chunkImgData.data;
+
+    for (var i = 0; i < totalChunks; i++) {
+      var thisChunkHeight =
+        (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
+
+      // Expand the mask so it can be used by the canvas.  Any required
+      // inversion has already been handled.
+      var destPos = 3; // alpha component offset
+      for (var j = 0; j < thisChunkHeight; j++) {
+        var mask = 0;
+        for (var k = 0; k < width; k++) {
+          if (!mask) {
+            var elem = src[srcPos++];
+            mask = 128;
+          }
+          dest[destPos] = (elem & mask) ? 0 : 255;
+          destPos += 4;
+          mask >>= 1;
+        }
+      }
+      ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
+    }
+  }
+
+  function copyCtxState(sourceCtx, destCtx) {
+    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',
+                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',
+                      'globalCompositeOperation', 'font'];
+    for (var i = 0, ii = properties.length; i < ii; i++) {
+      var property = properties[i];
+      if (property in sourceCtx) {
+        destCtx[property] = sourceCtx[property];
+      }
+    }
+    if ('setLineDash' in sourceCtx) {
+      destCtx.setLineDash(sourceCtx.getLineDash());
+      destCtx.lineDashOffset =  sourceCtx.lineDashOffset;
+    } else if ('mozDash' in sourceCtx) {
+      destCtx.mozDash = sourceCtx.mozDash;
+      destCtx.mozDashOffset = sourceCtx.mozDashOffset;
+    }
+  }
+
+  function genericComposeSMask(maskCtx, layerCtx, width, height,
+                               subtype, backdrop) {
+    var addBackdropFn;
+    if (backdrop) {
+      addBackdropFn = function (r0, g0, b0, bytes) {
+        var length = bytes.length;
+        for (var i = 3; i < length; i += 4) {
+          var alpha = bytes[i] / 255;
+          if (alpha === 0) {
+            bytes[i - 3] = r0;
+            bytes[i - 2] = g0;
+            bytes[i - 1] = b0;
+          } else if (alpha < 1) {
+            var alpha_ = 1 - alpha;
+            bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) | 0;
+            bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) | 0;
+            bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) | 0;
+          }
+        }
+      }.bind(null, backdrop[0], backdrop[1], backdrop[2]);
+    } else {
+      addBackdropFn = function () {};
+    }
+
+    var composeFn;
+    if (subtype === 'Luminosity') {
+      composeFn = function (maskDataBytes, layerDataBytes) {
+        var length = maskDataBytes.length;
+        for (var i = 3; i < length; i += 4) {
+          var y = ((maskDataBytes[i - 3] * 77) +     // * 0.3 / 255 * 0x10000
+                   (maskDataBytes[i - 2] * 152) +    // * 0.59 ....
+                   (maskDataBytes[i - 1] * 28)) | 0; // * 0.11 ....
+          layerDataBytes[i] = (layerDataBytes[i] * y) >> 16;
+        }
+      };
+    } else {
+      composeFn = function (maskDataBytes, layerDataBytes) {
+        var length = maskDataBytes.length;
+        for (var i = 3; i < length; i += 4) {
+          var alpha = maskDataBytes[i];
+          layerDataBytes[i] = (layerDataBytes[i] * alpha / 255) | 0;
+        }
+      };
+    }
+
+    // processing image in chunks to save memory
+    var PIXELS_TO_PROCESS = 65536;
+    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
+    for (var row = 0; row < height; row += chunkSize) {
+      var chunkHeight = Math.min(chunkSize, height - row);
+      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);
+      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);
+
+      addBackdropFn(maskData.data);
+      composeFn(maskData.data, layerData.data);
+
+      maskCtx.putImageData(layerData, 0, row);
+    }
+  }
+
+  function composeSMask(ctx, smask, layerCtx) {
+    var mask = smask.canvas;
+    var maskCtx = smask.context;
+
+    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,
+                     smask.offsetX, smask.offsetY);
+
+    var backdrop;
+    if (smask.backdrop) {
+      var cs = smask.colorSpace || ColorSpace.singletons.rgb;
+      backdrop = cs.getRgb(smask.backdrop, 0);
+    }
+    if (WebGLUtils.isEnabled) {
+      var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,
+        {subtype: smask.subtype, backdrop: backdrop});
+      ctx.setTransform(1, 0, 0, 1, 0, 0);
+      ctx.drawImage(composed, smask.offsetX, smask.offsetY);
+      return;
+    }
+    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,
+                        smask.subtype, backdrop);
+    ctx.drawImage(mask, 0, 0);
+  }
+
+  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+  var NORMAL_CLIP = {};
+  var EO_CLIP = {};
+
+  CanvasGraphics.prototype = {
+
+    beginDrawing: function CanvasGraphics_beginDrawing(viewport, transparency) {
+      // For pdfs that use blend modes we have to clear the canvas else certain
+      // blend modes can look wrong since we'd be blending with a white
+      // backdrop. The problem with a transparent backdrop though is we then
+      // don't get sub pixel anti aliasing on text, so we fill with white if
+      // we can.
+      var width = this.ctx.canvas.width;
+      var height = this.ctx.canvas.height;
+      if (transparency) {
+        this.ctx.clearRect(0, 0, width, height);
+      } else {
+        this.ctx.mozOpaque = true;
+        this.ctx.save();
+        this.ctx.fillStyle = 'rgb(255, 255, 255)';
+        this.ctx.fillRect(0, 0, width, height);
+        this.ctx.restore();
+      }
+
+      var transform = viewport.transform;
+
+      this.ctx.save();
+      this.ctx.transform.apply(this.ctx, transform);
+
+      this.baseTransform = this.ctx.mozCurrentTransform.slice();
+
+      if (this.imageLayer) {
+        this.imageLayer.beginLayout();
+      }
+    },
+
+    executeOperatorList: function CanvasGraphics_executeOperatorList(
+                                    operatorList,
+                                    executionStartIdx, continueCallback,
+                                    stepper) {
+      var argsArray = operatorList.argsArray;
+      var fnArray = operatorList.fnArray;
+      var i = executionStartIdx || 0;
+      var argsArrayLen = argsArray.length;
+
+      // Sometimes the OperatorList to execute is empty.
+      if (argsArrayLen == i) {
+        return i;
+      }
+
+      var endTime = Date.now() + EXECUTION_TIME;
+
+      var commonObjs = this.commonObjs;
+      var objs = this.objs;
+      var fnId;
+      var deferred = Promise.resolve();
+
+      while (true) {
+        if (stepper && i === stepper.nextBreakPoint) {
+          stepper.breakIt(i, continueCallback);
+          return i;
+        }
+
+        fnId = fnArray[i];
+
+        if (fnId !== OPS.dependency) {
+          this[fnId].apply(this, argsArray[i]);
+        } else {
+          var deps = argsArray[i];
+          for (var n = 0, nn = deps.length; n < nn; n++) {
+            var depObjId = deps[n];
+            var common = depObjId.substring(0, 2) == 'g_';
+
+            // If the promise isn't resolved yet, add the continueCallback
+            // to the promise and bail out.
+            if (!common && !objs.isResolved(depObjId)) {
+              objs.get(depObjId, continueCallback);
+              return i;
+            }
+            if (common && !commonObjs.isResolved(depObjId)) {
+              commonObjs.get(depObjId, continueCallback);
+              return i;
+            }
+          }
+        }
+
+        i++;
+
+        // If the entire operatorList was executed, stop as were done.
+        if (i == argsArrayLen) {
+          return i;
+        }
+
+        // If the execution took longer then a certain amount of time, schedule
+        // to continue exeution after a short delay.
+        // However, this is only possible if a 'continueCallback' is passed in.
+        if (continueCallback && Date.now() > endTime) {
+          deferred.then(continueCallback);
+          return i;
+        }
+
+        // If the operatorList isn't executed completely yet OR the execution
+        // time was short enough, do another execution round.
+      }
+    },
+
+    endDrawing: function CanvasGraphics_endDrawing() {
+      this.ctx.restore();
+      CachedCanvases.clear();
+      WebGLUtils.clear();
+
+      if (this.imageLayer) {
+        this.imageLayer.endLayout();
+      }
+    },
+
+    // Graphics state
+    setLineWidth: function CanvasGraphics_setLineWidth(width) {
+      this.current.lineWidth = width;
+      this.ctx.lineWidth = width;
+    },
+    setLineCap: function CanvasGraphics_setLineCap(style) {
+      this.ctx.lineCap = LINE_CAP_STYLES[style];
+    },
+    setLineJoin: function CanvasGraphics_setLineJoin(style) {
+      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+    },
+    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
+      this.ctx.miterLimit = limit;
+    },
+    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
+      var ctx = this.ctx;
+      if ('setLineDash' in ctx) {
+        ctx.setLineDash(dashArray);
+        ctx.lineDashOffset = dashPhase;
+      } else {
+        ctx.mozDash = dashArray;
+        ctx.mozDashOffset = dashPhase;
+      }
+    },
+    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
+      // Maybe if we one day fully support color spaces this will be important
+      // for now we can ignore.
+      // TODO set rendering intent?
+    },
+    setFlatness: function CanvasGraphics_setFlatness(flatness) {
+      // There's no way to control this with canvas, but we can safely ignore.
+      // TODO set flatness?
+    },
+    setGState: function CanvasGraphics_setGState(states) {
+      for (var i = 0, ii = states.length; i < ii; i++) {
+        var state = states[i];
+        var key = state[0];
+        var value = state[1];
+
+        switch (key) {
+          case 'LW':
+            this.setLineWidth(value);
+            break;
+          case 'LC':
+            this.setLineCap(value);
+            break;
+          case 'LJ':
+            this.setLineJoin(value);
+            break;
+          case 'ML':
+            this.setMiterLimit(value);
+            break;
+          case 'D':
+            this.setDash(value[0], value[1]);
+            break;
+          case 'RI':
+            this.setRenderingIntent(value);
+            break;
+          case 'FL':
+            this.setFlatness(value);
+            break;
+          case 'Font':
+            this.setFont(value[0], value[1]);
+            break;
+          case 'CA':
+            this.current.strokeAlpha = state[1];
+            break;
+          case 'ca':
+            this.current.fillAlpha = state[1];
+            this.ctx.globalAlpha = state[1];
+            break;
+          case 'BM':
+            if (value && value.name && (value.name !== 'Normal')) {
+              var mode = value.name.replace(/([A-Z])/g,
+                function(c) {
+                  return '-' + c.toLowerCase();
+                }
+              ).substring(1);
+              this.ctx.globalCompositeOperation = mode;
+              if (this.ctx.globalCompositeOperation !== mode) {
+                warn('globalCompositeOperation "' + mode +
+                     '" is not supported');
+              }
+            } else {
+              this.ctx.globalCompositeOperation = 'source-over';
+            }
+            break;
+          case 'SMask':
+            if (this.current.activeSMask) {
+              this.endSMaskGroup();
+            }
+            this.current.activeSMask = value ? this.tempSMask : null;
+            if (this.current.activeSMask) {
+              this.beginSMaskGroup();
+            }
+            this.tempSMask = null;
+            break;
+        }
+      }
+    },
+    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {
+
+      var activeSMask = this.current.activeSMask;
+      var drawnWidth = activeSMask.canvas.width;
+      var drawnHeight = activeSMask.canvas.height;
+      var cacheId = 'smaskGroupAt' + this.groupLevel;
+      var scratchCanvas = CachedCanvases.getCanvas(
+        cacheId, drawnWidth, drawnHeight, true);
+
+      var currentCtx = this.ctx;
+      var currentTransform = currentCtx.mozCurrentTransform;
+      this.ctx.save();
+
+      var groupCtx = scratchCanvas.context;
+      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
+      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
+      groupCtx.transform.apply(groupCtx, currentTransform);
+
+      copyCtxState(currentCtx, groupCtx);
+      this.ctx = groupCtx;
+      this.setGState([
+        ['BM', 'Normal'],
+        ['ca', 1],
+        ['CA', 1]
+      ]);
+      this.groupStack.push(currentCtx);
+      this.groupLevel++;
+    },
+    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
+      var groupCtx = this.ctx;
+      this.groupLevel--;
+      this.ctx = this.groupStack.pop();
+
+      composeSMask(this.ctx, this.current.activeSMask, groupCtx);
+      this.ctx.restore();
+    },
+    save: function CanvasGraphics_save() {
+      this.ctx.save();
+      var old = this.current;
+      this.stateStack.push(old);
+      this.current = old.clone();
+      if (this.current.activeSMask) {
+        this.current.activeSMask = null;
+      }
+    },
+    restore: function CanvasGraphics_restore() {
+      var prev = this.stateStack.pop();
+      if (prev) {
+        if (this.current.activeSMask) {
+          this.endSMaskGroup();
+        }
+
+        this.current = prev;
+        this.ctx.restore();
+      }
+    },
+    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
+      this.ctx.transform(a, b, c, d, e, f);
+    },
+
+    // Path
+    moveTo: function CanvasGraphics_moveTo(x, y) {
+      this.ctx.moveTo(x, y);
+      this.current.setCurrentPoint(x, y);
+    },
+    lineTo: function CanvasGraphics_lineTo(x, y) {
+      this.ctx.lineTo(x, y);
+      this.current.setCurrentPoint(x, y);
+    },
+    curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
+      this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
+      this.current.setCurrentPoint(x3, y3);
+    },
+    curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
+      var current = this.current;
+      this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
+      current.setCurrentPoint(x3, y3);
+    },
+    curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
+      this.curveTo(x1, y1, x3, y3, x3, y3);
+      this.current.setCurrentPoint(x3, y3);
+    },
+    closePath: function CanvasGraphics_closePath() {
+      this.ctx.closePath();
+    },
+    rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
+      if (width === 0) {
+        width = this.getSinglePixelWidth();
+      }
+      if (height === 0) {
+        height = this.getSinglePixelWidth();
+      }
+
+      this.ctx.rect(x, y, width, height);
+    },
+    stroke: function CanvasGraphics_stroke(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+      var ctx = this.ctx;
+      var strokeColor = this.current.strokeColor;
+      if (this.current.lineWidth === 0) {
+        ctx.lineWidth = this.getSinglePixelWidth();
+      }
+      // For stroke we want to temporarily change the global alpha to the
+      // stroking alpha.
+      ctx.globalAlpha = this.current.strokeAlpha;
+      if (strokeColor && strokeColor.hasOwnProperty('type') &&
+          strokeColor.type === 'Pattern') {
+        // for patterns, we transform to pattern space, calculate
+        // the pattern, call stroke, and restore to user space
+        ctx.save();
+        ctx.strokeStyle = strokeColor.getPattern(ctx, this);
+        ctx.stroke();
+        ctx.restore();
+      } else {
+        ctx.stroke();
+      }
+      if (consumePath) {
+        this.consumePath();
+      }
+      // Restore the global alpha to the fill alpha
+      ctx.globalAlpha = this.current.fillAlpha;
+    },
+    closeStroke: function CanvasGraphics_closeStroke() {
+      this.closePath();
+      this.stroke();
+    },
+    fill: function CanvasGraphics_fill(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+      var ctx = this.ctx;
+      var fillColor = this.current.fillColor;
+      var needRestore = false;
+
+      if (fillColor && fillColor.hasOwnProperty('type') &&
+          fillColor.type === 'Pattern') {
+        ctx.save();
+        ctx.fillStyle = fillColor.getPattern(ctx, this);
+        needRestore = true;
+      }
+
+      if (this.pendingEOFill) {
+        if ('mozFillRule' in this.ctx) {
+          this.ctx.mozFillRule = 'evenodd';
+          this.ctx.fill();
+          this.ctx.mozFillRule = 'nonzero';
+        } else {
+          try {
+            this.ctx.fill('evenodd');
+          } catch (ex) {
+            // shouldn't really happen, but browsers might think differently
+            this.ctx.fill();
+          }
+        }
+        this.pendingEOFill = false;
+      } else {
+        this.ctx.fill();
+      }
+
+      if (needRestore) {
+        ctx.restore();
+      }
+      if (consumePath) {
+        this.consumePath();
+      }
+    },
+    eoFill: function CanvasGraphics_eoFill() {
+      this.pendingEOFill = true;
+      this.fill();
+    },
+    fillStroke: function CanvasGraphics_fillStroke() {
+      this.fill(false);
+      this.stroke(false);
+
+      this.consumePath();
+    },
+    eoFillStroke: function CanvasGraphics_eoFillStroke() {
+      this.pendingEOFill = true;
+      this.fillStroke();
+    },
+    closeFillStroke: function CanvasGraphics_closeFillStroke() {
+      this.closePath();
+      this.fillStroke();
+    },
+    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
+      this.pendingEOFill = true;
+      this.closePath();
+      this.fillStroke();
+    },
+    endPath: function CanvasGraphics_endPath() {
+      this.consumePath();
+    },
+
+    // Clipping
+    clip: function CanvasGraphics_clip() {
+      this.pendingClip = NORMAL_CLIP;
+    },
+    eoClip: function CanvasGraphics_eoClip() {
+      this.pendingClip = EO_CLIP;
+    },
+
+    // Text
+    beginText: function CanvasGraphics_beginText() {
+      this.current.textMatrix = IDENTITY_MATRIX;
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    },
+    endText: function CanvasGraphics_endText() {
+      if (!('pendingTextPaths' in this)) {
+        this.ctx.beginPath();
+        return;
+      }
+      var paths = this.pendingTextPaths;
+      var ctx = this.ctx;
+
+      ctx.save();
+      ctx.beginPath();
+      for (var i = 0; i < paths.length; i++) {
+        var path = paths[i];
+        ctx.setTransform.apply(ctx, path.transform);
+        ctx.translate(path.x, path.y);
+        path.addToPath(ctx, path.fontSize);
+      }
+      ctx.restore();
+      ctx.clip();
+      ctx.beginPath();
+      delete this.pendingTextPaths;
+    },
+    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
+      this.current.charSpacing = spacing;
+    },
+    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
+      this.current.wordSpacing = spacing;
+    },
+    setHScale: function CanvasGraphics_setHScale(scale) {
+      this.current.textHScale = scale / 100;
+    },
+    setLeading: function CanvasGraphics_setLeading(leading) {
+      this.current.leading = -leading;
+    },
+    setFont: function CanvasGraphics_setFont(fontRefName, size) {
+      var fontObj = this.commonObjs.get(fontRefName);
+      var current = this.current;
+
+      if (!fontObj) {
+        error('Can\'t find font for ' + fontRefName);
+      }
+
+      current.fontMatrix = (fontObj.fontMatrix ?
+                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
+
+      // A valid matrix needs all main diagonal elements to be non-zero
+      // This also ensures we bypass FF bugzilla bug #719844.
+      if (current.fontMatrix[0] === 0 ||
+          current.fontMatrix[3] === 0) {
+        warn('Invalid font matrix for font ' + fontRefName);
+      }
+
+      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
+      // and in some docs this can be negative (inverted x-y axes).
+      if (size < 0) {
+        size = -size;
+        current.fontDirection = -1;
+      } else {
+        current.fontDirection = 1;
+      }
+
+      this.current.font = fontObj;
+      this.current.fontSize = size;
+
+      if (fontObj.coded) {
+        return; // we don't need ctx.font for Type3 fonts
+      }
+
+      var name = fontObj.loadedName || 'sans-serif';
+      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
+                                 (fontObj.bold ? 'bold' : 'normal');
+
+      var italic = fontObj.italic ? 'italic' : 'normal';
+      var typeface = '"' + name + '", ' + fontObj.fallbackName;
+
+      // Some font backends cannot handle fonts below certain size.
+      // Keeping the font at minimal size and using the fontSizeScale to change
+      // the current transformation matrix before the fillText/strokeText.
+      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
+      var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
+      this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
+                                   size / MIN_FONT_SIZE;
+
+      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
+      this.ctx.font = rule;
+    },
+    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
+      this.current.textRenderingMode = mode;
+    },
+    setTextRise: function CanvasGraphics_setTextRise(rise) {
+      this.current.textRise = rise;
+    },
+    moveText: function CanvasGraphics_moveText(x, y) {
+      this.current.x = this.current.lineX += x;
+      this.current.y = this.current.lineY += y;
+    },
+    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
+      this.setLeading(-y);
+      this.moveText(x, y);
+    },
+    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
+      this.current.textMatrix = [a, b, c, d, e, f];
+
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    },
+    nextLine: function CanvasGraphics_nextLine() {
+      this.moveText(0, this.current.leading);
+    },
+    applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
+      var ctx = this.ctx;
+      var current = this.current;
+      ctx.transform.apply(ctx, current.textMatrix);
+      ctx.translate(current.x, current.y + current.textRise);
+      if (current.fontDirection > 0) {
+        ctx.scale(current.textHScale, -1);
+      } else {
+        ctx.scale(-current.textHScale, 1);
+      }
+    },
+
+    paintChar: function (character, x, y) {
+      var ctx = this.ctx;
+      var current = this.current;
+      var font = current.font;
+      var fontSize = current.fontSize / current.fontSizeScale;
+      var textRenderingMode = current.textRenderingMode;
+      var fillStrokeMode = textRenderingMode &
+        TextRenderingMode.FILL_STROKE_MASK;
+      var isAddToPathSet = !!(textRenderingMode &
+        TextRenderingMode.ADD_TO_PATH_FLAG);
+
+      var addToPath;
+      if (font.disableFontFace || isAddToPathSet) {
+        addToPath = font.getPathGenerator(this.commonObjs, character);
+      }
+
+      if (font.disableFontFace) {
+        ctx.save();
+        ctx.translate(x, y);
+        ctx.beginPath();
+        addToPath(ctx, fontSize);
+        if (fillStrokeMode === TextRenderingMode.FILL ||
+            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+          ctx.fill();
+        }
+        if (fillStrokeMode === TextRenderingMode.STROKE ||
+            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+          ctx.stroke();
+        }
+        ctx.restore();
+      } else {
+        if (fillStrokeMode === TextRenderingMode.FILL ||
+            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+          ctx.fillText(character, x, y);
+        }
+        if (fillStrokeMode === TextRenderingMode.STROKE ||
+            fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+          ctx.strokeText(character, x, y);
+        }
+      }
+
+      if (isAddToPathSet) {
+        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
+        paths.push({
+          transform: ctx.mozCurrentTransform,
+          x: x,
+          y: y,
+          fontSize: fontSize,
+          addToPath: addToPath
+        });
+      }
+    },
+
+    get isFontSubpixelAAEnabled() {
+      // Checks if anti-aliasing is enabled when scaled text is painted.
+      // On Windows GDI scaled fonts looks bad.
+      var ctx = document.createElement('canvas').getContext('2d');
+      ctx.scale(1.5, 1);
+      ctx.fillText('I', 0, 10);
+      var data = ctx.getImageData(0, 0, 10, 10).data;
+      var enabled = false;
+      for (var i = 3; i < data.length; i += 4) {
+        if (data[i] > 0 && data[i] < 255) {
+          enabled = true;
+          break;
+        }
+      }
+      return shadow(this, 'isFontSubpixelAAEnabled', enabled);
+    },
+
+    showText: function CanvasGraphics_showText(glyphs) {
+      var ctx = this.ctx;
+      var current = this.current;
+      var font = current.font;
+      var fontSize = current.fontSize;
+      var fontSizeScale = current.fontSizeScale;
+      var charSpacing = current.charSpacing;
+      var wordSpacing = current.wordSpacing;
+      var textHScale = current.textHScale * current.fontDirection;
+      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
+      var glyphsLength = glyphs.length;
+      var vertical = font.vertical;
+      var defaultVMetrics = font.defaultVMetrics;
+      var i, glyph, width;
+
+      if (fontSize === 0) {
+        return;
+      }
+
+      // Type3 fonts - each glyph is a "mini-PDF"
+      if (font.coded) {
+        ctx.save();
+        ctx.transform.apply(ctx, current.textMatrix);
+        ctx.translate(current.x, current.y);
+
+        ctx.scale(textHScale, 1);
+
+        for (i = 0; i < glyphsLength; ++i) {
+          glyph = glyphs[i];
+          if (glyph === null) {
+            // word break
+            this.ctx.translate(wordSpacing, 0);
+            current.x += wordSpacing * textHScale;
+            continue;
+          }
+
+          this.processingType3 = glyph;
+          this.save();
+          ctx.scale(fontSize, fontSize);
+          ctx.transform.apply(ctx, fontMatrix);
+          this.executeOperatorList(glyph.operatorList);
+          this.restore();
+
+          var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
+          width = ((transformed[0] * fontSize + charSpacing) *
+                   current.fontDirection);
+
+          ctx.translate(width, 0);
+          current.x += width * textHScale;
+        }
+        ctx.restore();
+        this.processingType3 = null;
+      } else {
+        ctx.save();
+        this.applyTextTransforms();
+
+        var lineWidth = current.lineWidth;
+        var a1 = current.textMatrix[0], b1 = current.textMatrix[1];
+        var scale = Math.sqrt(a1 * a1 + b1 * b1);
+        if (scale === 0 || lineWidth === 0) {
+          lineWidth = this.getSinglePixelWidth();
+        } else {
+          lineWidth /= scale;
+        }
+
+        if (fontSizeScale != 1.0) {
+          ctx.scale(fontSizeScale, fontSizeScale);
+          lineWidth /= fontSizeScale;
+        }
+
+        ctx.lineWidth = lineWidth;
+
+        var x = 0;
+        for (i = 0; i < glyphsLength; ++i) {
+          glyph = glyphs[i];
+          if (glyph === null) {
+            // word break
+            x += current.fontDirection * wordSpacing;
+            continue;
+          }
+
+          var restoreNeeded = false;
+          var character = glyph.fontChar;
+          var vmetric = glyph.vmetric || defaultVMetrics;
+          if (vertical) {
+            var vx = glyph.vmetric ? vmetric[1] : glyph.width * 0.5;
+            vx = -vx * fontSize * current.fontMatrix[0];
+            var vy = vmetric[2] * fontSize * current.fontMatrix[0];
+          }
+          width = vmetric ? -vmetric[0] : glyph.width;
+          var charWidth = width * fontSize * current.fontMatrix[0] +
+                          charSpacing * current.fontDirection;
+          var accent = glyph.accent;
+
+          var scaledX, scaledY, scaledAccentX, scaledAccentY;
+
+          if (vertical) {
+            scaledX = vx / fontSizeScale;
+            scaledY = (x + vy) / fontSizeScale;
+          } else {
+            scaledX = x / fontSizeScale;
+            scaledY = 0;
+          }
+
+          if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) {
+            // some standard fonts may not have the exact width, trying to
+            // rescale per character
+            var measuredWidth = ctx.measureText(character).width * 1000 /
+              current.fontSize * current.fontSizeScale;
+            var characterScaleX = width / measuredWidth;
+            restoreNeeded = true;
+            ctx.save();
+            ctx.scale(characterScaleX, 1);
+            scaledX /= characterScaleX;
+            if (accent) {
+              scaledAccentX /= characterScaleX;
+            }
+          }
+
+          this.paintChar(character, scaledX, scaledY);
+          if (accent) {
+            scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
+            scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
+            this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
+          }
+
+          x += charWidth;
+
+          if (restoreNeeded) {
+            ctx.restore();
+          }
+        }
+        if (vertical) {
+          current.y -= x * textHScale;
+        } else {
+          current.x += x * textHScale;
+        }
+        ctx.restore();
+      }
+    },
+    showSpacedText: function CanvasGraphics_showSpacedText(arr) {
+      var current = this.current;
+      var font = current.font;
+      var fontSize = current.fontSize;
+      // TJ array's number is independent from fontMatrix
+      var textHScale = current.textHScale * 0.001 * current.fontDirection;
+      var arrLength = arr.length;
+      var vertical = font.vertical;
+
+      for (var i = 0; i < arrLength; ++i) {
+        var e = arr[i];
+        if (isNum(e)) {
+          var spacingLength = -e * fontSize * textHScale;
+          if (vertical) {
+            current.y += spacingLength;
+          } else {
+            current.x += spacingLength;
+          }
+
+        } else {
+          this.showText(e);
+        }
+      }
+    },
+    nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
+      this.nextLine();
+      this.showText(text);
+    },
+    nextLineSetSpacingShowText:
+      function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
+                                                         charSpacing,
+                                                         text) {
+      this.setWordSpacing(wordSpacing);
+      this.setCharSpacing(charSpacing);
+      this.nextLineShowText(text);
+    },
+
+    // Type3 fonts
+    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
+      // We can safely ignore this since the width should be the same
+      // as the width in the Widths array.
+    },
+    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
+                                                                        yWidth,
+                                                                        llx,
+                                                                        lly,
+                                                                        urx,
+                                                                        ury) {
+      // TODO According to the spec we're also suppose to ignore any operators
+      // that set color or include images while processing this type3 font.
+      this.rectangle(llx, lly, urx - llx, ury - lly);
+      this.clip();
+      this.endPath();
+    },
+
+    // Color
+    setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
+      this.current.strokeColorSpace = ColorSpace.fromIR(raw);
+    },
+    setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
+      this.current.fillColorSpace = ColorSpace.fromIR(raw);
+    },
+    setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
+      var cs = this.current.strokeColorSpace;
+      var rgbColor = cs.getRgb(arguments, 0);
+      var color = Util.makeCssRgb(rgbColor);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
+      var pattern;
+      if (IR[0] == 'TilingPattern') {
+        var args = IR[1];
+        var base = cs.base;
+        var color;
+        if (base) {
+          color = base.getRgb(args, 0);
+        }
+        pattern = new TilingPattern(IR, color, this.ctx, this.objs,
+                                    this.commonObjs, this.baseTransform);
+      } else {
+        pattern = getShadingPatternFromIR(IR);
+      }
+      return pattern;
+    },
+    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
+      var cs = this.current.strokeColorSpace;
+
+      if (cs.name == 'Pattern') {
+        this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
+      } else {
+        this.setStrokeColor.apply(this, arguments);
+      }
+    },
+    setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
+      var cs = this.current.fillColorSpace;
+      var rgbColor = cs.getRgb(arguments, 0);
+      var color = Util.makeCssRgb(rgbColor);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
+      var cs = this.current.fillColorSpace;
+
+      if (cs.name == 'Pattern') {
+        this.current.fillColor = this.getColorN_Pattern(arguments, cs);
+      } else {
+        this.setFillColor.apply(this, arguments);
+      }
+    },
+    setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
+      this.current.strokeColorSpace = ColorSpace.singletons.gray;
+
+      var rgbColor = this.current.strokeColorSpace.getRgb(arguments, 0);
+      var color = Util.makeCssRgb(rgbColor);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    setFillGray: function CanvasGraphics_setFillGray(gray) {
+      this.current.fillColorSpace = ColorSpace.singletons.gray;
+
+      var rgbColor = this.current.fillColorSpace.getRgb(arguments, 0);
+      var color = Util.makeCssRgb(rgbColor);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
+      this.current.strokeColorSpace = ColorSpace.singletons.rgb;
+
+      var rgbColor = this.current.strokeColorSpace.getRgb(arguments, 0);
+      var color = Util.makeCssRgb(rgbColor);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
+      this.current.fillColorSpace = ColorSpace.singletons.rgb;
+
+      var rgbColor = this.current.fillColorSpace.getRgb(arguments, 0);
+      var color = Util.makeCssRgb(rgbColor);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+    setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
+      this.current.strokeColorSpace = ColorSpace.singletons.cmyk;
+
+      var color = Util.makeCssCmyk(arguments);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
+      this.current.fillColorSpace = ColorSpace.singletons.cmyk;
+
+      var color = Util.makeCssCmyk(arguments);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+
+    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
+      var ctx = this.ctx;
+
+      this.save();
+      var pattern = getShadingPatternFromIR(patternIR);
+      ctx.fillStyle = pattern.getPattern(ctx, this, true);
+
+      var inv = ctx.mozCurrentTransformInverse;
+      if (inv) {
+        var canvas = ctx.canvas;
+        var width = canvas.width;
+        var height = canvas.height;
+
+        var bl = Util.applyTransform([0, 0], inv);
+        var br = Util.applyTransform([0, height], inv);
+        var ul = Util.applyTransform([width, 0], inv);
+        var ur = Util.applyTransform([width, height], inv);
+
+        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
+        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
+        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
+        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
+
+        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+      } else {
+        // HACK to draw the gradient onto an infinite rectangle.
+        // PDF gradients are drawn across the entire image while
+        // Canvas only allows gradients to be drawn in a rectangle
+        // The following bug should allow us to remove this.
+        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
+
+        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+      }
+
+      this.restore();
+    },
+
+    // Images
+    beginInlineImage: function CanvasGraphics_beginInlineImage() {
+      error('Should not call beginInlineImage');
+    },
+    beginImageData: function CanvasGraphics_beginImageData() {
+      error('Should not call beginImageData');
+    },
+
+    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
+                                                                        bbox) {
+      this.save();
+      this.baseTransformStack.push(this.baseTransform);
+
+      if (matrix && isArray(matrix) && 6 == matrix.length) {
+        this.transform.apply(this, matrix);
+      }
+
+      this.baseTransform = this.ctx.mozCurrentTransform;
+
+      if (bbox && isArray(bbox) && 4 == bbox.length) {
+        var width = bbox[2] - bbox[0];
+        var height = bbox[3] - bbox[1];
+        this.rectangle(bbox[0], bbox[1], width, height);
+        this.clip();
+        this.endPath();
+      }
+    },
+
+    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
+      this.restore();
+      this.baseTransform = this.baseTransformStack.pop();
+    },
+
+    beginGroup: function CanvasGraphics_beginGroup(group) {
+      this.save();
+      var currentCtx = this.ctx;
+      // TODO non-isolated groups - according to Rik at adobe non-isolated
+      // group results aren't usually that different and they even have tools
+      // that ignore this setting. Notes from Rik on implmenting:
+      // - When you encounter an transparency group, create a new canvas with
+      // the dimensions of the bbox
+      // - copy the content from the previous canvas to the new canvas
+      // - draw as usual
+      // - remove the backdrop alpha:
+      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha
+      // value of your transparency group and 'alphaBackdrop' the alpha of the
+      // backdrop
+      // - remove background color:
+      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)
+      if (!group.isolated) {
+        info('TODO: Support non-isolated groups.');
+      }
+
+      // TODO knockout - supposedly possible with the clever use of compositing
+      // modes.
+      if (group.knockout) {
+        warn('Knockout groups not supported.');
+      }
+
+      var currentTransform = currentCtx.mozCurrentTransform;
+      if (group.matrix) {
+        currentCtx.transform.apply(currentCtx, group.matrix);
+      }
+      assert(group.bbox, 'Bounding box is required.');
+
+      // Based on the current transform figure out how big the bounding box
+      // will actually be.
+      var bounds = Util.getAxialAlignedBoundingBox(
+                    group.bbox,
+                    currentCtx.mozCurrentTransform);
+      // Clip the bounding box to the current canvas.
+      var canvasBounds = [0,
+                          0,
+                          currentCtx.canvas.width,
+                          currentCtx.canvas.height];
+      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
+      // Use ceil in case we're between sizes so we don't create canvas that is
+      // too small and make the canvas at least 1x1 pixels.
+      var offsetX = Math.floor(bounds[0]);
+      var offsetY = Math.floor(bounds[1]);
+      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
+      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
+      var scaleX = 1, scaleY = 1;
+      if (drawnWidth > MAX_GROUP_SIZE) {
+        scaleX = drawnWidth / MAX_GROUP_SIZE;
+        drawnWidth = MAX_GROUP_SIZE;
+      }
+      if (drawnHeight > MAX_GROUP_SIZE) {
+        scaleY = drawnHeight / MAX_GROUP_SIZE;
+        drawnHeight = MAX_GROUP_SIZE;
+      }
+
+      var cacheId = 'groupAt' + this.groupLevel;
+      if (group.smask) {
+        // Using two cache entries is case if masks are used one after another.
+        cacheId +=  '_smask_' + ((this.smaskCounter++) % 2);
+      }
+      var scratchCanvas = CachedCanvases.getCanvas(
+        cacheId, drawnWidth, drawnHeight, true);
+      var groupCtx = scratchCanvas.context;
+
+      // Since we created a new canvas that is just the size of the bounding box
+      // we have to translate the group ctx.
+      groupCtx.scale(1 / scaleX, 1 / scaleY);
+      groupCtx.translate(-offsetX, -offsetY);
+      groupCtx.transform.apply(groupCtx, currentTransform);
+
+      if (group.smask) {
+        // Saving state and cached mask to be used in setGState.
+        this.smaskStack.push({
+          canvas: scratchCanvas.canvas,
+          context: groupCtx,
+          offsetX: offsetX,
+          offsetY: offsetY,
+          scaleX: scaleX,
+          scaleY: scaleY,
+          subtype: group.smask.subtype,
+          backdrop: group.smask.backdrop,
+          colorSpace: group.colorSpace && ColorSpace.fromIR(group.colorSpace)
+        });
+      } else {
+        // Setup the current ctx so when the group is popped we draw it at the
+        // right location.
+        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
+        currentCtx.translate(offsetX, offsetY);
+        currentCtx.scale(scaleX, scaleY);
+      }
+      // The transparency group inherits all off the current graphics state
+      // except the blend mode, soft mask, and alpha constants.
+      copyCtxState(currentCtx, groupCtx);
+      this.ctx = groupCtx;
+      this.setGState([
+        ['BM', 'Normal'],
+        ['ca', 1],
+        ['CA', 1]
+      ]);
+      this.groupStack.push(currentCtx);
+      this.groupLevel++;
+    },
+
+    endGroup: function CanvasGraphics_endGroup(group) {
+      this.groupLevel--;
+      var groupCtx = this.ctx;
+      this.ctx = this.groupStack.pop();
+      // Turn off image smoothing to avoid sub pixel interpolation which can
+      // look kind of blurry for some pdfs.
+      if ('imageSmoothingEnabled' in this.ctx) {
+        this.ctx.imageSmoothingEnabled = false;
+      } else {
+        this.ctx.mozImageSmoothingEnabled = false;
+      }
+      if (group.smask) {
+        this.tempSMask = this.smaskStack.pop();
+      } else {
+        this.ctx.drawImage(groupCtx.canvas, 0, 0);
+      }
+      this.restore();
+    },
+
+    beginAnnotations: function CanvasGraphics_beginAnnotations() {
+      this.save();
+      this.current = new CanvasExtraState();
+    },
+
+    endAnnotations: function CanvasGraphics_endAnnotations() {
+      this.restore();
+    },
+
+    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,
+                                                             matrix) {
+      this.save();
+
+      if (rect && isArray(rect) && 4 == rect.length) {
+        var width = rect[2] - rect[0];
+        var height = rect[3] - rect[1];
+        this.rectangle(rect[0], rect[1], width, height);
+        this.clip();
+        this.endPath();
+      }
+
+      this.transform.apply(this, transform);
+      this.transform.apply(this, matrix);
+    },
+
+    endAnnotation: function CanvasGraphics_endAnnotation() {
+      this.restore();
+    },
+
+    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
+      var domImage = this.objs.get(objId);
+      if (!domImage) {
+        warn('Dependent image isn\'t ready yet');
+        return;
+      }
+
+      this.save();
+
+      var ctx = this.ctx;
+      // scale the image to the unit square
+      ctx.scale(1 / w, -1 / h);
+
+      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+                    0, -h, w, h);
+      if (this.imageLayer) {
+        var currentTransform = ctx.mozCurrentTransformInverse;
+        var position = this.getCanvasPosition(0, 0);
+        this.imageLayer.appendImage({
+          objId: objId,
+          left: position[0],
+          top: position[1],
+          width: w / currentTransform[0],
+          height: h / currentTransform[3]
+        });
+      }
+      this.restore();
+    },
+
+    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
+      var ctx = this.ctx;
+      var width = img.width, height = img.height;
+
+      var glyph = this.processingType3;
+
+      if (COMPILE_TYPE3_GLYPHS && glyph && !('compiled' in glyph)) {
+        var MAX_SIZE_TO_COMPILE = 1000;
+        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
+          glyph.compiled =
+            compileType3Glyph({data: img.data, width: width, height: height});
+        } else {
+          glyph.compiled = null;
+        }
+      }
+
+      if (glyph && glyph.compiled) {
+        glyph.compiled(ctx);
+        return;
+      }
+
+      var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
+      var maskCtx = maskCanvas.context;
+      maskCtx.save();
+
+      putBinaryImageMask(maskCtx, img);
+
+      maskCtx.globalCompositeOperation = 'source-in';
+
+      var fillColor = this.current.fillColor;
+      maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+                          fillColor.type === 'Pattern') ?
+                          fillColor.getPattern(maskCtx, this) : fillColor;
+      maskCtx.fillRect(0, 0, width, height);
+
+      maskCtx.restore();
+
+      this.paintInlineImageXObject(maskCanvas.canvas);
+    },
+
+    paintImageMaskXObjectRepeat:
+      function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,
+                                                          scaleY, positions) {
+      var width = imgData.width;
+      var height = imgData.height;
+      var ctx = this.ctx;
+
+      var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
+      var maskCtx = maskCanvas.context;
+      maskCtx.save();
+
+      putBinaryImageMask(maskCtx, imgData);
+
+      maskCtx.globalCompositeOperation = 'source-in';
+
+      var fillColor = this.current.fillColor;
+      maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+        fillColor.type === 'Pattern') ?
+        fillColor.getPattern(maskCtx, this) : fillColor;
+      maskCtx.fillRect(0, 0, width, height);
+
+      maskCtx.restore();
+
+      for (var i = 0, ii = positions.length; i < ii; i += 2) {
+        ctx.save();
+        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);
+        ctx.scale(1, -1);
+        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
+          0, -1, 1, 1);
+        ctx.restore();
+      }
+    },
+
+    paintImageMaskXObjectGroup:
+      function CanvasGraphics_paintImageMaskXObjectGroup(images) {
+      var ctx = this.ctx;
+
+      for (var i = 0, ii = images.length; i < ii; i++) {
+        var image = images[i];
+        var width = image.width, height = image.height;
+
+        var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
+        var maskCtx = maskCanvas.context;
+        maskCtx.save();
+
+        putBinaryImageMask(maskCtx, image);
+
+        maskCtx.globalCompositeOperation = 'source-in';
+
+        var fillColor = this.current.fillColor;
+        maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+                            fillColor.type === 'Pattern') ?
+                            fillColor.getPattern(maskCtx, this) : fillColor;
+        maskCtx.fillRect(0, 0, width, height);
+
+        maskCtx.restore();
+
+        ctx.save();
+        ctx.transform.apply(ctx, image.transform);
+        ctx.scale(1, -1);
+        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
+                      0, -1, 1, 1);
+        ctx.restore();
+      }
+    },
+
+    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
+      var imgData = this.objs.get(objId);
+      if (!imgData) {
+        warn('Dependent image isn\'t ready yet');
+        return;
+      }
+
+      this.paintInlineImageXObject(imgData);
+    },
+
+    paintImageXObjectRepeat:
+      function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,
+                                                          positions) {
+      var imgData = this.objs.get(objId);
+      if (!imgData) {
+        warn('Dependent image isn\'t ready yet');
+        return;
+      }
+
+      var width = imgData.width;
+      var height = imgData.height;
+      var map = [];
+      for (var i = 0, ii = positions.length; i < ii; i += 2) {
+        map.push({transform: [scaleX, 0, 0, scaleY, positions[i],
+                 positions[i + 1]], x: 0, y: 0, w: width, h: height});
+      }
+      this.paintInlineImageXObjectGroup(imgData, map);
+    },
+
+    paintInlineImageXObject:
+      function CanvasGraphics_paintInlineImageXObject(imgData) {
+      var width = imgData.width;
+      var height = imgData.height;
+      var ctx = this.ctx;
+
+      this.save();
+      // scale the image to the unit square
+      ctx.scale(1 / width, -1 / height);
+
+      var currentTransform = ctx.mozCurrentTransformInverse;
+      var a = currentTransform[0], b = currentTransform[1];
+      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
+      var c = currentTransform[2], d = currentTransform[3];
+      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
+
+      var imgToPaint, tmpCanvas;
+      // instanceof HTMLElement does not work in jsdom node.js module
+      if (imgData instanceof HTMLElement || !imgData.data) {
+        imgToPaint = imgData;
+      } else {
+        tmpCanvas = CachedCanvases.getCanvas('inlineImage', width, height);
+        var tmpCtx = tmpCanvas.context;
+        putBinaryImageData(tmpCtx, imgData);
+        imgToPaint = tmpCanvas.canvas;
+      }
+
+      var paintWidth = width, paintHeight = height;
+      var tmpCanvasId = 'prescale1';
+      // Vertial or horizontal scaling shall not be more than 2 to not loose the
+      // pixels during drawImage operation, painting on the temporary canvas(es)
+      // that are twice smaller in size
+      while ((widthScale > 2 && paintWidth > 1) ||
+             (heightScale > 2 && paintHeight > 1)) {
+        var newWidth = paintWidth, newHeight = paintHeight;
+        if (widthScale > 2 && paintWidth > 1) {
+          newWidth = Math.ceil(paintWidth / 2);
+          widthScale /= paintWidth / newWidth;
+        }
+        if (heightScale > 2 && paintHeight > 1) {
+          newHeight = Math.ceil(paintHeight / 2);
+          heightScale /= paintHeight / newHeight;
+        }
+        tmpCanvas = CachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
+        tmpCtx = tmpCanvas.context;
+        tmpCtx.clearRect(0, 0, newWidth, newHeight);
+        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
+                                     0, 0, newWidth, newHeight);
+        imgToPaint = tmpCanvas.canvas;
+        paintWidth = newWidth;
+        paintHeight = newHeight;
+        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';
+      }
+      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
+                                0, -height, width, height);
+
+      if (this.imageLayer) {
+        var position = this.getCanvasPosition(0, -height);
+        this.imageLayer.appendImage({
+          imgData: imgData,
+          left: position[0],
+          top: position[1],
+          width: width / currentTransform[0],
+          height: height / currentTransform[3]
+        });
+      }
+      this.restore();
+    },
+
+    paintInlineImageXObjectGroup:
+      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
+      var ctx = this.ctx;
+      var w = imgData.width;
+      var h = imgData.height;
+
+      var tmpCanvas = CachedCanvases.getCanvas('inlineImage', w, h);
+      var tmpCtx = tmpCanvas.context;
+      putBinaryImageData(tmpCtx, imgData);
+
+      for (var i = 0, ii = map.length; i < ii; i++) {
+        var entry = map[i];
+        ctx.save();
+        ctx.transform.apply(ctx, entry.transform);
+        ctx.scale(1, -1);
+        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,
+                      0, -1, 1, 1);
+        if (this.imageLayer) {
+          var position = this.getCanvasPosition(entry.x, entry.y);
+          this.imageLayer.appendImage({
+            imgData: imgData,
+            left: position[0],
+            top: position[1],
+            width: w,
+            height: h
+          });
+        }
+        ctx.restore();
+      }
+    },
+
+    paintSolidColorImageMask:
+      function CanvasGraphics_paintSolidColorImageMask() {
+        this.ctx.fillRect(0, 0, 1, 1);
+    },
+
+    // Marked content
+
+    markPoint: function CanvasGraphics_markPoint(tag) {
+      // TODO Marked content.
+    },
+    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
+      // TODO Marked content.
+    },
+    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
+      // TODO Marked content.
+    },
+    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
+                                        tag, properties) {
+      // TODO Marked content.
+    },
+    endMarkedContent: function CanvasGraphics_endMarkedContent() {
+      // TODO Marked content.
+    },
+
+    // Compatibility
+
+    beginCompat: function CanvasGraphics_beginCompat() {
+      // TODO ignore undefined operators (should we do that anyway?)
+    },
+    endCompat: function CanvasGraphics_endCompat() {
+      // TODO stop ignoring undefined operators
+    },
+
+    // Helper functions
+
+    consumePath: function CanvasGraphics_consumePath() {
+      if (this.pendingClip) {
+        if (this.pendingClip == EO_CLIP) {
+          if ('mozFillRule' in this.ctx) {
+            this.ctx.mozFillRule = 'evenodd';
+            this.ctx.clip();
+            this.ctx.mozFillRule = 'nonzero';
+          } else {
+            try {
+              this.ctx.clip('evenodd');
+            } catch (ex) {
+              // shouldn't really happen, but browsers might think differently
+              this.ctx.clip();
+            }
+          }
+        } else {
+          this.ctx.clip();
+        }
+        this.pendingClip = null;
+      }
+      this.ctx.beginPath();
+    },
+    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
+      var inverse = this.ctx.mozCurrentTransformInverse;
+      // max of the current horizontal and vertical scale
+      return Math.sqrt(Math.max(
+        (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
+        (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
+    },
+    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
+        var transform = this.ctx.mozCurrentTransform;
+        return [
+          transform[0] * x + transform[2] * y + transform[4],
+          transform[1] * x + transform[3] * y + transform[5]
+        ];
+    }
+  };
+
+  for (var op in OPS) {
+    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];
+  }
+
+  return CanvasGraphics;
+})();
+
+
+
+var WebGLUtils = (function WebGLUtilsClosure() {
+  function loadShader(gl, code, shaderType) {
+    var shader = gl.createShader(shaderType);
+    gl.shaderSource(shader, code);
+    gl.compileShader(shader);
+    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
+    if (!compiled) {
+      var errorMsg = gl.getShaderInfoLog(shader);
+      throw new Error('Error during shader compilation: ' + errorMsg);
+    }
+    return shader;
+  }
+  function createVertexShader(gl, code) {
+    return loadShader(gl, code, gl.VERTEX_SHADER);
+  }
+  function createFragmentShader(gl, code) {
+    return loadShader(gl, code, gl.FRAGMENT_SHADER);
+  }
+  function createProgram(gl, shaders) {
+    var program = gl.createProgram();
+    for (var i = 0, ii = shaders.length; i < ii; ++i) {
+      gl.attachShader(program, shaders[i]);
+    }
+    gl.linkProgram(program);
+    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
+    if (!linked) {
+      var errorMsg = gl.getProgramInfoLog(program);
+      throw new Error('Error during program linking: ' + errorMsg);
+    }
+    return program;
+  }
+  function createTexture(gl, image, textureId) {
+    gl.activeTexture(textureId);
+    var texture = gl.createTexture();
+    gl.bindTexture(gl.TEXTURE_2D, texture);
+
+    // Set the parameters so we can render any size image.
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+
+    // Upload the image into the texture.
+    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
+    return texture;
+  }
+
+  var currentGL, currentCanvas;
+  function generageGL() {
+    if (currentGL) {
+      return;
+    }
+    currentCanvas = document.createElement('canvas');
+    currentGL = currentCanvas.getContext('webgl',
+      { premultipliedalpha: false });
+  }
+
+  var smaskVertexShaderCode = '\
+  attribute vec2 a_position;                                    \
+  attribute vec2 a_texCoord;                                    \
+                                                                \
+  uniform vec2 u_resolution;                                    \
+                                                                \
+  varying vec2 v_texCoord;                                      \
+                                                                \
+  void main() {                                                 \
+    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \
+    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
+                                                                \
+    v_texCoord = a_texCoord;                                    \
+  }                                                             ';
+
+  var smaskFragmentShaderCode = '\
+  precision mediump float;                                      \
+                                                                \
+  uniform vec4 u_backdrop;                                      \
+  uniform int u_subtype;                                        \
+  uniform sampler2D u_image;                                    \
+  uniform sampler2D u_mask;                                     \
+                                                                \
+  varying vec2 v_texCoord;                                      \
+                                                                \
+  void main() {                                                 \
+    vec4 imageColor = texture2D(u_image, v_texCoord);           \
+    vec4 maskColor = texture2D(u_mask, v_texCoord);             \
+    if (u_backdrop.a > 0.0) {                                   \
+      maskColor.rgb = maskColor.rgb * maskColor.a +             \
+                      u_backdrop.rgb * (1.0 - maskColor.a);     \
+    }                                                           \
+    float lum;                                                  \
+    if (u_subtype == 0) {                                       \
+      lum = maskColor.a;                                        \
+    } else {                                                    \
+      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \
+            maskColor.b * 0.11;                                 \
+    }                                                           \
+    imageColor.a *= lum;                                        \
+    imageColor.rgb *= imageColor.a;                             \
+    gl_FragColor = imageColor;                                  \
+  }                                                             ';
+
+  var smaskCache = null;
+
+  function initSmaskGL() {
+    var canvas, gl;
+
+    generageGL();
+    canvas = currentCanvas;
+    currentCanvas = null;
+    gl = currentGL;
+    currentGL = null;
+
+    // setup a GLSL program
+    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);
+    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);
+    var program = createProgram(gl, [vertexShader, fragmentShader]);
+    gl.useProgram(program);
+
+    var cache = {};
+    cache.gl = gl;
+    cache.canvas = canvas;
+    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
+    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
+    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');
+    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');
+
+    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');
+    var texLayerLocation = gl.getUniformLocation(program, 'u_image');
+    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');
+
+    // provide texture coordinates for the rectangle.
+    var texCoordBuffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+      0.0,  0.0,
+      1.0,  0.0,
+      0.0,  1.0,
+      0.0,  1.0,
+      1.0,  0.0,
+      1.0,  1.0]), gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(texCoordLocation);
+    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
+
+    gl.uniform1i(texLayerLocation, 0);
+    gl.uniform1i(texMaskLocation, 1);
+
+    smaskCache = cache;
+  }
+
+  function composeSMask(layer, mask, properties) {
+    var width = layer.width, height = layer.height;
+
+    if (!smaskCache) {
+      initSmaskGL();
+    }
+    var cache = smaskCache,canvas = cache.canvas, gl = cache.gl;
+    canvas.width = width;
+    canvas.height = height;
+    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
+    gl.uniform2f(cache.resolutionLocation, width, height);
+
+    if (properties.backdrop) {
+      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],
+                   properties.backdrop[1], properties.backdrop[2], 1);
+    } else {
+      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);
+    }
+    gl.uniform1i(cache.subtypeLocation,
+                 properties.subtype === 'Luminosity' ? 1 : 0);
+
+    // Create a textures
+    var texture = createTexture(gl, layer, gl.TEXTURE0);
+    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
+
+
+    // Create a buffer and put a single clipspace rectangle in
+    // it (2 triangles)
+    var buffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+      0, 0,
+      width, 0,
+      0, height,
+      0, height,
+      width, 0,
+      width, height]), gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(cache.positionLocation);
+    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
+
+    // draw
+    gl.clearColor(0, 0, 0, 0);
+    gl.enable(gl.BLEND);
+    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
+    gl.clear(gl.COLOR_BUFFER_BIT);
+
+    gl.drawArrays(gl.TRIANGLES, 0, 6);
+
+    gl.flush();
+
+    gl.deleteTexture(texture);
+    gl.deleteTexture(maskTexture);
+    gl.deleteBuffer(buffer);
+
+    return canvas;
+  }
+
+  var figuresVertexShaderCode = '\
+  attribute vec2 a_position;                                    \
+  attribute vec3 a_color;                                       \
+                                                                \
+  uniform vec2 u_resolution;                                    \
+  uniform vec2 u_scale;                                         \
+  uniform vec2 u_offset;                                        \
+                                                                \
+  varying vec4 v_color;                                         \
+                                                                \
+  void main() {                                                 \
+    vec2 position = (a_position + u_offset) * u_scale;          \
+    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \
+    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
+                                                                \
+    v_color = vec4(a_color / 255.0, 1.0);                       \
+  }                                                             ';
+
+  var figuresFragmentShaderCode = '\
+  precision mediump float;                                      \
+                                                                \
+  varying vec4 v_color;                                         \
+                                                                \
+  void main() {                                                 \
+    gl_FragColor = v_color;                                     \
+  }                                                             ';
+
+  var figuresCache = null;
+
+  function initFiguresGL() {
+    var canvas, gl;
+
+    generageGL();
+    canvas = currentCanvas;
+    currentCanvas = null;
+    gl = currentGL;
+    currentGL = null;
+
+    // setup a GLSL program
+    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);
+    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);
+    var program = createProgram(gl, [vertexShader, fragmentShader]);
+    gl.useProgram(program);
+
+    var cache = {};
+    cache.gl = gl;
+    cache.canvas = canvas;
+    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
+    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');
+    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');
+    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
+    cache.colorLocation = gl.getAttribLocation(program, 'a_color');
+
+    figuresCache = cache;
+  }
+
+  function drawFigures(width, height, backgroundColor, figures, context) {
+    if (!figuresCache) {
+      initFiguresGL();
+    }
+    var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;
+
+    canvas.width = width;
+    canvas.height = height;
+    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
+    gl.uniform2f(cache.resolutionLocation, width, height);
+
+    // count triangle points
+    var count = 0;
+    var i, ii, rows;
+    for (i = 0, ii = figures.length; i < ii; i++) {
+      switch (figures[i].type) {
+        case 'lattice':
+          rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;
+          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;
+          break;
+        case 'triangles':
+          count += figures[i].coords.length;
+          break;
+      }
+    }
+    // transfer data
+    var coords = new Float32Array(count * 2);
+    var colors = new Uint8Array(count * 3);
+    var coordsMap = context.coords, colorsMap = context.colors;
+    var pIndex = 0, cIndex = 0;
+    for (i = 0, ii = figures.length; i < ii; i++) {
+      var figure = figures[i], ps = figure.coords, cs = figure.colors;
+      switch (figure.type) {
+        case 'lattice':
+          var cols = figure.verticesPerRow;
+          rows = (ps.length / cols) | 0;
+          for (var row = 1; row < rows; row++) {
+            var offset = row * cols + 1;
+            for (var col = 1; col < cols; col++, offset++) {
+              coords[pIndex] = coordsMap[ps[offset - cols - 1]];
+              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];
+              coords[pIndex + 2] = coordsMap[ps[offset - cols]];
+              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];
+              coords[pIndex + 4] = coordsMap[ps[offset - 1]];
+              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];
+              colors[cIndex] = colorsMap[cs[offset - cols - 1]];
+              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];
+              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];
+              colors[cIndex + 3] = colorsMap[cs[offset - cols]];
+              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];
+              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];
+              colors[cIndex + 6] = colorsMap[cs[offset - 1]];
+              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];
+              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];
+
+              coords[pIndex + 6] = coords[pIndex + 2];
+              coords[pIndex + 7] = coords[pIndex + 3];
+              coords[pIndex + 8] = coords[pIndex + 4];
+              coords[pIndex + 9] = coords[pIndex + 5];
+              coords[pIndex + 10] = coordsMap[ps[offset]];
+              coords[pIndex + 11] = coordsMap[ps[offset] + 1];
+              colors[cIndex + 9] = colors[cIndex + 3];
+              colors[cIndex + 10] = colors[cIndex + 4];
+              colors[cIndex + 11] = colors[cIndex + 5];
+              colors[cIndex + 12] = colors[cIndex + 6];
+              colors[cIndex + 13] = colors[cIndex + 7];
+              colors[cIndex + 14] = colors[cIndex + 8];
+              colors[cIndex + 15] = colorsMap[cs[offset]];
+              colors[cIndex + 16] = colorsMap[cs[offset] + 1];
+              colors[cIndex + 17] = colorsMap[cs[offset] + 2];
+              pIndex += 12;
+              cIndex += 18;
+            }
+          }
+          break;
+        case 'triangles':
+          for (var j = 0, jj = ps.length; j < jj; j++) {
+            coords[pIndex] = coordsMap[ps[j]];
+            coords[pIndex + 1] = coordsMap[ps[j] + 1];
+            colors[cIndex] = colorsMap[cs[i]];
+            colors[cIndex + 1] = colorsMap[cs[j] + 1];
+            colors[cIndex + 2] = colorsMap[cs[j] + 2];
+            pIndex += 2;
+            cIndex += 3;
+          }
+          break;
+      }
+    }
+
+    // draw
+    if (backgroundColor) {
+      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,
+                    backgroundColor[2] / 255, 1.0);
+    } else {
+      gl.clearColor(0, 0, 0, 0);
+    }
+    gl.clear(gl.COLOR_BUFFER_BIT);
+
+    var coordsBuffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(cache.positionLocation);
+    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
+
+    var colorsBuffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(cache.colorLocation);
+    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,
+                           0, 0);
+
+    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);
+    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);
+
+    gl.drawArrays(gl.TRIANGLES, 0, count);
+
+    gl.flush();
+
+    gl.deleteBuffer(coordsBuffer);
+    gl.deleteBuffer(colorsBuffer);
+
+    return canvas;
+  }
+
+  function cleanup() {
+    smaskCache = null;
+    figuresCache = null;
+  }
+
+  return {
+    get isEnabled() {
+      if (PDFJS.disableWebGL) {
+        return false;
+      }
+      var enabled = false;
+      try {
+        generageGL();
+        enabled = !!currentGL;
+      } catch (e) { }
+      return shadow(this, 'isEnabled', enabled);
+    },
+    composeSMask: composeSMask,
+    drawFigures: drawFigures,
+    clear: cleanup
+  };
+})();
+
+
+var ShadingIRs = {};
+
+ShadingIRs.RadialAxial = {
+  fromIR: function RadialAxial_fromIR(raw) {
+    var type = raw[1];
+    var colorStops = raw[2];
+    var p0 = raw[3];
+    var p1 = raw[4];
+    var r0 = raw[5];
+    var r1 = raw[6];
+    return {
+      type: 'Pattern',
+      getPattern: function RadialAxial_getPattern(ctx) {
+        var grad;
+        if (type === 'axial') {
+          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
+        } else if (type === 'radial') {
+          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
+        }
+
+        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
+          var c = colorStops[i];
+          grad.addColorStop(c[0], c[1]);
+        }
+        return grad;
+      }
+    };
+  }
+};
+
+var createMeshCanvas = (function createMeshCanvasClosure() {
+  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
+    // Very basic Gouraud-shaded triangle rasterization algorithm.
+    var coords = context.coords, colors = context.colors;
+    var bytes = data.data, rowSize = data.width * 4;
+    var tmp;
+    if (coords[p1 + 1] > coords[p2 + 1]) {
+      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
+    }
+    if (coords[p2 + 1] > coords[p3 + 1]) {
+      tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;
+    }
+    if (coords[p1 + 1] > coords[p2 + 1]) {
+      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
+    }
+    var x1 = (coords[p1] + context.offsetX) * context.scaleX;
+    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
+    var x2 = (coords[p2] + context.offsetX) * context.scaleX;
+    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
+    var x3 = (coords[p3] + context.offsetX) * context.scaleX;
+    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
+    if (y1 >= y3) {
+      return;
+    }
+    var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];
+    var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];
+    var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];
+
+    var minY = Math.round(y1), maxY = Math.round(y3);
+    var xa, car, cag, cab;
+    var xb, cbr, cbg, cbb;
+    var k;
+    for (var y = minY; y <= maxY; y++) {
+      if (y < y2) {
+        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);
+        xa = x1 - (x1 - x2) * k;
+        car = c1r - (c1r - c2r) * k;
+        cag = c1g - (c1g - c2g) * k;
+        cab = c1b - (c1b - c2b) * k;
+      } else {
+        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);
+        xa = x2 - (x2 - x3) * k;
+        car = c2r - (c2r - c3r) * k;
+        cag = c2g - (c2g - c3g) * k;
+        cab = c2b - (c2b - c3b) * k;
+      }
+      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);
+      xb = x1 - (x1 - x3) * k;
+      cbr = c1r - (c1r - c3r) * k;
+      cbg = c1g - (c1g - c3g) * k;
+      cbb = c1b - (c1b - c3b) * k;
+      var x1_ = Math.round(Math.min(xa, xb));
+      var x2_ = Math.round(Math.max(xa, xb));
+      var j = rowSize * y + x1_ * 4;
+      for (var x = x1_; x <= x2_; x++) {
+        k = (xa - x) / (xa - xb);
+        k = k < 0 ? 0 : k > 1 ? 1 : k;
+        bytes[j++] = (car - (car - cbr) * k) | 0;
+        bytes[j++] = (cag - (cag - cbg) * k) | 0;
+        bytes[j++] = (cab - (cab - cbb) * k) | 0;
+        bytes[j++] = 255;
+      }
+    }
+  }
+
+  function drawFigure(data, figure, context) {
+    var ps = figure.coords;
+    var cs = figure.colors;
+    var i, ii;
+    switch (figure.type) {
+      case 'lattice':
+        var verticesPerRow = figure.verticesPerRow;
+        var rows = Math.floor(ps.length / verticesPerRow) - 1;
+        var cols = verticesPerRow - 1;
+        for (i = 0; i < rows; i++) {
+          var q = i * verticesPerRow;
+          for (var j = 0; j < cols; j++, q++) {
+            drawTriangle(data, context,
+              ps[q], ps[q + 1], ps[q + verticesPerRow],
+              cs[q], cs[q + 1], cs[q + verticesPerRow]);
+            drawTriangle(data, context,
+              ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],
+              cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
+          }
+        }
+        break;
+      case 'triangles':
+        for (i = 0, ii = ps.length; i < ii; i += 3) {
+          drawTriangle(data, context,
+            ps[i], ps[i + 1], ps[i + 2],
+            cs[i], cs[i + 1], cs[i + 2]);
+        }
+        break;
+      default:
+        error('illigal figure');
+        break;
+    }
+  }
+
+  function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
+                            backgroundColor) {
+    // we will increase scale on some weird factor to let antialiasing take
+    // care of "rough" edges
+    var EXPECTED_SCALE = 1.1;
+    // MAX_PATTERN_SIZE is used to avoid OOM situation.
+    var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
+
+    var offsetX = Math.floor(bounds[0]);
+    var offsetY = Math.floor(bounds[1]);
+    var boundsWidth = Math.ceil(bounds[2]) - offsetX;
+    var boundsHeight = Math.ceil(bounds[3]) - offsetY;
+
+    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *
+      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
+    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *
+      EXPECTED_SCALE)), MAX_PATTERN_SIZE);
+    var scaleX = boundsWidth / width;
+    var scaleY = boundsHeight / height;
+
+    var context = {
+      coords: coords,
+      colors: colors,
+      offsetX: -offsetX,
+      offsetY: -offsetY,
+      scaleX: 1 / scaleX,
+      scaleY: 1 / scaleY
+    };
+
+    var canvas, tmpCanvas, i, ii;
+    if (WebGLUtils.isEnabled) {
+      canvas = WebGLUtils.drawFigures(width, height, backgroundColor,
+                                      figures, context);
+
+      // https://bugzilla.mozilla.org/show_bug.cgi?id=972126
+      tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
+      tmpCanvas.context.drawImage(canvas, 0, 0);
+      canvas = tmpCanvas.canvas;
+    } else {
+      tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
+      var tmpCtx = tmpCanvas.context;
+
+      var data = tmpCtx.createImageData(width, height);
+      if (backgroundColor) {
+        var bytes = data.data;
+        for (i = 0, ii = bytes.length; i < ii; i += 4) {
+          bytes[i] = backgroundColor[0];
+          bytes[i + 1] = backgroundColor[1];
+          bytes[i + 2] = backgroundColor[2];
+          bytes[i + 3] = 255;
+        }
+      }
+      for (i = 0; i < figures.length; i++) {
+        drawFigure(data, figures[i], context);
+      }
+      tmpCtx.putImageData(data, 0, 0);
+      canvas = tmpCanvas.canvas;
+    }
+
+    return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,
+            scaleX: scaleX, scaleY: scaleY};
+  }
+  return createMeshCanvas;
+})();
+
+ShadingIRs.Mesh = {
+  fromIR: function Mesh_fromIR(raw) {
+    //var type = raw[1];
+    var coords = raw[2];
+    var colors = raw[3];
+    var figures = raw[4];
+    var bounds = raw[5];
+    var matrix = raw[6];
+    //var bbox = raw[7];
+    var background = raw[8];
+    return {
+      type: 'Pattern',
+      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
+        var combinedScale;
+        // Obtain scale from matrix and current transformation matrix.
+        if (shadingFill) {
+          combinedScale = Util.singularValueDecompose2dScale(
+            ctx.mozCurrentTransform);
+        } else {
+          var matrixScale = Util.singularValueDecompose2dScale(matrix);
+          var curMatrixScale = Util.singularValueDecompose2dScale(
+            owner.baseTransform);
+          combinedScale = [matrixScale[0] * curMatrixScale[0],
+            matrixScale[1] * curMatrixScale[1]];
+        }
+
+
+        // Rasterizing on the main thread since sending/queue large canvases
+        // might cause OOM.
+        var temporaryPatternCanvas = createMeshCanvas(bounds, combinedScale,
+          coords, colors, figures, shadingFill ? null : background);
+
+        if (!shadingFill) {
+          ctx.setTransform.apply(ctx, owner.baseTransform);
+          if (matrix) {
+            ctx.transform.apply(ctx, matrix);
+          }
+        }
+
+        ctx.translate(temporaryPatternCanvas.offsetX,
+                      temporaryPatternCanvas.offsetY);
+        ctx.scale(temporaryPatternCanvas.scaleX,
+                  temporaryPatternCanvas.scaleY);
+
+        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');
+      }
+    };
+  }
+};
+
+ShadingIRs.Dummy = {
+  fromIR: function Dummy_fromIR() {
+    return {
+      type: 'Pattern',
+      getPattern: function Dummy_fromIR_getPattern() {
+        return 'hotpink';
+      }
+    };
+  }
+};
+
+function getShadingPatternFromIR(raw) {
+  var shadingIR = ShadingIRs[raw[0]];
+  if (!shadingIR) {
+    error('Unknown IR type: ' + raw[0]);
+  }
+  return shadingIR.fromIR(raw);
+}
+
+var TilingPattern = (function TilingPatternClosure() {
+  var PaintType = {
+    COLORED: 1,
+    UNCOLORED: 2
+  };
+
+  var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
+
+  function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) {
+    this.name = IR[1][0].name;
+    this.operatorList = IR[2];
+    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
+    this.bbox = IR[4];
+    this.xstep = IR[5];
+    this.ystep = IR[6];
+    this.paintType = IR[7];
+    this.tilingType = IR[8];
+    this.color = color;
+    this.objs = objs;
+    this.commonObjs = commonObjs;
+    this.baseTransform = baseTransform;
+    this.type = 'Pattern';
+    this.ctx = ctx;
+  }
+
+  TilingPattern.prototype = {
+    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {
+      var operatorList = this.operatorList;
+      var bbox = this.bbox;
+      var xstep = this.xstep;
+      var ystep = this.ystep;
+      var paintType = this.paintType;
+      var tilingType = this.tilingType;
+      var color = this.color;
+      var objs = this.objs;
+      var commonObjs = this.commonObjs;
+
+      info('TilingType: ' + tilingType);
+
+      var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
+
+      var topLeft = [x0, y0];
+      // we want the canvas to be as large as the step size
+      var botRight = [x0 + xstep, y0 + ystep];
+
+      var width = botRight[0] - topLeft[0];
+      var height = botRight[1] - topLeft[1];
+
+      // Obtain scale from matrix and current transformation matrix.
+      var matrixScale = Util.singularValueDecompose2dScale(this.matrix);
+      var curMatrixScale = Util.singularValueDecompose2dScale(
+        this.baseTransform);
+      var combinedScale = [matrixScale[0] * curMatrixScale[0],
+        matrixScale[1] * curMatrixScale[1]];
+
+      // MAX_PATTERN_SIZE is used to avoid OOM situation.
+      // Use width and height values that are as close as possible to the end
+      // result when the pattern is used. Too low value makes the pattern look
+      // blurry. Too large value makes it look too crispy.
+      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),
+        MAX_PATTERN_SIZE);
+
+      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),
+        MAX_PATTERN_SIZE);
+
+      var tmpCanvas = CachedCanvases.getCanvas('pattern', width, height, true);
+      var tmpCtx = tmpCanvas.context;
+      var graphics = new CanvasGraphics(tmpCtx, commonObjs, objs);
+      graphics.groupLevel = owner.groupLevel;
+
+      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);
+
+      this.setScale(width, height, xstep, ystep);
+      this.transformToScale(graphics);
+
+      // transform coordinates to pattern space
+      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
+      graphics.transform.apply(graphics, tmpTranslate);
+
+      this.clipBbox(graphics, bbox, x0, y0, x1, y1);
+
+      graphics.executeOperatorList(operatorList);
+      return tmpCanvas.canvas;
+    },
+
+    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {
+      this.scale = [width / xstep, height / ystep];
+    },
+
+    transformToScale: function TilingPattern_transformToScale(graphics) {
+      var scale = this.scale;
+      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
+      graphics.transform.apply(graphics, tmpScale);
+    },
+
+    scaleToContext: function TilingPattern_scaleToContext() {
+      var scale = this.scale;
+      this.ctx.scale(1 / scale[0], 1 / scale[1]);
+    },
+
+    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
+      if (bbox && isArray(bbox) && 4 == bbox.length) {
+        var bboxWidth = x1 - x0;
+        var bboxHeight = y1 - y0;
+        graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
+        graphics.clip();
+        graphics.endPath();
+      }
+    },
+
+    setFillAndStrokeStyleToContext:
+      function setFillAndStrokeStyleToContext(context, paintType, color) {
+        switch (paintType) {
+          case PaintType.COLORED:
+            var ctx = this.ctx;
+            context.fillStyle = ctx.fillStyle;
+            context.strokeStyle = ctx.strokeStyle;
+            break;
+          case PaintType.UNCOLORED:
+            var rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0);
+            var cssColor = Util.makeCssRgb(rgbColor);
+            context.fillStyle = cssColor;
+            context.strokeStyle = cssColor;
+            break;
+          default:
+            error('Unsupported paint type: ' + paintType);
+        }
+      },
+
+    getPattern: function TilingPattern_getPattern(ctx, owner) {
+      var temporaryPatternCanvas = this.createPatternCanvas(owner);
+
+      ctx = this.ctx;
+      ctx.setTransform.apply(ctx, this.baseTransform);
+      ctx.transform.apply(ctx, this.matrix);
+      this.scaleToContext();
+
+      return ctx.createPattern(temporaryPatternCanvas, 'repeat');
+    }
+  };
+
+  return TilingPattern;
+})();
+
+
+PDFJS.disableFontFace = false;
+
+var FontLoader = {
+  insertRule: function fontLoaderInsertRule(rule) {
+    var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');
+    if (!styleElement) {
+      styleElement = document.createElement('style');
+      styleElement.id = 'PDFJS_FONT_STYLE_TAG';
+      document.documentElement.getElementsByTagName('head')[0].appendChild(
+        styleElement);
+    }
+
+    var styleSheet = styleElement.sheet;
+    styleSheet.insertRule(rule, styleSheet.cssRules.length);
+  },
+
+  clear: function fontLoaderClear() {
+    var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');
+    if (styleElement) {
+      styleElement.parentNode.removeChild(styleElement);
+    }
+  },
+  get loadTestFont() {
+    // This is a CFF font with 1 glyph for '.' that fills its entire width and
+    // height.
+    return shadow(this, 'loadTestFont', atob(
+      'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' +
+      'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' +
+      'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' +
+      'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' +
+      'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' +
+      'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' +
+      'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' +
+      'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' +
+      'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' +
+      'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' +
+      'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' +
+      'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' +
+      'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' +
+      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
+      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
+      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
+      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' +
+      'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' +
+      'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' +
+      'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' +
+      'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' +
+      'ABAAAAAAAAAAAD6AAAAAAAAA=='
+    ));
+  },
+
+  loadTestFontId: 0,
+
+  loadingContext: {
+    requests: [],
+    nextRequestId: 0
+  },
+
+  isSyncFontLoadingSupported: (function detectSyncFontLoadingSupport() {
+    if (isWorker) {
+      return false;
+    }
+
+    // User agent string sniffing is bad, but there is no reliable way to tell
+    // if font is fully loaded and ready to be used with canvas.
+    var userAgent = window.navigator.userAgent;
+    var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);
+    if (m && m[1] >= 14) {
+      return true;
+    }
+    // TODO other browsers
+    return false;
+  })(),
+
+  bind: function fontLoaderBind(fonts, callback) {
+    assert(!isWorker, 'bind() shall be called from main thread');
+
+    var rules = [], fontsToLoad = [];
+    for (var i = 0, ii = fonts.length; i < ii; i++) {
+      var font = fonts[i];
+
+      // Add the font to the DOM only once or skip if the font
+      // is already loaded.
+      if (font.attached || font.loading === false) {
+        continue;
+      }
+      font.attached = true;
+
+      var rule = font.bindDOM();
+      if (rule) {
+        rules.push(rule);
+        fontsToLoad.push(font);
+      }
+    }
+
+    var request = FontLoader.queueLoadingCallback(callback);
+    if (rules.length > 0 && !this.isSyncFontLoadingSupported) {
+      FontLoader.prepareFontLoadEvent(rules, fontsToLoad, request);
+    } else {
+      request.complete();
+    }
+  },
+
+  queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) {
+    function LoadLoader_completeRequest() {
+      assert(!request.end, 'completeRequest() cannot be called twice');
+      request.end = Date.now();
+
+      // sending all completed requests in order how they were queued
+      while (context.requests.length > 0 && context.requests[0].end) {
+        var otherRequest = context.requests.shift();
+        setTimeout(otherRequest.callback, 0);
+      }
+    }
+
+    var context = FontLoader.loadingContext;
+    var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++);
+    var request = {
+      id: requestId,
+      complete: LoadLoader_completeRequest,
+      callback: callback,
+      started: Date.now()
+    };
+    context.requests.push(request);
+    return request;
+  },
+
+  prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules,
+                                                                fonts,
+                                                                request) {
+      /** Hack begin */
+      // There's currently no event when a font has finished downloading so the
+      // following code is a dirty hack to 'guess' when a font is
+      // ready. It's assumed fonts are loaded in order, so add a known test
+      // font after the desired fonts and then test for the loading of that
+      // test font.
+
+      function int32(data, offset) {
+        return (data.charCodeAt(offset) << 24) |
+               (data.charCodeAt(offset + 1) << 16) |
+               (data.charCodeAt(offset + 2) << 8) |
+               (data.charCodeAt(offset + 3) & 0xff);
+      }
+
+      function spliceString(s, offset, remove, insert) {
+        var chunk1 = s.substr(0, offset);
+        var chunk2 = s.substr(offset + remove);
+        return chunk1 + insert + chunk2;
+      }
+
+      var i, ii;
+
+      var canvas = document.createElement('canvas');
+      canvas.width = 1;
+      canvas.height = 1;
+      var ctx = canvas.getContext('2d');
+
+      var called = 0;
+      function isFontReady(name, callback) {
+        called++;
+        // With setTimeout clamping this gives the font ~100ms to load.
+        if(called > 30) {
+          warn('Load test font never loaded.');
+          callback();
+          return;
+        }
+        ctx.font = '30px ' + name;
+        ctx.fillText('.', 0, 20);
+        var imageData = ctx.getImageData(0, 0, 1, 1);
+        if (imageData.data[3] > 0) {
+          callback();
+          return;
+        }
+        setTimeout(isFontReady.bind(null, name, callback));
+      }
+
+      var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;
+      // Chromium seems to cache fonts based on a hash of the actual font data,
+      // so the font must be modified for each load test else it will appear to
+      // be loaded already.
+      // TODO: This could maybe be made faster by avoiding the btoa of the full
+      // font by splitting it in chunks before hand and padding the font id.
+      var data = this.loadTestFont;
+      var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)
+      data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length,
+                          loadTestFontId);
+      // CFF checksum is important for IE, adjusting it
+      var CFF_CHECKSUM_OFFSET = 16;
+      var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X'
+      var checksum = int32(data, CFF_CHECKSUM_OFFSET);
+      for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {
+        checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;
+      }
+      if (i < loadTestFontId.length) { // align to 4 bytes boundary
+        checksum = (checksum - XXXX_VALUE +
+                    int32(loadTestFontId + 'XXX', i)) | 0;
+      }
+      data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));
+
+      var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';
+      var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' +
+                 url + '}';
+      FontLoader.insertRule(rule);
+
+      var names = [];
+      for (i = 0, ii = fonts.length; i < ii; i++) {
+        names.push(fonts[i].loadedName);
+      }
+      names.push(loadTestFontId);
+
+      var div = document.createElement('div');
+      div.setAttribute('style',
+                       'visibility: hidden;' +
+                       'width: 10px; height: 10px;' +
+                       'position: absolute; top: 0px; left: 0px;');
+      for (i = 0, ii = names.length; i < ii; ++i) {
+        var span = document.createElement('span');
+        span.textContent = 'Hi';
+        span.style.fontFamily = names[i];
+        div.appendChild(span);
+      }
+      document.body.appendChild(div);
+
+      isFontReady(loadTestFontId, function() {
+        document.body.removeChild(div);
+        request.complete();
+      });
+      /** Hack end */
+  }
+};
+
+var FontFace = (function FontFaceClosure() {
+  function FontFace(name, file, properties) {
+    this.compiledGlyphs = {};
+    if (arguments.length === 1) {
+      // importing translated data
+      var data = arguments[0];
+      for (var i in data) {
+        this[i] = data[i];
+      }
+      return;
+    }
+  }
+  FontFace.prototype = {
+    bindDOM: function FontFace_bindDOM() {
+      if (!this.data) {
+        return null;
+      }
+
+      if (PDFJS.disableFontFace) {
+        this.disableFontFace = true;
+        return null;
+      }
+
+      var data = bytesToString(new Uint8Array(this.data));
+      var fontName = this.loadedName;
+
+      // Add the font-face rule to the document
+      var url = ('url(data:' + this.mimetype + ';base64,' +
+                 window.btoa(data) + ');');
+      var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}';
+      FontLoader.insertRule(rule);
+
+      if (PDFJS.pdfBug && 'FontInspector' in globalScope &&
+          globalScope['FontInspector'].enabled) {
+        globalScope['FontInspector'].fontAdded(this, url);
+      }
+
+      return rule;
+    },
+
+    getPathGenerator: function (objs, character) {
+      if (!(character in this.compiledGlyphs)) {
+        var js = objs.get(this.loadedName + '_path_' + character);
+        /*jshint -W054 */
+        this.compiledGlyphs[character] = new Function('c', 'size', js);
+      }
+      return this.compiledGlyphs[character];
+    }
+  };
+  return FontFace;
+})();
+
+
+}).call((typeof window === 'undefined') ? this : window);
+
+if (!PDFJS.workerSrc && typeof document !== 'undefined') {
+  // workerSrc is not set -- using last script url to define default location
+  PDFJS.workerSrc = (function () {
+    'use strict';
+    var scriptTagContainer = document.body ||
+                             document.getElementsByTagName('head')[0];
+    var pdfjsSrc = scriptTagContainer.lastChild.src;
+    return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
+  })();
+}
+
diff --git a/public/opac/js/universalviewer-2.0.2/lib/pdf.min.js b/public/opac/js/universalviewer-2.0.2/lib/pdf.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9eed45bd027c814747cf13b3aba0f8c396e767e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/pdf.min.js
@@ -0,0 +1,197 @@
+"undefined"===typeof PDFJS&&(("undefined"!==typeof window?window:this).PDFJS={});PDFJS.version="1.0.83";PDFJS.build="0045325";
+(function(){function G(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.infos&&console.log("Info: "+a)}function z(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.warnings&&console.log("Warning: "+a)}function v(a){if(1<arguments.length){var b=["Error:"];b.push.apply(b,arguments);console.log.apply(console,b);a=[].join.call(arguments," ")}else console.log("Error: "+a);console.log(Eb());wa.notify(Fb.unknown);throw Error(a);}function Eb(){try{throw Error();}catch(a){return a.stack?a.stack.split("\n").slice(2).join("\n"):
+""}}function Gb(a,b){if(!b)return a;if(/^[a-z][a-z0-9+\-.]*:/i.test(b))return b;var c;if("/"==b.charAt(0))return c=a.indexOf("://"),"/"===b.charAt(1)?++c:c=a.indexOf("/",c+3),a.substring(0,c)+b;var d=a.length;c=a.lastIndexOf("#");d=0<=c?c:d;c=a.lastIndexOf("?",d);c=a.lastIndexOf("/",0<=c?c:d);return a.substring(0,c+1)+b}function ea(a,b){if(!a)return!1;var c=/^[a-z][a-z0-9+\-.]*(?=:)/i.exec(a);if(!c)return b;c=c[0].toLowerCase();switch(c){case "http":case "https":case "ftp":case "mailto":return!0;
+default:return!1}}function K(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!1});return c}function T(a){var b,c=a.length,d=[];if("\u00fe"===a[0]&&"\u00ff"===a[1])for(b=2;b<c;b+=2)d.push(String.fromCharCode(a.charCodeAt(b)<<8|a.charCodeAt(b+1)));else for(b=0;b<c;++b){var e=Hb[a.charCodeAt(b)];d.push(e?String.fromCharCode(e):a.charAt(b))}return d.join("")}function L(a){return"boolean"==typeof a}function I(a){return a instanceof Name}function U(a,b){if(!(a instanceof
+Dict))return!1;if(!b)return!0;var c=a.get("Type");return I(c)&&c.name==b}function B(a){return a instanceof Array}function xa(a){return"object"==typeof a&&null!==a&&void 0!==a&&"getBytes"in a}function fa(a,b){this.name=a;this.comObj=b;this.callbackIndex=1;this.postMessageTransfers=!0;var c=this.callbacks={},d=this.actionHandler={};d.console_log=[function(a){console.log.apply(console,a)}];d.console_error=[function(a){console.error.apply(console,a)}];d._unsupported_feature=[function(a){wa.notify(a)}];
+b.onmessage=function(a){var f=a.data;if(f.isReply)if(a=f.callbackId,f.callbackId in c){var g=c[a];delete c[a];g(f.data)}else v("Cannot resolve callback "+a);else if(f.action in d)if(a=d[f.action],f.callbackId){var h={},g=new Promise(function(a,b){h.resolve=a;h.reject=b});h.promise=g;g.then(function(a){b.postMessage({isReply:!0,callbackId:f.callbackId,data:a})});a[0].call(a[1],f.data,h)}else a[0].call(a[1],f.data);else v("Unkown action from worker: "+f.action)}}function ya(a,b){var c=document.createElement("canvas");
+c.width=a;c.height=b;return c}function za(a){a.mozCurrentTransform||(a._scaleX=a._scaleX||1,a._scaleY=a._scaleY||1,a._originalSave=a.save,a._originalRestore=a.restore,a._originalRotate=a.rotate,a._originalScale=a.scale,a._originalTranslate=a.translate,a._originalTransform=a.transform,a._originalSetTransform=a.setTransform,a._transformMatrix=[a._scaleX,0,0,a._scaleY,0,0],a._transformStack=[],Object.defineProperty(a,"mozCurrentTransform",{get:function(){return this._transformMatrix}}),Object.defineProperty(a,
+"mozCurrentTransformInverse",{get:function(){var a=this._transformMatrix,c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],a=a[5],h=c*f-d*e,j=d*e-c*f;return[f/h,d/j,e/j,c/h,(f*g-e*a)/j,(d*g-c*a)/h]}}),a.save=function(){var a=this._transformMatrix;this._transformStack.push(a);this._transformMatrix=a.slice(0,6);this._originalSave()},a.restore=function(){var a=this._transformStack.pop();a&&(this._transformMatrix=a,this._originalRestore())},a.translate=function(a,c){var d=this._transformMatrix;d[4]=d[0]*a+d[2]*c+d[4];
+d[5]=d[1]*a+d[3]*c+d[5];this._originalTranslate(a,c)},a.scale=function(a,c){var d=this._transformMatrix;d[0]*=a;d[1]*=a;d[2]*=c;d[3]*=c;this._originalScale(a,c)},a.transform=function(b,c,d,e,f,g){var h=this._transformMatrix;this._transformMatrix=[h[0]*b+h[2]*c,h[1]*b+h[3]*c,h[0]*d+h[2]*e,h[1]*d+h[3]*e,h[0]*f+h[2]*g+h[4],h[1]*f+h[3]*g+h[5]];a._originalTransform(b,c,d,e,f,g)},a.setTransform=function(b,c,d,e,f,g){this._transformMatrix=[b,c,d,e,f,g];a._originalSetTransform(b,c,d,e,f,g)},a.rotate=function(a){var c=
+Math.cos(a),d=Math.sin(a),e=this._transformMatrix;this._transformMatrix=[e[0]*c+e[2]*d,e[1]*c+e[3]*d,e[0]*-d+e[2]*c,e[1]*-d+e[3]*c,e[4],e[5]];this._originalRotate(a)})}function Aa(a){var b=ga[a[0]];b||v("Unknown IR type: "+a[0]);return b.fromIR(a)}var y="undefined"===typeof window?this:window,V="undefined"==typeof window,ha=[0.001,0,0,0.001,0,0];y.PDFJS||(y.PDFJS={});y.PDFJS.pdfBug=!1;PDFJS.VERBOSITY_LEVELS={errors:0,warnings:1,infos:5};var J=PDFJS.OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,
+setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,
+nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,
+beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90},Fb=PDFJS.UNSUPPORTED_FEATURES={unknown:"unknown",
+forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"},ia=[],wa=PDFJS.UnsupportedManager={listen:function(a){ia.push(a)},notify:function(a){z('Unsupported feature "'+a+'"');for(var b=0,c=ia.length;b<c;b++)ia[b](a)}};PDFJS.isValidUrl=ea;var Ba=PDFJS.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2},W=function(a){this.message=a};W.prototype=Error();W.prototype.name="NotImplementedException";W.constructor=W;Object.defineProperty(PDFJS,"isLittleEndian",
+{configurable:!0,get:function(){var a=PDFJS,b=new Uint8Array(2);b[0]=1;b=new Uint16Array(b.buffer);return K(a,"isLittleEndian",1===b[0])}});Object.defineProperty(PDFJS,"hasCanvasTypedArrays",{configurable:!0,get:function(){var a=PDFJS,b=document.createElement("canvas");b.width=b.height=1;b=b.getContext("2d").createImageData(1,1);return K(a,"hasCanvasTypedArrays","undefined"!==typeof b.data.buffer)}});var ja=function(a,b){this.buffer=a;this.byteLength=a.length;for(var c=this.length=void 0===b?this.byteLength>>
+2:b;Y<c;)Object.defineProperty(ja.prototype,Y,Ib(Y)),Y++},Ib=function(a){return{get:function(){var b=this.buffer,c=a<<2;return(b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24)>>>0},set:function(b){var c=this.buffer,d=a<<2;c[d]=b&255;c[d+1]=b>>8&255;c[d+2]=b>>16&255;c[d+3]=b>>>24&255}}};ja.prototype=Object.create(null);var Y=0,Ca=[1,0,0,1,0,0],Jb=PDFJS,u=function(){};u.makeCssRgb=function(a){return"rgb("+a[0]+","+a[1]+","+a[2]+")"};u.makeCssCmyk=function(a){a=s.singletons.cmyk.getRgb(a,0);return u.makeCssRgb(a)};
+u.transform=function(a,b){return[a[0]*b[0]+a[2]*b[1],a[1]*b[0]+a[3]*b[1],a[0]*b[2]+a[2]*b[3],a[1]*b[2]+a[3]*b[3],a[0]*b[4]+a[2]*b[5]+a[4],a[1]*b[4]+a[3]*b[5]+a[5]]};u.applyTransform=function(a,b){return[a[0]*b[0]+a[1]*b[2]+b[4],a[0]*b[1]+a[1]*b[3]+b[5]]};u.applyInverseTransform=function(a,b){var c=b[0]*b[3]-b[1]*b[2];return[(a[0]*b[3]-a[1]*b[2]+b[2]*b[5]-b[4]*b[3])/c,(-a[0]*b[1]+a[1]*b[0]+b[4]*b[1]-b[5]*b[0])/c]};u.getAxialAlignedBoundingBox=function(a,b){var c=u.applyTransform(a,b),d=u.applyTransform(a.slice(2,
+4),b),e=u.applyTransform([a[0],a[3]],b),f=u.applyTransform([a[2],a[1]],b);return[Math.min(c[0],d[0],e[0],f[0]),Math.min(c[1],d[1],e[1],f[1]),Math.max(c[0],d[0],e[0],f[0]),Math.max(c[1],d[1],e[1],f[1])]};u.inverseTransform=function(a){var b=a[0]*a[3]-a[1]*a[2];return[a[3]/b,-a[1]/b,-a[2]/b,a[0]/b,(a[2]*a[5]-a[4]*a[3])/b,(a[4]*a[1]-a[5]*a[0])/b]};u.apply3dTransform=function(a,b){return[a[0]*b[0]+a[1]*b[1]+a[2]*b[2],a[3]*b[0]+a[4]*b[1]+a[5]*b[2],a[6]*b[0]+a[7]*b[1]+a[8]*b[2]]};u.singularValueDecompose2dScale=
+function(a){var b=[a[0],a[2],a[1],a[3]],c=a[0]*b[0]+a[1]*b[2],d=a[2]*b[1]+a[3]*b[3],e=(c+d)/2;a=Math.sqrt((c+d)*(c+d)-4*(c*d-(a[2]*b[0]+a[3]*b[2])*(a[0]*b[1]+a[1]*b[3])))/2;b=e-a||1;return[Math.sqrt(e+a||1),Math.sqrt(b)]};u.normalizeRect=function(a){var b=a.slice(0);a[0]>a[2]&&(b[0]=a[2],b[2]=a[0]);a[1]>a[3]&&(b[1]=a[3],b[3]=a[1]);return b};u.intersect=function(a,b){function c(a,b){return a-b}var d=[a[0],a[2],b[0],b[2]].sort(c),e=[a[1],a[3],b[1],b[3]].sort(c),f=[];a=u.normalizeRect(a);b=u.normalizeRect(b);
+if(d[0]===a[0]&&d[1]===b[0]||d[0]===b[0]&&d[1]===a[0])f[0]=d[1],f[2]=d[2];else return!1;if(e[0]===a[1]&&e[1]===b[1]||e[0]===b[1]&&e[1]===a[1])f[1]=e[1],f[3]=e[2];else return!1;return f};u.sign=function(a){return 0>a?-1:1};u.concatenateToArray=function(a,b){Array.prototype.push.apply(a,b)};u.prependToArray=function(a,b){Array.prototype.unshift.apply(a,b)};u.extendObj=function(a,b){for(var c in b)a[c]=b[c]};u.getInheritableProperty=function(a,b){for(;a&&!a.has(b);)a=a.get("Parent");return!a?null:a.get(b)};
+u.inherit=function(a,b,c){a.prototype=Object.create(b.prototype);a.prototype.constructor=a;for(var d in c)a.prototype[d]=c[d]};u.loadScript=function(a,b){var c=document.createElement("script"),d=!1;c.setAttribute("src",a);b&&(c.onload=function(){d||b();d=!0});document.getElementsByTagName("head")[0].appendChild(c)};var t=Jb.Util=u,Kb=PDFJS,ka=function(a,b,c,d,e,f){this.viewBox=a;this.scale=b;this.rotation=c;this.offsetX=d;this.offsetY=e;var g=(a[2]+a[0])/2,h=(a[3]+a[1])/2,j,k,l;c%=360;switch(0>c?
+c+360:c){case 180:c=-1;k=j=0;l=1;break;case 90:c=0;k=j=1;l=0;break;case 270:c=0;k=j=-1;l=0;break;default:c=1,k=j=0,l=-1}f&&(k=-k,l=-l);0===c?(d=Math.abs(h-a[1])*b+d,e=Math.abs(g-a[0])*b+e,f=Math.abs(a[3]-a[1])*b,a=Math.abs(a[2]-a[0])*b):(d=Math.abs(g-a[0])*b+d,e=Math.abs(h-a[1])*b+e,f=Math.abs(a[2]-a[0])*b,a=Math.abs(a[3]-a[1])*b);this.transform=[c*b,j*b,k*b,l*b,d-c*b*g-k*b*h,e-j*b*g-l*b*h];this.width=f;this.height=a;this.fontScale=b};ka.prototype={clone:function(a){a=a||{};var b="scale"in a?a.scale:
+this.scale,c="rotation"in a?a.rotation:this.rotation;return new ka(this.viewBox.slice(),b,c,this.offsetX,this.offsetY,a.dontFlip)},convertToViewportPoint:function(a,b){return t.applyTransform([a,b],this.transform)},convertToViewportRectangle:function(a){var b=t.applyTransform([a[0],a[1]],this.transform);a=t.applyTransform([a[2],a[3]],this.transform);return[b[0],b[1],a[0],a[1]]},convertToPdfPoint:function(a,b){return t.applyInverseTransform([a,b],this.transform)}};Kb.PageViewport=ka;var Hb=[0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364],N=PDFJS.LegacyPromise=function(){var a,b,c=new Promise(function(c,e){a=c;b=e});c.resolve=
+a;c.reject=b;return c};var H=function(a){this._status=Da;this._handlers=[];a.call(this,this._resolve.bind(this),this._reject.bind(this))};if(y.Promise)"function"!==typeof y.Promise.all&&(y.Promise.all=function(a){var b=0,c=[],d,e,f=new y.Promise(function(a,b){d=a;e=b});a.forEach(function(a,f){b++;a.then(function(a){c[f]=a;b--;0===b&&d(c)},e)});0===b&&d(c);return f}),"function"!==typeof y.Promise.resolve&&(y.Promise.resolve=function(a){return new y.Promise(function(b){b(a)})});else{var Da=0,O=2,la=
+{handlers:[],running:!1,unhandledRejections:[],pendingRejectionCheck:!1,scheduleHandlers:function(a){a._status!=Da&&(this.handlers=this.handlers.concat(a._handlers),a._handlers=[],this.running||(this.running=!0,setTimeout(this.runHandlers.bind(this),0)))},runHandlers:function(){for(var a=Date.now()+1;0<this.handlers.length;){var b=this.handlers.shift(),c=b.thisPromise._status,d=b.thisPromise._value;try{1===c?"function"==typeof b.onResolve&&(d=b.onResolve(d)):"function"===typeof b.onReject&&(d=b.onReject(d),
+c=1,b.thisPromise._unhandledRejection&&this.removeUnhandeledRejection(b.thisPromise))}catch(e){c=O,d=e}b.nextPromise._updateStatus(c,d);if(Date.now()>=a)break}0<this.handlers.length?setTimeout(this.runHandlers.bind(this),0):this.running=!1},addUnhandledRejection:function(a){this.unhandledRejections.push({promise:a,time:Date.now()});this.scheduleRejectionCheck()},removeUnhandeledRejection:function(a){a._unhandledRejection=!1;for(var b=0;b<this.unhandledRejections.length;b++)this.unhandledRejections[b].promise===
+a&&(this.unhandledRejections.splice(b),b--)},scheduleRejectionCheck:function(){this.pendingRejectionCheck||(this.pendingRejectionCheck=!0,setTimeout(function(){this.pendingRejectionCheck=!1;for(var a=Date.now(),b=0;b<this.unhandledRejections.length;b++)if(500<a-this.unhandledRejections[b].time){var c=this.unhandledRejections[b].promise._value,d="Unhandled rejection: "+c;c.stack&&(d+="\n"+c.stack);z(d);this.unhandledRejections.splice(b);b--}this.unhandledRejections.length&&this.scheduleRejectionCheck()}.bind(this),
+500))}};H.all=function(a){function b(a){e._status!==O&&(g=[],d(a))}var c,d,e=new H(function(a,b){c=a;d=b}),f=a.length,g=[];if(0===f)return c(g),e;for(var h=0,j=a.length;h<j;++h){var k=a[h],l=function(a){return function(b){e._status!==O&&(g[a]=b,f--,0===f&&c(g))}}(h);H.isPromise(k)?k.then(l,b):l(k)}return e};H.isPromise=function(a){return a&&"function"===typeof a.then};H.resolve=function(a){return new H(function(b){b(a)})};H.prototype={_status:null,_value:null,_handlers:null,_unhandledRejection:null,
+_updateStatus:function(a,b){1===this._status||this._status===O||(1==a&&H.isPromise(b)?b.then(this._updateStatus.bind(this,1),this._updateStatus.bind(this,O)):(this._status=a,this._value=b,a===O&&0===this._handlers.length&&(this._unhandledRejection=!0,la.addUnhandledRejection(this)),la.scheduleHandlers(this)))},_resolve:function(a){this._updateStatus(1,a)},_reject:function(a){this._updateStatus(O,a)},then:function(a,b){var c=new H(function(a,b){this.reject=this.resolve=b});this._handlers.push({thisPromise:this,
+onResolve:a,onReject:b,nextPromise:c});la.scheduleHandlers(this);return c}};y.Promise=H}var Ea=function(){this.started={};this.times=[];this.enabled=!0};Ea.prototype={time:function(a){this.enabled&&(a in this.started&&z("Timer is already running for "+a),this.started[a]=Date.now())},timeEnd:function(a){this.enabled&&(a in this.started||z("Timer has not been started for "+a),this.times.push({name:a,start:this.started[a],end:Date.now()}),delete this.started[a])},toString:function(){var a,b,c=this.times,
+d="",e=0;a=0;for(b=c.length;a<b;++a){var f=c[a].name;f.length>e&&(e=f.length)}a=0;for(b=c.length;a<b;++a){for(var g=c[a],f=g.end-g.start,g=g.name;g.length<e;)g+=" ";d+=g+" "+f+"ms\n"}return d}};PDFJS.createBlob=function(a,b){if("undefined"!==typeof Blob)return new Blob([a],{type:b});var c=new MozBlobBuilder;c.append(a);return c.getBlob(b)};PDFJS.createObjectURL=function(a,b){if(!PDFJS.disableCreateObjectURL&&"undefined"!==typeof URL&&URL.createObjectURL){var c=PDFJS.createBlob(a,b);return URL.createObjectURL(c)}for(var c=
+"data:"+b+";base64,",d=0,e=a.length;d<e;d+=3)var f=a[d]&255,g=a[d+1]&255,h=a[d+2]&255,c=c+("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[f>>2]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[(f&3)<<4|g>>4]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[d+1<e?(g&15)<<2|h>>6:64]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[d+2<e?h&63:64]);return c};fa.prototype={on:function(a,b,c){var d=this.actionHandler;d[a]&&v('There is already an actionName called "'+
+a+'"');d[a]=[b,c]},send:function(a,b,c,d){a={action:a,data:b};c&&(b=this.callbackIndex++,this.callbacks[b]=c,a.callbackId=b);d&&this.postMessageTransfers?this.comObj.postMessage(a,d):this.comObj.postMessage(a)}};var s,E=function(){v("should not call ColorSpace constructor")};E.prototype={getRgb:function(a,b){var c=new Uint8Array(3);this.getRgbItem(a,b,c,0);return c},getRgbItem:function(){v("Should not call ColorSpace.getRgbItem")},getRgbBuffer:function(){v("Should not call ColorSpace.getRgbBuffer")},
+getOutputLength:function(){v("Should not call ColorSpace.getOutputLength")},isPassthrough:function(){return!1},fillRgb:function(a,b,c,d,e,f,g,h,j){var k=b*c,l=null,p=1<<g,q=c!=e||b!=d,n;if(this.isPassthrough(g))l=h;else if(1===this.numComps&&k>p&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){var m=8>=g?new Uint8Array(p):new Uint16Array(p),r;for(n=0;n<p;n++)m[n]=n;var x=new Uint8Array(3*p);this.getRgbBuffer(m,0,p,x,0,g,0);if(q){l=new Uint8Array(3*k);for(n=m=0;n<k;++n)r=3*h[n],l[m++]=x[r],l[m++]=
+x[r+1],l[m++]=x[r+2]}else for(n=p=0;n<k;++n)r=3*h[n],a[p++]=x[r],a[p++]=x[r+1],a[p++]=x[r+2],p+=j}else q?(l=new Uint8Array(3*k),this.getRgbBuffer(h,0,k,l,0,g,0)):this.getRgbBuffer(h,0,d*f,a,0,g,j);if(l)if(q)PDFImage.resize(l,g,3,b,c,d,e,a,j);else{n=p=m=0;for(b=d*f;n<b;n++)a[p++]=l[m++],a[p++]=l[m++],a[p++]=l[m++],p+=j}},usesZeroToOneRange:!0};E.parse=function(a,b,c){a=E.parseToIR(a,b,c);return a instanceof ma?a:E.fromIR(a)};E.fromIR=function(a){var b=B(a)?a[0]:a,c;switch(b){case "DeviceGrayCS":return this.singletons.gray;
+case "DeviceRgbCS":return this.singletons.rgb;case "DeviceCmykCS":return this.singletons.cmyk;case "CalGrayCS":return b=a[1].WhitePoint,c=a[1].BlackPoint,new Fa(b,c,a[1].Gamma);case "PatternCS":return(a=a[1])&&(a=E.fromIR(a)),new Ga(a);case "IndexedCS":return b=a[2],c=a[3],new Ha(E.fromIR(a[1]),b,c);case "AlternateCS":return b=a[3],new ma(a[1],E.fromIR(a[2]),X.fromIR(b));case "LabCS":return b=a[1].WhitePoint,c=a[1].BlackPoint,new Ia(b,c,a[1].Range);default:v("Unkown name "+b)}return null};E.parseToIR=
+function(a,b,c){if(I(a)){var d=c.get("ColorSpace");U(d)&&(d=d.get(a.name))&&(a=d)}a=b.fetchIfRef(a);if(I(a))switch(this.mode=d=a.name,d){case "DeviceGray":case "G":return"DeviceGrayCS";case "DeviceRGB":case "RGB":return"DeviceRgbCS";case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";case "Pattern":return["PatternCS",null];default:v("unrecognized colorspace "+d)}else if(B(a))switch(this.mode=d=a[0].name,d){case "DeviceGray":case "G":return"DeviceGrayCS";case "DeviceRGB":case "RGB":return"DeviceRgbCS";
+case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";case "CalGray":return b=a[1].getAll(),["CalGrayCS",b];case "CalRGB":return"DeviceRgbCS";case "ICCBased":d=b.fetchIfRef(a[1]).dict.get("N");if(1==d)return"DeviceGrayCS";if(3==d)return"DeviceRgbCS";if(4==d)return"DeviceCmykCS";break;case "Pattern":return(a=a[1])&&(a=E.parseToIR(a,b,c)),["PatternCS",a];case "Indexed":case "I":return c=E.parseToIR(a[1],b,c),d=a[2]+1,b=b.fetchIfRef(a[3]),xa(b)&&(b=b.getBytes()),["IndexedCS",c,d,b];case "Separation":case "DeviceN":var e=
+a[1],d=1;I(e)?d=1:B(e)&&(d=e.length);c=E.parseToIR(a[2],b,c);b=X.getIR(b,b.fetchIfRef(a[3]));return["AlternateCS",d,c,b];case "Lab":return b=a[1].getAll(),["LabCS",b];default:v('unimplemented color space object "'+d+'"')}else v('unrecognized color space object: "'+a+'"');return null};E.isDefaultDecode=function(a,b){if(!a)return!0;if(2*b!==a.length)return z("The decode map is not the correct length"),!0;for(var c=0,d=a.length;c<d;c+=2)if(0!==a[c]||1!=a[c+1])return!1;return!0};E.singletons={get gray(){return K(this,
+"gray",new Ja)},get rgb(){return K(this,"rgb",new Ka)},get cmyk(){return K(this,"cmyk",new La)}};s=E;var ma,Ma=function(a,b,c){this.name="Alternate";this.numComps=a;this.defaultColor=new Float32Array(a);for(var d=0;d<a;++d)this.defaultColor[d]=1;this.base=b;this.tintFn=c};Ma.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){a="subarray"in a?a.subarray(b,b+this.numComps):Array.prototype.slice.call(a,b,b+this.numComps);a=this.tintFn(a);this.base.getRgbItem(a,0,c,d)},getRgbBuffer:function(a,
+b,c,d,e,f,g){var h=this.tintFn,j=this.base;f=1/((1<<f)-1);var k=j.numComps,l=j.usesZeroToOneRange,p=(j.isPassthrough(8)||!l)&&0===g,q=p?e:0,n=p?d:new Uint8Array(k*c),m=this.numComps,r=new Float32Array(m),x,w;for(x=0;x<c;x++){for(w=0;w<m;w++)r[w]=a[b++]*f;var D=h(r);if(l)for(w=0;w<k;w++)n[q++]=255*D[w];else j.getRgbItem(D,0,n,q),q+=k}p||j.getRgbBuffer(n,0,c,d,e,8,g)},getOutputLength:function(a,b){return this.base.getOutputLength(a*this.base.numComps/this.numComps,b)},isPassthrough:s.prototype.isPassthrough,
+fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};ma=Ma;var Ga,Na=function(a){this.name="Pattern";this.base=a};Na.prototype={};Ga=Na;var Ha,Oa=function(a,b,c){this.name="Indexed";this.numComps=1;this.defaultColor=new Uint8Array([0]);this.base=a;this.highVal=b;a=a.numComps*b;var d;if(xa(c))d=new Uint8Array(a),c=c.getBytes(a),d.set(c);else if("string"==typeof c){d=new Uint8Array(a);for(b=0;b<a;++b)d[b]=c.charCodeAt(b)}else c instanceof
+Uint8Array||c instanceof Array?d=c:v("Unrecognized lookup table: "+c);this.lookup=d};Oa.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){this.base.getRgbItem(this.lookup,a[b]*this.base.numComps,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=this.base;for(var h=f.numComps,j=f.getOutputLength(h,g),k=this.lookup,l=0;l<c;++l){var p=a[b++]*h;f.getRgbBuffer(k,p,1,d,e,8,g);e+=j}},getOutputLength:function(a,b){return this.base.getOutputLength(a*this.base.numComps,b)},isPassthrough:s.prototype.isPassthrough,
+fillRgb:s.prototype.fillRgb,isDefaultDecode:function(){return!0},usesZeroToOneRange:!0};Ha=Oa;var Ja,Pa=function(){this.name="DeviceGray";this.numComps=1;this.defaultColor=new Float32Array([0])};Pa.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){a=255*a[b]|0;c[d]=c[d+1]=c[d+2]=0>a?0:255<a?255:a},getRgbBuffer:function(a,b,c,d,e,f,g){f=255/((1<<f)-1);for(var h=0;h<c;++h){var j=f*a[b++]|0;d[e++]=j;d[e++]=j;d[e++]=j;e+=g}},getOutputLength:function(a,b){return a*(3+b)},isPassthrough:s.prototype.isPassthrough,
+fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Ja=Pa;var Ka,Qa=function(){this.name="DeviceRGB";this.numComps=3;this.defaultColor=new Float32Array([0,0,0])};Qa.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){var e=255*a[b]|0,f=255*a[b+1]|0;a=255*a[b+2]|0;c[d]=0>e?0:255<e?255:e;c[d+1]=0>f?0:255<f?255:f;c[d+2]=0>a?0:255<a?255:a},getRgbBuffer:function(a,b,c,d,e,f,g){if(8===f&&0===g)d.set(a.subarray(b,b+3*c),
+e);else{f=255/((1<<f)-1);for(var h=0;h<c;++h)d[e++]=f*a[b++]|0,d[e++]=f*a[b++]|0,d[e++]=f*a[b++]|0,e+=g}},getOutputLength:function(a,b){return a*(3+b)/3|0},isPassthrough:function(a){return 8==a},fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Ka=Qa;var La,Ra=function(a,b,c,d,e){var f=a[b+0]*c,g=a[b+1]*c,h=a[b+2]*c;c*=a[b+3];a=f*(-4.387332384609988*f+54.48615194189176*g+18.82290502165302*h+212.25662451639585*c+-285.2331026137004)+
+g*(1.7149763477362134*g-5.6096736904047315*h+-17.873870861415444*c-5.497006427196366)+h*(-2.5217340131683033*h-21.248923337353073*c+17.5119270841813)+c*(-21.86122147463605*c-189.48180835922747)+255|0;b=f*(8.841041422036149*f+60.118027045597366*g+6.871425592049007*h+31.159100130055922*c+-79.2970844816548)+g*(-15.310361306967817*g+17.575251261109482*h+131.35250912493976*c-190.9453302588951)+h*(4.444339102852739*h+9.8632861493405*c-24.86741582555878)+c*(-20.737325471181034*c-187.80453709719578)+255|
+0;f=f*(0.8842522430003296*f+8.078677503112928*g+30.89978309703729*h-0.23883238689178934*c+-14.183576799673286)+g*(10.49593273432072*g+63.02378494754052*h+50.606957656360734*c-112.23884253719248)+h*(0.03296041114873217*h+115.60384449646641*c+-193.58209356861505)+c*(-22.33816807309886*c-180.12613974708367)+255|0;d[e]=255<a?255:0>a?0:a;d[e+1]=255<b?255:0>b?0:b;d[e+2]=255<f?255:0>f?0:f},Sa=function(){this.name="DeviceCMYK";this.numComps=4;this.defaultColor=new Float32Array([0,0,0,1])};Sa.prototype={getRgb:s.prototype.getRgb,
+getRgbItem:function(a,b,c,d){Ra(a,b,1,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=1/((1<<f)-1);for(var h=0;h<c;h++)Ra(a,b,f,d,e),b+=4,e+=3+g},getOutputLength:function(a,b){return a/4*(3+b)|0},isPassthrough:s.prototype.isPassthrough,fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};La=Sa;var Fa,Ta=function(a,b,c){this.name="CalGray";this.numComps=1;this.defaultColor=new Float32Array([0]);a||v("WhitePoint missing - required for color space CalGray");
+b=b||[0,0,0];this.XW=a[0];this.YW=a[1];this.ZW=a[2];this.XB=b[0];this.YB=b[1];this.ZB=b[2];this.G=c||1;(0>this.XW||0>this.ZW||1!==this.YW)&&v("Invalid WhitePoint components for "+this.name+", no fallback available");if(0>this.XB||0>this.YB||0>this.ZB)G("Invalid BlackPoint for "+this.name+", falling back to default"),this.XB=this.YB=this.ZB=0;(0!==this.XB||0!==this.YB||0!==this.ZB)&&z(this.name+", BlackPoint: XB: "+this.XB+", YB: "+this.YB+", ZB: "+this.ZB+", only default values are supported.");1>
+this.G&&(G("Invalid Gamma: "+this.G+" for "+this.name+", falling back to default"),this.G=1)},Ua=function(a,b,c,d,e,f){b=Math.pow(b[c]*f,a.G);a=Math.max(116*Math.pow(a.YW*b,1/3)-16,0);d[e]=255*a/100;d[e+1]=255*a/100;d[e+2]=255*a/100};Ta.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){Ua(this,a,b,c,d,1)},getRgbBuffer:function(a,b,c,d,e,f,g){f=1/((1<<f)-1);for(var h=0;h<c;++h)Ua(this,a,b,d,e,f),b+=1,e+=3+g},getOutputLength:function(a,b){return a*(3+b)},isPassthrough:s.prototype.isPassthrough,
+fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Fa=Ta;var Ia,Va=function(a,b,c){this.name="Lab";this.numComps=3;this.defaultColor=new Float32Array([0,0,0]);a||v("WhitePoint missing - required for color space Lab");b=b||[0,0,0];c=c||[-100,100,-100,100];this.XW=a[0];this.YW=a[1];this.ZW=a[2];this.amin=c[0];this.amax=c[1];this.bmin=c[2];this.bmax=c[3];this.XB=b[0];this.YB=b[1];this.ZB=b[2];(0>this.XW||0>this.ZW||1!==this.YW)&&
+v("Invalid WhitePoint components, no fallback available");if(0>this.XB||0>this.YB||0>this.ZB)G("Invalid BlackPoint, falling back to default"),this.XB=this.YB=this.ZB=0;if(this.amin>this.amax||this.bmin>this.bmax)G("Invalid Range, falling back to defaults"),this.amin=-100,this.amax=100,this.bmin=-100,this.bmax=100},na=function(a){return a>=6/29?a*a*a:108/841*(a-4/29)},Wa=function(a,b,c,d,e,f){var g=b[c],h=b[c+1];b=b[c+2];!1!==d&&(g=0+100*g/d,h=a.amin+h*(a.amax-a.amin)/d,b=a.bmin+b*(a.bmax-a.bmin)/
+d);h=h>a.amax?a.amax:h<a.amin?a.amin:h;b=b>a.bmax?a.bmax:b<a.bmin?a.bmin:b;d=(g+16)/116;g=d-b/200;h=a.XW*na(d+h/500);d=a.YW*na(d);g=a.ZW*na(g);1>a.ZW?(a=3.1339*h+-1.617*d+-0.4906*g,b=-0.9785*h+1.916*d+0.0333*g,h=0.072*h+-0.229*d+1.4057*g):(a=3.2406*h+-1.5372*d+-0.4986*g,b=-0.9689*h+1.8758*d+0.0415*g,h=0.0557*h+-0.204*d+1.057*g);e[f]=0>=a?0:1<=a?255:255*Math.sqrt(a)|0;e[f+1]=0>=b?0:1<=b?255:255*Math.sqrt(b)|0;e[f+2]=0>=h?0:1<=h?255:255*Math.sqrt(h)|0};Va.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,
+b,c,d){Wa(this,a,b,!1,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=(1<<f)-1;for(var h=0;h<c;h++)Wa(this,a,b,f,d,e),b+=3,e+=3+g},getOutputLength:function(a,b){return a*(3+b)/3|0},isPassthrough:s.prototype.isPassthrough,isDefaultDecode:function(){return!0},usesZeroToOneRange:!1};Ia=Va;var X;X={getSampleArray:function(a,b,c,d){var e,f,g=1;e=0;for(f=a.length;e<f;e++)g*=a[e];g*=b;a=[];f=b=0;var h=1/(Math.pow(2,c)-1);d=d.getBytes((g*c+7)/8);var j=0;for(e=0;e<g;e++){for(;b<c;)f<<=8,f|=d[j++],b+=8;b-=c;a.push((f>>
+b)*h);f&=(1<<b)-1}return a},getIR:function(a,b){var c=b.dict;c||(c=b);var d=[this.constructSampled,null,this.constructInterpolated,this.constructStiched,this.constructPostScript],e=c.get("FunctionType");(d=d[e])||v("Unknown type of function");return d.call(this,b,c,a)},fromIR:function(a){switch(a[0]){case 0:return this.constructSampledFromIR(a);case 2:return this.constructInterpolatedFromIR(a);case 3:return this.constructStichedFromIR(a);default:return this.constructPostScriptFromIR(a)}},parse:function(a,
+b){var c=this.getIR(a,b);return this.fromIR(c)},constructSampled:function(a,b){function c(a){for(var b=a.length,c=[],d=0,e=0;e<b;e+=2)c[d]=[a[e],a[e+1]],++d;return c}var d=b.get("Domain"),e=b.get("Range");(!d||!e)&&v("No domain or range");var f=d.length/2,g=e.length/2,d=c(d),e=c(e),h=b.get("Size"),j=b.get("BitsPerSample"),k=b.get("Order")||1;1!==k&&G("No support for cubic spline interpolation: "+k);k=b.get("Encode");if(!k)for(var k=[],l=0;l<f;++l)k.push(0),k.push(h[l]-1);var k=c(k),l=(l=b.get("Decode"))?
+c(l):e,p=this.getSampleArray(h,g,j,a);return[0,f,d,k,l,p,h,g,Math.pow(2,j)-1,e]},constructSampledFromIR:function(a){return function(b){var c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],j=a[7],k=a[9];c!=b.length&&v("Incorrect number of arguments: "+c+" != "+b.length);var l=1<<c,p=new Float64Array(l),q=new Uint32Array(l),n,m;for(m=0;m<l;m++)p[m]=1;var r=j,x=1;for(n=0;n<c;++n){m=d[n][0];var w=d[n][1],D=Math.min(Math.max(b[n],m),w),t=e[n][0]+(D-m)*((e[n][1]-e[n][0])/(w-m)),w=h[n],t=Math.min(Math.max(t,0),
+w-1);m=t<w-1?Math.floor(t):t-1;var D=m+1-t,t=t-m,s=m*r,P=s+r;for(m=0;m<l;m++)m&x?(p[m]*=t,q[m]+=P):(p[m]*=D,q[m]+=s);r*=w;x<<=1}b=new Float64Array(j);for(m=0;m<j;++m){for(n=c=0;n<l;n++)c+=g[q[n]+m]*p[n];c=f[m][0]+(c-0)*((f[m][1]-f[m][0])/1);b[m]=Math.min(Math.max(c,k[m][0]),k[m][1])}return b}},constructInterpolated:function(a,b){var c=b.get("C0")||[0],d=b.get("C1")||[1],e=b.get("N");(!B(c)||!B(d))&&v("Illegal dictionary for interpolated function");for(var f=c.length,g=[],h=0;h<f;++h)g.push(d[h]-c[h]);
+return[2,c,g,e]},constructInterpolatedFromIR:function(a){var b=a[1],c=a[2],d=a[3],e=c.length;return function(a){a=1==d?a[0]:Math.pow(a[0],d);for(var g=[],h=0;h<e;++h)g.push(b[h]+a*c[h]);return g}},constructStiched:function(a,b,c){(a=b.get("Domain"))||v("No domain");1!=a.length/2&&v("Bad domain for stiched function");for(var d=b.get("Functions"),e=[],f=0,g=d.length;f<g;++f)e.push(X.getIR(c,c.fetchIfRef(d[f])));c=b.get("Bounds");b=b.get("Encode");return[3,a,c,b,e]},constructStichedFromIR:function(a){var b=
+a[1],c=a[2],d=a[3];a=a[4];for(var e=[],f=0,g=a.length;f<g;f++)e.push(X.fromIR(a[f]));return function(a){a=a[0];var f=b[0],g=b[1];a>g?a=g:a<f&&(a=f);f=0;for(g=c.length;f<g&&!(a<c[f]);++f);g=b[0];0<f&&(g=c[f-1]);var l=b[1];f<c.length&&(l=c[f]);var p=d[2*f];return e[f]([p+(a-g)*(d[2*f+1]-p)/(l-g)])}},constructPostScript:function(a,b){var c=b.get("Domain"),d=b.get("Range");c||v("No domain.");d||v("No range.");var e=new PostScriptLexer(a),e=(new PostScriptParser(e)).parse();return[4,c,d,e]},constructPostScriptFromIR:function(a){var b=
+a[1],c=a[2],d=c.length/2,e=new Xa(a[3]),f=new Ya;return function(a){for(var h=[],j=0,k=b.length/2;j<k;++j)h.push(a[j]);a=h.join("_");if(f.has(a))return f.get(a);h=e.execute(h);k=[];for(j=d-1;0<=j;--j){var l=h.pop(),p=2*j;l<c[p]?l=c[p]:l>c[p+1]&&(l=c[p+1]);k[j]=l}f.set(a,k);return k}}};var Ya,Za=function(){this.cache={};this.total=0};Za.prototype={has:function(a){return a in this.cache},get:function(a){return this.cache[a]},set:function(a,b){1024>this.total&&(this.cache[a]=b,this.total++)}};Ya=Za;
+var $a=function(a){this.stack=a||[]};$a.prototype={push:function(a){100<=this.stack.length&&v("PostScript function stack overflow.");this.stack.push(a)},pop:function(){0>=this.stack.length&&v("PostScript function stack underflow.");return this.stack.pop()},copy:function(a){100<=this.stack.length+a&&v("PostScript function stack overflow.");var b=this.stack,c=b.length-a;for(a-=1;0<=a;a--,c++)b.push(b[c])},index:function(a){this.push(this.stack[this.stack.length-a-1])},roll:function(a,b){var c=this.stack,
+d=c.length-a,e=c.length-1,f=d+(b-Math.floor(b/a)*a),g,h,j;g=d;for(h=e;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j;g=d;for(h=f-1;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j;g=f;for(h=e;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j}};var Xa,ab=function(a){this.operators=a};ab.prototype={execute:function(a){a=new $a(a);for(var b=0,c=this.operators,d=c.length,e,f;b<d;)if(e=c[b++],"number"==typeof e)a.push(e);else switch(e){case "jz":f=a.pop();(e=a.pop())||(b=f);break;case "j":b=e=a.pop();break;case "abs":e=a.pop();a.push(Math.abs(e));
+break;case "add":f=a.pop();e=a.pop();a.push(e+f);break;case "and":f=a.pop();e=a.pop();L(e)&&L(f)?a.push(e&&f):a.push(e&f);break;case "atan":e=a.pop();a.push(Math.atan(e));break;case "bitshift":f=a.pop();e=a.pop();0<e?a.push(e<<f):a.push(e>>f);break;case "ceiling":e=a.pop();a.push(Math.ceil(e));break;case "copy":e=a.pop();a.copy(e);break;case "cos":e=a.pop();a.push(Math.cos(e));break;case "cvi":e=a.pop()|0;a.push(e);break;case "cvr":break;case "div":f=a.pop();e=a.pop();a.push(e/f);break;case "dup":a.copy(1);
+break;case "eq":f=a.pop();e=a.pop();a.push(e==f);break;case "exch":a.roll(2,1);break;case "exp":f=a.pop();e=a.pop();a.push(Math.pow(e,f));break;case "false":a.push(!1);break;case "floor":e=a.pop();a.push(Math.floor(e));break;case "ge":f=a.pop();e=a.pop();a.push(e>=f);break;case "gt":f=a.pop();e=a.pop();a.push(e>f);break;case "idiv":f=a.pop();e=a.pop();a.push(e/f|0);break;case "index":e=a.pop();a.index(e);break;case "le":f=a.pop();e=a.pop();a.push(e<=f);break;case "ln":e=a.pop();a.push(Math.log(e));
+break;case "log":e=a.pop();a.push(Math.log(e)/Math.LN10);break;case "lt":f=a.pop();e=a.pop();a.push(e<f);break;case "mod":f=a.pop();e=a.pop();a.push(e%f);break;case "mul":f=a.pop();e=a.pop();a.push(e*f);break;case "ne":f=a.pop();e=a.pop();a.push(e!=f);break;case "neg":a.pop();a.push(-f);break;case "not":e=a.pop();L(e)&&L(f)?a.push(e&&f):a.push(e&f);break;case "or":f=a.pop();e=a.pop();L(e)&&L(f)?a.push(e||f):a.push(e|f);break;case "pop":a.pop();break;case "roll":f=a.pop();e=a.pop();a.roll(e,f);break;
+case "round":e=a.pop();a.push(Math.round(e));break;case "sin":e=a.pop();a.push(Math.sin(e));break;case "sqrt":e=a.pop();a.push(Math.sqrt(e));break;case "sub":f=a.pop();e=a.pop();a.push(e-f);break;case "true":a.push(!0);break;case "truncate":e=a.pop();e=0>e?Math.ceil(e):Math.floor(e);a.push(e);break;case "xor":f=a.pop();e=a.pop();L(e)&&L(f)?a.push(e!=f):a.push(e^f);break;default:v("Unknown operator "+e)}return a.stack}};Xa=ab;var Lb=["Link","Text","Widget"],C=function(a){if(a.data)this.data=a.data;
+else{var b=a.dict,c=this.data={};c.subtype=b.get("Subtype").name;var d=b.get("Rect")||[0,0,0,0];c.rect=t.normalizeRect(d);c.annotationFlags=b.get("F");d=b.get("C");c.color=B(d)&&3===d.length?d:[0,0,0];if(b.has("BS"))d=b.get("BS"),c.borderWidth=d.has("W")?d.get("W"):1;else if(d=b.get("Border")||[0,0,1],c.borderWidth=d[2]||0,d=d[3],0<c.borderWidth&&d&&B(d)){var e=d.length;if(0<e){for(var f=!1,g=0,h=0;h<e;h++)if(0<=+d[h])0<d[h]&&g++;else{f=!0;break}if(f||0===g)c.borderWidth=0}}var j;d=b.get("AP");U(d)?
+(d=d.get("N"),U(d)?(b=b.get("AS"))&&d.has(b.name)&&(j=d.get(b.name)):j=d):j=void 0;this.appearance=j;c.hasAppearance=!!this.appearance;c.id=a.ref.num}};C.prototype={getData:function(){return this.data},hasHtml:function(){return!1},getHtmlElement:function(){throw new W("getHtmlElement() should be implemented in subclass");},getEmptyContainer:function(a,b,c){!V||v("getEmptyContainer() should be called from main thread");c=c||0;b=b||this.data.rect;a=document.createElement(a);a.style.borderWidth=c+"px";
+var d=b[3]-b[1]-2*c;a.style.width=b[2]-b[0]-2*c+"px";a.style.height=d+"px";return a},isInvisible:function(){var a=this.data;return a&&-1!==Lb.indexOf(a.subtype)?!1:!(!a||!(a.annotationFlags&&a.annotationFlags&1))},isViewable:function(){var a=this.data;return!(this.isInvisible()||!a||a.annotationFlags&&a.annotationFlags&34||!a.rect)},isPrintable:function(){var a=this.data;return!(this.isInvisible()||!a||!a.annotationFlags||!(a.annotationFlags&4&&a.rect))},loadResources:function(a){var b=new N;this.appearance.dict.getAsync("Resources").then(function(c){c?
+(new ObjectLoader(c.map,a,c.xref)).load().then(function(){b.resolve(c)}):b.resolve()}.bind(this));return b},getOperatorList:function(a){var b=new N;if(!this.appearance)return b.resolve(new OperatorList),b;var c=this.data,d=this.appearance.dict,e=this.loadResources("ExtGState ColorSpace Pattern Shading XObject Font".split(" ")),f=d.get("BBox")||[0,0,1,1],g=d.get("Matrix")||[1,0,0,1,0,0],h;var d=c.rect,j=t.getAxialAlignedBoundingBox(f,g),f=j[0],k=j[1],l=j[2],j=j[3];f===l||k===j?h=[1,0,0,1,d[0],d[1]]:
+(l=(d[2]-d[0])/(l-f),j=(d[3]-d[1])/(j-k),h=[l,0,0,j,d[0]-f*l,d[1]-k*j]);e.then(function(d){var e=new OperatorList;e.addOp(J.beginAnnotation,[c.rect,h,g]);a.getOperatorList(this.appearance,d,e);e.addOp(J.endAnnotation,[]);b.resolve(e);this.appearance.reset()}.bind(this));return b}};C.getConstructor=function(a,b){if(a){if("Link"===a)return bb;if("Text"===a)return cb;if("Widget"===a){if(b)return"Tx"===b?db:Z}else return C}};C.fromData=function(a){var b=C.getConstructor(a.subtype,a.fieldType);if(b)return new b({data:a})};
+C.fromRef=function(a,b){var c=a.fetchIfRef(b);if(U(c)){var d=c.get("Subtype");if(d=I(d)?d.name:""){var e=t.getInheritableProperty(c,"FT"),e=I(e)?e.name:"";if(e=C.getConstructor(d,e)){c=new e({dict:c,ref:b});if(c.isViewable()||c.isPrintable())return c;z("unimplemented annotation type: "+d)}}}};C.appendToOperatorList=function(a,b,c,d,e){var f=new N;c=[];for(var g=0,h=a.length;g<h;++g)("display"===e&&a[g].isViewable()||"print"===e&&a[g].isPrintable())&&c.push(a[g].getOperatorList(d));Promise.all(c).then(function(a){b.addOp(J.beginAnnotations,
+[]);for(var c=0,d=a.length;c<d;++c)b.addOpList(a[c]);b.addOp(J.endAnnotations,[]);f.resolve()},function(a){f.reject(a)});return f};PDFJS.Annotation=C;var Z,eb=function(a){C.call(this,a);if(!a.data){var b=a.dict,c=this.data;c.fieldValue=T(t.getInheritableProperty(b,"V")||"");c.alternativeText=T(b.get("TU")||"");c.defaultAppearance=t.getInheritableProperty(b,"DA")||"";var d=t.getInheritableProperty(b,"FT");c.fieldType=I(d)?d.name:"";c.fieldFlags=t.getInheritableProperty(b,"Ff")||0;this.fieldResources=
+t.getInheritableProperty(b,"DR")||Dict.empty;var d=[],e=b;for(a=a.ref;e;){var b=e.get("Parent"),f=e.getRaw("Parent");if(e=e.get("T"))d.unshift(T(e));else{var e=b.get("Kids"),g,h;g=0;for(h=e.length;g<h;g++){var j=e[g];if(j.num==a.num&&j.gen==a.gen)break}d.unshift("`"+g)}e=b;a=f}c.fullName=d.join(".")}},Mb=C.prototype;t.inherit(eb,C,{isViewable:function(){return"Sig"===this.data.fieldType?(z("unimplemented annotation type: Widget signature"),!1):Mb.isViewable.call(this)}});Z=eb;var db,fb=function(a){Z.call(this,
+a);a.data||(this.data.textAlignment=t.getInheritableProperty(a.dict,"Q"))};t.inherit(fb,Z,{hasHtml:function(){return!this.data.hasAppearance&&!!this.data.fieldValue},getHtmlElement:function(a){!V||v("getHtmlElement() shall be called from main thread");var b=this.data,c=this.getEmptyContainer("div");c.style.display="table";var d=document.createElement("div");d.textContent=b.fieldValue;d.style.textAlign=["left","center","right"][b.textAlignment];d.style.verticalAlign="middle";d.style.display="table-cell";
+a=b.fontRefName?a.getData(b.fontRefName):null;var e=d.style;e.fontSize=b.fontSize+"px";e.direction=0>b.fontDirection?"rtl":"ltr";a&&(e.fontWeight=a.black?a.bold?"bolder":"bold":a.bold?"bold":"normal",e.fontStyle=a.italic?"italic":"normal",b=a.loadedName,e.fontFamily=(b?'"'+b+'", ':"")+(a.fallbackName||"Helvetica, sans-serif"));c.appendChild(d);return c},getOperatorList:function(a){if(this.appearance)return C.prototype.getOperatorList.call(this,a);var b=new N,c=new OperatorList,d=this.data,e=d.defaultAppearance;
+if(!e)return b.resolve(c),b;for(var f=Stream,g=e.length,h=new Uint8Array(g),j=0;j<g;++j)h[j]=e.charCodeAt(j)&255;e=new f(h);a.getOperatorList(e,this.fieldResources,c);a=c.fnArray;e=c.argsArray;d.rgb=[0,0,0];for(f=0;0>f;++f)g=a[f],h=e[f],g===J.setFont?(d.fontRefName=h[0],g=h[1],0>g?(d.fontDirection=-1,d.fontSize=-g):(d.fontDirection=1,d.fontSize=g)):g===J.setFillRGBColor?d.rgb=h:g===J.setFillGray&&(g=255*h[0],d.rgb=[g,g,g]);b.resolve(c);return b}});db=fb;var oa=function(a){C.call(this,a)};t.inherit(oa,
+C,{hasHtml:function(){return!0},highlight:function(){this.highlightElement&&this.highlightElement.hasAttribute("hidden")&&this.highlightElement.removeAttribute("hidden")},unhighlight:function(){this.highlightElement&&!this.highlightElement.hasAttribute("hidden")&&this.highlightElement.setAttribute("hidden",!0)},initContainer:function(){for(var a=this.data,b=this.getEmptyContainer("section",a.rect,a.borderWidth),c=b.style.backgroundColor=a.color,d=[],e=0;3>e;++e)d[e]=Math.round(255*c[e]);a.colorCssRgb=
+t.makeCssRgb(d);a=document.createElement("div");a.className="annotationHighlight";a.style.left=a.style.top="-4px";a.style.right=a.style.bottom="-4px";a.setAttribute("hidden",!0);this.highlightElement=a;b.appendChild(this.highlightElement);return b}});var cb,gb=function(a){C.call(this,a);if(!a.data){a=a.dict;var b=this.data,c=a.get("Contents"),d=a.get("T");b.content=T(c||"");b.title=T(d||"");b.hasAppearance?b.name="NoIcon":(b.rect[1]=b.rect[3]-22,b.rect[2]=b.rect[0]+22,b.name=a.has("Name")?a.get("Name").name:
+"Note");a.has("C")&&(b.hasBgColor=!0)}};t.inherit(gb,oa,{getHtmlElement:function(){!V||v("getHtmlElement() shall be called from main thread");var a=this.data,b=a.rect;10>b[3]-b[1]&&(b[3]=b[1]+10);10>b[2]-b[0]&&(b[2]=b[0]+(b[3]-b[1]));var c=this.initContainer();c.className="annotText";var d=document.createElement("img");d.style.height=c.style.height;d.style.width=c.style.width;var e=a.name;d.src=PDFJS.imageResourcesPath+"annotation-"+e.toLowerCase()+".svg";d.alt="[{{type}} Annotation]";d.dataset.l10nId=
+"text_annotation_type";d.dataset.l10nArgs=JSON.stringify({type:e});e=document.createElement("div");e.className="annotTextContentWrapper";e.style.left=Math.floor(b[2]-b[0]+5)+"px";e.style.top="-10px";var f=document.createElement("div");f.className="annotTextContent";f.setAttribute("hidden",!0);if(a.hasBgColor){for(var g=a.color,h=[],b=0;3>b;++b){var j=Math.round(255*g[b]);h[b]=Math.round(0.7*(255-j))+j}f.style.backgroundColor=t.makeCssRgb(h)}g=document.createElement("h1");h=document.createElement("p");
+g.textContent=a.title;if(!a.content&&!a.title)f.setAttribute("hidden",!0);else{for(var j=document.createElement("span"),k=a.content.split(/(?:\r\n?|\n)/),b=0,a=k.length;b<a;++b)j.appendChild(document.createTextNode(k[b])),b<a-1&&j.appendChild(document.createElement("br"));h.appendChild(j);var l=!1,p=function(a){a&&(l=!0);f.hasAttribute("hidden")&&(c.style.zIndex+=1,f.removeAttribute("hidden"))},q=function(a){a&&(l=!1);!f.hasAttribute("hidden")&&!l&&(c.style.zIndex-=1,f.setAttribute("hidden",!0))};
+d.addEventListener("click",function(){l?q(!0):p(!0)},!1);d.addEventListener("mouseover",function(){p()},!1);d.addEventListener("mouseout",function(){q()},!1);f.addEventListener("click",function(){q(!0)},!1)}f.appendChild(g);f.appendChild(h);e.appendChild(f);c.appendChild(d);c.appendChild(e);return c}});cb=gb;var bb,hb=function(a){C.call(this,a);if(!a.data){var b=a.dict;a=this.data;var c=b.get("A");if(c)if(b=c.get("S").name,"URI"===b){var d=c.get("URI");I(d)?d="/"+d.name:d&&(d=d&&0===d.indexOf("www.")?
+"http://"+d:d);ea(d,!1)||(d="");a.url=d}else"GoTo"===b?a.dest=c.get("D"):"GoToR"===b?(b=c.get("F"),U(b)&&(d=b.get("F")||""),ea(d,!1)||(d=""),a.url=d,a.dest=c.get("D")):"Named"===b?a.action=c.get("N").name:z("unrecognized link type: "+b);else b.has("Dest")&&(d=b.get("Dest"),a.dest=I(d)?d.name:d)}};t.inherit(hb,oa,{hasOperatorList:function(){return!1},getHtmlElement:function(){var a=this.initContainer();a.className="annotLink";a.style.borderColor=this.data.colorCssRgb;a.style.borderStyle="solid";var b=
+document.createElement("a");b.href=b.title=this.data.url||"";a.appendChild(b);return a}});bb=hb;PDFJS.maxImageSize=void 0===PDFJS.maxImageSize?-1:PDFJS.maxImageSize;PDFJS.cMapUrl=void 0===PDFJS.cMapUrl?null:PDFJS.cMapUrl;PDFJS.cMapPacked=void 0===PDFJS.cMapPacked?!1:PDFJS.cMapPacked;PDFJS.disableFontFace=void 0===PDFJS.disableFontFace?!1:PDFJS.disableFontFace;PDFJS.imageResourcesPath=void 0===PDFJS.imageResourcesPath?"":PDFJS.imageResourcesPath;PDFJS.disableWorker=void 0===PDFJS.disableWorker?!1:
+PDFJS.disableWorker;PDFJS.workerSrc=void 0===PDFJS.workerSrc?null:PDFJS.workerSrc;PDFJS.disableRange=void 0===PDFJS.disableRange?!1:PDFJS.disableRange;PDFJS.disableAutoFetch=void 0===PDFJS.disableAutoFetch?!1:PDFJS.disableAutoFetch;PDFJS.pdfBug=void 0===PDFJS.pdfBug?!1:PDFJS.pdfBug;PDFJS.postMessageTransfers=void 0===PDFJS.postMessageTransfers?!0:PDFJS.postMessageTransfers;PDFJS.disableCreateObjectURL=void 0===PDFJS.disableCreateObjectURL?!1:PDFJS.disableCreateObjectURL;PDFJS.disableWebGL=void 0===
+PDFJS.disableWebGL?!0:PDFJS.disableWebGL;PDFJS.verbosity=void 0===PDFJS.verbosity?PDFJS.VERBOSITY_LEVELS.warnings:PDFJS.verbosity;PDFJS.getDocument=function(a,b,c,d){var e,f;"string"===typeof a?a={url:a}:"object"==typeof a&&null!==a&&void 0!==a&&"byteLength"in a?a={data:a}:"object"!==typeof a&&v("Invalid parameter in getDocument, need either Uint8Array, string or a parameter object");!a.url&&!a.data&&v("Invalid parameter array, need either .data or .url");var g={};for(e in a)g[e]="url"===e&&"undefined"!==
+typeof window?Gb(window.location.href,a[e]):a[e];a=new PDFJS.LegacyPromise;e=new PDFJS.LegacyPromise;f=new ib(a,e,b,d);a.then(function(){f.passwordCallback=c;f.fetchDocument(g)});return e};var jb=function(a,b){this.pdfInfo=a;this.transport=b};jb.prototype={get numPages(){return this.pdfInfo.numPages},get fingerprint(){return this.pdfInfo.fingerprint},getPage:function(a){return this.transport.getPage(a)},getPageIndex:function(a){return this.transport.getPageIndex(a)},getDestinations:function(){return this.transport.getDestinations()},
+getAttachments:function(){return this.transport.getAttachments()},getJavaScript:function(){var a=new PDFJS.LegacyPromise;a.resolve(this.pdfInfo.javaScript);return a},getOutline:function(){var a=new PDFJS.LegacyPromise;a.resolve(this.pdfInfo.outline);return a},getMetadata:function(){var a=new PDFJS.LegacyPromise,b=this.pdfInfo.metadata;a.resolve({info:this.pdfInfo.info,metadata:b?new PDFJS.Metadata(b):null});return a},getData:function(){var a=new PDFJS.LegacyPromise;this.transport.getData(a);return a},
+getDownloadInfo:function(){return this.transport.downloadInfoPromise},cleanup:function(){this.transport.startCleanup()},destroy:function(){this.transport.destroy()}};var kb=function(a,b){this.pageInfo=a;this.transport=b;this.stats=new Ea;this.stats.enabled=!!y.PDFJS.enableStats;this.commonObjs=b.commonObjs;this.objs=new pa;this.pendingDestroy=this.cleanupAfterRender=!1;this.intentStates={}};kb.prototype={get pageNumber(){return this.pageInfo.pageIndex+1},get rotate(){return this.pageInfo.rotate},
+get ref(){return this.pageInfo.ref},get view(){return this.pageInfo.view},getViewport:function(a,b){2>arguments.length&&(b=this.rotate);return new PDFJS.PageViewport(this.view,a,b,0,0)},getAnnotations:function(){if(this.annotationsPromise)return this.annotationsPromise;var a=new PDFJS.LegacyPromise;this.annotationsPromise=a;this.transport.getAnnotations(this.pageInfo.pageIndex);return a},render:function(a){function b(a){var b=e.renderTasks.indexOf(f);0<=b&&e.renderTasks.splice(b,1);h.cleanupAfterRender&&
+(h.pendingDestroy=!0);h._tryDestroy();a?g.promise.reject(a):g.promise.resolve();c.timeEnd("Rendering");c.timeEnd("Overall")}var c=this.stats;c.time("Overall");this.pendingDestroy=!1;var d="intent"in a?"print"==a.intent?"print":"display":"display";this.intentStates[d]||(this.intentStates[d]={});var e=this.intentStates[d];e.displayReadyPromise||(e.receivingOperatorList=!0,e.displayReadyPromise=new N,e.operatorList={fnArray:[],argsArray:[],lastChunk:!1},this.stats.time("Page Request"),this.transport.messageHandler.send("RenderPageRequest",
+{pageIndex:this.pageNumber-1,intent:d}));var f=new lb(b,a,this.objs,this.commonObjs,e.operatorList,this.pageNumber);e.renderTasks||(e.renderTasks=[]);e.renderTasks.push(f);var g=new mb(f),h=this;e.displayReadyPromise.then(function(a){h.pendingDestroy?b():(c.time("Rendering"),f.initalizeGraphics(a),f.operatorListChanged())},function(a){b(a)});return g},getTextContent:function(){var a=new PDFJS.LegacyPromise;this.transport.messageHandler.send("GetTextContent",{pageIndex:this.pageNumber-1},function(b){a.resolve(b)});
+return a},destroy:function(){this.pendingDestroy=!0;this._tryDestroy()},_tryDestroy:function(){this.pendingDestroy&&!Object.keys(this.intentStates).some(function(a){a=this.intentStates[a];return 0!==a.renderTasks.length||a.receivingOperatorList},this)&&(Object.keys(this.intentStates).forEach(function(a){delete this.intentStates[a]},this),this.objs.clear(),this.pendingDestroy=!1)},_startRenderPage:function(a,b){this.intentStates[b].displayReadyPromise.resolve(a)},_renderPageChunk:function(a,b){var c=
+this.intentStates[b],d,e;d=0;for(e=a.length;d<e;d++)c.operatorList.fnArray.push(a.fnArray[d]),c.operatorList.argsArray.push(a.argsArray[d]);c.operatorList.lastChunk=a.lastChunk;for(d=0;d<c.renderTasks.length;d++)c.renderTasks[d].operatorListChanged();a.lastChunk&&(c.receivingOperatorList=!1,this._tryDestroy())}};var ib,nb=function(a,b,c,d){this.pdfDataRangeTransport=c;this.workerReadyPromise=b;this.progressCallback=d;this.commonObjs=new pa;this.pageCache=[];this.pagePromises=[];this.downloadInfoPromise=
+new PDFJS.LegacyPromise;this.passwordCallback=null;if(!y.PDFJS.disableWorker&&"undefined"!==typeof Worker){(b=PDFJS.workerSrc)||v("No PDFJS.workerSrc specified");try{var e=new Worker(b),f=new fa("main",e);this.messageHandler=f;f.on("test",function(b){b&&b.supportTypedArray?(this.worker=e,b.supportTransfers||(PDFJS.postMessageTransfers=!1),this.setupMessageHandler(f),a.resolve()):(y.PDFJS.disableWorker=!0,this.loadFakeWorkerFiles().then(function(){this.setupFakeWorker();a.resolve()}.bind(this)))}.bind(this));
+var g=new Uint8Array([PDFJS.postMessageTransfers?255:0]);try{f.send("test",g,null,[g.buffer])}catch(h){G("Cannot use postMessage transfers"),g[0]=0,f.send("test",g)}return}catch(j){G("The worker has been disabled.")}}y.PDFJS.disableWorker=!0;this.loadFakeWorkerFiles().then(function(){this.setupFakeWorker();a.resolve()}.bind(this))};nb.prototype={destroy:function(){this.pageCache=[];this.pagePromises=[];var a=this;this.messageHandler.send("Terminate",null,function(){M.clear();a.worker&&a.worker.terminate()})},
+loadFakeWorkerFiles:function(){PDFJS.fakeWorkerFilesLoadedPromise||(PDFJS.fakeWorkerFilesLoadedPromise=new N,t.loadScript(PDFJS.workerSrc,function(){PDFJS.fakeWorkerFilesLoadedPromise.resolve()}));return PDFJS.fakeWorkerFilesLoadedPromise},setupFakeWorker:function(){z("Setting up fake worker.");var a={postMessage:function(b){a.onmessage({data:b})},terminate:function(){}},b=new fa("main",a);this.setupMessageHandler(b);PDFJS.WorkerMessageHandler.setup(b)},setupMessageHandler:function(a){function b(b){a.send("UpdatePassword",
+b)}this.messageHandler=a;var c=this.pdfDataRangeTransport;c&&(c.addRangeListener(function(b,c){a.send("OnDataRange",{begin:b,chunk:c})}),c.addProgressListener(function(b){a.send("OnDataProgress",{loaded:b})}),a.on("RequestDataRange",function(a){c.requestDataRange(a.begin,a.end)},this));a.on("GetDoc",function(a){var b=a.pdfInfo;this.numPages=a.pdfInfo.numPages;this.pdfDocument=a=new jb(b,this);this.workerReadyPromise.resolve(a)},this);a.on("NeedPassword",function(a){if(this.passwordCallback)return this.passwordCallback(b,
+Ba.NEED_PASSWORD);this.workerReadyPromise.reject(a.exception.information,a.exception)},this);a.on("IncorrectPassword",function(a){if(this.passwordCallback)return this.passwordCallback(b,Ba.INCORRECT_PASSWORD);this.workerReadyPromise.reject(a.exception.information,a.exception)},this);a.on("InvalidPDF",function(a){this.workerReadyPromise.reject(a.exception.name,a.exception)},this);a.on("MissingPDF",function(a){this.workerReadyPromise.reject(a.exception.information,a.exception)},this);a.on("UnknownError",function(a){this.workerReadyPromise.reject(a.exception.information,
+a.exception)},this);a.on("DataLoaded",function(a){this.downloadInfoPromise.resolve(a)},this);a.on("GetPage",function(a){a=a.pageInfo;var b=new kb(a,this);this.pageCache[a.pageIndex]=b;this.pagePromises[a.pageIndex].resolve(b)},this);a.on("GetAnnotations",function(a){this.pageCache[a.pageIndex].annotationsPromise.resolve(a.annotations)},this);a.on("StartRenderPage",function(a){var b=this.pageCache[a.pageIndex];b.stats.timeEnd("Page Request");b._startRenderPage(a.transparency,a.intent)},this);a.on("RenderPageChunk",
+function(a){this.pageCache[a.pageIndex]._renderPageChunk(a.operatorList,a.intent)},this);a.on("commonobj",function(a){var b=a[0],c=a[1];if(!this.commonObjs.hasData(b))switch(c){case "Font":a=a[2];var g;if("error"in a){var h=a.error;z("Error during font loading: "+h);this.commonObjs.resolve(b,h);break}else g=new ob(a);M.bind([g],function(){this.commonObjs.resolve(b,g)}.bind(this));break;case "FontPath":this.commonObjs.resolve(b,a[2]);break;default:h("Got unknown common object type "+c)}},this);a.on("obj",
+function(a){var b=a[0],c=a[2],g=this.pageCache[a[1]];if(!g.objs.hasData(b))switch(c){case "JpegStream":a=a[3];var h=g.objs,j=new Image;j.onload=function(){h.resolve(b,j)};j.src=a;break;case "Image":a=a[3];g.objs.resolve(b,a);a&&("data"in a&&8E6<a.data.length)&&(g.cleanupAfterRender=!0);break;default:v("Got unknown object type "+c)}},this);a.on("DocProgress",function(a){this.progressCallback&&this.progressCallback({loaded:a.loaded,total:a.total})},this);a.on("DocError",function(a){this.workerReadyPromise.reject(a)},
+this);a.on("PageError",function(a,b){var c=this.pageCache[a.pageNum-1].intentStates[b];c.displayReadyPromise?c.displayReadyPromise.reject(a.error):v(a.error)},this);a.on("JpegDecode",function(a,b){var c=a[0],g=a[1];3!=g&&1!=g&&v("Only 3 component or 1 component can be returned");var h=new Image;h.onload=function(){var a=h.width,c=h.height,d=a*c,f=4*d,d=new Uint8Array(d*g),q=ya(a,c).getContext("2d");q.drawImage(h,0,0);var q=q.getImageData(0,0,a,c).data,n,m;if(3==g)for(m=n=0;n<f;n+=4,m+=3)d[m]=q[n],
+d[m+1]=q[n+1],d[m+2]=q[n+2];else if(1==g)for(m=n=0;n<f;n+=4,m++)d[m]=q[n];b.resolve({data:d,width:a,height:c})}.bind(this);h.src=c})},fetchDocument:function(a){a.disableAutoFetch=PDFJS.disableAutoFetch;a.chunkedViewerLoading=!!this.pdfDataRangeTransport;this.messageHandler.send("GetDocRequest",{source:a,disableRange:PDFJS.disableRange,maxImageSize:PDFJS.maxImageSize,cMapUrl:PDFJS.cMapUrl,cMapPacked:PDFJS.cMapPacked,disableFontFace:PDFJS.disableFontFace,disableCreateObjectURL:PDFJS.disableCreateObjectURL,
+verbosity:PDFJS.verbosity})},getData:function(a){this.messageHandler.send("GetData",null,function(b){a.resolve(b)})},getPage:function(a,b){if(0>=a||a>this.numPages||(a|0)!==a){var c=new PDFJS.LegacyPromise;c.reject(Error("Invalid page request"));return c}c=a-1;if(c in this.pagePromises)return this.pagePromises[c];b=new PDFJS.LegacyPromise;this.pagePromises[c]=b;this.messageHandler.send("GetPageRequest",{pageIndex:c});return b},getPageIndex:function(a){var b=new PDFJS.LegacyPromise;this.messageHandler.send("GetPageIndex",
+{ref:a},function(a){b.resolve(a)});return b},getAnnotations:function(a){this.messageHandler.send("GetAnnotationsRequest",{pageIndex:a})},getDestinations:function(){var a=new PDFJS.LegacyPromise;this.messageHandler.send("GetDestinations",null,function(b){a.resolve(b)});return a},getAttachments:function(){var a=new PDFJS.LegacyPromise;this.messageHandler.send("GetAttachments",null,function(b){a.resolve(b)});return a},startCleanup:function(){this.messageHandler.send("Cleanup",null,function(){for(var a=
+0,b=this.pageCache.length;a<b;a++){var c=this.pageCache[a];c&&c.destroy()}this.commonObjs.clear();M.clear()}.bind(this))}};ib=nb;var pa,pb=function(){this.objs={}};pb.prototype={ensureObj:function(a){if(this.objs[a])return this.objs[a];var b={promise:new N,data:null,resolved:!1};return this.objs[a]=b},get:function(a,b){if(b)return this.ensureObj(a).promise.then(b),null;var c=this.objs[a];(!c||!c.resolved)&&v("Requesting object that isn't resolved yet "+a);return c.data},resolve:function(a,b){var c=
+this.ensureObj(a);c.resolved=!0;c.data=b;c.promise.resolve(b)},isResolved:function(a){var b=this.objs;return b[a]?b[a].resolved:!1},hasData:function(a){return this.isResolved(a)},getData:function(a){var b=this.objs;return!b[a]||!b[a].resolved?null:b[a].data},clear:function(){this.objs={}}};pa=pb;var mb,qb=function(a){this.internalRenderTask=a;this.promise=new PDFJS.LegacyPromise};qb.prototype={cancel:function(){this.internalRenderTask.cancel();this.promise.reject(Error("Rendering is cancelled"))},
+then:function(a,b){return this.promise.then(a,b)}};mb=qb;var lb,rb=function(a,b,c,d,e,f){this.callback=a;this.params=b;this.objs=c;this.commonObjs=d;this.operatorListIdx=null;this.operatorList=e;this.pageNumber=f;this.running=!1;this.graphicsReadyCallback=null;this.cancelled=this.graphicsReady=!1};rb.prototype={initalizeGraphics:function(a){if(!this.cancelled){PDFJS.pdfBug&&("StepperManager"in y&&y.StepperManager.enabled)&&(this.stepper=y.StepperManager.create(this.pageNumber-1),this.stepper.init(this.operatorList),
+this.stepper.nextBreakPoint=this.stepper.getNextBreakPoint());var b=this.params;this.gfx=new qa(b.canvasContext,this.commonObjs,this.objs,b.imageLayer);this.gfx.beginDrawing(b.viewport,a);this.operatorListIdx=0;this.graphicsReady=!0;this.graphicsReadyCallback&&this.graphicsReadyCallback()}},cancel:function(){this.running=!1;this.cancelled=!0;this.callback("cancelled")},operatorListChanged:function(){this.graphicsReady?(this.stepper&&this.stepper.updateOperatorList(this.operatorList),this.running||
+this._continue()):this.graphicsReadyCallback||(this.graphicsReadyCallback=this._continue.bind(this))},_continue:function(){this.running=!0;this.cancelled||(this.params.continueCallback?this.params.continueCallback(this._next.bind(this)):this._next())},_next:function(){this.cancelled||(this.operatorListIdx=this.gfx.executeOperatorList(this.operatorList,this.operatorListIdx,this._continue.bind(this),this.stepper),this.operatorListIdx===this.operatorList.argsArray.length&&(this.running=!1,this.operatorList.lastChunk&&
+(this.gfx.endDrawing(),this.callback())))}};lb=rb;var Nb=PDFJS,sb=function(a){"string"===typeof a?(a=a.replace(/>\\376\\377([^<]+)/g,function(a,c){for(var d=c.replace(/\\([0-3])([0-7])([0-7])/g,function(a,b,c,d){return String.fromCharCode(64*b+8*c+1*d)}),e="",f=0;f<d.length;f+=2)var g=256*d.charCodeAt(f)+d.charCodeAt(f+1),e=e+("&#x"+(65536+g).toString(16).substring(1)+";");return">"+e}),a=(new DOMParser).parseFromString(a,"application/xml")):a instanceof Document||v("Metadata: Invalid metadata object");
+this.metaDocument=a;this.metadata={};this.parse()};sb.prototype={parse:function(){var a=this.metaDocument.documentElement;if("rdf:rdf"!==a.nodeName.toLowerCase())for(a=a.firstChild;a&&"rdf:rdf"!==a.nodeName.toLowerCase();)a=a.nextSibling;var b=a?a.nodeName.toLowerCase():null;if(a&&"rdf:rdf"===b&&a.hasChildNodes()){var a=a.childNodes,c,d,e,f,g,h;e=0;for(g=a.length;e<g;e++)if(b=a[e],"rdf:description"===b.nodeName.toLowerCase()){f=0;for(h=b.childNodes.length;f<h;f++)"#text"!==b.childNodes[f].nodeName.toLowerCase()&&
+(c=b.childNodes[f],d=c.nodeName.toLowerCase(),this.metadata[d]=c.textContent.trim())}}},get:function(a){return this.metadata[a]||null},has:function(a){return"undefined"!==typeof this.metadata[a]}};Nb.Metadata=sb;var F,$={};F={getCanvas:function(a,b,c,d){a in $?(a=$[a],a.canvas.width=b,a.canvas.height=c,a.context.setTransform(1,0,0,1,0,0)):(b=ya(b,c),c=b.getContext("2d"),d&&za(c),$[a]=a={canvas:b,context:c});return a},clear:function(){$={}}};var ra=function(a){this.alphaIsShape=!1;this.fontSize=0;
+this.fontSizeScale=1;this.textMatrix=Ca;this.fontMatrix=ha;this.wordSpacing=this.charSpacing=this.lineY=this.lineX=this.y=this.x=this.leading=0;this.textHScale=1;this.textRise=this.textRenderingMode=0;this.fillColorSpace=s.singletons.gray;this.fillColorSpaceObj=null;this.strokeColorSpace=s.singletons.gray;this.strokeColorObj=this.fillColorObj=this.strokeColorSpaceObj=null;this.strokeColor=this.fillColor="#000000";this.lineWidth=this.strokeAlpha=this.fillAlpha=1;this.activeSMask=null;this.old=a};ra.prototype=
+{clone:function(){return Object.create(this)},setCurrentPoint:function(a,b){this.x=a;this.y=b}};var qa,aa=function(a,b,c,d){this.ctx=a;this.current=new ra;this.stateStack=[];this.pendingClip=null;this.pendingEOFill=!1;this.xobjs=this.res=null;this.commonObjs=b;this.objs=c;this.imageLayer=d;this.groupStack=[];this.baseTransform=this.processingType3=null;this.baseTransformStack=[];this.groupLevel=0;this.smaskStack=[];this.smaskCounter=0;this.tempSMask=null;a&&za(a)},tb=function(a,b){if("undefined"!==
+typeof ImageData&&b instanceof ImageData)a.putImageData(b,0,0);else{var c=b.height,d=b.width,e=c/16,f=Math.floor(e),e=Math.ceil(e),c=c-16*f,g=a.createImageData(d,16),h=0,j,k=b.data,l=g.data,p,q,n;if(1===b.kind){var m=k.byteLength,l=PDFJS.hasCanvasTypedArrays?new Uint32Array(l.buffer):new ja(l),r=l.length,x=d+7>>3,w=PDFJS.isLittleEndian||!PDFJS.hasCanvasTypedArrays?4278190080:255;for(p=0;p<e;p++){n=p<f?16:c;for(q=j=0;q<n;q++){for(var D=m-h,t=0,D=D>x?d:8*D-7,s=D&-8,P=0,u=0;t<s;t+=8)u=k[h++],l[j++]=
+u&128?4294967295:w,l[j++]=u&64?4294967295:w,l[j++]=u&32?4294967295:w,l[j++]=u&16?4294967295:w,l[j++]=u&8?4294967295:w,l[j++]=u&4?4294967295:w,l[j++]=u&2?4294967295:w,l[j++]=u&1?4294967295:w;for(;t<D;t++)0===P&&(u=k[h++],P=128),l[j++]=u&P?4294967295:w,P>>=1}for(;j<r;)l[j++]=0;a.putImageData(g,0,16*p)}}else if(3===b.kind)for(p=0;p<e;p++)n=p<f?16:c,d=4*b.width*n,l.set(k.subarray(h,h+d)),h+=d,a.putImageData(g,0,16*p);else if(2===b.kind)for(p=0;p<e;p++){n=p<f?16:c;d=3*b.width*n;for(q=j=0;q<d;q+=3)l[j++]=
+k[h++],l[j++]=k[h++],l[j++]=k[h++],l[j++]=255;a.putImageData(g,0,16*p)}else v("bad image kind: "+b.kind)}},sa=function(a,b){for(var c=b.height,d=b.width,e=c/16,f=Math.floor(e),e=Math.ceil(e),c=c-16*f,g=a.createImageData(d,16),h=0,j=b.data,k=g.data,l=0;l<e;l++){for(var p=l<f?16:c,q=3,n=0;n<p;n++)for(var m=0,r=0;r<d;r++){if(!m)var x=j[h++],m=128;k[q]=x&m?0:255;q+=4;m>>=1}a.putImageData(g,0,16*l)}},ub=function(a,b){for(var c="strokeStyle fillStyle fillRule globalAlpha lineWidth lineCap lineJoin miterLimit globalCompositeOperation font".split(" "),
+d=0,e=c.length;d<e;d++){var f=c[d];f in a&&(b[f]=a[f])}"setLineDash"in a?(b.setLineDash(a.getLineDash()),b.lineDashOffset=a.lineDashOffset):"mozDash"in a&&(b.mozDash=a.mozDash,b.mozDashOffset=a.mozDashOffset)},Ob=["butt","round","square"],Pb=["miter","round","bevel"],Qb={},vb={};aa.prototype={beginDrawing:function(a,b){var c=this.ctx.canvas.width,d=this.ctx.canvas.height;b?this.ctx.clearRect(0,0,c,d):(this.ctx.mozOpaque=!0,this.ctx.save(),this.ctx.fillStyle="rgb(255, 255, 255)",this.ctx.fillRect(0,
+0,c,d),this.ctx.restore());c=a.transform;this.ctx.save();this.ctx.transform.apply(this.ctx,c);this.baseTransform=this.ctx.mozCurrentTransform.slice();this.imageLayer&&this.imageLayer.beginLayout()},executeOperatorList:function(a,b,c,d){var e=a.argsArray;a=a.fnArray;b=b||0;var f=e.length;if(f==b)return b;for(var g=Date.now()+15,h=this.commonObjs,j=this.objs,k,l=Promise.resolve();;){if(d&&b===d.nextBreakPoint)return d.breakIt(b,c),b;k=a[b];if(k!==J.dependency)this[k].apply(this,e[b]);else{k=e[b];for(var p=
+0,q=k.length;p<q;p++){var n=k[p],m="g_"==n.substring(0,2);if(!m&&!j.isResolved(n))return j.get(n,c),b;if(m&&!h.isResolved(n))return h.get(n,c),b}}b++;if(b==f)return b;if(c&&Date.now()>g)return l.then(c),b}},endDrawing:function(){this.ctx.restore();F.clear();R.clear();this.imageLayer&&this.imageLayer.endLayout()},setLineWidth:function(a){this.current.lineWidth=a;this.ctx.lineWidth=a},setLineCap:function(a){this.ctx.lineCap=Ob[a]},setLineJoin:function(a){this.ctx.lineJoin=Pb[a]},setMiterLimit:function(a){this.ctx.miterLimit=
+a},setDash:function(a,b){var c=this.ctx;"setLineDash"in c?(c.setLineDash(a),c.lineDashOffset=b):(c.mozDash=a,c.mozDashOffset=b)},setRenderingIntent:function(){},setFlatness:function(){},setGState:function(a){for(var b=0,c=a.length;b<c;b++){var d=a[b],e=d[1];switch(d[0]){case "LW":this.setLineWidth(e);break;case "LC":this.setLineCap(e);break;case "LJ":this.setLineJoin(e);break;case "ML":this.setMiterLimit(e);break;case "D":this.setDash(e[0],e[1]);break;case "RI":this.setRenderingIntent(e);break;case "FL":this.setFlatness(e);
+break;case "Font":this.setFont(e[0],e[1]);break;case "CA":this.current.strokeAlpha=d[1];break;case "ca":this.current.fillAlpha=d[1];this.ctx.globalAlpha=d[1];break;case "BM":e&&e.name&&"Normal"!==e.name?(d=e.name.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()}).substring(1),this.ctx.globalCompositeOperation=d,this.ctx.globalCompositeOperation!==d&&z('globalCompositeOperation "'+d+'" is not supported')):this.ctx.globalCompositeOperation="source-over";break;case "SMask":this.current.activeSMask&&
+this.endSMaskGroup(),this.current.activeSMask=e?this.tempSMask:null,this.current.activeSMask&&this.beginSMaskGroup(),this.tempSMask=null}}},beginSMaskGroup:function(){var a=this.current.activeSMask,b=F.getCanvas("smaskGroupAt"+this.groupLevel,a.canvas.width,a.canvas.height,!0),c=this.ctx,d=c.mozCurrentTransform;this.ctx.save();b=b.context;b.scale(1/a.scaleX,1/a.scaleY);b.translate(-a.offsetX,-a.offsetY);b.transform.apply(b,d);ub(c,b);this.ctx=b;this.setGState([["BM","Normal"],["ca",1],["CA",1]]);
+this.groupStack.push(c);this.groupLevel++},endSMaskGroup:function(){var a=this.ctx;this.groupLevel--;var b=this.ctx=this.groupStack.pop(),c=this.current.activeSMask,d=c.canvas,e=c.context;b.setTransform(c.scaleX,0,0,c.scaleY,c.offsetX,c.offsetY);var f;c.backdrop&&(f=(c.colorSpace||s.singletons.rgb).getRgb(c.backdrop,0));if(R.isEnabled)a=R.composeSMask(a.canvas,d,{subtype:c.subtype,backdrop:f}),b.setTransform(1,0,0,1,0,0),b.drawImage(a,c.offsetX,c.offsetY);else{var g=d.width,h=d.height,j=c.subtype,
+c=(c=f)?function(a,b,c,d){for(var e=d.length,f=3;f<e;f+=4){var g=d[f]/255;if(0===g)d[f-3]=a,d[f-2]=b,d[f-1]=c;else if(1>g){var h=1-g;d[f-3]=d[f-3]*g+a*h|0;d[f-2]=d[f-2]*g+b*h|0;d[f-1]=d[f-1]*g+c*h|0}}}.bind(null,c[0],c[1],c[2]):function(){},j="Luminosity"===j?function(a,b){for(var c=a.length,d=3;d<c;d+=4)b[d]=b[d]*(77*a[d-3]+152*a[d-2]+28*a[d-1]|0)>>16}:function(a,b){for(var c=a.length,d=3;d<c;d+=4)b[d]=b[d]*a[d]/255|0};f=Math.min(h,Math.ceil(65536/g));for(var k=0;k<h;k+=f){var l=Math.min(f,h-k),
+p=e.getImageData(0,k,g,l),l=a.getImageData(0,k,g,l);c(p.data);j(p.data,l.data);e.putImageData(l,0,k)}b.drawImage(d,0,0)}this.ctx.restore()},save:function(){this.ctx.save();var a=this.current;this.stateStack.push(a);this.current=a.clone();this.current.activeSMask&&(this.current.activeSMask=null)},restore:function(){var a=this.stateStack.pop();a&&(this.current.activeSMask&&this.endSMaskGroup(),this.current=a,this.ctx.restore())},transform:function(a,b,c,d,e,f){this.ctx.transform(a,b,c,d,e,f)},moveTo:function(a,
+b){this.ctx.moveTo(a,b);this.current.setCurrentPoint(a,b)},lineTo:function(a,b){this.ctx.lineTo(a,b);this.current.setCurrentPoint(a,b)},curveTo:function(a,b,c,d,e,f){this.ctx.bezierCurveTo(a,b,c,d,e,f);this.current.setCurrentPoint(e,f)},curveTo2:function(a,b,c,d){var e=this.current;this.ctx.bezierCurveTo(e.x,e.y,a,b,c,d);e.setCurrentPoint(c,d)},curveTo3:function(a,b,c,d){this.curveTo(a,b,c,d,c,d);this.current.setCurrentPoint(c,d)},closePath:function(){this.ctx.closePath()},rectangle:function(a,b,
+c,d){0===c&&(c=this.getSinglePixelWidth());0===d&&(d=this.getSinglePixelWidth());this.ctx.rect(a,b,c,d)},stroke:function(a){a="undefined"!==typeof a?a:!0;var b=this.ctx,c=this.current.strokeColor;0===this.current.lineWidth&&(b.lineWidth=this.getSinglePixelWidth());b.globalAlpha=this.current.strokeAlpha;c&&c.hasOwnProperty("type")&&"Pattern"===c.type?(b.save(),b.strokeStyle=c.getPattern(b,this),b.stroke(),b.restore()):b.stroke();a&&this.consumePath();b.globalAlpha=this.current.fillAlpha},closeStroke:function(){this.closePath();
+this.stroke()},fill:function(a){a="undefined"!==typeof a?a:!0;var b=this.ctx,c=this.current.fillColor,d=!1;c&&(c.hasOwnProperty("type")&&"Pattern"===c.type)&&(b.save(),b.fillStyle=c.getPattern(b,this),d=!0);if(this.pendingEOFill){if("mozFillRule"in this.ctx)this.ctx.mozFillRule="evenodd",this.ctx.fill(),this.ctx.mozFillRule="nonzero";else try{this.ctx.fill("evenodd")}catch(e){this.ctx.fill()}this.pendingEOFill=!1}else this.ctx.fill();d&&b.restore();a&&this.consumePath()},eoFill:function(){this.pendingEOFill=
+!0;this.fill()},fillStroke:function(){this.fill(!1);this.stroke(!1);this.consumePath()},eoFillStroke:function(){this.pendingEOFill=!0;this.fillStroke()},closeFillStroke:function(){this.closePath();this.fillStroke()},closeEOFillStroke:function(){this.pendingEOFill=!0;this.closePath();this.fillStroke()},endPath:function(){this.consumePath()},clip:function(){this.pendingClip=Qb},eoClip:function(){this.pendingClip=vb},beginText:function(){this.current.textMatrix=Ca;this.current.x=this.current.lineX=0;
+this.current.y=this.current.lineY=0},endText:function(){if("pendingTextPaths"in this){var a=this.pendingTextPaths,b=this.ctx;b.save();b.beginPath();for(var c=0;c<a.length;c++){var d=a[c];b.setTransform.apply(b,d.transform);b.translate(d.x,d.y);d.addToPath(b,d.fontSize)}b.restore();b.clip();b.beginPath();delete this.pendingTextPaths}else this.ctx.beginPath()},setCharSpacing:function(a){this.current.charSpacing=a},setWordSpacing:function(a){this.current.wordSpacing=a},setHScale:function(a){this.current.textHScale=
+a/100},setLeading:function(a){this.current.leading=-a},setFont:function(a,b){var c=this.commonObjs.get(a),d=this.current;c||v("Can't find font for "+a);d.fontMatrix=c.fontMatrix?c.fontMatrix:ha;(0===d.fontMatrix[0]||0===d.fontMatrix[3])&&z("Invalid font matrix for font "+a);0>b?(b=-b,d.fontDirection=-1):d.fontDirection=1;this.current.font=c;this.current.fontSize=b;if(!c.coded){var d=c.black?c.bold?"bolder":"bold":c.bold?"bold":"normal",e=c.italic?"italic":"normal",c='"'+(c.loadedName||"sans-serif")+
+'", '+c.fallbackName,f=16<=b?b:16;this.current.fontSizeScale=16!=f?1:b/16;this.ctx.font=e+" "+d+" "+f+"px "+c}},setTextRenderingMode:function(a){this.current.textRenderingMode=a},setTextRise:function(a){this.current.textRise=a},moveText:function(a,b){this.current.x=this.current.lineX+=a;this.current.y=this.current.lineY+=b},setLeadingMoveText:function(a,b){this.setLeading(-b);this.moveText(a,b)},setTextMatrix:function(a,b,c,d,e,f){this.current.textMatrix=[a,b,c,d,e,f];this.current.x=this.current.lineX=
+0;this.current.y=this.current.lineY=0},nextLine:function(){this.moveText(0,this.current.leading)},applyTextTransforms:function(){var a=this.ctx,b=this.current;a.transform.apply(a,b.textMatrix);a.translate(b.x,b.y+b.textRise);0<b.fontDirection?a.scale(b.textHScale,-1):a.scale(-b.textHScale,1)},paintChar:function(a,b,c){var d=this.ctx,e=this.current,f=e.font,g=e.fontSize/e.fontSizeScale,h=e.textRenderingMode,e=h&3,h=!!(h&4),j;if(f.disableFontFace||h)j=f.getPathGenerator(this.commonObjs,a);f.disableFontFace?
+(d.save(),d.translate(b,c),d.beginPath(),j(d,g),(0===e||2===e)&&d.fill(),(1===e||2===e)&&d.stroke(),d.restore()):((0===e||2===e)&&d.fillText(a,b,c),(1===e||2===e)&&d.strokeText(a,b,c));h&&(this.pendingTextPaths||(this.pendingTextPaths=[])).push({transform:d.mozCurrentTransform,x:b,y:c,fontSize:g,addToPath:j})},get isFontSubpixelAAEnabled(){var a=document.createElement("canvas").getContext("2d");a.scale(1.5,1);a.fillText("I",0,10);for(var a=a.getImageData(0,0,10,10).data,b=!1,c=3;c<a.length;c+=4)if(0<
+a[c]&&255>a[c]){b=!0;break}return K(this,"isFontSubpixelAAEnabled",b)},showText:function(a){var b=this.ctx,c=this.current,d=c.font,e=c.fontSize,f=c.fontSizeScale,g=c.charSpacing,h=c.wordSpacing,j=c.textHScale*c.fontDirection,k=c.fontMatrix||ha,l=a.length,p=d.vertical,q=d.defaultVMetrics,n,m,r;if(0!==e)if(d.coded){b.save();b.transform.apply(b,c.textMatrix);b.translate(c.x,c.y);b.scale(j,1);for(n=0;n<l;++n)m=a[n],null===m?(this.ctx.translate(h,0),c.x+=h*j):(this.processingType3=m,this.save(),b.scale(e,
+e),b.transform.apply(b,k),this.executeOperatorList(m.operatorList),this.restore(),r=(t.applyTransform([m.width,0],k)[0]*e+g)*c.fontDirection,b.translate(r,0),c.x+=r*j);b.restore();this.processingType3=null}else{b.save();this.applyTextTransforms();n=c.lineWidth;var k=c.textMatrix[0],x=c.textMatrix[1],k=Math.sqrt(k*k+x*x);n=0===k||0===n?this.getSinglePixelWidth():n/k;1!=f&&(b.scale(f,f),n/=f);b.lineWidth=n;for(n=k=0;n<l;++n)if(m=a[n],null===m)k+=c.fontDirection*h;else{var x=!1,w=m.fontChar,D=m.vmetric||
+q;if(p)var v=m.vmetric?D[1]:0.5*m.width,v=-v*e*c.fontMatrix[0],s=D[2]*e*c.fontMatrix[0];r=D?-D[0]:m.width;D=r*e*c.fontMatrix[0]+g*c.fontDirection;m=m.accent;var u,y,z;p?(u=v/f,y=(k+s)/f):(u=k/f,y=0);d.remeasure&&(0<r&&this.isFontSubpixelAAEnabled)&&(x=1E3*b.measureText(w).width/c.fontSize*c.fontSizeScale,r/=x,x=!0,b.save(),b.scale(r,1),u/=r,m&&(z/=r));this.paintChar(w,u,y);m&&(z=u+m.offset.x/f,w=y-m.offset.y/f,this.paintChar(m.fontChar,z,w));k+=D;x&&b.restore()}p?c.y-=k*j:c.x+=k*j;b.restore()}},showSpacedText:function(a){for(var b=
+this.current,c=b.fontSize,d=0.001*b.textHScale*b.fontDirection,e=a.length,f=b.font.vertical,g=0;g<e;++g){var h=a[g];"number"==typeof h?(h=-h*c*d,f?b.y+=h:b.x+=h):this.showText(h)}},nextLineShowText:function(a){this.nextLine();this.showText(a)},nextLineSetSpacingShowText:function(a,b,c){this.setWordSpacing(a);this.setCharSpacing(b);this.nextLineShowText(c)},setCharWidth:function(){},setCharWidthAndBounds:function(a,b,c,d,e,f){this.rectangle(c,d,e-c,f-d);this.clip();this.endPath()},setStrokeColorSpace:function(a){this.current.strokeColorSpace=
+s.fromIR(a)},setFillColorSpace:function(a){this.current.fillColorSpace=s.fromIR(a)},setStrokeColor:function(){var a=this.current.strokeColorSpace.getRgb(arguments,0),a=t.makeCssRgb(a);this.ctx.strokeStyle=a;this.current.strokeColor=a},getColorN_Pattern:function(a,b){var c;if("TilingPattern"==a[0]){c=a[1];var d=b.base,e;d&&(e=d.getRgb(c,0));c=new wb(a,e,this.ctx,this.objs,this.commonObjs,this.baseTransform)}else c=Aa(a);return c},setStrokeColorN:function(){var a=this.current.strokeColorSpace;"Pattern"==
+a.name?this.current.strokeColor=this.getColorN_Pattern(arguments,a):this.setStrokeColor.apply(this,arguments)},setFillColor:function(){var a=this.current.fillColorSpace.getRgb(arguments,0),a=t.makeCssRgb(a);this.ctx.fillStyle=a;this.current.fillColor=a},setFillColorN:function(){var a=this.current.fillColorSpace;"Pattern"==a.name?this.current.fillColor=this.getColorN_Pattern(arguments,a):this.setFillColor.apply(this,arguments)},setStrokeGray:function(a){this.current.strokeColorSpace=s.singletons.gray;
+var b=this.current.strokeColorSpace.getRgb(arguments,0),b=t.makeCssRgb(b);this.ctx.strokeStyle=b;this.current.strokeColor=b},setFillGray:function(a){this.current.fillColorSpace=s.singletons.gray;var b=this.current.fillColorSpace.getRgb(arguments,0),b=t.makeCssRgb(b);this.ctx.fillStyle=b;this.current.fillColor=b},setStrokeRGBColor:function(a,b,c){this.current.strokeColorSpace=s.singletons.rgb;var d=this.current.strokeColorSpace.getRgb(arguments,0),d=t.makeCssRgb(d);this.ctx.strokeStyle=d;this.current.strokeColor=
+d},setFillRGBColor:function(a,b,c){this.current.fillColorSpace=s.singletons.rgb;var d=this.current.fillColorSpace.getRgb(arguments,0),d=t.makeCssRgb(d);this.ctx.fillStyle=d;this.current.fillColor=d},setStrokeCMYKColor:function(a,b,c,d){this.current.strokeColorSpace=s.singletons.cmyk;var e=t.makeCssCmyk(arguments);this.ctx.strokeStyle=e;this.current.strokeColor=e},setFillCMYKColor:function(a,b,c,d){this.current.fillColorSpace=s.singletons.cmyk;var e=t.makeCssCmyk(arguments);this.ctx.fillStyle=e;this.current.fillColor=
+e},shadingFill:function(a){var b=this.ctx;this.save();a=Aa(a);b.fillStyle=a.getPattern(b,this,!0);var c=b.mozCurrentTransformInverse;if(c){var b=b.canvas,d=b.width,e=b.height,b=t.applyTransform([0,0],c);a=t.applyTransform([0,e],c);var f=t.applyTransform([d,0],c),g=t.applyTransform([d,e],c),c=Math.min(b[0],a[0],f[0],g[0]),d=Math.min(b[1],a[1],f[1],g[1]),e=Math.max(b[0],a[0],f[0],g[0]),b=Math.max(b[1],a[1],f[1],g[1]);this.ctx.fillRect(c,d,e-c,b-d)}else this.ctx.fillRect(-1E10,-1E10,2E10,2E10);this.restore()},
+beginInlineImage:function(){v("Should not call beginInlineImage")},beginImageData:function(){v("Should not call beginImageData")},paintFormXObjectBegin:function(a,b){this.save();this.baseTransformStack.push(this.baseTransform);a&&(B(a)&&6==a.length)&&this.transform.apply(this,a);this.baseTransform=this.ctx.mozCurrentTransform;b&&(B(b)&&4==b.length)&&(this.rectangle(b[0],b[1],b[2]-b[0],b[3]-b[1]),this.clip(),this.endPath())},paintFormXObjectEnd:function(){this.restore();this.baseTransform=this.baseTransformStack.pop()},
+beginGroup:function(a){this.save();var b=this.ctx;a.isolated||G("TODO: Support non-isolated groups.");a.knockout&&z("Knockout groups not supported.");var c=b.mozCurrentTransform;a.matrix&&b.transform.apply(b,a.matrix);a.bbox||v("Bounding box is required.");var d=t.getAxialAlignedBoundingBox(a.bbox,b.mozCurrentTransform),d=t.intersect(d,[0,0,b.canvas.width,b.canvas.height])||[0,0,0,0],e=Math.floor(d[0]),f=Math.floor(d[1]),g=Math.max(Math.ceil(d[2])-e,1),h=Math.max(Math.ceil(d[3])-f,1),j=d=1;4096<g&&
+(d=g/4096,g=4096);4096<h&&(j=h/4096,h=4096);var k="groupAt"+this.groupLevel;a.smask&&(k+="_smask_"+this.smaskCounter++%2);g=F.getCanvas(k,g,h,!0);h=g.context;h.scale(1/d,1/j);h.translate(-e,-f);h.transform.apply(h,c);a.smask?this.smaskStack.push({canvas:g.canvas,context:h,offsetX:e,offsetY:f,scaleX:d,scaleY:j,subtype:a.smask.subtype,backdrop:a.smask.backdrop,colorSpace:a.colorSpace&&s.fromIR(a.colorSpace)}):(b.setTransform(1,0,0,1,0,0),b.translate(e,f),b.scale(d,j));ub(b,h);this.ctx=h;this.setGState([["BM",
+"Normal"],["ca",1],["CA",1]]);this.groupStack.push(b);this.groupLevel++},endGroup:function(a){this.groupLevel--;var b=this.ctx;this.ctx=this.groupStack.pop();"imageSmoothingEnabled"in this.ctx?this.ctx.imageSmoothingEnabled=!1:this.ctx.mozImageSmoothingEnabled=!1;a.smask?this.tempSMask=this.smaskStack.pop():this.ctx.drawImage(b.canvas,0,0);this.restore()},beginAnnotations:function(){this.save();this.current=new ra},endAnnotations:function(){this.restore()},beginAnnotation:function(a,b,c){this.save();
+a&&(B(a)&&4==a.length)&&(this.rectangle(a[0],a[1],a[2]-a[0],a[3]-a[1]),this.clip(),this.endPath());this.transform.apply(this,b);this.transform.apply(this,c)},endAnnotation:function(){this.restore()},paintJpegXObject:function(a,b,c){var d=this.objs.get(a);if(d){this.save();var e=this.ctx;e.scale(1/b,-1/c);e.drawImage(d,0,0,d.width,d.height,0,-c,b,c);this.imageLayer&&(d=e.mozCurrentTransformInverse,e=this.getCanvasPosition(0,0),this.imageLayer.appendImage({objId:a,left:e[0],top:e[1],width:b/d[0],height:c/
+d[3]}));this.restore()}else z("Dependent image isn't ready yet")},paintImageMaskXObject:function(a){var b=this.ctx,c=a.width,d=a.height,e=this.processingType3;if(e&&!("compiled"in e)){var f;if(1E3>=c&&1E3>=d)a:{var g=a.data,h,j,k=c+1,l=new Uint8Array(k*(d+1)),p=new Uint8Array([0,2,4,0,1,0,5,4,8,10,0,8,0,2,1,0]),q=c+7&-8,n=new Uint8Array(q*d),m=0;f=0;for(h=g.length;f<h;f++){j=128;for(var r=g[f];0<j;)n[m++]=r&j?0:255,j>>=1}m=g=0;0!==n[m]&&(l[0]=1,++g);for(h=1;h<c;h++)n[m]!==n[m+1]&&(l[h]=n[m]?2:1,++g),
+m++;0!==n[m]&&(l[h]=2,++g);for(f=1;f<d;f++){m=f*q;j=f*k;n[m-q]!==n[m]&&(l[j]=n[m]?1:8,++g);r=(n[m]?4:0)+(n[m-q]?8:0);for(h=1;h<c;h++)r=(r>>2)+(n[m+1]?4:0)+(n[m-q+1]?8:0),p[r]&&(l[j+h]=p[r],++g),m++;n[m-q]!==n[m]&&(l[j+h]=n[m]?2:4,++g);if(1E3<g){f=null;break a}}m=q*(d-1);j=f*k;0!==n[m]&&(l[j]=8,++g);for(h=1;h<c;h++)n[m]!==n[m+1]&&(l[j+h]=n[m]?4:8,++g),m++;0!==n[m]&&(l[j+h]=4,++g);if(1E3<g)f=null;else{var p=new Int32Array([0,k,-1,0,-k,0,0,0,1]),x=[];for(f=0;g&&f<=d;f++){q=f*k;for(n=q+c;q<n&&!l[q];)q++;
+if(q!==n){n=[q%k,f];m=l[q];h=q;do{j=p[m];do q+=j;while(!l[q]);j=l[q];5!==j&&10!==j?(m=j,l[q]=0):(m=j&51*m>>4,l[q]&=m>>2|m<<2);n.push(q%k);n.push(q/k|0);--g}while(h!==q);x.push(n);--f}}f=function(a){a.save();a.scale(1/c,-1/d);a.translate(0,-d);a.beginPath();for(var b=0,e=x.length;b<e;b++){var f=x[b];a.moveTo(f[0],f[1]);for(var g=2,h=f.length;g<h;g+=2)a.lineTo(f[g],f[g+1])}a.fill();a.beginPath();a.restore()}}}else f=null;e.compiled=f}e&&e.compiled?e.compiled(b):(b=F.getCanvas("maskCanvas",c,d),e=b.context,
+e.save(),sa(e,a),e.globalCompositeOperation="source-in",a=this.current.fillColor,e.fillStyle=a&&a.hasOwnProperty("type")&&"Pattern"===a.type?a.getPattern(e,this):a,e.fillRect(0,0,c,d),e.restore(),this.paintInlineImageXObject(b.canvas))},paintImageMaskXObjectRepeat:function(a,b,c,d){var e=a.width,f=a.height,g=this.ctx,h=F.getCanvas("maskCanvas",e,f),j=h.context;j.save();sa(j,a);j.globalCompositeOperation="source-in";a=this.current.fillColor;j.fillStyle=a&&a.hasOwnProperty("type")&&"Pattern"===a.type?
+a.getPattern(j,this):a;j.fillRect(0,0,e,f);j.restore();j=0;for(a=d.length;j<a;j+=2)g.save(),g.transform(b,0,0,c,d[j],d[j+1]),g.scale(1,-1),g.drawImage(h.canvas,0,0,e,f,0,-1,1,1),g.restore()},paintImageMaskXObjectGroup:function(a){for(var b=this.ctx,c=0,d=a.length;c<d;c++){var e=a[c],f=e.width,g=e.height,h=F.getCanvas("maskCanvas",f,g),j=h.context;j.save();sa(j,e);j.globalCompositeOperation="source-in";var k=this.current.fillColor;j.fillStyle=k&&k.hasOwnProperty("type")&&"Pattern"===k.type?k.getPattern(j,
+this):k;j.fillRect(0,0,f,g);j.restore();b.save();b.transform.apply(b,e.transform);b.scale(1,-1);b.drawImage(h.canvas,0,0,f,g,0,-1,1,1);b.restore()}},paintImageXObject:function(a){(a=this.objs.get(a))?this.paintInlineImageXObject(a):z("Dependent image isn't ready yet")},paintImageXObjectRepeat:function(a,b,c,d){if(a=this.objs.get(a)){for(var e=a.width,f=a.height,g=[],h=0,j=d.length;h<j;h+=2)g.push({transform:[b,0,0,c,d[h],d[h+1]],x:0,y:0,w:e,h:f});this.paintInlineImageXObjectGroup(a,g)}else z("Dependent image isn't ready yet")},
+paintInlineImageXObject:function(a){var b=a.width,c=a.height,d=this.ctx;this.save();d.scale(1/b,-1/c);var e=d.mozCurrentTransformInverse,f=e[0],g=e[1],f=Math.max(Math.sqrt(f*f+g*g),1),g=e[2],h=e[3],g=Math.max(Math.sqrt(g*g+h*h),1),j;if(a instanceof HTMLElement||!a.data)h=a;else{j=F.getCanvas("inlineImage",b,c);var k=j.context;tb(k,a);h=j.canvas}for(var l=b,p=c,q="prescale1";2<f&&1<l||2<g&&1<p;){var n=l,m=p;2<f&&1<l&&(n=Math.ceil(l/2),f/=l/n);2<g&&1<p&&(m=Math.ceil(p/2),g/=p/m);j=F.getCanvas(q,n,m);
+k=j.context;k.clearRect(0,0,n,m);k.drawImage(h,0,0,l,p,0,0,n,m);h=j.canvas;l=n;p=m;q="prescale1"===q?"prescale2":"prescale1"}d.drawImage(h,0,0,l,p,0,-c,b,c);this.imageLayer&&(d=this.getCanvasPosition(0,-c),this.imageLayer.appendImage({imgData:a,left:d[0],top:d[1],width:b/e[0],height:c/e[3]}));this.restore()},paintInlineImageXObjectGroup:function(a,b){var c=this.ctx,d=a.width,e=a.height,f=F.getCanvas("inlineImage",d,e);tb(f.context,a);for(var g=0,h=b.length;g<h;g++){var j=b[g];c.save();c.transform.apply(c,
+j.transform);c.scale(1,-1);c.drawImage(f.canvas,j.x,j.y,j.w,j.h,0,-1,1,1);this.imageLayer&&(j=this.getCanvasPosition(j.x,j.y),this.imageLayer.appendImage({imgData:a,left:j[0],top:j[1],width:d,height:e}));c.restore()}},paintSolidColorImageMask:function(){this.ctx.fillRect(0,0,1,1)},markPoint:function(){},markPointProps:function(){},beginMarkedContent:function(){},beginMarkedContentProps:function(){},endMarkedContent:function(){},beginCompat:function(){},endCompat:function(){},consumePath:function(){if(this.pendingClip){if(this.pendingClip==
+vb)if("mozFillRule"in this.ctx)this.ctx.mozFillRule="evenodd",this.ctx.clip(),this.ctx.mozFillRule="nonzero";else try{this.ctx.clip("evenodd")}catch(a){this.ctx.clip()}else this.ctx.clip();this.pendingClip=null}this.ctx.beginPath()},getSinglePixelWidth:function(){var a=this.ctx.mozCurrentTransformInverse;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1],a[2]*a[2]+a[3]*a[3]))},getCanvasPosition:function(a,b){var c=this.ctx.mozCurrentTransform;return[c[0]*a+c[2]*b+c[4],c[1]*a+c[3]*b+c[5]]}};for(var xb in J)aa.prototype[J[xb]]=
+aa.prototype[xb];qa=aa;var R,ba=function(a,b,c){c=a.createShader(c);a.shaderSource(c,b);a.compileShader(c);if(!a.getShaderParameter(c,a.COMPILE_STATUS))throw a=a.getShaderInfoLog(c),Error("Error during shader compilation: "+a);return c},yb=function(a,b){for(var c=a.createProgram(),d=0,e=b.length;d<e;++d)a.attachShader(c,b[d]);a.linkProgram(c);if(!a.getProgramParameter(c,a.LINK_STATUS))throw c=a.getProgramInfoLog(c),Error("Error during program linking: "+c);return c},zb=function(a,b,c){a.activeTexture(c);
+c=a.createTexture();a.bindTexture(a.TEXTURE_2D,c);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST);a.texImage2D(a.TEXTURE_2D,0,a.RGBA,a.RGBA,a.UNSIGNED_BYTE,b);return c},ta=function(){Q||(S=document.createElement("canvas"),Q=S.getContext("webgl",{premultipliedalpha:!1}))},Q,S,ca=null,da=null;R={get isEnabled(){if(PDFJS.disableWebGL)return!1;
+var a=!1;try{ta(),a=!!Q}catch(b){}return K(this,"isEnabled",a)},composeSMask:function(a,b,c){var d=a.width,e=a.height;if(!ca){var f,g;ta();f=S;S=null;g=Q;Q=null;var h=ba(g,"  attribute vec2 a_position;                                      attribute vec2 a_texCoord;                                                                                                      uniform vec2 u_resolution;                                                                                                      varying vec2 v_texCoord;                                                                                                        void main() {                                                     vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;       gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);                                                                              v_texCoord = a_texCoord;                                      }                                                             ",
+g.VERTEX_SHADER),j=ba(g,"  precision mediump float;                                                                                                        uniform vec4 u_backdrop;                                        uniform int u_subtype;                                          uniform sampler2D u_image;                                      uniform sampler2D u_mask;                                                                                                       varying vec2 v_texCoord;                                                                                                        void main() {                                                     vec4 imageColor = texture2D(u_image, v_texCoord);               vec4 maskColor = texture2D(u_mask, v_texCoord);                 if (u_backdrop.a > 0.0) {                                         maskColor.rgb = maskColor.rgb * maskColor.a +                                   u_backdrop.rgb * (1.0 - maskColor.a);         }                                                               float lum;                                                      if (u_subtype == 0) {                                             lum = maskColor.a;                                            } else {                                                          lum = maskColor.r * 0.3 + maskColor.g * 0.59 +                        maskColor.b * 0.11;                                     }                                                               imageColor.a *= lum;                                            imageColor.rgb *= imageColor.a;                                 gl_FragColor = imageColor;                                    }                                                             ",
+g.FRAGMENT_SHADER),k=yb(g,[h,j]);g.useProgram(k);h={};h.gl=g;h.canvas=f;h.resolutionLocation=g.getUniformLocation(k,"u_resolution");h.positionLocation=g.getAttribLocation(k,"a_position");h.backdropLocation=g.getUniformLocation(k,"u_backdrop");h.subtypeLocation=g.getUniformLocation(k,"u_subtype");f=g.getAttribLocation(k,"a_texCoord");var j=g.getUniformLocation(k,"u_image"),k=g.getUniformLocation(k,"u_mask"),l=g.createBuffer();g.bindBuffer(g.ARRAY_BUFFER,l);g.bufferData(g.ARRAY_BUFFER,new Float32Array([0,
+0,1,0,0,1,0,1,1,0,1,1]),g.STATIC_DRAW);g.enableVertexAttribArray(f);g.vertexAttribPointer(f,2,g.FLOAT,!1,0,0);g.uniform1i(j,0);g.uniform1i(k,1);ca=h}g=ca;h=g.canvas;f=g.gl;h.width=d;h.height=e;f.viewport(0,0,f.drawingBufferWidth,f.drawingBufferHeight);f.uniform2f(g.resolutionLocation,d,e);c.backdrop?f.uniform4f(g.resolutionLocation,c.backdrop[0],c.backdrop[1],c.backdrop[2],1):f.uniform4f(g.resolutionLocation,0,0,0,0);f.uniform1i(g.subtypeLocation,"Luminosity"===c.subtype?1:0);a=zb(f,a,f.TEXTURE0);
+b=zb(f,b,f.TEXTURE1);c=f.createBuffer();f.bindBuffer(f.ARRAY_BUFFER,c);f.bufferData(f.ARRAY_BUFFER,new Float32Array([0,0,d,0,0,e,0,e,d,0,d,e]),f.STATIC_DRAW);f.enableVertexAttribArray(g.positionLocation);f.vertexAttribPointer(g.positionLocation,2,f.FLOAT,!1,0,0);f.clearColor(0,0,0,0);f.enable(f.BLEND);f.blendFunc(f.ONE,f.ONE_MINUS_SRC_ALPHA);f.clear(f.COLOR_BUFFER_BIT);f.drawArrays(f.TRIANGLES,0,6);f.flush();f.deleteTexture(a);f.deleteTexture(b);f.deleteBuffer(c);return h},drawFigures:function(a,
+b,c,d,e){if(!da){var f,g;ta();f=S;S=null;g=Q;Q=null;var h=ba(g,"  attribute vec2 a_position;                                      attribute vec3 a_color;                                                                                                         uniform vec2 u_resolution;                                      uniform vec2 u_scale;                                           uniform vec2 u_offset;                                                                                                          varying vec4 v_color;                                                                                                           void main() {                                                     vec2 position = (a_position + u_offset) * u_scale;              vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;         gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);                                                                              v_color = vec4(a_color / 255.0, 1.0);                         }                                                             ",
+g.VERTEX_SHADER),j=ba(g,"  precision mediump float;                                                                                                        varying vec4 v_color;                                                                                                           void main() {                                                     gl_FragColor = v_color;                                       }                                                             ",g.FRAGMENT_SHADER),h=yb(g,
+[h,j]);g.useProgram(h);j={};j.gl=g;j.canvas=f;j.resolutionLocation=g.getUniformLocation(h,"u_resolution");j.scaleLocation=g.getUniformLocation(h,"u_scale");j.offsetLocation=g.getUniformLocation(h,"u_offset");j.positionLocation=g.getAttribLocation(h,"a_position");j.colorLocation=g.getAttribLocation(h,"a_color");da=j}f=da;g=f.canvas;h=f.gl;g.width=a;g.height=b;h.viewport(0,0,h.drawingBufferWidth,h.drawingBufferHeight);h.uniform2f(f.resolutionLocation,a,b);a=0;var k,l,p;k=0;for(l=d.length;k<l;k++)switch(d[k].type){case "lattice":p=
+d[k].coords.length/d[k].verticesPerRow|0;a+=6*(p-1)*(d[k].verticesPerRow-1);break;case "triangles":a+=d[k].coords.length}j=new Float32Array(2*a);b=new Uint8Array(3*a);var q=e.coords,n=e.colors,m=0,r=0;k=0;for(l=d.length;k<l;k++){p=d[k];var x=p.coords,w=p.colors;switch(p.type){case "lattice":var t=p.verticesPerRow;p=x.length/t|0;for(var v=1;v<p;v++)for(var s=v*t+1,u=1;u<t;u++,s++)j[m]=q[x[s-t-1]],j[m+1]=q[x[s-t-1]+1],j[m+2]=q[x[s-t]],j[m+3]=q[x[s-t]+1],j[m+4]=q[x[s-1]],j[m+5]=q[x[s-1]+1],b[r]=n[w[s-
+t-1]],b[r+1]=n[w[s-t-1]+1],b[r+2]=n[w[s-t-1]+2],b[r+3]=n[w[s-t]],b[r+4]=n[w[s-t]+1],b[r+5]=n[w[s-t]+2],b[r+6]=n[w[s-1]],b[r+7]=n[w[s-1]+1],b[r+8]=n[w[s-1]+2],j[m+6]=j[m+2],j[m+7]=j[m+3],j[m+8]=j[m+4],j[m+9]=j[m+5],j[m+10]=q[x[s]],j[m+11]=q[x[s]+1],b[r+9]=b[r+3],b[r+10]=b[r+4],b[r+11]=b[r+5],b[r+12]=b[r+6],b[r+13]=b[r+7],b[r+14]=b[r+8],b[r+15]=n[w[s]],b[r+16]=n[w[s]+1],b[r+17]=n[w[s]+2],m+=12,r+=18;break;case "triangles":p=0;for(t=x.length;p<t;p++)j[m]=q[x[p]],j[m+1]=q[x[p]+1],b[r]=n[w[k]],b[r+1]=
+n[w[p]+1],b[r+2]=n[w[p]+2],m+=2,r+=3}}c?h.clearColor(c[0]/255,c[1]/255,c[2]/255,1):h.clearColor(0,0,0,0);h.clear(h.COLOR_BUFFER_BIT);c=h.createBuffer();h.bindBuffer(h.ARRAY_BUFFER,c);h.bufferData(h.ARRAY_BUFFER,j,h.STATIC_DRAW);h.enableVertexAttribArray(f.positionLocation);h.vertexAttribPointer(f.positionLocation,2,h.FLOAT,!1,0,0);d=h.createBuffer();h.bindBuffer(h.ARRAY_BUFFER,d);h.bufferData(h.ARRAY_BUFFER,b,h.STATIC_DRAW);h.enableVertexAttribArray(f.colorLocation);h.vertexAttribPointer(f.colorLocation,
+3,h.UNSIGNED_BYTE,!1,0,0);h.uniform2f(f.scaleLocation,e.scaleX,e.scaleY);h.uniform2f(f.offsetLocation,e.offsetX,e.offsetY);h.drawArrays(h.TRIANGLES,0,a);h.flush();h.deleteBuffer(c);h.deleteBuffer(d);return g},clear:function(){da=ca=null}};var ga={RadialAxial:{fromIR:function(a){var b=a[1],c=a[2],d=a[3],e=a[4],f=a[5],g=a[6];return{type:"Pattern",getPattern:function(a){var j;"axial"===b?j=a.createLinearGradient(d[0],d[1],e[0],e[1]):"radial"===b&&(j=a.createRadialGradient(d[0],d[1],f,e[0],e[1],g));a=
+0;for(var k=c.length;a<k;++a){var l=c[a];j.addColorStop(l[0],l[1])}return j}}}}},Ab,ua=function(a,b,c,d,e,f,g,h){var j=b.coords,k=b.colors,l=a.data;a=4*a.width;var p;j[c+1]>j[d+1]&&(p=c,c=d,d=p,p=f,f=g,g=p);j[d+1]>j[e+1]&&(p=d,d=e,e=p,p=g,g=h,h=p);j[c+1]>j[d+1]&&(p=c,c=d,d=p,p=f,f=g,g=p);p=(j[c]+b.offsetX)*b.scaleX;c=(j[c+1]+b.offsetY)*b.scaleY;var q=(j[d]+b.offsetX)*b.scaleX;d=(j[d+1]+b.offsetY)*b.scaleY;var n=(j[e]+b.offsetX)*b.scaleX;b=(j[e+1]+b.offsetY)*b.scaleY;if(!(c>=b)){e=k[f];j=k[f+1];f=
+k[f+2];var m=k[g],r=k[g+1];g=k[g+2];var t=k[h],s=k[h+1];h=k[h+2];for(var v=Math.round(c),k=Math.round(b),u,y,z,C,E,F,G,A,B=v;B<=k;B++){B<d?(A=B<c?0:c===d?1:(c-B)/(c-d),v=p-(p-q)*A,u=e-(e-m)*A,y=j-(j-r)*A,z=f-(f-g)*A):(A=B>b?1:d===b?0:(d-B)/(d-b),v=q-(q-n)*A,u=m-(m-t)*A,y=r-(r-s)*A,z=g-(g-h)*A);A=B<c?0:B>b?1:(c-B)/(c-b);C=p-(p-n)*A;E=e-(e-t)*A;F=j-(j-s)*A;G=f-(f-h)*A;A=Math.round(Math.min(v,C));for(var J=Math.round(Math.max(v,C)),H=a*B+4*A,I=A;I<=J;I++)A=(v-I)/(v-C),A=0>A?0:1<A?1:A,l[H++]=u-(u-E)*
+A|0,l[H++]=y-(y-F)*A|0,l[H++]=z-(z-G)*A|0,l[H++]=255}}};Ab=function(a,b,c,d,e,f){var g=Math.floor(a[0]),h=Math.floor(a[1]),j=Math.ceil(a[2])-g;a=Math.ceil(a[3])-h;var k=Math.min(Math.ceil(Math.abs(1.1*j*b[0])),3E3),l=Math.min(Math.ceil(Math.abs(1.1*a*b[1])),3E3),j=j/k;a/=l;d={coords:c,colors:d,offsetX:-g,offsetY:-h,scaleX:1/j,scaleY:1/a};var p;if(R.isEnabled)e=R.drawFigures(k,l,f,e,d),c=F.getCanvas("mesh",k,l,!1),c.context.drawImage(e,0,0);else{c=F.getCanvas("mesh",k,l,!1);b=c.context;l=b.createImageData(k,
+l);if(f){var q=l.data,k=0;for(p=q.length;k<p;k+=4)q[k]=f[0],q[k+1]=f[1],q[k+2]=f[2],q[k+3]=255}for(k=0;k<e.length;k++){f=l;var n=e[k];p=d;var q=n.coords,m=n.colors,r=void 0,t=void 0;switch(n.type){case "lattice":for(var n=n.verticesPerRow,t=Math.floor(q.length/n)-1,s=n-1,r=0;r<t;r++)for(var u=r*n,y=0;y<s;y++,u++)ua(f,p,q[u],q[u+1],q[u+n],m[u],m[u+1],m[u+n]),ua(f,p,q[u+n+1],q[u+1],q[u+n],m[u+n+1],m[u+1],m[u+n]);break;case "triangles":r=0;for(t=q.length;r<t;r+=3)ua(f,p,q[r],q[r+1],q[r+2],m[r],m[r+1],
+m[r+2]);break;default:v("illigal figure")}}b.putImageData(l,0,0)}e=c.canvas;return{canvas:e,offsetX:g,offsetY:h,scaleX:j,scaleY:a}};ga.Mesh={fromIR:function(a){var b=a[2],c=a[3],d=a[4],e=a[5],f=a[6],g=a[8];return{type:"Pattern",getPattern:function(a,j,k){var l;if(k)l=t.singularValueDecompose2dScale(a.mozCurrentTransform);else{l=t.singularValueDecompose2dScale(f);var p=t.singularValueDecompose2dScale(j.baseTransform);l=[l[0]*p[0],l[1]*p[1]]}l=Ab(e,l,b,c,d,k?null:g);k||(a.setTransform.apply(a,j.baseTransform),
+f&&a.transform.apply(a,f));a.translate(l.offsetX,l.offsetY);a.scale(l.scaleX,l.scaleY);return a.createPattern(l.canvas,"no-repeat")}}}};ga.Dummy={fromIR:function(){return{type:"Pattern",getPattern:function(){return"hotpink"}}}};var wb,Bb=function(a,b,c,d,e,f){this.name=a[1][0].name;this.operatorList=a[2];this.matrix=a[3]||[1,0,0,1,0,0];this.bbox=a[4];this.xstep=a[5];this.ystep=a[6];this.paintType=a[7];this.tilingType=a[8];this.color=b;this.objs=d;this.commonObjs=e;this.baseTransform=f;this.type="Pattern";
+this.ctx=c};Bb.prototype={createPatternCanvas:function(a){var b=this.operatorList,c=this.bbox,d=this.xstep,e=this.ystep,f=this.paintType,g=this.color,h=this.objs,j=this.commonObjs;G("TilingType: "+this.tilingType);var k=c[0],l=c[1],p=c[2],q=c[3],n=[k,l],m=[k+d,l+e],r=m[0]-n[0],m=m[1]-n[1],s=t.singularValueDecompose2dScale(this.matrix),u=t.singularValueDecompose2dScale(this.baseTransform),s=[s[0]*u[0],s[1]*u[1]],r=Math.min(Math.ceil(Math.abs(r*s[0])),3E3),m=Math.min(Math.ceil(Math.abs(m*s[1])),3E3),
+s=F.getCanvas("pattern",r,m,!0),u=s.context,h=new qa(u,j,h);h.groupLevel=a.groupLevel;this.setFillAndStrokeStyleToContext(u,f,g);this.setScale(r,m,d,e);this.transformToScale(h);h.transform.apply(h,[1,0,0,1,-n[0],-n[1]]);this.clipBbox(h,c,k,l,p,q);h.executeOperatorList(b);return s.canvas},setScale:function(a,b,c,d){this.scale=[a/c,b/d]},transformToScale:function(a){var b=this.scale;a.transform.apply(a,[b[0],0,0,b[1],0,0])},scaleToContext:function(){var a=this.scale;this.ctx.scale(1/a[0],1/a[1])},clipBbox:function(a,
+b,c,d,e,f){b&&(B(b)&&4==b.length)&&(a.rectangle(c,d,e-c,f-d),a.clip(),a.endPath())},setFillAndStrokeStyleToContext:function(a,b,c){switch(b){case 1:b=this.ctx;a.fillStyle=b.fillStyle;a.strokeStyle=b.strokeStyle;break;case 2:b=s.singletons.rgb.getRgb(c,0);b=t.makeCssRgb(b);a.fillStyle=b;a.strokeStyle=b;break;default:v("Unsupported paint type: "+b)}},getPattern:function(a,b){var c=this.createPatternCanvas(b);a=this.ctx;a.setTransform.apply(a,this.baseTransform);a.transform.apply(a,this.matrix);this.scaleToContext();
+return a.createPattern(c,"repeat")}};wb=Bb;PDFJS.disableFontFace=!1;var va;if(V)va=!1;else{var Cb=/Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(window.navigator.userAgent);va=Cb&&14<=Cb[1]?!0:!1}var M={insertRule:function(a){var b=document.getElementById("PDFJS_FONT_STYLE_TAG");b||(b=document.createElement("style"),b.id="PDFJS_FONT_STYLE_TAG",document.documentElement.getElementsByTagName("head")[0].appendChild(b));b=b.sheet;b.insertRule(a,b.cssRules.length)},clear:function(){var a=document.getElementById("PDFJS_FONT_STYLE_TAG");
+a&&a.parentNode.removeChild(a)},get loadTestFont(){return K(this,"loadTestFont",atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="))},
+loadTestFontId:0,loadingContext:{requests:[],nextRequestId:0},isSyncFontLoadingSupported:va,bind:function(a,b){!V||v("bind() shall be called from main thread");for(var c=[],d=[],e=0,f=a.length;e<f;e++){var g=a[e];if(!(g.attached||!1===g.loading)){g.attached=!0;var h=g.bindDOM();h&&(c.push(h),d.push(g))}}e=M.queueLoadingCallback(b);0<c.length&&!this.isSyncFontLoadingSupported?M.prepareFontLoadEvent(c,d,e):e.complete()},queueLoadingCallback:function(a){var b=M.loadingContext,c={id:"pdfjs-font-loading-"+
+b.nextRequestId++,complete:function(){!c.end||v("completeRequest() cannot be called twice");for(c.end=Date.now();0<b.requests.length&&b.requests[0].end;){var a=b.requests.shift();setTimeout(a.callback,0)}},callback:a,started:Date.now()};b.requests.push(c);return c},prepareFontLoadEvent:function(a,b,c){function d(a,b){return a.charCodeAt(b)<<24|a.charCodeAt(b+1)<<16|a.charCodeAt(b+2)<<8|a.charCodeAt(b+3)&255}function e(a,b,c,d){var e=a.substr(0,b);a=a.substr(b+c);return e+d+a}function f(a,b){k++;30<
+k?(z("Load test font never loaded."),b()):(j.font="30px "+a,j.fillText(".",0,20),0<j.getImageData(0,0,1,1).data[3]?b():setTimeout(f.bind(null,a,b)))}var g,h;a=document.createElement("canvas");a.width=1;a.height=1;var j=a.getContext("2d"),k=0;a="lt"+Date.now()+this.loadTestFontId++;var l=this.loadTestFont,l=e(l,976,a.length,a),p=d(l,16);g=0;for(h=a.length-3;g<h;g+=4)p=p-1482184792+d(a,g)|0;g<a.length&&(p=p-1482184792+d(a+"XXX",g)|0);l=e(l,16,4,String.fromCharCode(p>>24&255,p>>16&255,p>>8&255,p&255));
+g="url(data:font/opentype;base64,"+btoa(l)+");";M.insertRule('@font-face { font-family:"'+a+'";src:'+g+"}");l=[];g=0;for(h=b.length;g<h;g++)l.push(b[g].loadedName);l.push(a);var q=document.createElement("div");q.setAttribute("style","visibility: hidden;width: 10px; height: 10px;position: absolute; top: 0px; left: 0px;");g=0;for(h=l.length;g<h;++g)b=document.createElement("span"),b.textContent="Hi",b.style.fontFamily=l[g],q.appendChild(b);document.body.appendChild(q);f(a,function(){document.body.removeChild(q);
+c.complete()})}},ob,Db=function(a,b,c){this.compiledGlyphs={};if(1===arguments.length){var d=arguments[0],e;for(e in d)this[e]=d[e]}};Db.prototype={bindDOM:function(){if(!this.data)return null;if(PDFJS.disableFontFace)return this.disableFontFace=!0,null;var a;var b=new Uint8Array(this.data);a=b.length;if(8192>a)a=String.fromCharCode.apply(null,b);else{for(var c=[],d=0;d<a;d+=8192){var e=Math.min(d+8192,a),e=b.subarray(d,e);c.push(String.fromCharCode.apply(null,e))}a=c.join("")}b=this.loadedName;a=
+"url(data:"+this.mimetype+";base64,"+window.btoa(a)+");";b='@font-face { font-family:"'+b+'";src:'+a+"}";M.insertRule(b);PDFJS.pdfBug&&("FontInspector"in y&&y.FontInspector.enabled)&&y.FontInspector.fontAdded(this,a);return b},getPathGenerator:function(a,b){if(!(b in this.compiledGlyphs)){var c=a.get(this.loadedName+"_path_"+b);this.compiledGlyphs[b]=new Function("c","size",c)}return this.compiledGlyphs[b]}};ob=Db}).call("undefined"===typeof window?this:window);
+!PDFJS.workerSrc&&"undefined"!==typeof document&&(PDFJS.workerSrc=function(){var G=(document.body||document.getElementsByTagName("head")[0]).lastChild.src;return G&&G.replace(/\.js$/i,".worker.js")}());
diff --git a/public/opac/js/universalviewer-2.0.2/lib/pdf.worker.js b/public/opac/js/universalviewer-2.0.2/lib/pdf.worker.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b8851c9f99bce139af4cde67128315e9a1da426
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/pdf.worker.js
@@ -0,0 +1,42400 @@
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*jshint globalstrict: false */
+
+// Initializing PDFJS global object (if still undefined)
+if (typeof PDFJS === 'undefined') {
+  (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+PDFJS.version = '1.0.83';
+PDFJS.build = '0045325';
+
+(function pdfjsWrapper() {
+  // Use strict in our context only - users might not want it
+  'use strict';
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,
+           Promise */
+
+'use strict';
+
+var globalScope = (typeof window === 'undefined') ? this : window;
+
+var isWorker = (typeof window == 'undefined');
+
+var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+
+var TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7,
+  FILL_STROKE_MASK: 3,
+  ADD_TO_PATH_FLAG: 4
+};
+
+var ImageKind = {
+  GRAYSCALE_1BPP: 1,
+  RGB_24BPP: 2,
+  RGBA_32BPP: 3
+};
+
+// The global PDFJS object exposes the API
+// In production, it will be declared outside a global wrapper
+// In development, it will be declared here
+if (!globalScope.PDFJS) {
+  globalScope.PDFJS = {};
+}
+
+globalScope.PDFJS.pdfBug = false;
+
+PDFJS.VERBOSITY_LEVELS = {
+  errors: 0,
+  warnings: 1,
+  infos: 5
+};
+
+// All the possible operations for an operator list.
+var OPS = PDFJS.OPS = {
+  // Intentionally start from 1 so it is easy to spot bad operators that will be
+  // 0's.
+  dependency: 1,
+  setLineWidth: 2,
+  setLineCap: 3,
+  setLineJoin: 4,
+  setMiterLimit: 5,
+  setDash: 6,
+  setRenderingIntent: 7,
+  setFlatness: 8,
+  setGState: 9,
+  save: 10,
+  restore: 11,
+  transform: 12,
+  moveTo: 13,
+  lineTo: 14,
+  curveTo: 15,
+  curveTo2: 16,
+  curveTo3: 17,
+  closePath: 18,
+  rectangle: 19,
+  stroke: 20,
+  closeStroke: 21,
+  fill: 22,
+  eoFill: 23,
+  fillStroke: 24,
+  eoFillStroke: 25,
+  closeFillStroke: 26,
+  closeEOFillStroke: 27,
+  endPath: 28,
+  clip: 29,
+  eoClip: 30,
+  beginText: 31,
+  endText: 32,
+  setCharSpacing: 33,
+  setWordSpacing: 34,
+  setHScale: 35,
+  setLeading: 36,
+  setFont: 37,
+  setTextRenderingMode: 38,
+  setTextRise: 39,
+  moveText: 40,
+  setLeadingMoveText: 41,
+  setTextMatrix: 42,
+  nextLine: 43,
+  showText: 44,
+  showSpacedText: 45,
+  nextLineShowText: 46,
+  nextLineSetSpacingShowText: 47,
+  setCharWidth: 48,
+  setCharWidthAndBounds: 49,
+  setStrokeColorSpace: 50,
+  setFillColorSpace: 51,
+  setStrokeColor: 52,
+  setStrokeColorN: 53,
+  setFillColor: 54,
+  setFillColorN: 55,
+  setStrokeGray: 56,
+  setFillGray: 57,
+  setStrokeRGBColor: 58,
+  setFillRGBColor: 59,
+  setStrokeCMYKColor: 60,
+  setFillCMYKColor: 61,
+  shadingFill: 62,
+  beginInlineImage: 63,
+  beginImageData: 64,
+  endInlineImage: 65,
+  paintXObject: 66,
+  markPoint: 67,
+  markPointProps: 68,
+  beginMarkedContent: 69,
+  beginMarkedContentProps: 70,
+  endMarkedContent: 71,
+  beginCompat: 72,
+  endCompat: 73,
+  paintFormXObjectBegin: 74,
+  paintFormXObjectEnd: 75,
+  beginGroup: 76,
+  endGroup: 77,
+  beginAnnotations: 78,
+  endAnnotations: 79,
+  beginAnnotation: 80,
+  endAnnotation: 81,
+  paintJpegXObject: 82,
+  paintImageMaskXObject: 83,
+  paintImageMaskXObjectGroup: 84,
+  paintImageXObject: 85,
+  paintInlineImageXObject: 86,
+  paintInlineImageXObjectGroup: 87,
+  paintImageXObjectRepeat: 88,
+  paintImageMaskXObjectRepeat: 89,
+  paintSolidColorImageMask: 90
+};
+
+// A notice for devs. These are good for things that are helpful to devs, such
+// as warning that Workers were disabled, which is important to devs but not
+// end users.
+function info(msg) {
+  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {
+    console.log('Info: ' + msg);
+  }
+}
+
+// Non-fatal warnings.
+function warn(msg) {
+  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {
+    console.log('Warning: ' + msg);
+  }
+}
+
+// Fatal errors that should trigger the fallback UI and halt execution by
+// throwing an exception.
+function error(msg) {
+  // If multiple arguments were passed, pass them all to the log function.
+  if (arguments.length > 1) {
+    var logArguments = ['Error:'];
+    logArguments.push.apply(logArguments, arguments);
+    console.log.apply(console, logArguments);
+    // Join the arguments into a single string for the lines below.
+    msg = [].join.call(arguments, ' ');
+  } else {
+    console.log('Error: ' + msg);
+  }
+  console.log(backtrace());
+  UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);
+  throw new Error(msg);
+}
+
+function backtrace() {
+  try {
+    throw new Error();
+  } catch (e) {
+    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
+  }
+}
+
+function assert(cond, msg) {
+  if (!cond) {
+    error(msg);
+  }
+}
+
+var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
+  unknown: 'unknown',
+  forms: 'forms',
+  javaScript: 'javaScript',
+  smask: 'smask',
+  shadingPattern: 'shadingPattern',
+  font: 'font'
+};
+
+var UnsupportedManager = PDFJS.UnsupportedManager =
+  (function UnsupportedManagerClosure() {
+  var listeners = [];
+  return {
+    listen: function (cb) {
+      listeners.push(cb);
+    },
+    notify: function (featureId) {
+      warn('Unsupported feature "' + featureId + '"');
+      for (var i = 0, ii = listeners.length; i < ii; i++) {
+        listeners[i](featureId);
+      }
+    }
+  };
+})();
+
+// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
+// absolute URL, it will be returned as is.
+function combineUrl(baseUrl, url) {
+  if (!url) {
+    return baseUrl;
+  }
+  if (/^[a-z][a-z0-9+\-.]*:/i.test(url)) {
+    return url;
+  }
+  var i;
+  if (url.charAt(0) == '/') {
+    // absolute path
+    i = baseUrl.indexOf('://');
+    if (url.charAt(1) === '/') {
+      ++i;
+    } else {
+      i = baseUrl.indexOf('/', i + 3);
+    }
+    return baseUrl.substring(0, i) + url;
+  } else {
+    // relative path
+    var pathLength = baseUrl.length;
+    i = baseUrl.lastIndexOf('#');
+    pathLength = i >= 0 ? i : pathLength;
+    i = baseUrl.lastIndexOf('?', pathLength);
+    pathLength = i >= 0 ? i : pathLength;
+    var prefixLength = baseUrl.lastIndexOf('/', pathLength);
+    return baseUrl.substring(0, prefixLength + 1) + url;
+  }
+}
+
+// Validates if URL is safe and allowed, e.g. to avoid XSS.
+function isValidUrl(url, allowRelative) {
+  if (!url) {
+    return false;
+  }
+  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
+  // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+  var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
+  if (!protocol) {
+    return allowRelative;
+  }
+  protocol = protocol[0].toLowerCase();
+  switch (protocol) {
+    case 'http':
+    case 'https':
+    case 'ftp':
+    case 'mailto':
+      return true;
+    default:
+      return false;
+  }
+}
+PDFJS.isValidUrl = isValidUrl;
+
+function shadow(obj, prop, value) {
+  Object.defineProperty(obj, prop, { value: value,
+                                     enumerable: true,
+                                     configurable: true,
+                                     writable: false });
+  return value;
+}
+
+var PasswordResponses = PDFJS.PasswordResponses = {
+  NEED_PASSWORD: 1,
+  INCORRECT_PASSWORD: 2
+};
+
+var PasswordException = (function PasswordExceptionClosure() {
+  function PasswordException(msg, code) {
+    this.name = 'PasswordException';
+    this.message = msg;
+    this.code = code;
+  }
+
+  PasswordException.prototype = new Error();
+  PasswordException.constructor = PasswordException;
+
+  return PasswordException;
+})();
+
+var UnknownErrorException = (function UnknownErrorExceptionClosure() {
+  function UnknownErrorException(msg, details) {
+    this.name = 'UnknownErrorException';
+    this.message = msg;
+    this.details = details;
+  }
+
+  UnknownErrorException.prototype = new Error();
+  UnknownErrorException.constructor = UnknownErrorException;
+
+  return UnknownErrorException;
+})();
+
+var InvalidPDFException = (function InvalidPDFExceptionClosure() {
+  function InvalidPDFException(msg) {
+    this.name = 'InvalidPDFException';
+    this.message = msg;
+  }
+
+  InvalidPDFException.prototype = new Error();
+  InvalidPDFException.constructor = InvalidPDFException;
+
+  return InvalidPDFException;
+})();
+
+var MissingPDFException = (function MissingPDFExceptionClosure() {
+  function MissingPDFException(msg) {
+    this.name = 'MissingPDFException';
+    this.message = msg;
+  }
+
+  MissingPDFException.prototype = new Error();
+  MissingPDFException.constructor = MissingPDFException;
+
+  return MissingPDFException;
+})();
+
+var NotImplementedException = (function NotImplementedExceptionClosure() {
+  function NotImplementedException(msg) {
+    this.message = msg;
+  }
+
+  NotImplementedException.prototype = new Error();
+  NotImplementedException.prototype.name = 'NotImplementedException';
+  NotImplementedException.constructor = NotImplementedException;
+
+  return NotImplementedException;
+})();
+
+var MissingDataException = (function MissingDataExceptionClosure() {
+  function MissingDataException(begin, end) {
+    this.begin = begin;
+    this.end = end;
+    this.message = 'Missing data [' + begin + ', ' + end + ')';
+  }
+
+  MissingDataException.prototype = new Error();
+  MissingDataException.prototype.name = 'MissingDataException';
+  MissingDataException.constructor = MissingDataException;
+
+  return MissingDataException;
+})();
+
+var XRefParseException = (function XRefParseExceptionClosure() {
+  function XRefParseException(msg) {
+    this.message = msg;
+  }
+
+  XRefParseException.prototype = new Error();
+  XRefParseException.prototype.name = 'XRefParseException';
+  XRefParseException.constructor = XRefParseException;
+
+  return XRefParseException;
+})();
+
+
+function bytesToString(bytes) {
+  var length = bytes.length;
+  var MAX_ARGUMENT_COUNT = 8192;
+  if (length < MAX_ARGUMENT_COUNT) {
+    return String.fromCharCode.apply(null, bytes);
+  }
+  var strBuf = [];
+  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+    var chunk = bytes.subarray(i, chunkEnd);
+    strBuf.push(String.fromCharCode.apply(null, chunk));
+  }
+  return strBuf.join('');
+}
+
+function stringToArray(str) {
+  var length = str.length;
+  var array = [];
+  for (var i = 0; i < length; ++i) {
+    array[i] = str.charCodeAt(i);
+  }
+  return array;
+}
+
+function stringToBytes(str) {
+  var length = str.length;
+  var bytes = new Uint8Array(length);
+  for (var i = 0; i < length; ++i) {
+    bytes[i] = str.charCodeAt(i) & 0xFF;
+  }
+  return bytes;
+}
+
+function string32(value) {
+  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
+                             (value >> 8) & 0xff, value & 0xff);
+}
+
+function log2(x) {
+  var n = 1, i = 0;
+  while (x > n) {
+    n <<= 1;
+    i++;
+  }
+  return i;
+}
+
+function readInt8(data, start) {
+  return (data[start] << 24) >> 24;
+}
+
+function readUint16(data, offset) {
+  return (data[offset] << 8) | data[offset + 1];
+}
+
+function readUint32(data, offset) {
+  return ((data[offset] << 24) | (data[offset + 1] << 16) |
+         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;
+}
+
+// Lazy test the endianness of the platform
+// NOTE: This will be 'true' for simulated TypedArrays
+function isLittleEndian() {
+  var buffer8 = new Uint8Array(2);
+  buffer8[0] = 1;
+  var buffer16 = new Uint16Array(buffer8.buffer);
+  return (buffer16[0] === 1);
+}
+
+Object.defineProperty(PDFJS, 'isLittleEndian', {
+  configurable: true,
+  get: function PDFJS_isLittleEndian() {
+    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());
+  }
+});
+
+  // Lazy test if the userAgant support CanvasTypedArrays
+function hasCanvasTypedArrays() {
+  var canvas = document.createElement('canvas');
+  canvas.width = canvas.height = 1;
+  var ctx = canvas.getContext('2d');
+  var imageData = ctx.createImageData(1, 1);
+  return (typeof imageData.data.buffer !== 'undefined');
+}
+
+Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {
+  configurable: true,
+  get: function PDFJS_hasCanvasTypedArrays() {
+    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());
+  }
+});
+
+var Uint32ArrayView = (function Uint32ArrayViewClosure() {
+
+  function Uint32ArrayView(buffer, length) {
+    this.buffer = buffer;
+    this.byteLength = buffer.length;
+    this.length = length === undefined ? (this.byteLength >> 2) : length;
+    ensureUint32ArrayViewProps(this.length);
+  }
+  Uint32ArrayView.prototype = Object.create(null);
+
+  var uint32ArrayViewSetters = 0;
+  function createUint32ArrayProp(index) {
+    return {
+      get: function () {
+        var buffer = this.buffer, offset = index << 2;
+        return (buffer[offset] | (buffer[offset + 1] << 8) |
+          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;
+      },
+      set: function (value) {
+        var buffer = this.buffer, offset = index << 2;
+        buffer[offset] = value & 255;
+        buffer[offset + 1] = (value >> 8) & 255;
+        buffer[offset + 2] = (value >> 16) & 255;
+        buffer[offset + 3] = (value >>> 24) & 255;
+      }
+    };
+  }
+
+  function ensureUint32ArrayViewProps(length) {
+    while (uint32ArrayViewSetters < length) {
+      Object.defineProperty(Uint32ArrayView.prototype,
+        uint32ArrayViewSetters,
+        createUint32ArrayProp(uint32ArrayViewSetters));
+      uint32ArrayViewSetters++;
+    }
+  }
+
+  return Uint32ArrayView;
+})();
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+
+var Util = PDFJS.Util = (function UtilClosure() {
+  function Util() {}
+
+  Util.makeCssRgb = function Util_makeCssRgb(rgb) {
+    return 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';
+  };
+
+  Util.makeCssCmyk = function Util_makeCssCmyk(cmyk) {
+    var rgb = ColorSpace.singletons.cmyk.getRgb(cmyk, 0);
+    return Util.makeCssRgb(rgb);
+  };
+
+  // Concatenates two transformation matrices together and returns the result.
+  Util.transform = function Util_transform(m1, m2) {
+    return [
+      m1[0] * m2[0] + m1[2] * m2[1],
+      m1[1] * m2[0] + m1[3] * m2[1],
+      m1[0] * m2[2] + m1[2] * m2[3],
+      m1[1] * m2[2] + m1[3] * m2[3],
+      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
+      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
+    ];
+  };
+
+  // For 2d affine transforms
+  Util.applyTransform = function Util_applyTransform(p, m) {
+    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+    return [xt, yt];
+  };
+
+  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+    return [xt, yt];
+  };
+
+  // Applies the transform to the rectangle and finds the minimum axially
+  // aligned bounding box.
+  Util.getAxialAlignedBoundingBox =
+    function Util_getAxialAlignedBoundingBox(r, m) {
+
+    var p1 = Util.applyTransform(r, m);
+    var p2 = Util.applyTransform(r.slice(2, 4), m);
+    var p3 = Util.applyTransform([r[0], r[3]], m);
+    var p4 = Util.applyTransform([r[2], r[1]], m);
+    return [
+      Math.min(p1[0], p2[0], p3[0], p4[0]),
+      Math.min(p1[1], p2[1], p3[1], p4[1]),
+      Math.max(p1[0], p2[0], p3[0], p4[0]),
+      Math.max(p1[1], p2[1], p3[1], p4[1])
+    ];
+  };
+
+  Util.inverseTransform = function Util_inverseTransform(m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
+      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+  };
+
+  // Apply a generic 3d matrix M on a 3-vector v:
+  //   | a b c |   | X |
+  //   | d e f | x | Y |
+  //   | g h i |   | Z |
+  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
+  // with v as [X,Y,Z]
+  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
+    return [
+      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
+      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
+      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
+    ];
+  };
+
+  // This calculation uses Singular Value Decomposition.
+  // The SVD can be represented with formula A = USV. We are interested in the
+  // matrix S here because it represents the scale values.
+  Util.singularValueDecompose2dScale =
+    function Util_singularValueDecompose2dScale(m) {
+
+    var transpose = [m[0], m[2], m[1], m[3]];
+
+    // Multiply matrix m with its transpose.
+    var a = m[0] * transpose[0] + m[1] * transpose[2];
+    var b = m[0] * transpose[1] + m[1] * transpose[3];
+    var c = m[2] * transpose[0] + m[3] * transpose[2];
+    var d = m[2] * transpose[1] + m[3] * transpose[3];
+
+    // Solve the second degree polynomial to get roots.
+    var first = (a + d) / 2;
+    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+    var sx = first + second || 1;
+    var sy = first - second || 1;
+
+    // Scale values are the square roots of the eigenvalues.
+    return [Math.sqrt(sx), Math.sqrt(sy)];
+  };
+
+  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
+  // For coordinate systems whose origin lies in the bottom-left, this
+  // means normalization to (BL,TR) ordering. For systems with origin in the
+  // top-left, this means (TL,BR) ordering.
+  Util.normalizeRect = function Util_normalizeRect(rect) {
+    var r = rect.slice(0); // clone rect
+    if (rect[0] > rect[2]) {
+      r[0] = rect[2];
+      r[2] = rect[0];
+    }
+    if (rect[1] > rect[3]) {
+      r[1] = rect[3];
+      r[3] = rect[1];
+    }
+    return r;
+  };
+
+  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
+  // intersection of rect1 and rect2. If no intersection, returns 'false'
+  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
+  Util.intersect = function Util_intersect(rect1, rect2) {
+    function compare(a, b) {
+      return a - b;
+    }
+
+    // Order points along the axes
+    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
+        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
+        result = [];
+
+    rect1 = Util.normalizeRect(rect1);
+    rect2 = Util.normalizeRect(rect2);
+
+    // X: first and second points belong to different rectangles?
+    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
+        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
+      // Intersection must be between second and third points
+      result[0] = orderedX[1];
+      result[2] = orderedX[2];
+    } else {
+      return false;
+    }
+
+    // Y: first and second points belong to different rectangles?
+    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
+        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
+      // Intersection must be between second and third points
+      result[1] = orderedY[1];
+      result[3] = orderedY[2];
+    } else {
+      return false;
+    }
+
+    return result;
+  };
+
+  Util.sign = function Util_sign(num) {
+    return num < 0 ? -1 : 1;
+  };
+
+  // TODO(mack): Rename appendToArray
+  Util.concatenateToArray = function concatenateToArray(arr1, arr2) {
+    Array.prototype.push.apply(arr1, arr2);
+  };
+
+  Util.prependToArray = function concatenateToArray(arr1, arr2) {
+    Array.prototype.unshift.apply(arr1, arr2);
+  };
+
+  Util.extendObj = function extendObj(obj1, obj2) {
+    for (var key in obj2) {
+      obj1[key] = obj2[key];
+    }
+  };
+
+  Util.getInheritableProperty = function Util_getInheritableProperty(dict,
+                                                                     name) {
+    while (dict && !dict.has(name)) {
+      dict = dict.get('Parent');
+    }
+    if (!dict) {
+      return null;
+    }
+    return dict.get(name);
+  };
+
+  Util.inherit = function Util_inherit(sub, base, prototype) {
+    sub.prototype = Object.create(base.prototype);
+    sub.prototype.constructor = sub;
+    for (var prop in prototype) {
+      sub.prototype[prop] = prototype[prop];
+    }
+  };
+
+  Util.loadScript = function Util_loadScript(src, callback) {
+    var script = document.createElement('script');
+    var loaded = false;
+    script.setAttribute('src', src);
+    if (callback) {
+      script.onload = function() {
+        if (!loaded) {
+          callback();
+        }
+        loaded = true;
+      };
+    }
+    document.getElementsByTagName('head')[0].appendChild(script);
+  };
+
+  return Util;
+})();
+
+var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
+  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
+    this.viewBox = viewBox;
+    this.scale = scale;
+    this.rotation = rotation;
+    this.offsetX = offsetX;
+    this.offsetY = offsetY;
+
+    // creating transform to convert pdf coordinate system to the normal
+    // canvas like coordinates taking in account scale and rotation
+    var centerX = (viewBox[2] + viewBox[0]) / 2;
+    var centerY = (viewBox[3] + viewBox[1]) / 2;
+    var rotateA, rotateB, rotateC, rotateD;
+    rotation = rotation % 360;
+    rotation = rotation < 0 ? rotation + 360 : rotation;
+    switch (rotation) {
+      case 180:
+        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
+        break;
+      case 90:
+        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
+        break;
+      case 270:
+        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
+        break;
+      //case 0:
+      default:
+        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
+        break;
+    }
+
+    if (dontFlip) {
+      rotateC = -rotateC; rotateD = -rotateD;
+    }
+
+    var offsetCanvasX, offsetCanvasY;
+    var width, height;
+    if (rotateA === 0) {
+      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
+      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
+      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
+    } else {
+      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
+      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
+      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
+    }
+    // creating transform for the following operations:
+    // translate(-centerX, -centerY), rotate and flip vertically,
+    // scale, and translate(offsetCanvasX, offsetCanvasY)
+    this.transform = [
+      rotateA * scale,
+      rotateB * scale,
+      rotateC * scale,
+      rotateD * scale,
+      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
+      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
+    ];
+
+    this.width = width;
+    this.height = height;
+    this.fontScale = scale;
+  }
+  PageViewport.prototype = {
+    clone: function PageViewPort_clone(args) {
+      args = args || {};
+      var scale = 'scale' in args ? args.scale : this.scale;
+      var rotation = 'rotation' in args ? args.rotation : this.rotation;
+      return new PageViewport(this.viewBox.slice(), scale, rotation,
+                              this.offsetX, this.offsetY, args.dontFlip);
+    },
+    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
+      return Util.applyTransform([x, y], this.transform);
+    },
+    convertToViewportRectangle:
+      function PageViewport_convertToViewportRectangle(rect) {
+      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
+      var br = Util.applyTransform([rect[2], rect[3]], this.transform);
+      return [tl[0], tl[1], br[0], br[1]];
+    },
+    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
+      return Util.applyInverseTransform([x, y], this.transform);
+    }
+  };
+  return PageViewport;
+})();
+
+var PDFStringTranslateTable = [
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
+  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
+  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
+  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
+];
+
+function stringToPDFString(str) {
+  var i, n = str.length, strBuf = [];
+  if (str[0] === '\xFE' && str[1] === '\xFF') {
+    // UTF16BE BOM
+    for (i = 2; i < n; i += 2) {
+      strBuf.push(String.fromCharCode(
+        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));
+    }
+  } else {
+    for (i = 0; i < n; ++i) {
+      var code = PDFStringTranslateTable[str.charCodeAt(i)];
+      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+    }
+  }
+  return strBuf.join('');
+}
+
+function stringToUTF8String(str) {
+  return decodeURIComponent(escape(str));
+}
+
+function isEmptyObj(obj) {
+  for (var key in obj) {
+    return false;
+  }
+  return true;
+}
+
+function isBool(v) {
+  return typeof v == 'boolean';
+}
+
+function isInt(v) {
+  return typeof v == 'number' && ((v | 0) == v);
+}
+
+function isNum(v) {
+  return typeof v == 'number';
+}
+
+function isString(v) {
+  return typeof v == 'string';
+}
+
+function isNull(v) {
+  return v === null;
+}
+
+function isName(v) {
+  return v instanceof Name;
+}
+
+function isCmd(v, cmd) {
+  return v instanceof Cmd && (!cmd || v.cmd == cmd);
+}
+
+function isDict(v, type) {
+  if (!(v instanceof Dict)) {
+    return false;
+  }
+  if (!type) {
+    return true;
+  }
+  var dictType = v.get('Type');
+  return isName(dictType) && dictType.name == type;
+}
+
+function isArray(v) {
+  return v instanceof Array;
+}
+
+function isStream(v) {
+  return typeof v == 'object' && v !== null && v !== undefined &&
+         ('getBytes' in v);
+}
+
+function isArrayBuffer(v) {
+  return typeof v == 'object' && v !== null && v !== undefined &&
+         ('byteLength' in v);
+}
+
+function isRef(v) {
+  return v instanceof Ref;
+}
+
+function isPDFFunction(v) {
+  var fnDict;
+  if (typeof v != 'object') {
+    return false;
+  } else if (isDict(v)) {
+    fnDict = v;
+  } else if (isStream(v)) {
+    fnDict = v.dict;
+  } else {
+    return false;
+  }
+  return fnDict.has('FunctionType');
+}
+
+/**
+ * Legacy support for PDFJS Promise implementation.
+ * TODO remove eventually
+ * @ignore
+ */
+var LegacyPromise = PDFJS.LegacyPromise = (function LegacyPromiseClosure() {
+  return function LegacyPromise() {
+    var resolve, reject;
+    var promise = new Promise(function (resolve_, reject_) {
+      resolve = resolve_;
+      reject = reject_;
+    });
+    promise.resolve = resolve;
+    promise.reject = reject;
+    return promise;
+  };
+})();
+
+/**
+ * Polyfill for Promises:
+ * The following promise implementation tries to generally implment the
+ * Promise/A+ spec. Some notable differences from other promise libaries are:
+ * - There currently isn't a seperate deferred and promise object.
+ * - Unhandled rejections eventually show an error if they aren't handled.
+ *
+ * Based off of the work in:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=810490
+ */
+(function PromiseClosure() {
+  if (globalScope.Promise) {
+    // Promises existing in the DOM/Worker, checking presence of all/resolve
+    if (typeof globalScope.Promise.all !== 'function') {
+      globalScope.Promise.all = function (iterable) {
+        var count = 0, results = [], resolve, reject;
+        var promise = new globalScope.Promise(function (resolve_, reject_) {
+          resolve = resolve_;
+          reject = reject_;
+        });
+        iterable.forEach(function (p, i) {
+          count++;
+          p.then(function (result) {
+            results[i] = result;
+            count--;
+            if (count === 0) {
+              resolve(results);
+            }
+          }, reject);
+        });
+        if (count === 0) {
+          resolve(results);
+        }
+        return promise;
+      };
+    }
+    if (typeof globalScope.Promise.resolve !== 'function') {
+      globalScope.Promise.resolve = function (x) {
+        return new globalScope.Promise(function (resolve) { resolve(x); });
+      };
+    }
+    return;
+  }
+  var STATUS_PENDING = 0;
+  var STATUS_RESOLVED = 1;
+  var STATUS_REJECTED = 2;
+
+  // In an attempt to avoid silent exceptions, unhandled rejections are
+  // tracked and if they aren't handled in a certain amount of time an
+  // error is logged.
+  var REJECTION_TIMEOUT = 500;
+
+  var HandlerManager = {
+    handlers: [],
+    running: false,
+    unhandledRejections: [],
+    pendingRejectionCheck: false,
+
+    scheduleHandlers: function scheduleHandlers(promise) {
+      if (promise._status == STATUS_PENDING) {
+        return;
+      }
+
+      this.handlers = this.handlers.concat(promise._handlers);
+      promise._handlers = [];
+
+      if (this.running) {
+        return;
+      }
+      this.running = true;
+
+      setTimeout(this.runHandlers.bind(this), 0);
+    },
+
+    runHandlers: function runHandlers() {
+      var RUN_TIMEOUT = 1; // ms
+      var timeoutAt = Date.now() + RUN_TIMEOUT;
+      while (this.handlers.length > 0) {
+        var handler = this.handlers.shift();
+
+        var nextStatus = handler.thisPromise._status;
+        var nextValue = handler.thisPromise._value;
+
+        try {
+          if (nextStatus === STATUS_RESOLVED) {
+            if (typeof(handler.onResolve) == 'function') {
+              nextValue = handler.onResolve(nextValue);
+            }
+          } else if (typeof(handler.onReject) === 'function') {
+              nextValue = handler.onReject(nextValue);
+              nextStatus = STATUS_RESOLVED;
+
+              if (handler.thisPromise._unhandledRejection) {
+                this.removeUnhandeledRejection(handler.thisPromise);
+              }
+          }
+        } catch (ex) {
+          nextStatus = STATUS_REJECTED;
+          nextValue = ex;
+        }
+
+        handler.nextPromise._updateStatus(nextStatus, nextValue);
+        if (Date.now() >= timeoutAt) {
+          break;
+        }
+      }
+
+      if (this.handlers.length > 0) {
+        setTimeout(this.runHandlers.bind(this), 0);
+        return;
+      }
+
+      this.running = false;
+    },
+
+    addUnhandledRejection: function addUnhandledRejection(promise) {
+      this.unhandledRejections.push({
+        promise: promise,
+        time: Date.now()
+      });
+      this.scheduleRejectionCheck();
+    },
+
+    removeUnhandeledRejection: function removeUnhandeledRejection(promise) {
+      promise._unhandledRejection = false;
+      for (var i = 0; i < this.unhandledRejections.length; i++) {
+        if (this.unhandledRejections[i].promise === promise) {
+          this.unhandledRejections.splice(i);
+          i--;
+        }
+      }
+    },
+
+    scheduleRejectionCheck: function scheduleRejectionCheck() {
+      if (this.pendingRejectionCheck) {
+        return;
+      }
+      this.pendingRejectionCheck = true;
+      setTimeout(function rejectionCheck() {
+        this.pendingRejectionCheck = false;
+        var now = Date.now();
+        for (var i = 0; i < this.unhandledRejections.length; i++) {
+          if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {
+            var unhandled = this.unhandledRejections[i].promise._value;
+            var msg = 'Unhandled rejection: ' + unhandled;
+            if (unhandled.stack) {
+              msg += '\n' + unhandled.stack;
+            }
+            warn(msg);
+            this.unhandledRejections.splice(i);
+            i--;
+          }
+        }
+        if (this.unhandledRejections.length) {
+          this.scheduleRejectionCheck();
+        }
+      }.bind(this), REJECTION_TIMEOUT);
+    }
+  };
+
+  function Promise(resolver) {
+    this._status = STATUS_PENDING;
+    this._handlers = [];
+    resolver.call(this, this._resolve.bind(this), this._reject.bind(this));
+  }
+  /**
+   * Builds a promise that is resolved when all the passed in promises are
+   * resolved.
+   * @param {array} array of data and/or promises to wait for.
+   * @return {Promise} New dependant promise.
+   */
+  Promise.all = function Promise_all(promises) {
+    var resolveAll, rejectAll;
+    var deferred = new Promise(function (resolve, reject) {
+      resolveAll = resolve;
+      rejectAll = reject;
+    });
+    var unresolved = promises.length;
+    var results = [];
+    if (unresolved === 0) {
+      resolveAll(results);
+      return deferred;
+    }
+    function reject(reason) {
+      if (deferred._status === STATUS_REJECTED) {
+        return;
+      }
+      results = [];
+      rejectAll(reason);
+    }
+    for (var i = 0, ii = promises.length; i < ii; ++i) {
+      var promise = promises[i];
+      var resolve = (function(i) {
+        return function(value) {
+          if (deferred._status === STATUS_REJECTED) {
+            return;
+          }
+          results[i] = value;
+          unresolved--;
+          if (unresolved === 0) {
+            resolveAll(results);
+          }
+        };
+      })(i);
+      if (Promise.isPromise(promise)) {
+        promise.then(resolve, reject);
+      } else {
+        resolve(promise);
+      }
+    }
+    return deferred;
+  };
+
+  /**
+   * Checks if the value is likely a promise (has a 'then' function).
+   * @return {boolean} true if x is thenable
+   */
+  Promise.isPromise = function Promise_isPromise(value) {
+    return value && typeof value.then === 'function';
+  };
+  /**
+   * Creates resolved promise
+   * @param x resolve value
+   * @returns {Promise}
+   */
+  Promise.resolve = function Promise_resolve(x) {
+    return new Promise(function (resolve) { resolve(x); });
+  };
+
+  Promise.prototype = {
+    _status: null,
+    _value: null,
+    _handlers: null,
+    _unhandledRejection: null,
+
+    _updateStatus: function Promise__updateStatus(status, value) {
+      if (this._status === STATUS_RESOLVED ||
+          this._status === STATUS_REJECTED) {
+        return;
+      }
+
+      if (status == STATUS_RESOLVED &&
+          Promise.isPromise(value)) {
+        value.then(this._updateStatus.bind(this, STATUS_RESOLVED),
+                   this._updateStatus.bind(this, STATUS_REJECTED));
+        return;
+      }
+
+      this._status = status;
+      this._value = value;
+
+      if (status === STATUS_REJECTED && this._handlers.length === 0) {
+        this._unhandledRejection = true;
+        HandlerManager.addUnhandledRejection(this);
+      }
+
+      HandlerManager.scheduleHandlers(this);
+    },
+
+    _resolve: function Promise_resolve(value) {
+      this._updateStatus(STATUS_RESOLVED, value);
+    },
+
+    _reject: function Promise_reject(reason) {
+      this._updateStatus(STATUS_REJECTED, reason);
+    },
+
+    then: function Promise_then(onResolve, onReject) {
+      var nextPromise = new Promise(function (resolve, reject) {
+        this.resolve = reject;
+        this.reject = reject;
+      });
+      this._handlers.push({
+        thisPromise: this,
+        onResolve: onResolve,
+        onReject: onReject,
+        nextPromise: nextPromise
+      });
+      HandlerManager.scheduleHandlers(this);
+      return nextPromise;
+    }
+  };
+
+  globalScope.Promise = Promise;
+})();
+
+var StatTimer = (function StatTimerClosure() {
+  function rpad(str, pad, length) {
+    while (str.length < length) {
+      str += pad;
+    }
+    return str;
+  }
+  function StatTimer() {
+    this.started = {};
+    this.times = [];
+    this.enabled = true;
+  }
+  StatTimer.prototype = {
+    time: function StatTimer_time(name) {
+      if (!this.enabled) {
+        return;
+      }
+      if (name in this.started) {
+        warn('Timer is already running for ' + name);
+      }
+      this.started[name] = Date.now();
+    },
+    timeEnd: function StatTimer_timeEnd(name) {
+      if (!this.enabled) {
+        return;
+      }
+      if (!(name in this.started)) {
+        warn('Timer has not been started for ' + name);
+      }
+      this.times.push({
+        'name': name,
+        'start': this.started[name],
+        'end': Date.now()
+      });
+      // Remove timer from started so it can be called again.
+      delete this.started[name];
+    },
+    toString: function StatTimer_toString() {
+      var i, ii;
+      var times = this.times;
+      var out = '';
+      // Find the longest name for padding purposes.
+      var longest = 0;
+      for (i = 0, ii = times.length; i < ii; ++i) {
+        var name = times[i]['name'];
+        if (name.length > longest) {
+          longest = name.length;
+        }
+      }
+      for (i = 0, ii = times.length; i < ii; ++i) {
+        var span = times[i];
+        var duration = span.end - span.start;
+        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
+      }
+      return out;
+    }
+  };
+  return StatTimer;
+})();
+
+PDFJS.createBlob = function createBlob(data, contentType) {
+  if (typeof Blob !== 'undefined') {
+    return new Blob([data], { type: contentType });
+  }
+  // Blob builder is deprecated in FF14 and removed in FF18.
+  var bb = new MozBlobBuilder();
+  bb.append(data);
+  return bb.getBlob(contentType);
+};
+
+PDFJS.createObjectURL = (function createObjectURLClosure() {
+  // Blob/createObjectURL is not available, falling back to data schema.
+  var digits =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+  return function createObjectURL(data, contentType) {
+    if (!PDFJS.disableCreateObjectURL &&
+        typeof URL !== 'undefined' && URL.createObjectURL) {
+      var blob = PDFJS.createBlob(data, contentType);
+      return URL.createObjectURL(blob);
+    }
+
+    var buffer = 'data:' + contentType + ';base64,';
+    for (var i = 0, ii = data.length; i < ii; i += 3) {
+      var b1 = data[i] & 0xFF;
+      var b2 = data[i + 1] & 0xFF;
+      var b3 = data[i + 2] & 0xFF;
+      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;
+      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+    }
+    return buffer;
+  };
+})();
+
+function MessageHandler(name, comObj) {
+  this.name = name;
+  this.comObj = comObj;
+  this.callbackIndex = 1;
+  this.postMessageTransfers = true;
+  var callbacks = this.callbacks = {};
+  var ah = this.actionHandler = {};
+
+  ah['console_log'] = [function ahConsoleLog(data) {
+    console.log.apply(console, data);
+  }];
+  ah['console_error'] = [function ahConsoleError(data) {
+    console.error.apply(console, data);
+  }];
+  ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {
+    UnsupportedManager.notify(data);
+  }];
+
+  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+    var data = event.data;
+    if (data.isReply) {
+      var callbackId = data.callbackId;
+      if (data.callbackId in callbacks) {
+        var callback = callbacks[callbackId];
+        delete callbacks[callbackId];
+        callback(data.data);
+      } else {
+        error('Cannot resolve callback ' + callbackId);
+      }
+    } else if (data.action in ah) {
+      var action = ah[data.action];
+      if (data.callbackId) {
+        var deferred = {};
+        var promise = new Promise(function (resolve, reject) {
+          deferred.resolve = resolve;
+          deferred.reject = reject;
+        });
+        deferred.promise = promise;
+        promise.then(function(resolvedData) {
+          comObj.postMessage({
+            isReply: true,
+            callbackId: data.callbackId,
+            data: resolvedData
+          });
+        });
+        action[0].call(action[1], data.data, deferred);
+      } else {
+        action[0].call(action[1], data.data);
+      }
+    } else {
+      error('Unkown action from worker: ' + data.action);
+    }
+  };
+}
+
+MessageHandler.prototype = {
+  on: function messageHandlerOn(actionName, handler, scope) {
+    var ah = this.actionHandler;
+    if (ah[actionName]) {
+      error('There is already an actionName called "' + actionName + '"');
+    }
+    ah[actionName] = [handler, scope];
+  },
+  /**
+   * Sends a message to the comObj to invoke the action with the supplied data.
+   * @param {String} actionName Action to call.
+   * @param {JSON} data JSON data to send.
+   * @param {function} [callback] Optional callback that will handle a reply.
+   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers
+   */
+  send: function messageHandlerSend(actionName, data, callback, transfers) {
+    var message = {
+      action: actionName,
+      data: data
+    };
+    if (callback) {
+      var callbackId = this.callbackIndex++;
+      this.callbacks[callbackId] = callback;
+      message.callbackId = callbackId;
+    }
+    if (transfers && this.postMessageTransfers) {
+      this.comObj.postMessage(message, transfers);
+    } else {
+      this.comObj.postMessage(message);
+    }
+  }
+};
+
+function loadJpegStream(id, imageUrl, objs) {
+  var img = new Image();
+  img.onload = (function loadJpegStream_onloadClosure() {
+    objs.resolve(id, img);
+  });
+  img.src = imageUrl;
+}
+
+
+var ColorSpace = (function ColorSpaceClosure() {
+  // Constructor should define this.numComps, this.defaultColor, this.name
+  function ColorSpace() {
+    error('should not call ColorSpace constructor');
+  }
+
+  ColorSpace.prototype = {
+    /**
+     * Converts the color value to the RGB color. The color components are
+     * located in the src array starting from the srcOffset. Returns the array
+     * of the rgb components, each value ranging from [0,255].
+     */
+    getRgb: function ColorSpace_getRgb(src, srcOffset) {
+      var rgb = new Uint8Array(3);
+      this.getRgbItem(src, srcOffset, rgb, 0);
+      return rgb;
+    },
+    /**
+     * Converts the color value to the RGB color, similar to the getRgb method.
+     * The result placed into the dest array starting from the destOffset.
+     */
+    getRgbItem: function ColorSpace_getRgbItem(src, srcOffset,
+                                               dest, destOffset) {
+      error('Should not call ColorSpace.getRgbItem');
+    },
+    /**
+     * Converts the specified number of the color values to the RGB colors.
+     * The colors are located in the src array starting from the srcOffset.
+     * The result is placed into the dest array starting from the destOffset.
+     * The src array items shall be in [0,2^bits) range, the dest array items
+     * will be in [0,255] range. alpha01 indicates how many alpha components
+     * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA
+     * array).
+     */
+    getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count,
+                                                   dest, destOffset, bits,
+                                                   alpha01) {
+      error('Should not call ColorSpace.getRgbBuffer');
+    },
+    /**
+     * Determines the number of bytes required to store the result of the
+     * conversion done by the getRgbBuffer method. As in getRgbBuffer,
+     * |alpha01| is either 0 (RGB output) or 1 (RGBA output).
+     */
+    getOutputLength: function ColorSpace_getOutputLength(inputLength,
+                                                         alpha01) {
+      error('Should not call ColorSpace.getOutputLength');
+    },
+    /**
+     * Returns true if source data will be equal the result/output data.
+     */
+    isPassthrough: function ColorSpace_isPassthrough(bits) {
+      return false;
+    },
+    /**
+     * Fills in the RGB colors in the destination buffer.  alpha01 indicates
+     * how many alpha components there are in the dest array; it will be either
+     * 0 (RGB array) or 1 (RGBA array).
+     */
+    fillRgb: function ColorSpace_fillRgb(dest, originalWidth,
+                                         originalHeight, width, height,
+                                         actualHeight, bpc, comps, alpha01) {
+      var count = originalWidth * originalHeight;
+      var rgbBuf = null;
+      var numComponentColors = 1 << bpc;
+      var needsResizing = originalHeight != height || originalWidth != width;
+      var i, ii;
+
+      if (this.isPassthrough(bpc)) {
+        rgbBuf = comps;
+      } else if (this.numComps === 1 && count > numComponentColors &&
+          this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {
+        // Optimization: create a color map when there is just one component and
+        // we are converting more colors than the size of the color map. We
+        // don't build the map if the colorspace is gray or rgb since those
+        // methods are faster than building a map. This mainly offers big speed
+        // ups for indexed and alternate colorspaces.
+        //
+        // TODO it may be worth while to cache the color map. While running
+        // testing I never hit a cache so I will leave that out for now (perhaps
+        // we are reparsing colorspaces too much?).
+        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) :
+                                   new Uint16Array(numComponentColors);
+        var key;
+        for (i = 0; i < numComponentColors; i++) {
+          allColors[i] = i;
+        }
+        var colorMap = new Uint8Array(numComponentColors * 3);
+        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc,
+                          /* alpha01 = */ 0);
+
+        var destPos, rgbPos;
+        if (!needsResizing) {
+          // Fill in the RGB values directly into |dest|.
+          destPos = 0;
+          for (i = 0; i < count; ++i) {
+            key = comps[i] * 3;
+            dest[destPos++] = colorMap[key];
+            dest[destPos++] = colorMap[key + 1];
+            dest[destPos++] = colorMap[key + 2];
+            destPos += alpha01;
+          }
+        } else {
+          rgbBuf = new Uint8Array(count * 3);
+          rgbPos = 0;
+          for (i = 0; i < count; ++i) {
+            key = comps[i] * 3;
+            rgbBuf[rgbPos++] = colorMap[key];
+            rgbBuf[rgbPos++] = colorMap[key + 1];
+            rgbBuf[rgbPos++] = colorMap[key + 2];
+          }
+        }
+      } else {
+        if (!needsResizing) {
+          // Fill in the RGB values directly into |dest|.
+          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc,
+                            alpha01);
+        } else {
+          rgbBuf = new Uint8Array(count * 3);
+          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc,
+                            /* alpha01 = */ 0);
+        }
+      }
+
+      if (rgbBuf) {
+        if (needsResizing) {
+          PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width,
+                          height, dest, alpha01);
+        } else {
+          rgbPos = 0;
+          destPos = 0;
+          for (i = 0, ii = width * actualHeight; i < ii; i++) {
+            dest[destPos++] = rgbBuf[rgbPos++];
+            dest[destPos++] = rgbBuf[rgbPos++];
+            dest[destPos++] = rgbBuf[rgbPos++];
+            destPos += alpha01;
+          }
+        }
+      }
+    },
+    /**
+     * True if the colorspace has components in the default range of [0, 1].
+     * This should be true for all colorspaces except for lab color spaces
+     * which are [0,100], [-128, 127], [-128, 127].
+     */
+    usesZeroToOneRange: true
+  };
+
+  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
+    var IR = ColorSpace.parseToIR(cs, xref, res);
+    if (IR instanceof AlternateCS) {
+      return IR;
+    }
+    return ColorSpace.fromIR(IR);
+  };
+
+  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
+    var name = isArray(IR) ? IR[0] : IR;
+    var whitePoint, blackPoint;
+
+    switch (name) {
+      case 'DeviceGrayCS':
+        return this.singletons.gray;
+      case 'DeviceRgbCS':
+        return this.singletons.rgb;
+      case 'DeviceCmykCS':
+        return this.singletons.cmyk;
+      case 'CalGrayCS':
+        whitePoint = IR[1].WhitePoint;
+        blackPoint = IR[1].BlackPoint;
+        var gamma = IR[1].Gamma;
+        return new CalGrayCS(whitePoint, blackPoint, gamma);
+      case 'PatternCS':
+        var basePatternCS = IR[1];
+        if (basePatternCS) {
+          basePatternCS = ColorSpace.fromIR(basePatternCS);
+        }
+        return new PatternCS(basePatternCS);
+      case 'IndexedCS':
+        var baseIndexedCS = IR[1];
+        var hiVal = IR[2];
+        var lookup = IR[3];
+        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
+      case 'AlternateCS':
+        var numComps = IR[1];
+        var alt = IR[2];
+        var tintFnIR = IR[3];
+
+        return new AlternateCS(numComps, ColorSpace.fromIR(alt),
+                                PDFFunction.fromIR(tintFnIR));
+      case 'LabCS':
+        whitePoint = IR[1].WhitePoint;
+        blackPoint = IR[1].BlackPoint;
+        var range = IR[1].Range;
+        return new LabCS(whitePoint, blackPoint, range);
+      default:
+        error('Unkown name ' + name);
+    }
+    return null;
+  };
+
+  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
+    if (isName(cs)) {
+      var colorSpaces = res.get('ColorSpace');
+      if (isDict(colorSpaces)) {
+        var refcs = colorSpaces.get(cs.name);
+        if (refcs) {
+          cs = refcs;
+        }
+      }
+    }
+
+    cs = xref.fetchIfRef(cs);
+    var mode;
+
+    if (isName(cs)) {
+      mode = cs.name;
+      this.mode = mode;
+
+      switch (mode) {
+        case 'DeviceGray':
+        case 'G':
+          return 'DeviceGrayCS';
+        case 'DeviceRGB':
+        case 'RGB':
+          return 'DeviceRgbCS';
+        case 'DeviceCMYK':
+        case 'CMYK':
+          return 'DeviceCmykCS';
+        case 'Pattern':
+          return ['PatternCS', null];
+        default:
+          error('unrecognized colorspace ' + mode);
+      }
+    } else if (isArray(cs)) {
+      mode = cs[0].name;
+      this.mode = mode;
+      var numComps, params;
+
+      switch (mode) {
+        case 'DeviceGray':
+        case 'G':
+          return 'DeviceGrayCS';
+        case 'DeviceRGB':
+        case 'RGB':
+          return 'DeviceRgbCS';
+        case 'DeviceCMYK':
+        case 'CMYK':
+          return 'DeviceCmykCS';
+        case 'CalGray':
+          params = cs[1].getAll();
+          return ['CalGrayCS', params];
+        case 'CalRGB':
+          return 'DeviceRgbCS';
+        case 'ICCBased':
+          var stream = xref.fetchIfRef(cs[1]);
+          var dict = stream.dict;
+          numComps = dict.get('N');
+          if (numComps == 1) {
+            return 'DeviceGrayCS';
+          } else if (numComps == 3) {
+            return 'DeviceRgbCS';
+          } else if (numComps == 4) {
+            return 'DeviceCmykCS';
+          }
+          break;
+        case 'Pattern':
+          var basePatternCS = cs[1];
+          if (basePatternCS) {
+            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+          }
+          return ['PatternCS', basePatternCS];
+        case 'Indexed':
+        case 'I':
+          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
+          var hiVal = cs[2] + 1;
+          var lookup = xref.fetchIfRef(cs[3]);
+          if (isStream(lookup)) {
+            lookup = lookup.getBytes();
+          }
+          return ['IndexedCS', baseIndexedCS, hiVal, lookup];
+        case 'Separation':
+        case 'DeviceN':
+          var name = cs[1];
+          numComps = 1;
+          if (isName(name)) {
+            numComps = 1;
+          } else if (isArray(name)) {
+            numComps = name.length;
+          }
+          var alt = ColorSpace.parseToIR(cs[2], xref, res);
+          var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
+          return ['AlternateCS', numComps, alt, tintFnIR];
+        case 'Lab':
+          params = cs[1].getAll();
+          return ['LabCS', params];
+        default:
+          error('unimplemented color space object "' + mode + '"');
+      }
+    } else {
+      error('unrecognized color space object: "' + cs + '"');
+    }
+    return null;
+  };
+  /**
+   * Checks if a decode map matches the default decode map for a color space.
+   * This handles the general decode maps where there are two values per
+   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
+   * This does not handle Lab, Indexed, or Pattern decode maps since they are
+   * slightly different.
+   * @param {Array} decode Decode map (usually from an image).
+   * @param {Number} n Number of components the color space has.
+   */
+  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
+    if (!decode) {
+      return true;
+    }
+
+    if (n * 2 !== decode.length) {
+      warn('The decode map is not the correct length');
+      return true;
+    }
+    for (var i = 0, ii = decode.length; i < ii; i += 2) {
+      if (decode[i] !== 0 || decode[i + 1] != 1) {
+        return false;
+      }
+    }
+    return true;
+  };
+
+  ColorSpace.singletons = {
+    get gray() {
+      return shadow(this, 'gray', new DeviceGrayCS());
+    },
+    get rgb() {
+      return shadow(this, 'rgb', new DeviceRgbCS());
+    },
+    get cmyk() {
+      return shadow(this, 'cmyk', new DeviceCmykCS());
+    }
+  };
+
+  return ColorSpace;
+})();
+
+/**
+ * Alternate color space handles both Separation and DeviceN color spaces.  A
+ * Separation color space is actually just a DeviceN with one color component.
+ * Both color spaces use a tinting function to convert colors to a base color
+ * space.
+ */
+var AlternateCS = (function AlternateCSClosure() {
+  function AlternateCS(numComps, base, tintFn) {
+    this.name = 'Alternate';
+    this.numComps = numComps;
+    this.defaultColor = new Float32Array(numComps);
+    for (var i = 0; i < numComps; ++i) {
+      this.defaultColor[i] = 1;
+    }
+    this.base = base;
+    this.tintFn = tintFn;
+  }
+
+  AlternateCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function AlternateCS_getRgbItem(src, srcOffset,
+                                                dest, destOffset) {
+      var baseNumComps = this.base.numComps;
+      var input = 'subarray' in src ?
+        src.subarray(srcOffset, srcOffset + this.numComps) :
+        Array.prototype.slice.call(src, srcOffset, srcOffset + this.numComps);
+      var tinted = this.tintFn(input);
+      this.base.getRgbItem(tinted, 0, dest, destOffset);
+    },
+    getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count,
+                                                    dest, destOffset, bits,
+                                                    alpha01) {
+      var tintFn = this.tintFn;
+      var base = this.base;
+      var scale = 1 / ((1 << bits) - 1);
+      var baseNumComps = base.numComps;
+      var usesZeroToOneRange = base.usesZeroToOneRange;
+      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) &&
+                          alpha01 === 0;
+      var pos = isPassthrough ? destOffset : 0;
+      var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count);
+      var numComps = this.numComps;
+
+      var scaled = new Float32Array(numComps);
+      var i, j;
+      for (i = 0; i < count; i++) {
+        for (j = 0; j < numComps; j++) {
+          scaled[j] = src[srcOffset++] * scale;
+        }
+        var tinted = tintFn(scaled);
+        if (usesZeroToOneRange) {
+          for (j = 0; j < baseNumComps; j++) {
+            baseBuf[pos++] = tinted[j] * 255;
+          }
+        } else {
+          base.getRgbItem(tinted, 0, baseBuf, pos);
+          pos += baseNumComps;
+        }
+      }
+      if (!isPassthrough) {
+        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
+      }
+    },
+    getOutputLength: function AlternateCS_getOutputLength(inputLength,
+                                                          alpha01) {
+      return this.base.getOutputLength(inputLength *
+                                       this.base.numComps / this.numComps,
+                                       alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+
+  return AlternateCS;
+})();
+
+var PatternCS = (function PatternCSClosure() {
+  function PatternCS(baseCS) {
+    this.name = 'Pattern';
+    this.base = baseCS;
+  }
+  PatternCS.prototype = {};
+
+  return PatternCS;
+})();
+
+var IndexedCS = (function IndexedCSClosure() {
+  function IndexedCS(base, highVal, lookup) {
+    this.name = 'Indexed';
+    this.numComps = 1;
+    this.defaultColor = new Uint8Array([0]);
+    this.base = base;
+    this.highVal = highVal;
+
+    var baseNumComps = base.numComps;
+    var length = baseNumComps * highVal;
+    var lookupArray;
+
+    if (isStream(lookup)) {
+      lookupArray = new Uint8Array(length);
+      var bytes = lookup.getBytes(length);
+      lookupArray.set(bytes);
+    } else if (isString(lookup)) {
+      lookupArray = new Uint8Array(length);
+      for (var i = 0; i < length; ++i) {
+        lookupArray[i] = lookup.charCodeAt(i);
+      }
+    } else if (lookup instanceof Uint8Array || lookup instanceof Array) {
+      lookupArray = lookup;
+    } else {
+      error('Unrecognized lookup table: ' + lookup);
+    }
+    this.lookup = lookupArray;
+  }
+
+  IndexedCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function IndexedCS_getRgbItem(src, srcOffset,
+                                              dest, destOffset) {
+      var numComps = this.base.numComps;
+      var start = src[srcOffset] * numComps;
+      this.base.getRgbItem(this.lookup, start, dest, destOffset);
+    },
+    getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count,
+                                                  dest, destOffset, bits,
+                                                  alpha01) {
+      var base = this.base;
+      var numComps = base.numComps;
+      var outputDelta = base.getOutputLength(numComps, alpha01);
+      var lookup = this.lookup;
+
+      for (var i = 0; i < count; ++i) {
+        var lookupPos = src[srcOffset++] * numComps;
+        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
+        destOffset += outputDelta;
+      }
+    },
+    getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) {
+      return this.base.getOutputLength(inputLength * this.base.numComps,
+                                       alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
+      // indexed color maps shouldn't be changed
+      return true;
+    },
+    usesZeroToOneRange: true
+  };
+  return IndexedCS;
+})();
+
+var DeviceGrayCS = (function DeviceGrayCSClosure() {
+  function DeviceGrayCS() {
+    this.name = 'DeviceGray';
+    this.numComps = 1;
+    this.defaultColor = new Float32Array([0]);
+  }
+
+  DeviceGrayCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset,
+                                                 dest, destOffset) {
+      var c = (src[srcOffset] * 255) | 0;
+      c = c < 0 ? 0 : c > 255 ? 255 : c;
+      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
+    },
+    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count,
+                                                     dest, destOffset, bits,
+                                                     alpha01) {
+      var scale = 255 / ((1 << bits) - 1);
+      var j = srcOffset, q = destOffset;
+      for (var i = 0; i < count; ++i) {
+        var c = (scale * src[j++]) | 0;
+        dest[q++] = c;
+        dest[q++] = c;
+        dest[q++] = c;
+        q += alpha01;
+      }
+    },
+    getOutputLength: function DeviceGrayCS_getOutputLength(inputLength,
+                                                           alpha01) {
+      return inputLength * (3 + alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+  return DeviceGrayCS;
+})();
+
+var DeviceRgbCS = (function DeviceRgbCSClosure() {
+  function DeviceRgbCS() {
+    this.name = 'DeviceRGB';
+    this.numComps = 3;
+    this.defaultColor = new Float32Array([0, 0, 0]);
+  }
+  DeviceRgbCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset,
+                                                dest, destOffset) {
+      var r = (src[srcOffset] * 255) | 0;
+      var g = (src[srcOffset + 1] * 255) | 0;
+      var b = (src[srcOffset + 2] * 255) | 0;
+      dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r;
+      dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g;
+      dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b;
+    },
+    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count,
+                                                    dest, destOffset, bits,
+                                                    alpha01) {
+      if (bits === 8 && alpha01 === 0) {
+        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
+        return;
+      }
+      var scale = 255 / ((1 << bits) - 1);
+      var j = srcOffset, q = destOffset;
+      for (var i = 0; i < count; ++i) {
+        dest[q++] = (scale * src[j++]) | 0;
+        dest[q++] = (scale * src[j++]) | 0;
+        dest[q++] = (scale * src[j++]) | 0;
+        q += alpha01;
+      }
+    },
+    getOutputLength: function DeviceRgbCS_getOutputLength(inputLength,
+                                                          alpha01) {
+      return (inputLength * (3 + alpha01) / 3) | 0;
+    },
+    isPassthrough: function DeviceRgbCS_isPassthrough(bits) {
+      return bits == 8;
+    },
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+  return DeviceRgbCS;
+})();
+
+var DeviceCmykCS = (function DeviceCmykCSClosure() {
+  // The coefficients below was found using numerical analysis: the method of
+  // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors,
+  // where color_value is the tabular value from the table of sampled RGB colors
+  // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding
+  // CMYK color conversion using the estimation below:
+  //   f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255
+  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
+    var c = src[srcOffset + 0] * srcScale;
+    var m = src[srcOffset + 1] * srcScale;
+    var y = src[srcOffset + 2] * srcScale;
+    var k = src[srcOffset + 3] * srcScale;
+
+    var r =
+      (c * (-4.387332384609988 * c + 54.48615194189176 * m +
+            18.82290502165302 * y + 212.25662451639585 * k +
+            -285.2331026137004) +
+       m * (1.7149763477362134 * m - 5.6096736904047315 * y +
+            -17.873870861415444 * k - 5.497006427196366) +
+       y * (-2.5217340131683033 * y - 21.248923337353073 * k +
+            17.5119270841813) +
+       k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0;
+    var g =
+      (c * (8.841041422036149 * c + 60.118027045597366 * m +
+            6.871425592049007 * y + 31.159100130055922 * k +
+            -79.2970844816548) +
+       m * (-15.310361306967817 * m + 17.575251261109482 * y +
+            131.35250912493976 * k - 190.9453302588951) +
+       y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) +
+       k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0;
+    var b =
+      (c * (0.8842522430003296 * c + 8.078677503112928 * m +
+            30.89978309703729 * y - 0.23883238689178934 * k +
+            -14.183576799673286) +
+       m * (10.49593273432072 * m + 63.02378494754052 * y +
+            50.606957656360734 * k - 112.23884253719248) +
+       y * (0.03296041114873217 * y + 115.60384449646641 * k +
+            -193.58209356861505) +
+       k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0;
+
+    dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r;
+    dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;
+    dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;
+  }
+
+  function DeviceCmykCS() {
+    this.name = 'DeviceCMYK';
+    this.numComps = 4;
+    this.defaultColor = new Float32Array([0, 0, 0, 1]);
+  }
+  DeviceCmykCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset,
+                                                 dest, destOffset) {
+      convertToRgb(src, srcOffset, 1, dest, destOffset);
+    },
+    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count,
+                                                     dest, destOffset, bits,
+                                                     alpha01) {
+      var scale = 1 / ((1 << bits) - 1);
+      for (var i = 0; i < count; i++) {
+        convertToRgb(src, srcOffset, scale, dest, destOffset);
+        srcOffset += 4;
+        destOffset += 3 + alpha01;
+      }
+    },
+    getOutputLength: function DeviceCmykCS_getOutputLength(inputLength,
+                                                           alpha01) {
+      return (inputLength / 4 * (3 + alpha01)) | 0;
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+
+  return DeviceCmykCS;
+})();
+
+//
+// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245
+//
+var CalGrayCS = (function CalGrayCSClosure() {
+  function CalGrayCS(whitePoint, blackPoint, gamma) {
+    this.name = 'CalGray';
+    this.numComps = 1;
+    this.defaultColor = new Float32Array([0]);
+
+    if (!whitePoint) {
+      error('WhitePoint missing - required for color space CalGray');
+    }
+    blackPoint = blackPoint || [0, 0, 0];
+    gamma = gamma || 1;
+
+    // Translate arguments to spec variables.
+    this.XW = whitePoint[0];
+    this.YW = whitePoint[1];
+    this.ZW = whitePoint[2];
+
+    this.XB = blackPoint[0];
+    this.YB = blackPoint[1];
+    this.ZB = blackPoint[2];
+
+    this.G = gamma;
+
+    // Validate variables as per spec.
+    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+      error('Invalid WhitePoint components for ' + this.name +
+            ', no fallback available');
+    }
+
+    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+      info('Invalid BlackPoint for ' + this.name + ', falling back to default');
+      this.XB = this.YB = this.ZB = 0;
+    }
+
+    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
+      warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB +
+           ', ZB: ' + this.ZB + ', only default values are supported.');
+    }
+
+    if (this.G < 1) {
+      info('Invalid Gamma: ' + this.G + ' for ' + this.name +
+           ', falling back to default');
+      this.G = 1;
+    }
+  }
+
+  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+    // A represents a gray component of a calibrated gray space.
+    // A <---> AG in the spec
+    var A = src[srcOffset] * scale;
+    var AG = Math.pow(A, cs.G);
+
+    // Computes intermediate variables M, L, N as per spec.
+    // Except if other than default BlackPoint values are used.
+    var M = cs.XW * AG;
+    var L = cs.YW * AG;
+    var N = cs.ZW * AG;
+
+    // Decode XYZ, as per spec.
+    var X = M;
+    var Y = L;
+    var Z = N;
+
+    // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.
+    // This yields values in range [0, 100].
+    var Lstar = Math.max(116 * Math.pow(Y, 1 / 3) - 16, 0);
+
+    // Convert values to rgb range [0, 255].
+    dest[destOffset] = Lstar * 255 / 100;
+    dest[destOffset + 1] = Lstar * 255 / 100;
+    dest[destOffset + 2] = Lstar * 255 / 100;
+  }
+
+  CalGrayCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset,
+                                              dest, destOffset) {
+      convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+    },
+    getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count,
+                                                  dest, destOffset, bits,
+                                                  alpha01) {
+      var scale = 1 / ((1 << bits) - 1);
+
+      for (var i = 0; i < count; ++i) {
+        convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+        srcOffset += 1;
+        destOffset += 3 + alpha01;
+      }
+    },
+    getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) {
+      return inputLength * (3 + alpha01);
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    fillRgb: ColorSpace.prototype.fillRgb,
+    isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    },
+    usesZeroToOneRange: true
+  };
+  return CalGrayCS;
+})();
+
+//
+// LabCS: Based on "PDF Reference, Sixth Ed", p.250
+//
+var LabCS = (function LabCSClosure() {
+  function LabCS(whitePoint, blackPoint, range) {
+    this.name = 'Lab';
+    this.numComps = 3;
+    this.defaultColor = new Float32Array([0, 0, 0]);
+
+    if (!whitePoint) {
+      error('WhitePoint missing - required for color space Lab');
+    }
+    blackPoint = blackPoint || [0, 0, 0];
+    range = range || [-100, 100, -100, 100];
+
+    // Translate args to spec variables
+    this.XW = whitePoint[0];
+    this.YW = whitePoint[1];
+    this.ZW = whitePoint[2];
+    this.amin = range[0];
+    this.amax = range[1];
+    this.bmin = range[2];
+    this.bmax = range[3];
+
+    // These are here just for completeness - the spec doesn't offer any
+    // formulas that use BlackPoint in Lab
+    this.XB = blackPoint[0];
+    this.YB = blackPoint[1];
+    this.ZB = blackPoint[2];
+
+    // Validate vars as per spec
+    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+      error('Invalid WhitePoint components, no fallback available');
+    }
+
+    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+      info('Invalid BlackPoint, falling back to default');
+      this.XB = this.YB = this.ZB = 0;
+    }
+
+    if (this.amin > this.amax || this.bmin > this.bmax) {
+      info('Invalid Range, falling back to defaults');
+      this.amin = -100;
+      this.amax = 100;
+      this.bmin = -100;
+      this.bmax = 100;
+    }
+  }
+
+  // Function g(x) from spec
+  function fn_g(x) {
+    if (x >= 6 / 29) {
+      return x * x * x;
+    } else {
+      return (108 / 841) * (x - 4 / 29);
+    }
+  }
+
+  function decode(value, high1, low2, high2) {
+    return low2 + (value) * (high2 - low2) / (high1);
+  }
+
+  // If decoding is needed maxVal should be 2^bits per component - 1.
+  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
+    // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax]
+    // not the usual [0, 1]. If a command like setFillColor is used the src
+    // values will already be within the correct range. However, if we are
+    // converting an image we have to map the values to the correct range given
+    // above.
+    // Ls,as,bs <---> L*,a*,b* in the spec
+    var Ls = src[srcOffset];
+    var as = src[srcOffset + 1];
+    var bs = src[srcOffset + 2];
+    if (maxVal !== false) {
+      Ls = decode(Ls, maxVal, 0, 100);
+      as = decode(as, maxVal, cs.amin, cs.amax);
+      bs = decode(bs, maxVal, cs.bmin, cs.bmax);
+    }
+
+    // Adjust limits of 'as' and 'bs'
+    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;
+    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;
+
+    // Computes intermediate variables X,Y,Z as per spec
+    var M = (Ls + 16) / 116;
+    var L = M + (as / 500);
+    var N = M - (bs / 200);
+
+    var X = cs.XW * fn_g(L);
+    var Y = cs.YW * fn_g(M);
+    var Z = cs.ZW * fn_g(N);
+
+    var r, g, b;
+    // Using different conversions for D50 and D65 white points,
+    // per http://www.color.org/srgb.pdf
+    if (cs.ZW < 1) {
+      // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249)
+      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;
+      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;
+      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;
+    } else {
+      // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888)
+      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
+      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
+      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;
+    }
+    // clamp color values to [0,1] range then convert to [0,255] range.
+    dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0;
+    dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0;
+    dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0;
+  }
+
+  LabCS.prototype = {
+    getRgb: ColorSpace.prototype.getRgb,
+    getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) {
+      convertToRgb(this, src, srcOffset, false, dest, destOffset);
+    },
+    getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count,
+                                              dest, destOffset, bits,
+                                              alpha01) {
+      var maxVal = (1 << bits) - 1;
+      for (var i = 0; i < count; i++) {
+        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
+        srcOffset += 3;
+        destOffset += 3 + alpha01;
+      }
+    },
+    getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) {
+      return (inputLength * (3 + alpha01) / 3) | 0;
+    },
+    isPassthrough: ColorSpace.prototype.isPassthrough,
+    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
+      // XXX: Decoding is handled with the lab conversion because of the strange
+      // ranges that are used.
+      return true;
+    },
+    usesZeroToOneRange: false
+  };
+  return LabCS;
+})();
+
+
+
+var PDFFunction = (function PDFFunctionClosure() {
+  var CONSTRUCT_SAMPLED = 0;
+  var CONSTRUCT_INTERPOLATED = 2;
+  var CONSTRUCT_STICHED = 3;
+  var CONSTRUCT_POSTSCRIPT = 4;
+
+  return {
+    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
+                                                       str) {
+      var i, ii;
+      var length = 1;
+      for (i = 0, ii = size.length; i < ii; i++) {
+        length *= size[i];
+      }
+      length *= outputSize;
+
+      var array = [];
+      var codeSize = 0;
+      var codeBuf = 0;
+      // 32 is a valid bps so shifting won't work
+      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+
+      var strBytes = str.getBytes((length * bps + 7) / 8);
+      var strIdx = 0;
+      for (i = 0; i < length; i++) {
+        while (codeSize < bps) {
+          codeBuf <<= 8;
+          codeBuf |= strBytes[strIdx++];
+          codeSize += 8;
+        }
+        codeSize -= bps;
+        array.push((codeBuf >> codeSize) * sampleMul);
+        codeBuf &= (1 << codeSize) - 1;
+      }
+      return array;
+    },
+
+    getIR: function PDFFunction_getIR(xref, fn) {
+      var dict = fn.dict;
+      if (!dict) {
+        dict = fn;
+      }
+
+      var types = [this.constructSampled,
+                   null,
+                   this.constructInterpolated,
+                   this.constructStiched,
+                   this.constructPostScript];
+
+      var typeNum = dict.get('FunctionType');
+      var typeFn = types[typeNum];
+      if (!typeFn) {
+        error('Unknown type of function');
+      }
+
+      return typeFn.call(this, fn, dict, xref);
+    },
+
+    fromIR: function PDFFunction_fromIR(IR) {
+      var type = IR[0];
+      switch (type) {
+        case CONSTRUCT_SAMPLED:
+          return this.constructSampledFromIR(IR);
+        case CONSTRUCT_INTERPOLATED:
+          return this.constructInterpolatedFromIR(IR);
+        case CONSTRUCT_STICHED:
+          return this.constructStichedFromIR(IR);
+        //case CONSTRUCT_POSTSCRIPT:
+        default:
+          return this.constructPostScriptFromIR(IR);
+      }
+    },
+
+    parse: function PDFFunction_parse(xref, fn) {
+      var IR = this.getIR(xref, fn);
+      return this.fromIR(IR);
+    },
+
+    constructSampled: function PDFFunction_constructSampled(str, dict) {
+      function toMultiArray(arr) {
+        var inputLength = arr.length;
+        var out = [];
+        var index = 0;
+        for (var i = 0; i < inputLength; i += 2) {
+          out[index] = [arr[i], arr[i + 1]];
+          ++index;
+        }
+        return out;
+      }
+      var domain = dict.get('Domain');
+      var range = dict.get('Range');
+
+      if (!domain || !range) {
+        error('No domain or range');
+      }
+
+      var inputSize = domain.length / 2;
+      var outputSize = range.length / 2;
+
+      domain = toMultiArray(domain);
+      range = toMultiArray(range);
+
+      var size = dict.get('Size');
+      var bps = dict.get('BitsPerSample');
+      var order = dict.get('Order') || 1;
+      if (order !== 1) {
+        // No description how cubic spline interpolation works in PDF32000:2008
+        // As in poppler, ignoring order, linear interpolation may work as good
+        info('No support for cubic spline interpolation: ' + order);
+      }
+
+      var encode = dict.get('Encode');
+      if (!encode) {
+        encode = [];
+        for (var i = 0; i < inputSize; ++i) {
+          encode.push(0);
+          encode.push(size[i] - 1);
+        }
+      }
+      encode = toMultiArray(encode);
+
+      var decode = dict.get('Decode');
+      if (!decode) {
+        decode = range;
+      } else {
+        decode = toMultiArray(decode);
+      }
+
+      var samples = this.getSampleArray(size, outputSize, bps, str);
+
+      return [
+        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
+        outputSize, Math.pow(2, bps) - 1, range
+      ];
+    },
+
+    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
+      // See chapter 3, page 109 of the PDF reference
+      function interpolate(x, xmin, xmax, ymin, ymax) {
+        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
+      }
+
+      return function constructSampledFromIRResult(args) {
+        // See chapter 3, page 110 of the PDF reference.
+        var m = IR[1];
+        var domain = IR[2];
+        var encode = IR[3];
+        var decode = IR[4];
+        var samples = IR[5];
+        var size = IR[6];
+        var n = IR[7];
+        //var mask = IR[8];
+        var range = IR[9];
+
+        if (m != args.length) {
+          error('Incorrect number of arguments: ' + m + ' != ' +
+                args.length);
+        }
+
+        var x = args;
+
+        // Building the cube vertices: its part and sample index
+        // http://rjwagner49.com/Mathematics/Interpolation.pdf
+        var cubeVertices = 1 << m;
+        var cubeN = new Float64Array(cubeVertices);
+        var cubeVertex = new Uint32Array(cubeVertices);
+        var i, j;
+        for (j = 0; j < cubeVertices; j++) {
+          cubeN[j] = 1;
+        }
+
+        var k = n, pos = 1;
+        // Map x_i to y_j for 0 <= i < m using the sampled function.
+        for (i = 0; i < m; ++i) {
+          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
+          var domain_2i = domain[i][0];
+          var domain_2i_1 = domain[i][1];
+          var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
+
+          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
+          //                   Encode_2i, Encode_2i+1)
+          var e = interpolate(xi, domain_2i, domain_2i_1,
+                              encode[i][0], encode[i][1]);
+
+          // e_i' = min(max(e_i, 0), Size_i - 1)
+          var size_i = size[i];
+          e = Math.min(Math.max(e, 0), size_i - 1);
+
+          // Adjusting the cube: N and vertex sample index
+          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
+          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
+          var n1 = e - e0; // (e - e0) / (e1 - e0);
+          var offset0 = e0 * k;
+          var offset1 = offset0 + k; // e1 * k
+          for (j = 0; j < cubeVertices; j++) {
+            if (j & pos) {
+              cubeN[j] *= n1;
+              cubeVertex[j] += offset1;
+            } else {
+              cubeN[j] *= n0;
+              cubeVertex[j] += offset0;
+            }
+          }
+
+          k *= size_i;
+          pos <<= 1;
+        }
+
+        var y = new Float64Array(n);
+        for (j = 0; j < n; ++j) {
+          // Sum all cube vertices' samples portions
+          var rj = 0;
+          for (i = 0; i < cubeVertices; i++) {
+            rj += samples[cubeVertex[i] + j] * cubeN[i];
+          }
+
+          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
+          //                    Decode_2j, Decode_2j+1)
+          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
+
+          // y_j = min(max(r_j, range_2j), range_2j+1)
+          y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
+        }
+
+        return y;
+      };
+    },
+
+    constructInterpolated: function PDFFunction_constructInterpolated(str,
+                                                                      dict) {
+      var c0 = dict.get('C0') || [0];
+      var c1 = dict.get('C1') || [1];
+      var n = dict.get('N');
+
+      if (!isArray(c0) || !isArray(c1)) {
+        error('Illegal dictionary for interpolated function');
+      }
+
+      var length = c0.length;
+      var diff = [];
+      for (var i = 0; i < length; ++i) {
+        diff.push(c1[i] - c0[i]);
+      }
+
+      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+    },
+
+    constructInterpolatedFromIR:
+      function PDFFunction_constructInterpolatedFromIR(IR) {
+      var c0 = IR[1];
+      var diff = IR[2];
+      var n = IR[3];
+
+      var length = diff.length;
+
+      return function constructInterpolatedFromIRResult(args) {
+        var x = n == 1 ? args[0] : Math.pow(args[0], n);
+
+        var out = [];
+        for (var j = 0; j < length; ++j) {
+          out.push(c0[j] + (x * diff[j]));
+        }
+
+        return out;
+
+      };
+    },
+
+    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
+      var domain = dict.get('Domain');
+
+      if (!domain) {
+        error('No domain');
+      }
+
+      var inputSize = domain.length / 2;
+      if (inputSize != 1) {
+        error('Bad domain for stiched function');
+      }
+
+      var fnRefs = dict.get('Functions');
+      var fns = [];
+      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
+        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
+      }
+
+      var bounds = dict.get('Bounds');
+      var encode = dict.get('Encode');
+
+      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+    },
+
+    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
+      var domain = IR[1];
+      var bounds = IR[2];
+      var encode = IR[3];
+      var fnsIR = IR[4];
+      var fns = [];
+
+      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
+        fns.push(PDFFunction.fromIR(fnsIR[i]));
+      }
+
+      return function constructStichedFromIRResult(args) {
+        var clip = function constructStichedFromIRClip(v, min, max) {
+          if (v > max) {
+            v = max;
+          } else if (v < min) {
+            v = min;
+          }
+          return v;
+        };
+
+        // clip to domain
+        var v = clip(args[0], domain[0], domain[1]);
+        // calulate which bound the value is in
+        for (var i = 0, ii = bounds.length; i < ii; ++i) {
+          if (v < bounds[i]) {
+            break;
+          }
+        }
+
+        // encode value into domain of function
+        var dmin = domain[0];
+        if (i > 0) {
+          dmin = bounds[i - 1];
+        }
+        var dmax = domain[1];
+        if (i < bounds.length) {
+          dmax = bounds[i];
+        }
+
+        var rmin = encode[2 * i];
+        var rmax = encode[2 * i + 1];
+
+        var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+
+        // call the appropriate function
+        return fns[i]([v2]);
+      };
+    },
+
+    constructPostScript: function PDFFunction_constructPostScript(fn, dict,
+                                                                  xref) {
+      var domain = dict.get('Domain');
+      var range = dict.get('Range');
+
+      if (!domain) {
+        error('No domain.');
+      }
+
+      if (!range) {
+        error('No range.');
+      }
+
+      var lexer = new PostScriptLexer(fn);
+      var parser = new PostScriptParser(lexer);
+      var code = parser.parse();
+
+      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
+    },
+
+    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
+                                          IR) {
+      var domain = IR[1];
+      var range = IR[2];
+      var code = IR[3];
+      var numOutputs = range.length / 2;
+      var evaluator = new PostScriptEvaluator(code);
+      // Cache the values for a big speed up, the cache size is limited though
+      // since the number of possible values can be huge from a PS function.
+      var cache = new FunctionCache();
+      return function constructPostScriptFromIRResult(args) {
+        var initialStack = [];
+        for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
+          initialStack.push(args[i]);
+        }
+
+        var key = initialStack.join('_');
+        if (cache.has(key)) {
+          return cache.get(key);
+        }
+
+        var stack = evaluator.execute(initialStack);
+        var transformed = [];
+        for (i = numOutputs - 1; i >= 0; --i) {
+          var out = stack.pop();
+          var rangeIndex = 2 * i;
+          if (out < range[rangeIndex]) {
+            out = range[rangeIndex];
+          } else if (out > range[rangeIndex + 1]) {
+            out = range[rangeIndex + 1];
+          }
+          transformed[i] = out;
+        }
+        cache.set(key, transformed);
+        return transformed;
+      };
+    }
+  };
+})();
+
+var FunctionCache = (function FunctionCacheClosure() {
+  // Of 10 PDF's with type4 functions the maxium number of distinct values seen
+  // was 256. This still may need some tweaking in the future though.
+  var MAX_CACHE_SIZE = 1024;
+  function FunctionCache() {
+    this.cache = {};
+    this.total = 0;
+  }
+  FunctionCache.prototype = {
+    has: function FunctionCache_has(key) {
+      return key in this.cache;
+    },
+    get: function FunctionCache_get(key) {
+      return this.cache[key];
+    },
+    set: function FunctionCache_set(key, value) {
+      if (this.total < MAX_CACHE_SIZE) {
+        this.cache[key] = value;
+        this.total++;
+      }
+    }
+  };
+  return FunctionCache;
+})();
+
+var PostScriptStack = (function PostScriptStackClosure() {
+  var MAX_STACK_SIZE = 100;
+  function PostScriptStack(initialStack) {
+    this.stack = initialStack || [];
+  }
+
+  PostScriptStack.prototype = {
+    push: function PostScriptStack_push(value) {
+      if (this.stack.length >= MAX_STACK_SIZE) {
+        error('PostScript function stack overflow.');
+      }
+      this.stack.push(value);
+    },
+    pop: function PostScriptStack_pop() {
+      if (this.stack.length <= 0) {
+        error('PostScript function stack underflow.');
+      }
+      return this.stack.pop();
+    },
+    copy: function PostScriptStack_copy(n) {
+      if (this.stack.length + n >= MAX_STACK_SIZE) {
+        error('PostScript function stack overflow.');
+      }
+      var stack = this.stack;
+      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
+        stack.push(stack[i]);
+      }
+    },
+    index: function PostScriptStack_index(n) {
+      this.push(this.stack[this.stack.length - n - 1]);
+    },
+    // rotate the last n stack elements p times
+    roll: function PostScriptStack_roll(n, p) {
+      var stack = this.stack;
+      var l = stack.length - n;
+      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
+      for (i = l, j = r; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+      for (i = l, j = c - 1; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+      for (i = c, j = r; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+    }
+  };
+  return PostScriptStack;
+})();
+var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
+  function PostScriptEvaluator(operators) {
+    this.operators = operators;
+  }
+  PostScriptEvaluator.prototype = {
+    execute: function PostScriptEvaluator_execute(initialStack) {
+      var stack = new PostScriptStack(initialStack);
+      var counter = 0;
+      var operators = this.operators;
+      var length = operators.length;
+      var operator, a, b;
+      while (counter < length) {
+        operator = operators[counter++];
+        if (typeof operator == 'number') {
+          // Operator is really an operand and should be pushed to the stack.
+          stack.push(operator);
+          continue;
+        }
+        switch (operator) {
+          // non standard ps operators
+          case 'jz': // jump if false
+            b = stack.pop();
+            a = stack.pop();
+            if (!a) {
+              counter = b;
+            }
+            break;
+          case 'j': // jump
+            a = stack.pop();
+            counter = a;
+            break;
+
+          // all ps operators in alphabetical order (excluding if/ifelse)
+          case 'abs':
+            a = stack.pop();
+            stack.push(Math.abs(a));
+            break;
+          case 'add':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a + b);
+            break;
+          case 'and':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a && b);
+            } else {
+              stack.push(a & b);
+            }
+            break;
+          case 'atan':
+            a = stack.pop();
+            stack.push(Math.atan(a));
+            break;
+          case 'bitshift':
+            b = stack.pop();
+            a = stack.pop();
+            if (a > 0) {
+              stack.push(a << b);
+            } else {
+              stack.push(a >> b);
+            }
+            break;
+          case 'ceiling':
+            a = stack.pop();
+            stack.push(Math.ceil(a));
+            break;
+          case 'copy':
+            a = stack.pop();
+            stack.copy(a);
+            break;
+          case 'cos':
+            a = stack.pop();
+            stack.push(Math.cos(a));
+            break;
+          case 'cvi':
+            a = stack.pop() | 0;
+            stack.push(a);
+            break;
+          case 'cvr':
+            // noop
+            break;
+          case 'div':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a / b);
+            break;
+          case 'dup':
+            stack.copy(1);
+            break;
+          case 'eq':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a == b);
+            break;
+          case 'exch':
+            stack.roll(2, 1);
+            break;
+          case 'exp':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(Math.pow(a, b));
+            break;
+          case 'false':
+            stack.push(false);
+            break;
+          case 'floor':
+            a = stack.pop();
+            stack.push(Math.floor(a));
+            break;
+          case 'ge':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a >= b);
+            break;
+          case 'gt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a > b);
+            break;
+          case 'idiv':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push((a / b) | 0);
+            break;
+          case 'index':
+            a = stack.pop();
+            stack.index(a);
+            break;
+          case 'le':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a <= b);
+            break;
+          case 'ln':
+            a = stack.pop();
+            stack.push(Math.log(a));
+            break;
+          case 'log':
+            a = stack.pop();
+            stack.push(Math.log(a) / Math.LN10);
+            break;
+          case 'lt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a < b);
+            break;
+          case 'mod':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a % b);
+            break;
+          case 'mul':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a * b);
+            break;
+          case 'ne':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a != b);
+            break;
+          case 'neg':
+            a = stack.pop();
+            stack.push(-b);
+            break;
+          case 'not':
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a && b);
+            } else {
+              stack.push(a & b);
+            }
+            break;
+          case 'or':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a || b);
+            } else {
+              stack.push(a | b);
+            }
+            break;
+          case 'pop':
+            stack.pop();
+            break;
+          case 'roll':
+            b = stack.pop();
+            a = stack.pop();
+            stack.roll(a, b);
+            break;
+          case 'round':
+            a = stack.pop();
+            stack.push(Math.round(a));
+            break;
+          case 'sin':
+            a = stack.pop();
+            stack.push(Math.sin(a));
+            break;
+          case 'sqrt':
+            a = stack.pop();
+            stack.push(Math.sqrt(a));
+            break;
+          case 'sub':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a - b);
+            break;
+          case 'true':
+            stack.push(true);
+            break;
+          case 'truncate':
+            a = stack.pop();
+            a = a < 0 ? Math.ceil(a) : Math.floor(a);
+            stack.push(a);
+            break;
+          case 'xor':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b)) {
+              stack.push(a != b);
+            } else {
+              stack.push(a ^ b);
+            }
+            break;
+          default:
+            error('Unknown operator ' + operator);
+            break;
+        }
+      }
+      return stack.stack;
+    }
+  };
+  return PostScriptEvaluator;
+})();
+
+
+var DEFAULT_ICON_SIZE = 22; // px
+var HIGHLIGHT_OFFSET = 4; // px
+var SUPPORTED_TYPES = ['Link', 'Text', 'Widget'];
+
+var Annotation = (function AnnotationClosure() {
+  // 12.5.5: Algorithm: Appearance streams
+  function getTransformMatrix(rect, bbox, matrix) {
+    var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);
+    var minX = bounds[0];
+    var minY = bounds[1];
+    var maxX = bounds[2];
+    var maxY = bounds[3];
+
+    if (minX === maxX || minY === maxY) {
+      // From real-life file, bbox was [0, 0, 0, 0]. In this case,
+      // just apply the transform for rect
+      return [1, 0, 0, 1, rect[0], rect[1]];
+    }
+
+    var xRatio = (rect[2] - rect[0]) / (maxX - minX);
+    var yRatio = (rect[3] - rect[1]) / (maxY - minY);
+    return [
+      xRatio,
+      0,
+      0,
+      yRatio,
+      rect[0] - minX * xRatio,
+      rect[1] - minY * yRatio
+    ];
+  }
+
+  function getDefaultAppearance(dict) {
+    var appearanceState = dict.get('AP');
+    if (!isDict(appearanceState)) {
+      return;
+    }
+
+    var appearance;
+    var appearances = appearanceState.get('N');
+    if (isDict(appearances)) {
+      var as = dict.get('AS');
+      if (as && appearances.has(as.name)) {
+        appearance = appearances.get(as.name);
+      }
+    } else {
+      appearance = appearances;
+    }
+    return appearance;
+  }
+
+  function Annotation(params) {
+    if (params.data) {
+      this.data = params.data;
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data = {};
+
+    data.subtype = dict.get('Subtype').name;
+    var rect = dict.get('Rect') || [0, 0, 0, 0];
+    data.rect = Util.normalizeRect(rect);
+    data.annotationFlags = dict.get('F');
+
+    var color = dict.get('C');
+    if (isArray(color) && color.length === 3) {
+      // TODO(mack): currently only supporting rgb; need support different
+      // colorspaces
+      data.color = color;
+    } else {
+      data.color = [0, 0, 0];
+    }
+
+    // Some types of annotations have border style dict which has more
+    // info than the border array
+    if (dict.has('BS')) {
+      var borderStyle = dict.get('BS');
+      data.borderWidth = borderStyle.has('W') ? borderStyle.get('W') : 1;
+    } else {
+      var borderArray = dict.get('Border') || [0, 0, 1];
+      data.borderWidth = borderArray[2] || 0;
+
+      // TODO: implement proper support for annotations with line dash patterns.
+      var dashArray = borderArray[3];
+      if (data.borderWidth > 0 && dashArray && isArray(dashArray)) {
+        var dashArrayLength = dashArray.length;
+        if (dashArrayLength > 0) {
+          // According to the PDF specification: the elements in a dashArray
+          // shall be numbers that are nonnegative and not all equal to zero.
+          var isInvalid = false;
+          var numPositive = 0;
+          for (var i = 0; i < dashArrayLength; i++) {
+            var validNumber = (+dashArray[i] >= 0);
+            if (!validNumber) {
+              isInvalid = true;
+              break;
+            } else if (dashArray[i] > 0) {
+              numPositive++;
+            }
+          }
+          if (isInvalid || numPositive === 0) {
+            data.borderWidth = 0;
+          }
+        }
+      }
+    }
+
+    this.appearance = getDefaultAppearance(dict);
+    data.hasAppearance = !!this.appearance;
+    data.id = params.ref.num;
+  }
+
+  Annotation.prototype = {
+
+    getData: function Annotation_getData() {
+      return this.data;
+    },
+
+    hasHtml: function Annotation_hasHtml() {
+      return false;
+    },
+
+    getHtmlElement: function Annotation_getHtmlElement(commonObjs) {
+      throw new NotImplementedException(
+        'getHtmlElement() should be implemented in subclass');
+    },
+
+    // TODO(mack): Remove this, it's not really that helpful.
+    getEmptyContainer: function Annotation_getEmptyContainer(tagName, rect,
+                                                             borderWidth) {
+      assert(!isWorker,
+        'getEmptyContainer() should be called from main thread');
+
+      var bWidth = borderWidth || 0;
+
+      rect = rect || this.data.rect;
+      var element = document.createElement(tagName);
+      element.style.borderWidth = bWidth + 'px';
+      var width = rect[2] - rect[0] - 2 * bWidth;
+      var height = rect[3] - rect[1] - 2 * bWidth;
+      element.style.width = width + 'px';
+      element.style.height = height + 'px';
+      return element;
+    },
+
+    isInvisible: function Annotation_isInvisible() {
+      var data = this.data;
+      if (data && SUPPORTED_TYPES.indexOf(data.subtype) !== -1) {
+        return false;
+      } else {
+        return !!(data &&
+                  data.annotationFlags &&            // Default: not invisible
+                  data.annotationFlags & 0x1);       // Invisible
+      }
+    },
+
+    isViewable: function Annotation_isViewable() {
+      var data = this.data;
+      return !!(!this.isInvisible() &&
+                data &&
+                (!data.annotationFlags ||
+                 !(data.annotationFlags & 0x22)) &&  // Hidden or NoView
+                data.rect);                          // rectangle is nessessary
+    },
+
+    isPrintable: function Annotation_isPrintable() {
+      var data = this.data;
+      return !!(!this.isInvisible() &&
+                data &&
+                data.annotationFlags &&              // Default: not printable
+                data.annotationFlags & 0x4 &&        // Print
+                data.rect);                          // rectangle is nessessary
+    },
+
+    loadResources: function(keys) {
+      var promise = new LegacyPromise();
+      this.appearance.dict.getAsync('Resources').then(function(resources) {
+        if (!resources) {
+          promise.resolve();
+          return;
+        }
+        var objectLoader = new ObjectLoader(resources.map,
+                                            keys,
+                                            resources.xref);
+        objectLoader.load().then(function() {
+          promise.resolve(resources);
+        });
+      }.bind(this));
+
+      return promise;
+    },
+
+    getOperatorList: function Annotation_getOperatorList(evaluator) {
+
+      var promise = new LegacyPromise();
+
+      if (!this.appearance) {
+        promise.resolve(new OperatorList());
+        return promise;
+      }
+
+      var data = this.data;
+
+      var appearanceDict = this.appearance.dict;
+      var resourcesPromise = this.loadResources([
+        'ExtGState',
+        'ColorSpace',
+        'Pattern',
+        'Shading',
+        'XObject',
+        'Font'
+        // ProcSet
+        // Properties
+      ]);
+      var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1];
+      var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0];
+      var transform = getTransformMatrix(data.rect, bbox, matrix);
+
+      resourcesPromise.then(function(resources) {
+        var opList = new OperatorList();
+        opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]);
+        evaluator.getOperatorList(this.appearance, resources, opList);
+        opList.addOp(OPS.endAnnotation, []);
+        promise.resolve(opList);
+
+        this.appearance.reset();
+      }.bind(this));
+
+      return promise;
+    }
+  };
+
+  Annotation.getConstructor =
+      function Annotation_getConstructor(subtype, fieldType) {
+
+    if (!subtype) {
+      return;
+    }
+
+    // TODO(mack): Implement FreeText annotations
+    if (subtype === 'Link') {
+      return LinkAnnotation;
+    } else if (subtype === 'Text') {
+      return TextAnnotation;
+    } else if (subtype === 'Widget') {
+      if (!fieldType) {
+        return;
+      }
+
+      if (fieldType === 'Tx') {
+        return TextWidgetAnnotation;
+      } else {
+        return WidgetAnnotation;
+      }
+    } else {
+      return Annotation;
+    }
+  };
+
+  // TODO(mack): Support loading annotation from data
+  Annotation.fromData = function Annotation_fromData(data) {
+    var subtype = data.subtype;
+    var fieldType = data.fieldType;
+    var Constructor = Annotation.getConstructor(subtype, fieldType);
+    if (Constructor) {
+      return new Constructor({ data: data });
+    }
+  };
+
+  Annotation.fromRef = function Annotation_fromRef(xref, ref) {
+
+    var dict = xref.fetchIfRef(ref);
+    if (!isDict(dict)) {
+      return;
+    }
+
+    var subtype = dict.get('Subtype');
+    subtype = isName(subtype) ? subtype.name : '';
+    if (!subtype) {
+      return;
+    }
+
+    var fieldType = Util.getInheritableProperty(dict, 'FT');
+    fieldType = isName(fieldType) ? fieldType.name : '';
+
+    var Constructor = Annotation.getConstructor(subtype, fieldType);
+    if (!Constructor) {
+      return;
+    }
+
+    var params = {
+      dict: dict,
+      ref: ref,
+    };
+
+    var annotation = new Constructor(params);
+
+    if (annotation.isViewable() || annotation.isPrintable()) {
+      return annotation;
+    } else {
+      warn('unimplemented annotation type: ' + subtype);
+    }
+  };
+
+  Annotation.appendToOperatorList = function Annotation_appendToOperatorList(
+      annotations, opList, pdfManager, partialEvaluator, intent) {
+
+    function reject(e) {
+      annotationsReadyPromise.reject(e);
+    }
+
+    var annotationsReadyPromise = new LegacyPromise();
+
+    var annotationPromises = [];
+    for (var i = 0, n = annotations.length; i < n; ++i) {
+      if (intent === 'display' && annotations[i].isViewable() ||
+          intent === 'print' && annotations[i].isPrintable()) {
+        annotationPromises.push(
+          annotations[i].getOperatorList(partialEvaluator));
+      }
+    }
+    Promise.all(annotationPromises).then(function(datas) {
+      opList.addOp(OPS.beginAnnotations, []);
+      for (var i = 0, n = datas.length; i < n; ++i) {
+        var annotOpList = datas[i];
+        opList.addOpList(annotOpList);
+      }
+      opList.addOp(OPS.endAnnotations, []);
+      annotationsReadyPromise.resolve();
+    }, reject);
+
+    return annotationsReadyPromise;
+  };
+
+  return Annotation;
+})();
+PDFJS.Annotation = Annotation;
+
+
+var WidgetAnnotation = (function WidgetAnnotationClosure() {
+
+  function WidgetAnnotation(params) {
+    Annotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data;
+
+    data.fieldValue = stringToPDFString(
+      Util.getInheritableProperty(dict, 'V') || '');
+    data.alternativeText = stringToPDFString(dict.get('TU') || '');
+    data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || '';
+    var fieldType = Util.getInheritableProperty(dict, 'FT');
+    data.fieldType = isName(fieldType) ? fieldType.name : '';
+    data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0;
+    this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty;
+
+    // Building the full field name by collecting the field and
+    // its ancestors 'T' data and joining them using '.'.
+    var fieldName = [];
+    var namedItem = dict;
+    var ref = params.ref;
+    while (namedItem) {
+      var parent = namedItem.get('Parent');
+      var parentRef = namedItem.getRaw('Parent');
+      var name = namedItem.get('T');
+      if (name) {
+        fieldName.unshift(stringToPDFString(name));
+      } else {
+        // The field name is absent, that means more than one field
+        // with the same name may exist. Replacing the empty name
+        // with the '`' plus index in the parent's 'Kids' array.
+        // This is not in the PDF spec but necessary to id the
+        // the input controls.
+        var kids = parent.get('Kids');
+        var j, jj;
+        for (j = 0, jj = kids.length; j < jj; j++) {
+          var kidRef = kids[j];
+          if (kidRef.num == ref.num && kidRef.gen == ref.gen) {
+            break;
+          }
+        }
+        fieldName.unshift('`' + j);
+      }
+      namedItem = parent;
+      ref = parentRef;
+    }
+    data.fullName = fieldName.join('.');
+  }
+
+  var parent = Annotation.prototype;
+  Util.inherit(WidgetAnnotation, Annotation, {
+    isViewable: function WidgetAnnotation_isViewable() {
+      if (this.data.fieldType === 'Sig') {
+        warn('unimplemented annotation type: Widget signature');
+        return false;
+      }
+
+      return parent.isViewable.call(this);
+    }
+  });
+
+  return WidgetAnnotation;
+})();
+
+var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
+  function TextWidgetAnnotation(params) {
+    WidgetAnnotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q');
+  }
+
+  // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont()
+  function setTextStyles(element, item, fontObj) {
+
+    var style = element.style;
+    style.fontSize = item.fontSize + 'px';
+    style.direction = item.fontDirection < 0 ? 'rtl': 'ltr';
+
+    if (!fontObj) {
+      return;
+    }
+
+    style.fontWeight = fontObj.black ?
+                            (fontObj.bold ? 'bolder' : 'bold') :
+                            (fontObj.bold ? 'bold' : 'normal');
+    style.fontStyle = fontObj.italic ? 'italic' : 'normal';
+
+    var fontName = fontObj.loadedName;
+    var fontFamily = fontName ? '"' + fontName + '", ' : '';
+    // Use a reasonable default font if the font doesn't specify a fallback
+    var fallbackName = fontObj.fallbackName || 'Helvetica, sans-serif';
+    style.fontFamily = fontFamily + fallbackName;
+  }
+
+
+  Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {
+    hasHtml: function TextWidgetAnnotation_hasHtml() {
+      return !this.data.hasAppearance && !!this.data.fieldValue;
+    },
+
+    getHtmlElement: function TextWidgetAnnotation_getHtmlElement(commonObjs) {
+      assert(!isWorker, 'getHtmlElement() shall be called from main thread');
+
+      var item = this.data;
+
+      var element = this.getEmptyContainer('div');
+      element.style.display = 'table';
+
+      var content = document.createElement('div');
+      content.textContent = item.fieldValue;
+      var textAlignment = item.textAlignment;
+      content.style.textAlign = ['left', 'center', 'right'][textAlignment];
+      content.style.verticalAlign = 'middle';
+      content.style.display = 'table-cell';
+
+      var fontObj = item.fontRefName ?
+                    commonObjs.getData(item.fontRefName) : null;
+      setTextStyles(content, item, fontObj);
+
+      element.appendChild(content);
+
+      return element;
+    },
+
+    getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator) {
+      if (this.appearance) {
+        return Annotation.prototype.getOperatorList.call(this, evaluator);
+      }
+
+      var promise = new LegacyPromise();
+      var opList = new OperatorList();
+      var data = this.data;
+
+      // Even if there is an appearance stream, ignore it. This is the
+      // behaviour used by Adobe Reader.
+
+      var defaultAppearance = data.defaultAppearance;
+      if (!defaultAppearance) {
+        promise.resolve(opList);
+        return promise;
+      }
+
+      // Include any font resources found in the default appearance
+
+      var stream = new Stream(stringToBytes(defaultAppearance));
+      evaluator.getOperatorList(stream, this.fieldResources, opList);
+      var appearanceFnArray = opList.fnArray;
+      var appearanceArgsArray = opList.argsArray;
+      var fnArray = [];
+
+      // TODO(mack): Add support for stroke color
+      data.rgb = [0, 0, 0];
+      // TODO THIS DOESN'T MAKE ANY SENSE SINCE THE fnArray IS EMPTY!
+      for (var i = 0, n = fnArray.length; i < n; ++i) {
+        var fnId = appearanceFnArray[i];
+        var args = appearanceArgsArray[i];
+
+        if (fnId === OPS.setFont) {
+          data.fontRefName = args[0];
+          var size = args[1];
+          if (size < 0) {
+            data.fontDirection = -1;
+            data.fontSize = -size;
+          } else {
+            data.fontDirection = 1;
+            data.fontSize = size;
+          }
+        } else if (fnId === OPS.setFillRGBColor) {
+          data.rgb = args;
+        } else if (fnId === OPS.setFillGray) {
+          var rgbValue = args[0] * 255;
+          data.rgb = [rgbValue, rgbValue, rgbValue];
+        }
+      }
+      promise.resolve(opList);
+      return promise;
+    }
+  });
+
+  return TextWidgetAnnotation;
+})();
+
+var InteractiveAnnotation = (function InteractiveAnnotationClosure() {
+  function InteractiveAnnotation(params) {
+    Annotation.call(this, params);
+  }
+
+  Util.inherit(InteractiveAnnotation, Annotation, {
+    hasHtml: function InteractiveAnnotation_hasHtml() {
+      return true;
+    },
+
+    highlight: function InteractiveAnnotation_highlight() {
+      if (this.highlightElement &&
+         this.highlightElement.hasAttribute('hidden')) {
+        this.highlightElement.removeAttribute('hidden');
+      }
+    },
+
+    unhighlight: function InteractiveAnnotation_unhighlight() {
+      if (this.highlightElement &&
+         !this.highlightElement.hasAttribute('hidden')) {
+        this.highlightElement.setAttribute('hidden', true);
+      }
+    },
+
+    initContainer: function InteractiveAnnotation_initContainer() {
+
+      var item = this.data;
+      var rect = item.rect;
+
+      var container = this.getEmptyContainer('section', rect, item.borderWidth);
+      container.style.backgroundColor = item.color;
+
+      var color = item.color;
+      var rgb = [];
+      for (var i = 0; i < 3; ++i) {
+        rgb[i] = Math.round(color[i] * 255);
+      }
+      item.colorCssRgb = Util.makeCssRgb(rgb);
+
+      var highlight = document.createElement('div');
+      highlight.className = 'annotationHighlight';
+      highlight.style.left = highlight.style.top = -HIGHLIGHT_OFFSET + 'px';
+      highlight.style.right = highlight.style.bottom = -HIGHLIGHT_OFFSET + 'px';
+      highlight.setAttribute('hidden', true);
+
+      this.highlightElement = highlight;
+      container.appendChild(this.highlightElement);
+
+      return container;
+    }
+  });
+
+  return InteractiveAnnotation;
+})();
+
+var TextAnnotation = (function TextAnnotationClosure() {
+  function TextAnnotation(params) {
+    InteractiveAnnotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data;
+
+    var content = dict.get('Contents');
+    var title = dict.get('T');
+    data.content = stringToPDFString(content || '');
+    data.title = stringToPDFString(title || '');
+
+    if (data.hasAppearance) {
+      data.name = 'NoIcon';
+    } else {
+      data.rect[1] = data.rect[3] - DEFAULT_ICON_SIZE;
+      data.rect[2] = data.rect[0] + DEFAULT_ICON_SIZE;
+      data.name = dict.has('Name') ? dict.get('Name').name : 'Note';
+    }
+
+    if (dict.has('C')) {
+      data.hasBgColor = true;
+    }
+  }
+
+  var ANNOT_MIN_SIZE = 10;
+
+  Util.inherit(TextAnnotation, InteractiveAnnotation, {
+
+    getHtmlElement: function TextAnnotation_getHtmlElement(commonObjs) {
+      assert(!isWorker, 'getHtmlElement() shall be called from main thread');
+
+      var item = this.data;
+      var rect = item.rect;
+
+      // sanity check because of OOo-generated PDFs
+      if ((rect[3] - rect[1]) < ANNOT_MIN_SIZE) {
+        rect[3] = rect[1] + ANNOT_MIN_SIZE;
+      }
+      if ((rect[2] - rect[0]) < ANNOT_MIN_SIZE) {
+        rect[2] = rect[0] + (rect[3] - rect[1]); // make it square
+      }
+
+      var container = this.initContainer();
+      container.className = 'annotText';
+
+      var image  = document.createElement('img');
+      image.style.height = container.style.height;
+      image.style.width = container.style.width;
+      var iconName = item.name;
+      image.src = PDFJS.imageResourcesPath + 'annotation-' +
+        iconName.toLowerCase() + '.svg';
+      image.alt = '[{{type}} Annotation]';
+      image.dataset.l10nId = 'text_annotation_type';
+      image.dataset.l10nArgs = JSON.stringify({type: iconName});
+
+      var contentWrapper = document.createElement('div');
+      contentWrapper.className = 'annotTextContentWrapper';
+      contentWrapper.style.left = Math.floor(rect[2] - rect[0] + 5) + 'px';
+      contentWrapper.style.top = '-10px';
+
+      var content = document.createElement('div');
+      content.className = 'annotTextContent';
+      content.setAttribute('hidden', true);
+
+      var i, ii;
+      if (item.hasBgColor) {
+        var color = item.color;
+        var rgb = [];
+        for (i = 0; i < 3; ++i) {
+          // Enlighten the color (70%)
+          var c = Math.round(color[i] * 255);
+          rgb[i] = Math.round((255 - c) * 0.7) + c;
+        }
+        content.style.backgroundColor = Util.makeCssRgb(rgb);
+      }
+
+      var title = document.createElement('h1');
+      var text = document.createElement('p');
+      title.textContent = item.title;
+
+      if (!item.content && !item.title) {
+        content.setAttribute('hidden', true);
+      } else {
+        var e = document.createElement('span');
+        var lines = item.content.split(/(?:\r\n?|\n)/);
+        for (i = 0, ii = lines.length; i < ii; ++i) {
+          var line = lines[i];
+          e.appendChild(document.createTextNode(line));
+          if (i < (ii - 1)) {
+            e.appendChild(document.createElement('br'));
+          }
+        }
+        text.appendChild(e);
+
+        var pinned = false;
+
+        var showAnnotation = function showAnnotation(pin) {
+          if (pin) {
+            pinned = true;
+          }
+          if (content.hasAttribute('hidden')) {
+            container.style.zIndex += 1;
+            content.removeAttribute('hidden');
+          }
+        };
+
+        var hideAnnotation = function hideAnnotation(unpin) {
+          if (unpin) {
+            pinned = false;
+          }
+          if (!content.hasAttribute('hidden') && !pinned) {
+            container.style.zIndex -= 1;
+            content.setAttribute('hidden', true);
+          }
+        };
+
+        var toggleAnnotation = function toggleAnnotation() {
+          if (pinned) {
+            hideAnnotation(true);
+          } else {
+            showAnnotation(true);
+          }
+        };
+
+        image.addEventListener('click', function image_clickHandler() {
+          toggleAnnotation();
+        }, false);
+        image.addEventListener('mouseover', function image_mouseOverHandler() {
+          showAnnotation();
+        }, false);
+        image.addEventListener('mouseout', function image_mouseOutHandler() {
+          hideAnnotation();
+        }, false);
+
+        content.addEventListener('click', function content_clickHandler() {
+          hideAnnotation(true);
+        }, false);
+      }
+
+      content.appendChild(title);
+      content.appendChild(text);
+      contentWrapper.appendChild(content);
+      container.appendChild(image);
+      container.appendChild(contentWrapper);
+
+      return container;
+    }
+  });
+
+  return TextAnnotation;
+})();
+
+var LinkAnnotation = (function LinkAnnotationClosure() {
+  function LinkAnnotation(params) {
+    InteractiveAnnotation.call(this, params);
+
+    if (params.data) {
+      return;
+    }
+
+    var dict = params.dict;
+    var data = this.data;
+
+    var action = dict.get('A');
+    if (action) {
+      var linkType = action.get('S').name;
+      if (linkType === 'URI') {
+        var url = action.get('URI');
+        if (isName(url)) {
+          // Some bad PDFs do not put parentheses around relative URLs.
+          url = '/' + url.name;
+        } else if (url) {
+          url = addDefaultProtocolToUrl(url);
+        }
+        // TODO: pdf spec mentions urls can be relative to a Base
+        // entry in the dictionary.
+        if (!isValidUrl(url, false)) {
+          url = '';
+        }
+        data.url = url;
+      } else if (linkType === 'GoTo') {
+        data.dest = action.get('D');
+      } else if (linkType === 'GoToR') {
+        var urlDict = action.get('F');
+        if (isDict(urlDict)) {
+          // We assume that the 'url' is a Filspec dictionary
+          // and fetch the url without checking any further
+          url = urlDict.get('F') || '';
+        }
+
+        // TODO: pdf reference says that GoToR
+        // can also have 'NewWindow' attribute
+        if (!isValidUrl(url, false)) {
+          url = '';
+        }
+        data.url = url;
+        data.dest = action.get('D');
+      } else if (linkType === 'Named') {
+        data.action = action.get('N').name;
+      } else {
+        warn('unrecognized link type: ' + linkType);
+      }
+    } else if (dict.has('Dest')) {
+      // simple destination link
+      var dest = dict.get('Dest');
+      data.dest = isName(dest) ? dest.name : dest;
+    }
+  }
+
+  // Lets URLs beginning with 'www.' default to using the 'http://' protocol.
+  function addDefaultProtocolToUrl(url) {
+    if (url && url.indexOf('www.') === 0) {
+      return ('http://' + url);
+    }
+    return url;
+  }
+
+  Util.inherit(LinkAnnotation, InteractiveAnnotation, {
+    hasOperatorList: function LinkAnnotation_hasOperatorList() {
+      return false;
+    },
+
+    getHtmlElement: function LinkAnnotation_getHtmlElement(commonObjs) {
+
+      var container = this.initContainer();
+      container.className = 'annotLink';
+
+      var item = this.data;
+
+      container.style.borderColor = item.colorCssRgb;
+      container.style.borderStyle = 'solid';
+
+      var link = document.createElement('a');
+      link.href = link.title = this.data.url || '';
+
+      container.appendChild(link);
+
+      return container;
+    }
+  });
+
+  return LinkAnnotation;
+})();
+
+
+
+
+var NetworkManager = (function NetworkManagerClosure() {
+
+  var OK_RESPONSE = 200;
+  var PARTIAL_CONTENT_RESPONSE = 206;
+
+  function NetworkManager(url, args) {
+    this.url = url;
+    args = args || {};
+    this.isHttp = /^https?:/i.test(url);
+    this.httpHeaders = (this.isHttp && args.httpHeaders) || {};
+    this.withCredentials = args.withCredentials || false;
+    this.getXhr = args.getXhr ||
+      function NetworkManager_getXhr() {
+        return new XMLHttpRequest();
+      };
+
+    this.currXhrId = 0;
+    this.pendingRequests = {};
+    this.loadedRequests = {};
+  }
+
+  function getArrayBuffer(xhr) {
+    var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
+                xhr.responseArrayBuffer || xhr.response);
+    if (typeof data !== 'string') {
+      return data;
+    }
+    var length = data.length;
+    var buffer = new Uint8Array(length);
+    for (var i = 0; i < length; i++) {
+      buffer[i] = data.charCodeAt(i) & 0xFF;
+    }
+    return buffer;
+  }
+
+  NetworkManager.prototype = {
+    requestRange: function NetworkManager_requestRange(begin, end, listeners) {
+      var args = {
+        begin: begin,
+        end: end
+      };
+      for (var prop in listeners) {
+        args[prop] = listeners[prop];
+      }
+      return this.request(args);
+    },
+
+    requestFull: function NetworkManager_requestRange(listeners) {
+      return this.request(listeners);
+    },
+
+    request: function NetworkManager_requestRange(args) {
+      var xhr = this.getXhr();
+      var xhrId = this.currXhrId++;
+      var pendingRequest = this.pendingRequests[xhrId] = {
+        xhr: xhr
+      };
+
+      xhr.open('GET', this.url);
+      xhr.withCredentials = this.withCredentials;
+      for (var property in this.httpHeaders) {
+        var value = this.httpHeaders[property];
+        if (typeof value === 'undefined') {
+          continue;
+        }
+        xhr.setRequestHeader(property, value);
+      }
+      if (this.isHttp && 'begin' in args && 'end' in args) {
+        var rangeStr = args.begin + '-' + (args.end - 1);
+        xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
+        pendingRequest.expectedStatus = 206;
+      } else {
+        pendingRequest.expectedStatus = 200;
+      }
+
+      xhr.mozResponseType = xhr.responseType = 'arraybuffer';
+
+      if (args.onProgress) {
+        xhr.onprogress = args.onProgress;
+      }
+      if (args.onError) {
+        xhr.onerror = function(evt) {
+          args.onError(xhr.status);
+        };
+      }
+      xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
+
+      pendingRequest.onHeadersReceived = args.onHeadersReceived;
+      pendingRequest.onDone = args.onDone;
+      pendingRequest.onError = args.onError;
+
+      xhr.send(null);
+
+      return xhrId;
+    },
+
+    onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
+      var pendingRequest = this.pendingRequests[xhrId];
+      if (!pendingRequest) {
+        // Maybe abortRequest was called...
+        return;
+      }
+
+      var xhr = pendingRequest.xhr;
+      if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
+        pendingRequest.onHeadersReceived();
+        delete pendingRequest.onHeadersReceived;
+      }
+
+      if (xhr.readyState !== 4) {
+        return;
+      }
+
+      if (!(xhrId in this.pendingRequests)) {
+        // The XHR request might have been aborted in onHeadersReceived()
+        // callback, in which case we should abort request
+        return;
+      }
+
+      delete this.pendingRequests[xhrId];
+
+      // success status == 0 can be on ftp, file and other protocols
+      if (xhr.status === 0 && this.isHttp) {
+        if (pendingRequest.onError) {
+          pendingRequest.onError(xhr.status);
+        }
+        return;
+      }
+      var xhrStatus = xhr.status || OK_RESPONSE;
+
+      // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
+      // "A server MAY ignore the Range header". This means it's possible to
+      // get a 200 rather than a 206 response from a range request.
+      var ok_response_on_range_request =
+          xhrStatus === OK_RESPONSE &&
+          pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
+
+      if (!ok_response_on_range_request &&
+          xhrStatus !== pendingRequest.expectedStatus) {
+        if (pendingRequest.onError) {
+          pendingRequest.onError(xhr.status);
+        }
+        return;
+      }
+
+      this.loadedRequests[xhrId] = true;
+
+      var chunk = getArrayBuffer(xhr);
+      if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
+        var rangeHeader = xhr.getResponseHeader('Content-Range');
+        var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
+        var begin = parseInt(matches[1], 10);
+        pendingRequest.onDone({
+          begin: begin,
+          chunk: chunk
+        });
+      } else {
+        pendingRequest.onDone({
+          begin: 0,
+          chunk: chunk
+        });
+      }
+    },
+
+    hasPendingRequests: function NetworkManager_hasPendingRequests() {
+      for (var xhrId in this.pendingRequests) {
+        return true;
+      }
+      return false;
+    },
+
+    getRequestXhr: function NetworkManager_getXhr(xhrId) {
+      return this.pendingRequests[xhrId].xhr;
+    },
+
+    isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
+      return xhrId in this.pendingRequests;
+    },
+
+    isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
+      return xhrId in this.loadedRequests;
+    },
+
+    abortAllRequests: function NetworkManager_abortAllRequests() {
+      for (var xhrId in this.pendingRequests) {
+        this.abortRequest(xhrId | 0);
+      }
+    },
+
+    abortRequest: function NetworkManager_abortRequest(xhrId) {
+      var xhr = this.pendingRequests[xhrId].xhr;
+      delete this.pendingRequests[xhrId];
+      xhr.abort();
+    }
+  };
+
+  return NetworkManager;
+})();
+
+
+
+var ChunkedStream = (function ChunkedStreamClosure() {
+  function ChunkedStream(length, chunkSize, manager) {
+    this.bytes = new Uint8Array(length);
+    this.start = 0;
+    this.pos = 0;
+    this.end = length;
+    this.chunkSize = chunkSize;
+    this.loadedChunks = [];
+    this.numChunksLoaded = 0;
+    this.numChunks = Math.ceil(length / chunkSize);
+    this.manager = manager;
+    this.initialDataLength = 0;
+  }
+
+  // required methods for a stream. if a particular stream does not
+  // implement these, an error should be thrown
+  ChunkedStream.prototype = {
+
+    getMissingChunks: function ChunkedStream_getMissingChunks() {
+      var chunks = [];
+      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
+        if (!(chunk in this.loadedChunks)) {
+          chunks.push(chunk);
+        }
+      }
+      return chunks;
+    },
+
+    getBaseStreams: function ChunkedStream_getBaseStreams() {
+      return [this];
+    },
+
+    allChunksLoaded: function ChunkedStream_allChunksLoaded() {
+      return this.numChunksLoaded === this.numChunks;
+    },
+
+    onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {
+      var end = begin + chunk.byteLength;
+
+      assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin);
+      // Using this.length is inaccurate here since this.start can be moved
+      // See ChunkedStream.moveStart()
+      var length = this.bytes.length;
+      assert(end % this.chunkSize === 0 || end === length,
+             'Bad end offset: ' + end);
+
+      this.bytes.set(new Uint8Array(chunk), begin);
+      var chunkSize = this.chunkSize;
+      var beginChunk = Math.floor(begin / chunkSize);
+      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
+      var curChunk;
+
+      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+        if (!(curChunk in this.loadedChunks)) {
+          this.loadedChunks[curChunk] = true;
+          ++this.numChunksLoaded;
+        }
+      }
+    },
+
+    onReceiveInitialData: function ChunkedStream_onReceiveInitialData(data) {
+      this.bytes.set(data);
+      this.initialDataLength = data.length;
+      var endChunk = (this.end === data.length ?
+        this.numChunks : Math.floor(data.length / this.chunkSize));
+      for (var i = 0; i < endChunk; i++) {
+        this.loadedChunks[i] = true;
+        ++this.numChunksLoaded;
+      }
+    },
+
+    ensureRange: function ChunkedStream_ensureRange(begin, end) {
+      if (begin >= end) {
+        return;
+      }
+
+      if (end <= this.initialDataLength) {
+        return;
+      }
+
+      var chunkSize = this.chunkSize;
+      var beginChunk = Math.floor(begin / chunkSize);
+      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
+      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+        if (!(chunk in this.loadedChunks)) {
+          throw new MissingDataException(begin, end);
+        }
+      }
+    },
+
+    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {
+      var chunk, n;
+      for (chunk = beginChunk, n = this.numChunks; chunk < n; ++chunk) {
+        if (!(chunk in this.loadedChunks)) {
+          return chunk;
+        }
+      }
+      // Wrap around to beginning
+      for (chunk = 0; chunk < beginChunk; ++chunk) {
+        if (!(chunk in this.loadedChunks)) {
+          return chunk;
+        }
+      }
+      return null;
+    },
+
+    hasChunk: function ChunkedStream_hasChunk(chunk) {
+      return chunk in this.loadedChunks;
+    },
+
+    get length() {
+      return this.end - this.start;
+    },
+
+    getByte: function ChunkedStream_getByte() {
+      var pos = this.pos;
+      if (pos >= this.end) {
+        return -1;
+      }
+      this.ensureRange(pos, pos + 1);
+      return this.bytes[this.pos++];
+    },
+
+    getUint16: function ChunkedStream_getUint16() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      return (b0 << 8) + b1;
+    },
+
+    getInt32: function ChunkedStream_getInt32() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      var b2 = this.getByte();
+      var b3 = this.getByte();
+      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+    },
+
+    // returns subarray of original buffer
+    // should only be read
+    getBytes: function ChunkedStream_getBytes(length) {
+      var bytes = this.bytes;
+      var pos = this.pos;
+      var strEnd = this.end;
+
+      if (!length) {
+        this.ensureRange(pos, strEnd);
+        return bytes.subarray(pos, strEnd);
+      }
+
+      var end = pos + length;
+      if (end > strEnd) {
+        end = strEnd;
+      }
+      this.ensureRange(pos, end);
+
+      this.pos = end;
+      return bytes.subarray(pos, end);
+    },
+
+    peekBytes: function ChunkedStream_peekBytes(length) {
+      var bytes = this.getBytes(length);
+      this.pos -= bytes.length;
+      return bytes;
+    },
+
+    getByteRange: function ChunkedStream_getBytes(begin, end) {
+      this.ensureRange(begin, end);
+      return this.bytes.subarray(begin, end);
+    },
+
+    skip: function ChunkedStream_skip(n) {
+      if (!n) {
+        n = 1;
+      }
+      this.pos += n;
+    },
+
+    reset: function ChunkedStream_reset() {
+      this.pos = this.start;
+    },
+
+    moveStart: function ChunkedStream_moveStart() {
+      this.start = this.pos;
+    },
+
+    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {
+      this.ensureRange(start, start + length);
+
+      function ChunkedStreamSubstream() {}
+      ChunkedStreamSubstream.prototype = Object.create(this);
+      ChunkedStreamSubstream.prototype.getMissingChunks = function() {
+        var chunkSize = this.chunkSize;
+        var beginChunk = Math.floor(this.start / chunkSize);
+        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
+        var missingChunks = [];
+        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+          if (!(chunk in this.loadedChunks)) {
+            missingChunks.push(chunk);
+          }
+        }
+        return missingChunks;
+      };
+      var subStream = new ChunkedStreamSubstream();
+      subStream.pos = subStream.start = start;
+      subStream.end = start + length || this.end;
+      subStream.dict = dict;
+      return subStream;
+    },
+
+    isStream: true
+  };
+
+  return ChunkedStream;
+})();
+
+var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
+
+  function ChunkedStreamManager(length, chunkSize, url, args) {
+    this.stream = new ChunkedStream(length, chunkSize, this);
+    this.length = length;
+    this.chunkSize = chunkSize;
+    this.url = url;
+    this.disableAutoFetch = args.disableAutoFetch;
+    var msgHandler = this.msgHandler = args.msgHandler;
+
+    if (args.chunkedViewerLoading) {
+      msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
+      msgHandler.on('OnDataProgress', this.onProgress.bind(this));
+      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
+        msgHandler.send('RequestDataRange', { begin: begin, end: end });
+      };
+    } else {
+
+      var getXhr = function getXhr() {
+        return new XMLHttpRequest();
+      };
+      this.networkManager = new NetworkManager(this.url, {
+        getXhr: getXhr,
+        httpHeaders: args.httpHeaders,
+        withCredentials: args.withCredentials
+      });
+      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
+        this.networkManager.requestRange(begin, end, {
+          onDone: this.onReceiveData.bind(this),
+          onProgress: this.onProgress.bind(this)
+        });
+      };
+    }
+
+    this.currRequestId = 0;
+
+    this.chunksNeededByRequest = {};
+    this.requestsByChunk = {};
+    this.callbacksByRequest = {};
+
+    this.loadedStream = new LegacyPromise();
+    if (args.initialData) {
+      this.setInitialData(args.initialData);
+    }
+  }
+
+  ChunkedStreamManager.prototype = {
+
+    setInitialData: function ChunkedStreamManager_setInitialData(data) {
+      this.stream.onReceiveInitialData(data);
+      if (this.stream.allChunksLoaded()) {
+        this.loadedStream.resolve(this.stream);
+      } else if (this.msgHandler) {
+        this.msgHandler.send('DocProgress', {
+          loaded: data.length,
+          total: this.length
+        });
+      }
+    },
+
+    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {
+      return this.loadedStream;
+    },
+
+    // Get all the chunks that are not yet loaded and groups them into
+    // contiguous ranges to load in as few requests as possible
+    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
+      var missingChunks = this.stream.getMissingChunks();
+      this.requestChunks(missingChunks);
+      return this.loadedStream;
+    },
+
+    requestChunks: function ChunkedStreamManager_requestChunks(chunks,
+                                                               callback) {
+      var requestId = this.currRequestId++;
+
+      var chunksNeeded;
+      var i, ii;
+      this.chunksNeededByRequest[requestId] = chunksNeeded = {};
+      for (i = 0, ii = chunks.length; i < ii; i++) {
+        if (!this.stream.hasChunk(chunks[i])) {
+          chunksNeeded[chunks[i]] = true;
+        }
+      }
+
+      if (isEmptyObj(chunksNeeded)) {
+        if (callback) {
+          callback();
+        }
+        return;
+      }
+
+      this.callbacksByRequest[requestId] = callback;
+
+      var chunksToRequest = [];
+      for (var chunk in chunksNeeded) {
+        chunk = chunk | 0;
+        if (!(chunk in this.requestsByChunk)) {
+          this.requestsByChunk[chunk] = [];
+          chunksToRequest.push(chunk);
+        }
+        this.requestsByChunk[chunk].push(requestId);
+      }
+
+      if (!chunksToRequest.length) {
+        return;
+      }
+
+      var groupedChunksToRequest = this.groupChunks(chunksToRequest);
+
+      for (i = 0; i < groupedChunksToRequest.length; ++i) {
+        var groupedChunk = groupedChunksToRequest[i];
+        var begin = groupedChunk.beginChunk * this.chunkSize;
+        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
+        this.sendRequest(begin, end);
+      }
+    },
+
+    getStream: function ChunkedStreamManager_getStream() {
+      return this.stream;
+    },
+
+    // Loads any chunks in the requested range that are not yet loaded
+    requestRange: function ChunkedStreamManager_requestRange(
+                      begin, end, callback) {
+
+      end = Math.min(end, this.length);
+
+      var beginChunk = this.getBeginChunk(begin);
+      var endChunk = this.getEndChunk(end);
+
+      var chunks = [];
+      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+        chunks.push(chunk);
+      }
+
+      this.requestChunks(chunks, callback);
+    },
+
+    requestRanges: function ChunkedStreamManager_requestRanges(ranges,
+                                                               callback) {
+      ranges = ranges || [];
+      var chunksToRequest = [];
+
+      for (var i = 0; i < ranges.length; i++) {
+        var beginChunk = this.getBeginChunk(ranges[i].begin);
+        var endChunk = this.getEndChunk(ranges[i].end);
+        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+          if (chunksToRequest.indexOf(chunk) < 0) {
+            chunksToRequest.push(chunk);
+          }
+        }
+      }
+
+      chunksToRequest.sort(function(a, b) { return a - b; });
+      this.requestChunks(chunksToRequest, callback);
+    },
+
+    // Groups a sorted array of chunks into as few continguous larger
+    // chunks as possible
+    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {
+      var groupedChunks = [];
+      var beginChunk = -1;
+      var prevChunk = -1;
+      for (var i = 0; i < chunks.length; ++i) {
+        var chunk = chunks[i];
+
+        if (beginChunk < 0) {
+          beginChunk = chunk;
+        }
+
+        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {
+          groupedChunks.push({ beginChunk: beginChunk,
+                               endChunk: prevChunk + 1 });
+          beginChunk = chunk;
+        }
+        if (i + 1 === chunks.length) {
+          groupedChunks.push({ beginChunk: beginChunk,
+                               endChunk: chunk + 1 });
+        }
+
+        prevChunk = chunk;
+      }
+      return groupedChunks;
+    },
+
+    onProgress: function ChunkedStreamManager_onProgress(args) {
+      var bytesLoaded = (this.stream.numChunksLoaded * this.chunkSize +
+                         args.loaded);
+      this.msgHandler.send('DocProgress', {
+        loaded: bytesLoaded,
+        total: this.length
+      });
+    },
+
+    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {
+      var chunk = args.chunk;
+      var begin = args.begin;
+      var end = begin + chunk.byteLength;
+
+      var beginChunk = this.getBeginChunk(begin);
+      var endChunk = this.getEndChunk(end);
+
+      this.stream.onReceiveData(begin, chunk);
+      if (this.stream.allChunksLoaded()) {
+        this.loadedStream.resolve(this.stream);
+      }
+
+      var loadedRequests = [];
+      var i, requestId;
+      for (chunk = beginChunk; chunk < endChunk; ++chunk) {
+        // The server might return more chunks than requested
+        var requestIds = this.requestsByChunk[chunk] || [];
+        delete this.requestsByChunk[chunk];
+
+        for (i = 0; i < requestIds.length; ++i) {
+          requestId = requestIds[i];
+          var chunksNeeded = this.chunksNeededByRequest[requestId];
+          if (chunk in chunksNeeded) {
+            delete chunksNeeded[chunk];
+          }
+
+          if (!isEmptyObj(chunksNeeded)) {
+            continue;
+          }
+
+          loadedRequests.push(requestId);
+        }
+      }
+
+      // If there are no pending requests, automatically fetch the next
+      // unfetched chunk of the PDF
+      if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) {
+        var nextEmptyChunk;
+        if (this.stream.numChunksLoaded === 1) {
+          // This is a special optimization so that after fetching the first
+          // chunk, rather than fetching the second chunk, we fetch the last
+          // chunk.
+          var lastChunk = this.stream.numChunks - 1;
+          if (!this.stream.hasChunk(lastChunk)) {
+            nextEmptyChunk = lastChunk;
+          }
+        } else {
+          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);
+        }
+        if (isInt(nextEmptyChunk)) {
+          this.requestChunks([nextEmptyChunk]);
+        }
+      }
+
+      for (i = 0; i < loadedRequests.length; ++i) {
+        requestId = loadedRequests[i];
+        var callback = this.callbacksByRequest[requestId];
+        delete this.callbacksByRequest[requestId];
+        if (callback) {
+          callback();
+        }
+      }
+
+      this.msgHandler.send('DocProgress', {
+        loaded: this.stream.numChunksLoaded * this.chunkSize,
+        total: this.length
+      });
+    },
+
+    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {
+      var chunk = Math.floor(begin / this.chunkSize);
+      return chunk;
+    },
+
+    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {
+      if (end % this.chunkSize === 0) {
+        return end / this.chunkSize;
+      }
+
+      // 0 -> 0
+      // 1 -> 1
+      // 99 -> 1
+      // 100 -> 1
+      // 101 -> 2
+      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;
+      return chunk;
+    }
+  };
+
+  return ChunkedStreamManager;
+})();
+
+
+
+// The maximum number of bytes fetched per range request
+var RANGE_CHUNK_SIZE = 65536;
+
+// TODO(mack): Make use of PDFJS.Util.inherit() when it becomes available
+var BasePdfManager = (function BasePdfManagerClosure() {
+  function BasePdfManager() {
+    throw new Error('Cannot initialize BaseManagerManager');
+  }
+
+  BasePdfManager.prototype = {
+    onLoadedStream: function BasePdfManager_onLoadedStream() {
+      throw new NotImplementedException();
+    },
+
+    ensureDoc: function BasePdfManager_ensureDoc(prop, args) {
+      return this.ensure(this.pdfDocument, prop, args);
+    },
+
+    ensureXRef: function BasePdfManager_ensureXRef(prop, args) {
+      return this.ensure(this.pdfDocument.xref, prop, args);
+    },
+
+    ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {
+      return this.ensure(this.pdfDocument.catalog, prop, args);
+    },
+
+    getPage: function BasePdfManager_pagePage(pageIndex) {
+      return this.pdfDocument.getPage(pageIndex);
+    },
+
+    cleanup: function BasePdfManager_cleanup() {
+      return this.pdfDocument.cleanup();
+    },
+
+    ensure: function BasePdfManager_ensure(obj, prop, args) {
+      return new NotImplementedException();
+    },
+
+    requestRange: function BasePdfManager_ensure(begin, end) {
+      return new NotImplementedException();
+    },
+
+    requestLoadedStream: function BasePdfManager_requestLoadedStream() {
+      return new NotImplementedException();
+    },
+
+    updatePassword: function BasePdfManager_updatePassword(password) {
+      this.pdfDocument.xref.password = this.password = password;
+      if (this.passwordChangedPromise) {
+        this.passwordChangedPromise.resolve();
+      }
+    },
+
+    terminate: function BasePdfManager_terminate() {
+      return new NotImplementedException();
+    }
+  };
+
+  return BasePdfManager;
+})();
+
+var LocalPdfManager = (function LocalPdfManagerClosure() {
+  function LocalPdfManager(data, password) {
+    var stream = new Stream(data);
+    this.pdfDocument = new PDFDocument(this, stream, password);
+    this.loadedStream = new LegacyPromise();
+    this.loadedStream.resolve(stream);
+  }
+
+  LocalPdfManager.prototype = Object.create(BasePdfManager.prototype);
+  LocalPdfManager.prototype.constructor = LocalPdfManager;
+
+  LocalPdfManager.prototype.ensure =
+      function LocalPdfManager_ensure(obj, prop, args) {
+    var promise = new LegacyPromise();
+    try {
+      var value = obj[prop];
+      var result;
+      if (typeof(value) === 'function') {
+        result = value.apply(obj, args);
+      } else {
+        result = value;
+      }
+      promise.resolve(result);
+    } catch (e) {
+      console.log(e.stack);
+      promise.reject(e);
+    }
+    return promise;
+  };
+
+  LocalPdfManager.prototype.requestRange =
+      function LocalPdfManager_requestRange(begin, end) {
+    var promise = new LegacyPromise();
+    promise.resolve();
+    return promise;
+  };
+
+  LocalPdfManager.prototype.requestLoadedStream =
+      function LocalPdfManager_requestLoadedStream() {
+  };
+
+  LocalPdfManager.prototype.onLoadedStream =
+      function LocalPdfManager_getLoadedStream() {
+    return this.loadedStream;
+  };
+
+  LocalPdfManager.prototype.terminate =
+      function LocalPdfManager_terminate() {
+    return;
+  };
+
+  return LocalPdfManager;
+})();
+
+var NetworkPdfManager = (function NetworkPdfManagerClosure() {
+  function NetworkPdfManager(args, msgHandler) {
+
+    this.msgHandler = msgHandler;
+
+    var params = {
+      msgHandler: msgHandler,
+      httpHeaders: args.httpHeaders,
+      withCredentials: args.withCredentials,
+      chunkedViewerLoading: args.chunkedViewerLoading,
+      disableAutoFetch: args.disableAutoFetch,
+      initialData: args.initialData
+    };
+    this.streamManager = new ChunkedStreamManager(args.length, RANGE_CHUNK_SIZE,
+                                                  args.url, params);
+
+    this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
+                                    args.password);
+  }
+
+  NetworkPdfManager.prototype = Object.create(BasePdfManager.prototype);
+  NetworkPdfManager.prototype.constructor = NetworkPdfManager;
+
+  NetworkPdfManager.prototype.ensure =
+      function NetworkPdfManager_ensure(obj, prop, args) {
+    var promise = new LegacyPromise();
+    this.ensureHelper(promise, obj, prop, args);
+    return promise;
+  };
+
+  NetworkPdfManager.prototype.ensureHelper =
+      function NetworkPdfManager_ensureHelper(promise, obj, prop, args) {
+    try {
+      var result;
+      var value = obj[prop];
+      if (typeof(value) === 'function') {
+        result = value.apply(obj, args);
+      } else {
+        result = value;
+      }
+      promise.resolve(result);
+    } catch(e) {
+      if (!(e instanceof MissingDataException)) {
+        console.log(e.stack);
+        promise.reject(e);
+        return;
+      }
+
+      this.streamManager.requestRange(e.begin, e.end, function() {
+        this.ensureHelper(promise, obj, prop, args);
+      }.bind(this));
+    }
+  };
+
+  NetworkPdfManager.prototype.requestRange =
+      function NetworkPdfManager_requestRange(begin, end) {
+    var promise = new LegacyPromise();
+    this.streamManager.requestRange(begin, end, function() {
+      promise.resolve();
+    });
+    return promise;
+  };
+
+  NetworkPdfManager.prototype.requestLoadedStream =
+      function NetworkPdfManager_requestLoadedStream() {
+    this.streamManager.requestAllChunks();
+  };
+
+  NetworkPdfManager.prototype.onLoadedStream =
+      function NetworkPdfManager_getLoadedStream() {
+    return this.streamManager.onLoadedStream();
+  };
+
+  NetworkPdfManager.prototype.terminate =
+      function NetworkPdfManager_terminate() {
+    this.streamManager.networkManager.abortAllRequests();
+  };
+
+  return NetworkPdfManager;
+})();
+
+
+
+var Page = (function PageClosure() {
+
+  var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
+
+  function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) {
+    this.pdfManager = pdfManager;
+    this.pageIndex = pageIndex;
+    this.pageDict = pageDict;
+    this.xref = xref;
+    this.ref = ref;
+    this.fontCache = fontCache;
+    this.idCounters = {
+      obj: 0
+    };
+    this.resourcesPromise = null;
+  }
+
+  Page.prototype = {
+    getPageProp: function Page_getPageProp(key) {
+      return this.pageDict.get(key);
+    },
+
+    getInheritedPageProp: function Page_inheritPageProp(key) {
+      var dict = this.pageDict;
+      var value = dict.get(key);
+      while (value === undefined) {
+        dict = dict.get('Parent');
+        if (!dict) {
+          break;
+        }
+        value = dict.get(key);
+      }
+      return value;
+    },
+
+    get content() {
+      return this.getPageProp('Contents');
+    },
+
+    get resources() {
+      var value = this.getInheritedPageProp('Resources');
+      // For robustness: The spec states that a \Resources entry has to be
+      // present, but can be empty. Some document omit it still. In this case
+      // return an empty dictionary:
+      if (value === undefined) {
+        value = Dict.empty;
+      }
+      return shadow(this, 'resources', value);
+    },
+
+    get mediaBox() {
+      var obj = this.getInheritedPageProp('MediaBox');
+      // Reset invalid media box to letter size.
+      if (!isArray(obj) || obj.length !== 4) {
+        obj = LETTER_SIZE_MEDIABOX;
+      }
+      return shadow(this, 'mediaBox', obj);
+    },
+
+    get view() {
+      var mediaBox = this.mediaBox;
+      var cropBox = this.getInheritedPageProp('CropBox');
+      if (!isArray(cropBox) || cropBox.length !== 4) {
+        return shadow(this, 'view', mediaBox);
+      }
+
+      // From the spec, 6th ed., p.963:
+      // "The crop, bleed, trim, and art boxes should not ordinarily
+      // extend beyond the boundaries of the media box. If they do, they are
+      // effectively reduced to their intersection with the media box."
+      cropBox = Util.intersect(cropBox, mediaBox);
+      if (!cropBox) {
+        return shadow(this, 'view', mediaBox);
+      }
+      return shadow(this, 'view', cropBox);
+    },
+
+    get annotationRefs() {
+      return shadow(this, 'annotationRefs',
+                    this.getInheritedPageProp('Annots'));
+    },
+
+    get rotate() {
+      var rotate = this.getInheritedPageProp('Rotate') || 0;
+      // Normalize rotation so it's a multiple of 90 and between 0 and 270
+      if (rotate % 90 !== 0) {
+        rotate = 0;
+      } else if (rotate >= 360) {
+        rotate = rotate % 360;
+      } else if (rotate < 0) {
+        // The spec doesn't cover negatives, assume its counterclockwise
+        // rotation. The following is the other implementation of modulo.
+        rotate = ((rotate % 360) + 360) % 360;
+      }
+      return shadow(this, 'rotate', rotate);
+    },
+
+    getContentStream: function Page_getContentStream() {
+      var content = this.content;
+      var stream;
+      if (isArray(content)) {
+        // fetching items
+        var xref = this.xref;
+        var i, n = content.length;
+        var streams = [];
+        for (i = 0; i < n; ++i) {
+          streams.push(xref.fetchIfRef(content[i]));
+        }
+        stream = new StreamsSequenceStream(streams);
+      } else if (isStream(content)) {
+        stream = content;
+      } else {
+        // replacing non-existent page content with empty one
+        stream = new NullStream();
+      }
+      return stream;
+    },
+
+    loadResources: function(keys) {
+      if (!this.resourcesPromise) {
+        // TODO: add async getInheritedPageProp and remove this.
+        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');
+      }
+      var promise = new LegacyPromise();
+      this.resourcesPromise.then(function resourceSuccess() {
+        var objectLoader = new ObjectLoader(this.resources.map,
+                                            keys,
+                                            this.xref);
+        objectLoader.load().then(function objectLoaderSuccess() {
+          promise.resolve();
+        });
+      }.bind(this));
+      return promise;
+    },
+
+    getOperatorList: function Page_getOperatorList(handler, intent) {
+      var self = this;
+      var promise = new LegacyPromise();
+
+      function reject(e) {
+        promise.reject(e);
+      }
+
+      var pageListPromise = new LegacyPromise();
+
+      var pdfManager = this.pdfManager;
+      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
+                                                   []);
+      var resourcesPromise = this.loadResources([
+        'ExtGState',
+        'ColorSpace',
+        'Pattern',
+        'Shading',
+        'XObject',
+        'Font'
+        // ProcSet
+        // Properties
+      ]);
+
+      var partialEvaluator = new PartialEvaluator(pdfManager, this.xref,
+                                                  handler, this.pageIndex,
+                                                  'p' + this.pageIndex + '_',
+                                                  this.idCounters,
+                                                  this.fontCache);
+
+      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise],
+                                     reject);
+      dataPromises.then(function(data) {
+        var contentStream = data[0];
+        var opList = new OperatorList(intent, handler, self.pageIndex);
+
+        handler.send('StartRenderPage', {
+          transparency: partialEvaluator.hasBlendModes(self.resources),
+          pageIndex: self.pageIndex,
+          intent: intent
+        });
+        partialEvaluator.getOperatorList(contentStream, self.resources, opList);
+        pageListPromise.resolve(opList);
+      });
+
+      var annotationsPromise = pdfManager.ensure(this, 'annotations');
+      Promise.all([pageListPromise, annotationsPromise]).then(function(datas) {
+        var pageOpList = datas[0];
+        var annotations = datas[1];
+
+        if (annotations.length === 0) {
+          pageOpList.flush(true);
+          promise.resolve(pageOpList);
+          return;
+        }
+
+        var annotationsReadyPromise = Annotation.appendToOperatorList(
+          annotations, pageOpList, pdfManager, partialEvaluator, intent);
+        annotationsReadyPromise.then(function () {
+          pageOpList.flush(true);
+          promise.resolve(pageOpList);
+        }, reject);
+      }, reject);
+
+      return promise;
+    },
+
+    extractTextContent: function Page_extractTextContent() {
+      var handler = {
+        on: function nullHandlerOn() {},
+        send: function nullHandlerSend() {}
+      };
+
+      var self = this;
+
+      var pdfManager = this.pdfManager;
+      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
+                                                   []);
+
+      var resourcesPromise = this.loadResources([
+        'ExtGState',
+        'XObject',
+        'Font'
+      ]);
+
+      var dataPromises = Promise.all([contentStreamPromise,
+                                      resourcesPromise]);
+      return dataPromises.then(function(data) {
+        var contentStream = data[0];
+        var partialEvaluator = new PartialEvaluator(pdfManager, self.xref,
+                                                    handler, self.pageIndex,
+                                                    'p' + self.pageIndex + '_',
+                                                    self.idCounters,
+                                                    self.fontCache);
+
+        return partialEvaluator.getTextContent(contentStream,
+                                               self.resources);
+      });
+    },
+
+    getAnnotationsData: function Page_getAnnotationsData() {
+      var annotations = this.annotations;
+      var annotationsData = [];
+      for (var i = 0, n = annotations.length; i < n; ++i) {
+        annotationsData.push(annotations[i].getData());
+      }
+      return annotationsData;
+    },
+
+    get annotations() {
+      var annotations = [];
+      var annotationRefs = (this.annotationRefs || []);
+      for (var i = 0, n = annotationRefs.length; i < n; ++i) {
+        var annotationRef = annotationRefs[i];
+        var annotation = Annotation.fromRef(this.xref, annotationRef);
+        if (annotation) {
+          annotations.push(annotation);
+        }
+      }
+      return shadow(this, 'annotations', annotations);
+    }
+  };
+
+  return Page;
+})();
+
+/**
+ * The `PDFDocument` holds all the data of the PDF file. Compared to the
+ * `PDFDoc`, this one doesn't have any job management code.
+ * Right now there exists one PDFDocument on the main thread + one object
+ * for each worker. If there is no worker support enabled, there are two
+ * `PDFDocument` objects on the main thread created.
+ */
+var PDFDocument = (function PDFDocumentClosure() {
+  function PDFDocument(pdfManager, arg, password) {
+    if (isStream(arg)) {
+      init.call(this, pdfManager, arg, password);
+    } else if (isArrayBuffer(arg)) {
+      init.call(this, pdfManager, new Stream(arg), password);
+    } else {
+      error('PDFDocument: Unknown argument type');
+    }
+  }
+
+  function init(pdfManager, stream, password) {
+    assert(stream.length > 0, 'stream must have data');
+    this.pdfManager = pdfManager;
+    this.stream = stream;
+    var xref = new XRef(this.stream, password, pdfManager);
+    this.xref = xref;
+  }
+
+  function find(stream, needle, limit, backwards) {
+    var pos = stream.pos;
+    var end = stream.end;
+    var strBuf = [];
+    if (pos + limit > end) {
+      limit = end - pos;
+    }
+    for (var n = 0; n < limit; ++n) {
+      strBuf.push(String.fromCharCode(stream.getByte()));
+    }
+    var str = strBuf.join('');
+    stream.pos = pos;
+    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
+    if (index == -1) {
+      return false; /* not found */
+    }
+    stream.pos += index;
+    return true; /* found */
+  }
+
+  var DocumentInfoValidators = {
+    get entries() {
+      // Lazily build this since all the validation functions below are not
+      // defined until after this file loads.
+      return shadow(this, 'entries', {
+        Title: isString,
+        Author: isString,
+        Subject: isString,
+        Keywords: isString,
+        Creator: isString,
+        Producer: isString,
+        CreationDate: isString,
+        ModDate: isString,
+        Trapped: isName
+      });
+    }
+  };
+
+  PDFDocument.prototype = {
+    parse: function PDFDocument_parse(recoveryMode) {
+      this.setup(recoveryMode);
+      try {
+        // checking if AcroForm is present
+        this.acroForm = this.catalog.catDict.get('AcroForm');
+        if (this.acroForm) {
+          this.xfa = this.acroForm.get('XFA');
+          var fields = this.acroForm.get('Fields');
+          if ((!fields || !isArray(fields) || fields.length === 0) &&
+              !this.xfa) {
+            // no fields and no XFA -- not a form (?)
+            this.acroForm = null;
+          }
+        }
+      } catch (ex) {
+        info('Something wrong with AcroForm entry');
+        this.acroForm = null;
+      }
+    },
+
+    get linearization() {
+      var length = this.stream.length;
+      var linearization = false;
+      if (length) {
+        try {
+          linearization = new Linearization(this.stream);
+          if (linearization.length != length) {
+            linearization = false;
+          }
+        } catch (err) {
+          if (err instanceof MissingDataException) {
+            throw err;
+          }
+
+          info('The linearization data is not available ' +
+               'or unreadable PDF data is found');
+          linearization = false;
+        }
+      }
+      // shadow the prototype getter with a data property
+      return shadow(this, 'linearization', linearization);
+    },
+    get startXRef() {
+      var stream = this.stream;
+      var startXRef = 0;
+      var linearization = this.linearization;
+      if (linearization) {
+        // Find end of first obj.
+        stream.reset();
+        if (find(stream, 'endobj', 1024)) {
+          startXRef = stream.pos + 6;
+        }
+      } else {
+        // Find startxref by jumping backward from the end of the file.
+        var step = 1024;
+        var found = false, pos = stream.end;
+        while (!found && pos > 0) {
+          pos -= step - 'startxref'.length;
+          if (pos < 0) {
+            pos = 0;
+          }
+          stream.pos = pos;
+          found = find(stream, 'startxref', step, true);
+        }
+        if (found) {
+          stream.skip(9);
+          var ch;
+          do {
+            ch = stream.getByte();
+          } while (Lexer.isSpace(ch));
+          var str = '';
+          while (ch >= 0x20 && ch <= 0x39) { // < '9'
+            str += String.fromCharCode(ch);
+            ch = stream.getByte();
+          }
+          startXRef = parseInt(str, 10);
+          if (isNaN(startXRef)) {
+            startXRef = 0;
+          }
+        }
+      }
+      // shadow the prototype getter with a data property
+      return shadow(this, 'startXRef', startXRef);
+    },
+    get mainXRefEntriesOffset() {
+      var mainXRefEntriesOffset = 0;
+      var linearization = this.linearization;
+      if (linearization) {
+        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
+      }
+      // shadow the prototype getter with a data property
+      return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
+    },
+    // Find the header, remove leading garbage and setup the stream
+    // starting from the header.
+    checkHeader: function PDFDocument_checkHeader() {
+      var stream = this.stream;
+      stream.reset();
+      if (find(stream, '%PDF-', 1024)) {
+        // Found the header, trim off any garbage before it.
+        stream.moveStart();
+        // Reading file format version
+        var MAX_VERSION_LENGTH = 12;
+        var version = '', ch;
+        while ((ch = stream.getByte()) > 0x20) { // SPACE
+          if (version.length >= MAX_VERSION_LENGTH) {
+            break;
+          }
+          version += String.fromCharCode(ch);
+        }
+        // removing "%PDF-"-prefix
+        this.pdfFormatVersion = version.substring(5);
+        return;
+      }
+      // May not be a PDF file, continue anyway.
+    },
+    parseStartXRef: function PDFDocument_parseStartXRef() {
+      var startXRef = this.startXRef;
+      this.xref.setStartXRef(startXRef);
+    },
+    setup: function PDFDocument_setup(recoveryMode) {
+      this.xref.parse(recoveryMode);
+      this.catalog = new Catalog(this.pdfManager, this.xref);
+    },
+    get numPages() {
+      var linearization = this.linearization;
+      var num = linearization ? linearization.numPages : this.catalog.numPages;
+      // shadow the prototype getter
+      return shadow(this, 'numPages', num);
+    },
+    get documentInfo() {
+      var docInfo = {
+        PDFFormatVersion: this.pdfFormatVersion,
+        IsAcroFormPresent: !!this.acroForm,
+        IsXFAPresent: !!this.xfa
+      };
+      var infoDict;
+      try {
+        infoDict = this.xref.trailer.get('Info');
+      } catch (err) {
+        info('The document information dictionary is invalid.');
+      }
+      if (infoDict) {
+        var validEntries = DocumentInfoValidators.entries;
+        // Only fill the document info with valid entries from the spec.
+        for (var key in validEntries) {
+          if (infoDict.has(key)) {
+            var value = infoDict.get(key);
+            // Make sure the value conforms to the spec.
+            if (validEntries[key](value)) {
+              docInfo[key] = (typeof value !== 'string' ?
+                              value : stringToPDFString(value));
+            } else {
+              info('Bad value in document info for "' + key + '"');
+            }
+          }
+        }
+      }
+      return shadow(this, 'documentInfo', docInfo);
+    },
+    get fingerprint() {
+      var xref = this.xref, hash, fileID = '';
+
+      if (xref.trailer.has('ID')) {
+        hash = stringToBytes(xref.trailer.get('ID')[0]);
+      } else {
+        hash = calculateMD5(this.stream.bytes.subarray(0, 100), 0, 100);
+      }
+
+      for (var i = 0, n = hash.length; i < n; i++) {
+        fileID += hash[i].toString(16);
+      }
+
+      return shadow(this, 'fingerprint', fileID);
+    },
+
+    getPage: function PDFDocument_getPage(pageIndex) {
+      return this.catalog.getPage(pageIndex);
+    },
+
+    cleanup: function PDFDocument_cleanup() {
+      return this.catalog.cleanup();
+    }
+  };
+
+  return PDFDocument;
+})();
+
+
+
+var Name = (function NameClosure() {
+  function Name(name) {
+    this.name = name;
+  }
+
+  Name.prototype = {};
+
+  var nameCache = {};
+
+  Name.get = function Name_get(name) {
+    var nameValue = nameCache[name];
+    return (nameValue ? nameValue : (nameCache[name] = new Name(name)));
+  };
+
+  return Name;
+})();
+
+var Cmd = (function CmdClosure() {
+  function Cmd(cmd) {
+    this.cmd = cmd;
+  }
+
+  Cmd.prototype = {};
+
+  var cmdCache = {};
+
+  Cmd.get = function Cmd_get(cmd) {
+    var cmdValue = cmdCache[cmd];
+    return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd)));
+  };
+
+  return Cmd;
+})();
+
+var Dict = (function DictClosure() {
+  var nonSerializable = function nonSerializableClosure() {
+    return nonSerializable; // creating closure on some variable
+  };
+
+  var GETALL_DICTIONARY_TYPES_WHITELIST = {
+    'Background': true,
+    'ExtGState': true,
+    'Halftone': true,
+    'Layout': true,
+    'Mask': true,
+    'Pagination': true,
+    'Printing': true
+  };
+
+  function isRecursionAllowedFor(dict) {
+    if (!isName(dict.Type)) {
+      return true;
+    }
+    var dictType = dict.Type.name;
+    return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true;
+  }
+
+  // xref is optional
+  function Dict(xref) {
+    // Map should only be used internally, use functions below to access.
+    this.map = Object.create(null);
+    this.xref = xref;
+    this.objId = null;
+    this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict
+  }
+
+  Dict.prototype = {
+    assignXref: function Dict_assignXref(newXref) {
+      this.xref = newXref;
+    },
+
+    // automatically dereferences Ref objects
+    get: function Dict_get(key1, key2, key3) {
+      var value;
+      var xref = this.xref;
+      if (typeof (value = this.map[key1]) != 'undefined' || key1 in this.map ||
+          typeof key2 == 'undefined') {
+        return xref ? xref.fetchIfRef(value) : value;
+      }
+      if (typeof (value = this.map[key2]) != 'undefined' || key2 in this.map ||
+          typeof key3 == 'undefined') {
+        return xref ? xref.fetchIfRef(value) : value;
+      }
+      value = this.map[key3] || null;
+      return xref ? xref.fetchIfRef(value) : value;
+    },
+
+    // Same as get(), but returns a promise and uses fetchIfRefAsync().
+    getAsync: function Dict_getAsync(key1, key2, key3) {
+      var value;
+      var promise;
+      var xref = this.xref;
+      if (typeof (value = this.map[key1]) !== undefined || key1 in this.map ||
+          typeof key2 === undefined) {
+        if (xref) {
+          return xref.fetchIfRefAsync(value);
+        }
+        promise = new LegacyPromise();
+        promise.resolve(value);
+        return promise;
+      }
+      if (typeof (value = this.map[key2]) !== undefined || key2 in this.map ||
+          typeof key3 === undefined) {
+        if (xref) {
+          return xref.fetchIfRefAsync(value);
+        }
+        promise = new LegacyPromise();
+        promise.resolve(value);
+        return promise;
+      }
+      value = this.map[key3] || null;
+      if (xref) {
+        return xref.fetchIfRefAsync(value);
+      }
+      promise = new LegacyPromise();
+      promise.resolve(value);
+      return promise;
+    },
+
+    // no dereferencing
+    getRaw: function Dict_getRaw(key) {
+      return this.map[key];
+    },
+
+    // creates new map and dereferences all Refs
+    getAll: function Dict_getAll() {
+      var all = Object.create(null);
+      var queue = null;
+      var key, obj;
+      for (key in this.map) {
+        obj = this.get(key);
+        if (obj instanceof Dict) {
+          if (isRecursionAllowedFor(obj)) {
+            (queue || (queue = [])).push({target: all, key: key, obj: obj});
+          } else {
+            all[key] = this.getRaw(key);
+          }
+        } else {
+          all[key] = obj;
+        }
+      }
+      if (!queue) {
+        return all;
+      }
+
+      // trying to take cyclic references into the account
+      var processed = Object.create(null);
+      while (queue.length > 0) {
+        var item = queue.shift();
+        var itemObj = item.obj;
+        var objId = itemObj.objId;
+        if (objId && objId in processed) {
+          item.target[item.key] = processed[objId];
+          continue;
+        }
+        var dereferenced = Object.create(null);
+        for (key in itemObj.map) {
+          obj = itemObj.get(key);
+          if (obj instanceof Dict) {
+            if (isRecursionAllowedFor(obj)) {
+              queue.push({target: dereferenced, key: key, obj: obj});
+            } else {
+              dereferenced[key] = itemObj.getRaw(key);
+            }
+          } else {
+            dereferenced[key] = obj;
+          }
+        }
+        if (objId) {
+          processed[objId] = dereferenced;
+        }
+        item.target[item.key] = dereferenced;
+      }
+      return all;
+    },
+
+    set: function Dict_set(key, value) {
+      this.map[key] = value;
+    },
+
+    has: function Dict_has(key) {
+      return key in this.map;
+    },
+
+    forEach: function Dict_forEach(callback) {
+      for (var key in this.map) {
+        callback(key, this.get(key));
+      }
+    }
+  };
+
+  Dict.empty = new Dict(null);
+
+  return Dict;
+})();
+
+var Ref = (function RefClosure() {
+  function Ref(num, gen) {
+    this.num = num;
+    this.gen = gen;
+  }
+
+  Ref.prototype = {};
+
+  return Ref;
+})();
+
+// The reference is identified by number and generation.
+// This structure stores only one instance of the reference.
+var RefSet = (function RefSetClosure() {
+  function RefSet() {
+    this.dict = {};
+  }
+
+  RefSet.prototype = {
+    has: function RefSet_has(ref) {
+      return ('R' + ref.num + '.' + ref.gen) in this.dict;
+    },
+
+    put: function RefSet_put(ref) {
+      this.dict['R' + ref.num + '.' + ref.gen] = true;
+    },
+
+    remove: function RefSet_remove(ref) {
+      delete this.dict['R' + ref.num + '.' + ref.gen];
+    }
+  };
+
+  return RefSet;
+})();
+
+var RefSetCache = (function RefSetCacheClosure() {
+  function RefSetCache() {
+    this.dict = Object.create(null);
+  }
+
+  RefSetCache.prototype = {
+    get: function RefSetCache_get(ref) {
+      return this.dict['R' + ref.num + '.' + ref.gen];
+    },
+
+    has: function RefSetCache_has(ref) {
+      return ('R' + ref.num + '.' + ref.gen) in this.dict;
+    },
+
+    put: function RefSetCache_put(ref, obj) {
+      this.dict['R' + ref.num + '.' + ref.gen] = obj;
+    },
+
+    putAlias: function RefSetCache_putAlias(ref, aliasRef) {
+      this.dict['R' + ref.num + '.' + ref.gen] = this.get(aliasRef);
+    },
+
+    forEach: function RefSetCache_forEach(fn, thisArg) {
+      for (var i in this.dict) {
+        fn.call(thisArg, this.dict[i]);
+      }
+    },
+
+    clear: function RefSetCache_clear() {
+      this.dict = Object.create(null);
+    }
+  };
+
+  return RefSetCache;
+})();
+
+var Catalog = (function CatalogClosure() {
+  function Catalog(pdfManager, xref) {
+    this.pdfManager = pdfManager;
+    this.xref = xref;
+    this.catDict = xref.getCatalogObj();
+    this.fontCache = new RefSetCache();
+    assert(isDict(this.catDict),
+      'catalog object is not a dictionary');
+
+    this.pagePromises = [];
+  }
+
+  Catalog.prototype = {
+    get metadata() {
+      var streamRef = this.catDict.getRaw('Metadata');
+      if (!isRef(streamRef)) {
+        return shadow(this, 'metadata', null);
+      }
+
+      var encryptMetadata = (!this.xref.encrypt ? false :
+                             this.xref.encrypt.encryptMetadata);
+
+      var stream = this.xref.fetch(streamRef, !encryptMetadata);
+      var metadata;
+      if (stream && isDict(stream.dict)) {
+        var type = stream.dict.get('Type');
+        var subtype = stream.dict.get('Subtype');
+
+        if (isName(type) && isName(subtype) &&
+            type.name === 'Metadata' && subtype.name === 'XML') {
+          // XXX: This should examine the charset the XML document defines,
+          // however since there are currently no real means to decode
+          // arbitrary charsets, let's just hope that the author of the PDF
+          // was reasonable enough to stick with the XML default charset,
+          // which is UTF-8.
+          try {
+            metadata = stringToUTF8String(bytesToString(stream.getBytes()));
+          } catch (e) {
+            info('Skipping invalid metadata.');
+          }
+        }
+      }
+
+      return shadow(this, 'metadata', metadata);
+    },
+    get toplevelPagesDict() {
+      var pagesObj = this.catDict.get('Pages');
+      assert(isDict(pagesObj), 'invalid top-level pages dictionary');
+      // shadow the prototype getter
+      return shadow(this, 'toplevelPagesDict', pagesObj);
+    },
+    get documentOutline() {
+      var obj = null;
+      try {
+        obj = this.readDocumentOutline();
+      } catch (ex) {
+        if (ex instanceof MissingDataException) {
+          throw ex;
+        }
+        warn('Unable to read document outline');
+      }
+      return shadow(this, 'documentOutline', obj);
+    },
+    readDocumentOutline: function Catalog_readDocumentOutline() {
+      var xref = this.xref;
+      var obj = this.catDict.get('Outlines');
+      var root = { items: [] };
+      if (isDict(obj)) {
+        obj = obj.getRaw('First');
+        var processed = new RefSet();
+        if (isRef(obj)) {
+          var queue = [{obj: obj, parent: root}];
+          // to avoid recursion keeping track of the items
+          // in the processed dictionary
+          processed.put(obj);
+          while (queue.length > 0) {
+            var i = queue.shift();
+            var outlineDict = xref.fetchIfRef(i.obj);
+            if (outlineDict === null) {
+              continue;
+            }
+            if (!outlineDict.has('Title')) {
+              error('Invalid outline item');
+            }
+            var dest = outlineDict.get('A');
+            if (dest) {
+              dest = dest.get('D');
+            } else if (outlineDict.has('Dest')) {
+              dest = outlineDict.getRaw('Dest');
+              if (isName(dest)) {
+                dest = dest.name;
+              }
+            }
+            var title = outlineDict.get('Title');
+            var outlineItem = {
+              dest: dest,
+              title: stringToPDFString(title),
+              color: outlineDict.get('C') || [0, 0, 0],
+              count: outlineDict.get('Count'),
+              bold: !!(outlineDict.get('F') & 2),
+              italic: !!(outlineDict.get('F') & 1),
+              items: []
+            };
+            i.parent.items.push(outlineItem);
+            obj = outlineDict.getRaw('First');
+            if (isRef(obj) && !processed.has(obj)) {
+              queue.push({obj: obj, parent: outlineItem});
+              processed.put(obj);
+            }
+            obj = outlineDict.getRaw('Next');
+            if (isRef(obj) && !processed.has(obj)) {
+              queue.push({obj: obj, parent: i.parent});
+              processed.put(obj);
+            }
+          }
+        }
+      }
+      return (root.items.length > 0 ? root.items : null);
+    },
+    get numPages() {
+      var obj = this.toplevelPagesDict.get('Count');
+      assert(
+        isInt(obj),
+        'page count in top level pages object is not an integer'
+      );
+      // shadow the prototype getter
+      return shadow(this, 'num', obj);
+    },
+    get destinations() {
+      function fetchDestination(dest) {
+        return isDict(dest) ? dest.get('D') : dest;
+      }
+
+      var xref = this.xref;
+      var dests = {}, nameTreeRef, nameDictionaryRef;
+      var obj = this.catDict.get('Names');
+      if (obj) {
+        nameTreeRef = obj.getRaw('Dests');
+      } else if (this.catDict.has('Dests')) {
+        nameDictionaryRef = this.catDict.get('Dests');
+      }
+
+      if (nameDictionaryRef) {
+        // reading simple destination dictionary
+        obj = nameDictionaryRef;
+        obj.forEach(function catalogForEach(key, value) {
+          if (!value) {
+            return;
+          }
+          dests[key] = fetchDestination(value);
+        });
+      }
+      if (nameTreeRef) {
+        var nameTree = new NameTree(nameTreeRef, xref);
+        var names = nameTree.getAll();
+        for (var name in names) {
+          if (!names.hasOwnProperty(name)) {
+            continue;
+          }
+          dests[name] = fetchDestination(names[name]);
+        }
+      }
+      return shadow(this, 'destinations', dests);
+    },
+    get attachments() {
+      var xref = this.xref;
+      var attachments, nameTreeRef;
+      var obj = this.catDict.get('Names');
+      if (obj) {
+        nameTreeRef = obj.getRaw('EmbeddedFiles');
+      }
+
+      if (nameTreeRef) {
+        var nameTree = new NameTree(nameTreeRef, xref);
+        var names = nameTree.getAll();
+        for (var name in names) {
+          if (!names.hasOwnProperty(name)) {
+            continue;
+          }
+          var fs = new FileSpec(names[name], xref);
+          if (!attachments) {
+            attachments = {};
+          }
+          attachments[stringToPDFString(name)] = fs.serializable;
+        }
+      }
+      return shadow(this, 'attachments', attachments);
+    },
+    get javaScript() {
+      var xref = this.xref;
+      var obj = this.catDict.get('Names');
+
+      var javaScript = [];
+      if (obj && obj.has('JavaScript')) {
+        var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);
+        var names = nameTree.getAll();
+        for (var name in names) {
+          if (!names.hasOwnProperty(name)) {
+            continue;
+          }
+          // We don't really use the JavaScript right now. This code is
+          // defensive so we don't cause errors on document load.
+          var jsDict = names[name];
+          if (!isDict(jsDict)) {
+            continue;
+          }
+          var type = jsDict.get('S');
+          if (!isName(type) || type.name !== 'JavaScript') {
+            continue;
+          }
+          var js = jsDict.get('JS');
+          if (!isString(js) && !isStream(js)) {
+            continue;
+          }
+          if (isStream(js)) {
+            js = bytesToString(js.getBytes());
+          }
+          javaScript.push(stringToPDFString(js));
+        }
+      }
+      return shadow(this, 'javaScript', javaScript);
+    },
+
+    cleanup: function Catalog_cleanup() {
+      this.fontCache.forEach(function (font) {
+        delete font.sent;
+        delete font.translated;
+      });
+      this.fontCache.clear();
+    },
+
+    getPage: function Catalog_getPage(pageIndex) {
+      if (!(pageIndex in this.pagePromises)) {
+        this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(
+          function (a) {
+            var dict = a[0];
+            var ref = a[1];
+            return new Page(this.pdfManager, this.xref, pageIndex, dict, ref,
+                            this.fontCache);
+          }.bind(this)
+        );
+      }
+      return this.pagePromises[pageIndex];
+    },
+
+    getPageDict: function Catalog_getPageDict(pageIndex) {
+      var promise = new LegacyPromise();
+      var nodesToVisit = [this.catDict.getRaw('Pages')];
+      var currentPageIndex = 0;
+      var xref = this.xref;
+
+      function next() {
+        while (nodesToVisit.length) {
+          var currentNode = nodesToVisit.pop();
+
+          if (isRef(currentNode)) {
+            xref.fetchAsync(currentNode).then(function (obj) {
+              if ((isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids')))) {
+                if (pageIndex === currentPageIndex) {
+                  promise.resolve([obj, currentNode]);
+                } else {
+                  currentPageIndex++;
+                  next();
+                }
+                return;
+              }
+              nodesToVisit.push(obj);
+              next();
+            }.bind(this), promise.reject.bind(promise));
+            return;
+          }
+
+          // must be a child page dictionary
+          assert(
+            isDict(currentNode),
+            'page dictionary kid reference points to wrong type of object'
+          );
+          var count = currentNode.get('Count');
+          // Skip nodes where the page can't be.
+          if (currentPageIndex + count <= pageIndex) {
+            currentPageIndex += count;
+            continue;
+          }
+
+          var kids = currentNode.get('Kids');
+          assert(isArray(kids), 'page dictionary kids object is not an array');
+          if (count === kids.length) {
+            // Nodes that don't have the page have been skipped and this is the
+            // bottom of the tree which means the page requested must be a
+            // descendant of this pages node. Ideally we would just resolve the
+            // promise with the page ref here, but there is the case where more
+            // pages nodes could link to single a page (see issue 3666 pdf). To
+            // handle this push it back on the queue so if it is a pages node it
+            // will be descended into.
+            nodesToVisit = [kids[pageIndex - currentPageIndex]];
+            currentPageIndex = pageIndex;
+            continue;
+          } else {
+            for (var last = kids.length - 1; last >= 0; last--) {
+              nodesToVisit.push(kids[last]);
+            }
+          }
+        }
+        promise.reject('Page index ' + pageIndex + ' not found.');
+      }
+      next();
+      return promise;
+    },
+
+    getPageIndex: function Catalog_getPageIndex(ref) {
+      // The page tree nodes have the count of all the leaves below them. To get
+      // how many pages are before we just have to walk up the tree and keep
+      // adding the count of siblings to the left of the node.
+      var xref = this.xref;
+      function pagesBeforeRef(kidRef) {
+        var total = 0;
+        var parentRef;
+        return xref.fetchAsync(kidRef).then(function (node) {
+          if (!node) {
+            return null;
+          }
+          parentRef = node.getRaw('Parent');
+          return node.getAsync('Parent');
+        }).then(function (parent) {
+          if (!parent) {
+            return null;
+          }
+          return parent.getAsync('Kids');
+        }).then(function (kids) {
+          if (!kids) {
+            return null;
+          }
+          var kidPromises = [];
+          var found = false;
+          for (var i = 0; i < kids.length; i++) {
+            var kid = kids[i];
+            assert(isRef(kid), 'kids must be a ref');
+            if (kid.num == kidRef.num) {
+              found = true;
+              break;
+            }
+            kidPromises.push(xref.fetchAsync(kid).then(function (kid) {
+              if (kid.has('Count')) {
+                var count = kid.get('Count');
+                total += count;
+              } else { // page leaf node
+                total++;
+              }
+            }));
+          }
+          if (!found) {
+            error('kid ref not found in parents kids');
+          }
+          return Promise.all(kidPromises).then(function () {
+            return [total, parentRef];
+          });
+        });
+      }
+
+      var total = 0;
+      function next(ref) {
+        return pagesBeforeRef(ref).then(function (args) {
+          if (!args) {
+            return total;
+          }
+          var count = args[0];
+          var parentRef = args[1];
+          total += count;
+          return next(parentRef);
+        });
+      }
+
+      return next(ref);
+    }
+  };
+
+  return Catalog;
+})();
+
+var XRef = (function XRefClosure() {
+  function XRef(stream, password) {
+    this.stream = stream;
+    this.entries = [];
+    this.xrefstms = {};
+    // prepare the XRef cache
+    this.cache = [];
+    this.password = password;
+  }
+
+  XRef.prototype = {
+    setStartXRef: function XRef_setStartXRef(startXRef) {
+      // Store the starting positions of xref tables as we process them
+      // so we can recover from missing data errors
+      this.startXRefQueue = [startXRef];
+    },
+
+    parse: function XRef_parse(recoveryMode) {
+      var trailerDict;
+      if (!recoveryMode) {
+        trailerDict = this.readXRef();
+      } else {
+        warn('Indexing all PDF objects');
+        trailerDict = this.indexObjects();
+      }
+      trailerDict.assignXref(this);
+      this.trailer = trailerDict;
+      var encrypt = trailerDict.get('Encrypt');
+      if (encrypt) {
+        var ids = trailerDict.get('ID');
+        var fileId = (ids && ids.length) ? ids[0] : '';
+        this.encrypt = new CipherTransformFactory(encrypt, fileId,
+                                                  this.password);
+      }
+
+      // get the root dictionary (catalog) object
+      if (!(this.root = trailerDict.get('Root'))) {
+        error('Invalid root reference');
+      }
+    },
+
+    processXRefTable: function XRef_processXRefTable(parser) {
+      if (!('tableState' in this)) {
+        // Stores state of the table as we process it so we can resume
+        // from middle of table in case of missing data error
+        this.tableState = {
+          entryNum: 0,
+          streamPos: parser.lexer.stream.pos,
+          parserBuf1: parser.buf1,
+          parserBuf2: parser.buf2
+        };
+      }
+
+      var obj = this.readXRefTable(parser);
+
+      // Sanity check
+      if (!isCmd(obj, 'trailer')) {
+        error('Invalid XRef table: could not find trailer dictionary');
+      }
+      // Read trailer dictionary, e.g.
+      // trailer
+      //    << /Size 22
+      //      /Root 20R
+      //      /Info 10R
+      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
+      //    >>
+      // The parser goes through the entire stream << ... >> and provides
+      // a getter interface for the key-value table
+      var dict = parser.getObj();
+      if (!isDict(dict)) {
+        error('Invalid XRef table: could not parse trailer dictionary');
+      }
+      delete this.tableState;
+
+      return dict;
+    },
+
+    readXRefTable: function XRef_readXRefTable(parser) {
+      // Example of cross-reference table:
+      // xref
+      // 0 1                    <-- subsection header (first obj #, obj count)
+      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)
+      // 23 2                   <-- subsection header ... and so on ...
+      // 0000025518 00002 n
+      // 0000025635 00000 n
+      // trailer
+      // ...
+
+      var stream = parser.lexer.stream;
+      var tableState = this.tableState;
+      stream.pos = tableState.streamPos;
+      parser.buf1 = tableState.parserBuf1;
+      parser.buf2 = tableState.parserBuf2;
+
+      // Outer loop is over subsection headers
+      var obj;
+
+      while (true) {
+        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {
+          if (isCmd(obj = parser.getObj(), 'trailer')) {
+            break;
+          }
+          tableState.firstEntryNum = obj;
+          tableState.entryCount = parser.getObj();
+        }
+
+        var first = tableState.firstEntryNum;
+        var count = tableState.entryCount;
+        if (!isInt(first) || !isInt(count)) {
+          error('Invalid XRef table: wrong types in subsection header');
+        }
+        // Inner loop is over objects themselves
+        for (var i = tableState.entryNum; i < count; i++) {
+          tableState.streamPos = stream.pos;
+          tableState.entryNum = i;
+          tableState.parserBuf1 = parser.buf1;
+          tableState.parserBuf2 = parser.buf2;
+
+          var entry = {};
+          entry.offset = parser.getObj();
+          entry.gen = parser.getObj();
+          var type = parser.getObj();
+
+          if (isCmd(type, 'f')) {
+            entry.free = true;
+          } else if (isCmd(type, 'n')) {
+            entry.uncompressed = true;
+          }
+
+          // Validate entry obj
+          if (!isInt(entry.offset) || !isInt(entry.gen) ||
+              !(entry.free || entry.uncompressed)) {
+            console.log(entry.offset, entry.gen, entry.free,
+                        entry.uncompressed);
+            error('Invalid entry in XRef subsection: ' + first + ', ' + count);
+          }
+
+          if (!this.entries[i + first]) {
+            this.entries[i + first] = entry;
+          }
+        }
+
+        tableState.entryNum = 0;
+        tableState.streamPos = stream.pos;
+        tableState.parserBuf1 = parser.buf1;
+        tableState.parserBuf2 = parser.buf2;
+        delete tableState.firstEntryNum;
+        delete tableState.entryCount;
+      }
+
+      // Per issue 3248: hp scanners generate bad XRef
+      if (first === 1 && this.entries[1] && this.entries[1].free) {
+        // shifting the entries
+        this.entries.shift();
+      }
+
+      // Sanity check: as per spec, first object must be free
+      if (this.entries[0] && !this.entries[0].free) {
+        error('Invalid XRef table: unexpected first object');
+      }
+      return obj;
+    },
+
+    processXRefStream: function XRef_processXRefStream(stream) {
+      if (!('streamState' in this)) {
+        // Stores state of the stream as we process it so we can resume
+        // from middle of stream in case of missing data error
+        var streamParameters = stream.dict;
+        var byteWidths = streamParameters.get('W');
+        var range = streamParameters.get('Index');
+        if (!range) {
+          range = [0, streamParameters.get('Size')];
+        }
+
+        this.streamState = {
+          entryRanges: range,
+          byteWidths: byteWidths,
+          entryNum: 0,
+          streamPos: stream.pos
+        };
+      }
+      this.readXRefStream(stream);
+      delete this.streamState;
+
+      return stream.dict;
+    },
+
+    readXRefStream: function XRef_readXRefStream(stream) {
+      var i, j;
+      var streamState = this.streamState;
+      stream.pos = streamState.streamPos;
+
+      var byteWidths = streamState.byteWidths;
+      var typeFieldWidth = byteWidths[0];
+      var offsetFieldWidth = byteWidths[1];
+      var generationFieldWidth = byteWidths[2];
+
+      var entryRanges = streamState.entryRanges;
+      while (entryRanges.length > 0) {
+        var first = entryRanges[0];
+        var n = entryRanges[1];
+
+        if (!isInt(first) || !isInt(n)) {
+          error('Invalid XRef range fields: ' + first + ', ' + n);
+        }
+        if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
+            !isInt(generationFieldWidth)) {
+          error('Invalid XRef entry fields length: ' + first + ', ' + n);
+        }
+        for (i = streamState.entryNum; i < n; ++i) {
+          streamState.entryNum = i;
+          streamState.streamPos = stream.pos;
+
+          var type = 0, offset = 0, generation = 0;
+          for (j = 0; j < typeFieldWidth; ++j) {
+            type = (type << 8) | stream.getByte();
+          }
+          // if type field is absent, its default value is 1
+          if (typeFieldWidth === 0) {
+            type = 1;
+          }
+          for (j = 0; j < offsetFieldWidth; ++j) {
+            offset = (offset << 8) | stream.getByte();
+          }
+          for (j = 0; j < generationFieldWidth; ++j) {
+            generation = (generation << 8) | stream.getByte();
+          }
+          var entry = {};
+          entry.offset = offset;
+          entry.gen = generation;
+          switch (type) {
+            case 0:
+              entry.free = true;
+              break;
+            case 1:
+              entry.uncompressed = true;
+              break;
+            case 2:
+              break;
+            default:
+              error('Invalid XRef entry type: ' + type);
+          }
+          if (!this.entries[first + i]) {
+            this.entries[first + i] = entry;
+          }
+        }
+
+        streamState.entryNum = 0;
+        streamState.streamPos = stream.pos;
+        entryRanges.splice(0, 2);
+      }
+    },
+
+    indexObjects: function XRef_indexObjects() {
+      // Simple scan through the PDF content to find objects,
+      // trailers and XRef streams.
+      function readToken(data, offset) {
+        var token = '', ch = data[offset];
+        while (ch !== 13 && ch !== 10) {
+          if (++offset >= data.length) {
+            break;
+          }
+          token += String.fromCharCode(ch);
+          ch = data[offset];
+        }
+        return token;
+      }
+      function skipUntil(data, offset, what) {
+        var length = what.length, dataLength = data.length;
+        var skipped = 0;
+        // finding byte sequence
+        while (offset < dataLength) {
+          var i = 0;
+          while (i < length && data[offset + i] == what[i]) {
+            ++i;
+          }
+          if (i >= length) {
+            break; // sequence found
+          }
+          offset++;
+          skipped++;
+        }
+        return skipped;
+      }
+      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
+                                          101, 102]);
+      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
+      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+
+      var stream = this.stream;
+      stream.pos = 0;
+      var buffer = stream.getBytes();
+      var position = stream.start, length = buffer.length;
+      var trailers = [], xrefStms = [];
+      while (position < length) {
+        var ch = buffer[position];
+        if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
+          ++position;
+          continue;
+        }
+        if (ch === 37) { // %-comment
+          do {
+            ++position;
+            if (position >= length) {
+              break;
+            }
+            ch = buffer[position];
+          } while (ch !== 13 && ch !== 10);
+          continue;
+        }
+        var token = readToken(buffer, position);
+        var m;
+        if (token === 'xref') {
+          position += skipUntil(buffer, position, trailerBytes);
+          trailers.push(position);
+          position += skipUntil(buffer, position, startxrefBytes);
+        } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
+          this.entries[m[1]] = {
+            offset: position,
+            gen: m[2] | 0,
+            uncompressed: true
+          };
+
+          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
+          var content = buffer.subarray(position, position + contentLength);
+
+          // checking XRef stream suspect
+          // (it shall have '/XRef' and next char is not a letter)
+          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
+          if (xrefTagOffset < contentLength &&
+              content[xrefTagOffset + 5] < 64) {
+            xrefStms.push(position);
+            this.xrefstms[position] = 1; // don't read it recursively
+          }
+
+          position += contentLength;
+        } else {
+          position += token.length + 1;
+        }
+      }
+      // reading XRef streams
+      var i, ii;
+      for (i = 0, ii = xrefStms.length; i < ii; ++i) {
+        this.startXRefQueue.push(xrefStms[i]);
+        this.readXRef(/* recoveryMode */ true);
+      }
+      // finding main trailer
+      var dict;
+      for (i = 0, ii = trailers.length; i < ii; ++i) {
+        stream.pos = trailers[i];
+        var parser = new Parser(new Lexer(stream), true, null);
+        var obj = parser.getObj();
+        if (!isCmd(obj, 'trailer')) {
+          continue;
+        }
+        // read the trailer dictionary
+        if (!isDict(dict = parser.getObj())) {
+          continue;
+        }
+        // taking the first one with 'ID'
+        if (dict.has('ID')) {
+          return dict;
+        }
+      }
+      // no tailer with 'ID', taking last one (if exists)
+      if (dict) {
+        return dict;
+      }
+      // nothing helps
+      // calling error() would reject worker with an UnknownErrorException.
+      throw new InvalidPDFException('Invalid PDF structure');
+    },
+
+    readXRef: function XRef_readXRef(recoveryMode) {
+      var stream = this.stream;
+
+      try {
+        while (this.startXRefQueue.length) {
+          var startXRef = this.startXRefQueue[0];
+
+          stream.pos = startXRef + stream.start;
+
+          var parser = new Parser(new Lexer(stream), true, null);
+          var obj = parser.getObj();
+          var dict;
+
+          // Get dictionary
+          if (isCmd(obj, 'xref')) {
+            // Parse end-of-file XRef
+            dict = this.processXRefTable(parser);
+            if (!this.topDict) {
+              this.topDict = dict;
+            }
+
+            // Recursively get other XRefs 'XRefStm', if any
+            obj = dict.get('XRefStm');
+            if (isInt(obj)) {
+              var pos = obj;
+              // ignore previously loaded xref streams
+              // (possible infinite recursion)
+              if (!(pos in this.xrefstms)) {
+                this.xrefstms[pos] = 1;
+                this.startXRefQueue.push(pos);
+              }
+            }
+          } else if (isInt(obj)) {
+            // Parse in-stream XRef
+            if (!isInt(parser.getObj()) ||
+                !isCmd(parser.getObj(), 'obj') ||
+                !isStream(obj = parser.getObj())) {
+              error('Invalid XRef stream');
+            }
+            dict = this.processXRefStream(obj);
+            if (!this.topDict) {
+              this.topDict = dict;
+            }
+            if (!dict) {
+              error('Failed to read XRef stream');
+            }
+          } else {
+            error('Invalid XRef stream header');
+          }
+
+          // Recursively get previous dictionary, if any
+          obj = dict.get('Prev');
+          if (isInt(obj)) {
+            this.startXRefQueue.push(obj);
+          } else if (isRef(obj)) {
+            // The spec says Prev must not be a reference, i.e. "/Prev NNN"
+            // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
+            this.startXRefQueue.push(obj.num);
+          }
+
+          this.startXRefQueue.shift();
+        }
+
+        return this.topDict;
+      } catch (e) {
+        if (e instanceof MissingDataException) {
+          throw e;
+        }
+        info('(while reading XRef): ' + e);
+      }
+
+      if (recoveryMode) {
+        return;
+      }
+      throw new XRefParseException();
+    },
+
+    getEntry: function XRef_getEntry(i) {
+      var xrefEntry = this.entries[i];
+      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
+        return xrefEntry;
+      }
+      return null;
+    },
+
+    fetchIfRef: function XRef_fetchIfRef(obj) {
+      if (!isRef(obj)) {
+        return obj;
+      }
+      return this.fetch(obj);
+    },
+
+    fetch: function XRef_fetch(ref, suppressEncryption) {
+      assert(isRef(ref), 'ref object is not a reference');
+      var num = ref.num;
+      if (num in this.cache) {
+        var cacheEntry = this.cache[num];
+        return cacheEntry;
+      }
+
+      var xrefEntry = this.getEntry(num);
+
+      // the referenced entry can be free
+      if (xrefEntry === null) {
+        return (this.cache[num] = null);
+      }
+
+      if (xrefEntry.uncompressed) {
+        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);
+      } else {
+        xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);
+      }
+
+      if (isDict(xrefEntry)) {
+        xrefEntry.objId = 'R' + ref.num + '.' + ref.gen;
+      }
+      return xrefEntry;
+    },
+
+    fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry,
+                                                       suppressEncryption) {
+      var gen = ref.gen;
+      var num = ref.num;
+      if (xrefEntry.gen !== gen) {
+        error('inconsistent generation in XRef');
+      }
+      var stream = this.stream.makeSubStream(xrefEntry.offset +
+                                             this.stream.start);
+      var parser = new Parser(new Lexer(stream), true, this);
+      var obj1 = parser.getObj();
+      var obj2 = parser.getObj();
+      var obj3 = parser.getObj();
+      if (!isInt(obj1) || parseInt(obj1, 10) !== num ||
+          !isInt(obj2) || parseInt(obj2, 10) !== gen ||
+          !isCmd(obj3)) {
+        error('bad XRef entry');
+      }
+      if (!isCmd(obj3, 'obj')) {
+        // some bad PDFs use "obj1234" and really mean 1234
+        if (obj3.cmd.indexOf('obj') === 0) {
+          num = parseInt(obj3.cmd.substring(3), 10);
+          if (!isNaN(num)) {
+            return num;
+          }
+        }
+        error('bad XRef entry');
+      }
+      if (this.encrypt && !suppressEncryption) {
+        try {
+          xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num,
+                                                                       gen));
+        } catch (ex) {
+          // Almost all streams must be encrypted, but sometimes
+          // they are not, probably due to some broken generators.
+          // Retrying without encryption...
+          return this.fetch(ref, true);
+        }
+      } else {
+        xrefEntry = parser.getObj();
+      }
+      if (!isStream(xrefEntry)) {
+        this.cache[num] = xrefEntry;
+      }
+      return xrefEntry;
+    },
+
+    fetchCompressed: function XRef_fetchCompressed(xrefEntry,
+                                                   suppressEncryption) {
+      var tableOffset = xrefEntry.offset;
+      var stream = this.fetch(new Ref(tableOffset, 0));
+      if (!isStream(stream)) {
+        error('bad ObjStm stream');
+      }
+      var first = stream.dict.get('First');
+      var n = stream.dict.get('N');
+      if (!isInt(first) || !isInt(n)) {
+        error('invalid first and n parameters for ObjStm stream');
+      }
+      var parser = new Parser(new Lexer(stream), false, this);
+      parser.allowStreams = true;
+      var i, entries = [], num, nums = [];
+      // read the object numbers to populate cache
+      for (i = 0; i < n; ++i) {
+        num = parser.getObj();
+        if (!isInt(num)) {
+          error('invalid object number in the ObjStm stream: ' + num);
+        }
+        nums.push(num);
+        var offset = parser.getObj();
+        if (!isInt(offset)) {
+          error('invalid object offset in the ObjStm stream: ' + offset);
+        }
+      }
+      // read stream objects for cache
+      for (i = 0; i < n; ++i) {
+        entries.push(parser.getObj());
+        num = nums[i];
+        var entry = this.entries[num];
+        if (entry && entry.offset === tableOffset && entry.gen === i) {
+          this.cache[num] = entries[i];
+        }
+      }
+      xrefEntry = entries[xrefEntry.gen];
+      if (xrefEntry === undefined) {
+        error('bad XRef entry for compressed object');
+      }
+      return xrefEntry;
+    },
+
+    fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) {
+      if (!isRef(obj)) {
+        var promise = new LegacyPromise();
+        promise.resolve(obj);
+        return promise;
+      }
+      return this.fetchAsync(obj);
+    },
+
+    fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) {
+      var promise = new LegacyPromise();
+      var tryFetch = function (promise) {
+        try {
+          promise.resolve(this.fetch(ref, suppressEncryption));
+        } catch (e) {
+          if (e instanceof MissingDataException) {
+            this.stream.manager.requestRange(e.begin, e.end, tryFetch);
+            return;
+          }
+          promise.reject(e);
+        }
+      }.bind(this, promise);
+      tryFetch();
+      return promise;
+    },
+
+    getCatalogObj: function XRef_getCatalogObj() {
+      return this.root;
+    }
+  };
+
+  return XRef;
+})();
+
+/**
+ * A NameTree is like a Dict but has some advantageous properties, see the
+ * spec (7.9.6) for more details.
+ * TODO: implement all the Dict functions and make this more efficent.
+ */
+var NameTree = (function NameTreeClosure() {
+  function NameTree(root, xref) {
+    this.root = root;
+    this.xref = xref;
+  }
+
+  NameTree.prototype = {
+    getAll: function NameTree_getAll() {
+      var dict = {};
+      if (!this.root) {
+        return dict;
+      }
+      var xref = this.xref;
+      // reading name tree
+      var processed = new RefSet();
+      processed.put(this.root);
+      var queue = [this.root];
+      while (queue.length > 0) {
+        var i, n;
+        var obj = xref.fetchIfRef(queue.shift());
+        if (!isDict(obj)) {
+          continue;
+        }
+        if (obj.has('Kids')) {
+          var kids = obj.get('Kids');
+          for (i = 0, n = kids.length; i < n; i++) {
+            var kid = kids[i];
+            if (processed.has(kid)) {
+              error('invalid destinations');
+            }
+            queue.push(kid);
+            processed.put(kid);
+          }
+          continue;
+        }
+        var names = obj.get('Names');
+        if (names) {
+          for (i = 0, n = names.length; i < n; i += 2) {
+            dict[names[i]] = xref.fetchIfRef(names[i + 1]);
+          }
+        }
+      }
+      return dict;
+    }
+  };
+  return NameTree;
+})();
+
+/**
+ * "A PDF file can refer to the contents of another file by using a File
+ * Specification (PDF 1.1)", see the spec (7.11) for more details.
+ * NOTE: Only embedded files are supported (as part of the attachments support)
+ * TODO: support the 'URL' file system (with caching if !/V), portable
+ * collections attributes and related files (/RF)
+ */
+var FileSpec = (function FileSpecClosure() {
+  function FileSpec(root, xref) {
+    if (!root || !isDict(root)) {
+      return;
+    }
+    this.xref = xref;
+    this.root = root;
+    if (root.has('FS')) {
+      this.fs = root.get('FS');
+    }
+    this.description = root.has('Desc') ?
+                         stringToPDFString(root.get('Desc')) :
+                         '';
+    if (root.has('RF')) {
+      warn('Related file specifications are not supported');
+    }
+    this.contentAvailable = true;
+    if (!root.has('EF')) {
+      this.contentAvailable = false;
+      warn('Non-embedded file specifications are not supported');
+    }
+  }
+
+  function pickPlatformItem(dict) {
+    // Look for the filename in this order:
+    // UF, F, Unix, Mac, DOS
+    if (dict.has('UF')) {
+      return dict.get('UF');
+    } else if (dict.has('F')) {
+      return dict.get('F');
+    } else if (dict.has('Unix')) {
+      return dict.get('Unix');
+    } else if (dict.has('Mac')) {
+      return dict.get('Mac');
+    } else if (dict.has('DOS')) {
+      return dict.get('DOS');
+    } else {
+      return null;
+    }
+  }
+
+  FileSpec.prototype = {
+    get filename() {
+      if (!this._filename && this.root) {
+        var filename = pickPlatformItem(this.root) || 'unnamed';
+        this._filename = stringToPDFString(filename).
+          replace(/\\\\/g, '\\').
+          replace(/\\\//g, '/').
+          replace(/\\/g, '/');
+      }
+      return this._filename;
+    },
+    get content() {
+      if (!this.contentAvailable) {
+        return null;
+      }
+      if (!this.contentRef && this.root) {
+        this.contentRef = pickPlatformItem(this.root.get('EF'));
+      }
+      var content = null;
+      if (this.contentRef) {
+        var xref = this.xref;
+        var fileObj = xref.fetchIfRef(this.contentRef);
+        if (fileObj && isStream(fileObj)) {
+          content = fileObj.getBytes();
+        } else {
+          warn('Embedded file specification points to non-existing/invalid ' +
+            'content');
+        }
+      } else {
+        warn('Embedded file specification does not have a content');
+      }
+      return content;
+    },
+    get serializable() {
+      return {
+        filename: this.filename,
+        content: this.content
+      };
+    }
+  };
+  return FileSpec;
+})();
+
+/**
+ * A helper for loading missing data in object graphs. It traverses the graph
+ * depth first and queues up any objects that have missing data. Once it has
+ * has traversed as many objects that are available it attempts to bundle the
+ * missing data requests and then resume from the nodes that weren't ready.
+ *
+ * NOTE: It provides protection from circular references by keeping track of
+ * of loaded references. However, you must be careful not to load any graphs
+ * that have references to the catalog or other pages since that will cause the
+ * entire PDF document object graph to be traversed.
+ */
+var ObjectLoader = (function() {
+  function mayHaveChildren(value) {
+    return isRef(value) || isDict(value) || isArray(value) || isStream(value);
+  }
+
+  function addChildren(node, nodesToVisit) {
+    var value;
+    if (isDict(node) || isStream(node)) {
+      var map;
+      if (isDict(node)) {
+        map = node.map;
+      } else {
+        map = node.dict.map;
+      }
+      for (var key in map) {
+        value = map[key];
+        if (mayHaveChildren(value)) {
+          nodesToVisit.push(value);
+        }
+      }
+    } else if (isArray(node)) {
+      for (var i = 0, ii = node.length; i < ii; i++) {
+        value = node[i];
+        if (mayHaveChildren(value)) {
+          nodesToVisit.push(value);
+        }
+      }
+    }
+  }
+
+  function ObjectLoader(obj, keys, xref) {
+    this.obj = obj;
+    this.keys = keys;
+    this.xref = xref;
+    this.refSet = null;
+  }
+
+  ObjectLoader.prototype = {
+    load: function ObjectLoader_load() {
+      var keys = this.keys;
+      this.promise = new LegacyPromise();
+      // Don't walk the graph if all the data is already loaded.
+      if (!(this.xref.stream instanceof ChunkedStream) ||
+          this.xref.stream.getMissingChunks().length === 0) {
+        this.promise.resolve();
+        return this.promise;
+      }
+
+      this.refSet = new RefSet();
+      // Setup the initial nodes to visit.
+      var nodesToVisit = [];
+      for (var i = 0; i < keys.length; i++) {
+        nodesToVisit.push(this.obj[keys[i]]);
+      }
+
+      this.walk(nodesToVisit);
+      return this.promise;
+    },
+
+    walk: function ObjectLoader_walk(nodesToVisit) {
+      var nodesToRevisit = [];
+      var pendingRequests = [];
+      // DFS walk of the object graph.
+      while (nodesToVisit.length) {
+        var currentNode = nodesToVisit.pop();
+
+        // Only references or chunked streams can cause missing data exceptions.
+        if (isRef(currentNode)) {
+          // Skip nodes that have already been visited.
+          if (this.refSet.has(currentNode)) {
+            continue;
+          }
+          try {
+            var ref = currentNode;
+            this.refSet.put(ref);
+            currentNode = this.xref.fetch(currentNode);
+          } catch (e) {
+            if (!(e instanceof MissingDataException)) {
+              throw e;
+            }
+            nodesToRevisit.push(currentNode);
+            pendingRequests.push({ begin: e.begin, end: e.end });
+          }
+        }
+        if (currentNode && currentNode.getBaseStreams) {
+          var baseStreams = currentNode.getBaseStreams();
+          var foundMissingData = false;
+          for (var i = 0; i < baseStreams.length; i++) {
+            var stream = baseStreams[i];
+            if (stream.getMissingChunks && stream.getMissingChunks().length) {
+              foundMissingData = true;
+              pendingRequests.push({
+                begin: stream.start,
+                end: stream.end
+              });
+            }
+          }
+          if (foundMissingData) {
+            nodesToRevisit.push(currentNode);
+          }
+        }
+
+        addChildren(currentNode, nodesToVisit);
+      }
+
+      if (pendingRequests.length) {
+        this.xref.stream.manager.requestRanges(pendingRequests,
+            function pendingRequestCallback() {
+          nodesToVisit = nodesToRevisit;
+          for (var i = 0; i < nodesToRevisit.length; i++) {
+            var node = nodesToRevisit[i];
+            // Remove any reference nodes from the currrent refset so they
+            // aren't skipped when we revist them.
+            if (isRef(node)) {
+              this.refSet.remove(node);
+            }
+          }
+          this.walk(nodesToVisit);
+        }.bind(this));
+        return;
+      }
+      // Everything is loaded.
+      this.refSet = null;
+      this.promise.resolve();
+    }
+  };
+
+  return ObjectLoader;
+})();
+
+
+var ISOAdobeCharset = [
+  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
+  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
+  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
+  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
+  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
+  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
+  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
+  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
+  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
+  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
+  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
+  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
+  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
+  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
+  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
+  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
+  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
+  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
+  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
+  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
+  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
+  'ugrave', 'yacute', 'ydieresis', 'zcaron'
+];
+
+var ExpertCharset = [
+  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
+  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
+  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
+  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
+  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
+  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
+  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
+  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
+  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
+  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
+  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
+  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+  'Ydieresissmall'
+];
+
+var ExpertSubsetCharset = [
+  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
+  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
+  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
+  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
+  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
+  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
+  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
+  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
+  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+  'periodinferior', 'commainferior'
+];
+
+
+
+var CIDToUnicodeMaps = {
+  'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
+    {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
+    [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
+    0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
+    [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
+    [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
+    198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
+    174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
+    {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
+    {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
+    {f: 59, c: 33}, 165, {f: 31, c: 93}, 65512, {f: 2, c: 125}, 0,
+    {f: 63, c: 65377}, {s: 243}, [8195, 12288],
+    {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
+    {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
+    {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
+    65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
+    {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
+    [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
+    8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
+    {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
+    9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
+    8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
+    {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
+    8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
+    8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
+    {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
+    {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
+    {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
+    {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
+    21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
+    28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
+    22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
+    24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
+    20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
+    26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
+    [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
+    37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
+    39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
+    32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
+    [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
+    [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
+    28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
+    21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
+    29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
+    30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
+    22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
+    28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
+    40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
+    25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
+    [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
+    29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
+    19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
+    22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
+    [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
+    33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
+    38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
+    34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
+    22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
+    39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
+    38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
+    24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
+    39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
+    25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
+    [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
+    23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
+    28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
+    36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
+    33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
+    33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
+    24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
+    24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
+    27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
+    31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
+    35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
+    39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
+    32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
+    22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
+    26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
+    27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
+    36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
+    20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
+    31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
+    21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
+    33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
+    [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
+    31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
+    23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
+    28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
+    20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
+    23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
+    29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
+    39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
+    [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
+    [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
+    33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
+    20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
+    39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
+    20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
+    31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
+    34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
+    21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
+    24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
+    31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
+    35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
+    25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
+    [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
+    20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
+    25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
+    30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
+    36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
+    24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
+    35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
+    [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
+    31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
+    38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
+    23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
+    35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
+    20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
+    22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
+    24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
+    25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
+    28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
+    32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
+    [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
+    37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
+    21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
+    21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
+    33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
+    20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
+    26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
+    21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
+    35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
+    22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
+    29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
+    21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
+    32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
+    26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
+    21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
+    38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
+    20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
+    29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
+    27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
+    [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
+    24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
+    [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
+    32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
+    35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
+    20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
+    29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
+    [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
+    31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
+    24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
+    33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
+    29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
+    20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
+    23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
+    29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
+    21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
+    23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
+    32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
+    36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
+    24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
+    22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
+    36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
+    26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
+    37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
+    32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
+    24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
+    21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
+    [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
+    25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
+    27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
+    30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
+    33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
+    37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
+    20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
+    26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
+    22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
+    35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
+    23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
+    27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
+    [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
+    36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
+    29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
+    37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
+    28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
+    29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
+    26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
+    28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
+    25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
+    [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
+    35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
+    33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
+    31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
+    20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
+    32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
+    23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
+    26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
+    33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
+    37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
+    32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
+    29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
+    35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
+    21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
+    25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
+    29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
+    33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
+    38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
+    20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
+    20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
+    23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
+    21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
+    39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
+    25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
+    36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
+    38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
+    27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
+    21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
+    36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
+    22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
+    31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
+    24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
+    24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
+    39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
+    33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
+    27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
+    29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
+    24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
+    28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
+    36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
+    25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
+    26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
+    20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
+    22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
+    20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
+    24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
+    31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
+    [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
+    37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
+    22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
+    20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
+    22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
+    36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
+    24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
+    22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
+    26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
+    31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
+    35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
+    38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
+    31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
+    28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
+    20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
+    22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
+    37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
+    37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
+    [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
+    24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
+    22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
+    24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
+    22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
+    24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
+    32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
+    30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
+    26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
+    30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
+    31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
+    39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
+    24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
+    39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
+    38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
+    27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
+    31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
+    30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
+    25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
+    30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
+    [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
+    27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
+    [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
+    31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
+    27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
+    30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
+    25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
+    22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
+    26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
+    36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
+    33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
+    21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
+    25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
+    25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
+    19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
+    38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
+    21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
+    36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
+    37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
+    24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
+    21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
+    25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
+    33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
+    40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
+    {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
+    33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
+    [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
+    27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
+    30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
+    27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
+    [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
+    24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
+    23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
+    [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
+    40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
+    37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
+    [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
+    29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
+    [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
+    24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
+    37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
+    38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
+    21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
+    26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
+    36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
+    19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
+    25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
+    31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
+    38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
+    32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
+    37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
+    21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
+    [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
+    30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
+    [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
+    20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
+    31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
+    32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
+    40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
+    20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
+    38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
+    24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
+    21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
+    24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
+    [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
+    35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
+    20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
+    24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
+    20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
+    20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
+    20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
+    20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
+    20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
+    20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
+    20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
+    20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
+    20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
+    20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
+    20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
+    20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
+    31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
+    20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
+    {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
+    20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
+    [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
+    21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
+    21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
+    36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
+    21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
+    21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
+    21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
+    21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
+    [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
+    21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
+    21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
+    21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
+    21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
+    21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
+    {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
+    21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
+    21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
+    21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
+    21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
+    22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
+    22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
+    22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
+    22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
+    22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
+    22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
+    22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
+    {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
+    22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
+    22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
+    22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
+    {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
+    22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
+    22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
+    20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
+    23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
+    {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
+    23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
+    23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
+    {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
+    [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
+    23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
+    {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
+    [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
+    23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
+    23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
+    23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
+    23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
+    23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
+    23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
+    [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
+    {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
+    24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
+    [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
+    24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
+    24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
+    24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
+    24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
+    [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
+    24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
+    24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
+    24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
+    24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
+    24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
+    24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
+    24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
+    24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
+    {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
+    24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
+    24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
+    25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
+    25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
+    25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
+    25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
+    {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
+    25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
+    25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
+    25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
+    25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
+    25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
+    25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
+    25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
+    25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
+    25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
+    {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
+    25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
+    [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
+    25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
+    26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
+    [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
+    {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
+    26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
+    26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
+    26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
+    26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
+    26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
+    26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
+    26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
+    26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
+    26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
+    26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
+    26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
+    26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
+    26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
+    26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
+    26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
+    27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
+    27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
+    27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
+    27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
+    27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
+    27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
+    27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
+    27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
+    27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
+    27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
+    27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
+    [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
+    27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
+    27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
+    27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
+    27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
+    27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
+    27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
+    28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
+    28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
+    28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
+    28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
+    28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
+    28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
+    28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
+    28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
+    28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
+    28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
+    28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
+    28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
+    28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
+    28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
+    29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
+    29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
+    29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
+    29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
+    29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
+    29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
+    {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
+    29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
+    29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
+    29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
+    29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
+    29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
+    29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
+    29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
+    29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
+    30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
+    30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
+    30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
+    30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
+    30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
+    30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
+    {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
+    30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
+    30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
+    30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
+    {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
+    30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
+    30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
+    30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
+    30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
+    30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
+    30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
+    31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
+    31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
+    31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
+    31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
+    31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
+    31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
+    31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
+    31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
+    31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
+    31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
+    31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
+    31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
+    31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
+    31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
+    31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
+    31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
+    31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
+    31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
+    32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
+    32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
+    32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
+    32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
+    32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
+    32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
+    32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
+    32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
+    {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
+    {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
+    [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
+    32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
+    32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
+    {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
+    39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
+    32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
+    32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
+    32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
+    32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
+    33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
+    33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
+    33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
+    33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
+    33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
+    33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
+    33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
+    {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
+    33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
+    33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
+    33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
+    33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
+    33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
+    33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
+    33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
+    33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
+    33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
+    33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
+    34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
+    34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
+    34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
+    34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
+    34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
+    34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
+    34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
+    34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
+    34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
+    34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
+    34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
+    34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
+    34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
+    34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
+    34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
+    34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
+    34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
+    34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
+    35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
+    35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
+    35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
+    35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
+    35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
+    {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
+    35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
+    35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
+    35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
+    35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
+    35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
+    35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
+    35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
+    35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
+    [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
+    35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
+    {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
+    {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
+    40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
+    36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
+    {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
+    {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
+    36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
+    36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
+    36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
+    36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
+    36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
+    36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
+    36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
+    36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
+    36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
+    36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
+    36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
+    37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
+    37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
+    37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
+    37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
+    37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
+    37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
+    37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
+    37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
+    37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
+    37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
+    37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
+    37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
+    37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
+    38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
+    38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
+    38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
+    {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
+    38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
+    {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
+    38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
+    38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
+    38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
+    38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
+    38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
+    {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
+    [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
+    38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
+    39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
+    39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
+    39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
+    {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
+    39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
+    {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
+    39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
+    39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
+    39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
+    {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
+    39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
+    {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
+    39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
+    {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
+    39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
+    39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
+    39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
+    39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
+    40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
+    40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
+    {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
+    40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
+    40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
+    40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
+    {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
+    40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
+    40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
+    {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
+    40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
+    {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
+    40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
+    {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
+    13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
+    {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
+    13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
+    8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
+    0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
+    194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
+    0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
+    {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
+    64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
+    39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
+    28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
+    63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
+    {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
+    194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
+    {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
+    {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
+    {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
+    65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
+    9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
+    13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
+    13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
+    13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
+    {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
+    {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
+    12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
+    12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
+    12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
+    13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
+    8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
+    9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
+    9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
+    9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
+    9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
+    20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
+    8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
+    12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
+    37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
+    [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
+    20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
+    20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
+    21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
+    21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
+    64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
+    23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
+    23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
+    24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
+    24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
+    26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
+    26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
+    64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
+    27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
+    28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
+    28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
+    28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
+    29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
+    29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
+    30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
+    31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
+    31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
+    33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
+    64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
+    35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
+    64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
+    37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
+    37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
+    37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
+    37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
+    37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
+    38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
+    {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
+    39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, 0, 92,
+    {s: 634}, 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275,
+    333, 256, 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
+    {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
+    467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
+    8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
+    331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
+    {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
+    {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
+    {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
+    12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
+    {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
+    0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
+    {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
+    13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
+    {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
+    {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
+    13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
+    {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
+    {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
+    {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
+    {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
+    {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
+    {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
+    9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
+    {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
+    8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
+    9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
+    {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
+    64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
+    64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
+    64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
+    64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
+    24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
+    64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
+    64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
+    37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
+    37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
+    11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
+    171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
+    11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
+    23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
+    29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
+    0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
+    {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
+    [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
+    131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
+    {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
+    [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
+    {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
+    194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
+    20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
+    13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
+    0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
+    63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
+    194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
+    23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
+    26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
+    {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
+    30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
+    11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
+    [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
+    34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
+    0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
+    {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
+    19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
+    20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
+    20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
+    20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
+    20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
+    20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
+    [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
+    {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
+    21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
+    21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
+    21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
+    22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
+    22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
+    22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
+    22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
+    22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
+    23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
+    23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
+    {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
+    23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
+    23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
+    24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
+    24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
+    [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
+    [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
+    24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
+    24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
+    25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
+    25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
+    25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
+    {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
+    25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
+    26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
+    26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
+    26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
+    26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
+    26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
+    27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
+    27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
+    27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
+    [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
+    27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
+    27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
+    28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
+    28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
+    28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
+    [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
+    28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
+    29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
+    29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
+    29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
+    29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
+    29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
+    29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
+    29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
+    29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
+    [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
+    30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
+    30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
+    {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
+    30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
+    30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
+    31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
+    31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
+    31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
+    31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
+    31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
+    31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
+    31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
+    32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
+    32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
+    32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
+    32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
+    32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
+    32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
+    33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
+    33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
+    33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
+    33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
+    34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
+    34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
+    34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
+    34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
+    [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
+    {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
+    35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
+    35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
+    35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
+    36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
+    36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
+    36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
+    36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
+    37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
+    37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
+    37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
+    {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
+    37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
+    37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
+    38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
+    38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
+    38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
+    38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
+    39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
+    39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
+    {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
+    39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
+    39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
+    40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
+    40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
+    40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
+    40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
+    40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
+    28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
+    20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
+    29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
+    0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
+    13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
+    {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
+    {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
+    {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
+    474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
+    351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
+    344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
+    369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
+    625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
+    626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
+    608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
+    673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
+    0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
+    820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
+    {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
+    704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
+    {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
+    {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
+    {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
+    9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
+    {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
+    {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
+    20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
+    20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
+    21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
+    22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
+    22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
+    23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
+    138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
+    24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
+    24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
+    25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
+    26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
+    26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
+    144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
+    27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
+    27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
+    27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
+    28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
+    28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
+    29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
+    29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
+    30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
+    30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
+    152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
+    31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
+    31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
+    31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
+    32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
+    {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
+    33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
+    33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
+    33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
+    34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
+    34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
+    34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
+    35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
+    36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
+    36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
+    {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
+    37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
+    37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
+    18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
+    38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
+    39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
+    39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
+    40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
+    40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
+    13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
+    20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
+    20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
+    20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
+    131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
+    131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
+    20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
+    21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
+    133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
+    133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
+    {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
+    21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
+    21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
+    13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
+    21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
+    135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
+    22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
+    22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
+    22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
+    22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
+    22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
+    136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
+    22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
+    {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
+    158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
+    22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
+    23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
+    23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
+    23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
+    {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
+    23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
+    138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
+    23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
+    23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
+    23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
+    24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
+    {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
+    24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
+    24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
+    24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
+    24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
+    141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
+    141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
+    142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
+    {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
+    25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
+    {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
+    25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
+    25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
+    25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
+    26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
+    143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
+    26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
+    144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
+    26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
+    26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
+    26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
+    26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
+    26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
+    {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
+    26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
+    27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
+    27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
+    27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
+    27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
+    145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
+    27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
+    {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
+    27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
+    27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
+    {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
+    {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
+    146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
+    28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
+    {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
+    28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
+    28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
+    15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
+    28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
+    28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
+    28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
+    29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
+    29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
+    29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
+    29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
+    29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
+    29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
+    29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
+    150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
+    29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
+    150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
+    {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
+    {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
+    30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
+    {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
+    151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
+    30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
+    151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
+    30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
+    30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
+    30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
+    30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
+    31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
+    16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
+    31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
+    31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
+    31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
+    31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
+    31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
+    31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
+    155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
+    155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
+    155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
+    32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
+    32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
+    32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
+    32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
+    {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
+    32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
+    32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
+    157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
+    17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
+    33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
+    157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
+    33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
+    158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
+    33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
+    33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
+    {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
+    33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
+    33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
+    17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
+    34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
+    {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
+    34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
+    34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
+    160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
+    {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
+    34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
+    34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
+    160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
+    34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
+    34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
+    34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
+    35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
+    35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
+    35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
+    35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
+    35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
+    162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
+    35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
+    36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
+    {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
+    36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
+    36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
+    64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
+    165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
+    37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
+    37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
+    {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
+    {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
+    37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
+    37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
+    {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
+    166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
+    37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
+    37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
+    37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
+    167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
+    167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
+    38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
+    38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
+    38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
+    169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
+    39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
+    {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
+    {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
+    39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
+    39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
+    39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
+    39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
+    39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
+    {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
+    39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
+    {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
+    171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
+    {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
+    40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
+    40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
+    40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
+    40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
+    40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
+    40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
+    40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
+    19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
+    20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
+    20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
+    {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
+    20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
+    {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
+    21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
+    21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
+    21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
+    21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
+    21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
+    21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
+    22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
+    22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
+    22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
+    22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
+    22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
+    22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
+    23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
+    23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
+    23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
+    24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
+    24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
+    24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
+    25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
+    25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
+    25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
+    {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
+    25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
+    25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
+    26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
+    26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
+    26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
+    27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
+    27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
+    27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
+    28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
+    {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
+    28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
+    29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
+    29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
+    29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
+    30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
+    30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
+    30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
+    30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
+    {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
+    30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
+    30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
+    31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
+    31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
+    31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
+    {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
+    32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
+    32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
+    32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
+    {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
+    33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
+    33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
+    33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
+    33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
+    33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
+    34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
+    34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
+    34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
+    34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
+    35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
+    35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
+    35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
+    35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
+    36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
+    36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
+    36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
+    36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
+    36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
+    36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
+    36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
+    37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
+    37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
+    {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
+    37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
+    37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
+    38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
+    38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
+    38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
+    38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
+    39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
+    39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
+    39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
+    39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
+    40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
+    40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
+    {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
+    151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
+    {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
+    {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
+    0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
+    15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
+    162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
+    63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
+    38315, 38741, 171581, 173594],
+  'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
+    {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
+    8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
+    {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
+    {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
+    8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
+    9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
+    {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
+    {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
+    {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
+    730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
+    9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
+    9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
+    9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
+    8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
+    13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
+    {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
+    {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
+    9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
+    9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
+    9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
+    9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
+    {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
+    {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
+    {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
+    13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
+    {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
+    8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
+    13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
+    198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
+    {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
+    {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
+    312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
+    {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
+    {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
+    1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
+    {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
+    {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
+    44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
+    44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
+    {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
+    {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
+    44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
+    44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
+    44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
+    {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
+    44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
+    {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
+    {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
+    {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
+    44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
+    44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
+    {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
+    44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
+    44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
+    {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
+    {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
+    {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
+    {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
+    {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
+    {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
+    {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
+    {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
+    45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
+    45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
+    45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
+    {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
+    {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
+    {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
+    {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
+    {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
+    {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
+    {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
+    45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
+    45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
+    45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
+    {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
+    45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
+    {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
+    {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
+    {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
+    45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
+    {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
+    {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
+    {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
+    {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
+    45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
+    {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
+    46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
+    {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
+    {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
+    46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
+    {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
+    46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
+    {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
+    {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
+    {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
+    {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
+    {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
+    46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
+    46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
+    {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
+    {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
+    46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
+    46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
+    {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
+    {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
+    {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
+    {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
+    47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
+    47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
+    {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
+    {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
+    47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
+    {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
+    {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
+    {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
+    47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
+    {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
+    {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
+    47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
+    47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
+    47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
+    47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
+    {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
+    47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
+    {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
+    47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
+    48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
+    {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
+    {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
+    {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
+    {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
+    48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
+    {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
+    48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
+    {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
+    48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
+    {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
+    {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
+    48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
+    48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
+    {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
+    {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
+    {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
+    {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
+    {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
+    {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
+    {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
+    49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
+    {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
+    49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
+    {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
+    {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
+    {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
+    {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
+    {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
+    {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
+    {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
+    49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
+    49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
+    49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
+    {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
+    {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
+    {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
+    49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
+    49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
+    49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
+    49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
+    {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
+    {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
+    50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
+    {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
+    {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
+    {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
+    50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
+    50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
+    {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
+    {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
+    {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
+    {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
+    {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
+    50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
+    {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
+    {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
+    {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
+    {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
+    {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
+    {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
+    {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
+    50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
+    {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
+    {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
+    {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
+    {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
+    50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
+    50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
+    51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
+    51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
+    {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
+    {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
+    {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
+    51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
+    {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
+    {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
+    {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
+    {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
+    51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
+    {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
+    {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
+    51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
+    51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
+    {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
+    51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
+    {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
+    {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
+    {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
+    {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
+    {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
+    {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
+    {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
+    52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
+    {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
+    {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
+    {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
+    52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
+    {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
+    {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
+    {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
+    52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
+    52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
+    52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
+    52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
+    52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
+    {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
+    52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
+    {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
+    {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
+    {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
+    53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
+    {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
+    {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
+    53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
+    53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
+    {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
+    {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
+    53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
+    {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
+    53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
+    {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
+    {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
+    53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
+    {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
+    53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
+    53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
+    {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
+    {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
+    53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
+    {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
+    {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
+    {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
+    54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
+    54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
+    {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
+    {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
+    54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
+    54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
+    54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
+    54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
+    {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
+    {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
+    {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
+    54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
+    54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
+    {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
+    54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
+    {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
+    54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
+    54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
+    {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
+    55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
+    {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
+    {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
+    55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
+    55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
+    {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
+    21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
+    29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
+    36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
+    29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
+    23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
+    30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
+    35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
+    34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
+    26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
+    {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
+    22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
+    30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
+    37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
+    24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
+    33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
+    21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
+    36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
+    24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
+    26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
+    24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
+    35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
+    [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
+    32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
+    20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
+    24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
+    28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
+    32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
+    38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
+    23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
+    31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
+    21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
+    25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
+    32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
+    35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
+    26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
+    26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
+    20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
+    25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
+    [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
+    36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
+    23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
+    35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
+    21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
+    37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
+    25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
+    21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
+    30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
+    39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
+    [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
+    24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
+    27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
+    32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
+    36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
+    [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
+    21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
+    23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
+    21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
+    36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
+    36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
+    31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
+    30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
+    26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
+    29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
+    25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
+    37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
+    30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
+    22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
+    24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
+    27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
+    30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
+    32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
+    37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
+    21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
+    [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
+    25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
+    20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
+    [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
+    25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
+    [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
+    [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
+    [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
+    [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
+    27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
+    37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
+    26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
+    35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
+    22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
+    20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
+    25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
+    24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
+    23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
+    26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
+    31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
+    37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
+    31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
+    28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
+    21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
+    31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
+    31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
+    36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
+    37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
+    [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
+    [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
+    [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
+    [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
+    [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
+    27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
+    [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
+    [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
+    [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
+    [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
+    [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
+    [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
+    [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
+    [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
+    [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
+    [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
+    [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
+    [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
+    [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
+    [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
+    [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
+    28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
+    [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
+    31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
+    [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
+    28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
+    25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
+    [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
+    [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
+    [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
+    [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
+    [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
+    [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
+    [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
+    [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
+    [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
+    [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
+    [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
+    [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
+    [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
+    [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
+    [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
+    [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
+    32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
+    [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
+    [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
+    [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
+    [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
+    [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
+    [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
+    [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
+    [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
+    [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
+    38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
+    29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
+    24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
+    24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
+    34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
+    38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
+    33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
+    27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
+    39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
+    35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
+    [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
+    26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
+    40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
+    26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
+    [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
+    27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
+    26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
+    29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
+    25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
+    32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
+    20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
+    34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
+    23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
+    [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
+    24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
+    38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
+    27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
+    36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
+    26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
+    [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
+    25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
+    20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
+    [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
+    33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
+    20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
+    32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
+    20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
+    29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
+    38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
+    27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
+    34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
+    30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
+    26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
+    20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
+    29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
+    [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
+    35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
+    22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
+    34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
+    21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
+    24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
+    [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
+    36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
+    40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
+    24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
+    36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
+    32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
+    24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
+    {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
+    32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
+    36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
+    24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
+    36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
+    20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
+    [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
+    24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
+    28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
+    32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
+    36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
+    21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
+    37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
+    26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
+    20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
+    24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
+    [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
+    36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
+    [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
+    24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
+    26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
+    34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
+    [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
+    28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
+    21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
+    29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
+    34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
+    23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
+    [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
+    36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
+    24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
+    32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
+    31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
+    24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
+    28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
+    32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
+    39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
+    23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
+    24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
+    37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
+    23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
+    25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
+    29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
+    32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
+    35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
+    {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
+    22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
+    33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
+    27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
+    34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
+    36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
+    [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
+    25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
+    [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
+    26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
+    35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
+    24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
+    36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
+    24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
+    33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
+    22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
+    28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
+    [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
+    [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
+    40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
+    [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
+    23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
+    26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
+    33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
+    27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
+    30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
+    38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
+    25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
+    33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
+    26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
+    [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
+    28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
+    25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
+    23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
+    20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
+    33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
+    32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
+    25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
+    28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
+    36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
+    28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
+    [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
+    27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
+    29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
+    20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
+    34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
+    20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
+    23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
+    28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
+    29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
+    20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
+    28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
+    23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
+    32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
+    24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
+    23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
+    23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
+    31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
+    36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
+    20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
+    28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
+    37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
+    23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
+    30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
+    36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
+    26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
+    28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
+    39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
+    23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
+    29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
+    [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
+    23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
+    33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
+    20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
+    24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
+    {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
+    30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
+    36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
+    [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
+    37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
+    24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
+    38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
+    33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
+    27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
+    35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
+    24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
+    [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
+    28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
+    21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
+    33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
+    [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
+    24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
+    33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
+    23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
+    30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
+    38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
+    33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
+    26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
+    22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
+    27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
+    33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
+    [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
+    26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
+    29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
+    25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
+    32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
+    38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
+    30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
+    [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
+    20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
+    24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
+    [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
+    35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
+    39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
+    21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
+    25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
+    24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
+    26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
+    28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
+    31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
+    37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
+    21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
+    33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
+    [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
+    25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
+    28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
+    31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
+    35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
+    26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
+    20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
+    32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
+    24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
+    21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
+    27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
+    32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
+    36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
+    20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
+    30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
+    34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
+    25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
+    21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
+    26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
+    31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
+    35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
+    21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
+    28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
+    32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
+    [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
+    23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
+    36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
+    38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
+    24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
+    25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
+    29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
+    39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
+    22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
+    21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
+    27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
+    20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
+    37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
+    20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
+    30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
+    25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
+    36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
+    28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
+    30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
+    30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
+    35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
+    36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
+    26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
+    32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
+    37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
+    26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
+    34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
+    27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
+    37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
+    30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
+    36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
+    34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
+    23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
+    40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
+    23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
+    31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
+    [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
+    23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
+    31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
+    25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
+    22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
+    37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
+    35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
+    23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
+    27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
+    25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
+    31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
+    22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
+    24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
+    32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
+    36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
+    25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
+    28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
+    31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
+    33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
+    38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
+    24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
+    33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
+    [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
+    27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
+    31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
+    [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
+    29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
+    20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
+    36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
+    24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
+    38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
+    28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
+    38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
+    26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
+    21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
+    35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
+    26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
+    38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
+    27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
+    [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
+    [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
+    34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
+    [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
+    33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
+    27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
+    34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
+    26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
+    22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
+    28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
+    29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
+    34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
+    23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
+    24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
+    21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
+    33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
+    20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
+    28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
+    29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
+    {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
+    31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
+    24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
+    28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
+    23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
+    28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
+    21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
+    21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
+    [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
+    24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
+    28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
+    33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
+    35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
+    20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
+    25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
+    35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
+    {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
+    {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
+    {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
+    8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
+    8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
+    0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
+    {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
+    {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
+    8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
+    0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
+    {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
+    9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
+    {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
+    8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
+    {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
+    8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
+    {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
+    0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
+    {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
+    {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
+    44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
+    {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
+    {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
+    {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
+    {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
+    {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
+    44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
+    {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
+    {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
+    {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
+    {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
+    44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
+    {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
+    {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
+    {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
+    {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
+    {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
+    {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
+    {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
+    {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
+    {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
+    44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
+    {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
+    {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
+    {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
+    {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
+    {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
+    {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
+    {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
+    {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
+    {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
+    {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
+    {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
+    {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
+    {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
+    {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
+    {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
+    {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
+    {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
+    {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
+    {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
+    {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
+    45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
+    {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
+    {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
+    {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
+    {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
+    {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
+    {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
+    {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
+    {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
+    {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
+    45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
+    {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
+    {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
+    {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
+    45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
+    {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
+    {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
+    {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
+    {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
+    {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
+    {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
+    {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
+    {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
+    {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
+    {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
+    46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
+    {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
+    {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
+    {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
+    46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
+    {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
+    {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
+    {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
+    {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
+    {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
+    {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
+    {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
+    {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
+    {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
+    {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
+    {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
+    {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
+    {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
+    {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
+    {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
+    {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
+    {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
+    {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
+    {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
+    {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
+    {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
+    {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
+    47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
+    {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
+    47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
+    {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
+    {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
+    {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
+    {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
+    {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
+    {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
+    47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
+    {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
+    {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
+    {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
+    {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
+    {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
+    47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
+    {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
+    {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
+    {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
+    {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
+    {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
+    {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
+    47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
+    {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
+    {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
+    {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
+    {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
+    {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
+    {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
+    {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
+    {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
+    {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
+    {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
+    {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
+    {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
+    {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
+    {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
+    {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
+    {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
+    {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
+    {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
+    {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
+    {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
+    {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
+    48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
+    {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
+    {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
+    {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
+    {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
+    {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
+    {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
+    {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
+    {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
+    {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
+    {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
+    {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
+    {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
+    {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
+    {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
+    {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
+    {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
+    {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
+    {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
+    {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
+    {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
+    {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
+    {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
+    {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
+    49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
+    49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
+    {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
+    {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
+    {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
+    {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
+    {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
+    {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
+    {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
+    {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
+    {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
+    49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
+    {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
+    {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
+    {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
+    {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
+    49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
+    {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
+    {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
+    {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
+    {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
+    {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
+    {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
+    {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
+    49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
+    {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
+    {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
+    {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
+    {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
+    {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
+    {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
+    {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
+    {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
+    {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
+    {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
+    {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
+    {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
+    50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
+    {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
+    {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
+    {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
+    {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
+    {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
+    {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
+    {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
+    50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
+    {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
+    {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
+    {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
+    {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
+    {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
+    {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
+    {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
+    {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
+    50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
+    {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
+    {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
+    {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
+    {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
+    {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
+    {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
+    {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
+    {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
+    {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
+    {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
+    51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
+    {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
+    {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
+    {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
+    {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
+    {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
+    {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
+    51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
+    {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
+    {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
+    {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
+    {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
+    {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
+    {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
+    {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
+    {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
+    {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
+    {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
+    {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
+    {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
+    {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
+    51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
+    {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
+    {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
+    {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
+    {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
+    {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
+    51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
+    {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
+    {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
+    {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
+    {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
+    {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
+    {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
+    {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
+    {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
+    {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
+    {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
+    {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
+    52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
+    {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
+    {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
+    {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
+    52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
+    {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
+    {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
+    {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
+    52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
+    {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
+    {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
+    {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
+    {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
+    {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
+    52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
+    {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
+    {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
+    {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
+    {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
+    {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
+    {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
+    {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
+    {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
+    {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
+    {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
+    {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
+    53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
+    {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
+    {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
+    {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
+    {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
+    {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
+    {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
+    {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
+    {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
+    {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
+    {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
+    {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
+    {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
+    {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
+    {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
+    {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
+    53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
+    {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
+    {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
+    {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
+    {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
+    {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
+    {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
+    {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
+    {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
+    {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
+    {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
+    54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
+    {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
+    {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
+    {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
+    {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
+    54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
+    {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
+    {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
+    {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
+    {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
+    {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
+    {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
+    {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
+    54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
+    {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
+    {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
+    {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
+    54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
+    {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
+    {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
+    {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
+    {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
+    {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
+    {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
+    {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
+    {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
+    {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
+    {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
+    {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
+    54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
+    {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
+    {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
+    55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
+    {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
+    {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
+    {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
+    {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
+    55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
+    55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
+    {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
+    {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
+    {f: 6, c: 55198}],
+  'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
+    8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
+    183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
+    {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
+    {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
+    {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
+    {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
+    {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
+    65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
+    9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
+    {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
+    65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
+    8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
+    8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
+    9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
+    0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
+    8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
+    {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
+    [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
+    [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
+    9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
+    9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
+    9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
+    {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
+    {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+    {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
+    [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
+    [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
+    [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
+    [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
+    [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
+    [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
+    [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
+    [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
+    [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
+    [12057, 21353, 63192], [12059, 21430, 63193],
+    [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
+    [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
+    [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
+    [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
+    [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
+    9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
+    [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
+    [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
+    [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
+    19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
+    20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
+    [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
+    [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
+    [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
+    [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
+    [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
+    19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
+    20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
+    {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
+    20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
+    21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
+    22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
+    24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
+    [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
+    [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
+    [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
+    [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
+    [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
+    [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
+    [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
+    20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
+    {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
+    {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
+    21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
+    21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
+    21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
+    22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
+    24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
+    {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
+    {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
+    27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
+    [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
+    [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
+    [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
+    [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
+    [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
+    20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
+    {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
+    20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
+    {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
+    {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
+    21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
+    22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
+    {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
+    {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
+    24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
+    {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
+    {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
+    27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
+    27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
+    [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
+    [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
+    [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
+    {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
+    [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
+    [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
+    [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
+    20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
+    20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
+    20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
+    {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
+    {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
+    21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
+    21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
+    21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
+    22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
+    22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
+    22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
+    {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
+    24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
+    24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
+    25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
+    25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
+    25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
+    26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
+    27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
+    27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
+    27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
+    28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
+    {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
+    32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
+    33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
+    [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
+    [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
+    [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
+    24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
+    [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
+    20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
+    20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
+    20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
+    20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
+    21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
+    21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
+    21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
+    21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
+    22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
+    {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
+    22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
+    23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
+    23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
+    24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
+    {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
+    24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
+    24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
+    25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
+    25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
+    [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
+    {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
+    26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
+    26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
+    26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
+    26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
+    27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
+    27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
+    27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
+    27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
+    29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
+    29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
+    30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
+    31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
+    32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
+    33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
+    33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
+    34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
+    [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
+    38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
+    [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
+    20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
+    20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
+    20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
+    21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
+    21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
+    21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
+    22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
+    22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
+    23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
+    23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
+    24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
+    24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
+    24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
+    24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
+    25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
+    25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
+    26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
+    26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
+    26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
+    26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
+    27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
+    {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
+    27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
+    28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
+    29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
+    30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
+    {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
+    30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
+    31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
+    31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
+    32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
+    32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
+    33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
+    33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
+    33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
+    35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
+    36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
+    36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
+    {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
+    [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
+    [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
+    20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
+    20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
+    20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
+    20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
+    20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
+    21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
+    21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
+    21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
+    22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
+    23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
+    23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
+    23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
+    24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
+    24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
+    24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
+    25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
+    25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
+    26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
+    26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
+    26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
+    26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
+    27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
+    28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
+    28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
+    28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
+    29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
+    30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
+    30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
+    {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
+    30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
+    31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
+    31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
+    32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
+    32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
+    32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
+    33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
+    33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
+    33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
+    33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
+    34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
+    34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
+    35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
+    36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
+    36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
+    37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
+    38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
+    [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
+    [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
+    20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
+    20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
+    21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
+    21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
+    21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
+    21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
+    22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
+    23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
+    23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
+    {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
+    23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
+    {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
+    24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
+    24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
+    24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
+    {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
+    25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
+    25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
+    25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
+    25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
+    26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
+    26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
+    26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
+    27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
+    28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
+    28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
+    28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
+    28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
+    29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
+    29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
+    {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
+    30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
+    30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
+    31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
+    31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
+    32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
+    32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
+    33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
+    33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
+    {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
+    34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
+    34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
+    35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
+    36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
+    36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
+    36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
+    37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
+    38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
+    31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
+    [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
+    20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
+    21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
+    21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
+    21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
+    21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
+    22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
+    [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
+    23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
+    24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
+    24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
+    24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
+    24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
+    25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
+    {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
+    25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
+    26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
+    26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
+    26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
+    26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
+    {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
+    28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
+    28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
+    28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
+    {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
+    29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
+    29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
+    {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
+    30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
+    30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
+    31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
+    31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
+    32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
+    32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
+    33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
+    33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
+    33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
+    33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
+    34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
+    35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
+    35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
+    36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
+    36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
+    36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
+    37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
+    37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
+    38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
+    38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
+    38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
+    [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
+    {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
+    21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
+    21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
+    21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
+    22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
+    22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
+    23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
+    24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
+    24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
+    {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
+    25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
+    26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
+    26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
+    26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
+    27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
+    28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
+    28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
+    29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
+    29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
+    29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
+    30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
+    {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
+    30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
+    30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
+    31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
+    31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
+    32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
+    32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
+    {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
+    33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
+    33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
+    34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
+    35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
+    {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
+    35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
+    35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
+    36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
+    36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
+    36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
+    36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
+    37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
+    37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
+    {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
+    {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
+    {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
+    [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
+    20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
+    21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
+    22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
+    22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
+    22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
+    23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
+    23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
+    24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
+    24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
+    25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
+    25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
+    27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
+    27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
+    28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
+    28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
+    28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
+    29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
+    29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
+    30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
+    30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
+    31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
+    [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
+    {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
+    32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
+    32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
+    33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
+    33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
+    33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
+    34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
+    35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
+    35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
+    36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
+    36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
+    36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
+    37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
+    38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
+    38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
+    39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
+    40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
+    20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
+    {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
+    22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
+    22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
+    23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
+    {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
+    24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
+    24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
+    24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
+    25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
+    25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
+    {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
+    27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
+    27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
+    28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
+    28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
+    29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
+    30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
+    30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
+    30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
+    31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
+    31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
+    32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
+    32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
+    34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
+    34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
+    34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
+    35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
+    35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
+    35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
+    {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
+    36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
+    36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
+    36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
+    37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
+    37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
+    38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
+    39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
+    {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
+    40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
+    20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
+    22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
+    22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
+    23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
+    25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
+    25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
+    26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
+    27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
+    27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
+    28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
+    29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
+    29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
+    30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
+    31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
+    31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
+    32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
+    {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
+    {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
+    34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
+    35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
+    35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
+    35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
+    36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
+    36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
+    37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
+    37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
+    38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
+    38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
+    39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
+    39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
+    [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
+    22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
+    23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
+    24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
+    25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
+    {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
+    27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
+    28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
+    28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
+    29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
+    29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
+    30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
+    31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
+    31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
+    32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
+    32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
+    33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
+    33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
+    34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
+    34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
+    35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
+    35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
+    36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
+    36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
+    37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
+    37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
+    38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
+    39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
+    40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
+    25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
+    26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
+    27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
+    {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
+    30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
+    {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
+    31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
+    32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
+    34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
+    35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
+    36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
+    37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
+    37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
+    38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
+    38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
+    39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
+    39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
+    22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
+    25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
+    28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
+    29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
+    31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
+    32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
+    33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
+    34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
+    35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
+    36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
+    37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
+    37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
+    38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
+    39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
+    40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
+    22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
+    25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
+    29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
+    31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
+    33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
+    {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
+    35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
+    37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
+    39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
+    40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
+    25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
+    29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
+    34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
+    35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
+    37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
+    38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
+    39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
+    40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
+    23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
+    29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
+    33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
+    37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
+    39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
+    40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
+    25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
+    32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
+    37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
+    39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
+    28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
+    35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
+    38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
+    {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
+    34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
+    40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
+    36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
+    38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
+    [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
+    [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
+    20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
+    22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
+    [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
+    21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
+    23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
+    27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
+    32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
+    20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
+    21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
+    22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
+    22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
+    [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
+    25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
+    26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
+    27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
+    28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
+    [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
+    37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
+    20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
+    20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
+    21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
+    21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
+    21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
+    22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
+    22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
+    23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
+    24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
+    24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
+    24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
+    {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
+    25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
+    26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
+    {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
+    27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
+    27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
+    29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
+    {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
+    33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
+    [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
+    38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
+    20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
+    20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
+    20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
+    21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
+    21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
+    21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
+    22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
+    {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
+    22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
+    22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
+    23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
+    23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
+    24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
+    24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
+    24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
+    24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
+    25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
+    26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
+    26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
+    26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
+    26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
+    27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
+    27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
+    27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
+    27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
+    28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
+    29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
+    29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
+    30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
+    30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
+    31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
+    33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
+    33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
+    34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
+    36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
+    38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
+    20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
+    20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
+    21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
+    21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
+    21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
+    22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
+    22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
+    23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
+    23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
+    23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
+    23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
+    24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
+    24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
+    24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
+    25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
+    25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
+    25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
+    26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
+    26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
+    26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
+    26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
+    26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
+    27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
+    27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
+    27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
+    27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
+    28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
+    {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
+    29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
+    29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
+    29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
+    30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
+    30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
+    30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
+    31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
+    {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
+    {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
+    32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
+    32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
+    33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
+    33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
+    34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
+    35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
+    37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
+    38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
+    20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
+    20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
+    20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
+    {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
+    21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
+    21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
+    {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
+    22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
+    23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
+    23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
+    23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
+    24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
+    24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
+    25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
+    25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
+    25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
+    25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
+    {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
+    26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
+    26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
+    26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
+    27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
+    27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
+    28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
+    28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
+    28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
+    28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
+    28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
+    29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
+    29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
+    29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
+    30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
+    30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
+    30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
+    30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
+    31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
+    31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
+    31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
+    31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
+    32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
+    32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
+    33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
+    33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
+    33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
+    33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
+    33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
+    34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
+    34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
+    34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
+    34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
+    36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
+    36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
+    37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
+    37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
+    20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
+    20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
+    {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
+    21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
+    21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
+    21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
+    21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
+    22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
+    22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
+    22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
+    [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
+    23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
+    23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
+    23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
+    23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
+    23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
+    24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
+    {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
+    24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
+    25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
+    25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
+    25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
+    26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
+    {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
+    26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
+    26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
+    26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
+    {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
+    28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
+    28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
+    28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
+    28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
+    28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
+    28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
+    29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
+    29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
+    29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
+    30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
+    30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
+    30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
+    31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
+    31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
+    31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
+    31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
+    32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
+    {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
+    32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
+    33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
+    33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
+    33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
+    33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
+    33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
+    33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
+    34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
+    {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
+    34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
+    34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
+    35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
+    36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
+    {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
+    37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
+    37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
+    37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
+    38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
+    20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
+    20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
+    21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
+    21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
+    21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
+    22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
+    22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
+    23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
+    23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
+    23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
+    23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
+    23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
+    23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
+    24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
+    24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
+    24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
+    25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
+    25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
+    25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
+    25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
+    26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
+    26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
+    26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
+    26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
+    26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
+    {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
+    26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
+    27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
+    28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
+    28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
+    28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
+    28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
+    {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
+    28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
+    {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
+    29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
+    29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
+    29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
+    30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
+    30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
+    {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
+    30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
+    31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
+    31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
+    32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
+    32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
+    {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
+    33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
+    {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
+    [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
+    33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
+    33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
+    [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
+    33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
+    33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
+    34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
+    34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
+    34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
+    {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
+    {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
+    35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
+    36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
+    36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
+    {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
+    36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
+    37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
+    37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
+    37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
+    37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
+    38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
+    38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
+    20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
+    20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
+    {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
+    [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
+    21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
+    22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
+    22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
+    23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
+    23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
+    23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
+    24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
+    24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
+    24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
+    25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
+    25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
+    25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
+    25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
+    26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
+    26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
+    26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
+    26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
+    26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
+    26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
+    27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
+    28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
+    28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
+    28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
+    28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
+    29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
+    28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
+    29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
+    29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
+    29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
+    29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
+    30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
+    30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
+    30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
+    30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
+    30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
+    31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
+    31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
+    31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
+    32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
+    32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
+    {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
+    33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
+    33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
+    33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
+    33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
+    33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
+    33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
+    33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
+    33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
+    34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
+    35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
+    35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
+    35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
+    35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
+    {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
+    36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
+    36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
+    {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
+    37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
+    37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
+    37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
+    37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
+    37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
+    38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
+    {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
+    39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
+    20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
+    20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
+    22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
+    22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
+    22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
+    22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
+    23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
+    23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
+    23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
+    23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
+    24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
+    24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
+    24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
+    25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
+    25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
+    25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
+    26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
+    27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
+    27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
+    27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
+    27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
+    {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
+    28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
+    28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
+    28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
+    28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
+    29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
+    29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
+    29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
+    30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
+    30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
+    30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
+    {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
+    31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
+    31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
+    31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
+    32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
+    32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
+    32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
+    32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
+    33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
+    33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
+    33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
+    34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
+    33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
+    34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
+    34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
+    34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
+    35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
+    35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
+    35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
+    36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
+    {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
+    37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
+    37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
+    37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
+    37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
+    37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
+    38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
+    {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
+    39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
+    {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
+    20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
+    20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
+    22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
+    22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
+    22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
+    23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
+    23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
+    24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
+    24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
+    25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
+    25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
+    25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
+    {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
+    27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
+    27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
+    27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
+    27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
+    27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
+    28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
+    28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
+    28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
+    28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
+    29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
+    29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
+    29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
+    29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
+    30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
+    30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
+    30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
+    31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
+    31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
+    31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
+    32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
+    32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
+    33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
+    33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
+    34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
+    34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
+    34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
+    {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
+    34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
+    34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
+    34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
+    34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
+    {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
+    35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
+    35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
+    35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
+    36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
+    36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
+    36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
+    {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
+    {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
+    {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
+    37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
+    37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
+    37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
+    38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
+    38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
+    38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
+    {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
+    39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
+    39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
+    39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
+    40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
+    {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
+    22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
+    22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
+    23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
+    23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
+    23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
+    24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
+    25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
+    24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
+    25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
+    {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
+    27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
+    27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
+    27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
+    27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
+    27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
+    28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
+    28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
+    29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
+    29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
+    {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
+    29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
+    30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
+    30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
+    30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
+    {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
+    31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
+    31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
+    {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
+    32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
+    32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
+    32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
+    33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
+    34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
+    34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
+    34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
+    34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
+    34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
+    34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
+    35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
+    {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
+    35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
+    36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
+    36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
+    36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
+    37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
+    37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
+    37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
+    37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
+    37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
+    38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
+    38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
+    38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
+    39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
+    39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
+    39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
+    40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
+    40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
+    40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
+    {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
+    22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
+    23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
+    25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
+    25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
+    27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
+    27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
+    27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
+    28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
+    29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
+    29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
+    29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
+    30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
+    {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
+    31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
+    31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
+    31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
+    31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
+    32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
+    32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
+    33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
+    34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
+    34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
+    34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
+    34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
+    34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
+    34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
+    35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
+    {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
+    35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
+    35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
+    36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
+    37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
+    37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
+    37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
+    37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
+    38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
+    38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
+    38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
+    39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
+    39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
+    39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
+    39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
+    40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
+    {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
+    40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
+    [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
+    22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
+    25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
+    25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
+    26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
+    27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
+    28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
+    [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
+    29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
+    30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
+    {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
+    31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
+    31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
+    32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
+    33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
+    34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
+    34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
+    34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
+    34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
+    35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
+    35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
+    35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
+    35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
+    36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
+    {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
+    37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
+    37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
+    37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
+    38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
+    38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
+    38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
+    39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
+    39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
+    39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
+    39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
+    40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
+    40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
+    40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
+    {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
+    {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
+    25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
+    27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
+    27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
+    28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
+    29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
+    {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
+    31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
+    32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
+    32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
+    33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
+    34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
+    34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
+    34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
+    {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
+    35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
+    35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
+    {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
+    36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
+    37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
+    37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
+    37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
+    38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
+    {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
+    39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
+    39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
+    39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
+    39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
+    39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
+    {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
+    40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
+    40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
+    22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
+    {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
+    {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
+    {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
+    28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
+    29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
+    {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
+    31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
+    31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
+    33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
+    34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
+    34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
+    35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
+    36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
+    37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
+    37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
+    37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
+    38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
+    39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
+    39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
+    39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
+    39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
+    39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
+    40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
+    40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
+    40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
+    40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
+    24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
+    {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
+    29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
+    31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
+    32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
+    34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
+    34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
+    35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
+    36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
+    37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
+    38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
+    39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
+    39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
+    39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
+    40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
+    40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
+    40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
+    40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
+    24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
+    {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
+    29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
+    31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
+    {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
+    34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
+    35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
+    36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
+    {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
+    39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
+    39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
+    39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
+    40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
+    40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
+    40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
+    24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
+    {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
+    30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
+    34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
+    35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
+    37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
+    39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
+    40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
+    40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
+    40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
+    40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
+    23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
+    29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
+    33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
+    {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
+    38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
+    40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
+    40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
+    {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
+    28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
+    32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
+    35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
+    37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
+    40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
+    40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
+    38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
+    40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
+    34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
+    39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
+    25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
+    40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
+    {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
+    65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
+    [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
+    [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
+    [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
+    [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
+    [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
+    [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
+    [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
+    [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
+    [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
+    [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
+    [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
+    [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
+    [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
+    [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
+    [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
+    [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
+    [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
+    [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
+    [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
+    [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
+    [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
+    [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
+    [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
+    [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
+    [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
+    [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
+    [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
+    [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
+    [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
+    [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
+    [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
+    [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
+    [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
+    [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
+    [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
+    [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
+    [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
+    [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
+    [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
+    [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
+    [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
+    [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
+    [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
+    [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
+    [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
+    [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
+    [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
+    [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
+    [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
+    [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
+    [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
+    [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
+    [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
+    [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
+    [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
+    [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
+    [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
+    [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
+    [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
+    [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
+    [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
+    {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
+    [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
+    [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
+    9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
+    9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
+    {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
+    [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
+    [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
+    [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
+    [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
+    [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
+    [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
+    [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
+    [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
+    [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
+    [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
+    [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
+    [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
+    [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
+    [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
+    [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
+    [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
+    [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
+    [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
+    [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
+    [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
+    [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
+    [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
+    [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
+    [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
+    [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
+    [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
+    [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
+    [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
+    [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
+    [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
+    [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
+    [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
+    [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
+    [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
+    [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
+    [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
+    [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
+    [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
+    [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
+    [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
+    [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
+    [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
+    [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
+    [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
+    [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
+    [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
+    [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
+    [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
+    [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
+    [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
+    [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
+    [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
+    [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
+    [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
+    [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
+    [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
+    [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
+    [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
+    [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
+    [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
+    [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
+    [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
+    [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
+    [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
+    [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
+    [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
+    [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
+    [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
+    [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
+    [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
+    [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
+    [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
+    [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
+    [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
+    [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
+    [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
+    [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
+    [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
+    [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
+    [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
+    [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
+    [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
+    [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
+    [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
+    [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
+    [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
+    [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
+    [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
+    [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
+    [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
+    [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
+    [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
+    [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
+    [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
+    [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
+    [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
+    [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
+    [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
+    [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
+    [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
+    [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
+    [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
+    [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
+    [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
+    [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
+    [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
+    [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
+    [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
+    [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
+    [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
+    [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
+    [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
+    [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
+    [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
+    [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
+    [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
+    [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
+    [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
+    [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
+    [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
+    [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
+    [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
+    [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
+    [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
+    [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
+    [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
+    [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
+    [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
+    [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
+    [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
+    [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
+    [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
+    [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
+    [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
+    [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
+    [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
+    [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
+    [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
+    [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
+    [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
+    [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
+    [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
+    [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
+    [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
+    [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
+    [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
+    [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
+    [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
+    [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
+    [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
+    [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
+    [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
+    [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
+    [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
+    [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
+    [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
+    [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
+    [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
+    [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
+    [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
+    [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
+    [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
+    [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
+    [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
+    [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
+    [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
+    [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
+    [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
+    [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
+    [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
+    [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
+    [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
+    [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
+    [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
+    [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
+    [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
+    [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
+    [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
+    [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
+    [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
+    [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
+    [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
+    [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
+    [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
+    [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
+    [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
+    [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
+    [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
+    [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
+    [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
+    [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
+    [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
+    [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
+    [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
+    [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
+    [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
+    [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
+    [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
+    [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
+    [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
+    [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
+    [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
+    [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
+    [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
+    [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
+    [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
+    [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
+    [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
+    [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
+    [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
+    [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
+    [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
+    [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
+    [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
+    [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
+    [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
+    [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
+    [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
+    [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
+    [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
+    [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
+    [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
+    [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
+    [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
+    [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
+    [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
+    [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
+    [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
+    [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
+    [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
+    [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
+    [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
+    [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
+    [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
+    [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
+    [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
+    [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
+    [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
+    [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
+    [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
+    [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
+    [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
+    [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
+    [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
+    [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
+    [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
+    [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
+    [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
+    [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
+    [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
+    [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
+    [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
+    [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
+    [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
+    [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
+    [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
+    [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
+    [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
+    [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
+    [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
+    [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
+    [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
+    [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
+    [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
+    [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
+    [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
+    [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
+    [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
+    [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
+    [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
+    [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
+    [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
+    [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
+    [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
+    [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
+    [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
+    [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
+    [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
+    [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
+    [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
+    [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
+    [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
+    [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
+    [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
+    [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
+    [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
+    [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
+    [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
+    [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
+    [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
+    [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
+    [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
+    [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
+    [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
+    [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
+    [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
+    [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
+    [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
+    [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
+    [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
+    [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
+    [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
+    [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
+    [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
+    [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
+    [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
+    [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
+    [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
+    [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
+    [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
+    [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
+    [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
+    [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
+    [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
+    [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
+    [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
+    [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
+    [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
+    [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
+    [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
+    [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
+    [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
+    [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
+    [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
+    [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
+    [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
+    [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
+    [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
+    [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
+    [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
+    [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
+    [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
+    [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
+    [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
+    [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
+    [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
+    [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
+    [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
+    [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
+    [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
+    [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
+    [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
+    [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
+    [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
+    [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
+    [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
+    [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
+    [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
+    [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
+    [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
+    [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
+    [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
+    [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
+    [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
+    [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
+    [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
+    [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
+    [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
+    [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
+    [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
+    [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
+    [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
+    [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
+    [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
+    [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
+    [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
+    [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
+    [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
+    [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
+    [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
+    [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
+    [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
+    [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
+    [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
+    [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
+    [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
+    [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
+    [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
+    [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
+    [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
+    [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
+    [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
+    [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
+    [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
+    [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
+    [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
+    [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
+    [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
+    [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
+    [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
+    [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
+    [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
+    [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
+    [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
+    [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
+    [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
+    [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
+    [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
+    [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
+    [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
+    [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
+    [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
+    [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
+    [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
+    [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
+    [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
+    [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
+    [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
+    [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
+    [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
+    [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
+    [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
+    [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
+    [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
+    [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
+    [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
+    [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
+    [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
+    [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
+    [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
+    [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
+    [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
+    [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
+    [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
+    [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
+    [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
+    [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
+    [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
+    [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
+    [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
+    [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
+    [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
+    [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
+    [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
+    [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
+    [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
+    [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
+    [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
+    [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
+    [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
+    [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
+    [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
+    [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
+    [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
+    [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
+    [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
+    [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
+    [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
+    [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
+    [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
+    [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
+    [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
+    [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
+    [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
+    [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
+    [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
+    [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
+    [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
+    [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
+    [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
+    [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
+    [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
+    [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
+    [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
+    [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
+    [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
+    [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
+    [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
+    [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
+    [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
+    [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
+    [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
+    [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
+    [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
+    [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
+    [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
+    [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
+    [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
+    [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
+    [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
+    [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
+    [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
+    [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
+    [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
+    [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
+    [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
+    [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
+    [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
+    [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
+    [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
+    [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
+    [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
+    [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
+    [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
+    [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
+    [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
+    [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
+    [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
+    60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
+    [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
+    [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
+    [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
+    [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
+    [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
+    [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
+    [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
+    [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
+    [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
+    [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
+    60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
+    60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
+    [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
+    [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
+    [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
+    [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
+    [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
+    [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
+    [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
+    [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
+    [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
+    [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
+    [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
+    [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
+    [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
+    [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
+    [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
+    [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
+    [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
+    [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
+    [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
+    [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
+    [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
+    [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
+    [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
+    [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
+    [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
+    [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
+    [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
+    [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
+    [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
+    [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
+    [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
+    [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
+    [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
+    [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
+    [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
+    [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
+    [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
+    [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
+    [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
+    [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
+    [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
+    [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
+    [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
+    [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
+    [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
+    [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
+    [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
+    [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
+    [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
+    [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
+    [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
+    [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
+    [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
+    [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
+    [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
+    [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
+    [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
+    [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
+    [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
+    [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
+    [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
+    [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
+    [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
+    [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
+    [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
+    [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
+    [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
+    [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
+    [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
+    [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
+    [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
+    [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
+    [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
+    [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
+    [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
+    [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
+    [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
+    [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
+    [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
+    [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
+    [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
+    [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
+    [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
+    [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
+    [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
+    [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
+    [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
+    [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
+    [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
+    [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
+    [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
+    [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
+    [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
+    [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
+    [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
+    [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
+    [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
+    [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
+    [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
+    [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
+    [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
+    [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
+    [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
+    [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
+    [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
+    [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
+    [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
+    [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
+    [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
+    [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
+    [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
+    [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
+    [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
+    [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
+    [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
+    [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
+    [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
+    [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
+    [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
+    [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
+    [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
+    [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
+    [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
+    [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
+    [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
+    [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
+    [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
+    [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
+    [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
+    [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
+    [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
+    [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
+    [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
+    [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
+    [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
+    [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
+    [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
+    [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
+    [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
+    [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
+    [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
+    [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
+    [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
+    [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
+    [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
+    [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
+    [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
+    [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
+    [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
+    [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
+    [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
+    [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
+    [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
+    [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
+    [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
+    [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
+    [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
+    [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
+    [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
+    [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
+    [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
+    [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
+    [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
+    [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
+    [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
+    [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
+    [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
+    [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
+    [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
+    [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
+    [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
+    [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
+    [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
+    [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
+    [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
+    [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
+    [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
+    [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
+    [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
+    [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
+    [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
+    [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
+    [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
+    [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
+    [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
+    [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
+    [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
+    [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
+    [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
+    [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
+    [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
+    [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
+    [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
+    [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
+    [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
+    [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
+    [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
+    [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
+    [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
+    [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
+    [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
+    [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
+    [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
+    [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
+    [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
+    [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
+    [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
+    [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
+    [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
+    [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
+    [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
+    [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
+    [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
+    [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
+    [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
+    [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
+    [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
+    [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
+    [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
+    [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
+    [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
+    [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
+    [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
+    [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
+    [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
+    [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
+    [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
+    [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
+    [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
+    [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
+    [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
+    [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
+    [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
+    [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
+    [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
+    [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
+    [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
+    [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
+    [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
+    [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
+    [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
+    [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
+    [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
+    [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
+    [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
+    [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
+    [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
+    [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
+    0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
+    [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
+    [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
+    [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
+    [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
+    [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
+    [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
+    [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
+    [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
+    [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
+    [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
+    [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
+    [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
+    [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
+    [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
+    {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
+    {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
+    {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
+    {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
+    [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
+    [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
+    [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
+    [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
+    [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
+    [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
+    [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
+    [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
+    [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
+    [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
+    [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
+    [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
+    [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
+    [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
+    [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
+    [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
+    [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
+    [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
+    [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
+    [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
+    [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
+    [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
+    [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
+    [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
+    [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
+    [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
+    [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
+    [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
+    [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
+    [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
+    [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
+    [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
+    [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
+    [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
+    [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
+    [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
+    [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
+    [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
+    [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
+    [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
+    [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
+    [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
+    [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
+    [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
+    [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
+    [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
+    [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
+    [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
+    [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
+    [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
+    [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
+    [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
+    [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
+    [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
+    [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
+    [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
+    [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
+    [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
+    [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
+    [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
+    [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
+    [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
+    [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
+    [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
+    [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
+    [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
+    [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
+    [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
+    [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
+    [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
+    [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
+    [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
+    [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
+    [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
+    [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
+    [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
+    [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
+    [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
+    [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
+    [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
+    [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
+    [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
+    [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
+    [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
+    [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
+    [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
+    [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
+    [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
+    [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
+    [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
+    [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
+    [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
+    [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
+    [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
+    [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
+    [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
+    [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
+    [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
+    [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
+    [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
+    [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
+    [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
+    [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
+    [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
+    [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
+    [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
+    [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
+    [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
+    [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
+    [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
+    [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
+    [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
+    [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
+    [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
+    [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
+    [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
+    [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
+    [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
+    [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
+    [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
+    [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
+    [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
+    [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
+    [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
+    [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
+    [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
+    [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
+    [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
+    [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
+    [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
+    [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
+    [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
+    [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
+    [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
+    [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
+    [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
+    [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
+    [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
+    [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
+    [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
+    [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
+    [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
+    [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
+    [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
+    [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
+    [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
+    [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
+    [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
+    [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
+    [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
+    [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
+    [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
+    [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
+    [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
+    [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
+    [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
+    [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
+    [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
+    [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
+    [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
+    [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
+    [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
+    [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
+    [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
+    [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
+    [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
+    [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
+    [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
+    [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
+    [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
+    [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
+    [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
+    [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
+    [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
+    [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
+    [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
+    [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
+    [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
+    [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
+    [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
+    [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
+    [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
+    [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
+    [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
+    [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
+    [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
+    [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
+    [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
+    [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
+    [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
+    [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
+    [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
+    [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
+    [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
+    [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
+    [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
+    [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
+    [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
+    [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
+    [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
+    [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
+    [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
+    [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
+    [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
+    [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
+    [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
+    [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
+    [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
+    [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
+    [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
+    [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
+    [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
+    [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
+    [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
+    [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
+    [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
+    [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
+    [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
+    [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
+    [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
+    [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
+    [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
+    [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
+    [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
+    [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
+    [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
+    [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
+    [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
+    [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
+    [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
+    [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
+    [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
+    [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
+    [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
+    [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
+    [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
+    [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
+    [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
+    [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
+    [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
+    [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
+    [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
+    [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
+    [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
+    [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
+    [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
+    [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
+    [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
+    [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
+    [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
+    [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
+    [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
+    [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
+    [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
+    [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
+    [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
+    [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
+    [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
+    [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
+    [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
+    [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
+    [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
+    [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
+    [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
+    [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
+    [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
+    [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
+    [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
+    [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
+    [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
+    [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
+    [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
+    [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
+    [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
+    [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
+    [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
+    [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
+    [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
+    [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
+    [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
+    [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
+    [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
+    [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
+    [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
+    [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
+    [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
+    [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
+    [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
+    [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
+    [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
+    [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
+    [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
+    [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
+    [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
+    [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
+    [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
+    [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
+    [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
+    [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
+    [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
+    [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
+    [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
+    [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
+    36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
+    [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
+    [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
+    34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
+    [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
+    20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
+    24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
+    [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
+    [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
+    31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
+    62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
+    [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
+    34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
+    [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
+    23446, 62959, 32347],
+  'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
+    12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
+    {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
+    {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
+    8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
+    8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
+    8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
+    8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
+    9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
+    {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
+    {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
+    {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+    {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
+    {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
+    {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
+    {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
+    462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
+    250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
+    {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
+    25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
+    29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
+    26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
+    22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
+    [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
+    38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
+    25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
+    25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
+    27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
+    32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
+    25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
+    21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
+    34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
+    36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
+    34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
+    24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
+    36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
+    24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
+    28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
+    30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
+    25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
+    39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
+    31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
+    36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
+    24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
+    26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
+    21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
+    25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
+    20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
+    32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
+    26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
+    24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
+    27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
+    20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
+    30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
+    23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
+    23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
+    32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
+    38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
+    25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
+    24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
+    26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
+    30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
+    32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
+    20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
+    28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
+    25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
+    [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
+    36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
+    27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
+    33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
+    21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
+    30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
+    31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
+    24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
+    38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
+    30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
+    29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
+    39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
+    25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
+    [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
+    29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
+    28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
+    38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
+    36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
+    21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
+    24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
+    [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
+    21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
+    30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
+    33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
+    25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
+    21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
+    33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
+    22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
+    38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
+    20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
+    27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
+    29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
+    36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
+    [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
+    22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
+    [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
+    36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
+    31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
+    21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
+    [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
+    32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
+    [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
+    [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
+    33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
+    20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
+    [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
+    21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
+    20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
+    [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
+    36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
+    36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
+    39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
+    38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
+    26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
+    22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
+    33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
+    38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
+    30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
+    21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
+    29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
+    33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
+    20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
+    21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
+    36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
+    24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
+    29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
+    34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
+    20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
+    27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
+    38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
+    31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
+    21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
+    21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
+    25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
+    35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
+    22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
+    31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
+    38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
+    30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
+    37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
+    39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
+    30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
+    30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
+    38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
+    21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
+    31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
+    31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
+    20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
+    [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
+    38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
+    33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
+    35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
+    31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
+    [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
+    [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
+    23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
+    25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
+    21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
+    25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
+    38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
+    21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
+    21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
+    28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
+    39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
+    32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
+    25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
+    24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
+    24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
+    20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
+    24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
+    22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
+    34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
+    35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
+    26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
+    28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
+    22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
+    29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
+    40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
+    21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
+    [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
+    38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
+    32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
+    20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
+    20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
+    29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
+    21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
+    28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
+    39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
+    31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
+    28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
+    40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
+    24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
+    32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
+    28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
+    32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
+    33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
+    39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
+    30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
+    33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
+    [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
+    29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
+    27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
+    33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
+    31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
+    23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
+    [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
+    34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
+    34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
+    33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
+    28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
+    27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
+    30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
+    27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
+    33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
+    38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
+    34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
+    23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
+    29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
+    33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
+    34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
+    34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
+    25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
+    30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
+    21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
+    36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
+    28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
+    30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
+    33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
+    20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
+    25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
+    20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
+    36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
+    22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
+    26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
+    22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
+    36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
+    36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
+    38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
+    38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
+    27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
+    38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
+    32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
+    20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
+    38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
+    39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
+    22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
+    28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
+    27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
+    30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
+    20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
+    24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
+    20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
+    33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
+    [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
+    [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
+    33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
+    21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
+    29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
+    27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
+    [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
+    21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
+    23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
+    21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
+    25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
+    [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
+    32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
+    30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
+    35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
+    20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
+    23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
+    20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
+    20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
+    25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
+    30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
+    28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
+    34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
+    25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
+    34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
+    [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
+    26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
+    32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
+    24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
+    33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
+    35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
+    30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
+    26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
+    22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
+    27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
+    22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
+    25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
+    31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
+    33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
+    30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
+    20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
+    [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
+    36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
+    20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
+    24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
+    36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
+    [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
+    35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
+    39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
+    23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
+    39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
+    23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
+    26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
+    26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
+    20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
+    39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
+    [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
+    29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
+    24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
+    26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
+    20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
+    35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
+    38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
+    29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
+    21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
+    38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
+    25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
+    38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
+    39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
+    [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
+    21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
+    38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
+    [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
+    27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
+    20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
+    33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
+    34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
+    [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
+    21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
+    31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
+    35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
+    32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
+    30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
+    [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
+    27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
+    21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
+    21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
+    30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
+    22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
+    38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
+    31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
+    20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
+    23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
+    26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
+    21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
+    38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
+    33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
+    [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
+    20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
+    24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
+    32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
+    21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
+    27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
+    36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
+    33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
+    24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
+    37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
+    20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
+    27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
+    28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
+    35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
+    21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
+    35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
+    21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
+    33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
+    23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
+    38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
+    26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
+    26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
+    26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
+    25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
+    21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
+    20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
+    27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
+    26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
+    24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
+    38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
+    21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
+    27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
+    26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
+    24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
+    37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
+    33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
+    20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
+    25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
+    31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
+    24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
+    [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
+    21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
+    35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
+    20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
+    31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
+    36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
+    38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
+    26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
+    36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
+    [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
+    32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
+    [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
+    22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
+    20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
+    19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
+    [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
+    22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
+    20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
+    21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
+    21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
+    {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
+    21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
+    20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
+    20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
+    20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
+    20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
+    20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
+    20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
+    20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
+    20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
+    [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
+    [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
+    20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
+    32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
+    20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
+    {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
+    {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
+    35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
+    35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
+    35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
+    {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
+    38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
+    38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
+    37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
+    37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
+    37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
+    37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
+    21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
+    20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
+    22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
+    {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
+    22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
+    22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
+    22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
+    22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
+    39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
+    33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
+    33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
+    33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
+    33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
+    33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
+    33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
+    33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
+    33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
+    {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
+    33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
+    33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
+    33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
+    33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
+    {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
+    33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
+    33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
+    29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
+    34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
+    34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
+    34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
+    [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
+    [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
+    25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
+    25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
+    25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
+    25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
+    25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
+    25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
+    21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
+    {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
+    21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
+    21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
+    21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
+    {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
+    21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
+    21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
+    {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
+    21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
+    21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
+    21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
+    21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
+    22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
+    22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
+    22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
+    22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
+    24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
+    23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
+    23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
+    23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
+    23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
+    23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
+    23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
+    24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
+    29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
+    29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
+    29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
+    29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
+    [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
+    {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
+    {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
+    24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
+    24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
+    24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
+    24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
+    24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
+    24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
+    24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
+    24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
+    38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
+    38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
+    {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
+    27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
+    27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
+    27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
+    27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
+    27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
+    27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
+    28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
+    28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
+    {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
+    28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
+    28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
+    28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
+    28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
+    28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
+    [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
+    23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
+    36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
+    36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
+    {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
+    36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
+    21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
+    33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
+    22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
+    22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
+    23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
+    23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
+    23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
+    23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
+    23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
+    {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
+    39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
+    32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
+    {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
+    {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
+    32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
+    {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
+    32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
+    [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
+    29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
+    29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
+    29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
+    29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
+    {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
+    29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
+    26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
+    26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
+    26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
+    26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
+    26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
+    26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
+    {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
+    26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
+    26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
+    27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
+    27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
+    27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
+    27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
+    27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
+    36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
+    {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
+    {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
+    25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
+    29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
+    26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
+    26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
+    26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
+    36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
+    36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
+    29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
+    25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
+    27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
+    27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
+    34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
+    32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
+    32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
+    33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
+    33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
+    {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
+    33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
+    27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
+    [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
+    26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
+    28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
+    28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
+    29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
+    29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
+    31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
+    31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
+    24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
+    24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
+    27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
+    26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
+    30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
+    30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
+    30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
+    31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
+    30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
+    30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
+    30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
+    30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
+    32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
+    30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
+    {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
+    38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
+    {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
+    {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
+    38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
+    {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
+    38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
+    {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
+    38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
+    {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
+    {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
+    {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
+    {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
+    31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
+    39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
+    40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
+    {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
+    {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
+    40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
+    30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
+    30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
+    30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
+    30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
+    30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
+    30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
+    31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
+    34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
+    35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
+    35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
+    [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
+    32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
+    32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
+    39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
+    {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
+    34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
+    34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
+    34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
+    34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
+    34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
+    34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
+    {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
+    34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
+    34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
+    34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
+    34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
+    {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
+    31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
+    31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
+    31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
+    31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
+    31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
+    31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
+    33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
+    33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
+    33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
+    35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
+    31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
+    {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
+    32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
+    32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
+    36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
+    37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
+    37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
+    {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
+    36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
+    36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
+    36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
+    36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
+    {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
+    36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
+    35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
+    35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
+    38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
+    {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
+    {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
+    37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
+    40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
+    {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
+    {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
+    {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
+    38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
+    39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
+    {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
+    39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
+    39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
+    {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
+    40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
+    40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
+    12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
+    25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
+    23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
+    32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
+    36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
+    25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
+    24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
+    35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
+    39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
+    [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
+    36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
+    31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
+    30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
+    24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
+    37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
+    27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
+    32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
+    38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
+    29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
+    38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
+    29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
+    36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
+    22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
+    39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
+    36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
+    23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
+    20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
+    39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
+    [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
+    22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
+    40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
+    25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
+    31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
+    36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
+    26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
+    38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
+    27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
+    25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
+    [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
+    28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
+    25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
+    31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
+    30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
+    31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
+    32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
+    27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
+    23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
+    34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
+    34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
+    21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
+    39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
+    32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
+    25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
+    29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
+    39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
+    27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
+    28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
+    24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
+    20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
+    39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
+    21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
+    35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
+    22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
+    40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
+    24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
+    22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
+    33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
+    30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
+    24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
+    [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
+    36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
+    22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
+    27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
+    31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
+    30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
+    32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
+    21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
+    36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
+    35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
+    24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
+    36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
+    36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
+    35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
+    35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
+    25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
+    30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
+    35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
+    32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
+    39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
+    [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
+    32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
+    31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
+    35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
+    23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
+    39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
+    35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
+    33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
+    38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
+    21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
+    21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
+    30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
+    27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
+    37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
+    35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
+    23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
+    31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
+    29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
+    39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
+    22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
+    38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
+    36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
+    36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
+    36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
+    36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
+    38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
+    25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
+    35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
+    36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
+    35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
+    28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
+    21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
+    21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
+    20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
+    33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
+    35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
+    35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
+    35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
+    35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
+    35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
+    38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
+    24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
+    22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
+    34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
+    34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
+    40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
+    34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
+    25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
+    22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
+    22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
+    22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
+    23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
+    24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
+    39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
+    39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
+    25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
+    24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
+    38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
+    38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
+    28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
+    28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
+    28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
+    23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
+    23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
+    39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
+    39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
+    {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
+    32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
+    32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
+    32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
+    32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
+    32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
+    32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
+    29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
+    27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
+    27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
+    27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
+    36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
+    36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
+    36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
+    36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
+    36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
+    35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
+    33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
+    36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
+    31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
+    30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
+    30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
+    37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
+    37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
+    37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
+    37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
+    37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
+    37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
+    37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
+    {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
+    37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
+    37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
+    37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
+    {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
+    37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
+    37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
+    40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
+    40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
+    40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
+    40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
+    30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
+    30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
+    32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
+    38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
+    34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
+    34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
+    31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
+    31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
+    36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
+    36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
+    40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
+    40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
+    31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
+    39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
+    39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
+    39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
+    39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
+    39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
+    40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
+    40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
+    22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
+    39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
+    [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
+    38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
+    31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
+    38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
+    8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
+    {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
+    {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
+    {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
+    13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
+    12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
+    {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
+    12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
+    {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
+    20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
+    20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
+    {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
+    {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
+    20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
+    {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
+    {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
+    20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
+    {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
+    {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
+    20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
+    20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
+    {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
+    20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
+    {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
+    20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
+    {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
+    {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
+    20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
+    20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
+    {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
+    {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
+    {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
+    {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
+    {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
+    {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
+    {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
+    {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
+    {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
+    {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
+    20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
+    {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
+    {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
+    20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
+    {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
+    {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
+    {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
+    20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
+    {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
+    {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
+    {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
+    {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
+    {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
+    {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
+    21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
+    {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
+    {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
+    {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
+    21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
+    {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
+    {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
+    {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
+    {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
+    {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
+    {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
+    {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
+    {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
+    {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
+    21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
+    {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
+    {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
+    {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
+    {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
+    {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
+    21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
+    {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
+    21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
+    21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
+    21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
+    {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
+    {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
+    {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
+    21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
+    {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
+    {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
+    21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
+    {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
+    {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
+    {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
+    {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
+    {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
+    {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
+    {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
+    21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
+    21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
+    {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
+    {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
+    {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
+    {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
+    {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
+    {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
+    22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
+    22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
+    {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
+    {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
+    22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
+    {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
+    {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
+    22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
+    {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
+    {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
+    {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
+    {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
+    {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
+    {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
+    22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
+    {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
+    22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
+    {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
+    {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
+    {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
+    {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
+    {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
+    {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
+    {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
+    {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
+    {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
+    {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
+    {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
+    {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
+    22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
+    {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
+    {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
+    {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
+    {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
+    {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
+    22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
+    22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
+    22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
+    {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
+    {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
+    {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
+    {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
+    23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
+    {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
+    {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
+    {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
+    {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
+    {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
+    {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
+    {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
+    {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
+    23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
+    {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
+    {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
+    {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
+    {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
+    {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
+    {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
+    {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
+    {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
+    {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
+    {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
+    {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
+    {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
+    23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
+    {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
+    23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
+    {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
+    {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
+    23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
+    {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
+    {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
+    {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
+    {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
+    {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
+    23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
+    {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
+    {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
+    {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
+    {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
+    {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
+    {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
+    {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
+    {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
+    23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
+    24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
+    {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
+    24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
+    {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
+    {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
+    {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
+    {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
+    {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
+    24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
+    24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
+    {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
+    24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
+    {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
+    {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
+    {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
+    {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
+    24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
+    {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
+    24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
+    24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
+    {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
+    {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
+    {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
+    {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
+    {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
+    {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
+    {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
+    {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
+    {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
+    {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
+    {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
+    {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
+    {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
+    {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
+    {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
+    {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
+    {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
+    {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
+    {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
+    {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
+    {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
+    {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
+    {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
+    {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
+    {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
+    {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
+    {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
+    {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
+    {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
+    25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
+    25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
+    {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
+    {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
+    {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
+    25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
+    {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
+    {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
+    {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
+    {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
+    {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
+    {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
+    {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
+    {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
+    {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
+    {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
+    {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
+    25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
+    25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
+    25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
+    {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
+    {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
+    {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
+    {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
+    {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
+    {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
+    {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
+    {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
+    {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
+    25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
+    {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
+    25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
+    25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
+    {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
+    {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
+    {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
+    {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
+    {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
+    25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
+    {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
+    {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
+    26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
+    {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
+    {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
+    {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
+    {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
+    {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
+    {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
+    {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
+    {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
+    {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
+    26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
+    {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
+    {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
+    {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
+    {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
+    {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
+    {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
+    {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
+    26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
+    {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
+    {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
+    {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
+    26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
+    {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
+    {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
+    26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
+    {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
+    26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
+    {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
+    26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
+    {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
+    26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
+    {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
+    26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
+    {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
+    {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
+    {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
+    {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
+    26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
+    {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
+    {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
+    {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
+    {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
+    {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
+    {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
+    {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
+    {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
+    {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
+    {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
+    27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
+    {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
+    {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
+    {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
+    {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
+    {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
+    27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
+    {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
+    {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
+    {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
+    {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
+    {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
+    27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
+    {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
+    {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
+    {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
+    {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
+    27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
+    {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
+    {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
+    27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
+    {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
+    27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
+    {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
+    {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
+    {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
+    {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
+    27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
+    {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
+    27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
+    {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
+    {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
+    27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
+    27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
+    {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
+    {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
+    {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
+    {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
+    {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
+    {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
+    {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
+    {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
+    {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
+    27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
+    {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
+    {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
+    28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
+    28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
+    {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
+    {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
+    {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
+    28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
+    {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
+    {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
+    28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
+    {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
+    {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
+    {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
+    {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
+    {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
+    28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
+    {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
+    {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
+    {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
+    {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
+    {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
+    {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
+    {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
+    {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
+    {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
+    {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
+    {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
+    {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
+    {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
+    {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
+    {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
+    {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
+    {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
+    28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
+    {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
+    {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
+    {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
+    {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
+    {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
+    28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
+    {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
+    {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
+    {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
+    28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
+    {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
+    {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
+    29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
+    29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
+    29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
+    {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
+    {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
+    29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
+    {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
+    {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
+    {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
+    29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
+    {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
+    {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
+    {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
+    29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
+    {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
+    {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
+    {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
+    29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
+    {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
+    29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
+    {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
+    {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
+    {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
+    {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
+    {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
+    {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
+    29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
+    29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
+    {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
+    29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
+    {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
+    {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
+    {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
+    29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
+    {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
+    {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
+    {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
+    {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
+    {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
+    {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
+    {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
+    {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
+    {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
+    {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
+    {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
+    {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
+    30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
+    {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
+    {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
+    {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
+    {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
+    30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
+    {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
+    {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
+    {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
+    {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
+    {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
+    {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
+    {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
+    {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
+    {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
+    30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
+    {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
+    {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
+    30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
+    {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
+    {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
+    30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
+    {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
+    {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
+    {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
+    {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
+    30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
+    {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
+    {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
+    {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
+    {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
+    {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
+    {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
+    {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
+    {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
+    {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
+    30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
+    {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
+    {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
+    {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
+    {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
+    {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
+    {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
+    {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
+    {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
+    {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
+    {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
+    {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
+    {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
+    {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
+    {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
+    {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
+    {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
+    31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
+    {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
+    {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
+    31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
+    31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
+    {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
+    31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
+    {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
+    {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
+    31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
+    31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
+    {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
+    {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
+    31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
+    {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
+    {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
+    {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
+    {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
+    {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
+    {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
+    {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
+    31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
+    {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
+    {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
+    {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
+    {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
+    {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
+    31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
+    {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
+    31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
+    {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
+    {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
+    31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
+    {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
+    {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
+    31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
+    {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
+    {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
+    31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
+    31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
+    {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
+    {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
+    32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
+    {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
+    {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
+    {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
+    {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
+    {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
+    {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
+    32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
+    32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
+    {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
+    {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
+    {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
+    {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
+    {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
+    32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
+    {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
+    32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
+    {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
+    32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
+    {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
+    {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
+    {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
+    {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
+    {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
+    {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
+    32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
+    {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
+    {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
+    {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
+    {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
+    {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
+    {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
+    {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
+    {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
+    {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
+    32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
+    {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
+    {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
+    {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
+    33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
+    33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
+    33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
+    {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
+    {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
+    {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
+    {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
+    {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
+    {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
+    {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
+    {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
+    {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
+    {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
+    {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
+    {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
+    {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
+    33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
+    33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
+    {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
+    33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
+    {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
+    33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
+    {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
+    {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
+    {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
+    {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
+    {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
+    {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
+    {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
+    {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
+    {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
+    {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
+    {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
+    {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
+    {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
+    {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
+    33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
+    {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
+    {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
+    {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
+    {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
+    {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
+    {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
+    {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
+    {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
+    {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
+    {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
+    {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
+    {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
+    34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
+    {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
+    {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
+    34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
+    {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
+    {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
+    {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
+    34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
+    {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
+    {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
+    {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
+    34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
+    {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
+    {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
+    {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
+    {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
+    {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
+    {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
+    34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
+    {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
+    {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
+    34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
+    {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
+    {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
+    {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
+    {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
+    {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
+    {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
+    34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
+    {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
+    {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
+    {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
+    {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
+    {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
+    34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
+    {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
+    {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
+    {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
+    {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
+    {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
+    35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
+    {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
+    {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
+    {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
+    {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
+    {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
+    {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
+    {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
+    {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
+    {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
+    {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
+    {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
+    {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
+    {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
+    {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
+    {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
+    {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
+    {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
+    {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
+    {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
+    {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
+    {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
+    35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
+    {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
+    {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
+    {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
+    {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
+    35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
+    {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
+    {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
+    35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
+    35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
+    {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
+    {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
+    {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
+    {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
+    {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
+    35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
+    35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
+    {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
+    {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
+    {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
+    {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
+    {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
+    {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
+    {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
+    {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
+    36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
+    {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
+    {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
+    {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
+    {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
+    {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
+    {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
+    {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
+    36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
+    {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
+    {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
+    {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
+    {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
+    36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
+    36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
+    36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
+    {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
+    {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
+    {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
+    {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
+    {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
+    {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
+    {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
+    {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
+    36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
+    {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
+    {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
+    {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
+    36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
+    {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
+    36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
+    {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
+    {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
+    36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
+    36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
+    {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
+    {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
+    37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
+    {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
+    {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
+    37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
+    {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
+    37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
+    {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
+    {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
+    {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
+    37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
+    37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
+    {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
+    {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
+    {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
+    {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
+    {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
+    {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
+    {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
+    {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
+    37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
+    {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
+    37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
+    {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
+    {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
+    {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
+    {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
+    37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
+    37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
+    {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
+    {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
+    {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
+    {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
+    {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
+    {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
+    {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
+    {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
+    37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
+    {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
+    {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
+    {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
+    {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
+    {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
+    {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
+    37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
+    {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
+    {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
+    {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
+    38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
+    38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
+    {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
+    {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
+    {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
+    {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
+    {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
+    {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
+    {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
+    {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
+    38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
+    {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
+    38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
+    38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
+    {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
+    38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
+    {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
+    {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
+    {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
+    {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
+    {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
+    38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
+    {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
+    {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
+    {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
+    {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
+    {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
+    {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
+    {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
+    {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
+    {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
+    38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
+    {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
+    {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
+    {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
+    39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
+    {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
+    39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
+    {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
+    {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
+    {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
+    {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
+    {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
+    {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
+    {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
+    {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
+    39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
+    39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
+    {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
+    {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
+    {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
+    {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
+    39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
+    {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
+    {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
+    39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
+    {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
+    {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
+    {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
+    {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
+    {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
+    {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
+    39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
+    {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
+    {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
+    {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
+    {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
+    {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
+    {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
+    {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
+    {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
+    {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
+    39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
+    {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
+    {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
+    {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
+    40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
+    {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
+    {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
+    {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
+    40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
+    {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
+    {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
+    {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
+    {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
+    {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
+    {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
+    {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
+    {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
+    40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
+    {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
+    {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
+    {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
+    {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
+    {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
+    40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
+    {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
+    {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
+    {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
+    40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
+    {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
+    {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
+    {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
+    {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
+    {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
+    {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
+    {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
+    {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
+    [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
+    11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
+    59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
+    11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
+    {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
+    18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
+    18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
+    18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
+    19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
+    {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
+    {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
+    {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
+    {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
+    {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
+    {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
+    {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
+    {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
+    {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
+    {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
+    {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
+    {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
+    {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
+    {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
+    {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
+    {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
+    {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
+    {f: 7, c: 19887}]
+};
+
+
+
+var ARCFourCipher = (function ARCFourCipherClosure() {
+  function ARCFourCipher(key) {
+    this.a = 0;
+    this.b = 0;
+    var s = new Uint8Array(256);
+    var i, j = 0, tmp, keyLength = key.length;
+    for (i = 0; i < 256; ++i) {
+      s[i] = i;
+    }
+    for (i = 0; i < 256; ++i) {
+      tmp = s[i];
+      j = (j + tmp + key[i % keyLength]) & 0xFF;
+      s[i] = s[j];
+      s[j] = tmp;
+    }
+    this.s = s;
+  }
+
+  ARCFourCipher.prototype = {
+    encryptBlock: function ARCFourCipher_encryptBlock(data) {
+      var i, n = data.length, tmp, tmp2;
+      var a = this.a, b = this.b, s = this.s;
+      var output = new Uint8Array(n);
+      for (i = 0; i < n; ++i) {
+        a = (a + 1) & 0xFF;
+        tmp = s[a];
+        b = (b + tmp) & 0xFF;
+        tmp2 = s[b];
+        s[a] = tmp2;
+        s[b] = tmp;
+        output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
+      }
+      this.a = a;
+      this.b = b;
+      return output;
+    }
+  };
+  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
+
+  return ARCFourCipher;
+})();
+
+var calculateMD5 = (function calculateMD5Closure() {
+  var r = new Uint8Array([
+    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
+
+  var k = new Int32Array([
+    -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
+    -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
+    1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
+    643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
+    568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
+    1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
+    -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
+    -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
+    -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
+    -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
+    -145523070, -1120210379, 718787259, -343485551]);
+
+  function hash(data, offset, length) {
+    var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
+    // pre-processing
+    var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
+    var padded = new Uint8Array(paddedLength);
+    var i, j, n;
+    for (i = 0; i < length; ++i) {
+      padded[i] = data[offset++];
+    }
+    padded[i++] = 0x80;
+    n = paddedLength - 8;
+    while (i < n) {
+      padded[i++] = 0;
+    }
+    padded[i++] = (length << 3) & 0xFF;
+    padded[i++] = (length >> 5) & 0xFF;
+    padded[i++] = (length >> 13) & 0xFF;
+    padded[i++] = (length >> 21) & 0xFF;
+    padded[i++] = (length >>> 29) & 0xFF;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    // chunking
+    // TODO ArrayBuffer ?
+    var w = new Int32Array(16);
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j, i += 4) {
+        w[j] = (padded[i] | (padded[i + 1] << 8) |
+                (padded[i + 2] << 16) | (padded[i + 3] << 24));
+      }
+      var a = h0, b = h1, c = h2, d = h3, f, g;
+      for (j = 0; j < 64; ++j) {
+        if (j < 16) {
+          f = (b & c) | ((~b) & d);
+          g = j;
+        } else if (j < 32) {
+          f = (d & b) | ((~d) & c);
+          g = (5 * j + 1) & 15;
+        } else if (j < 48) {
+          f = b ^ c ^ d;
+          g = (3 * j + 5) & 15;
+        } else {
+          f = c ^ (b | (~d));
+          g = (7 * j) & 15;
+        }
+        var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
+        d = c;
+        c = b;
+        b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
+        a = tmp;
+      }
+      h0 = (h0 + a) | 0;
+      h1 = (h1 + b) | 0;
+      h2 = (h2 + c) | 0;
+      h3 = (h3 + d) | 0;
+    }
+    return new Uint8Array([
+      h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
+      h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
+      h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
+      h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
+    ]);
+  }
+  return hash;
+})();
+
+var NullCipher = (function NullCipherClosure() {
+  function NullCipher() {}
+
+  NullCipher.prototype = {
+    decryptBlock: function NullCipher_decryptBlock(data) {
+      return data;
+    }
+  };
+
+  return NullCipher;
+})();
+
+var AES128Cipher = (function AES128CipherClosure() {
+  var rcon = new Uint8Array([
+    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
+    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
+    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
+    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
+    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
+    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
+    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
+    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
+    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
+    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+    0x74, 0xe8, 0xcb, 0x8d]);
+
+  var s = new Uint8Array([
+    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
+    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
+    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
+    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
+    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
+    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
+    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
+    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
+    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
+    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
+    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
+    0xb0, 0x54, 0xbb, 0x16]);
+
+  var inv_s = new Uint8Array([
+    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
+    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
+    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
+    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
+    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
+    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
+    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
+    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
+    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
+    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
+    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
+    0x55, 0x21, 0x0c, 0x7d]);
+
+  var mix = new Uint32Array([
+    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
+    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
+    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
+    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
+    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
+    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
+    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
+    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
+    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
+    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
+    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
+    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
+    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
+    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
+    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
+    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
+    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
+    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
+    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
+    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
+    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
+    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
+    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
+    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
+    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
+    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
+    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
+    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
+    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
+    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
+    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
+    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
+    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
+    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
+    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
+    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
+    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
+    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
+    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
+    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
+    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
+    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
+    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+
+  function expandKey128(cipherKey) {
+    var b = 176, result = new Uint8Array(b);
+    result.set(cipherKey);
+    for (var j = 16, i = 1; j < b; ++i) {
+      // RotWord
+      var t1 = result[j - 3], t2 = result[j - 2],
+          t3 = result[j - 1], t4 = result[j - 4];
+      // SubWord
+      t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
+      // Rcon
+      t1 = t1 ^ rcon[i];
+      for (var n = 0; n < 4; ++n) {
+        result[j] = (t1 ^= result[j - 16]); j++;
+        result[j] = (t2 ^= result[j - 16]); j++;
+        result[j] = (t3 ^= result[j - 16]); j++;
+        result[j] = (t4 ^= result[j - 16]); j++;
+      }
+    }
+    return result;
+  }
+
+  function decrypt128(input, key) {
+    var state = new Uint8Array(16);
+    state.set(input);
+    var i, j, k;
+    var t, u, v;
+    // AddRoundKey
+    for (j = 0, k = 160; j < 16; ++j, ++k) {
+      state[j] ^= key[k];
+    }
+    for (i = 9; i >= 1; --i) {
+      // InvShiftRows
+      t = state[13]; state[13] = state[9]; state[9] = state[5];
+      state[5] = state[1]; state[1] = t;
+      t = state[14]; u = state[10]; state[14] = state[6];
+      state[10] = state[2]; state[6] = t; state[2] = u;
+      t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+      state[11] = t; state[7] = u; state[3] = v;
+      // InvSubBytes
+      for (j = 0; j < 16; ++j) {
+        state[j] = inv_s[state[j]];
+      }
+      // AddRoundKey
+      for (j = 0, k = i * 16; j < 16; ++j, ++k) {
+        state[j] ^= key[k];
+      }
+      // InvMixColumns
+      for (j = 0; j < 16; j += 4) {
+        var s0 = mix[state[j]], s1 = mix[state[j + 1]],
+            s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
+        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
+            (s3 >>> 24) ^ (s3 << 8));
+        state[j] = (t >>> 24) & 0xFF;
+        state[j + 1] = (t >> 16) & 0xFF;
+        state[j + 2] = (t >> 8) & 0xFF;
+        state[j + 3] = t & 0xFF;
+      }
+    }
+    // InvShiftRows
+    t = state[13]; state[13] = state[9]; state[9] = state[5];
+    state[5] = state[1]; state[1] = t;
+    t = state[14]; u = state[10]; state[14] = state[6];
+    state[10] = state[2]; state[6] = t; state[2] = u;
+    t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+    state[11] = t; state[7] = u; state[3] = v;
+    for (j = 0; j < 16; ++j) {
+      // InvSubBytes
+      state[j] = inv_s[state[j]];
+      // AddRoundKey
+      state[j] ^= key[j];
+    }
+    return state;
+  }
+
+  function AES128Cipher(key) {
+    this.key = expandKey128(key);
+    this.buffer = new Uint8Array(16);
+    this.bufferPosition = 0;
+  }
+
+  function decryptBlock2(data, finalize) {
+    var i, j, ii, sourceLength = data.length,
+        buffer = this.buffer, bufferLength = this.bufferPosition,
+        result = [], iv = this.iv;
+    for (i = 0; i < sourceLength; ++i) {
+      buffer[bufferLength] = data[i];
+      ++bufferLength;
+      if (bufferLength < 16) {
+        continue;
+      }
+      // buffer is full, decrypting
+      var plain = decrypt128(buffer, this.key);
+      // xor-ing the IV vector to get plain text
+      for (j = 0; j < 16; ++j) {
+        plain[j] ^= iv[j];
+      }
+      iv = buffer;
+      result.push(plain);
+      buffer = new Uint8Array(16);
+      bufferLength = 0;
+    }
+    // saving incomplete buffer
+    this.buffer = buffer;
+    this.bufferLength = bufferLength;
+    this.iv = iv;
+    if (result.length === 0) {
+      return new Uint8Array([]);
+    }
+    // combining plain text blocks into one
+    var outputLength = 16 * result.length;
+    if (finalize) {
+      // undo a padding that is described in RFC 2898
+      var lastBlock = result[result.length - 1];
+      outputLength -= lastBlock[15];
+      result[result.length - 1] = lastBlock.subarray(0, 16 - lastBlock[15]);
+    }
+    var output = new Uint8Array(outputLength);
+    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+      output.set(result[i], j);
+    }
+    return output;
+  }
+
+  AES128Cipher.prototype = {
+    decryptBlock: function AES128Cipher_decryptBlock(data, finalize) {
+      var i, sourceLength = data.length;
+      var buffer = this.buffer, bufferLength = this.bufferPosition;
+      // waiting for IV values -- they are at the start of the stream
+      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
+        buffer[bufferLength] = data[i];
+      }
+      if (bufferLength < 16) {
+        // need more data
+        this.bufferLength = bufferLength;
+        return new Uint8Array([]);
+      }
+      this.iv = buffer;
+      this.buffer = new Uint8Array(16);
+      this.bufferLength = 0;
+      // starting decryption
+      this.decryptBlock = decryptBlock2;
+      return this.decryptBlock(data.subarray(16), finalize);
+    }
+  };
+
+  return AES128Cipher;
+})();
+
+var CipherTransform = (function CipherTransformClosure() {
+  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
+    this.stringCipherConstructor = stringCipherConstructor;
+    this.streamCipherConstructor = streamCipherConstructor;
+  }
+  CipherTransform.prototype = {
+    createStream: function CipherTransform_createStream(stream, length) {
+      var cipher = new this.streamCipherConstructor();
+      return new DecryptStream(stream, length,
+        function cipherTransformDecryptStream(data, finalize) {
+          return cipher.decryptBlock(data, finalize);
+        }
+      );
+    },
+    decryptString: function CipherTransform_decryptString(s) {
+      var cipher = new this.stringCipherConstructor();
+      var data = stringToBytes(s);
+      data = cipher.decryptBlock(data, true);
+      return bytesToString(data);
+    }
+  };
+  return CipherTransform;
+})();
+
+var CipherTransformFactory = (function CipherTransformFactoryClosure() {
+  var defaultPasswordBytes = new Uint8Array([
+    0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
+    0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
+    0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
+    0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
+
+  function prepareKeyData(fileId, password, ownerPassword, userPassword,
+                          flags, revision, keyLength, encryptMetadata) {
+    var hashDataSize = 40 + ownerPassword.length + fileId.length;
+    var hashData = new Uint8Array(hashDataSize), i = 0, j, n;
+    if (password) {
+      n = Math.min(32, password.length);
+      for (; i < n; ++i) {
+        hashData[i] = password[i];
+      }
+    }
+    j = 0;
+    while (i < 32) {
+      hashData[i++] = defaultPasswordBytes[j++];
+    }
+    // as now the padded password in the hashData[0..i]
+    for (j = 0, n = ownerPassword.length; j < n; ++j) {
+      hashData[i++] = ownerPassword[j];
+    }
+    hashData[i++] = flags & 0xFF;
+    hashData[i++] = (flags >> 8) & 0xFF;
+    hashData[i++] = (flags >> 16) & 0xFF;
+    hashData[i++] = (flags >>> 24) & 0xFF;
+    for (j = 0, n = fileId.length; j < n; ++j) {
+      hashData[i++] = fileId[j];
+    }
+    if (revision >= 4 && !encryptMetadata) {
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+    }
+    var hash = calculateMD5(hashData, 0, i);
+    var keyLengthInBytes = keyLength >> 3;
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, keyLengthInBytes);
+      }
+    }
+    var encryptionKey = hash.subarray(0, keyLengthInBytes);
+    var cipher, checkData;
+
+    if (revision >= 3) {
+      for (i = 0; i < 32; ++i) {
+        hashData[i] = defaultPasswordBytes[i];
+      }
+      for (j = 0, n = fileId.length; j < n; ++j) {
+        hashData[i++] = fileId[j];
+      }
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+      n = encryptionKey.length;
+      var derivedKey = new Uint8Array(n), k;
+      for (j = 1; j <= 19; ++j) {
+        for (k = 0; k < n; ++k) {
+          derivedKey[k] = encryptionKey[k] ^ j;
+        }
+        cipher = new ARCFourCipher(derivedKey);
+        checkData = cipher.encryptBlock(checkData);
+      }
+      for (j = 0, n = checkData.length; j < n; ++j) {
+        if (userPassword[j] != checkData[j]) {
+          return null;
+        }
+      }
+    } else {
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(defaultPasswordBytes);
+      for (j = 0, n = checkData.length; j < n; ++j) {
+        if (userPassword[j] != checkData[j]) {
+          return null;
+        }
+      }
+    }
+    return encryptionKey;
+  }
+
+  function decodeUserPassword(password, ownerPassword, revision, keyLength) {
+    var hashData = new Uint8Array(32), i = 0, j, n;
+    n = Math.min(32, password.length);
+    for (; i < n; ++i) {
+      hashData[i] = password[i];
+    }
+    j = 0;
+    while (i < 32) {
+      hashData[i++] = defaultPasswordBytes[j++];
+    }
+    var hash = calculateMD5(hashData, 0, i);
+    var keyLengthInBytes = keyLength >> 3;
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, hash.length);
+      }
+    }
+
+    var cipher, userPassword;
+    if (revision >= 3) {
+      userPassword = ownerPassword;
+      var derivedKey = new Uint8Array(keyLengthInBytes), k;
+      for (j = 19; j >= 0; j--) {
+        for (k = 0; k < keyLengthInBytes; ++k) {
+          derivedKey[k] = hash[k] ^ j;
+        }
+        cipher = new ARCFourCipher(derivedKey);
+        userPassword = cipher.encryptBlock(userPassword);
+      }
+    } else {
+      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
+      userPassword = cipher.encryptBlock(ownerPassword);
+    }
+    return userPassword;
+  }
+
+  var identityName = Name.get('Identity');
+
+  function CipherTransformFactory(dict, fileId, password) {
+    var filter = dict.get('Filter');
+    if (!isName(filter) || filter.name != 'Standard') {
+      error('unknown encryption method');
+    }
+    this.dict = dict;
+    var algorithm = dict.get('V');
+    if (!isInt(algorithm) ||
+        (algorithm != 1 && algorithm != 2 && algorithm != 4)) {
+      error('unsupported encryption algorithm');
+    }
+    this.algorithm = algorithm;
+    var keyLength = dict.get('Length') || 40;
+    if (!isInt(keyLength) ||
+        keyLength < 40 || (keyLength % 8) !== 0) {
+      error('invalid key length');
+    }
+
+    // prepare keys
+    var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32);
+    var userPassword = stringToBytes(dict.get('U')).subarray(0, 32);
+    var flags = dict.get('P');
+    var revision = dict.get('R');
+    var encryptMetadata = (algorithm == 4 &&  // meaningful when V is 4
+      dict.get('EncryptMetadata') !== false); // makes true as default value
+    this.encryptMetadata = encryptMetadata;
+
+    var fileIdBytes = stringToBytes(fileId);
+    var passwordBytes;
+    if (password) {
+      passwordBytes = stringToBytes(password);
+    }
+
+    var encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
+                                       ownerPassword, userPassword, flags,
+                                       revision, keyLength, encryptMetadata);
+    if (!encryptionKey && !password) {
+      throw new PasswordException('No password given',
+                                  PasswordResponses.NEED_PASSWORD);
+    } else if (!encryptionKey && password) {
+      // Attempting use the password as an owner password
+      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword,
+                                               revision, keyLength);
+      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword,
+                                     ownerPassword, userPassword, flags,
+                                     revision, keyLength, encryptMetadata);
+    }
+
+    if (!encryptionKey) {
+      throw new PasswordException('Incorrect Password',
+                                  PasswordResponses.INCORRECT_PASSWORD);
+    }
+
+    this.encryptionKey = encryptionKey;
+
+    if (algorithm == 4) {
+      this.cf = dict.get('CF');
+      this.stmf = dict.get('StmF') || identityName;
+      this.strf = dict.get('StrF') || identityName;
+      this.eff = dict.get('EFF') || this.strf;
+    }
+  }
+
+  function buildObjectKey(num, gen, encryptionKey, isAes) {
+    var key = new Uint8Array(encryptionKey.length + 9), i, n;
+    for (i = 0, n = encryptionKey.length; i < n; ++i) {
+      key[i] = encryptionKey[i];
+    }
+    key[i++] = num & 0xFF;
+    key[i++] = (num >> 8) & 0xFF;
+    key[i++] = (num >> 16) & 0xFF;
+    key[i++] = gen & 0xFF;
+    key[i++] = (gen >> 8) & 0xFF;
+    if (isAes) {
+      key[i++] = 0x73;
+      key[i++] = 0x41;
+      key[i++] = 0x6C;
+      key[i++] = 0x54;
+    }
+    var hash = calculateMD5(key, 0, i);
+    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+  }
+
+  function buildCipherConstructor(cf, name, num, gen, key) {
+    var cryptFilter = cf.get(name.name);
+    var cfm;
+    if (cryptFilter !== null && cryptFilter !== undefined) {
+      cfm = cryptFilter.get('CFM');
+    }
+    if (!cfm || cfm.name == 'None') {
+      return function cipherTransformFactoryBuildCipherConstructorNone() {
+        return new NullCipher();
+      };
+    }
+    if ('V2' == cfm.name) {
+      return function cipherTransformFactoryBuildCipherConstructorV2() {
+        return new ARCFourCipher(buildObjectKey(num, gen, key, false));
+      };
+    }
+    if ('AESV2' == cfm.name) {
+      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
+        return new AES128Cipher(buildObjectKey(num, gen, key, true));
+      };
+    }
+    error('Unknown crypto method');
+  }
+
+  CipherTransformFactory.prototype = {
+    createCipherTransform:
+      function CipherTransformFactory_createCipherTransform(num, gen) {
+      if (this.algorithm == 4) {
+        return new CipherTransform(
+          buildCipherConstructor(this.cf, this.stmf,
+                                 num, gen, this.encryptionKey),
+          buildCipherConstructor(this.cf, this.strf,
+                                 num, gen, this.encryptionKey));
+      }
+      // algorithms 1 and 2
+      var key = buildObjectKey(num, gen, this.encryptionKey, false);
+      var cipherConstructor = function buildCipherCipherConstructor() {
+        return new ARCFourCipher(key);
+      };
+      return new CipherTransform(cipherConstructor, cipherConstructor);
+    }
+  };
+
+  return CipherTransformFactory;
+})();
+
+
+
+var PatternType = {
+  FUNCTION_BASED: 1,
+  AXIAL: 2,
+  RADIAL: 3,
+  FREE_FORM_MESH: 4,
+  LATTICE_FORM_MESH: 5,
+  COONS_PATCH_MESH: 6,
+  TENSOR_PATCH_MESH: 7
+};
+
+var Pattern = (function PatternClosure() {
+  // Constructor should define this.getPattern
+  function Pattern() {
+    error('should not call Pattern constructor');
+  }
+
+  Pattern.prototype = {
+    // Input: current Canvas context
+    // Output: the appropriate fillStyle or strokeStyle
+    getPattern: function Pattern_getPattern(ctx) {
+      error('Should not call Pattern.getStyle: ' + ctx);
+    }
+  };
+
+  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
+                                                       res) {
+
+    var dict = isStream(shading) ? shading.dict : shading;
+    var type = dict.get('ShadingType');
+
+    switch (type) {
+      case PatternType.AXIAL:
+      case PatternType.RADIAL:
+        // Both radial and axial shadings are handled by RadialAxial shading.
+        return new Shadings.RadialAxial(dict, matrix, xref, res);
+      case PatternType.FREE_FORM_MESH:
+      case PatternType.LATTICE_FORM_MESH:
+      case PatternType.COONS_PATCH_MESH:
+      case PatternType.TENSOR_PATCH_MESH:
+        return new Shadings.Mesh(shading, matrix, xref, res);
+      default:
+        UnsupportedManager.notify(UNSUPPORTED_FEATURES.shadingPattern);
+        return new Shadings.Dummy();
+    }
+  };
+  return Pattern;
+})();
+
+var Shadings = {};
+
+// A small number to offset the first/last color stops so we can insert ones to
+// support extend.  Number.MIN_VALUE appears to be too small and breaks the
+// extend. 1e-7 works in FF but chrome seems to use an even smaller sized number
+// internally so we have to go bigger.
+Shadings.SMALL_NUMBER = 1e-2;
+
+// Radial and axial shading have very similar implementations
+// If needed, the implementations can be broken into two classes
+Shadings.RadialAxial = (function RadialAxialClosure() {
+  function RadialAxial(dict, matrix, xref, res) {
+    this.matrix = matrix;
+    this.coordsArr = dict.get('Coords');
+    this.shadingType = dict.get('ShadingType');
+    this.type = 'Pattern';
+    var cs = dict.get('ColorSpace', 'CS');
+    cs = ColorSpace.parse(cs, xref, res);
+    this.cs = cs;
+
+    var t0 = 0.0, t1 = 1.0;
+    if (dict.has('Domain')) {
+      var domainArr = dict.get('Domain');
+      t0 = domainArr[0];
+      t1 = domainArr[1];
+    }
+
+    var extendStart = false, extendEnd = false;
+    if (dict.has('Extend')) {
+      var extendArr = dict.get('Extend');
+      extendStart = extendArr[0];
+      extendEnd = extendArr[1];
+    }
+
+    if (this.shadingType === PatternType.RADIAL &&
+       (!extendStart || !extendEnd)) {
+      // Radial gradient only currently works if either circle is fully within
+      // the other circle.
+      var x1 = this.coordsArr[0];
+      var y1 = this.coordsArr[1];
+      var r1 = this.coordsArr[2];
+      var x2 = this.coordsArr[3];
+      var y2 = this.coordsArr[4];
+      var r2 = this.coordsArr[5];
+      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+      if (r1 <= r2 + distance &&
+          r2 <= r1 + distance) {
+        warn('Unsupported radial gradient.');
+      }
+    }
+
+    this.extendStart = extendStart;
+    this.extendEnd = extendEnd;
+
+    var fnObj = dict.get('Function');
+    var fn;
+    if (isArray(fnObj)) {
+      var fnArray = [];
+      for (var j = 0, jj = fnObj.length; j < jj; j++) {
+        var obj = xref.fetchIfRef(fnObj[j]);
+        if (!isPDFFunction(obj)) {
+          error('Invalid function');
+        }
+        fnArray.push(PDFFunction.parse(xref, obj));
+      }
+      fn = function radialAxialColorFunction(arg) {
+        var out = [];
+        for (var i = 0, ii = fnArray.length; i < ii; i++) {
+          out.push(fnArray[i](arg)[0]);
+        }
+        return out;
+      };
+    } else {
+      if (!isPDFFunction(fnObj)) {
+        error('Invalid function');
+      }
+      fn = PDFFunction.parse(xref, fnObj);
+    }
+
+    // 10 samples seems good enough for now, but probably won't work
+    // if there are sharp color changes. Ideally, we would implement
+    // the spec faithfully and add lossless optimizations.
+    var diff = t1 - t0;
+    var step = diff / 10;
+
+    var colorStops = this.colorStops = [];
+
+    // Protect against bad domains so we don't end up in an infinte loop below.
+    if (t0 >= t1 || step <= 0) {
+      // Acrobat doesn't seem to handle these cases so we'll ignore for
+      // now.
+      info('Bad shading domain.');
+      return;
+    }
+
+    var rgbColor;
+    for (var i = t0; i <= t1; i += step) {
+      rgbColor = cs.getRgb(fn([i]), 0);
+      var cssColor = Util.makeCssRgb(rgbColor);
+      colorStops.push([(i - t0) / diff, cssColor]);
+    }
+
+    var background = 'transparent';
+    if (dict.has('Background')) {
+      rgbColor = cs.getRgb(dict.get('Background'), 0);
+      background = Util.makeCssRgb(rgbColor);
+    }
+
+    if (!extendStart) {
+      // Insert a color stop at the front and offset the first real color stop
+      // so it doesn't conflict with the one we insert.
+      colorStops.unshift([0, background]);
+      colorStops[1][0] += Shadings.SMALL_NUMBER;
+    }
+    if (!extendEnd) {
+      // Same idea as above in extendStart but for the end.
+      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
+      colorStops.push([1, background]);
+    }
+
+    this.colorStops = colorStops;
+  }
+
+  RadialAxial.prototype = {
+    getIR: function RadialAxial_getIR() {
+      var coordsArr = this.coordsArr;
+      var shadingType = this.shadingType;
+      var type, p0, p1, r0, r1;
+      if (shadingType == PatternType.AXIAL) {
+        p0 = [coordsArr[0], coordsArr[1]];
+        p1 = [coordsArr[2], coordsArr[3]];
+        r0 = null;
+        r1 = null;
+        type = 'axial';
+      } else if (shadingType == PatternType.RADIAL) {
+        p0 = [coordsArr[0], coordsArr[1]];
+        p1 = [coordsArr[3], coordsArr[4]];
+        r0 = coordsArr[2];
+        r1 = coordsArr[5];
+        type = 'radial';
+      } else {
+        error('getPattern type unknown: ' + shadingType);
+      }
+
+      var matrix = this.matrix;
+      if (matrix) {
+        p0 = Util.applyTransform(p0, matrix);
+        p1 = Util.applyTransform(p1, matrix);
+      }
+
+      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
+    }
+  };
+
+  return RadialAxial;
+})();
+
+// All mesh shading. For now, they will be presented as set of the triangles
+// to be drawn on the canvas and rgb color for each vertex.
+Shadings.Mesh = (function MeshClosure() {
+  function MeshStreamReader(stream, context) {
+    this.stream = stream;
+    this.context = context;
+    this.buffer = 0;
+    this.bufferLength = 0;
+  }
+  MeshStreamReader.prototype = {
+    get hasData() {
+      if (this.stream.end) {
+        return this.stream.pos < this.stream.end;
+      }
+      if (this.bufferLength > 0) {
+        return true;
+      }
+      var nextByte = this.stream.getByte();
+      if (nextByte < 0) {
+        return false;
+      }
+      this.buffer = nextByte;
+      this.bufferLength = 8;
+      return true;
+    },
+    readBits: function MeshStreamReader_readBits(n) {
+      var buffer = this.buffer;
+      var bufferLength = this.bufferLength;
+      if (n === 32) {
+        if (bufferLength === 0) {
+          return ((this.stream.getByte() << 24) |
+            (this.stream.getByte() << 16) | (this.stream.getByte() << 8) |
+            this.stream.getByte()) >>> 0;
+        }
+        buffer = (buffer << 24) | (this.stream.getByte() << 16) |
+          (this.stream.getByte() << 8) | this.stream.getByte();
+        var nextByte = this.stream.getByte();
+        this.buffer = nextByte & ((1 << bufferLength) - 1);
+        return ((buffer << (8 - bufferLength)) |
+          ((nextByte & 0xFF) >> bufferLength)) >>> 0;
+      }
+      if (n === 8 && bufferLength === 0) {
+        return this.stream.getByte();
+      }
+      while (bufferLength < n) {
+        buffer = (buffer << 8) | this.stream.getByte();
+        bufferLength += 8;
+      }
+      bufferLength -= n;
+      this.bufferLength = bufferLength;
+      this.buffer = buffer & ((1 << bufferLength) - 1);
+      return buffer >> bufferLength;
+    },
+    align: function MeshStreamReader_align() {
+      this.buffer = 0;
+      this.bufferLength = 0;
+    },
+    readFlag: function MeshStreamReader_readFlag() {
+      return this.readBits(this.context.bitsPerFlag);
+    },
+    readCoordinate: function MeshStreamReader_readCoordinate() {
+      var bitsPerCoordinate = this.context.bitsPerCoordinate;
+      var xi = this.readBits(bitsPerCoordinate);
+      var yi = this.readBits(bitsPerCoordinate);
+      var decode = this.context.decode;
+      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) :
+        2.3283064365386963e-10; // 2 ^ -32
+      return [
+        xi * scale * (decode[1] - decode[0]) + decode[0],
+        yi * scale * (decode[3] - decode[2]) + decode[2]
+      ];
+    },
+    readComponents: function MeshStreamReader_readComponents() {
+      var numComps = this.context.numComps;
+      var bitsPerComponent = this.context.bitsPerComponent;
+      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) :
+        2.3283064365386963e-10; // 2 ^ -32
+      var decode = this.context.decode;
+      var components = [];
+      for (var i = 0, j = 4; i < numComps; i++, j += 2) {
+        var ci = this.readBits(bitsPerComponent);
+        components.push(ci * scale * (decode[j + 1] - decode[j]) + decode[j]);
+      }
+      if (this.context.colorFn) {
+        components = this.context.colorFn(components);
+      }
+      return this.context.colorSpace.getRgb(components, 0);
+    }
+  };
+
+  function decodeType4Shading(mesh, reader) {
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var operators = [];
+    var ps = []; // not maintaining cs since that will match ps
+    var verticesLeft = 0; // assuming we have all data to start a new triangle
+    while (reader.hasData) {
+      var f = reader.readFlag();
+      var coord = reader.readCoordinate();
+      var color = reader.readComponents();
+      if (verticesLeft === 0) { // ignoring flags if we started a triangle
+        assert(0 <= f && f <= 2, 'Unknown type4 flag');
+        switch (f) {
+          case 0:
+            verticesLeft = 3;
+            break;
+          case 1:
+            ps.push(ps[ps.length - 2], ps[ps.length - 1]);
+            verticesLeft = 1;
+            break;
+          case 2:
+            ps.push(ps[ps.length - 3], ps[ps.length - 1]);
+            verticesLeft = 1;
+            break;
+        }
+        operators.push(f);
+      }
+      ps.push(coords.length);
+      coords.push(coord);
+      colors.push(color);
+      verticesLeft--;
+
+      reader.align();
+    }
+
+    var psPacked = new Int32Array(ps);
+
+    mesh.figures.push({
+      type: 'triangles',
+      coords: psPacked,
+      colors: psPacked
+    });
+  }
+
+  function decodeType5Shading(mesh, reader, verticesPerRow) {
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var ps = []; // not maintaining cs since that will match ps
+    while (reader.hasData) {
+      var coord = reader.readCoordinate();
+      var color = reader.readComponents();
+      ps.push(coords.length);
+      coords.push(coord);
+      colors.push(color);
+    }
+
+    var psPacked = new Int32Array(ps);
+
+    mesh.figures.push({
+      type: 'lattice',
+      coords: psPacked,
+      colors: psPacked,
+      verticesPerRow: verticesPerRow
+    });
+  }
+
+  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
+  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
+
+  var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds
+
+  var getB = (function getBClosure() {
+    function buildB(count) {
+      var lut = [];
+      for (var i = 0; i <= count; i++) {
+        var t = i / count, t_ = 1 - t;
+        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_,
+          3 * t * t * t_, t * t * t]));
+      }
+      return lut;
+    }
+    var cache = [];
+    return function getB(count) {
+      if (!cache[count]) {
+        cache[count] = buildB(count);
+      }
+      return cache[count];
+    };
+  })();
+
+  function buildFigureFromPatch(mesh, index) {
+    var figure = mesh.figures[index];
+    assert(figure.type === 'patch', 'Unexpected patch mesh figure');
+
+    var coords = mesh.coords, colors = mesh.colors;
+    var pi = figure.coords;
+    var ci = figure.colors;
+
+    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0],
+                              coords[pi[12]][0], coords[pi[15]][0]);
+    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1],
+                              coords[pi[12]][1], coords[pi[15]][1]);
+    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0],
+                              coords[pi[12]][0], coords[pi[15]][0]);
+    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1],
+                              coords[pi[12]][1], coords[pi[15]][1]);
+    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY /
+                             (mesh.bounds[2] - mesh.bounds[0]));
+    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,
+               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
+    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY /
+                             (mesh.bounds[3] - mesh.bounds[1]));
+    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,
+               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
+
+    var verticesPerRow = splitXBy + 1;
+    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
+    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
+    var k = 0;
+    var cl = new Uint8Array(3), cr = new Uint8Array(3);
+    var c0 = colors[ci[0]], c1 = colors[ci[1]],
+      c2 = colors[ci[2]], c3 = colors[ci[3]];
+    var bRow = getB(splitYBy), bCol = getB(splitXBy);
+    for (var row = 0; row <= splitYBy; row++) {
+      cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0;
+      cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0;
+      cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0;
+
+      cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0;
+      cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0;
+      cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0;
+
+      for (var col = 0; col <= splitXBy; col++, k++) {
+        if ((row === 0 || row === splitYBy) &&
+            (col === 0 || col === splitXBy)) {
+          continue;
+        }
+        var x = 0, y = 0;
+        var q = 0;
+        for (var i = 0; i <= 3; i++) {
+          for (var j = 0; j <= 3; j++, q++) {
+            var m = bRow[row][i] * bCol[col][j];
+            x += coords[pi[q]][0] * m;
+            y += coords[pi[q]][1] * m;
+          }
+        }
+        figureCoords[k] = coords.length;
+        coords.push([x, y]);
+        figureColors[k] = colors.length;
+        var newColor = new Uint8Array(3);
+        newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0;
+        newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0;
+        newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0;
+        colors.push(newColor);
+      }
+    }
+    figureCoords[0] = pi[0];
+    figureColors[0] = ci[0];
+    figureCoords[splitXBy] = pi[3];
+    figureColors[splitXBy] = ci[1];
+    figureCoords[verticesPerRow * splitYBy] = pi[12];
+    figureColors[verticesPerRow * splitYBy] = ci[2];
+    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
+    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
+
+    mesh.figures[index] = {
+      type: 'lattice',
+      coords: figureCoords,
+      colors: figureColors,
+      verticesPerRow: verticesPerRow
+    };
+  }
+
+  function decodeType6Shading(mesh, reader) {
+    // A special case of Type 7. The p11, p12, p21, p22 automatically filled
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33
+    var cs = new Int32Array(4); // c00, c30, c03, c33
+    while (reader.hasData) {
+      var f = reader.readFlag();
+      assert(0 <= f && f <= 3, 'Unknown type6 flag');
+      var i, ii;
+      var pi = coords.length;
+      for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) {
+        coords.push(reader.readCoordinate());
+      }
+      var ci = colors.length;
+      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {
+        colors.push(reader.readComponents());
+      }
+      var tmp1, tmp2, tmp3, tmp4;
+      switch (f) {
+        case 0:
+          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;
+          ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;
+          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 8;
+          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;
+          cs[2] = ci + 1; cs[3] = ci + 2;
+          cs[0] = ci;     cs[1] = ci + 3;
+          break;
+        case 1:
+          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];
+          ps[12] = pi + 5; ps[13] = pi + 4;  ps[14] = pi + 3;  ps[15] = pi + 2;
+          ps[ 8] = pi + 6; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 1;
+          ps[ 4] = pi + 7; /* calculated below              */ ps[ 7] = pi;
+          ps[ 0] = tmp1;   ps[ 1] = tmp2;    ps[ 2] = tmp3;    ps[ 3] = tmp4;
+          tmp1 = cs[2]; tmp2 = cs[3];
+          cs[2] = ci + 1; cs[3] = ci;
+          cs[0] = tmp1;   cs[1] = tmp2;
+          break;
+        case 2:
+          ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6;   ps[15] = pi + 5;
+          ps[ 8] = ps[11]; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 4;
+          ps[ 4] = ps[7];  /* calculated below              */ ps[ 7] = pi + 3;
+          ps[ 0] = ps[3];  ps[ 1] = pi;     ps[ 2] = pi + 1;   ps[ 3] = pi + 2;
+          cs[2] = cs[3]; cs[3] = ci + 1;
+          cs[0] = cs[1]; cs[1] = ci;
+          break;
+        case 3:
+          ps[12] = ps[0];  ps[13] = ps[1];   ps[14] = ps[2];   ps[15] = ps[3];
+          ps[ 8] = pi;     /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;
+          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 6;
+          ps[ 0] = pi + 2; ps[ 1] = pi + 3;  ps[ 2] = pi + 4;  ps[ 3] = pi + 5;
+          cs[2] = cs[0]; cs[3] = cs[1];
+          cs[0] = ci;    cs[1] = ci + 1;
+          break;
+      }
+      // set p11, p12, p21, p22
+      ps[5] = coords.length;
+      coords.push([
+        (-4 * coords[ps[0]][0] - coords[ps[15]][0] +
+          6 * (coords[ps[4]][0] + coords[ps[1]][0]) -
+          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +
+          3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9,
+        (-4 * coords[ps[0]][1] - coords[ps[15]][1] +
+          6 * (coords[ps[4]][1] + coords[ps[1]][1]) -
+          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +
+          3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9
+      ]);
+      ps[6] = coords.length;
+      coords.push([
+        (-4 * coords[ps[3]][0] - coords[ps[12]][0] +
+          6 * (coords[ps[2]][0] + coords[ps[7]][0]) -
+          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +
+          3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9,
+        (-4 * coords[ps[3]][1] - coords[ps[12]][1] +
+          6 * (coords[ps[2]][1] + coords[ps[7]][1]) -
+          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +
+          3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9
+      ]);
+      ps[9] = coords.length;
+      coords.push([
+        (-4 * coords[ps[12]][0] - coords[ps[3]][0] +
+          6 * (coords[ps[8]][0] + coords[ps[13]][0]) -
+          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +
+          3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9,
+        (-4 * coords[ps[12]][1] - coords[ps[3]][1] +
+          6 * (coords[ps[8]][1] + coords[ps[13]][1]) -
+          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +
+          3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9
+      ]);
+      ps[10] = coords.length;
+      coords.push([
+        (-4 * coords[ps[15]][0] - coords[ps[0]][0] +
+          6 * (coords[ps[11]][0] + coords[ps[14]][0]) -
+          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +
+          3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9,
+        (-4 * coords[ps[15]][1] - coords[ps[0]][1] +
+          6 * (coords[ps[11]][1] + coords[ps[14]][1]) -
+          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +
+          3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9
+      ]);
+      mesh.figures.push({
+        type: 'patch',
+        coords: new Int32Array(ps), // making copies of ps and cs
+        colors: new Int32Array(cs)
+      });
+    }
+  }
+
+  function decodeType7Shading(mesh, reader) {
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33
+    var cs = new Int32Array(4); // c00, c30, c03, c33
+    while (reader.hasData) {
+      var f = reader.readFlag();
+      assert(0 <= f && f <= 3, 'Unknown type7 flag');
+      var i, ii;
+      var pi = coords.length;
+      for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) {
+        coords.push(reader.readCoordinate());
+      }
+      var ci = colors.length;
+      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {
+        colors.push(reader.readComponents());
+      }
+      var tmp1, tmp2, tmp3, tmp4;
+      switch (f) {
+        case 0:
+          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;
+          ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7;
+          ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8;
+          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;
+          cs[2] = ci + 1; cs[3] = ci + 2;
+          cs[0] = ci;     cs[1] = ci + 3;
+          break;
+        case 1:
+          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];
+          ps[12] = pi + 5; ps[13] = pi + 4;  ps[14] = pi + 3;  ps[15] = pi + 2;
+          ps[ 8] = pi + 6; ps[ 9] = pi + 11; ps[10] = pi + 10; ps[11] = pi + 1;
+          ps[ 4] = pi + 7; ps[ 5] = pi + 8;  ps[ 6] = pi + 9;  ps[ 7] = pi;
+          ps[ 0] = tmp1;   ps[ 1] = tmp2;    ps[ 2] = tmp3;    ps[ 3] = tmp4;
+          tmp1 = cs[2]; tmp2 = cs[3];
+          cs[2] = ci + 1; cs[3] = ci;
+          cs[0] = tmp1;   cs[1] = tmp2;
+          break;
+        case 2:
+          ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6;  ps[15] = pi + 5;
+          ps[ 8] = ps[11]; ps[ 9] = pi + 8; ps[10] = pi + 11; ps[11] = pi + 4;
+          ps[ 4] = ps[7];  ps[ 5] = pi + 9; ps[ 6] = pi + 10; ps[ 7] = pi + 3;
+          ps[ 0] = ps[3];  ps[ 1] = pi;     ps[ 2] = pi + 1;  ps[ 3] = pi + 2;
+          cs[2] = cs[3]; cs[3] = ci + 1;
+          cs[0] = cs[1]; cs[1] = ci;
+          break;
+        case 3:
+          ps[12] = ps[0];  ps[13] = ps[1];   ps[14] = ps[2];   ps[15] = ps[3];
+          ps[ 8] = pi;     ps[ 9] = pi + 9;  ps[10] = pi + 8;  ps[11] = pi + 7;
+          ps[ 4] = pi + 1; ps[ 5] = pi + 10; ps[ 6] = pi + 11; ps[ 7] = pi + 6;
+          ps[ 0] = pi + 2; ps[ 1] = pi + 3;  ps[ 2] = pi + 4;  ps[ 3] = pi + 5;
+          cs[2] = cs[0]; cs[3] = cs[1];
+          cs[0] = ci;    cs[1] = ci + 1;
+          break;
+      }
+      mesh.figures.push({
+        type: 'patch',
+        coords: new Int32Array(ps), // making copies of ps and cs
+        colors: new Int32Array(cs)
+      });
+    }
+  }
+
+  function updateBounds(mesh) {
+    var minX = mesh.coords[0][0], minY = mesh.coords[0][1],
+      maxX = minX, maxY = minY;
+    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {
+      var x = mesh.coords[i][0], y = mesh.coords[i][1];
+      minX = minX > x ? x : minX;
+      minY = minY > y ? y : minY;
+      maxX = maxX < x ? x : maxX;
+      maxY = maxY < y ? y : maxY;
+    }
+    mesh.bounds = [minX, minY, maxX, maxY];
+  }
+
+  function packData(mesh) {
+    var i, ii, j, jj;
+
+    var coords = mesh.coords;
+    var coordsPacked = new Float32Array(coords.length * 2);
+    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
+      var xy = coords[i];
+      coordsPacked[j++] = xy[0];
+      coordsPacked[j++] = xy[1];
+    }
+    mesh.coords = coordsPacked;
+
+    var colors = mesh.colors;
+    var colorsPacked = new Uint8Array(colors.length * 3);
+    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
+      var c = colors[i];
+      colorsPacked[j++] = c[0];
+      colorsPacked[j++] = c[1];
+      colorsPacked[j++] = c[2];
+    }
+    mesh.colors = colorsPacked;
+
+    var figures = mesh.figures;
+    for (i = 0, ii = figures.length; i < ii; i++) {
+      var figure = figures[i], ps = figure.coords, cs = figure.colors;
+      for (j = 0, jj = ps.length; j < jj; j++) {
+        ps[j] *= 2;
+        cs[j] *= 3;
+      }
+    }
+  }
+
+  function Mesh(stream, matrix, xref, res) {
+    assert(isStream(stream), 'Mesh data is not a stream');
+    var dict = stream.dict;
+    this.matrix = matrix;
+    this.shadingType = dict.get('ShadingType');
+    this.type = 'Pattern';
+    this.bbox = dict.get('BBox');
+    var cs = dict.get('ColorSpace', 'CS');
+    cs = ColorSpace.parse(cs, xref, res);
+    this.cs = cs;
+    this.background = dict.has('Background') ?
+      cs.getRgb(dict.get('Background'), 0) : null;
+
+    var fnObj = dict.get('Function');
+    var fn;
+    if (!fnObj) {
+      fn = null;
+    } else if (isArray(fnObj)) {
+      var fnArray = [];
+      for (var j = 0, jj = fnObj.length; j < jj; j++) {
+        var obj = xref.fetchIfRef(fnObj[j]);
+        if (!isPDFFunction(obj)) {
+          error('Invalid function');
+        }
+        fnArray.push(PDFFunction.parse(xref, obj));
+      }
+      fn = function radialAxialColorFunction(arg) {
+        var out = [];
+        for (var i = 0, ii = fnArray.length; i < ii; i++) {
+          out.push(fnArray[i](arg)[0]);
+        }
+        return out;
+      };
+    } else {
+      if (!isPDFFunction(fnObj)) {
+        error('Invalid function');
+      }
+      fn = PDFFunction.parse(xref, fnObj);
+    }
+
+    this.coords = [];
+    this.colors = [];
+    this.figures = [];
+
+    var decodeContext = {
+      bitsPerCoordinate: dict.get('BitsPerCoordinate'),
+      bitsPerComponent: dict.get('BitsPerComponent'),
+      bitsPerFlag: dict.get('BitsPerFlag'),
+      decode: dict.get('Decode'),
+      colorFn: fn,
+      colorSpace: cs,
+      numComps: fn ? 1 : cs.numComps
+    };
+    var reader = new MeshStreamReader(stream, decodeContext);
+
+    var patchMesh = false;
+    switch (this.shadingType) {
+      case PatternType.FREE_FORM_MESH:
+        decodeType4Shading(this, reader);
+        break;
+      case PatternType.LATTICE_FORM_MESH:
+        var verticesPerRow = dict.get('VerticesPerRow') | 0;
+        assert(verticesPerRow >= 2, 'Invalid VerticesPerRow');
+        decodeType5Shading(this, reader, verticesPerRow);
+        break;
+      case PatternType.COONS_PATCH_MESH:
+        decodeType6Shading(this, reader);
+        patchMesh = true;
+        break;
+      case PatternType.TENSOR_PATCH_MESH:
+        decodeType7Shading(this, reader);
+        patchMesh = true;
+        break;
+      default:
+        error('Unsupported mesh type.');
+        break;
+    }
+
+    if (patchMesh) {
+      // dirty bounds calculation for determining, how dense shall be triangles
+      updateBounds(this);
+      for (var i = 0, ii = this.figures.length; i < ii; i++) {
+        buildFigureFromPatch(this, i);
+      }
+    }
+    // calculate bounds
+    updateBounds(this);
+
+    packData(this);
+  }
+
+  Mesh.prototype = {
+    getIR: function Mesh_getIR() {
+      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures,
+        this.bounds, this.matrix, this.bbox, this.background];
+    }
+  };
+
+  return Mesh;
+})();
+
+Shadings.Dummy = (function DummyClosure() {
+  function Dummy() {
+    this.type = 'Pattern';
+  }
+
+  Dummy.prototype = {
+    getIR: function Dummy_getIR() {
+      return ['Dummy'];
+    }
+  };
+  return Dummy;
+})();
+
+function getTilingPatternIR(operatorList, dict, args) {
+  var matrix = dict.get('Matrix');
+  var bbox = dict.get('BBox');
+  var xstep = dict.get('XStep');
+  var ystep = dict.get('YStep');
+  var paintType = dict.get('PaintType');
+  var tilingType = dict.get('TilingType');
+
+  return [
+    'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,
+    paintType, tilingType
+  ];
+}
+
+
+var PartialEvaluator = (function PartialEvaluatorClosure() {
+  function PartialEvaluator(pdfManager, xref, handler, pageIndex,
+                            uniquePrefix, idCounters, fontCache) {
+    this.pdfManager = pdfManager;
+    this.xref = xref;
+    this.handler = handler;
+    this.pageIndex = pageIndex;
+    this.uniquePrefix = uniquePrefix;
+    this.idCounters = idCounters;
+    this.fontCache = fontCache;
+  }
+
+  var TILING_PATTERN = 1, SHADING_PATTERN = 2;
+
+  PartialEvaluator.prototype = {
+    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {
+      if (!isDict(resources)) {
+        return false;
+      }
+
+      var processed = Object.create(null);
+      if (resources.objId) {
+        processed[resources.objId] = true;
+      }
+
+      var nodes = [resources];
+      while (nodes.length) {
+        var key;
+        var node = nodes.shift();
+        // First check the current resources for blend modes.
+        var graphicStates = node.get('ExtGState');
+        if (isDict(graphicStates)) {
+          graphicStates = graphicStates.getAll();
+          for (key in graphicStates) {
+            var graphicState = graphicStates[key];
+            var bm = graphicState['BM'];
+            if (isName(bm) && bm.name !== 'Normal') {
+              return true;
+            }
+          }
+        }
+        // Descend into the XObjects to look for more resources and blend modes.
+        var xObjects = node.get('XObject');
+        if (!isDict(xObjects)) {
+          continue;
+        }
+        xObjects = xObjects.getAll();
+        for (key in xObjects) {
+          var xObject = xObjects[key];
+          if (!isStream(xObject)) {
+            continue;
+          }
+          var xResources = xObject.dict.get('Resources');
+          // Checking objId to detect an infinite loop.
+          if (isDict(xResources) &&
+              (!xResources.objId || !processed[xResources.objId])) {
+            nodes.push(xResources);
+            if (xResources.objId) {
+              processed[xResources.objId] = true;
+            }
+          }
+        }
+      }
+      return false;
+    },
+
+    buildFormXObject: function PartialEvaluator_buildFormXObject(resources,
+                                                                 xobj, smask,
+                                                                 operatorList,
+                                                                 initialState) {
+      var matrix = xobj.dict.get('Matrix');
+      var bbox = xobj.dict.get('BBox');
+      var group = xobj.dict.get('Group');
+      if (group) {
+        var groupOptions = {
+          matrix: matrix,
+          bbox: bbox,
+          smask: smask,
+          isolated: false,
+          knockout: false
+        };
+
+        var groupSubtype = group.get('S');
+        if (isName(groupSubtype) && groupSubtype.name === 'Transparency') {
+          groupOptions.isolated = (group.get('I') || false);
+          groupOptions.knockout = (group.get('K') || false);
+          var colorSpace = group.get('CS');
+          groupOptions.colorSpace = (colorSpace ?
+            ColorSpace.parseToIR(colorSpace, this.xref, resources) : null);
+        }
+        operatorList.addOp(OPS.beginGroup, [groupOptions]);
+      }
+
+      operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]);
+
+      this.getOperatorList(xobj, (xobj.dict.get('Resources') || resources),
+                           operatorList, initialState);
+      operatorList.addOp(OPS.paintFormXObjectEnd, []);
+
+      if (group) {
+        operatorList.addOp(OPS.endGroup, [groupOptions]);
+      }
+    },
+
+    buildPaintImageXObject:
+        function PartialEvaluator_buildPaintImageXObject(resources, image,
+                                                         inline, operatorList,
+                                                         cacheKey, cache) {
+      var self = this;
+      var dict = image.dict;
+      var w = dict.get('Width', 'W');
+      var h = dict.get('Height', 'H');
+
+      if (!(w && isNum(w)) || !(h && isNum(h))) {
+        warn('Image dimensions are missing, or not numbers.');
+        return;
+      }
+      if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) {
+        warn('Image exceeded maximum allowed size and was removed.');
+        return;
+      }
+
+      var imageMask = (dict.get('ImageMask', 'IM') || false);
+      var imgData, args;
+      if (imageMask) {
+        // This depends on a tmpCanvas being filled with the
+        // current fillStyle, such that processing the pixel
+        // data can't be done here. Instead of creating a
+        // complete PDFImage, only read the information needed
+        // for later.
+
+        var width = dict.get('Width', 'W');
+        var height = dict.get('Height', 'H');
+        var bitStrideLength = (width + 7) >> 3;
+        var imgArray = image.getBytes(bitStrideLength * height);
+        var decode = dict.get('Decode', 'D');
+        var canTransfer = image instanceof DecodeStream;
+        var inverseDecode = (!!decode && decode[0] > 0);
+
+        imgData = PDFImage.createMask(imgArray, width, height,
+                                      canTransfer, inverseDecode);
+        imgData.cached = true;
+        args = [imgData];
+        operatorList.addOp(OPS.paintImageMaskXObject, args);
+        if (cacheKey) {
+          cache.key = cacheKey;
+          cache.fn = OPS.paintImageMaskXObject;
+          cache.args = args;
+        }
+        return;
+      }
+
+      var softMask = (dict.get('SMask', 'SM') || false);
+      var mask = (dict.get('Mask') || false);
+
+      var SMALL_IMAGE_DIMENSIONS = 200;
+      // Inlining small images into the queue as RGB data
+      if (inline && !softMask && !mask && !(image instanceof JpegStream) &&
+          (w + h) < SMALL_IMAGE_DIMENSIONS) {
+        var imageObj = new PDFImage(this.xref, resources, image,
+                                    inline, null, null);
+        // We force the use of RGBA_32BPP images here, because we can't handle
+        // any other kind.
+        imgData = imageObj.createImageData(/* forceRGBA = */ true);
+        operatorList.addOp(OPS.paintInlineImageXObject, [imgData]);
+        return;
+      }
+
+      // If there is no imageMask, create the PDFImage and a lot
+      // of image processing can be done here.
+      var uniquePrefix = (this.uniquePrefix || '');
+      var objId = 'img_' + uniquePrefix + (++this.idCounters.obj);
+      operatorList.addDependency(objId);
+      args = [objId, w, h];
+
+      if (!softMask && !mask && image instanceof JpegStream &&
+          image.isNativelySupported(this.xref, resources)) {
+        // These JPEGs don't need any more processing so we can just send it.
+        operatorList.addOp(OPS.paintJpegXObject, args);
+        this.handler.send('obj',
+          [objId, this.pageIndex, 'JpegStream', image.getIR()]);
+        return;
+      }
+
+      PDFImage.buildImage(self.handler, self.xref, resources, image, inline).
+        then(function(imageObj) {
+          var imgData = imageObj.createImageData(/* forceRGBA = */ false);
+          self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData],
+            null, [imgData.data.buffer]);
+        }).then(null, function (reason) {
+          warn('Unable to decode image: ' + reason);
+          self.handler.send('obj', [objId, self.pageIndex, 'Image', null]);
+        });
+
+      operatorList.addOp(OPS.paintImageXObject, args);
+      if (cacheKey) {
+        cache.key = cacheKey;
+        cache.fn = OPS.paintImageXObject;
+        cache.args = args;
+      }
+    },
+
+    handleSMask: function PartialEvaluator_handleSmask(smask, resources,
+                                                       operatorList,
+                                                       stateManager) {
+      var smaskContent = smask.get('G');
+      var smaskOptions = {
+        subtype: smask.get('S').name,
+        backdrop: smask.get('BC')
+      };
+      this.buildFormXObject(resources, smaskContent, smaskOptions,
+                            operatorList, stateManager.state.clone());
+    },
+
+    handleTilingType:
+        function PartialEvaluator_handleTilingType(fn, args, resources,
+                                                   pattern, patternDict,
+                                                   operatorList) {
+      // Create an IR of the pattern code.
+      var tilingOpList = this.getOperatorList(pattern,
+        (patternDict.get('Resources') || resources));
+      // Add the dependencies to the parent operator list so they are resolved
+      // before sub operator list is executed synchronously.
+      operatorList.addDependencies(tilingOpList.dependencies);
+      operatorList.addOp(fn, getTilingPatternIR({
+                               fnArray: tilingOpList.fnArray,
+                               argsArray: tilingOpList.argsArray
+                             }, patternDict, args));
+    },
+
+    handleSetFont:
+        function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef,
+                                                operatorList, state) {
+      // TODO(mack): Not needed?
+      var fontName;
+      if (fontArgs) {
+        fontArgs = fontArgs.slice();
+        fontName = fontArgs[0].name;
+      }
+      var self = this;
+      var font = this.loadFont(fontName, fontRef, this.xref, resources,
+                               operatorList);
+      state.font = font;
+      var loadedName = font.loadedName;
+      if (!font.sent) {
+        var fontData = font.translated.exportData();
+
+        self.handler.send('commonobj', [
+          loadedName,
+          'Font',
+          fontData
+        ]);
+        font.sent = true;
+      }
+
+      return loadedName;
+    },
+
+    handleText: function PartialEvaluator_handleText(chars, state) {
+      var font = state.font.translated;
+      var glyphs = font.charsToGlyphs(chars);
+      var isAddToPathSet = !!(state.textRenderingMode &
+                              TextRenderingMode.ADD_TO_PATH_FLAG);
+      if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) {
+        for (var i = 0; i < glyphs.length; i++) {
+          if (glyphs[i] === null) {
+            continue;
+          }
+          var fontChar = glyphs[i].fontChar;
+          if (!font.renderer.hasBuiltPath(fontChar)) {
+            var path = font.renderer.getPathJs(fontChar);
+            this.handler.send('commonobj', [
+              font.loadedName + '_path_' + fontChar,
+              'FontPath',
+              path
+            ]);
+          }
+        }
+      }
+
+      return glyphs;
+    },
+
+    setGState: function PartialEvaluator_setGState(resources, gState,
+                                                   operatorList, xref,
+                                                   stateManager) {
+
+      var self = this;
+      // TODO(mack): This should be rewritten so that this function returns
+      // what should be added to the queue during each iteration
+      function setGStateForKey(gStateObj, key, value) {
+        switch (key) {
+          case 'Type':
+            break;
+          case 'LW':
+          case 'LC':
+          case 'LJ':
+          case 'ML':
+          case 'D':
+          case 'RI':
+          case 'FL':
+          case 'CA':
+          case 'ca':
+            gStateObj.push([key, value]);
+            break;
+          case 'Font':
+            var loadedName = self.handleSetFont(resources, null, value[0],
+                                                operatorList,
+                                                stateManager.state);
+            operatorList.addDependency(loadedName);
+            gStateObj.push([key, [loadedName, value[1]]]);
+            break;
+          case 'BM':
+            gStateObj.push([key, value]);
+            break;
+          case 'SMask':
+            if (isName(value) && value.name === 'None') {
+              gStateObj.push([key, false]);
+              break;
+            }
+            var dict = xref.fetchIfRef(value);
+            if (isDict(dict)) {
+              self.handleSMask(dict, resources, operatorList, stateManager);
+              gStateObj.push([key, true]);
+            } else {
+              warn('Unsupported SMask type');
+            }
+
+            break;
+          // Only generate info log messages for the following since
+          // they are unlikey to have a big impact on the rendering.
+          case 'OP':
+          case 'op':
+          case 'OPM':
+          case 'BG':
+          case 'BG2':
+          case 'UCR':
+          case 'UCR2':
+          case 'TR':
+          case 'TR2':
+          case 'HT':
+          case 'SM':
+          case 'SA':
+          case 'AIS':
+          case 'TK':
+            // TODO implement these operators.
+            info('graphic state operator ' + key);
+            break;
+          default:
+            info('Unknown graphic state operator ' + key);
+            break;
+        }
+      }
+
+      // This array holds the converted/processed state data.
+      var gStateObj = [];
+      var gStateMap = gState.map;
+      for (var key in gStateMap) {
+        var value = gStateMap[key];
+        setGStateForKey(gStateObj, key, value);
+      }
+
+      operatorList.addOp(OPS.setGState, [gStateObj]);
+    },
+
+    loadFont: function PartialEvaluator_loadFont(fontName, font, xref,
+                                                 resources,
+                                                 parentOperatorList) {
+
+      function errorFont() {
+        return {
+          translated: new ErrorFont('Font ' + fontName + ' is not available'),
+          loadedName: 'g_font_error'
+        };
+      }
+
+      var fontRef;
+      if (font) { // Loading by ref.
+        assert(isRef(font));
+        fontRef = font;
+      } else { // Loading by name.
+        var fontRes = resources.get('Font');
+        if (fontRes) {
+          fontRef = fontRes.getRaw(fontName);
+        } else {
+          warn('fontRes not available');
+          return errorFont();
+        }
+      }
+      if (this.fontCache.has(fontRef)) {
+        return this.fontCache.get(fontRef);
+      }
+
+      font = xref.fetchIfRef(fontRef);
+      if (!isDict(font)) {
+        return errorFont();
+      }
+
+      var preEvaluatedFont = this.preEvaluateFont(font, xref);
+      var descriptor = preEvaluatedFont.descriptor;
+      var fontID = fontRef.num + '_' + fontRef.gen;
+      if (isDict(descriptor)) {
+        if (!descriptor.fontAliases) {
+          descriptor.fontAliases = Object.create(null);
+        }
+
+        var fontAliases = descriptor.fontAliases;
+        var hash = preEvaluatedFont.hash;
+        if (fontAliases[hash]) {
+          var aliasFontRef = fontAliases[hash].aliasRef;
+          if (aliasFontRef && this.fontCache.has(aliasFontRef)) {
+            this.fontCache.putAlias(fontRef, aliasFontRef);
+            var cachedFont = this.fontCache.get(fontRef);
+            return cachedFont;
+          }
+        }
+
+        if (!fontAliases[hash]) {
+          fontAliases[hash] = {
+            fontID: Font.getFontID()
+          };
+        }
+
+        fontAliases[hash].aliasRef = fontRef;
+        fontID = fontAliases[hash].fontID;
+      }
+
+      // Workaround for bad PDF generators that don't reference fonts
+      // properly, i.e. by not using an object identifier.
+      // Check if the fontRef is a Dict (as opposed to a standard object),
+      // in which case we don't cache the font and instead reference it by
+      // fontName in font.loadedName below.
+      var fontRefIsDict = isDict(fontRef);
+      if (!fontRefIsDict) {
+        this.fontCache.put(fontRef, font);
+      }
+
+      // Keep track of each font we translated so the caller can
+      // load them asynchronously before calling display on a page.
+      font.loadedName = 'g_font_' + (fontRefIsDict ?
+        fontName.replace(/\W/g, '') : fontID);
+
+      if (!font.translated) {
+        var translated;
+        try {
+          translated = this.translateFont(preEvaluatedFont, xref);
+        } catch (e) {
+          UnsupportedManager.notify(UNSUPPORTED_FEATURES.font);
+          translated = new ErrorFont(e instanceof Error ? e.message : e);
+        }
+        font.translated = translated;
+      }
+
+      if (font.translated.loadCharProcs) {
+        var charProcs = font.get('CharProcs').getAll();
+        var fontResources = (font.get('Resources') || resources);
+        var charProcKeys = Object.keys(charProcs);
+        var charProcOperatorList = {};
+        for (var i = 0, n = charProcKeys.length; i < n; ++i) {
+          var key = charProcKeys[i];
+          var glyphStream = charProcs[key];
+          var operatorList = this.getOperatorList(glyphStream, fontResources);
+          charProcOperatorList[key] = operatorList.getIR();
+          if (!parentOperatorList) {
+            continue;
+          }
+          // Add the dependencies to the parent operator list so they are
+          // resolved before sub operator list is executed synchronously.
+          parentOperatorList.addDependencies(charProcOperatorList.dependencies);
+        }
+        font.translated.charProcOperatorList = charProcOperatorList;
+      }
+      font.loaded = true;
+      return font;
+    },
+
+    getOperatorList: function PartialEvaluator_getOperatorList(stream,
+                                                               resources,
+                                                               operatorList,
+                                                               initialState) {
+
+      var self = this;
+      var xref = this.xref;
+      var imageCache = {};
+
+      operatorList = (operatorList || new OperatorList());
+
+      resources = (resources || Dict.empty);
+      var xobjs = (resources.get('XObject') || Dict.empty);
+      var patterns = (resources.get('Pattern') || Dict.empty);
+      var stateManager = new StateManager(initialState || new EvalState());
+      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+
+      var operation, i, ii;
+      while ((operation = preprocessor.read())) {
+        var args = operation.args;
+        var fn = operation.fn;
+        var shading;
+
+        switch (fn) {
+          case OPS.setStrokeColorN:
+          case OPS.setFillColorN:
+            if (args[args.length - 1].code) {
+              break;
+            }
+            // compile tiling patterns
+            var patternName = args[args.length - 1];
+            // SCN/scn applies patterns along with normal colors
+            var pattern;
+            if (isName(patternName) &&
+                (pattern = patterns.get(patternName.name))) {
+              var dict = (isStream(pattern) ? pattern.dict : pattern);
+              var typeNum = dict.get('PatternType');
+
+              if (typeNum == TILING_PATTERN) {
+                self.handleTilingType(fn, args, resources, pattern, dict,
+                                      operatorList);
+                args = [];
+                continue;
+              } else if (typeNum == SHADING_PATTERN) {
+                shading = dict.get('Shading');
+                var matrix = dict.get('Matrix');
+                pattern = Pattern.parseShading(shading, matrix, xref,
+                                               resources);
+                args = pattern.getIR();
+              } else {
+                error('Unkown PatternType ' + typeNum);
+              }
+            }
+            break;
+          case OPS.paintXObject:
+            if (args[0].code) {
+              break;
+            }
+            // eagerly compile XForm objects
+            var name = args[0].name;
+            if (imageCache.key === name) {
+              operatorList.addOp(imageCache.fn, imageCache.args);
+              args = [];
+              continue;
+            }
+
+            var xobj = xobjs.get(name);
+            if (xobj) {
+              assert(isStream(xobj), 'XObject should be a stream');
+
+              var type = xobj.dict.get('Subtype');
+              assert(isName(type),
+                'XObject should have a Name subtype');
+
+              if ('Form' == type.name) {
+                stateManager.save();
+                self.buildFormXObject(resources, xobj, null, operatorList,
+                                      stateManager.state.clone());
+                args = [];
+                stateManager.restore();
+                continue;
+              } else if ('Image' == type.name) {
+                self.buildPaintImageXObject(resources, xobj, false,
+                                            operatorList, name, imageCache);
+                args = [];
+                continue;
+              } else {
+                error('Unhandled XObject subtype ' + type.name);
+              }
+            }
+            break;
+          case OPS.setFont:
+            // eagerly collect all fonts
+            var loadedName = self.handleSetFont(resources, args, null,
+                                                operatorList,
+                                                stateManager.state);
+            operatorList.addDependency(loadedName);
+            args[0] = loadedName;
+            break;
+          case OPS.endInlineImage:
+            var cacheKey = args[0].cacheKey;
+            if (cacheKey && imageCache.key === cacheKey) {
+              operatorList.addOp(imageCache.fn, imageCache.args);
+              args = [];
+              continue;
+            }
+            self.buildPaintImageXObject(resources, args[0], true,
+                                        operatorList, cacheKey, imageCache);
+            args = [];
+            continue;
+          case OPS.showText:
+            args[0] = this.handleText(args[0], stateManager.state);
+            break;
+          case OPS.showSpacedText:
+            var arr = args[0];
+            var arrLength = arr.length;
+            for (i = 0; i < arrLength; ++i) {
+              if (isString(arr[i])) {
+                arr[i] = this.handleText(arr[i], stateManager.state);
+              }
+            }
+            break;
+          case OPS.nextLineShowText:
+            args[0] = this.handleText(args[0], stateManager.state);
+            break;
+          case OPS.nextLineSetSpacingShowText:
+            args[2] = this.handleText(args[2], stateManager.state);
+            break;
+          case OPS.setTextRenderingMode:
+            stateManager.state.textRenderingMode = args[0];
+            break;
+          // Parse the ColorSpace data to a raw format.
+          case OPS.setFillColorSpace:
+          case OPS.setStrokeColorSpace:
+            args = [ColorSpace.parseToIR(args[0], xref, resources)];
+            break;
+          case OPS.shadingFill:
+            var shadingRes = resources.get('Shading');
+            if (!shadingRes) {
+              error('No shading resource found');
+            }
+
+            shading = shadingRes.get(args[0].name);
+            if (!shading) {
+              error('No shading object found');
+            }
+
+            var shadingFill = Pattern.parseShading(shading, null, xref,
+                                                   resources);
+            var patternIR = shadingFill.getIR();
+            args = [patternIR];
+            fn = OPS.shadingFill;
+            break;
+          case OPS.setGState:
+            var dictName = args[0];
+            var extGState = resources.get('ExtGState');
+
+            if (!isDict(extGState) || !extGState.has(dictName.name)) {
+              break;
+            }
+
+            var gState = extGState.get(dictName.name);
+            self.setGState(resources, gState, operatorList, xref,
+                           stateManager);
+            args = [];
+            continue;
+        }
+        operatorList.addOp(fn, args);
+      }
+
+      // Some PDFs don't close all restores inside object/form.
+      // Closing those for them.
+      for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
+        operatorList.addOp(OPS.restore, []);
+      }
+
+      return operatorList;
+    },
+
+    getTextContent: function PartialEvaluator_getTextContent(stream, resources,
+                                                             stateManager) {
+
+      stateManager = (stateManager || new StateManager(new TextState()));
+
+      var textContent = {
+        items: [],
+        styles: Object.create(null)
+      };
+      var bidiTexts = textContent.items;
+      var SPACE_FACTOR = 0.35;
+      var MULTI_SPACE_FACTOR = 1.5;
+
+      var self = this;
+      var xref = this.xref;
+
+      resources = (xref.fetchIfRef(resources) || Dict.empty);
+
+      // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.
+      var xobjs = null;
+      var xobjsCache = {};
+
+      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+
+      var operation;
+      var textState;
+
+      function newTextChunk() {
+        var font = textState.font;
+        if (!(font.loadedName in textContent.styles)) {
+          textContent.styles[font.loadedName] = {
+            fontFamily: font.fallbackName,
+            ascent: font.ascent,
+            descent: font.descent,
+            vertical: font.vertical
+          };
+        }
+        return {
+          str: '',
+          dir: null,
+          width: 0,
+          height: 0,
+          transform: null,
+          fontName: font.loadedName
+        };
+      }
+
+      function runBidi(textChunk) {
+        var bidiResult = PDFJS.bidi(textChunk.str, -1, textState.font.vertical);
+        textChunk.str = bidiResult.str;
+        textChunk.dir = bidiResult.dir;
+        return textChunk;
+      }
+
+      function handleSetFont(fontName, fontRef) {
+        var font = textState.font = self.loadFont(fontName, fontRef, xref,
+                                                  resources, null).translated;
+        textState.fontMatrix = font.fontMatrix ? font.fontMatrix :
+                                 FONT_IDENTITY_MATRIX;
+      }
+
+      function buildTextGeometry(chars, textChunk) {
+        var font = textState.font;
+        textChunk = textChunk || newTextChunk();
+        if (!textChunk.transform) {
+          // 9.4.4 Text Space Details
+          var tsm = [textState.fontSize * textState.textHScale, 0,
+                     0, textState.fontSize,
+                     0, textState.textRise];
+          var trm = textChunk.transform = Util.transform(textState.ctm,
+                                    Util.transform(textState.textMatrix, tsm));
+          if (!font.vertical) {
+            textChunk.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);
+          } else {
+            textChunk.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);
+          }
+        }
+        var width = 0;
+        var height = 0;
+        var glyphs = font.charsToGlyphs(chars);
+        var defaultVMetrics = font.defaultVMetrics;
+        for (var i = 0; i < glyphs.length; i++) {
+          var glyph = glyphs[i];
+          if (!glyph) { // Previous glyph was a space.
+            width += textState.wordSpacing * textState.textHScale;
+            continue;
+          }
+          var vMetricX = null;
+          var vMetricY = null;
+          var glyphWidth = null;
+          if (font.vertical) {
+            if (glyph.vmetric) {
+              glyphWidth = glyph.vmetric[0];
+              vMetricX = glyph.vmetric[1];
+              vMetricY = glyph.vmetric[2];
+            } else {
+              glyphWidth = glyph.width;
+              vMetricX = glyph.width * 0.5;
+              vMetricY = defaultVMetrics[2];
+            }
+          } else {
+            glyphWidth = glyph.width;
+          }
+
+          var glyphUnicode = glyph.unicode;
+          if (glyphUnicode in NormalizedUnicodes) {
+            glyphUnicode = NormalizedUnicodes[glyphUnicode];
+          }
+          glyphUnicode = reverseIfRtl(glyphUnicode);
+
+          // The following will calculate the x and y of the individual glyphs.
+          // if (font.vertical) {
+          //   tsm[4] -= vMetricX * Math.abs(textState.fontSize) *
+          //             textState.fontMatrix[0];
+          //   tsm[5] -= vMetricY * textState.fontSize *
+          //             textState.fontMatrix[0];
+          // }
+          // var trm = Util.transform(textState.textMatrix, tsm);
+          // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm);
+          // var x = pt[0];
+          // var y = pt[1];
+
+          var tx = 0;
+          var ty = 0;
+          if (!font.vertical) {
+            var w0 = glyphWidth * textState.fontMatrix[0];
+            tx = (w0 * textState.fontSize + textState.charSpacing) *
+                 textState.textHScale;
+            width += tx;
+          } else {
+            var w1 = glyphWidth * textState.fontMatrix[0];
+            ty = w1 * textState.fontSize + textState.charSpacing;
+            height += ty;
+          }
+          textState.translateTextMatrix(tx, ty);
+
+          textChunk.str += glyphUnicode;
+        }
+
+        var a = textState.textLineMatrix[0];
+        var b = textState.textLineMatrix[1];
+        var scaleLineX = Math.sqrt(a * a + b * b);
+        a = textState.ctm[0];
+        b = textState.ctm[1];
+        var scaleCtmX = Math.sqrt(a * a + b * b);
+        if (!font.vertical) {
+          textChunk.width += width * scaleCtmX * scaleLineX;
+        } else {
+          textChunk.height += Math.abs(height * scaleCtmX * scaleLineX);
+        }
+        return textChunk;
+      }
+
+      while ((operation = preprocessor.read())) {
+        textState = stateManager.state;
+        var fn = operation.fn;
+        var args = operation.args;
+        switch (fn) {
+          case OPS.setFont:
+            handleSetFont(args[0].name);
+            textState.fontSize = args[1];
+            break;
+          case OPS.setTextRise:
+            textState.textRise = args[0];
+            break;
+          case OPS.setHScale:
+            textState.textHScale = args[0] / 100;
+            break;
+          case OPS.setLeading:
+            textState.leading = args[0];
+            break;
+          case OPS.moveText:
+            textState.translateTextLineMatrix(args[0], args[1]);
+            textState.textMatrix = textState.textLineMatrix.slice();
+            break;
+          case OPS.setLeadingMoveText:
+            textState.leading = -args[1];
+            textState.translateTextLineMatrix(args[0], args[1]);
+            textState.textMatrix = textState.textLineMatrix.slice();
+            break;
+          case OPS.nextLine:
+            textState.carriageReturn();
+            break;
+          case OPS.setTextMatrix:
+            textState.setTextMatrix(args[0], args[1], args[2], args[3],
+                                    args[4], args[5]);
+            textState.setTextLineMatrix(args[0], args[1], args[2], args[3],
+                                        args[4], args[5]);
+            break;
+          case OPS.setCharSpacing:
+            textState.charSpacing = args[0];
+            break;
+          case OPS.setWordSpacing:
+            textState.wordSpacing = args[0];
+            break;
+          case OPS.beginText:
+            textState.textMatrix = IDENTITY_MATRIX.slice();
+            textState.textLineMatrix = IDENTITY_MATRIX.slice();
+            break;
+          case OPS.showSpacedText:
+            var items = args[0];
+            var textChunk = newTextChunk();
+            var offset;
+            for (var j = 0, jj = items.length; j < jj; j++) {
+              if (typeof items[j] === 'string') {
+                buildTextGeometry(items[j], textChunk);
+              } else {
+                var val = items[j] / 1000;
+                if (!textState.font.vertical) {
+                  offset = -val * textState.fontSize * textState.textHScale *
+                           textState.textMatrix[0];
+                  textState.translateTextMatrix(offset, 0);
+                  textChunk.width += offset;
+                } else {
+                  offset = -val * textState.fontSize * textState.textMatrix[3];
+                  textState.translateTextMatrix(0, offset);
+                  textChunk.height += offset;
+                }
+                if (items[j] < 0 && textState.font.spaceWidth > 0) {
+                  var fakeSpaces = -items[j] / textState.font.spaceWidth;
+                  if (fakeSpaces > MULTI_SPACE_FACTOR) {
+                    fakeSpaces = Math.round(fakeSpaces);
+                    while (fakeSpaces--) {
+                      textChunk.str += ' ';
+                    }
+                  } else if (fakeSpaces > SPACE_FACTOR) {
+                    textChunk.str += ' ';
+                  }
+                }
+              }
+            }
+            bidiTexts.push(runBidi(textChunk));
+            break;
+          case OPS.showText:
+            bidiTexts.push(runBidi(buildTextGeometry(args[0])));
+            break;
+          case OPS.nextLineShowText:
+            textState.carriageReturn();
+            bidiTexts.push(runBidi(buildTextGeometry(args[0])));
+            break;
+          case OPS.nextLineSetSpacingShowText:
+            textState.wordSpacing = args[0];
+            textState.charSpacing = args[1];
+            textState.carriageReturn();
+            bidiTexts.push(runBidi(buildTextGeometry(args[2])));
+            break;
+          case OPS.paintXObject:
+            if (args[0].code) {
+              break;
+            }
+
+            if (!xobjs) {
+              xobjs = (resources.get('XObject') || Dict.empty);
+            }
+
+            var name = args[0].name;
+            if (xobjsCache.key === name) {
+              if (xobjsCache.texts) {
+                Util.concatenateToArray(bidiTexts, xobjsCache.texts.items);
+                Util.extendObj(textContent.styles, xobjsCache.texts.styles);
+              }
+              break;
+            }
+
+            var xobj = xobjs.get(name);
+            if (!xobj) {
+              break;
+            }
+            assert(isStream(xobj), 'XObject should be a stream');
+
+            var type = xobj.dict.get('Subtype');
+            assert(isName(type),
+              'XObject should have a Name subtype');
+
+            if ('Form' !== type.name) {
+              xobjsCache.key = name;
+              xobjsCache.texts = null;
+              break;
+            }
+
+            stateManager.save();
+            var matrix = xobj.dict.get('Matrix');
+            if (isArray(matrix) && matrix.length === 6) {
+              stateManager.transform(matrix);
+            }
+
+            var formTextContent = this.getTextContent(
+              xobj,
+              xobj.dict.get('Resources') || resources,
+              stateManager
+            );
+            Util.concatenateToArray(bidiTexts, formTextContent.items);
+            Util.extendObj(textContent.styles, formTextContent.styles);
+            stateManager.restore();
+
+            xobjsCache.key = name;
+            xobjsCache.texts = formTextContent;
+            break;
+          case OPS.setGState:
+            var dictName = args[0];
+            var extGState = resources.get('ExtGState');
+
+            if (!isDict(extGState) || !extGState.has(dictName.name)) {
+              break;
+            }
+
+            var gsState = extGState.get(dictName.name);
+
+            for (var i = 0; i < gsState.length; i++) {
+              if (gsState[i] === 'Font') {
+                handleSetFont(args[0].name);
+              }
+            }
+            break;
+        } // switch
+      } // while
+
+      return textContent;
+    },
+
+    extractDataStructures: function
+      partialEvaluatorExtractDataStructures(dict, baseDict,
+                                            xref, properties) {
+      // 9.10.2
+      var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode'));
+      if (toUnicode) {
+        properties.toUnicode = this.readToUnicode(toUnicode, xref, properties);
+      }
+      if (properties.composite) {
+        // CIDSystemInfo helps to match CID to glyphs
+        var cidSystemInfo = dict.get('CIDSystemInfo');
+        if (isDict(cidSystemInfo)) {
+          properties.cidSystemInfo = {
+            registry: cidSystemInfo.get('Registry'),
+            ordering: cidSystemInfo.get('Ordering'),
+            supplement: cidSystemInfo.get('Supplement')
+          };
+        }
+
+        var cidToGidMap = dict.get('CIDToGIDMap');
+        if (isStream(cidToGidMap)) {
+          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
+        }
+      }
+
+      // Based on 9.6.6 of the spec the encoding can come from multiple places
+      // and depends on the font type. The base encoding and differences are
+      // read here, but the encoding that is actually used is chosen during
+      // glyph mapping in the font.
+      // TODO: Loading the built in encoding in the font would allow the
+      // differences to be merged in here not require us to hold on to it.
+      var differences = [];
+      var baseEncodingName = null;
+      var encoding;
+      if (dict.has('Encoding')) {
+        encoding = dict.get('Encoding');
+        if (isDict(encoding)) {
+          baseEncodingName = encoding.get('BaseEncoding');
+          baseEncodingName = (isName(baseEncodingName) ?
+                              baseEncodingName.name : null);
+          // Load the differences between the base and original
+          if (encoding.has('Differences')) {
+            var diffEncoding = encoding.get('Differences');
+            var index = 0;
+            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
+              var data = diffEncoding[j];
+              if (isNum(data)) {
+                index = data;
+              } else {
+                differences[index++] = data.name;
+              }
+            }
+          }
+        } else if (isName(encoding)) {
+          baseEncodingName = encoding.name;
+        } else {
+          error('Encoding is not a Name nor a Dict');
+        }
+        // According to table 114 if the encoding is a named encoding it must be
+        // one of these predefined encodings.
+        if ((baseEncodingName !== 'MacRomanEncoding' &&
+             baseEncodingName !== 'MacExpertEncoding' &&
+             baseEncodingName !== 'WinAnsiEncoding')) {
+          baseEncodingName = null;
+        }
+      }
+
+      if (baseEncodingName) {
+        properties.defaultEncoding = Encodings[baseEncodingName].slice();
+      } else {
+        encoding = (properties.type === 'TrueType' ?
+                    Encodings.WinAnsiEncoding : Encodings.StandardEncoding);
+        // The Symbolic attribute can be misused for regular fonts
+        // Heuristic: we have to check if the font is a standard one also
+        if (!!(properties.flags & FontFlags.Symbolic)) {
+          encoding = (!properties.file && /Symbol/i.test(properties.name) ?
+                      Encodings.SymbolSetEncoding :
+                      Encodings.MacRomanEncoding);
+        }
+        properties.defaultEncoding = encoding;
+      }
+
+      properties.differences = differences;
+      properties.baseEncodingName = baseEncodingName;
+      properties.dict = dict;
+    },
+
+    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {
+      var cmapObj = toUnicode;
+      if (isName(cmapObj)) {
+        return CMapFactory.create(cmapObj).map;
+      } else if (isStream(cmapObj)) {
+        var cmap = CMapFactory.create(cmapObj).map;
+        // Convert UTF-16BE
+        // NOTE: cmap can be a sparse array, so use forEach instead of for(;;)
+        // to iterate over all keys.
+        cmap.forEach(function(token, i) {
+          var str = [];
+          for (var k = 0; k < token.length; k += 2) {
+            var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
+            if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF
+              str.push(w1);
+              continue;
+            }
+            k += 2;
+            var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
+            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
+          }
+          cmap[i] = String.fromCharCode.apply(String, str);
+        });
+        return cmap;
+      }
+      return null;
+    },
+
+    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
+      // Extract the encoding from the CIDToGIDMap
+      var glyphsData = cidToGidStream.getBytes();
+
+      // Set encoding 0 to later verify the font has an encoding
+      var result = [];
+      for (var j = 0, jj = glyphsData.length; j < jj; j++) {
+        var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
+        if (glyphID === 0) {
+          continue;
+        }
+        var code = j >> 1;
+        result[code] = glyphID;
+      }
+      return result;
+    },
+
+    extractWidths: function PartialEvaluator_extractWidths(dict, xref,
+                                                           descriptor,
+                                                           properties) {
+      var glyphsWidths = [];
+      var defaultWidth = 0;
+      var glyphsVMetrics = [];
+      var defaultVMetrics;
+      var i, ii, j, jj, start, code, widths;
+      if (properties.composite) {
+        defaultWidth = dict.get('DW') || 1000;
+
+        widths = dict.get('W');
+        if (widths) {
+          for (i = 0, ii = widths.length; i < ii; i++) {
+            start = widths[i++];
+            code = xref.fetchIfRef(widths[i]);
+            if (isArray(code)) {
+              for (j = 0, jj = code.length; j < jj; j++) {
+                glyphsWidths[start++] = code[j];
+              }
+            } else {
+              var width = widths[++i];
+              for (j = start; j <= code; j++) {
+                glyphsWidths[j] = width;
+              }
+            }
+          }
+        }
+
+        if (properties.vertical) {
+          var vmetrics = (dict.get('DW2') || [880, -1000]);
+          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
+          vmetrics = dict.get('W2');
+          if (vmetrics) {
+            for (i = 0, ii = vmetrics.length; i < ii; i++) {
+              start = vmetrics[i++];
+              code = xref.fetchIfRef(vmetrics[i]);
+              if (isArray(code)) {
+                for (j = 0, jj = code.length; j < jj; j++) {
+                  glyphsVMetrics[start++] = [code[j++], code[j++], code[j]];
+                }
+              } else {
+                var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]];
+                for (j = start; j <= code; j++) {
+                  glyphsVMetrics[j] = vmetric;
+                }
+              }
+            }
+          }
+        }
+      } else {
+        var firstChar = properties.firstChar;
+        widths = dict.get('Widths');
+        if (widths) {
+          j = firstChar;
+          for (i = 0, ii = widths.length; i < ii; i++) {
+            glyphsWidths[j++] = widths[i];
+          }
+          defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0);
+        } else {
+          // Trying get the BaseFont metrics (see comment above).
+          var baseFontName = dict.get('BaseFont');
+          if (isName(baseFontName)) {
+            var metrics = this.getBaseFontMetrics(baseFontName.name);
+
+            glyphsWidths = this.buildCharCodeToWidth(metrics.widths,
+                                                     properties);
+            defaultWidth = metrics.defaultWidth;
+          }
+        }
+      }
+
+      // Heuristic: detection of monospace font by checking all non-zero widths
+      var isMonospace = true;
+      var firstWidth = defaultWidth;
+      for (var glyph in glyphsWidths) {
+        var glyphWidth = glyphsWidths[glyph];
+        if (!glyphWidth) {
+          continue;
+        }
+        if (!firstWidth) {
+          firstWidth = glyphWidth;
+          continue;
+        }
+        if (firstWidth != glyphWidth) {
+          isMonospace = false;
+          break;
+        }
+      }
+      if (isMonospace) {
+        properties.flags |= FontFlags.FixedPitch;
+      }
+
+      properties.defaultWidth = defaultWidth;
+      properties.widths = glyphsWidths;
+      properties.defaultVMetrics = defaultVMetrics;
+      properties.vmetrics = glyphsVMetrics;
+    },
+
+    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {
+      // Simulating descriptor flags attribute
+      var fontNameWoStyle = baseFontName.split('-')[0];
+      return (fontNameWoStyle in serifFonts) ||
+              (fontNameWoStyle.search(/serif/gi) !== -1);
+    },
+
+    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
+      var defaultWidth = 0;
+      var widths = [];
+      var monospace = false;
+      var lookupName = (stdFontMap[name] || name);
+
+      if (!(lookupName in Metrics)) {
+        // Use default fonts for looking up font metrics if the passed
+        // font is not a base font
+        if (this.isSerifFont(name)) {
+          lookupName = 'Times-Roman';
+        } else {
+          lookupName = 'Helvetica';
+        }
+      }
+      var glyphWidths = Metrics[lookupName];
+
+      if (isNum(glyphWidths)) {
+        defaultWidth = glyphWidths;
+        monospace = true;
+      } else {
+        widths = glyphWidths;
+      }
+
+      return {
+        defaultWidth: defaultWidth,
+        monospace: monospace,
+        widths: widths
+      };
+    },
+
+    buildCharCodeToWidth:
+        function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName,
+                                                        properties) {
+      var widths = Object.create(null);
+      var differences = properties.differences;
+      var encoding = properties.defaultEncoding;
+      for (var charCode = 0; charCode < 256; charCode++) {
+        if (charCode in differences &&
+            widthsByGlyphName[differences[charCode]]) {
+          widths[charCode] = widthsByGlyphName[differences[charCode]];
+          continue;
+        }
+        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
+          widths[charCode] = widthsByGlyphName[encoding[charCode]];
+          continue;
+        }
+      }
+      return widths;
+    },
+
+    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) {
+      var baseDict = dict;
+      var type = dict.get('Subtype');
+      assert(isName(type), 'invalid font Subtype');
+
+      var composite = false;
+      var uint8array;
+      if (type.name == 'Type0') {
+        // If font is a composite
+        //  - get the descendant font
+        //  - set the type according to the descendant font
+        //  - get the FontDescriptor from the descendant font
+        var df = dict.get('DescendantFonts');
+        if (!df) {
+          error('Descendant fonts are not specified');
+        }
+        dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df);
+
+        type = dict.get('Subtype');
+        assert(isName(type), 'invalid font Subtype');
+        composite = true;
+      }
+
+      var descriptor = dict.get('FontDescriptor');
+      if (descriptor) {
+        var hash = new MurmurHash3_64();
+        var encoding = baseDict.getRaw('Encoding');
+        if (isName(encoding)) {
+          hash.update(encoding.name);
+        } else if (isRef(encoding)) {
+          hash.update(encoding.num + '_' + encoding.gen);
+        }
+
+        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
+        if (isStream(toUnicode)) {
+          var stream = toUnicode.str || toUnicode;
+          uint8array = stream.buffer ?
+            new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) :
+            new Uint8Array(stream.bytes.buffer,
+                           stream.start, stream.end - stream.start);
+          hash.update(uint8array);
+
+        } else if (isName(toUnicode)) {
+          hash.update(toUnicode.name);
+        }
+
+        var widths = dict.get('Widths') || baseDict.get('Widths');
+        if (widths) {
+          uint8array = new Uint8Array(new Uint32Array(widths).buffer);
+          hash.update(uint8array);
+        }
+      }
+
+      return {
+        descriptor: descriptor,
+        dict: dict,
+        baseDict: baseDict,
+        composite: composite,
+        hash: hash ? hash.hexdigest() : ''
+      };
+    },
+
+    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont,
+                                                           xref) {
+      var baseDict = preEvaluatedFont.baseDict;
+      var dict = preEvaluatedFont.dict;
+      var composite = preEvaluatedFont.composite;
+      var descriptor = preEvaluatedFont.descriptor;
+      var type = dict.get('Subtype');
+      var maxCharIndex = (composite ? 0xFFFF : 0xFF);
+      var properties;
+
+      if (!descriptor) {
+        if (type.name == 'Type3') {
+          // FontDescriptor is only required for Type3 fonts when the document
+          // is a tagged pdf. Create a barbebones one to get by.
+          descriptor = new Dict(null);
+          descriptor.set('FontName', Name.get(type.name));
+        } else {
+          // Before PDF 1.5 if the font was one of the base 14 fonts, having a
+          // FontDescriptor was not required.
+          // This case is here for compatibility.
+          var baseFontName = dict.get('BaseFont');
+          if (!isName(baseFontName)) {
+            error('Base font is not specified');
+          }
+
+          // Using base font name as a font name.
+          baseFontName = baseFontName.name.replace(/[,_]/g, '-');
+          var metrics = this.getBaseFontMetrics(baseFontName);
+
+          // Simulating descriptor flags attribute
+          var fontNameWoStyle = baseFontName.split('-')[0];
+          var flags =
+            (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) |
+            (metrics.monospace ? FontFlags.FixedPitch : 0) |
+            (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
+                                             FontFlags.Nonsymbolic);
+
+          properties = {
+            type: type.name,
+            name: baseFontName,
+            widths: metrics.widths,
+            defaultWidth: metrics.defaultWidth,
+            flags: flags,
+            firstChar: 0,
+            lastChar: maxCharIndex
+          };
+          this.extractDataStructures(dict, dict, xref, properties);
+          properties.widths = this.buildCharCodeToWidth(metrics.widths,
+                                                        properties);
+          return new Font(baseFontName, null, properties);
+        }
+      }
+
+      // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
+      // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
+      // to ignore this rule when a variant of a standart font is used.
+      // TODO Fill the width array depending on which of the base font this is
+      // a variant.
+      var firstChar = (dict.get('FirstChar') || 0);
+      var lastChar = (dict.get('LastChar') || maxCharIndex);
+
+      var fontName = descriptor.get('FontName');
+      var baseFont = dict.get('BaseFont');
+      // Some bad PDFs have a string as the font name.
+      if (isString(fontName)) {
+        fontName = Name.get(fontName);
+      }
+      if (isString(baseFont)) {
+        baseFont = Name.get(baseFont);
+      }
+
+      if (type.name !== 'Type3') {
+        var fontNameStr = fontName && fontName.name;
+        var baseFontStr = baseFont && baseFont.name;
+        if (fontNameStr !== baseFontStr) {
+          info('The FontDescriptor\'s FontName is "' + fontNameStr +
+               '" but should be the same as the Font\'s BaseFont "' +
+               baseFontStr + '"');
+          // Workaround for cases where e.g. fontNameStr = 'Arial' and
+          // baseFontStr = 'Arial,Bold' (needed when no font file is embedded).
+          if (fontNameStr && baseFontStr &&
+              baseFontStr.search(fontNameStr) === 0) {
+            fontName = baseFont;
+          }
+        }
+      }
+      fontName = (fontName || baseFont);
+
+      assert(isName(fontName), 'invalid font name');
+
+      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
+      if (fontFile) {
+        if (fontFile.dict) {
+          var subtype = fontFile.dict.get('Subtype');
+          if (subtype) {
+            subtype = subtype.name;
+          }
+          var length1 = fontFile.dict.get('Length1');
+          var length2 = fontFile.dict.get('Length2');
+        }
+      }
+
+      properties = {
+        type: type.name,
+        name: fontName.name,
+        subtype: subtype,
+        file: fontFile,
+        length1: length1,
+        length2: length2,
+        loadedName: baseDict.loadedName,
+        composite: composite,
+        wideChars: composite,
+        fixedPitch: false,
+        fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX),
+        firstChar: firstChar || 0,
+        lastChar: (lastChar || maxCharIndex),
+        bbox: descriptor.get('FontBBox'),
+        ascent: descriptor.get('Ascent'),
+        descent: descriptor.get('Descent'),
+        xHeight: descriptor.get('XHeight'),
+        capHeight: descriptor.get('CapHeight'),
+        flags: descriptor.get('Flags'),
+        italicAngle: descriptor.get('ItalicAngle'),
+        coded: false
+      };
+
+      if (composite) {
+        var cidEncoding = baseDict.get('Encoding');
+        if (isName(cidEncoding)) {
+          properties.cidEncoding = cidEncoding.name;
+        }
+        properties.cMap = CMapFactory.create(cidEncoding,
+          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
+        properties.vertical = properties.cMap.vertical;
+      }
+      this.extractDataStructures(dict, baseDict, xref, properties);
+      this.extractWidths(dict, xref, descriptor, properties);
+
+      if (type.name === 'Type3') {
+        properties.coded = true;
+      }
+
+      return new Font(fontName.name, fontFile, properties);
+    }
+  };
+
+  return PartialEvaluator;
+})();
+
+var OperatorList = (function OperatorListClosure() {
+  var CHUNK_SIZE = 1000;
+  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size
+
+  function getTransfers(queue) {
+    var transfers = [];
+    var fnArray = queue.fnArray, argsArray = queue.argsArray;
+    for (var i = 0, ii = queue.length; i < ii; i++) {
+      switch (fnArray[i]) {
+        case OPS.paintInlineImageXObject:
+        case OPS.paintInlineImageXObjectGroup:
+        case OPS.paintImageMaskXObject:
+          var arg = argsArray[i][0]; // first param in imgData
+          if (!arg.cached) {
+            transfers.push(arg.data.buffer);
+          }
+          break;
+      }
+    }
+    return transfers;
+  }
+
+  function OperatorList(intent, messageHandler, pageIndex) {
+    this.messageHandler = messageHandler;
+    this.fnArray = [];
+    this.argsArray = [];
+    this.dependencies = {};
+    this.pageIndex = pageIndex;
+    this.intent = intent;
+  }
+
+  OperatorList.prototype = {
+    get length() {
+      return this.argsArray.length;
+    },
+
+    addOp: function(fn, args) {
+      this.fnArray.push(fn);
+      this.argsArray.push(args);
+      if (this.messageHandler) {
+        if (this.fnArray.length >= CHUNK_SIZE) {
+          this.flush();
+        } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT &&
+                   (fn === OPS.restore || fn === OPS.endText)) {
+          // heuristic to flush on boundary of restore or endText
+          this.flush();
+        }
+      }
+    },
+
+    addDependency: function(dependency) {
+      if (dependency in this.dependencies) {
+        return;
+      }
+      this.dependencies[dependency] = true;
+      this.addOp(OPS.dependency, [dependency]);
+    },
+
+    addDependencies: function(dependencies) {
+      for (var key in dependencies) {
+        this.addDependency(key);
+      }
+    },
+
+    addOpList: function(opList) {
+      Util.extendObj(this.dependencies, opList.dependencies);
+      for (var i = 0, ii = opList.length; i < ii; i++) {
+        this.addOp(opList.fnArray[i], opList.argsArray[i]);
+      }
+    },
+
+    getIR: function() {
+      return {
+        fnArray: this.fnArray,
+        argsArray: this.argsArray,
+        length: this.length
+      };
+    },
+
+    flush: function(lastChunk) {
+      new QueueOptimizer().optimize(this);
+      var transfers = getTransfers(this);
+      this.messageHandler.send('RenderPageChunk', {
+        operatorList: {
+          fnArray: this.fnArray,
+          argsArray: this.argsArray,
+          lastChunk: lastChunk,
+          length: this.length
+        },
+        pageIndex: this.pageIndex,
+        intent: this.intent
+      }, null, transfers);
+      this.dependencies = {};
+      this.fnArray.length = 0;
+      this.argsArray.length = 0;
+    }
+  };
+
+  return OperatorList;
+})();
+
+var StateManager = (function StateManagerClosure() {
+  function StateManager(initialState) {
+    this.state = initialState;
+    this.stateStack = [];
+  }
+  StateManager.prototype = {
+    save: function () {
+      var old = this.state;
+      this.stateStack.push(this.state);
+      this.state = old.clone();
+    },
+    restore: function () {
+      var prev = this.stateStack.pop();
+      if (prev) {
+        this.state = prev;
+      }
+    },
+    transform: function (args) {
+      this.state.ctm = Util.transform(this.state.ctm, args);
+    }
+  };
+  return StateManager;
+})();
+
+var TextState = (function TextStateClosure() {
+  function TextState() {
+    this.ctm = new Float32Array(IDENTITY_MATRIX);
+    this.fontSize = 0;
+    this.font = null;
+    this.fontMatrix = FONT_IDENTITY_MATRIX;
+    this.textMatrix = IDENTITY_MATRIX.slice();
+    this.textLineMatrix = IDENTITY_MATRIX.slice();
+    this.charSpacing = 0;
+    this.wordSpacing = 0;
+    this.leading = 0;
+    this.textHScale = 1;
+    this.textRise = 0;
+  }
+
+  TextState.prototype = {
+    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
+      var m = this.textMatrix;
+      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
+    },
+    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
+      var m = this.textLineMatrix;
+      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
+    },
+    translateTextMatrix: function TextState_translateTextMatrix(x, y) {
+      var m = this.textMatrix;
+      m[4] = m[0] * x + m[2] * y + m[4];
+      m[5] = m[1] * x + m[3] * y + m[5];
+    },
+    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {
+      var m = this.textLineMatrix;
+      m[4] = m[0] * x + m[2] * y + m[4];
+      m[5] = m[1] * x + m[3] * y + m[5];
+    },
+    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
+      // 9.4.4 Text Space Details
+      var tsm = [this.fontSize * this.textHScale, 0,
+                0, this.fontSize,
+                0, this.textRise];
+      return Util.transform(ctm, Util.transform(this.textMatrix, tsm));
+    },
+    carriageReturn: function TextState_carriageReturn() {
+      this.translateTextLineMatrix(0, -this.leading);
+      this.textMatrix = this.textLineMatrix.slice();
+    },
+    clone: function TextState_clone() {
+      var clone = Object.create(this);
+      clone.textMatrix = this.textMatrix.slice();
+      clone.textLineMatrix = this.textLineMatrix.slice();
+      clone.fontMatrix = this.fontMatrix.slice();
+      return clone;
+    }
+  };
+  return TextState;
+})();
+
+var EvalState = (function EvalStateClosure() {
+  function EvalState() {
+    this.ctm = new Float32Array(IDENTITY_MATRIX);
+    this.font = null;
+    this.textRenderingMode = TextRenderingMode.FILL;
+  }
+  EvalState.prototype = {
+    clone: function CanvasExtraState_clone() {
+      return Object.create(this);
+    },
+  };
+  return EvalState;
+})();
+
+var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
+  // Specifies properties for each command
+  //
+  // If variableArgs === true: [0, `numArgs`] expected
+  // If variableArgs === false: exactly `numArgs` expected
+  var OP_MAP = {
+    // Graphic state
+    w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false },
+    J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false },
+    j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false },
+    M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false },
+    d: { id: OPS.setDash, numArgs: 2, variableArgs: false },
+    ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false },
+    i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false },
+    gs: { id: OPS.setGState, numArgs: 1, variableArgs: false },
+    q: { id: OPS.save, numArgs: 0, variableArgs: false },
+    Q: { id: OPS.restore, numArgs: 0, variableArgs: false },
+    cm: { id: OPS.transform, numArgs: 6, variableArgs: false },
+
+    // Path
+    m: { id: OPS.moveTo, numArgs: 2, variableArgs: false },
+    l: { id: OPS.lineTo, numArgs: 2, variableArgs: false },
+    c: { id: OPS.curveTo, numArgs: 6, variableArgs: false },
+    v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false },
+    y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false },
+    h: { id: OPS.closePath, numArgs: 0, variableArgs: false },
+    re: { id: OPS.rectangle, numArgs: 4, variableArgs: false },
+    S: { id: OPS.stroke, numArgs: 0, variableArgs: false },
+    s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false },
+    f: { id: OPS.fill, numArgs: 0, variableArgs: false },
+    F: { id: OPS.fill, numArgs: 0, variableArgs: false },
+    'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false },
+    B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false },
+    'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false },
+    b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false },
+    'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false },
+    n: { id: OPS.endPath, numArgs: 0, variableArgs: false },
+
+    // Clipping
+    W: { id: OPS.clip, numArgs: 0, variableArgs: false },
+    'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false },
+
+    // Text
+    BT: { id: OPS.beginText, numArgs: 0, variableArgs: false },
+    ET: { id: OPS.endText, numArgs: 0, variableArgs: false },
+    Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false },
+    Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false },
+    Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false },
+    TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false },
+    Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false },
+    Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false },
+    Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false },
+    Td: { id: OPS.moveText, numArgs: 2, variableArgs: false },
+    TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false },
+    Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false },
+    'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false },
+    Tj: { id: OPS.showText, numArgs: 1, variableArgs: false },
+    TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false },
+    '\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false },
+    '"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3,
+           variableArgs: false },
+
+    // Type3 fonts
+    d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false },
+    d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false },
+
+    // Color
+    CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false },
+    cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false },
+    SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true },
+    SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true },
+    sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true },
+    scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true },
+    G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false },
+    g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false },
+    RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false },
+    rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false },
+    K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false },
+    k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false },
+
+    // Shading
+    sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false },
+
+    // Images
+    BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false },
+    ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false },
+    EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false },
+
+    // XObjects
+    Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false },
+    MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false },
+    DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false },
+    BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false },
+    BDC: { id: OPS.beginMarkedContentProps, numArgs: 2,
+           variableArgs: false },
+    EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false },
+
+    // Compatibility
+    BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false },
+    EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false },
+
+    // (reserved partial commands for the lexer)
+    BM: null,
+    BD: null,
+    'true': null,
+    fa: null,
+    fal: null,
+    fals: null,
+    'false': null,
+    nu: null,
+    nul: null,
+    'null': null
+  };
+
+  function EvaluatorPreprocessor(stream, xref, stateManager) {
+    // TODO(mduan): pass array of knownCommands rather than OP_MAP
+    // dictionary
+    this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref);
+    this.stateManager = stateManager;
+  }
+
+  EvaluatorPreprocessor.prototype = {
+    get savedStatesDepth() {
+      return this.stateManager.stateStack.length;
+    },
+
+    read: function EvaluatorPreprocessor_read() {
+      var args = [];
+      while (true) {
+        var obj = this.parser.getObj();
+        if (isEOF(obj)) {
+          return null; // no more commands
+        }
+        if (!isCmd(obj)) {
+          // argument
+          if (obj !== null && obj !== undefined) {
+            args.push((obj instanceof Dict ? obj.getAll() : obj));
+            assert(args.length <= 33, 'Too many arguments');
+          }
+          continue;
+        }
+
+        var cmd = obj.cmd;
+        // Check that the command is valid
+        var opSpec = OP_MAP[cmd];
+        if (!opSpec) {
+          warn('Unknown command "' + cmd + '"');
+          continue;
+        }
+
+        var fn = opSpec.id;
+
+        // Validate the number of arguments for the command
+        if (opSpec.variableArgs) {
+          if (args.length > opSpec.numArgs) {
+            info('Command ' + fn + ': expected [0,' + opSpec.numArgs +
+                 '] args, but received ' + args.length + ' args');
+          }
+        } else {
+          if (args.length < opSpec.numArgs) {
+            // If we receive too few args, it's not possible to possible
+            // to execute the command, so skip the command
+            info('Command ' + fn + ': because expected ' +
+                 opSpec.numArgs + ' args, but received ' + args.length +
+                 ' args; skipping');
+            args = [];
+            continue;
+          } else if (args.length > opSpec.numArgs) {
+            info('Command ' + fn + ': expected ' + opSpec.numArgs +
+                 ' args, but received ' + args.length + ' args');
+          }
+        }
+
+        // TODO figure out how to type-check vararg functions
+        this.preprocessCommand(fn, args);
+
+        return { fn: fn, args: args };
+      }
+    },
+
+    preprocessCommand:
+        function EvaluatorPreprocessor_preprocessCommand(fn, args) {
+      switch (fn | 0) {
+        case OPS.save:
+          this.stateManager.save();
+          break;
+        case OPS.restore:
+          this.stateManager.restore();
+          break;
+        case OPS.transform:
+          this.stateManager.transform(args);
+          break;
+      }
+    }
+  };
+  return EvaluatorPreprocessor;
+})();
+
+var QueueOptimizer = (function QueueOptimizerClosure() {
+  function addState(parentState, pattern, fn) {
+    var state = parentState;
+    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
+      var item = pattern[i];
+      state = (state[item] || (state[item] = []));
+    }
+    state[pattern[pattern.length - 1]] = fn;
+  }
+
+  function handlePaintSolidColorImageMask(index, count, fnArray, argsArray) {
+    // Handles special case of mainly LaTeX documents which
+    // use image masks to draw lines with the current fill style.
+    // 'count' groups of (save, transform, paintImageMaskXObject, restore)+
+    // have been found at index.
+    for (var i = 0; i < count; i++) {
+      var arg = argsArray[index + 4 * i + 2];
+      var imageMask = arg.length == 1 && arg[0];
+      if (imageMask && imageMask.width == 1 && imageMask.height == 1 &&
+          (!imageMask.data.length || (imageMask.data.length == 1 &&
+                                      imageMask.data[0] === 0))) {
+        fnArray[index + 4 * i + 2] = OPS.paintSolidColorImageMask;
+        continue;
+      }
+      break;
+    }
+    return count - i;
+  }
+
+  var InitialState = [];
+
+  addState(InitialState,
+    [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],
+    function foundInlineImageGroup(context) {
+      // grouping paintInlineImageXObject's into paintInlineImageXObjectGroup
+      // searching for (save, transform, paintInlineImageXObject, restore)+
+      var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
+      var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
+      var MAX_WIDTH = 1000;
+      var IMAGE_PADDING = 1;
+
+      var fnArray = context.fnArray, argsArray = context.argsArray;
+      var j = context.currentOperation - 3, i = j + 4;
+      var ii = fnArray.length;
+
+      for (; i < ii && fnArray[i - 4] === fnArray[i]; i++) {}
+      var count = Math.min((i - j) >> 2, MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
+      if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
+        context.currentOperation = i - 1;
+        return;
+      }
+      // assuming that heights of those image is too small (~1 pixel)
+      // packing as much as possible by lines
+      var maxX = 0;
+      var map = [], maxLineHeight = 0;
+      var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING;
+      var q;
+      for (q = 0; q < count; q++) {
+        var transform = argsArray[j + (q << 2) + 1];
+        var img = argsArray[j + (q << 2) + 2][0];
+        if (currentX + img.width > MAX_WIDTH) {
+          // starting new line
+          maxX = Math.max(maxX, currentX);
+          currentY += maxLineHeight + 2 * IMAGE_PADDING;
+          currentX = 0;
+          maxLineHeight = 0;
+        }
+        map.push({
+          transform: transform,
+          x: currentX, y: currentY,
+          w: img.width, h: img.height
+        });
+        currentX += img.width + 2 * IMAGE_PADDING;
+        maxLineHeight = Math.max(maxLineHeight, img.height);
+      }
+      var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
+      var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
+      var imgData = new Uint8Array(imgWidth * imgHeight * 4);
+      var imgRowSize = imgWidth << 2;
+      for (q = 0; q < count; q++) {
+        var data = argsArray[j + (q << 2) + 2][0].data;
+        // copy image by lines and extends pixels into padding
+        var rowSize = map[q].w << 2;
+        var dataOffset = 0;
+        var offset = (map[q].x + map[q].y * imgWidth) << 2;
+        imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
+        for (var k = 0, kk = map[q].h; k < kk; k++) {
+          imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
+          dataOffset += rowSize;
+          offset += imgRowSize;
+        }
+        imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
+        while (offset >= 0) {
+          data[offset - 4] = data[offset];
+          data[offset - 3] = data[offset + 1];
+          data[offset - 2] = data[offset + 2];
+          data[offset - 1] = data[offset + 3];
+          data[offset + rowSize] = data[offset + rowSize - 4];
+          data[offset + rowSize + 1] = data[offset + rowSize - 3];
+          data[offset + rowSize + 2] = data[offset + rowSize - 2];
+          data[offset + rowSize + 3] = data[offset + rowSize - 1];
+          offset -= imgRowSize;
+        }
+      }
+      // replacing queue items
+      fnArray.splice(j, count * 4, OPS.paintInlineImageXObjectGroup);
+      argsArray.splice(j, count * 4,
+        [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,
+           data: imgData }, map]);
+      context.currentOperation = j;
+    });
+
+  addState(InitialState,
+    [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],
+    function foundImageMaskGroup(context) {
+      // grouping paintImageMaskXObject's into paintImageMaskXObjectGroup
+      // searching for (save, transform, paintImageMaskXObject, restore)+
+      var MIN_IMAGES_IN_MASKS_BLOCK = 10;
+      var MAX_IMAGES_IN_MASKS_BLOCK = 100;
+      var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
+
+      var fnArray = context.fnArray, argsArray = context.argsArray;
+      var j = context.currentOperation - 3, i = j + 4;
+      var ii = fnArray.length, q;
+
+      for (; i < ii && fnArray[i - 4] === fnArray[i]; i++) {}
+      var count = (i - j) >> 2;
+      count = handlePaintSolidColorImageMask(j, count, fnArray, argsArray);
+      if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
+        context.currentOperation = i - 1;
+        return;
+      }
+
+      var isSameImage = false;
+      var transformArgs;
+      if (argsArray[j + 1][1] === 0 && argsArray[j + 1][2] === 0) {
+        i = j + 4;
+        isSameImage = true;
+        for (q = 1; q < count; q++, i += 4) {
+          var prevTransformArgs = argsArray[i - 3];
+          transformArgs = argsArray[i + 1];
+          if (argsArray[i - 2][0] !== argsArray[i + 2][0] ||
+              prevTransformArgs[0] !== transformArgs[0] ||
+              prevTransformArgs[1] !== transformArgs[1] ||
+              prevTransformArgs[2] !== transformArgs[2] ||
+              prevTransformArgs[3] !== transformArgs[3]) {
+            if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
+              isSameImage = false;
+            } else {
+              count = q;
+            }
+            break; // different image or transform
+          }
+        }
+      }
+
+      if (isSameImage) {
+        count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
+        var positions = new Float32Array(count * 2);
+        i = j + 1;
+        for (q = 0; q < count; q++) {
+          transformArgs = argsArray[i];
+          positions[(q << 1)] = transformArgs[4];
+          positions[(q << 1) + 1] = transformArgs[5];
+          i += 4;
+        }
+
+        // replacing queue items
+        fnArray.splice(j, count * 4, OPS.paintImageMaskXObjectRepeat);
+        argsArray.splice(j, count * 4, [argsArray[j + 2][0],
+                         argsArray[j + 1][0], argsArray[j + 1][3], positions]);
+
+        context.currentOperation = j;
+      } else {
+        count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
+        var images = [];
+        for (q = 0; q < count; q++) {
+          transformArgs = argsArray[j + (q << 2) + 1];
+          var maskParams = argsArray[j + (q << 2) + 2][0];
+          images.push({ data: maskParams.data, width: maskParams.width,
+                        height: maskParams.height,
+                        transform: transformArgs });
+        }
+
+        // replacing queue items
+        fnArray.splice(j, count * 4, OPS.paintImageMaskXObjectGroup);
+        argsArray.splice(j, count * 4, [images]);
+
+        context.currentOperation = j;
+      }
+    });
+
+  addState(InitialState,
+    [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],
+    function (context) {
+      var MIN_IMAGES_IN_BLOCK = 3;
+      var MAX_IMAGES_IN_BLOCK = 1000;
+
+      var fnArray = context.fnArray, argsArray = context.argsArray;
+      var j = context.currentOperation - 3, i = j + 4;
+      if (argsArray[j + 1][1] !== 0 || argsArray[j + 1][2] !== 0) {
+        return;
+      }
+      var ii = fnArray.length;
+      var transformArgs;
+      for (; i + 3 < ii && fnArray[i - 4] === fnArray[i]; i += 4) {
+        if (fnArray[i - 3] !== fnArray[i + 1] ||
+            fnArray[i - 2] !== fnArray[i + 2] ||
+            fnArray[i - 1] !== fnArray[i + 3]) {
+          break;
+        }
+        if (argsArray[i - 2][0] !== argsArray[i + 2][0]) {
+          break; // different image
+        }
+        var prevTransformArgs = argsArray[i - 3];
+        transformArgs = argsArray[i + 1];
+        if (prevTransformArgs[0] !== transformArgs[0] ||
+            prevTransformArgs[1] !== transformArgs[1] ||
+            prevTransformArgs[2] !== transformArgs[2] ||
+            prevTransformArgs[3] !== transformArgs[3]) {
+          break; // different transform
+        }
+      }
+      var count = Math.min((i - j) >> 2, MAX_IMAGES_IN_BLOCK);
+      if (count < MIN_IMAGES_IN_BLOCK) {
+        context.currentOperation = i - 1;
+        return;
+      }
+
+      var positions = new Float32Array(count * 2);
+      i = j + 1;
+      for (var q = 0; q < count; q++) {
+        transformArgs = argsArray[i];
+        positions[(q << 1)] = transformArgs[4];
+        positions[(q << 1) + 1] = transformArgs[5];
+        i += 4;
+      }
+      var args = [argsArray[j + 2][0], argsArray[j + 1][0],
+                  argsArray[j + 1][3], positions];
+      // replacing queue items
+      fnArray.splice(j, count * 4, OPS.paintImageXObjectRepeat);
+      argsArray.splice(j, count * 4, args);
+
+      context.currentOperation = j;
+    });
+
+  addState(InitialState,
+    [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],
+    function (context) {
+      // moving single chars with same font into beginText/endText groups
+      // searching for (beginText, setFont, setTextMatrix, showText, endText)+
+      var MIN_CHARS_IN_BLOCK = 3;
+      var MAX_CHARS_IN_BLOCK = 1000;
+
+      var fnArray = context.fnArray, argsArray = context.argsArray;
+      var j = context.currentOperation - 4, i = j + 5;
+      var ii = fnArray.length;
+
+      for (; i < ii && fnArray[i - 5] === fnArray[i]; i++) {
+        if (fnArray[i] === OPS.setFont) {
+          if (argsArray[i - 5][0] !== argsArray[i][0] ||
+              argsArray[i - 5][1] !== argsArray[i][1]) {
+            break;
+          }
+        }
+      }
+      var count = Math.min(((i - j) / 5) | 0, MAX_CHARS_IN_BLOCK);
+      if (count < MIN_CHARS_IN_BLOCK) {
+        context.currentOperation = i - 1;
+        return;
+      }
+      if (j >= 4 && fnArray[j - 4] === fnArray[j + 1] &&
+          fnArray[j - 3] === fnArray[j + 2] &&
+          fnArray[j - 2] === fnArray[j + 3] &&
+          fnArray[j - 1] === fnArray[j + 4] &&
+          argsArray[j - 4][0] === argsArray[j + 1][0] &&
+          argsArray[j - 4][1] === argsArray[j + 1][1]) {
+        // extending one block ahead (very first block might have 'dependency')
+        count++;
+        j -= 5;
+      }
+      var k = j + 7;
+      i = j + 4;
+      for (var q = 1; q < count; q++) {
+        fnArray[i] = fnArray[k];
+        argsArray[i] = argsArray[k];
+        fnArray[i + 1] = fnArray[k + 1];
+        argsArray[i + 1] = argsArray[k + 1];
+        i += 2;
+        k += 5;
+      }
+      var removed = (count - 1) * 3;
+      fnArray.splice(i, removed);
+      argsArray.splice(i, removed);
+
+      context.currentOperation = i;
+    });
+
+  function QueueOptimizer() {}
+
+  QueueOptimizer.prototype = {
+    optimize: function QueueOptimizer_optimize(queue) {
+      var fnArray = queue.fnArray, argsArray = queue.argsArray;
+      var context = {
+        currentOperation: 0,
+        fnArray: fnArray,
+        argsArray: argsArray
+      };
+      var i, ii = argsArray.length;
+      var state;
+      for (i = 0; i < ii; i++) {
+        state = (state || InitialState)[fnArray[i]];
+        if (typeof state === 'function') { // we found some handler
+          context.currentOperation = i;
+          state = state(context);
+          i = context.currentOperation;
+          ii = context.fnArray.length;
+        }
+      }
+    }
+  };
+  return QueueOptimizer;
+})();
+
+
+var BUILT_IN_CMAPS = [
+// << Start unicode maps.
+'Adobe-GB1-UCS2',
+'Adobe-CNS1-UCS2',
+'Adobe-Japan1-UCS2',
+'Adobe-Korea1-UCS2',
+// >> End unicode maps.
+'78-EUC-H',
+'78-EUC-V',
+'78-H',
+'78-RKSJ-H',
+'78-RKSJ-V',
+'78-V',
+'78ms-RKSJ-H',
+'78ms-RKSJ-V',
+'83pv-RKSJ-H',
+'90ms-RKSJ-H',
+'90ms-RKSJ-V',
+'90msp-RKSJ-H',
+'90msp-RKSJ-V',
+'90pv-RKSJ-H',
+'90pv-RKSJ-V',
+'Add-H',
+'Add-RKSJ-H',
+'Add-RKSJ-V',
+'Add-V',
+'Adobe-CNS1-0',
+'Adobe-CNS1-1',
+'Adobe-CNS1-2',
+'Adobe-CNS1-3',
+'Adobe-CNS1-4',
+'Adobe-CNS1-5',
+'Adobe-CNS1-6',
+'Adobe-GB1-0',
+'Adobe-GB1-1',
+'Adobe-GB1-2',
+'Adobe-GB1-3',
+'Adobe-GB1-4',
+'Adobe-GB1-5',
+'Adobe-Japan1-0',
+'Adobe-Japan1-1',
+'Adobe-Japan1-2',
+'Adobe-Japan1-3',
+'Adobe-Japan1-4',
+'Adobe-Japan1-5',
+'Adobe-Japan1-6',
+'Adobe-Korea1-0',
+'Adobe-Korea1-1',
+'Adobe-Korea1-2',
+'B5-H',
+'B5-V',
+'B5pc-H',
+'B5pc-V',
+'CNS-EUC-H',
+'CNS-EUC-V',
+'CNS1-H',
+'CNS1-V',
+'CNS2-H',
+'CNS2-V',
+'ETHK-B5-H',
+'ETHK-B5-V',
+'ETen-B5-H',
+'ETen-B5-V',
+'ETenms-B5-H',
+'ETenms-B5-V',
+'EUC-H',
+'EUC-V',
+'Ext-H',
+'Ext-RKSJ-H',
+'Ext-RKSJ-V',
+'Ext-V',
+'GB-EUC-H',
+'GB-EUC-V',
+'GB-H',
+'GB-V',
+'GBK-EUC-H',
+'GBK-EUC-V',
+'GBK2K-H',
+'GBK2K-V',
+'GBKp-EUC-H',
+'GBKp-EUC-V',
+'GBT-EUC-H',
+'GBT-EUC-V',
+'GBT-H',
+'GBT-V',
+'GBTpc-EUC-H',
+'GBTpc-EUC-V',
+'GBpc-EUC-H',
+'GBpc-EUC-V',
+'H',
+'HKdla-B5-H',
+'HKdla-B5-V',
+'HKdlb-B5-H',
+'HKdlb-B5-V',
+'HKgccs-B5-H',
+'HKgccs-B5-V',
+'HKm314-B5-H',
+'HKm314-B5-V',
+'HKm471-B5-H',
+'HKm471-B5-V',
+'HKscs-B5-H',
+'HKscs-B5-V',
+'Hankaku',
+'Hiragana',
+'KSC-EUC-H',
+'KSC-EUC-V',
+'KSC-H',
+'KSC-Johab-H',
+'KSC-Johab-V',
+'KSC-V',
+'KSCms-UHC-H',
+'KSCms-UHC-HW-H',
+'KSCms-UHC-HW-V',
+'KSCms-UHC-V',
+'KSCpc-EUC-H',
+'KSCpc-EUC-V',
+'Katakana',
+'NWP-H',
+'NWP-V',
+'RKSJ-H',
+'RKSJ-V',
+'Roman',
+'UniCNS-UCS2-H',
+'UniCNS-UCS2-V',
+'UniCNS-UTF16-H',
+'UniCNS-UTF16-V',
+'UniCNS-UTF32-H',
+'UniCNS-UTF32-V',
+'UniCNS-UTF8-H',
+'UniCNS-UTF8-V',
+'UniGB-UCS2-H',
+'UniGB-UCS2-V',
+'UniGB-UTF16-H',
+'UniGB-UTF16-V',
+'UniGB-UTF32-H',
+'UniGB-UTF32-V',
+'UniGB-UTF8-H',
+'UniGB-UTF8-V',
+'UniJIS-UCS2-H',
+'UniJIS-UCS2-HW-H',
+'UniJIS-UCS2-HW-V',
+'UniJIS-UCS2-V',
+'UniJIS-UTF16-H',
+'UniJIS-UTF16-V',
+'UniJIS-UTF32-H',
+'UniJIS-UTF32-V',
+'UniJIS-UTF8-H',
+'UniJIS-UTF8-V',
+'UniJIS2004-UTF16-H',
+'UniJIS2004-UTF16-V',
+'UniJIS2004-UTF32-H',
+'UniJIS2004-UTF32-V',
+'UniJIS2004-UTF8-H',
+'UniJIS2004-UTF8-V',
+'UniJISPro-UCS2-HW-V',
+'UniJISPro-UCS2-V',
+'UniJISPro-UTF8-V',
+'UniJISX0213-UTF32-H',
+'UniJISX0213-UTF32-V',
+'UniJISX02132004-UTF32-H',
+'UniJISX02132004-UTF32-V',
+'UniKS-UCS2-H',
+'UniKS-UCS2-V',
+'UniKS-UTF16-H',
+'UniKS-UTF16-V',
+'UniKS-UTF32-H',
+'UniKS-UTF32-V',
+'UniKS-UTF8-H',
+'UniKS-UTF8-V',
+'V',
+'WP-Symbol'];
+
+// CMap, not to be confused with TrueType's cmap.
+var CMap = (function CMapClosure() {
+  function CMap(builtInCMap) {
+    // Codespace ranges are stored as follows:
+    // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]]
+    // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...]
+    this.codespaceRanges = [[], [], [], []];
+    this.numCodespaceRanges = 0;
+    this.map = [];
+    this.vertical = false;
+    this.useCMap = null;
+    this.builtInCMap = builtInCMap;
+  }
+  CMap.prototype = {
+    addCodespaceRange: function(n, low, high) {
+      this.codespaceRanges[n - 1].push(low, high);
+      this.numCodespaceRanges++;
+    },
+
+    mapRange: function(low, high, dstLow) {
+      var lastByte = dstLow.length - 1;
+      while (low <= high) {
+        this.map[low] = dstLow;
+        // Only the last byte has to be incremented.
+        dstLow = dstLow.substr(0, lastByte) +
+                 String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);
+        ++low;
+      }
+    },
+
+    mapRangeToArray: function(low, high, array) {
+      var i = 0;
+      while (low <= high) {
+        this.map[low] = array[i++];
+        ++low;
+      }
+    },
+
+    mapOne: function(src, dst) {
+      this.map[src] = dst;
+    },
+
+    lookup: function(code) {
+      return this.map[code];
+    },
+
+    readCharCode: function(str, offset) {
+      var c = 0;
+      var codespaceRanges = this.codespaceRanges;
+      var codespaceRangesLen = this.codespaceRanges.length;
+      // 9.7.6.2 CMap Mapping
+      // The code length is at most 4.
+      for (var n = 0; n < codespaceRangesLen; n++) {
+        c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0;
+        // Check each codespace range to see if it falls within.
+        var codespaceRange = codespaceRanges[n];
+        for (var k = 0, kk = codespaceRange.length; k < kk;) {
+          var low = codespaceRange[k++];
+          var high = codespaceRange[k++];
+          if (c >= low && c <= high) {
+            return [c, n + 1];
+          }
+        }
+      }
+
+      return [0, 1];
+    }
+
+  };
+  return CMap;
+})();
+
+var IdentityCMap = (function IdentityCMapClosure() {
+  function IdentityCMap(vertical, n) {
+    CMap.call(this);
+    this.vertical = vertical;
+    this.addCodespaceRange(n, 0, 0xffff);
+    this.mapRange(0, 0xffff, '\u0000');
+  }
+  Util.inherit(IdentityCMap, CMap, {});
+
+  return IdentityCMap;
+})();
+
+var BinaryCMapReader = (function BinaryCMapReaderClosure() {
+  function fetchBinaryData(url) {
+    var nonBinaryRequest = PDFJS.disableWorker;
+    var request = new XMLHttpRequest();
+    request.open('GET', url, false);
+    if (!nonBinaryRequest) {
+      try {
+        request.responseType = 'arraybuffer';
+        nonBinaryRequest = request.responseType !== 'arraybuffer';
+      } catch (e) {
+        nonBinaryRequest = true;
+      }
+    }
+    if (nonBinaryRequest && request.overrideMimeType) {
+      request.overrideMimeType('text/plain; charset=x-user-defined');
+    }
+    request.send(null);
+    if (request.status === 0 && /^https?:/i.test(url)) {
+      error('Unable to get binary cMap at: ' + url);
+    }
+    if (nonBinaryRequest) {
+      var data = Array.prototype.map.call(request.responseText, function (ch) {
+        return ch.charCodeAt(0) & 255;
+      });
+      return new Uint8Array(data);
+    }
+    return new Uint8Array(request.response);
+  }
+
+  function hexToInt(a, size) {
+    var n = 0;
+    for (var i = 0; i <= size; i++) {
+      n = (n << 8) | a[i];
+    }
+    return n >>> 0;
+  }
+
+  function hexToStr(a, size) {
+    return String.fromCharCode.apply(null, a.subarray(0, size + 1));
+  }
+
+  function addHex(a, b, size) {
+    var c = 0;
+    for (var i = size; i >= 0; i--) {
+      c += a[i] + b[i];
+      a[i] = c & 255;
+      c >>= 8;
+    }
+  }
+
+  function incHex(a, size) {
+    var c = 1;
+    for (var i = size; i >= 0 && c > 0; i--) {
+      c += a[i];
+      a[i] = c & 255;
+      c >>= 8;
+    }
+  }
+
+  var MAX_NUM_SIZE = 16;
+  var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8)
+
+  function BinaryCMapStream(data) {
+    this.buffer = data;
+    this.pos = 0;
+    this.end = data.length;
+    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
+  }
+
+  BinaryCMapStream.prototype = {
+    readByte: function () {
+      if (this.pos >= this.end) {
+        return -1;
+      }
+      return this.buffer[this.pos++];
+    },
+    readNumber: function () {
+      var n = 0;
+      var last;
+      do {
+        var b = this.readByte();
+        if (b < 0) {
+          error('unexpected EOF in bcmap');
+        }
+        last = !(b & 0x80);
+        n = (n << 7) | (b & 0x7F);
+      } while (!last);
+      return n;
+    },
+    readSigned: function () {
+      var n = this.readNumber();
+      return (n & 1) ? ~(n >>> 1) : n >>> 1;
+    },
+    readHex: function (num, size) {
+      num.set(this.buffer.subarray(this.pos,
+        this.pos + size + 1));
+      this.pos += size + 1;
+    },
+    readHexNumber: function (num, size) {
+      var last;
+      var stack = this.tmpBuf, sp = 0;
+      do {
+        var b = this.readByte();
+        if (b < 0) {
+          error('unexpected EOF in bcmap');
+        }
+        last = !(b & 0x80);
+        stack[sp++] = b & 0x7F;
+      } while (!last);
+      var i = size, buffer = 0, bufferSize = 0;
+      while (i >= 0) {
+        while (bufferSize < 8 && stack.length > 0) {
+          buffer = (stack[--sp] << bufferSize) | buffer;
+          bufferSize += 7;
+        }
+        num[i] = buffer & 255;
+        i--;
+        buffer >>= 8;
+        bufferSize -= 8;
+      }
+    },
+    readHexSigned: function (num, size) {
+      this.readHexNumber(num, size);
+      var sign = num[size] & 1 ? 255 : 0;
+      var c = 0;
+      for (var i = 0; i <= size; i++) {
+        c = ((c & 1) << 8) | num[i];
+        num[i] = (c >> 1) ^ sign;
+      }
+    },
+    readString: function () {
+      var len = this.readNumber();
+      var s = '';
+      for (var i = 0; i < len; i++) {
+        s += String.fromCharCode(this.readNumber());
+      }
+      return s;
+    }
+  };
+
+  function processBinaryCMap(url, cMap, extend) {
+    var data = fetchBinaryData(url);
+    var stream = new BinaryCMapStream(data);
+
+    var header = stream.readByte();
+    cMap.vertical = !!(header & 1);
+
+    var useCMap = null;
+    var start = new Uint8Array(MAX_NUM_SIZE);
+    var end = new Uint8Array(MAX_NUM_SIZE);
+    var char = new Uint8Array(MAX_NUM_SIZE);
+    var charCode = new Uint8Array(MAX_NUM_SIZE);
+    var tmp = new Uint8Array(MAX_NUM_SIZE);
+    var code;
+
+    var b;
+    while ((b = stream.readByte()) >= 0) {
+      var type = b >> 5;
+      if (type === 7) { // metadata, e.g. comment or usecmap
+        switch (b & 0x1F) {
+          case 0:
+            stream.readString(); // skipping comment
+            break;
+          case 1:
+            useCMap = stream.readString();
+            break;
+        }
+        continue;
+      }
+      var sequence = !!(b & 0x10);
+      var dataSize = b & 15;
+
+      assert(dataSize + 1 <= MAX_NUM_SIZE);
+
+      var ucs2DataSize = 1;
+      var subitemsCount = stream.readNumber();
+      var i;
+      switch (type) {
+        case 0: // codespacerange
+          stream.readHex(start, dataSize);
+          stream.readHexNumber(end, dataSize);
+          addHex(end, start, dataSize);
+          cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),
+                                 hexToInt(end, dataSize));
+          for (i = 1; i < subitemsCount; i++) {
+            incHex(end, dataSize);
+            stream.readHexNumber(start, dataSize);
+            addHex(start, end, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),
+                                   hexToInt(end, dataSize));
+          }
+          break;
+        case 1: // notdefrange
+          stream.readHex(start, dataSize);
+          stream.readHexNumber(end, dataSize);
+          addHex(end, start, dataSize);
+          code = stream.readNumber();
+          // undefined range, skipping
+          for (i = 1; i < subitemsCount; i++) {
+            incHex(end, dataSize);
+            stream.readHexNumber(start, dataSize);
+            addHex(start, end, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            code = stream.readNumber();
+            // nop
+          }
+          break;
+        case 2: // cidchar
+          stream.readHex(char, dataSize);
+          code = stream.readNumber();
+          cMap.mapOne(hexToInt(char, dataSize), String.fromCharCode(code));
+          for (i = 1; i < subitemsCount; i++) {
+            incHex(char, dataSize);
+            if (!sequence) {
+              stream.readHexNumber(tmp, dataSize);
+              addHex(char, tmp, dataSize);
+            }
+            code = stream.readSigned() + (code + 1);
+            cMap.mapOne(hexToInt(char, dataSize), String.fromCharCode(code));
+          }
+          break;
+        case 3: // cidrange
+          stream.readHex(start, dataSize);
+          stream.readHexNumber(end, dataSize);
+          addHex(end, start, dataSize);
+          code = stream.readNumber();
+          cMap.mapRange(hexToInt(start, dataSize), hexToInt(end, dataSize),
+                        String.fromCharCode(code));
+          for (i = 1; i < subitemsCount; i++) {
+            incHex(end, dataSize);
+            if (!sequence) {
+              stream.readHexNumber(start, dataSize);
+              addHex(start, end, dataSize);
+            } else {
+              start.set(end);
+            }
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            code = stream.readNumber();
+            cMap.mapRange(hexToInt(start, dataSize), hexToInt(end, dataSize),
+                          String.fromCharCode(code));
+          }
+          break;
+        case 4: // bfchar
+          stream.readHex(char, ucs2DataSize);
+          stream.readHex(charCode, dataSize);
+          cMap.mapOne(hexToInt(char, ucs2DataSize),
+                      hexToStr(charCode, dataSize));
+          for (i = 1; i < subitemsCount; i++) {
+            incHex(char, ucs2DataSize);
+            if (!sequence) {
+              stream.readHexNumber(tmp, ucs2DataSize);
+              addHex(char, tmp, ucs2DataSize);
+            }
+            incHex(charCode, dataSize);
+            stream.readHexSigned(tmp, dataSize);
+            addHex(charCode, tmp, dataSize);
+            cMap.mapOne(hexToInt(char, ucs2DataSize),
+                        hexToStr(charCode, dataSize));
+          }
+          break;
+        case 5: // bfrange
+          stream.readHex(start, ucs2DataSize);
+          stream.readHexNumber(end, ucs2DataSize);
+          addHex(end, start, ucs2DataSize);
+          stream.readHex(charCode, dataSize);
+          cMap.mapRange(hexToInt(start, ucs2DataSize),
+                        hexToInt(end, ucs2DataSize),
+                        hexToStr(charCode, dataSize));
+          for (i = 1; i < subitemsCount; i++) {
+            incHex(end, ucs2DataSize);
+            if (!sequence) {
+              stream.readHexNumber(start, ucs2DataSize);
+              addHex(start, end, ucs2DataSize);
+            } else {
+              start.set(end);
+            }
+            stream.readHexNumber(end, ucs2DataSize);
+            addHex(end, start, ucs2DataSize);
+            stream.readHex(charCode, dataSize);
+            cMap.mapRange(hexToInt(start, ucs2DataSize),
+                          hexToInt(end, ucs2DataSize),
+                          hexToStr(charCode, dataSize));
+          }
+          break;
+        default:
+          error('Unknown type: ' + type);
+          break;
+      }
+    }
+
+    if (useCMap) {
+      extend(useCMap);
+    }
+    return cMap;
+  }
+
+  function BinaryCMapReader() {}
+
+  BinaryCMapReader.prototype = {
+    read: processBinaryCMap
+  };
+
+  return BinaryCMapReader;
+})();
+
+var CMapFactory = (function CMapFactoryClosure() {
+  function strToInt(str) {
+    var a = 0;
+    for (var i = 0; i < str.length; i++) {
+      a = (a << 8) | str.charCodeAt(i);
+    }
+    return a >>> 0;
+  }
+
+  function expectString(obj) {
+    if (!isString(obj)) {
+      error('Malformed CMap: expected string.');
+    }
+  }
+
+  function expectInt(obj) {
+    if (!isInt(obj)) {
+      error('Malformed CMap: expected int.');
+    }
+  }
+
+  function parseBfChar(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if (isEOF(obj)) {
+        break;
+      }
+      if (isCmd(obj, 'endbfchar')) {
+        return;
+      }
+      expectString(obj);
+      var src = strToInt(obj);
+      obj = lexer.getObj();
+      // TODO are /dstName used?
+      expectString(obj);
+      var dst = obj;
+      cMap.mapOne(src, dst);
+    }
+  }
+
+  function parseBfRange(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if (isEOF(obj)) {
+        break;
+      }
+      if (isCmd(obj, 'endbfrange')) {
+        return;
+      }
+      expectString(obj);
+      var low = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      var high = strToInt(obj);
+      obj = lexer.getObj();
+      if (isInt(obj) || isString(obj)) {
+        var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj;
+        cMap.mapRange(low, high, dstLow);
+      } else if (isCmd(obj, '[')) {
+        obj = lexer.getObj();
+        var array = [];
+        while (!isCmd(obj, ']') && !isEOF(obj)) {
+          array.push(obj);
+          obj = lexer.getObj();
+        }
+        cMap.mapRangeToArray(low, high, array);
+      } else {
+        break;
+      }
+    }
+    error('Invalid bf range.');
+  }
+
+  function parseCidChar(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if (isEOF(obj)) {
+        break;
+      }
+      if (isCmd(obj, 'endcidchar')) {
+        return;
+      }
+      expectString(obj);
+      var src = strToInt(obj);
+      obj = lexer.getObj();
+      expectInt(obj);
+      var dst = String.fromCharCode(obj);
+      cMap.mapOne(src, dst);
+    }
+  }
+
+  function parseCidRange(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if (isEOF(obj)) {
+        break;
+      }
+      if (isCmd(obj, 'endcidrange')) {
+        return;
+      }
+      expectString(obj);
+      var low = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      var high = strToInt(obj);
+      obj = lexer.getObj();
+      expectInt(obj);
+      var dstLow = String.fromCharCode(obj);
+      cMap.mapRange(low, high, dstLow);
+    }
+  }
+
+  function parseCodespaceRange(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if (isEOF(obj)) {
+        break;
+      }
+      if (isCmd(obj, 'endcodespacerange')) {
+        return;
+      }
+      if (!isString(obj)) {
+        break;
+      }
+      var low = strToInt(obj);
+      obj = lexer.getObj();
+      if (!isString(obj)) {
+        break;
+      }
+      var high = strToInt(obj);
+      cMap.addCodespaceRange(obj.length, low, high);
+    }
+    error('Invalid codespace range.');
+  }
+
+  function parseWMode(cMap, lexer) {
+    var obj = lexer.getObj();
+    if (isInt(obj)) {
+      cMap.vertical = !!obj;
+    }
+  }
+
+  function parseCMap(cMap, lexer, builtInCMapParams, useCMap) {
+    var previous;
+    var embededUseCMap;
+    objLoop: while (true) {
+      var obj = lexer.getObj();
+      if (isEOF(obj)) {
+        break;
+      } else if (isName(obj)) {
+        if (obj.name === 'WMode') {
+          parseWMode(cMap, lexer);
+        }
+        previous = obj;
+      } else if (isCmd(obj)) {
+        switch (obj.cmd) {
+          case 'endcmap':
+            break objLoop;
+          case 'usecmap':
+            if (isName(previous)) {
+              embededUseCMap = previous.name;
+            }
+            break;
+          case 'begincodespacerange':
+            parseCodespaceRange(cMap, lexer);
+            break;
+          case 'beginbfchar':
+            parseBfChar(cMap, lexer);
+            break;
+          case 'begincidchar':
+            parseCidChar(cMap, lexer);
+            break;
+          case 'beginbfrange':
+            parseBfRange(cMap, lexer);
+            break;
+          case 'begincidrange':
+            parseCidRange(cMap, lexer);
+            break;
+        }
+      }
+    }
+
+    if (!useCMap && embededUseCMap) {
+      // Load the usecmap definition from the file only if there wasn't one
+      // specified.
+      useCMap = embededUseCMap;
+    }
+    if (useCMap) {
+      extendCMap(cMap, builtInCMapParams, useCMap);
+    }
+  }
+
+  function extendCMap(cMap, builtInCMapParams, useCMap) {
+    cMap.useCMap = createBuiltInCMap(useCMap, builtInCMapParams);
+    // If there aren't any code space ranges defined clone all the parent ones
+    // into this cMap.
+    if (cMap.numCodespaceRanges === 0) {
+      var useCodespaceRanges = cMap.useCMap.codespaceRanges;
+      for (var i = 0; i < useCodespaceRanges.length; i++) {
+        cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
+      }
+      cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
+    }
+    // Merge the map into the current one, making sure not to override
+    // any previously defined entries.
+    for (var key in cMap.useCMap.map) {
+      if (key in cMap.map) {
+        continue;
+      }
+      cMap.map[key] = cMap.useCMap.map[key];
+    }
+  }
+
+  function parseBinaryCMap(name, builtInCMapParams) {
+    var url = builtInCMapParams.url + name + '.bcmap';
+    var cMap = new CMap(true);
+    new BinaryCMapReader().read(url, cMap, function (useCMap) {
+      extendCMap(cMap, builtInCMapParams, useCMap);
+    });
+    return cMap;
+  }
+
+  function createBuiltInCMap(name, builtInCMapParams) {
+    if (name === 'Identity-H') {
+      return new IdentityCMap(false, 2);
+    } else if (name === 'Identity-V') {
+      return new IdentityCMap(true, 2);
+    }
+    if (BUILT_IN_CMAPS.indexOf(name) === -1) {
+      error('Unknown cMap name: ' + name);
+    }
+    assert (builtInCMapParams, 'buildin cmap parameters are not provided');
+
+    if (builtInCMapParams.packed) {
+      return parseBinaryCMap(name, builtInCMapParams);
+    }
+
+    var request = new XMLHttpRequest();
+    var url = builtInCMapParams.url + name;
+    request.open('GET', url, false);
+    request.send(null);
+    if (request.status === 0 && /^https?:/i.test(url)) {
+      error('Unable to get cMap at: ' + url);
+    }
+    var cMap = new CMap(true);
+    var lexer = new Lexer(new StringStream(request.responseText));
+    parseCMap(cMap, lexer, builtInCMapParams, null);
+    return cMap;
+  }
+
+  return {
+    create: function (encoding, builtInCMapParams, useCMap) {
+      if (isName(encoding)) {
+        return createBuiltInCMap(encoding.name, builtInCMapParams);
+      } else if (isStream(encoding)) {
+        var cMap = new CMap();
+        var lexer = new Lexer(encoding);
+        try {
+          parseCMap(cMap, lexer, builtInCMapParams, useCMap);
+        } catch (e) {
+          warn('Invalid CMap data. ' + e);
+        }
+        return cMap;
+      }
+      error('Encoding required.');
+    }
+  };
+})();
+
+
+// Unicode Private Use Area
+var PRIVATE_USE_OFFSET_START = 0xE000;
+var PRIVATE_USE_OFFSET_END = 0xF8FF;
+var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false;
+
+// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
+// except for Type 3 fonts
+var PDF_GLYPH_SPACE_UNITS = 1000;
+
+// Hinting is currently disabled due to unknown problems on windows
+// in tracemonkey and various other pdfs with type1 fonts.
+var HINTING_ENABLED = false;
+
+// Accented charactars are not displayed properly on windows, using this flag
+// to control analysis of seac charstrings.
+var SEAC_ANALYSIS_ENABLED = false;
+
+var FontFlags = {
+  FixedPitch: 1,
+  Serif: 2,
+  Symbolic: 4,
+  Script: 8,
+  Nonsymbolic: 32,
+  Italic: 64,
+  AllCap: 65536,
+  SmallCap: 131072,
+  ForceBold: 262144
+};
+
+var Encodings = {
+  ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
+    'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+    'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+    'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+    'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+    'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
+    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
+    'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
+    'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
+    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
+    '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
+    'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+    'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+    'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+    'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+    'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+    'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+    '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
+    'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
+    'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
+    'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
+    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+    'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
+    'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
+    'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
+    'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
+    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
+    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
+    'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
+    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
+    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+    'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+    'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+    'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+    'Ydieresissmall'],
+  MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
+    'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
+    'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+    'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
+    'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
+    'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
+    'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
+    'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
+    'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+    'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
+    'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
+    'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
+    'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+    'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+    'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+    'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
+    'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
+    'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
+    'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
+    'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
+    'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
+    'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
+    'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
+    'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
+    'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
+    'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
+    'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
+    'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
+    'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
+    '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
+    'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
+    'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+    'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
+    'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
+    '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
+    'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
+    'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
+  MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
+    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
+    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
+    'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
+    'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
+    'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
+    'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
+    'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
+    'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
+    'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
+    'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
+    'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
+    'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
+    'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE',
+    'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
+    'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
+    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
+    'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
+    'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
+    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
+    'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
+    'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
+    'ogonek', 'caron'],
+  StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+    'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+    'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
+    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
+    'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
+    'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+    'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+    'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
+    'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
+    'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+    'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
+    'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
+    '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
+    '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
+    '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
+  WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
+    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
+    'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
+    'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
+    'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
+    'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
+    'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
+    'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling',
+    'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
+    'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
+    'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
+    'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
+    'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
+    'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
+    'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+    'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
+    'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
+    'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
+    'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
+    'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+    'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
+    'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
+    'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
+    'ydieresis'],
+  SymbolSetEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
+    'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
+    'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+    'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+    'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
+    'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
+    'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
+    'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
+    'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
+    'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
+    'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
+    'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
+    'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
+    'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
+    'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
+    'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
+    'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
+    'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
+    'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
+    'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
+    'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
+    'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
+    'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
+    'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
+    'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
+    'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
+    'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
+    'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
+    '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
+    'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
+    'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
+    'bracerightbt'],
+  zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
+    'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
+    'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
+    'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
+    'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
+    'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
+    'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
+    'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
+    'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
+    'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112',
+    'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125',
+    'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134',
+    'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143',
+    'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152',
+    'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161',
+    'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169',
+    'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177',
+    'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201',
+    'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187',
+    'a188', 'a189', 'a190', 'a191']
+};
+
+/**
+ * Hold a map of decoded fonts and of the standard fourteen Type1
+ * fonts and their acronyms.
+ */
+var stdFontMap = {
+  'ArialNarrow': 'Helvetica',
+  'ArialNarrow-Bold': 'Helvetica-Bold',
+  'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
+  'ArialNarrow-Italic': 'Helvetica-Oblique',
+  'ArialBlack': 'Helvetica',
+  'ArialBlack-Bold': 'Helvetica-Bold',
+  'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
+  'ArialBlack-Italic': 'Helvetica-Oblique',
+  'Arial': 'Helvetica',
+  'Arial-Bold': 'Helvetica-Bold',
+  'Arial-BoldItalic': 'Helvetica-BoldOblique',
+  'Arial-Italic': 'Helvetica-Oblique',
+  'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
+  'Arial-BoldMT': 'Helvetica-Bold',
+  'Arial-ItalicMT': 'Helvetica-Oblique',
+  'ArialMT': 'Helvetica',
+  'Courier-Bold': 'Courier-Bold',
+  'Courier-BoldItalic': 'Courier-BoldOblique',
+  'Courier-Italic': 'Courier-Oblique',
+  'CourierNew': 'Courier',
+  'CourierNew-Bold': 'Courier-Bold',
+  'CourierNew-BoldItalic': 'Courier-BoldOblique',
+  'CourierNew-Italic': 'Courier-Oblique',
+  'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
+  'CourierNewPS-BoldMT': 'Courier-Bold',
+  'CourierNewPS-ItalicMT': 'Courier-Oblique',
+  'CourierNewPSMT': 'Courier',
+  'Helvetica-Bold': 'Helvetica-Bold',
+  'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
+  'Helvetica-Italic': 'Helvetica-Oblique',
+  'Symbol-Bold': 'Symbol',
+  'Symbol-BoldItalic': 'Symbol',
+  'Symbol-Italic': 'Symbol',
+  'TimesNewRoman': 'Times-Roman',
+  'TimesNewRoman-Bold': 'Times-Bold',
+  'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
+  'TimesNewRoman-Italic': 'Times-Italic',
+  'TimesNewRomanPS': 'Times-Roman',
+  'TimesNewRomanPS-Bold': 'Times-Bold',
+  'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
+  'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
+  'TimesNewRomanPS-BoldMT': 'Times-Bold',
+  'TimesNewRomanPS-Italic': 'Times-Italic',
+  'TimesNewRomanPS-ItalicMT': 'Times-Italic',
+  'TimesNewRomanPSMT': 'Times-Roman',
+  'TimesNewRomanPSMT-Bold': 'Times-Bold',
+  'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
+  'TimesNewRomanPSMT-Italic': 'Times-Italic'
+};
+
+/**
+ * Holds the map of the non-standard fonts that might be included as a standard
+ * fonts without glyph data.
+ */
+var nonStdFontMap = {
+  'ComicSansMS': 'Comic Sans MS',
+  'ComicSansMS-Bold': 'Comic Sans MS-Bold',
+  'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
+  'ComicSansMS-Italic': 'Comic Sans MS-Italic',
+  'LucidaConsole': 'Courier',
+  'LucidaConsole-Bold': 'Courier-Bold',
+  'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
+  'LucidaConsole-Italic': 'Courier-Oblique',
+  'MS-Gothic': 'MS Gothic',
+  'MS-Gothic-Bold': 'MS Gothic-Bold',
+  'MS-Gothic-BoldItalic': 'MS Gothic-BoldItalic',
+  'MS-Gothic-Italic': 'MS Gothic-Italic',
+  'MS-Mincho': 'MS Mincho',
+  'MS-Mincho-Bold': 'MS Mincho-Bold',
+  'MS-Mincho-BoldItalic': 'MS Mincho-BoldItalic',
+  'MS-Mincho-Italic': 'MS Mincho-Italic',
+  'MS-PGothic': 'MS PGothic',
+  'MS-PGothic-Bold': 'MS PGothic-Bold',
+  'MS-PGothic-BoldItalic': 'MS PGothic-BoldItalic',
+  'MS-PGothic-Italic': 'MS PGothic-Italic',
+  'MS-PMincho': 'MS PMincho',
+  'MS-PMincho-Bold': 'MS PMincho-Bold',
+  'MS-PMincho-BoldItalic': 'MS PMincho-BoldItalic',
+  'MS-PMincho-Italic': 'MS PMincho-Italic'
+};
+
+var serifFonts = {
+  'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
+  'Aldus': true, 'Alexandria': true, 'Algerian': true,
+  'American Typewriter': true, 'Antiqua': true, 'Apex': true,
+  'Arno': true, 'Aster': true, 'Aurora': true,
+  'Baskerville': true, 'Bell': true, 'Bembo': true,
+  'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
+  'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
+  'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
+  'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
+  'Calvert': true, 'Capitals': true, 'Cambria': true,
+  'Cartier': true, 'Caslon': true, 'Catull': true,
+  'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
+  'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
+  'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
+  'Cochin': true, 'Colonna': true, 'Computer Modern': true,
+  'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
+  'Corona': true, 'Ecotype': true, 'Egyptienne': true,
+  'Elephant': true, 'Excelsior': true, 'Fairfield': true,
+  'FF Scala': true, 'Folkard': true, 'Footlight': true,
+  'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
+  'Gentium': true, 'Georgia': true, 'Gloucester': true,
+  'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
+  'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
+  'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
+  'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
+  'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
+  'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
+  'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
+  'Lucida Bright': true, 'Melior': true, 'Memphis': true,
+  'Miller': true, 'Minion': true, 'Modern': true,
+  'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
+  'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
+  'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
+  'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
+  'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
+  'Requiem': true, 'Rockwell': true, 'Roman': true,
+  'Rotis Serif': true, 'Sabon': true, 'Scala': true,
+  'Seagull': true, 'Sistina': true, 'Souvenir': true,
+  'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
+  'Sylfaen': true, 'Times': true, 'Trajan': true,
+  'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
+  'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
+  'Versailles': true, 'Wanted': true, 'Weiss': true,
+  'Wide Latin': true, 'Windsor': true, 'XITS': true
+};
+
+var symbolsFonts = {
+  'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
+};
+
+// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts
+// but does not embed the CID to GID mapping. The mapping is incomplete for all
+// glyphs, but common for some set of the standard fonts.
+var GlyphMapForStandardFonts = {
+  '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38,
+  '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 173,
+  '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52,
+  '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894,
+  '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66,
+  '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73,
+  '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80,
+  '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87,
+  '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94,
+  '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101,
+  '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108,
+  '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115,
+  '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122,
+  '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199,
+  '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224,
+  '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233,
+  '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238,
+  '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246,
+  '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224,
+  '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182,
+  '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168,
+  '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804,
+  '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719,
+  '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248,
+  '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776,
+  '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '305': 963,
+  '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359,
+  '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524,
+  '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776,
+  '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782,
+  '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769,
+  '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342,
+  '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363,
+  '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824,
+  '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045,
+  '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753,
+  '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849,
+  '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460,
+  '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467,
+  '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474,
+  '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480,
+  '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487,
+  '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494,
+  '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502,
+  '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509,
+  '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516,
+  '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522,
+  '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529,
+  '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549,
+  '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556,
+  '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290,
+  '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296,
+  '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533,
+  '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595,
+  '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606,
+  '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615,
+  '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884,
+  '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887,
+  '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889,
+  '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892,
+  '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588,
+  '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275,
+  '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799,
+  '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377
+};
+
+// Some characters, e.g. copyrightserif, mapped to the private use area and
+// might not be displayed using standard fonts. Mapping/hacking well-known chars
+// to the similar equivalents in the normal characters range.
+function mapSpecialUnicodeValues(code) {
+  if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block.
+    return 0;
+  }
+  switch (code) {
+    case 0xF8E9: // copyrightsans
+    case 0xF6D9: // copyrightserif
+      return 0x00A9; // copyright
+
+    case 0xF8E8: // registersans
+    case 0xF6DA: // registerserif
+      return 0x00AE; // registered
+
+    case 0xF8EA: // trademarksans
+    case 0xF6DB: // trademarkserif
+      return 0x2122; // trademark
+
+    default:
+      return code;
+  }
+}
+
+var UnicodeRanges = [
+  { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
+  { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
+  { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
+  { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
+  { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
+  { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
+  { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
+  { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
+  { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
+  { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
+  { 'begin': 0x0530, 'end': 0x058F }, // Armenian
+  { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
+  { 'begin': 0xA500, 'end': 0xA63F }, // Vai
+  { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
+  { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
+  { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
+  { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
+  { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
+  { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
+  { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
+  { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
+  { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
+  { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
+  { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
+  { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
+  { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
+  { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
+  { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
+  { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
+  { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
+  { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
+  { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
+  { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
+  { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
+  { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
+  { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
+  { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
+  { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
+  { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
+  { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
+  { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
+  { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
+  { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
+  { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
+  { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
+  { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
+  { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
+  { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
+  { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
+  { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
+  { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
+  { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
+  { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
+  { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
+  { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
+  { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
+  { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
+  { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
+  { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
+  { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
+  { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
+  { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
+  { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
+  { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
+  { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
+  { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
+  { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
+  { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
+  { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
+  { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
+  { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
+  { 'begin': 0x0700, 'end': 0x074F }, // Syriac
+  { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
+  { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
+  { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
+  { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
+  { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
+  { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
+  { 'begin': 0x1680, 'end': 0x169F }, // Ogham
+  { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
+  { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
+  { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
+  { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
+  { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
+  { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
+  { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
+  { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
+  { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
+  { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
+  { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
+  { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
+  { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
+  { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
+  { 'begin': 0x1900, 'end': 0x194F }, // Limbu
+  { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
+  { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
+  { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
+  { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
+  { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
+  { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
+  { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
+  { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
+  { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
+  { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
+  { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
+  { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
+  { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
+  { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
+  { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
+  { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
+  { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
+  { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
+  { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
+  { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
+  { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
+  { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
+  { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
+  { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
+  { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
+  { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
+  { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
+  { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
+  { 'begin': 0x1F030, 'end': 0x1F09F }  // Domino Tiles
+];
+
+var MacStandardGlyphOrdering = [
+  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
+  'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+  'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
+  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
+  'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
+  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
+  'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+  'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
+  'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
+  'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
+  'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
+  'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
+  'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+  'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
+  'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
+  'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
+  'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
+  'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
+  'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
+  'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
+  'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
+  'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
+  'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
+  'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
+  'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
+  'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
+  'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
+  'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
+  'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
+  'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
+  'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
+  'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
+
+function getUnicodeRangeFor(value) {
+  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+    var range = UnicodeRanges[i];
+    if (value >= range.begin && value < range.end) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+function isRTLRangeFor(value) {
+  var range = UnicodeRanges[13];
+  if (value >= range.begin && value < range.end) {
+    return true;
+  }
+  range = UnicodeRanges[11];
+  if (value >= range.begin && value < range.end) {
+    return true;
+  }
+  return false;
+}
+
+// The normalization table is obtained by filtering the Unicode characters
+// database with <compat> entries.
+var NormalizedUnicodes = {
+  '\u00A8': '\u0020\u0308',
+  '\u00AF': '\u0020\u0304',
+  '\u00B4': '\u0020\u0301',
+  '\u00B5': '\u03BC',
+  '\u00B8': '\u0020\u0327',
+  '\u0132': '\u0049\u004A',
+  '\u0133': '\u0069\u006A',
+  '\u013F': '\u004C\u00B7',
+  '\u0140': '\u006C\u00B7',
+  '\u0149': '\u02BC\u006E',
+  '\u017F': '\u0073',
+  '\u01C4': '\u0044\u017D',
+  '\u01C5': '\u0044\u017E',
+  '\u01C6': '\u0064\u017E',
+  '\u01C7': '\u004C\u004A',
+  '\u01C8': '\u004C\u006A',
+  '\u01C9': '\u006C\u006A',
+  '\u01CA': '\u004E\u004A',
+  '\u01CB': '\u004E\u006A',
+  '\u01CC': '\u006E\u006A',
+  '\u01F1': '\u0044\u005A',
+  '\u01F2': '\u0044\u007A',
+  '\u01F3': '\u0064\u007A',
+  '\u02D8': '\u0020\u0306',
+  '\u02D9': '\u0020\u0307',
+  '\u02DA': '\u0020\u030A',
+  '\u02DB': '\u0020\u0328',
+  '\u02DC': '\u0020\u0303',
+  '\u02DD': '\u0020\u030B',
+  '\u037A': '\u0020\u0345',
+  '\u0384': '\u0020\u0301',
+  '\u03D0': '\u03B2',
+  '\u03D1': '\u03B8',
+  '\u03D2': '\u03A5',
+  '\u03D5': '\u03C6',
+  '\u03D6': '\u03C0',
+  '\u03F0': '\u03BA',
+  '\u03F1': '\u03C1',
+  '\u03F2': '\u03C2',
+  '\u03F4': '\u0398',
+  '\u03F5': '\u03B5',
+  '\u03F9': '\u03A3',
+  '\u0587': '\u0565\u0582',
+  '\u0675': '\u0627\u0674',
+  '\u0676': '\u0648\u0674',
+  '\u0677': '\u06C7\u0674',
+  '\u0678': '\u064A\u0674',
+  '\u0E33': '\u0E4D\u0E32',
+  '\u0EB3': '\u0ECD\u0EB2',
+  '\u0EDC': '\u0EAB\u0E99',
+  '\u0EDD': '\u0EAB\u0EA1',
+  '\u0F77': '\u0FB2\u0F81',
+  '\u0F79': '\u0FB3\u0F81',
+  '\u1E9A': '\u0061\u02BE',
+  '\u1FBD': '\u0020\u0313',
+  '\u1FBF': '\u0020\u0313',
+  '\u1FC0': '\u0020\u0342',
+  '\u1FFE': '\u0020\u0314',
+  '\u2002': '\u0020',
+  '\u2003': '\u0020',
+  '\u2004': '\u0020',
+  '\u2005': '\u0020',
+  '\u2006': '\u0020',
+  '\u2008': '\u0020',
+  '\u2009': '\u0020',
+  '\u200A': '\u0020',
+  '\u2017': '\u0020\u0333',
+  '\u2024': '\u002E',
+  '\u2025': '\u002E\u002E',
+  '\u2026': '\u002E\u002E\u002E',
+  '\u2033': '\u2032\u2032',
+  '\u2034': '\u2032\u2032\u2032',
+  '\u2036': '\u2035\u2035',
+  '\u2037': '\u2035\u2035\u2035',
+  '\u203C': '\u0021\u0021',
+  '\u203E': '\u0020\u0305',
+  '\u2047': '\u003F\u003F',
+  '\u2048': '\u003F\u0021',
+  '\u2049': '\u0021\u003F',
+  '\u2057': '\u2032\u2032\u2032\u2032',
+  '\u205F': '\u0020',
+  '\u20A8': '\u0052\u0073',
+  '\u2100': '\u0061\u002F\u0063',
+  '\u2101': '\u0061\u002F\u0073',
+  '\u2103': '\u00B0\u0043',
+  '\u2105': '\u0063\u002F\u006F',
+  '\u2106': '\u0063\u002F\u0075',
+  '\u2107': '\u0190',
+  '\u2109': '\u00B0\u0046',
+  '\u2116': '\u004E\u006F',
+  '\u2121': '\u0054\u0045\u004C',
+  '\u2135': '\u05D0',
+  '\u2136': '\u05D1',
+  '\u2137': '\u05D2',
+  '\u2138': '\u05D3',
+  '\u213B': '\u0046\u0041\u0058',
+  '\u2160': '\u0049',
+  '\u2161': '\u0049\u0049',
+  '\u2162': '\u0049\u0049\u0049',
+  '\u2163': '\u0049\u0056',
+  '\u2164': '\u0056',
+  '\u2165': '\u0056\u0049',
+  '\u2166': '\u0056\u0049\u0049',
+  '\u2167': '\u0056\u0049\u0049\u0049',
+  '\u2168': '\u0049\u0058',
+  '\u2169': '\u0058',
+  '\u216A': '\u0058\u0049',
+  '\u216B': '\u0058\u0049\u0049',
+  '\u216C': '\u004C',
+  '\u216D': '\u0043',
+  '\u216E': '\u0044',
+  '\u216F': '\u004D',
+  '\u2170': '\u0069',
+  '\u2171': '\u0069\u0069',
+  '\u2172': '\u0069\u0069\u0069',
+  '\u2173': '\u0069\u0076',
+  '\u2174': '\u0076',
+  '\u2175': '\u0076\u0069',
+  '\u2176': '\u0076\u0069\u0069',
+  '\u2177': '\u0076\u0069\u0069\u0069',
+  '\u2178': '\u0069\u0078',
+  '\u2179': '\u0078',
+  '\u217A': '\u0078\u0069',
+  '\u217B': '\u0078\u0069\u0069',
+  '\u217C': '\u006C',
+  '\u217D': '\u0063',
+  '\u217E': '\u0064',
+  '\u217F': '\u006D',
+  '\u222C': '\u222B\u222B',
+  '\u222D': '\u222B\u222B\u222B',
+  '\u222F': '\u222E\u222E',
+  '\u2230': '\u222E\u222E\u222E',
+  '\u2474': '\u0028\u0031\u0029',
+  '\u2475': '\u0028\u0032\u0029',
+  '\u2476': '\u0028\u0033\u0029',
+  '\u2477': '\u0028\u0034\u0029',
+  '\u2478': '\u0028\u0035\u0029',
+  '\u2479': '\u0028\u0036\u0029',
+  '\u247A': '\u0028\u0037\u0029',
+  '\u247B': '\u0028\u0038\u0029',
+  '\u247C': '\u0028\u0039\u0029',
+  '\u247D': '\u0028\u0031\u0030\u0029',
+  '\u247E': '\u0028\u0031\u0031\u0029',
+  '\u247F': '\u0028\u0031\u0032\u0029',
+  '\u2480': '\u0028\u0031\u0033\u0029',
+  '\u2481': '\u0028\u0031\u0034\u0029',
+  '\u2482': '\u0028\u0031\u0035\u0029',
+  '\u2483': '\u0028\u0031\u0036\u0029',
+  '\u2484': '\u0028\u0031\u0037\u0029',
+  '\u2485': '\u0028\u0031\u0038\u0029',
+  '\u2486': '\u0028\u0031\u0039\u0029',
+  '\u2487': '\u0028\u0032\u0030\u0029',
+  '\u2488': '\u0031\u002E',
+  '\u2489': '\u0032\u002E',
+  '\u248A': '\u0033\u002E',
+  '\u248B': '\u0034\u002E',
+  '\u248C': '\u0035\u002E',
+  '\u248D': '\u0036\u002E',
+  '\u248E': '\u0037\u002E',
+  '\u248F': '\u0038\u002E',
+  '\u2490': '\u0039\u002E',
+  '\u2491': '\u0031\u0030\u002E',
+  '\u2492': '\u0031\u0031\u002E',
+  '\u2493': '\u0031\u0032\u002E',
+  '\u2494': '\u0031\u0033\u002E',
+  '\u2495': '\u0031\u0034\u002E',
+  '\u2496': '\u0031\u0035\u002E',
+  '\u2497': '\u0031\u0036\u002E',
+  '\u2498': '\u0031\u0037\u002E',
+  '\u2499': '\u0031\u0038\u002E',
+  '\u249A': '\u0031\u0039\u002E',
+  '\u249B': '\u0032\u0030\u002E',
+  '\u249C': '\u0028\u0061\u0029',
+  '\u249D': '\u0028\u0062\u0029',
+  '\u249E': '\u0028\u0063\u0029',
+  '\u249F': '\u0028\u0064\u0029',
+  '\u24A0': '\u0028\u0065\u0029',
+  '\u24A1': '\u0028\u0066\u0029',
+  '\u24A2': '\u0028\u0067\u0029',
+  '\u24A3': '\u0028\u0068\u0029',
+  '\u24A4': '\u0028\u0069\u0029',
+  '\u24A5': '\u0028\u006A\u0029',
+  '\u24A6': '\u0028\u006B\u0029',
+  '\u24A7': '\u0028\u006C\u0029',
+  '\u24A8': '\u0028\u006D\u0029',
+  '\u24A9': '\u0028\u006E\u0029',
+  '\u24AA': '\u0028\u006F\u0029',
+  '\u24AB': '\u0028\u0070\u0029',
+  '\u24AC': '\u0028\u0071\u0029',
+  '\u24AD': '\u0028\u0072\u0029',
+  '\u24AE': '\u0028\u0073\u0029',
+  '\u24AF': '\u0028\u0074\u0029',
+  '\u24B0': '\u0028\u0075\u0029',
+  '\u24B1': '\u0028\u0076\u0029',
+  '\u24B2': '\u0028\u0077\u0029',
+  '\u24B3': '\u0028\u0078\u0029',
+  '\u24B4': '\u0028\u0079\u0029',
+  '\u24B5': '\u0028\u007A\u0029',
+  '\u2A0C': '\u222B\u222B\u222B\u222B',
+  '\u2A74': '\u003A\u003A\u003D',
+  '\u2A75': '\u003D\u003D',
+  '\u2A76': '\u003D\u003D\u003D',
+  '\u2E9F': '\u6BCD',
+  '\u2EF3': '\u9F9F',
+  '\u2F00': '\u4E00',
+  '\u2F01': '\u4E28',
+  '\u2F02': '\u4E36',
+  '\u2F03': '\u4E3F',
+  '\u2F04': '\u4E59',
+  '\u2F05': '\u4E85',
+  '\u2F06': '\u4E8C',
+  '\u2F07': '\u4EA0',
+  '\u2F08': '\u4EBA',
+  '\u2F09': '\u513F',
+  '\u2F0A': '\u5165',
+  '\u2F0B': '\u516B',
+  '\u2F0C': '\u5182',
+  '\u2F0D': '\u5196',
+  '\u2F0E': '\u51AB',
+  '\u2F0F': '\u51E0',
+  '\u2F10': '\u51F5',
+  '\u2F11': '\u5200',
+  '\u2F12': '\u529B',
+  '\u2F13': '\u52F9',
+  '\u2F14': '\u5315',
+  '\u2F15': '\u531A',
+  '\u2F16': '\u5338',
+  '\u2F17': '\u5341',
+  '\u2F18': '\u535C',
+  '\u2F19': '\u5369',
+  '\u2F1A': '\u5382',
+  '\u2F1B': '\u53B6',
+  '\u2F1C': '\u53C8',
+  '\u2F1D': '\u53E3',
+  '\u2F1E': '\u56D7',
+  '\u2F1F': '\u571F',
+  '\u2F20': '\u58EB',
+  '\u2F21': '\u5902',
+  '\u2F22': '\u590A',
+  '\u2F23': '\u5915',
+  '\u2F24': '\u5927',
+  '\u2F25': '\u5973',
+  '\u2F26': '\u5B50',
+  '\u2F27': '\u5B80',
+  '\u2F28': '\u5BF8',
+  '\u2F29': '\u5C0F',
+  '\u2F2A': '\u5C22',
+  '\u2F2B': '\u5C38',
+  '\u2F2C': '\u5C6E',
+  '\u2F2D': '\u5C71',
+  '\u2F2E': '\u5DDB',
+  '\u2F2F': '\u5DE5',
+  '\u2F30': '\u5DF1',
+  '\u2F31': '\u5DFE',
+  '\u2F32': '\u5E72',
+  '\u2F33': '\u5E7A',
+  '\u2F34': '\u5E7F',
+  '\u2F35': '\u5EF4',
+  '\u2F36': '\u5EFE',
+  '\u2F37': '\u5F0B',
+  '\u2F38': '\u5F13',
+  '\u2F39': '\u5F50',
+  '\u2F3A': '\u5F61',
+  '\u2F3B': '\u5F73',
+  '\u2F3C': '\u5FC3',
+  '\u2F3D': '\u6208',
+  '\u2F3E': '\u6236',
+  '\u2F3F': '\u624B',
+  '\u2F40': '\u652F',
+  '\u2F41': '\u6534',
+  '\u2F42': '\u6587',
+  '\u2F43': '\u6597',
+  '\u2F44': '\u65A4',
+  '\u2F45': '\u65B9',
+  '\u2F46': '\u65E0',
+  '\u2F47': '\u65E5',
+  '\u2F48': '\u66F0',
+  '\u2F49': '\u6708',
+  '\u2F4A': '\u6728',
+  '\u2F4B': '\u6B20',
+  '\u2F4C': '\u6B62',
+  '\u2F4D': '\u6B79',
+  '\u2F4E': '\u6BB3',
+  '\u2F4F': '\u6BCB',
+  '\u2F50': '\u6BD4',
+  '\u2F51': '\u6BDB',
+  '\u2F52': '\u6C0F',
+  '\u2F53': '\u6C14',
+  '\u2F54': '\u6C34',
+  '\u2F55': '\u706B',
+  '\u2F56': '\u722A',
+  '\u2F57': '\u7236',
+  '\u2F58': '\u723B',
+  '\u2F59': '\u723F',
+  '\u2F5A': '\u7247',
+  '\u2F5B': '\u7259',
+  '\u2F5C': '\u725B',
+  '\u2F5D': '\u72AC',
+  '\u2F5E': '\u7384',
+  '\u2F5F': '\u7389',
+  '\u2F60': '\u74DC',
+  '\u2F61': '\u74E6',
+  '\u2F62': '\u7518',
+  '\u2F63': '\u751F',
+  '\u2F64': '\u7528',
+  '\u2F65': '\u7530',
+  '\u2F66': '\u758B',
+  '\u2F67': '\u7592',
+  '\u2F68': '\u7676',
+  '\u2F69': '\u767D',
+  '\u2F6A': '\u76AE',
+  '\u2F6B': '\u76BF',
+  '\u2F6C': '\u76EE',
+  '\u2F6D': '\u77DB',
+  '\u2F6E': '\u77E2',
+  '\u2F6F': '\u77F3',
+  '\u2F70': '\u793A',
+  '\u2F71': '\u79B8',
+  '\u2F72': '\u79BE',
+  '\u2F73': '\u7A74',
+  '\u2F74': '\u7ACB',
+  '\u2F75': '\u7AF9',
+  '\u2F76': '\u7C73',
+  '\u2F77': '\u7CF8',
+  '\u2F78': '\u7F36',
+  '\u2F79': '\u7F51',
+  '\u2F7A': '\u7F8A',
+  '\u2F7B': '\u7FBD',
+  '\u2F7C': '\u8001',
+  '\u2F7D': '\u800C',
+  '\u2F7E': '\u8012',
+  '\u2F7F': '\u8033',
+  '\u2F80': '\u807F',
+  '\u2F81': '\u8089',
+  '\u2F82': '\u81E3',
+  '\u2F83': '\u81EA',
+  '\u2F84': '\u81F3',
+  '\u2F85': '\u81FC',
+  '\u2F86': '\u820C',
+  '\u2F87': '\u821B',
+  '\u2F88': '\u821F',
+  '\u2F89': '\u826E',
+  '\u2F8A': '\u8272',
+  '\u2F8B': '\u8278',
+  '\u2F8C': '\u864D',
+  '\u2F8D': '\u866B',
+  '\u2F8E': '\u8840',
+  '\u2F8F': '\u884C',
+  '\u2F90': '\u8863',
+  '\u2F91': '\u897E',
+  '\u2F92': '\u898B',
+  '\u2F93': '\u89D2',
+  '\u2F94': '\u8A00',
+  '\u2F95': '\u8C37',
+  '\u2F96': '\u8C46',
+  '\u2F97': '\u8C55',
+  '\u2F98': '\u8C78',
+  '\u2F99': '\u8C9D',
+  '\u2F9A': '\u8D64',
+  '\u2F9B': '\u8D70',
+  '\u2F9C': '\u8DB3',
+  '\u2F9D': '\u8EAB',
+  '\u2F9E': '\u8ECA',
+  '\u2F9F': '\u8F9B',
+  '\u2FA0': '\u8FB0',
+  '\u2FA1': '\u8FB5',
+  '\u2FA2': '\u9091',
+  '\u2FA3': '\u9149',
+  '\u2FA4': '\u91C6',
+  '\u2FA5': '\u91CC',
+  '\u2FA6': '\u91D1',
+  '\u2FA7': '\u9577',
+  '\u2FA8': '\u9580',
+  '\u2FA9': '\u961C',
+  '\u2FAA': '\u96B6',
+  '\u2FAB': '\u96B9',
+  '\u2FAC': '\u96E8',
+  '\u2FAD': '\u9751',
+  '\u2FAE': '\u975E',
+  '\u2FAF': '\u9762',
+  '\u2FB0': '\u9769',
+  '\u2FB1': '\u97CB',
+  '\u2FB2': '\u97ED',
+  '\u2FB3': '\u97F3',
+  '\u2FB4': '\u9801',
+  '\u2FB5': '\u98A8',
+  '\u2FB6': '\u98DB',
+  '\u2FB7': '\u98DF',
+  '\u2FB8': '\u9996',
+  '\u2FB9': '\u9999',
+  '\u2FBA': '\u99AC',
+  '\u2FBB': '\u9AA8',
+  '\u2FBC': '\u9AD8',
+  '\u2FBD': '\u9ADF',
+  '\u2FBE': '\u9B25',
+  '\u2FBF': '\u9B2F',
+  '\u2FC0': '\u9B32',
+  '\u2FC1': '\u9B3C',
+  '\u2FC2': '\u9B5A',
+  '\u2FC3': '\u9CE5',
+  '\u2FC4': '\u9E75',
+  '\u2FC5': '\u9E7F',
+  '\u2FC6': '\u9EA5',
+  '\u2FC7': '\u9EBB',
+  '\u2FC8': '\u9EC3',
+  '\u2FC9': '\u9ECD',
+  '\u2FCA': '\u9ED1',
+  '\u2FCB': '\u9EF9',
+  '\u2FCC': '\u9EFD',
+  '\u2FCD': '\u9F0E',
+  '\u2FCE': '\u9F13',
+  '\u2FCF': '\u9F20',
+  '\u2FD0': '\u9F3B',
+  '\u2FD1': '\u9F4A',
+  '\u2FD2': '\u9F52',
+  '\u2FD3': '\u9F8D',
+  '\u2FD4': '\u9F9C',
+  '\u2FD5': '\u9FA0',
+  '\u3036': '\u3012',
+  '\u3038': '\u5341',
+  '\u3039': '\u5344',
+  '\u303A': '\u5345',
+  '\u309B': '\u0020\u3099',
+  '\u309C': '\u0020\u309A',
+  '\u3131': '\u1100',
+  '\u3132': '\u1101',
+  '\u3133': '\u11AA',
+  '\u3134': '\u1102',
+  '\u3135': '\u11AC',
+  '\u3136': '\u11AD',
+  '\u3137': '\u1103',
+  '\u3138': '\u1104',
+  '\u3139': '\u1105',
+  '\u313A': '\u11B0',
+  '\u313B': '\u11B1',
+  '\u313C': '\u11B2',
+  '\u313D': '\u11B3',
+  '\u313E': '\u11B4',
+  '\u313F': '\u11B5',
+  '\u3140': '\u111A',
+  '\u3141': '\u1106',
+  '\u3142': '\u1107',
+  '\u3143': '\u1108',
+  '\u3144': '\u1121',
+  '\u3145': '\u1109',
+  '\u3146': '\u110A',
+  '\u3147': '\u110B',
+  '\u3148': '\u110C',
+  '\u3149': '\u110D',
+  '\u314A': '\u110E',
+  '\u314B': '\u110F',
+  '\u314C': '\u1110',
+  '\u314D': '\u1111',
+  '\u314E': '\u1112',
+  '\u314F': '\u1161',
+  '\u3150': '\u1162',
+  '\u3151': '\u1163',
+  '\u3152': '\u1164',
+  '\u3153': '\u1165',
+  '\u3154': '\u1166',
+  '\u3155': '\u1167',
+  '\u3156': '\u1168',
+  '\u3157': '\u1169',
+  '\u3158': '\u116A',
+  '\u3159': '\u116B',
+  '\u315A': '\u116C',
+  '\u315B': '\u116D',
+  '\u315C': '\u116E',
+  '\u315D': '\u116F',
+  '\u315E': '\u1170',
+  '\u315F': '\u1171',
+  '\u3160': '\u1172',
+  '\u3161': '\u1173',
+  '\u3162': '\u1174',
+  '\u3163': '\u1175',
+  '\u3164': '\u1160',
+  '\u3165': '\u1114',
+  '\u3166': '\u1115',
+  '\u3167': '\u11C7',
+  '\u3168': '\u11C8',
+  '\u3169': '\u11CC',
+  '\u316A': '\u11CE',
+  '\u316B': '\u11D3',
+  '\u316C': '\u11D7',
+  '\u316D': '\u11D9',
+  '\u316E': '\u111C',
+  '\u316F': '\u11DD',
+  '\u3170': '\u11DF',
+  '\u3171': '\u111D',
+  '\u3172': '\u111E',
+  '\u3173': '\u1120',
+  '\u3174': '\u1122',
+  '\u3175': '\u1123',
+  '\u3176': '\u1127',
+  '\u3177': '\u1129',
+  '\u3178': '\u112B',
+  '\u3179': '\u112C',
+  '\u317A': '\u112D',
+  '\u317B': '\u112E',
+  '\u317C': '\u112F',
+  '\u317D': '\u1132',
+  '\u317E': '\u1136',
+  '\u317F': '\u1140',
+  '\u3180': '\u1147',
+  '\u3181': '\u114C',
+  '\u3182': '\u11F1',
+  '\u3183': '\u11F2',
+  '\u3184': '\u1157',
+  '\u3185': '\u1158',
+  '\u3186': '\u1159',
+  '\u3187': '\u1184',
+  '\u3188': '\u1185',
+  '\u3189': '\u1188',
+  '\u318A': '\u1191',
+  '\u318B': '\u1192',
+  '\u318C': '\u1194',
+  '\u318D': '\u119E',
+  '\u318E': '\u11A1',
+  '\u3200': '\u0028\u1100\u0029',
+  '\u3201': '\u0028\u1102\u0029',
+  '\u3202': '\u0028\u1103\u0029',
+  '\u3203': '\u0028\u1105\u0029',
+  '\u3204': '\u0028\u1106\u0029',
+  '\u3205': '\u0028\u1107\u0029',
+  '\u3206': '\u0028\u1109\u0029',
+  '\u3207': '\u0028\u110B\u0029',
+  '\u3208': '\u0028\u110C\u0029',
+  '\u3209': '\u0028\u110E\u0029',
+  '\u320A': '\u0028\u110F\u0029',
+  '\u320B': '\u0028\u1110\u0029',
+  '\u320C': '\u0028\u1111\u0029',
+  '\u320D': '\u0028\u1112\u0029',
+  '\u320E': '\u0028\u1100\u1161\u0029',
+  '\u320F': '\u0028\u1102\u1161\u0029',
+  '\u3210': '\u0028\u1103\u1161\u0029',
+  '\u3211': '\u0028\u1105\u1161\u0029',
+  '\u3212': '\u0028\u1106\u1161\u0029',
+  '\u3213': '\u0028\u1107\u1161\u0029',
+  '\u3214': '\u0028\u1109\u1161\u0029',
+  '\u3215': '\u0028\u110B\u1161\u0029',
+  '\u3216': '\u0028\u110C\u1161\u0029',
+  '\u3217': '\u0028\u110E\u1161\u0029',
+  '\u3218': '\u0028\u110F\u1161\u0029',
+  '\u3219': '\u0028\u1110\u1161\u0029',
+  '\u321A': '\u0028\u1111\u1161\u0029',
+  '\u321B': '\u0028\u1112\u1161\u0029',
+  '\u321C': '\u0028\u110C\u116E\u0029',
+  '\u321D': '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029',
+  '\u321E': '\u0028\u110B\u1169\u1112\u116E\u0029',
+  '\u3220': '\u0028\u4E00\u0029',
+  '\u3221': '\u0028\u4E8C\u0029',
+  '\u3222': '\u0028\u4E09\u0029',
+  '\u3223': '\u0028\u56DB\u0029',
+  '\u3224': '\u0028\u4E94\u0029',
+  '\u3225': '\u0028\u516D\u0029',
+  '\u3226': '\u0028\u4E03\u0029',
+  '\u3227': '\u0028\u516B\u0029',
+  '\u3228': '\u0028\u4E5D\u0029',
+  '\u3229': '\u0028\u5341\u0029',
+  '\u322A': '\u0028\u6708\u0029',
+  '\u322B': '\u0028\u706B\u0029',
+  '\u322C': '\u0028\u6C34\u0029',
+  '\u322D': '\u0028\u6728\u0029',
+  '\u322E': '\u0028\u91D1\u0029',
+  '\u322F': '\u0028\u571F\u0029',
+  '\u3230': '\u0028\u65E5\u0029',
+  '\u3231': '\u0028\u682A\u0029',
+  '\u3232': '\u0028\u6709\u0029',
+  '\u3233': '\u0028\u793E\u0029',
+  '\u3234': '\u0028\u540D\u0029',
+  '\u3235': '\u0028\u7279\u0029',
+  '\u3236': '\u0028\u8CA1\u0029',
+  '\u3237': '\u0028\u795D\u0029',
+  '\u3238': '\u0028\u52B4\u0029',
+  '\u3239': '\u0028\u4EE3\u0029',
+  '\u323A': '\u0028\u547C\u0029',
+  '\u323B': '\u0028\u5B66\u0029',
+  '\u323C': '\u0028\u76E3\u0029',
+  '\u323D': '\u0028\u4F01\u0029',
+  '\u323E': '\u0028\u8CC7\u0029',
+  '\u323F': '\u0028\u5354\u0029',
+  '\u3240': '\u0028\u796D\u0029',
+  '\u3241': '\u0028\u4F11\u0029',
+  '\u3242': '\u0028\u81EA\u0029',
+  '\u3243': '\u0028\u81F3\u0029',
+  '\u32C0': '\u0031\u6708',
+  '\u32C1': '\u0032\u6708',
+  '\u32C2': '\u0033\u6708',
+  '\u32C3': '\u0034\u6708',
+  '\u32C4': '\u0035\u6708',
+  '\u32C5': '\u0036\u6708',
+  '\u32C6': '\u0037\u6708',
+  '\u32C7': '\u0038\u6708',
+  '\u32C8': '\u0039\u6708',
+  '\u32C9': '\u0031\u0030\u6708',
+  '\u32CA': '\u0031\u0031\u6708',
+  '\u32CB': '\u0031\u0032\u6708',
+  '\u3358': '\u0030\u70B9',
+  '\u3359': '\u0031\u70B9',
+  '\u335A': '\u0032\u70B9',
+  '\u335B': '\u0033\u70B9',
+  '\u335C': '\u0034\u70B9',
+  '\u335D': '\u0035\u70B9',
+  '\u335E': '\u0036\u70B9',
+  '\u335F': '\u0037\u70B9',
+  '\u3360': '\u0038\u70B9',
+  '\u3361': '\u0039\u70B9',
+  '\u3362': '\u0031\u0030\u70B9',
+  '\u3363': '\u0031\u0031\u70B9',
+  '\u3364': '\u0031\u0032\u70B9',
+  '\u3365': '\u0031\u0033\u70B9',
+  '\u3366': '\u0031\u0034\u70B9',
+  '\u3367': '\u0031\u0035\u70B9',
+  '\u3368': '\u0031\u0036\u70B9',
+  '\u3369': '\u0031\u0037\u70B9',
+  '\u336A': '\u0031\u0038\u70B9',
+  '\u336B': '\u0031\u0039\u70B9',
+  '\u336C': '\u0032\u0030\u70B9',
+  '\u336D': '\u0032\u0031\u70B9',
+  '\u336E': '\u0032\u0032\u70B9',
+  '\u336F': '\u0032\u0033\u70B9',
+  '\u3370': '\u0032\u0034\u70B9',
+  '\u33E0': '\u0031\u65E5',
+  '\u33E1': '\u0032\u65E5',
+  '\u33E2': '\u0033\u65E5',
+  '\u33E3': '\u0034\u65E5',
+  '\u33E4': '\u0035\u65E5',
+  '\u33E5': '\u0036\u65E5',
+  '\u33E6': '\u0037\u65E5',
+  '\u33E7': '\u0038\u65E5',
+  '\u33E8': '\u0039\u65E5',
+  '\u33E9': '\u0031\u0030\u65E5',
+  '\u33EA': '\u0031\u0031\u65E5',
+  '\u33EB': '\u0031\u0032\u65E5',
+  '\u33EC': '\u0031\u0033\u65E5',
+  '\u33ED': '\u0031\u0034\u65E5',
+  '\u33EE': '\u0031\u0035\u65E5',
+  '\u33EF': '\u0031\u0036\u65E5',
+  '\u33F0': '\u0031\u0037\u65E5',
+  '\u33F1': '\u0031\u0038\u65E5',
+  '\u33F2': '\u0031\u0039\u65E5',
+  '\u33F3': '\u0032\u0030\u65E5',
+  '\u33F4': '\u0032\u0031\u65E5',
+  '\u33F5': '\u0032\u0032\u65E5',
+  '\u33F6': '\u0032\u0033\u65E5',
+  '\u33F7': '\u0032\u0034\u65E5',
+  '\u33F8': '\u0032\u0035\u65E5',
+  '\u33F9': '\u0032\u0036\u65E5',
+  '\u33FA': '\u0032\u0037\u65E5',
+  '\u33FB': '\u0032\u0038\u65E5',
+  '\u33FC': '\u0032\u0039\u65E5',
+  '\u33FD': '\u0033\u0030\u65E5',
+  '\u33FE': '\u0033\u0031\u65E5',
+  '\uFB00': '\u0066\u0066',
+  '\uFB01': '\u0066\u0069',
+  '\uFB02': '\u0066\u006C',
+  '\uFB03': '\u0066\u0066\u0069',
+  '\uFB04': '\u0066\u0066\u006C',
+  '\uFB05': '\u017F\u0074',
+  '\uFB06': '\u0073\u0074',
+  '\uFB13': '\u0574\u0576',
+  '\uFB14': '\u0574\u0565',
+  '\uFB15': '\u0574\u056B',
+  '\uFB16': '\u057E\u0576',
+  '\uFB17': '\u0574\u056D',
+  '\uFB4F': '\u05D0\u05DC',
+  '\uFB50': '\u0671',
+  '\uFB51': '\u0671',
+  '\uFB52': '\u067B',
+  '\uFB53': '\u067B',
+  '\uFB54': '\u067B',
+  '\uFB55': '\u067B',
+  '\uFB56': '\u067E',
+  '\uFB57': '\u067E',
+  '\uFB58': '\u067E',
+  '\uFB59': '\u067E',
+  '\uFB5A': '\u0680',
+  '\uFB5B': '\u0680',
+  '\uFB5C': '\u0680',
+  '\uFB5D': '\u0680',
+  '\uFB5E': '\u067A',
+  '\uFB5F': '\u067A',
+  '\uFB60': '\u067A',
+  '\uFB61': '\u067A',
+  '\uFB62': '\u067F',
+  '\uFB63': '\u067F',
+  '\uFB64': '\u067F',
+  '\uFB65': '\u067F',
+  '\uFB66': '\u0679',
+  '\uFB67': '\u0679',
+  '\uFB68': '\u0679',
+  '\uFB69': '\u0679',
+  '\uFB6A': '\u06A4',
+  '\uFB6B': '\u06A4',
+  '\uFB6C': '\u06A4',
+  '\uFB6D': '\u06A4',
+  '\uFB6E': '\u06A6',
+  '\uFB6F': '\u06A6',
+  '\uFB70': '\u06A6',
+  '\uFB71': '\u06A6',
+  '\uFB72': '\u0684',
+  '\uFB73': '\u0684',
+  '\uFB74': '\u0684',
+  '\uFB75': '\u0684',
+  '\uFB76': '\u0683',
+  '\uFB77': '\u0683',
+  '\uFB78': '\u0683',
+  '\uFB79': '\u0683',
+  '\uFB7A': '\u0686',
+  '\uFB7B': '\u0686',
+  '\uFB7C': '\u0686',
+  '\uFB7D': '\u0686',
+  '\uFB7E': '\u0687',
+  '\uFB7F': '\u0687',
+  '\uFB80': '\u0687',
+  '\uFB81': '\u0687',
+  '\uFB82': '\u068D',
+  '\uFB83': '\u068D',
+  '\uFB84': '\u068C',
+  '\uFB85': '\u068C',
+  '\uFB86': '\u068E',
+  '\uFB87': '\u068E',
+  '\uFB88': '\u0688',
+  '\uFB89': '\u0688',
+  '\uFB8A': '\u0698',
+  '\uFB8B': '\u0698',
+  '\uFB8C': '\u0691',
+  '\uFB8D': '\u0691',
+  '\uFB8E': '\u06A9',
+  '\uFB8F': '\u06A9',
+  '\uFB90': '\u06A9',
+  '\uFB91': '\u06A9',
+  '\uFB92': '\u06AF',
+  '\uFB93': '\u06AF',
+  '\uFB94': '\u06AF',
+  '\uFB95': '\u06AF',
+  '\uFB96': '\u06B3',
+  '\uFB97': '\u06B3',
+  '\uFB98': '\u06B3',
+  '\uFB99': '\u06B3',
+  '\uFB9A': '\u06B1',
+  '\uFB9B': '\u06B1',
+  '\uFB9C': '\u06B1',
+  '\uFB9D': '\u06B1',
+  '\uFB9E': '\u06BA',
+  '\uFB9F': '\u06BA',
+  '\uFBA0': '\u06BB',
+  '\uFBA1': '\u06BB',
+  '\uFBA2': '\u06BB',
+  '\uFBA3': '\u06BB',
+  '\uFBA4': '\u06C0',
+  '\uFBA5': '\u06C0',
+  '\uFBA6': '\u06C1',
+  '\uFBA7': '\u06C1',
+  '\uFBA8': '\u06C1',
+  '\uFBA9': '\u06C1',
+  '\uFBAA': '\u06BE',
+  '\uFBAB': '\u06BE',
+  '\uFBAC': '\u06BE',
+  '\uFBAD': '\u06BE',
+  '\uFBAE': '\u06D2',
+  '\uFBAF': '\u06D2',
+  '\uFBB0': '\u06D3',
+  '\uFBB1': '\u06D3',
+  '\uFBD3': '\u06AD',
+  '\uFBD4': '\u06AD',
+  '\uFBD5': '\u06AD',
+  '\uFBD6': '\u06AD',
+  '\uFBD7': '\u06C7',
+  '\uFBD8': '\u06C7',
+  '\uFBD9': '\u06C6',
+  '\uFBDA': '\u06C6',
+  '\uFBDB': '\u06C8',
+  '\uFBDC': '\u06C8',
+  '\uFBDD': '\u0677',
+  '\uFBDE': '\u06CB',
+  '\uFBDF': '\u06CB',
+  '\uFBE0': '\u06C5',
+  '\uFBE1': '\u06C5',
+  '\uFBE2': '\u06C9',
+  '\uFBE3': '\u06C9',
+  '\uFBE4': '\u06D0',
+  '\uFBE5': '\u06D0',
+  '\uFBE6': '\u06D0',
+  '\uFBE7': '\u06D0',
+  '\uFBE8': '\u0649',
+  '\uFBE9': '\u0649',
+  '\uFBEA': '\u0626\u0627',
+  '\uFBEB': '\u0626\u0627',
+  '\uFBEC': '\u0626\u06D5',
+  '\uFBED': '\u0626\u06D5',
+  '\uFBEE': '\u0626\u0648',
+  '\uFBEF': '\u0626\u0648',
+  '\uFBF0': '\u0626\u06C7',
+  '\uFBF1': '\u0626\u06C7',
+  '\uFBF2': '\u0626\u06C6',
+  '\uFBF3': '\u0626\u06C6',
+  '\uFBF4': '\u0626\u06C8',
+  '\uFBF5': '\u0626\u06C8',
+  '\uFBF6': '\u0626\u06D0',
+  '\uFBF7': '\u0626\u06D0',
+  '\uFBF8': '\u0626\u06D0',
+  '\uFBF9': '\u0626\u0649',
+  '\uFBFA': '\u0626\u0649',
+  '\uFBFB': '\u0626\u0649',
+  '\uFBFC': '\u06CC',
+  '\uFBFD': '\u06CC',
+  '\uFBFE': '\u06CC',
+  '\uFBFF': '\u06CC',
+  '\uFC00': '\u0626\u062C',
+  '\uFC01': '\u0626\u062D',
+  '\uFC02': '\u0626\u0645',
+  '\uFC03': '\u0626\u0649',
+  '\uFC04': '\u0626\u064A',
+  '\uFC05': '\u0628\u062C',
+  '\uFC06': '\u0628\u062D',
+  '\uFC07': '\u0628\u062E',
+  '\uFC08': '\u0628\u0645',
+  '\uFC09': '\u0628\u0649',
+  '\uFC0A': '\u0628\u064A',
+  '\uFC0B': '\u062A\u062C',
+  '\uFC0C': '\u062A\u062D',
+  '\uFC0D': '\u062A\u062E',
+  '\uFC0E': '\u062A\u0645',
+  '\uFC0F': '\u062A\u0649',
+  '\uFC10': '\u062A\u064A',
+  '\uFC11': '\u062B\u062C',
+  '\uFC12': '\u062B\u0645',
+  '\uFC13': '\u062B\u0649',
+  '\uFC14': '\u062B\u064A',
+  '\uFC15': '\u062C\u062D',
+  '\uFC16': '\u062C\u0645',
+  '\uFC17': '\u062D\u062C',
+  '\uFC18': '\u062D\u0645',
+  '\uFC19': '\u062E\u062C',
+  '\uFC1A': '\u062E\u062D',
+  '\uFC1B': '\u062E\u0645',
+  '\uFC1C': '\u0633\u062C',
+  '\uFC1D': '\u0633\u062D',
+  '\uFC1E': '\u0633\u062E',
+  '\uFC1F': '\u0633\u0645',
+  '\uFC20': '\u0635\u062D',
+  '\uFC21': '\u0635\u0645',
+  '\uFC22': '\u0636\u062C',
+  '\uFC23': '\u0636\u062D',
+  '\uFC24': '\u0636\u062E',
+  '\uFC25': '\u0636\u0645',
+  '\uFC26': '\u0637\u062D',
+  '\uFC27': '\u0637\u0645',
+  '\uFC28': '\u0638\u0645',
+  '\uFC29': '\u0639\u062C',
+  '\uFC2A': '\u0639\u0645',
+  '\uFC2B': '\u063A\u062C',
+  '\uFC2C': '\u063A\u0645',
+  '\uFC2D': '\u0641\u062C',
+  '\uFC2E': '\u0641\u062D',
+  '\uFC2F': '\u0641\u062E',
+  '\uFC30': '\u0641\u0645',
+  '\uFC31': '\u0641\u0649',
+  '\uFC32': '\u0641\u064A',
+  '\uFC33': '\u0642\u062D',
+  '\uFC34': '\u0642\u0645',
+  '\uFC35': '\u0642\u0649',
+  '\uFC36': '\u0642\u064A',
+  '\uFC37': '\u0643\u0627',
+  '\uFC38': '\u0643\u062C',
+  '\uFC39': '\u0643\u062D',
+  '\uFC3A': '\u0643\u062E',
+  '\uFC3B': '\u0643\u0644',
+  '\uFC3C': '\u0643\u0645',
+  '\uFC3D': '\u0643\u0649',
+  '\uFC3E': '\u0643\u064A',
+  '\uFC3F': '\u0644\u062C',
+  '\uFC40': '\u0644\u062D',
+  '\uFC41': '\u0644\u062E',
+  '\uFC42': '\u0644\u0645',
+  '\uFC43': '\u0644\u0649',
+  '\uFC44': '\u0644\u064A',
+  '\uFC45': '\u0645\u062C',
+  '\uFC46': '\u0645\u062D',
+  '\uFC47': '\u0645\u062E',
+  '\uFC48': '\u0645\u0645',
+  '\uFC49': '\u0645\u0649',
+  '\uFC4A': '\u0645\u064A',
+  '\uFC4B': '\u0646\u062C',
+  '\uFC4C': '\u0646\u062D',
+  '\uFC4D': '\u0646\u062E',
+  '\uFC4E': '\u0646\u0645',
+  '\uFC4F': '\u0646\u0649',
+  '\uFC50': '\u0646\u064A',
+  '\uFC51': '\u0647\u062C',
+  '\uFC52': '\u0647\u0645',
+  '\uFC53': '\u0647\u0649',
+  '\uFC54': '\u0647\u064A',
+  '\uFC55': '\u064A\u062C',
+  '\uFC56': '\u064A\u062D',
+  '\uFC57': '\u064A\u062E',
+  '\uFC58': '\u064A\u0645',
+  '\uFC59': '\u064A\u0649',
+  '\uFC5A': '\u064A\u064A',
+  '\uFC5B': '\u0630\u0670',
+  '\uFC5C': '\u0631\u0670',
+  '\uFC5D': '\u0649\u0670',
+  '\uFC5E': '\u0020\u064C\u0651',
+  '\uFC5F': '\u0020\u064D\u0651',
+  '\uFC60': '\u0020\u064E\u0651',
+  '\uFC61': '\u0020\u064F\u0651',
+  '\uFC62': '\u0020\u0650\u0651',
+  '\uFC63': '\u0020\u0651\u0670',
+  '\uFC64': '\u0626\u0631',
+  '\uFC65': '\u0626\u0632',
+  '\uFC66': '\u0626\u0645',
+  '\uFC67': '\u0626\u0646',
+  '\uFC68': '\u0626\u0649',
+  '\uFC69': '\u0626\u064A',
+  '\uFC6A': '\u0628\u0631',
+  '\uFC6B': '\u0628\u0632',
+  '\uFC6C': '\u0628\u0645',
+  '\uFC6D': '\u0628\u0646',
+  '\uFC6E': '\u0628\u0649',
+  '\uFC6F': '\u0628\u064A',
+  '\uFC70': '\u062A\u0631',
+  '\uFC71': '\u062A\u0632',
+  '\uFC72': '\u062A\u0645',
+  '\uFC73': '\u062A\u0646',
+  '\uFC74': '\u062A\u0649',
+  '\uFC75': '\u062A\u064A',
+  '\uFC76': '\u062B\u0631',
+  '\uFC77': '\u062B\u0632',
+  '\uFC78': '\u062B\u0645',
+  '\uFC79': '\u062B\u0646',
+  '\uFC7A': '\u062B\u0649',
+  '\uFC7B': '\u062B\u064A',
+  '\uFC7C': '\u0641\u0649',
+  '\uFC7D': '\u0641\u064A',
+  '\uFC7E': '\u0642\u0649',
+  '\uFC7F': '\u0642\u064A',
+  '\uFC80': '\u0643\u0627',
+  '\uFC81': '\u0643\u0644',
+  '\uFC82': '\u0643\u0645',
+  '\uFC83': '\u0643\u0649',
+  '\uFC84': '\u0643\u064A',
+  '\uFC85': '\u0644\u0645',
+  '\uFC86': '\u0644\u0649',
+  '\uFC87': '\u0644\u064A',
+  '\uFC88': '\u0645\u0627',
+  '\uFC89': '\u0645\u0645',
+  '\uFC8A': '\u0646\u0631',
+  '\uFC8B': '\u0646\u0632',
+  '\uFC8C': '\u0646\u0645',
+  '\uFC8D': '\u0646\u0646',
+  '\uFC8E': '\u0646\u0649',
+  '\uFC8F': '\u0646\u064A',
+  '\uFC90': '\u0649\u0670',
+  '\uFC91': '\u064A\u0631',
+  '\uFC92': '\u064A\u0632',
+  '\uFC93': '\u064A\u0645',
+  '\uFC94': '\u064A\u0646',
+  '\uFC95': '\u064A\u0649',
+  '\uFC96': '\u064A\u064A',
+  '\uFC97': '\u0626\u062C',
+  '\uFC98': '\u0626\u062D',
+  '\uFC99': '\u0626\u062E',
+  '\uFC9A': '\u0626\u0645',
+  '\uFC9B': '\u0626\u0647',
+  '\uFC9C': '\u0628\u062C',
+  '\uFC9D': '\u0628\u062D',
+  '\uFC9E': '\u0628\u062E',
+  '\uFC9F': '\u0628\u0645',
+  '\uFCA0': '\u0628\u0647',
+  '\uFCA1': '\u062A\u062C',
+  '\uFCA2': '\u062A\u062D',
+  '\uFCA3': '\u062A\u062E',
+  '\uFCA4': '\u062A\u0645',
+  '\uFCA5': '\u062A\u0647',
+  '\uFCA6': '\u062B\u0645',
+  '\uFCA7': '\u062C\u062D',
+  '\uFCA8': '\u062C\u0645',
+  '\uFCA9': '\u062D\u062C',
+  '\uFCAA': '\u062D\u0645',
+  '\uFCAB': '\u062E\u062C',
+  '\uFCAC': '\u062E\u0645',
+  '\uFCAD': '\u0633\u062C',
+  '\uFCAE': '\u0633\u062D',
+  '\uFCAF': '\u0633\u062E',
+  '\uFCB0': '\u0633\u0645',
+  '\uFCB1': '\u0635\u062D',
+  '\uFCB2': '\u0635\u062E',
+  '\uFCB3': '\u0635\u0645',
+  '\uFCB4': '\u0636\u062C',
+  '\uFCB5': '\u0636\u062D',
+  '\uFCB6': '\u0636\u062E',
+  '\uFCB7': '\u0636\u0645',
+  '\uFCB8': '\u0637\u062D',
+  '\uFCB9': '\u0638\u0645',
+  '\uFCBA': '\u0639\u062C',
+  '\uFCBB': '\u0639\u0645',
+  '\uFCBC': '\u063A\u062C',
+  '\uFCBD': '\u063A\u0645',
+  '\uFCBE': '\u0641\u062C',
+  '\uFCBF': '\u0641\u062D',
+  '\uFCC0': '\u0641\u062E',
+  '\uFCC1': '\u0641\u0645',
+  '\uFCC2': '\u0642\u062D',
+  '\uFCC3': '\u0642\u0645',
+  '\uFCC4': '\u0643\u062C',
+  '\uFCC5': '\u0643\u062D',
+  '\uFCC6': '\u0643\u062E',
+  '\uFCC7': '\u0643\u0644',
+  '\uFCC8': '\u0643\u0645',
+  '\uFCC9': '\u0644\u062C',
+  '\uFCCA': '\u0644\u062D',
+  '\uFCCB': '\u0644\u062E',
+  '\uFCCC': '\u0644\u0645',
+  '\uFCCD': '\u0644\u0647',
+  '\uFCCE': '\u0645\u062C',
+  '\uFCCF': '\u0645\u062D',
+  '\uFCD0': '\u0645\u062E',
+  '\uFCD1': '\u0645\u0645',
+  '\uFCD2': '\u0646\u062C',
+  '\uFCD3': '\u0646\u062D',
+  '\uFCD4': '\u0646\u062E',
+  '\uFCD5': '\u0646\u0645',
+  '\uFCD6': '\u0646\u0647',
+  '\uFCD7': '\u0647\u062C',
+  '\uFCD8': '\u0647\u0645',
+  '\uFCD9': '\u0647\u0670',
+  '\uFCDA': '\u064A\u062C',
+  '\uFCDB': '\u064A\u062D',
+  '\uFCDC': '\u064A\u062E',
+  '\uFCDD': '\u064A\u0645',
+  '\uFCDE': '\u064A\u0647',
+  '\uFCDF': '\u0626\u0645',
+  '\uFCE0': '\u0626\u0647',
+  '\uFCE1': '\u0628\u0645',
+  '\uFCE2': '\u0628\u0647',
+  '\uFCE3': '\u062A\u0645',
+  '\uFCE4': '\u062A\u0647',
+  '\uFCE5': '\u062B\u0645',
+  '\uFCE6': '\u062B\u0647',
+  '\uFCE7': '\u0633\u0645',
+  '\uFCE8': '\u0633\u0647',
+  '\uFCE9': '\u0634\u0645',
+  '\uFCEA': '\u0634\u0647',
+  '\uFCEB': '\u0643\u0644',
+  '\uFCEC': '\u0643\u0645',
+  '\uFCED': '\u0644\u0645',
+  '\uFCEE': '\u0646\u0645',
+  '\uFCEF': '\u0646\u0647',
+  '\uFCF0': '\u064A\u0645',
+  '\uFCF1': '\u064A\u0647',
+  '\uFCF2': '\u0640\u064E\u0651',
+  '\uFCF3': '\u0640\u064F\u0651',
+  '\uFCF4': '\u0640\u0650\u0651',
+  '\uFCF5': '\u0637\u0649',
+  '\uFCF6': '\u0637\u064A',
+  '\uFCF7': '\u0639\u0649',
+  '\uFCF8': '\u0639\u064A',
+  '\uFCF9': '\u063A\u0649',
+  '\uFCFA': '\u063A\u064A',
+  '\uFCFB': '\u0633\u0649',
+  '\uFCFC': '\u0633\u064A',
+  '\uFCFD': '\u0634\u0649',
+  '\uFCFE': '\u0634\u064A',
+  '\uFCFF': '\u062D\u0649',
+  '\uFD00': '\u062D\u064A',
+  '\uFD01': '\u062C\u0649',
+  '\uFD02': '\u062C\u064A',
+  '\uFD03': '\u062E\u0649',
+  '\uFD04': '\u062E\u064A',
+  '\uFD05': '\u0635\u0649',
+  '\uFD06': '\u0635\u064A',
+  '\uFD07': '\u0636\u0649',
+  '\uFD08': '\u0636\u064A',
+  '\uFD09': '\u0634\u062C',
+  '\uFD0A': '\u0634\u062D',
+  '\uFD0B': '\u0634\u062E',
+  '\uFD0C': '\u0634\u0645',
+  '\uFD0D': '\u0634\u0631',
+  '\uFD0E': '\u0633\u0631',
+  '\uFD0F': '\u0635\u0631',
+  '\uFD10': '\u0636\u0631',
+  '\uFD11': '\u0637\u0649',
+  '\uFD12': '\u0637\u064A',
+  '\uFD13': '\u0639\u0649',
+  '\uFD14': '\u0639\u064A',
+  '\uFD15': '\u063A\u0649',
+  '\uFD16': '\u063A\u064A',
+  '\uFD17': '\u0633\u0649',
+  '\uFD18': '\u0633\u064A',
+  '\uFD19': '\u0634\u0649',
+  '\uFD1A': '\u0634\u064A',
+  '\uFD1B': '\u062D\u0649',
+  '\uFD1C': '\u062D\u064A',
+  '\uFD1D': '\u062C\u0649',
+  '\uFD1E': '\u062C\u064A',
+  '\uFD1F': '\u062E\u0649',
+  '\uFD20': '\u062E\u064A',
+  '\uFD21': '\u0635\u0649',
+  '\uFD22': '\u0635\u064A',
+  '\uFD23': '\u0636\u0649',
+  '\uFD24': '\u0636\u064A',
+  '\uFD25': '\u0634\u062C',
+  '\uFD26': '\u0634\u062D',
+  '\uFD27': '\u0634\u062E',
+  '\uFD28': '\u0634\u0645',
+  '\uFD29': '\u0634\u0631',
+  '\uFD2A': '\u0633\u0631',
+  '\uFD2B': '\u0635\u0631',
+  '\uFD2C': '\u0636\u0631',
+  '\uFD2D': '\u0634\u062C',
+  '\uFD2E': '\u0634\u062D',
+  '\uFD2F': '\u0634\u062E',
+  '\uFD30': '\u0634\u0645',
+  '\uFD31': '\u0633\u0647',
+  '\uFD32': '\u0634\u0647',
+  '\uFD33': '\u0637\u0645',
+  '\uFD34': '\u0633\u062C',
+  '\uFD35': '\u0633\u062D',
+  '\uFD36': '\u0633\u062E',
+  '\uFD37': '\u0634\u062C',
+  '\uFD38': '\u0634\u062D',
+  '\uFD39': '\u0634\u062E',
+  '\uFD3A': '\u0637\u0645',
+  '\uFD3B': '\u0638\u0645',
+  '\uFD3C': '\u0627\u064B',
+  '\uFD3D': '\u0627\u064B',
+  '\uFD50': '\u062A\u062C\u0645',
+  '\uFD51': '\u062A\u062D\u062C',
+  '\uFD52': '\u062A\u062D\u062C',
+  '\uFD53': '\u062A\u062D\u0645',
+  '\uFD54': '\u062A\u062E\u0645',
+  '\uFD55': '\u062A\u0645\u062C',
+  '\uFD56': '\u062A\u0645\u062D',
+  '\uFD57': '\u062A\u0645\u062E',
+  '\uFD58': '\u062C\u0645\u062D',
+  '\uFD59': '\u062C\u0645\u062D',
+  '\uFD5A': '\u062D\u0645\u064A',
+  '\uFD5B': '\u062D\u0645\u0649',
+  '\uFD5C': '\u0633\u062D\u062C',
+  '\uFD5D': '\u0633\u062C\u062D',
+  '\uFD5E': '\u0633\u062C\u0649',
+  '\uFD5F': '\u0633\u0645\u062D',
+  '\uFD60': '\u0633\u0645\u062D',
+  '\uFD61': '\u0633\u0645\u062C',
+  '\uFD62': '\u0633\u0645\u0645',
+  '\uFD63': '\u0633\u0645\u0645',
+  '\uFD64': '\u0635\u062D\u062D',
+  '\uFD65': '\u0635\u062D\u062D',
+  '\uFD66': '\u0635\u0645\u0645',
+  '\uFD67': '\u0634\u062D\u0645',
+  '\uFD68': '\u0634\u062D\u0645',
+  '\uFD69': '\u0634\u062C\u064A',
+  '\uFD6A': '\u0634\u0645\u062E',
+  '\uFD6B': '\u0634\u0645\u062E',
+  '\uFD6C': '\u0634\u0645\u0645',
+  '\uFD6D': '\u0634\u0645\u0645',
+  '\uFD6E': '\u0636\u062D\u0649',
+  '\uFD6F': '\u0636\u062E\u0645',
+  '\uFD70': '\u0636\u062E\u0645',
+  '\uFD71': '\u0637\u0645\u062D',
+  '\uFD72': '\u0637\u0645\u062D',
+  '\uFD73': '\u0637\u0645\u0645',
+  '\uFD74': '\u0637\u0645\u064A',
+  '\uFD75': '\u0639\u062C\u0645',
+  '\uFD76': '\u0639\u0645\u0645',
+  '\uFD77': '\u0639\u0645\u0645',
+  '\uFD78': '\u0639\u0645\u0649',
+  '\uFD79': '\u063A\u0645\u0645',
+  '\uFD7A': '\u063A\u0645\u064A',
+  '\uFD7B': '\u063A\u0645\u0649',
+  '\uFD7C': '\u0641\u062E\u0645',
+  '\uFD7D': '\u0641\u062E\u0645',
+  '\uFD7E': '\u0642\u0645\u062D',
+  '\uFD7F': '\u0642\u0645\u0645',
+  '\uFD80': '\u0644\u062D\u0645',
+  '\uFD81': '\u0644\u062D\u064A',
+  '\uFD82': '\u0644\u062D\u0649',
+  '\uFD83': '\u0644\u062C\u062C',
+  '\uFD84': '\u0644\u062C\u062C',
+  '\uFD85': '\u0644\u062E\u0645',
+  '\uFD86': '\u0644\u062E\u0645',
+  '\uFD87': '\u0644\u0645\u062D',
+  '\uFD88': '\u0644\u0645\u062D',
+  '\uFD89': '\u0645\u062D\u062C',
+  '\uFD8A': '\u0645\u062D\u0645',
+  '\uFD8B': '\u0645\u062D\u064A',
+  '\uFD8C': '\u0645\u062C\u062D',
+  '\uFD8D': '\u0645\u062C\u0645',
+  '\uFD8E': '\u0645\u062E\u062C',
+  '\uFD8F': '\u0645\u062E\u0645',
+  '\uFD92': '\u0645\u062C\u062E',
+  '\uFD93': '\u0647\u0645\u062C',
+  '\uFD94': '\u0647\u0645\u0645',
+  '\uFD95': '\u0646\u062D\u0645',
+  '\uFD96': '\u0646\u062D\u0649',
+  '\uFD97': '\u0646\u062C\u0645',
+  '\uFD98': '\u0646\u062C\u0645',
+  '\uFD99': '\u0646\u062C\u0649',
+  '\uFD9A': '\u0646\u0645\u064A',
+  '\uFD9B': '\u0646\u0645\u0649',
+  '\uFD9C': '\u064A\u0645\u0645',
+  '\uFD9D': '\u064A\u0645\u0645',
+  '\uFD9E': '\u0628\u062E\u064A',
+  '\uFD9F': '\u062A\u062C\u064A',
+  '\uFDA0': '\u062A\u062C\u0649',
+  '\uFDA1': '\u062A\u062E\u064A',
+  '\uFDA2': '\u062A\u062E\u0649',
+  '\uFDA3': '\u062A\u0645\u064A',
+  '\uFDA4': '\u062A\u0645\u0649',
+  '\uFDA5': '\u062C\u0645\u064A',
+  '\uFDA6': '\u062C\u062D\u0649',
+  '\uFDA7': '\u062C\u0645\u0649',
+  '\uFDA8': '\u0633\u062E\u0649',
+  '\uFDA9': '\u0635\u062D\u064A',
+  '\uFDAA': '\u0634\u062D\u064A',
+  '\uFDAB': '\u0636\u062D\u064A',
+  '\uFDAC': '\u0644\u062C\u064A',
+  '\uFDAD': '\u0644\u0645\u064A',
+  '\uFDAE': '\u064A\u062D\u064A',
+  '\uFDAF': '\u064A\u062C\u064A',
+  '\uFDB0': '\u064A\u0645\u064A',
+  '\uFDB1': '\u0645\u0645\u064A',
+  '\uFDB2': '\u0642\u0645\u064A',
+  '\uFDB3': '\u0646\u062D\u064A',
+  '\uFDB4': '\u0642\u0645\u062D',
+  '\uFDB5': '\u0644\u062D\u0645',
+  '\uFDB6': '\u0639\u0645\u064A',
+  '\uFDB7': '\u0643\u0645\u064A',
+  '\uFDB8': '\u0646\u062C\u062D',
+  '\uFDB9': '\u0645\u062E\u064A',
+  '\uFDBA': '\u0644\u062C\u0645',
+  '\uFDBB': '\u0643\u0645\u0645',
+  '\uFDBC': '\u0644\u062C\u0645',
+  '\uFDBD': '\u0646\u062C\u062D',
+  '\uFDBE': '\u062C\u062D\u064A',
+  '\uFDBF': '\u062D\u062C\u064A',
+  '\uFDC0': '\u0645\u062C\u064A',
+  '\uFDC1': '\u0641\u0645\u064A',
+  '\uFDC2': '\u0628\u062D\u064A',
+  '\uFDC3': '\u0643\u0645\u0645',
+  '\uFDC4': '\u0639\u062C\u0645',
+  '\uFDC5': '\u0635\u0645\u0645',
+  '\uFDC6': '\u0633\u062E\u064A',
+  '\uFDC7': '\u0646\u062C\u064A',
+  '\uFE49': '\u203E',
+  '\uFE4A': '\u203E',
+  '\uFE4B': '\u203E',
+  '\uFE4C': '\u203E',
+  '\uFE4D': '\u005F',
+  '\uFE4E': '\u005F',
+  '\uFE4F': '\u005F',
+  '\uFE80': '\u0621',
+  '\uFE81': '\u0622',
+  '\uFE82': '\u0622',
+  '\uFE83': '\u0623',
+  '\uFE84': '\u0623',
+  '\uFE85': '\u0624',
+  '\uFE86': '\u0624',
+  '\uFE87': '\u0625',
+  '\uFE88': '\u0625',
+  '\uFE89': '\u0626',
+  '\uFE8A': '\u0626',
+  '\uFE8B': '\u0626',
+  '\uFE8C': '\u0626',
+  '\uFE8D': '\u0627',
+  '\uFE8E': '\u0627',
+  '\uFE8F': '\u0628',
+  '\uFE90': '\u0628',
+  '\uFE91': '\u0628',
+  '\uFE92': '\u0628',
+  '\uFE93': '\u0629',
+  '\uFE94': '\u0629',
+  '\uFE95': '\u062A',
+  '\uFE96': '\u062A',
+  '\uFE97': '\u062A',
+  '\uFE98': '\u062A',
+  '\uFE99': '\u062B',
+  '\uFE9A': '\u062B',
+  '\uFE9B': '\u062B',
+  '\uFE9C': '\u062B',
+  '\uFE9D': '\u062C',
+  '\uFE9E': '\u062C',
+  '\uFE9F': '\u062C',
+  '\uFEA0': '\u062C',
+  '\uFEA1': '\u062D',
+  '\uFEA2': '\u062D',
+  '\uFEA3': '\u062D',
+  '\uFEA4': '\u062D',
+  '\uFEA5': '\u062E',
+  '\uFEA6': '\u062E',
+  '\uFEA7': '\u062E',
+  '\uFEA8': '\u062E',
+  '\uFEA9': '\u062F',
+  '\uFEAA': '\u062F',
+  '\uFEAB': '\u0630',
+  '\uFEAC': '\u0630',
+  '\uFEAD': '\u0631',
+  '\uFEAE': '\u0631',
+  '\uFEAF': '\u0632',
+  '\uFEB0': '\u0632',
+  '\uFEB1': '\u0633',
+  '\uFEB2': '\u0633',
+  '\uFEB3': '\u0633',
+  '\uFEB4': '\u0633',
+  '\uFEB5': '\u0634',
+  '\uFEB6': '\u0634',
+  '\uFEB7': '\u0634',
+  '\uFEB8': '\u0634',
+  '\uFEB9': '\u0635',
+  '\uFEBA': '\u0635',
+  '\uFEBB': '\u0635',
+  '\uFEBC': '\u0635',
+  '\uFEBD': '\u0636',
+  '\uFEBE': '\u0636',
+  '\uFEBF': '\u0636',
+  '\uFEC0': '\u0636',
+  '\uFEC1': '\u0637',
+  '\uFEC2': '\u0637',
+  '\uFEC3': '\u0637',
+  '\uFEC4': '\u0637',
+  '\uFEC5': '\u0638',
+  '\uFEC6': '\u0638',
+  '\uFEC7': '\u0638',
+  '\uFEC8': '\u0638',
+  '\uFEC9': '\u0639',
+  '\uFECA': '\u0639',
+  '\uFECB': '\u0639',
+  '\uFECC': '\u0639',
+  '\uFECD': '\u063A',
+  '\uFECE': '\u063A',
+  '\uFECF': '\u063A',
+  '\uFED0': '\u063A',
+  '\uFED1': '\u0641',
+  '\uFED2': '\u0641',
+  '\uFED3': '\u0641',
+  '\uFED4': '\u0641',
+  '\uFED5': '\u0642',
+  '\uFED6': '\u0642',
+  '\uFED7': '\u0642',
+  '\uFED8': '\u0642',
+  '\uFED9': '\u0643',
+  '\uFEDA': '\u0643',
+  '\uFEDB': '\u0643',
+  '\uFEDC': '\u0643',
+  '\uFEDD': '\u0644',
+  '\uFEDE': '\u0644',
+  '\uFEDF': '\u0644',
+  '\uFEE0': '\u0644',
+  '\uFEE1': '\u0645',
+  '\uFEE2': '\u0645',
+  '\uFEE3': '\u0645',
+  '\uFEE4': '\u0645',
+  '\uFEE5': '\u0646',
+  '\uFEE6': '\u0646',
+  '\uFEE7': '\u0646',
+  '\uFEE8': '\u0646',
+  '\uFEE9': '\u0647',
+  '\uFEEA': '\u0647',
+  '\uFEEB': '\u0647',
+  '\uFEEC': '\u0647',
+  '\uFEED': '\u0648',
+  '\uFEEE': '\u0648',
+  '\uFEEF': '\u0649',
+  '\uFEF0': '\u0649',
+  '\uFEF1': '\u064A',
+  '\uFEF2': '\u064A',
+  '\uFEF3': '\u064A',
+  '\uFEF4': '\u064A',
+  '\uFEF5': '\u0644\u0622',
+  '\uFEF6': '\u0644\u0622',
+  '\uFEF7': '\u0644\u0623',
+  '\uFEF8': '\u0644\u0623',
+  '\uFEF9': '\u0644\u0625',
+  '\uFEFA': '\u0644\u0625',
+  '\uFEFB': '\u0644\u0627',
+  '\uFEFC': '\u0644\u0627'
+};
+
+function reverseIfRtl(chars) {
+  var charsLength = chars.length;
+  //reverse an arabic ligature
+  if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {
+    return chars;
+  }
+  var s = '';
+  for (var ii = charsLength - 1; ii >= 0; ii--) {
+    s += chars[ii];
+  }
+  return s;
+}
+
+function adjustWidths(properties) {
+  if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {
+    return;
+  }
+  // adjusting width to fontMatrix scale
+  var scale = 0.001 / properties.fontMatrix[0];
+  var glyphsWidths = properties.widths;
+  for (var glyph in glyphsWidths) {
+    glyphsWidths[glyph] *= scale;
+  }
+  properties.defaultWidth *= scale;
+}
+
+var Glyph = (function GlyphClosure() {
+  function Glyph(fontChar, unicode, accent, width, vmetric, operatorList) {
+    this.fontChar = fontChar;
+    this.unicode = unicode;
+    this.accent = accent;
+    this.width = width;
+    this.vmetric = vmetric;
+    this.operatorList = operatorList;
+  }
+
+  Glyph.prototype.matchesForCache =
+      function(fontChar, unicode, accent, width, vmetric, operatorList) {
+    return this.fontChar === fontChar &&
+           this.unicode === unicode &&
+           this.accent === accent &&
+           this.width === width &&
+           this.vmetric === vmetric &&
+           this.operatorList === operatorList;
+  };
+
+  return Glyph;
+})();
+
+/**
+ * 'Font' is the class the outside world should use, it encapsulate all the font
+ * decoding logics whatever type it is (assuming the font type is supported).
+ *
+ * For example to read a Type1 font and to attach it to the document:
+ *   var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
+ *   type1Font.bind();
+ */
+var Font = (function FontClosure() {
+  function Font(name, file, properties) {
+    var charCode;
+
+    this.name = name;
+    this.loadedName = properties.loadedName;
+    this.coded = properties.coded;
+    this.loadCharProcs = properties.coded;
+    this.sizes = [];
+
+    this.glyphCache = {};
+
+    var names = name.split('+');
+    names = names.length > 1 ? names[1] : names[0];
+    names = names.split(/[-,_]/g)[0];
+    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
+    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
+
+    var type = properties.type;
+    this.type = type;
+
+    this.fallbackName = (this.isMonospace ? 'monospace' :
+                         (this.isSerifFont ? 'serif' : 'sans-serif'));
+
+    this.differences = properties.differences;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.composite = properties.composite;
+    this.wideChars = properties.wideChars;
+    this.cMap = properties.cMap;
+    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
+    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
+    this.fontMatrix = properties.fontMatrix;
+
+    var unicode = this.buildToUnicode(properties);
+    this.toUnicode = properties.toUnicode = unicode.toUnicode;
+    this.isIdentityUnicode = properties.isIdentityUnicode = unicode.isIdentity;
+
+    this.toFontChar = [];
+
+    if (properties.type == 'Type3') {
+      for (charCode = 0; charCode < 256; charCode++) {
+        this.toFontChar[charCode] = (this.differences[charCode] ||
+                                     properties.defaultEncoding[charCode]);
+      }
+      return;
+    }
+
+    this.cidEncoding = properties.cidEncoding;
+    this.vertical = properties.vertical;
+    if (this.vertical) {
+      this.vmetrics = properties.vmetrics;
+      this.defaultVMetrics = properties.defaultVMetrics;
+    }
+
+    if (!file) {
+      this.missingFile = true;
+      // The file data is not specified. Trying to fix the font name
+      // to be used with the canvas.font.
+      var fontName = name.replace(/[,_]/g, '-');
+      var isStandardFont = fontName in stdFontMap;
+      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
+
+      this.bold = (fontName.search(/bold/gi) != -1);
+      this.italic = ((fontName.search(/oblique/gi) != -1) ||
+                     (fontName.search(/italic/gi) != -1));
+
+      // Use 'name' instead of 'fontName' here because the original
+      // name ArialBlack for example will be replaced by Helvetica.
+      this.black = (name.search(/Black/g) != -1);
+
+      // if at least one width is present, remeasure all chars when exists
+      this.remeasure = Object.keys(this.widths).length > 0;
+      if (isStandardFont && type === 'CIDFontType2' &&
+          properties.cidEncoding.indexOf('Identity-') === 0) {
+        // Standard fonts might be embedded as CID font without glyph mapping.
+        // Building one based on GlyphMapForStandardFonts.
+        var map = [];
+        for (var code in GlyphMapForStandardFonts) {
+          map[+code] = GlyphMapForStandardFonts[code];
+        }
+        this.toFontChar = map;
+        this.toUnicode = map;
+      } else if (/Symbol/i.test(fontName)) {
+        var symbols = Encodings.SymbolSetEncoding;
+        for (charCode in symbols) {
+          var fontChar = GlyphsUnicode[symbols[charCode]];
+          if (!fontChar) {
+            continue;
+          }
+          this.toFontChar[charCode] = fontChar;
+        }
+      } else if (isStandardFont) {
+        this.toFontChar = [];
+        for (charCode in properties.defaultEncoding) {
+          var glyphName = properties.differences[charCode] ||
+                          properties.defaultEncoding[charCode];
+          this.toFontChar[charCode] = GlyphsUnicode[glyphName];
+        }
+      } else {
+        for (charCode in this.toUnicode) {
+          this.toFontChar[charCode] = this.toUnicode[charCode].charCodeAt(0);
+        }
+      }
+      this.loadedName = fontName.split('-')[0];
+      this.loading = false;
+      return;
+    }
+
+    // Some fonts might use wrong font types for Type1C or CIDFontType0C
+    var subtype = properties.subtype;
+    if (subtype == 'Type1C' && (type != 'Type1' && type != 'MMType1')) {
+      // Some TrueType fonts by mistake claim Type1C
+      if (isTrueTypeFile(file)) {
+        subtype = 'TrueType';
+      } else {
+        type = 'Type1';
+      }
+    }
+    if (subtype == 'CIDFontType0C' && type != 'CIDFontType0') {
+      type = 'CIDFontType0';
+    }
+    // XXX: Temporarily change the type for open type so we trigger a warning.
+    // This should be removed when we add support for open type.
+    if (subtype === 'OpenType') {
+      type = 'OpenType';
+    }
+
+    var data;
+    switch (type) {
+      case 'Type1':
+      case 'CIDFontType0':
+        this.mimetype = 'font/opentype';
+
+        var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
+          new CFFFont(file, properties) : new Type1Font(name, file, properties);
+
+        adjustWidths(properties);
+
+        // Wrap the CFF data inside an OTF font file
+        data = this.convert(name, cff, properties);
+        break;
+
+      case 'OpenType':
+      case 'TrueType':
+      case 'CIDFontType2':
+        this.mimetype = 'font/opentype';
+
+        // Repair the TrueType file. It is can be damaged in the point of
+        // view of the sanitizer
+        data = this.checkAndRepair(name, file, properties);
+        break;
+
+      default:
+        error('Font ' + type + ' is not supported');
+        break;
+    }
+
+    this.data = data;
+
+    // Transfer some properties again that could change during font conversion
+    this.fontMatrix = properties.fontMatrix;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.encoding = properties.baseEncoding;
+    this.seacMap = properties.seacMap;
+
+    this.loading = true;
+  }
+
+  Font.getFontID = (function () {
+    var ID = 1;
+    return function Font_getFontID() {
+      return String(ID++);
+    };
+  })();
+
+  function int16(b0, b1) {
+    return (b0 << 8) + b1;
+  }
+
+  function int32(b0, b1, b2, b3) {
+    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+  }
+
+  function getMaxPower2(number) {
+    var maxPower = 0;
+    var value = number;
+    while (value >= 2) {
+      value /= 2;
+      maxPower++;
+    }
+
+    value = 2;
+    for (var i = 1; i < maxPower; i++) {
+      value *= 2;
+    }
+    return value;
+  }
+
+  function string16(value) {
+    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);
+  }
+
+  function safeString16(value) {
+    // clamp value to the 16-bit int range
+    value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value));
+    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);
+  }
+
+  function createOpenTypeHeader(sfnt, file, numTables) {
+    // Windows hates the Mac TrueType sfnt version number
+    if (sfnt == 'true') {
+      sfnt = string32(0x00010000);
+    }
+
+    // sfnt version (4 bytes)
+    var header = sfnt;
+
+    // numTables (2 bytes)
+    header += string16(numTables);
+
+    // searchRange (2 bytes)
+    var tablesMaxPower2 = getMaxPower2(numTables);
+    var searchRange = tablesMaxPower2 * 16;
+    header += string16(searchRange);
+
+    // entrySelector (2 bytes)
+    header += string16(Math.log(tablesMaxPower2) / Math.log(2));
+
+    // rangeShift (2 bytes)
+    header += string16(numTables * 16 - searchRange);
+
+    file.file += header;
+    file.virtualOffset += header.length;
+  }
+
+  function createTableEntry(file, tag, data) {
+    // offset
+    var offset = file.virtualOffset;
+
+    // length
+    var length = data.length;
+
+    // Per spec tables must be 4-bytes align so add padding as needed
+    while (data.length & 3) {
+      data.push(0x00);
+    }
+    while (file.virtualOffset & 3) {
+      file.virtualOffset++;
+    }
+
+    // checksum
+    var checksum = 0, n = data.length;
+    for (var i = 0; i < n; i += 4) {
+      checksum = (checksum + int32(data[i], data[i + 1], data[i + 2],
+                                   data[i + 3])) | 0;
+    }
+
+    var tableEntry = (tag + string32(checksum) +
+                      string32(offset) + string32(length));
+    file.file += tableEntry;
+    file.virtualOffset += data.length;
+  }
+
+  function isTrueTypeFile(file) {
+    var header = file.peekBytes(4);
+    return readUint32(header, 0) === 0x00010000;
+  }
+
+  /**
+   * Rebuilds the char code to glyph ID map by trying to replace the char codes
+   * with their unicode value. It also moves char codes that are in known
+   * problematic locations.
+   * @return {Object} Two properties:
+   * 'toFontChar' - maps original char codes(the value that will be read
+   * from commands such as show text) to the char codes that will be used in the
+   * font that we build
+   * 'charCodeToGlyphId' - maps the new font char codes to glyph ids
+   */
+  function adjustMapping(charCodeToGlyphId, properties) {
+    var toUnicode = properties.toUnicode;
+    var isSymbolic = !!(properties.flags & FontFlags.Symbolic);
+    var isIdentityUnicode = properties.isIdentityUnicode;
+    var newMap = Object.create(null);
+    var toFontChar = [];
+    var usedFontCharCodes = [];
+    var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START;
+    for (var originalCharCode in charCodeToGlyphId) {
+      originalCharCode |= 0;
+      var glyphId = charCodeToGlyphId[originalCharCode];
+      var fontCharCode = originalCharCode;
+      // First try to map the value to a unicode position if a non identity map
+      // was created.
+      if (!isIdentityUnicode && originalCharCode in toUnicode) {
+        var unicode = toUnicode[fontCharCode];
+        // TODO: Try to map ligatures to the correct spot.
+        if (unicode.length === 1) {
+          fontCharCode = unicode.charCodeAt(0);
+        }
+      }
+      // Try to move control characters, special characters and already mapped
+      // characters to the private use area since they will not be drawn by
+      // canvas if left in their current position. Also, move characters if the
+      // font was symbolic and there is only an identity unicode map since the
+      // characters probably aren't in the correct position (fixes an issue
+      // with firefox and thuluthfont).
+      if ((fontCharCode in usedFontCharCodes ||
+           fontCharCode <= 0x1f || // Control chars
+           fontCharCode === 0x7F || // Control char
+           fontCharCode === 0xAD || // Soft hyphen
+           (fontCharCode >= 0x80 && fontCharCode <= 0x9F) || // Control chars
+           (isSymbolic && isIdentityUnicode)) &&
+          nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left.
+        // Loop to try and find a free spot in the private use area.
+        do {
+          fontCharCode = nextAvailableFontCharCode++;
+
+          if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) {
+            fontCharCode = 0xF020;
+            nextAvailableFontCharCode = fontCharCode + 1;
+          }
+
+        } while (fontCharCode in usedFontCharCodes &&
+                 nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END);
+      }
+
+      newMap[fontCharCode] = glyphId;
+      toFontChar[originalCharCode] = fontCharCode;
+      usedFontCharCodes[fontCharCode] = true;
+    }
+    return {
+      toFontChar: toFontChar,
+      charCodeToGlyphId: newMap,
+      nextAvailableFontCharCode: nextAvailableFontCharCode
+    };
+  }
+
+  function getRanges(glyphs) {
+    // Array.sort() sorts by characters, not numerically, so convert to an
+    // array of characters.
+    var codes = [];
+    for (var charCode in glyphs) {
+      codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] });
+    }
+    codes.sort(function fontGetRangesSort(a, b) {
+      return a.fontCharCode - b.fontCharCode;
+    });
+
+    // Split the sorted codes into ranges.
+    var ranges = [];
+    var length = codes.length;
+    for (var n = 0; n < length; ) {
+      var start = codes[n].fontCharCode;
+      var codeIndices = [codes[n].glyphId];
+      ++n;
+      var end = start;
+      while (n < length && end + 1 == codes[n].fontCharCode) {
+        codeIndices.push(codes[n].glyphId);
+        ++end;
+        ++n;
+        if (end === 0xFFFF) {
+          break;
+        }
+      }
+      ranges.push([start, end, codeIndices]);
+    }
+
+    return ranges;
+  }
+
+  function createCmapTable(glyphs) {
+    var ranges = getRanges(glyphs);
+    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;
+    var cmap = '\x00\x00' + // version
+               string16(numTables) +  // numTables
+               '\x00\x03' + // platformID
+               '\x00\x01' + // encodingID
+               string32(4 + numTables * 8); // start of the table record
+
+    var i, ii, j, jj;
+    for (i = ranges.length - 1; i >= 0; --i) {
+      if (ranges[i][0] <= 0xFFFF) { break; }
+    }
+    var bmpLength = i + 1;
+
+    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {
+      ranges[i][1] = 0xFFFE;
+    }
+    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;
+    var segCount = bmpLength + trailingRangesCount;
+    var segCount2 = segCount * 2;
+    var searchRange = getMaxPower2(segCount) * 2;
+    var searchEntry = Math.log(segCount) / Math.log(2);
+    var rangeShift = 2 * segCount - searchRange;
+
+    // Fill up the 4 parallel arrays describing the segments.
+    var startCount = '';
+    var endCount = '';
+    var idDeltas = '';
+    var idRangeOffsets = '';
+    var glyphsIds = '';
+    var bias = 0;
+
+    var range, start, end, codes;
+    for (i = 0, ii = bmpLength; i < ii; i++) {
+      range = ranges[i];
+      start = range[0];
+      end = range[1];
+      startCount += string16(start);
+      endCount += string16(end);
+      codes = range[2];
+      var contiguous = true;
+      for (j = 1, jj = codes.length; j < jj; ++j) {
+        if (codes[j] !== codes[j - 1] + 1) {
+          contiguous = false;
+          break;
+        }
+      }
+      if (!contiguous) {
+        var offset = (segCount - i) * 2 + bias * 2;
+        bias += (end - start + 1);
+
+        idDeltas += string16(0);
+        idRangeOffsets += string16(offset);
+
+        for (j = 0, jj = codes.length; j < jj; ++j) {
+          glyphsIds += string16(codes[j]);
+        }
+      } else {
+        var startCode = codes[0];
+
+        idDeltas += string16((startCode - start) & 0xFFFF);
+        idRangeOffsets += string16(0);
+      }
+    }
+
+    if (trailingRangesCount > 0) {
+      endCount += '\xFF\xFF';
+      startCount += '\xFF\xFF';
+      idDeltas += '\x00\x01';
+      idRangeOffsets += '\x00\x00';
+    }
+
+    var format314 = '\x00\x00' + // language
+                    string16(segCount2) +
+                    string16(searchRange) +
+                    string16(searchEntry) +
+                    string16(rangeShift) +
+                    endCount + '\x00\x00' + startCount +
+                    idDeltas + idRangeOffsets + glyphsIds;
+
+    var format31012 = '';
+    var header31012 = '';
+    if (numTables > 1) {
+      cmap += '\x00\x03' + // platformID
+              '\x00\x0A' + // encodingID
+              string32(4 + numTables * 8 +
+                       4 + format314.length); // start of the table record
+      format31012 = '';
+      for (i = 0, ii = ranges.length; i < ii; i++) {
+        range = ranges[i];
+        start = range[0];
+        codes = range[2];
+        var code = codes[0];
+        for (j = 1, jj = codes.length; j < jj; ++j) {
+          if (codes[j] !== codes[j - 1] + 1) {
+            end = range[0] + j - 1;
+            format31012 += string32(start) + // startCharCode
+                           string32(end) + // endCharCode
+                           string32(code); // startGlyphID
+            start = end + 1;
+            code = codes[j];
+          }
+        }
+        format31012 += string32(start) + // startCharCode
+                       string32(range[1]) + // endCharCode
+                       string32(code); // startGlyphID
+      }
+      header31012 = '\x00\x0C' + // format
+                    '\x00\x00' + // reserved
+                    string32(format31012.length + 16) + // length
+                    '\x00\x00\x00\x00' + // language
+                    string32(format31012.length / 12); // nGroups
+    }
+
+    return stringToArray(cmap +
+                         '\x00\x04' + // format
+                         string16(format314.length + 4) + // length
+                         format314 + header31012 + format31012);
+  }
+
+  function validateOS2Table(os2) {
+    var stream = new Stream(os2.data);
+    var version = stream.getUint16();
+    // TODO verify all OS/2 tables fields, but currently we validate only those
+    // that give us issues
+    stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges
+    var selection = stream.getUint16();
+    if (version < 4 && (selection & 0x0300)) {
+      return false;
+    }
+    var firstChar = stream.getUint16();
+    var lastChar = stream.getUint16();
+    if (firstChar > lastChar) {
+      return false;
+    }
+    stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap
+    var usWinAscent = stream.getUint16();
+    if (usWinAscent === 0) { // makes font unreadable by windows
+      return false;
+    }
+
+    // OS/2 appears to be valid, resetting some fields
+    os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0
+    return true;
+  }
+
+  function createOS2Table(properties, charstrings, override) {
+    override = override || {
+      unitsPerEm: 0,
+      yMax: 0,
+      yMin: 0,
+      ascent: 0,
+      descent: 0
+    };
+
+    var ulUnicodeRange1 = 0;
+    var ulUnicodeRange2 = 0;
+    var ulUnicodeRange3 = 0;
+    var ulUnicodeRange4 = 0;
+
+    var firstCharIndex = null;
+    var lastCharIndex = 0;
+
+    if (charstrings) {
+      for (var code in charstrings) {
+        code |= 0;
+        if (firstCharIndex > code || !firstCharIndex) {
+          firstCharIndex = code;
+        }
+        if (lastCharIndex < code) {
+          lastCharIndex = code;
+        }
+
+        var position = getUnicodeRangeFor(code);
+        if (position < 32) {
+          ulUnicodeRange1 |= 1 << position;
+        } else if (position < 64) {
+          ulUnicodeRange2 |= 1 << position - 32;
+        } else if (position < 96) {
+          ulUnicodeRange3 |= 1 << position - 64;
+        } else if (position < 123) {
+          ulUnicodeRange4 |= 1 << position - 96;
+        } else {
+          error('Unicode ranges Bits > 123 are reserved for internal usage');
+        }
+      }
+    } else {
+      // TODO
+      firstCharIndex = 0;
+      lastCharIndex = 255;
+    }
+
+    var bbox = properties.bbox || [0, 0, 0, 0];
+    var unitsPerEm = (override.unitsPerEm ||
+                      1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]);
+
+    // if the font units differ to the PDF glyph space units
+    // then scale up the values
+    var scale = (properties.ascentScaled ? 1.0 :
+                 unitsPerEm / PDF_GLYPH_SPACE_UNITS);
+
+    var typoAscent = (override.ascent ||
+                      Math.round(scale * (properties.ascent || bbox[3])));
+    var typoDescent = (override.descent ||
+                       Math.round(scale * (properties.descent || bbox[1])));
+    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
+      typoDescent = -typoDescent; // fixing incorrect descent
+    }
+    var winAscent = override.yMax || typoAscent;
+    var winDescent = -override.yMin || -typoDescent;
+
+    return '\x00\x03' + // version
+           '\x02\x24' + // xAvgCharWidth
+           '\x01\xF4' + // usWeightClass
+           '\x00\x05' + // usWidthClass
+           '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
+           '\x02\x8A' + // ySubscriptXSize
+           '\x02\xBB' + // ySubscriptYSize
+           '\x00\x00' + // ySubscriptXOffset
+           '\x00\x8C' + // ySubscriptYOffset
+           '\x02\x8A' + // ySuperScriptXSize
+           '\x02\xBB' + // ySuperScriptYSize
+           '\x00\x00' + // ySuperScriptXOffset
+           '\x01\xDF' + // ySuperScriptYOffset
+           '\x00\x31' + // yStrikeOutSize
+           '\x01\x02' + // yStrikeOutPosition
+           '\x00\x00' + // sFamilyClass
+           '\x00\x00\x06' +
+           String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
+           '\x00\x00\x00\x00\x00\x00' + // Panose
+           string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
+           string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
+           string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
+           string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
+           '\x2A\x32\x31\x2A' + // achVendID
+           string16(properties.italicAngle ? 1 : 0) + // fsSelection
+           string16(firstCharIndex ||
+                    properties.firstChar) + // usFirstCharIndex
+           string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex
+           string16(typoAscent) + // sTypoAscender
+           string16(typoDescent) + // sTypoDescender
+           '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
+           string16(winAscent) + // usWinAscent
+           string16(winDescent) + // usWinDescent
+           '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
+           '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
+           string16(properties.xHeight) + // sxHeight
+           string16(properties.capHeight) + // sCapHeight
+           string16(0) + // usDefaultChar
+           string16(firstCharIndex || properties.firstChar) + // usBreakChar
+           '\x00\x03';  // usMaxContext
+  }
+
+  function createPostTable(properties) {
+    var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
+    return ('\x00\x03\x00\x00' + // Version number
+            string32(angle) + // italicAngle
+            '\x00\x00' + // underlinePosition
+            '\x00\x00' + // underlineThickness
+            string32(properties.fixedPitch) + // isFixedPitch
+            '\x00\x00\x00\x00' + // minMemType42
+            '\x00\x00\x00\x00' + // maxMemType42
+            '\x00\x00\x00\x00' + // minMemType1
+            '\x00\x00\x00\x00');  // maxMemType1
+  }
+
+  function createNameTable(name, proto) {
+    if (!proto) {
+      proto = [[], []]; // no strings and unicode strings
+    }
+
+    var strings = [
+      proto[0][0] || 'Original licence',  // 0.Copyright
+      proto[0][1] || name,                // 1.Font family
+      proto[0][2] || 'Unknown',           // 2.Font subfamily (font weight)
+      proto[0][3] || 'uniqueID',          // 3.Unique ID
+      proto[0][4] || name,                // 4.Full font name
+      proto[0][5] || 'Version 0.11',      // 5.Version
+      proto[0][6] || '',                  // 6.Postscript name
+      proto[0][7] || 'Unknown',           // 7.Trademark
+      proto[0][8] || 'Unknown',           // 8.Manufacturer
+      proto[0][9] || 'Unknown'            // 9.Designer
+    ];
+
+    // Mac want 1-byte per character strings while Windows want
+    // 2-bytes per character, so duplicate the names table
+    var stringsUnicode = [];
+    var i, ii, j, jj, str;
+    for (i = 0, ii = strings.length; i < ii; i++) {
+      str = proto[1][i] || strings[i];
+
+      var strBufUnicode = [];
+      for (j = 0, jj = str.length; j < jj; j++) {
+        strBufUnicode.push(string16(str.charCodeAt(j)));
+      }
+      stringsUnicode.push(strBufUnicode.join(''));
+    }
+
+    var names = [strings, stringsUnicode];
+    var platforms = ['\x00\x01', '\x00\x03'];
+    var encodings = ['\x00\x00', '\x00\x01'];
+    var languages = ['\x00\x00', '\x04\x09'];
+
+    var namesRecordCount = strings.length * platforms.length;
+    var nameTable =
+      '\x00\x00' +                           // format
+      string16(namesRecordCount) +           // Number of names Record
+      string16(namesRecordCount * 12 + 6);   // Storage
+
+    // Build the name records field
+    var strOffset = 0;
+    for (i = 0, ii = platforms.length; i < ii; i++) {
+      var strs = names[i];
+      for (j = 0, jj = strs.length; j < jj; j++) {
+        str = strs[j];
+        var nameRecord =
+          platforms[i] + // platform ID
+          encodings[i] + // encoding ID
+          languages[i] + // language ID
+          string16(j) + // name ID
+          string16(str.length) +
+          string16(strOffset);
+        nameTable += nameRecord;
+        strOffset += str.length;
+      }
+    }
+
+    nameTable += strings.join('') + stringsUnicode.join('');
+    return nameTable;
+  }
+
+  Font.prototype = {
+    name: null,
+    font: null,
+    mimetype: null,
+    encoding: null,
+    get renderer() {
+      var renderer = FontRendererFactory.create(this);
+      return shadow(this, 'renderer', renderer);
+    },
+
+    exportData: function Font_exportData() {
+      var data = {};
+      for (var i in this) {
+        if (this.hasOwnProperty(i)) {
+          data[i] = this[i];
+        }
+      }
+      return data;
+    },
+
+    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
+      function readTableEntry(file) {
+        var tag = bytesToString(file.getBytes(4));
+
+        var checksum = file.getInt32();
+        var offset = file.getInt32() >>> 0;
+        var length = file.getInt32() >>> 0;
+
+        // Read the table associated data
+        var previousPosition = file.pos;
+        file.pos = file.start ? file.start : 0;
+        file.skip(offset);
+        var data = file.getBytes(length);
+        file.pos = previousPosition;
+
+        if (tag == 'head') {
+          // clearing checksum adjustment
+          data[8] = data[9] = data[10] = data[11] = 0;
+          data[17] |= 0x20; //Set font optimized for cleartype flag
+        }
+
+        return {
+          tag: tag,
+          checksum: checksum,
+          length: length,
+          offset: offset,
+          data: data
+        };
+      }
+
+      function readOpenTypeHeader(ttf) {
+        return {
+          version: bytesToString(ttf.getBytes(4)),
+          numTables: ttf.getUint16(),
+          searchRange: ttf.getUint16(),
+          entrySelector: ttf.getUint16(),
+          rangeShift: ttf.getUint16()
+        };
+      }
+
+      /**
+       * Read the appropriate subtable from the cmap according to 9.6.6.4 from
+       * PDF spec
+       */
+      function readCmapTable(cmap, font, isSymbolicFont) {
+        var segment;
+        var start = (font.start ? font.start : 0) + cmap.offset;
+        font.pos = start;
+
+        var version = font.getUint16();
+        var numTables = font.getUint16();
+
+        var potentialTable;
+        var canBreak = false;
+        // There's an order of preference in terms of which cmap subtable to
+        // use:
+        // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table
+        // - symbolic fonts the preference is a 3,0 table then a 1,0 table
+        // The following takes advantage of the fact that the tables are sorted
+        // to work.
+        for (var i = 0; i < numTables; i++) {
+          var platformId = font.getUint16();
+          var encodingId = font.getUint16();
+          var offset = font.getInt32() >>> 0;
+          var useTable = false;
+
+          if (platformId == 1 && encodingId === 0) {
+            useTable = true;
+            // Continue the loop since there still may be a higher priority
+            // table.
+          } else if (!isSymbolicFont && platformId === 3 && encodingId === 1) {
+            useTable = true;
+            canBreak = true;
+          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
+            useTable = true;
+            canBreak = true;
+          }
+
+          if (useTable) {
+            potentialTable = {
+              platformId: platformId,
+              encodingId: encodingId,
+              offset: offset
+            };
+          }
+          if (canBreak) {
+            break;
+          }
+        }
+
+        if (!potentialTable) {
+          warn('Could not find a preferred cmap table.');
+          return [];
+        }
+
+        font.pos = start + potentialTable.offset;
+        var format = font.getUint16();
+        var length = font.getUint16();
+        var language = font.getUint16();
+
+        var hasShortCmap = false;
+        var mappings = [];
+        var j, glyphId;
+
+        // TODO(mack): refactor this cmap subtable reading logic out
+        if (format === 0) {
+          for (j = 0; j < 256; j++) {
+            var index = font.getByte();
+            if (!index) {
+              continue;
+            }
+            mappings.push({
+              charCode: j,
+              glyphId: index
+            });
+          }
+          hasShortCmap = true;
+        } else if (format === 4) {
+          // re-creating the table in format 4 since the encoding
+          // might be changed
+          var segCount = (font.getUint16() >> 1);
+          font.getBytes(6); // skipping range fields
+          var segIndex, segments = [];
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segments.push({ end: font.getUint16() });
+          }
+          font.getUint16();
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segments[segIndex].start = font.getUint16();
+          }
+
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segments[segIndex].delta = font.getUint16();
+          }
+
+          var offsetsCount = 0;
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segment = segments[segIndex];
+            var rangeOffset = font.getUint16();
+            if (!rangeOffset) {
+              segment.offsetIndex = -1;
+              continue;
+            }
+
+            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+            segment.offsetIndex = offsetIndex;
+            offsetsCount = Math.max(offsetsCount, offsetIndex +
+                                    segment.end - segment.start + 1);
+          }
+
+          var offsets = [];
+          for (j = 0; j < offsetsCount; j++) {
+            offsets.push(font.getUint16());
+          }
+
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segment = segments[segIndex];
+            start = segment.start;
+            var end = segment.end;
+            var delta = segment.delta;
+            offsetIndex = segment.offsetIndex;
+
+            for (j = start; j <= end; j++) {
+              if (j == 0xFFFF) {
+                continue;
+              }
+
+              glyphId = (offsetIndex < 0 ?
+                         j : offsets[offsetIndex + j - start]);
+              glyphId = (glyphId + delta) & 0xFFFF;
+              if (glyphId === 0) {
+                continue;
+              }
+              mappings.push({
+                charCode: j,
+                glyphId: glyphId
+              });
+            }
+          }
+        } else if (format == 6) {
+          // Format 6 is a 2-bytes dense mapping, which means the font data
+          // lives glue together even if they are pretty far in the unicode
+          // table. (This looks weird, so I can have missed something), this
+          // works on Linux but seems to fails on Mac so let's rewrite the
+          // cmap table to a 3-1-4 style
+          var firstCode = font.getUint16();
+          var entryCount = font.getUint16();
+
+          for (j = 0; j < entryCount; j++) {
+            glyphId = font.getUint16();
+            var charCode = firstCode + j;
+
+            mappings.push({
+              charCode: charCode,
+              glyphId: glyphId
+            });
+          }
+        } else {
+          error('cmap table has unsupported format: ' + format);
+        }
+
+        // removing duplicate entries
+        mappings.sort(function (a, b) {
+          return a.charCode - b.charCode;
+        });
+        for (i = 1; i < mappings.length; i++) {
+          if (mappings[i - 1].charCode === mappings[i].charCode) {
+            mappings.splice(i, 1);
+            i--;
+          }
+        }
+
+        return {
+          platformId: potentialTable.platformId,
+          encodingId: potentialTable.encodingId,
+          mappings: mappings,
+          hasShortCmap: hasShortCmap
+        };
+      }
+
+      function sanitizeMetrics(font, header, metrics, numGlyphs) {
+        if (!header) {
+          if (metrics) {
+            metrics.data = null;
+          }
+          return;
+        }
+
+        font.pos = (font.start ? font.start : 0) + header.offset;
+        font.pos += header.length - 2;
+        var numOfMetrics = font.getUint16();
+
+        if (numOfMetrics > numGlyphs) {
+          info('The numOfMetrics (' + numOfMetrics + ') should not be ' +
+               'greater than the numGlyphs (' + numGlyphs + ')');
+          // Reduce numOfMetrics if it is greater than numGlyphs
+          numOfMetrics = numGlyphs;
+          header.data[34] = (numOfMetrics & 0xff00) >> 8;
+          header.data[35] = numOfMetrics & 0x00ff;
+        }
+
+        var numOfSidebearings = numGlyphs - numOfMetrics;
+        var numMissing = numOfSidebearings -
+          ((metrics.length - numOfMetrics * 4) >> 1);
+
+        var i, ii;
+        if (numMissing > 0) {
+          font.pos = (font.start ? font.start : 0) + metrics.offset;
+          var entries = '';
+          for (i = 0, ii = metrics.length; i < ii; i++) {
+            entries += String.fromCharCode(font.getByte());
+          }
+          for (i = 0; i < numMissing; i++) {
+            entries += '\x00\x00';
+          }
+          metrics.data = stringToArray(entries);
+        }
+      }
+
+      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart,
+                             hintsValid) {
+        if (sourceEnd - sourceStart <= 12) {
+          // glyph with data less than 12 is invalid one
+          return 0;
+        }
+        var glyf = source.subarray(sourceStart, sourceEnd);
+        var contoursCount = (glyf[0] << 8) | glyf[1];
+        if (contoursCount & 0x8000) {
+          // complex glyph, writing as is
+          dest.set(glyf, destStart);
+          return glyf.length;
+        }
+
+        var i, j = 10, flagsCount = 0;
+        for (i = 0; i < contoursCount; i++) {
+          var endPoint = (glyf[j] << 8) | glyf[j + 1];
+          flagsCount = endPoint + 1;
+          j += 2;
+        }
+        // skipping instructions
+        var instructionsStart = j;
+        var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
+        j += 2 + instructionsLength;
+        var instructionsEnd = j;
+        // validating flags
+        var coordinatesLength = 0;
+        for (i = 0; i < flagsCount; i++) {
+          var flag = glyf[j++];
+          if (flag & 0xC0) {
+            // reserved flags must be zero, cleaning up
+            glyf[j - 1] = flag & 0x3F;
+          }
+          var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
+                         ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
+          coordinatesLength += xyLength;
+          if (flag & 8) {
+            var repeat = glyf[j++];
+            i += repeat;
+            coordinatesLength += repeat * xyLength;
+          }
+        }
+        // glyph without coordinates will be rejected
+        if (coordinatesLength === 0) {
+          return 0;
+        }
+        var glyphDataLength = j + coordinatesLength;
+        if (glyphDataLength > glyf.length) {
+          // not enough data for coordinates
+          return 0;
+        }
+        if (!hintsValid && instructionsLength > 0) {
+          dest.set(glyf.subarray(0, instructionsStart), destStart);
+          dest.set([0, 0], destStart + instructionsStart);
+          dest.set(glyf.subarray(instructionsEnd, glyphDataLength),
+                   destStart + instructionsStart + 2);
+          glyphDataLength -= instructionsLength;
+          if (glyf.length - glyphDataLength > 3) {
+            glyphDataLength = (glyphDataLength + 3) & ~3;
+          }
+          return glyphDataLength;
+        }
+        if (glyf.length - glyphDataLength > 3) {
+          // truncating and aligning to 4 bytes the long glyph data
+          glyphDataLength = (glyphDataLength + 3) & ~3;
+          dest.set(glyf.subarray(0, glyphDataLength), destStart);
+          return glyphDataLength;
+        }
+        // glyph data is fine
+        dest.set(glyf, destStart);
+        return glyf.length;
+      }
+
+      function sanitizeHead(head, numGlyphs, locaLength) {
+        var data = head.data;
+
+        // Validate version:
+        // Should always be 0x00010000
+        var version = int32(data[0], data[1], data[2], data[3]);
+        if (version >> 16 !== 1) {
+          info('Attempting to fix invalid version in head table: ' + version);
+          data[0] = 0;
+          data[1] = 1;
+          data[2] = 0;
+          data[3] = 0;
+        }
+
+        var indexToLocFormat = int16(data[50], data[51]);
+        if (indexToLocFormat < 0 || indexToLocFormat > 1) {
+          info('Attempting to fix invalid indexToLocFormat in head table: ' +
+               indexToLocFormat);
+
+          // The value of indexToLocFormat should be 0 if the loca table
+          // consists of short offsets, and should be 1 if the loca table
+          // consists of long offsets.
+          //
+          // The number of entries in the loca table should be numGlyphs + 1.
+          //
+          // Using this information, we can work backwards to deduce if the
+          // size of each offset in the loca table, and thus figure out the
+          // appropriate value for indexToLocFormat.
+
+          var numGlyphsPlusOne = numGlyphs + 1;
+          if (locaLength === numGlyphsPlusOne << 1) {
+            // 0x0000 indicates the loca table consists of short offsets
+            data[50] = 0;
+            data[51] = 0;
+          } else if (locaLength === numGlyphsPlusOne << 2) {
+            // 0x0001 indicates the loca table consists of long offsets
+            data[50] = 0;
+            data[51] = 1;
+          } else {
+            warn('Could not fix indexToLocFormat: ' + indexToLocFormat);
+          }
+        }
+      }
+
+      function sanitizeGlyphLocations(loca, glyf, numGlyphs,
+                                      isGlyphLocationsLong, hintsValid,
+                                      dupFirstEntry) {
+        var itemSize, itemDecode, itemEncode;
+        if (isGlyphLocationsLong) {
+          itemSize = 4;
+          itemDecode = function fontItemDecodeLong(data, offset) {
+            return (data[offset] << 24) | (data[offset + 1] << 16) |
+                   (data[offset + 2] << 8) | data[offset + 3];
+          };
+          itemEncode = function fontItemEncodeLong(data, offset, value) {
+            data[offset] = (value >>> 24) & 0xFF;
+            data[offset + 1] = (value >> 16) & 0xFF;
+            data[offset + 2] = (value >> 8) & 0xFF;
+            data[offset + 3] = value & 0xFF;
+          };
+        } else {
+          itemSize = 2;
+          itemDecode = function fontItemDecode(data, offset) {
+            return (data[offset] << 9) | (data[offset + 1] << 1);
+          };
+          itemEncode = function fontItemEncode(data, offset, value) {
+            data[offset] = (value >> 9) & 0xFF;
+            data[offset + 1] = (value >> 1) & 0xFF;
+          };
+        }
+        var locaData = loca.data;
+        var locaDataSize = itemSize * (1 + numGlyphs);
+        // is loca.data too short or long?
+        if (locaData.length !== locaDataSize) {
+          locaData = new Uint8Array(locaDataSize);
+          locaData.set(loca.data.subarray(0, locaDataSize));
+          loca.data = locaData;
+        }
+        // removing the invalid glyphs
+        var oldGlyfData = glyf.data;
+        var oldGlyfDataLength = oldGlyfData.length;
+        var newGlyfData = new Uint8Array(oldGlyfDataLength);
+        var startOffset = itemDecode(locaData, 0);
+        var writeOffset = 0;
+        itemEncode(locaData, 0, writeOffset);
+        var i, j;
+        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+          var endOffset = itemDecode(locaData, j);
+          if (endOffset > oldGlyfDataLength &&
+              ((oldGlyfDataLength + 3) & ~3) === endOffset) {
+            // Aspose breaks fonts by aligning the glyphs to the qword, but not
+            // the glyf table size, which makes last glyph out of range.
+            endOffset = oldGlyfDataLength;
+          }
+          if (endOffset > oldGlyfDataLength) {
+            // glyph end offset points outside glyf data, rejecting the glyph
+            itemEncode(locaData, j, writeOffset);
+            startOffset = endOffset;
+            continue;
+          }
+
+          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
+                                        newGlyfData, writeOffset, hintsValid);
+          writeOffset += newLength;
+          itemEncode(locaData, j, writeOffset);
+          startOffset = endOffset;
+        }
+
+        if (writeOffset === 0) {
+          // glyf table cannot be empty -- redoing the glyf and loca tables
+          // to have single glyph with one point
+          var simpleGlyph = new Uint8Array(
+            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
+          for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+            itemEncode(locaData, j, simpleGlyph.length);
+          }
+          glyf.data = simpleGlyph;
+          return;
+        }
+
+        if (dupFirstEntry) {
+          var firstEntryLength = itemDecode(locaData, itemSize);
+          if (newGlyfData.length > firstEntryLength + writeOffset) {
+            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
+          } else {
+            glyf.data = new Uint8Array(firstEntryLength + writeOffset);
+            glyf.data.set(newGlyfData.subarray(0, writeOffset));
+          }
+          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
+          itemEncode(loca.data, locaData.length - itemSize,
+                     writeOffset + firstEntryLength);
+        } else {
+          glyf.data = newGlyfData.subarray(0, writeOffset);
+        }
+      }
+
+      function readPostScriptTable(post, properties, maxpNumGlyphs) {
+        var start = (font.start ? font.start : 0) + post.offset;
+        font.pos = start;
+
+        var length = post.length, end = start + length;
+        var version = font.getInt32();
+        // skip rest to the tables
+        font.getBytes(28);
+
+        var glyphNames;
+        var valid = true;
+        var i;
+
+        switch (version) {
+          case 0x00010000:
+            glyphNames = MacStandardGlyphOrdering;
+            break;
+          case 0x00020000:
+            var numGlyphs = font.getUint16();
+            if (numGlyphs != maxpNumGlyphs) {
+              valid = false;
+              break;
+            }
+            var glyphNameIndexes = [];
+            for (i = 0; i < numGlyphs; ++i) {
+              var index = font.getUint16();
+              if (index >= 32768) {
+                valid = false;
+                break;
+              }
+              glyphNameIndexes.push(index);
+            }
+            if (!valid) {
+              break;
+            }
+            var customNames = [];
+            while (font.pos < end) {
+              var stringLength = font.getByte();
+              var string = '';
+              for (i = 0; i < stringLength; ++i) {
+                string += String.fromCharCode(font.getByte());
+              }
+              customNames.push(string);
+            }
+            glyphNames = [];
+            for (i = 0; i < numGlyphs; ++i) {
+              var j = glyphNameIndexes[i];
+              if (j < 258) {
+                glyphNames.push(MacStandardGlyphOrdering[j]);
+                continue;
+              }
+              glyphNames.push(customNames[j - 258]);
+            }
+            break;
+          case 0x00030000:
+            break;
+          default:
+            warn('Unknown/unsupported post table version ' + version);
+            valid = false;
+            break;
+        }
+        properties.glyphNames = glyphNames;
+        return valid;
+      }
+
+      function readNameTable(nameTable) {
+        var start = (font.start ? font.start : 0) + nameTable.offset;
+        font.pos = start;
+
+        var names = [[], []];
+        var length = nameTable.length, end = start + length;
+        var format = font.getUint16();
+        var FORMAT_0_HEADER_LENGTH = 6;
+        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
+          // unsupported name table format or table "too" small
+          return names;
+        }
+        var numRecords = font.getUint16();
+        var stringsStart = font.getUint16();
+        var records = [];
+        var NAME_RECORD_LENGTH = 12;
+        var i, ii;
+
+        for (i = 0; i < numRecords &&
+                        font.pos + NAME_RECORD_LENGTH <= end; i++) {
+          var r = {
+            platform: font.getUint16(),
+            encoding: font.getUint16(),
+            language: font.getUint16(),
+            name: font.getUint16(),
+            length: font.getUint16(),
+            offset: font.getUint16()
+          };
+          // using only Macintosh and Windows platform/encoding names
+          if ((r.platform == 1 && r.encoding === 0 && r.language === 0) ||
+              (r.platform == 3 && r.encoding == 1 && r.language == 0x409)) {
+            records.push(r);
+          }
+        }
+        for (i = 0, ii = records.length; i < ii; i++) {
+          var record = records[i];
+          var pos = start + stringsStart + record.offset;
+          if (pos + record.length > end) {
+            continue; // outside of name table, ignoring
+          }
+          font.pos = pos;
+          var nameIndex = record.name;
+          if (record.encoding) {
+            // unicode
+            var str = '';
+            for (var j = 0, jj = record.length; j < jj; j += 2) {
+              str += String.fromCharCode(font.getUint16());
+            }
+            names[1][nameIndex] = str;
+          } else {
+            names[0][nameIndex] = bytesToString(font.getBytes(record.length));
+          }
+        }
+        return names;
+      }
+
+      var TTOpsStackDeltas = [
+        0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5,
+        -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1,
+        1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1,
+        0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2,
+        0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1,
+        -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1,
+        -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1,
+        -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];
+        // 0xC0-DF == -1 and 0xE0-FF == -2
+
+      function sanitizeTTProgram(table, ttContext) {
+        var data = table.data;
+        var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0;
+        var stack = [];
+        var callstack = [];
+        var functionsCalled = [];
+        var tooComplexToFollowFunctions =
+          ttContext.tooComplexToFollowFunctions;
+        var inFDEF = false, ifLevel = 0, inELSE = 0;
+        for (var ii = data.length; i < ii;) {
+          var op = data[i++];
+          // The TrueType instruction set docs can be found at
+          // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html
+          if (op === 0x40) { // NPUSHB - pushes n bytes
+            n = data[i++];
+            if (inFDEF || inELSE) {
+              i += n;
+            } else {
+              for (j = 0; j < n; j++) {
+                stack.push(data[i++]);
+              }
+            }
+          } else if (op === 0x41) { // NPUSHW - pushes n words
+            n = data[i++];
+            if (inFDEF || inELSE) {
+              i += n * 2;
+            } else {
+              for (j = 0; j < n; j++) {
+                b = data[i++];
+                stack.push((b << 8) | data[i++]);
+              }
+            }
+          } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes
+            n = op - 0xB0 + 1;
+            if (inFDEF || inELSE) {
+              i += n;
+            } else {
+              for (j = 0; j < n; j++) {
+                stack.push(data[i++]);
+              }
+            }
+          } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words
+            n = op - 0xB8 + 1;
+            if (inFDEF || inELSE) {
+              i += n * 2;
+            } else {
+              for (j = 0; j < n; j++) {
+                b = data[i++];
+                stack.push((b << 8) | data[i++]);
+              }
+            }
+          } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL
+            if (!inFDEF && !inELSE) {
+              // collecting inforamtion about which functions are used
+              funcId = stack[stack.length - 1];
+              ttContext.functionsUsed[funcId] = true;
+              if (funcId in ttContext.functionsStackDeltas) {
+                stack.length += ttContext.functionsStackDeltas[funcId];
+              } else if (funcId in ttContext.functionsDefined &&
+                         functionsCalled.indexOf(funcId) < 0) {
+                callstack.push({data: data, i: i, stackTop: stack.length - 1});
+                functionsCalled.push(funcId);
+                pc = ttContext.functionsDefined[funcId];
+                if (!pc) {
+                  warn('TT: CALL non-existent function');
+                  ttContext.hintsValid = false;
+                  return;
+                }
+                data = pc.data;
+                i = pc.i;
+              }
+            }
+          } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF
+            if (inFDEF || inELSE) {
+              warn('TT: nested FDEFs not allowed');
+              tooComplexToFollowFunctions = true;
+            }
+            inFDEF = true;
+            // collecting inforamtion about which functions are defined
+            lastDeff = i;
+            funcId = stack.pop();
+            ttContext.functionsDefined[funcId] = {data: data, i: i};
+          } else if (op === 0x2D) { // ENDF - end of function
+            if (inFDEF) {
+              inFDEF = false;
+              lastEndf = i;
+            } else {
+              pc = callstack.pop();
+              if (!pc) {
+                warn('TT: ENDF bad stack');
+                ttContext.hintsValid = false;
+                return;
+              }
+              funcId = functionsCalled.pop();
+              data = pc.data;
+              i = pc.i;
+              ttContext.functionsStackDeltas[funcId] =
+                stack.length - pc.stackTop;
+            }
+          } else if (op === 0x89) { // IDEF - instruction definition
+            if (inFDEF || inELSE) {
+              warn('TT: nested IDEFs not allowed');
+              tooComplexToFollowFunctions = true;
+            }
+            inFDEF = true;
+            // recording it as a function to track ENDF
+            lastDeff = i;
+          } else if (op === 0x58) { // IF
+            ++ifLevel;
+          } else if (op === 0x1B) { // ELSE
+            inELSE = ifLevel;
+          } else if (op === 0x59) { // EIF
+            if (inELSE === ifLevel) {
+              inELSE = 0;
+            }
+            --ifLevel;
+          } else if (op === 0x1C) { // JMPR
+            if (!inFDEF && !inELSE) {
+              var offset = stack[stack.length - 1];
+              // only jumping forward to prevent infinite loop
+              if (offset > 0) {
+                i += offset - 1;
+              }
+            }
+          }
+          // Adjusting stack not extactly, but just enough to get function id
+          if (!inFDEF && !inELSE) {
+            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] :
+              op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;
+            if (op >= 0x71 && op <= 0x75) {
+              n = stack.pop();
+              if (n === n) {
+                stackDelta = -n * 2;
+              }
+            }
+            while (stackDelta < 0 && stack.length > 0) {
+              stack.pop();
+              stackDelta++;
+            }
+            while (stackDelta > 0) {
+              stack.push(NaN); // pushing any number into stack
+              stackDelta--;
+            }
+          }
+        }
+        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
+        var content = [data];
+        if (i > data.length) {
+          content.push(new Uint8Array(i - data.length));
+        }
+        if (lastDeff > lastEndf) {
+          warn('TT: complementing a missing function tail');
+          // new function definition started, but not finished
+          // complete function by [CLEAR, ENDF]
+          content.push(new Uint8Array([0x22, 0x2D]));
+        }
+        foldTTTable(table, content);
+      }
+
+      function checkInvalidFunctions(ttContext, maxFunctionDefs) {
+        if (ttContext.tooComplexToFollowFunctions) {
+          return;
+        }
+        if (ttContext.functionsDefined.length > maxFunctionDefs) {
+          warn('TT: more functions defined than expected');
+          ttContext.hintsValid = false;
+          return;
+        }
+        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
+          if (j > maxFunctionDefs) {
+            warn('TT: invalid function id: ' + j);
+            ttContext.hintsValid = false;
+            return;
+          }
+          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
+            warn('TT: undefined function: ' + j);
+            ttContext.hintsValid = false;
+            return;
+          }
+        }
+      }
+
+      function foldTTTable(table, content) {
+        if (content.length > 1) {
+          // concatenating the content items
+          var newLength = 0;
+          var j, jj;
+          for (j = 0, jj = content.length; j < jj; j++) {
+            newLength += content[j].length;
+          }
+          newLength = (newLength + 3) & ~3;
+          var result = new Uint8Array(newLength);
+          var pos = 0;
+          for (j = 0, jj = content.length; j < jj; j++) {
+            result.set(content[j], pos);
+            pos += content[j].length;
+          }
+          table.data = result;
+          table.length = newLength;
+        }
+      }
+
+      function sanitizeTTPrograms(fpgm, prep, cvt) {
+        var ttContext = {
+          functionsDefined: [],
+          functionsUsed: [],
+          functionsStackDeltas: [],
+          tooComplexToFollowFunctions: false,
+          hintsValid: true
+        };
+        if (fpgm) {
+          sanitizeTTProgram(fpgm, ttContext);
+        }
+        if (prep) {
+          sanitizeTTProgram(prep, ttContext);
+        }
+        if (fpgm) {
+          checkInvalidFunctions(ttContext, maxFunctionDefs);
+        }
+        if (cvt && (cvt.length & 1)) {
+          var cvtData = new Uint8Array(cvt.length + 1);
+          cvtData.set(cvt.data);
+          cvt.data = cvtData;
+        }
+        return ttContext.hintsValid;
+      }
+
+      // The following steps modify the original font data, making copy
+      font = new Stream(new Uint8Array(font.getBytes()));
+
+      var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp',
+        'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];
+
+      var header = readOpenTypeHeader(font);
+      var numTables = header.numTables;
+      var cff, cffFile;
+
+      var tables = { 'OS/2': null, cmap: null, head: null, hhea: null,
+                     hmtx: null, maxp: null, name: null, post: null };
+      var table, tableData;
+      for (var i = 0; i < numTables; i++) {
+        table = readTableEntry(font);
+        if (VALID_TABLES.indexOf(table.tag) < 0) {
+          continue; // skipping table if it's not a required or optional table
+        }
+        if (table.length === 0) {
+          continue; // skipping empty tables
+        }
+        tables[table.tag] = table;
+      }
+
+      var isTrueType = !tables['CFF '];
+      if (!isTrueType) {
+        // OpenType font
+        if (!tables.head || !tables.hhea || !tables.maxp || !tables.post) {
+          // no major tables: throwing everything at CFFFont
+          cffFile = new Stream(tables['CFF '].data);
+          cff = new CFFFont(cffFile, properties);
+
+          return this.convert(name, cff, properties);
+        }
+
+        delete tables.glyf;
+        delete tables.loca;
+        delete tables.fpgm;
+        delete tables.prep;
+        delete tables['cvt '];
+      } else {
+        if (!tables.glyf || !tables.loca) {
+          error('Required "glyf" or "loca" tables are not found');
+        }
+      }
+
+      if (!tables.maxp) {
+        error('Required "maxp" table is not found');
+      }
+
+      font.pos = (font.start || 0) + tables.maxp.offset;
+      var version = font.getInt32();
+      var numGlyphs = font.getUint16();
+      var maxFunctionDefs = 0;
+      if (version >= 0x00010000 && tables.maxp.length >= 22) {
+        // maxZones can be invalid
+        font.pos += 8;
+        var maxZones = font.getUint16();
+        if (maxZones > 2) { // reset to 2 if font has invalid maxZones
+          tables.maxp.data[14] = 0;
+          tables.maxp.data[15] = 2;
+        }
+        font.pos += 4;
+        maxFunctionDefs = font.getUint16();
+      }
+
+      var dupFirstEntry = false;
+      if (properties.type == 'CIDFontType2' && properties.toUnicode &&
+          properties.toUnicode[0] > '\u0000') {
+        // oracle's defect (see 3427), duplicating first entry
+        dupFirstEntry = true;
+        numGlyphs++;
+        tables.maxp.data[4] = numGlyphs >> 8;
+        tables.maxp.data[5] = numGlyphs & 255;
+      }
+
+      var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep,
+                                          tables['cvt '], maxFunctionDefs);
+      if (!hintsValid) {
+        delete tables.fpgm;
+        delete tables.prep;
+        delete tables['cvt '];
+      }
+
+      // Tables needs to be written by ascendant alphabetic order
+      var tablesNames = Object.keys(tables);
+      tablesNames.sort();
+
+      numTables = tablesNames.length;
+
+      // header and new offsets. Table entry information is appended to the
+      // end of file. The virtualOffset represents where to put the actual
+      // data of a particular table;
+      var ttf = {
+        file: '',
+        virtualOffset: numTables * (4 * 4)
+      };
+
+      // The new numbers of tables will be the last one plus the num
+      // of missing tables
+      createOpenTypeHeader(header.version, ttf, numTables);
+
+      // Ensure the hmtx table contains the advance width and
+      // sidebearings information for numGlyphs in the maxp table
+      sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphs);
+
+      if (!tables.head) {
+        error('Required "head" table is not found');
+      }
+
+      sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);
+
+      if (isTrueType) {
+        var isGlyphLocationsLong = int16(tables.head.data[50],
+                                         tables.head.data[51]);
+        sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs,
+                               isGlyphLocationsLong, hintsValid, dupFirstEntry);
+      }
+
+      if (!tables.hhea) {
+        error('Required "hhea" table is not found');
+      }
+
+      // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
+      // Sometimes it's 0. That needs to be fixed
+      if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {
+        tables.hhea.data[10] = 0xFF;
+        tables.hhea.data[11] = 0xFF;
+      }
+
+      // The 'post' table has glyphs names.
+      if (tables.post) {
+        var valid = readPostScriptTable(tables.post, properties, numGlyphs);
+        if (!valid) {
+          tables.post = null;
+        }
+      }
+
+      var charCodeToGlyphId = [], charCode;
+      if (properties.type == 'CIDFontType2') {
+        var cidToGidMap = properties.cidToGidMap || [];
+        var cMap = properties.cMap.map;
+        for (charCode in cMap) {
+          charCode |= 0;
+          var cid = cMap[charCode];
+          assert(cid.length === 1, 'Max size of CID is 65,535');
+          cid = cid.charCodeAt(0);
+          var glyphId = -1;
+          if (cidToGidMap.length === 0) {
+            glyphId = charCode;
+          } else if (cid in cidToGidMap) {
+            glyphId = cidToGidMap[cid];
+          }
+          if (glyphId >= 0 && glyphId < numGlyphs) {
+            charCodeToGlyphId[charCode] = glyphId;
+          }
+        }
+        if (dupFirstEntry) {
+          charCodeToGlyphId[0] = numGlyphs - 1;
+        }
+      } else {
+        // Most of the following logic in this code branch is based on the
+        // 9.6.6.4 of the PDF spec.
+        var cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont);
+        var cmapPlatformId = cmapTable.platformId;
+        var cmapEncodingId = cmapTable.encodingId;
+        var cmapMappings = cmapTable.mappings;
+        var cmapMappingsLength = cmapMappings.length;
+        var hasEncoding = properties.differences.length ||
+                          !!properties.baseEncodingName;
+
+        // The spec seems to imply that if the font is symbolic the encoding
+        // should be ignored, this doesn't appear to work for 'preistabelle.pdf'
+        // where the the font is symbolic and it has an encoding.
+        if (hasEncoding &&
+            (cmapPlatformId === 3 && cmapEncodingId === 1 ||
+             cmapPlatformId === 1 && cmapEncodingId === 0)) {
+          var baseEncoding = [];
+          if (properties.baseEncodingName === 'MacRomanEncoding' ||
+              properties.baseEncodingName === 'WinAnsiEncoding') {
+            baseEncoding = Encodings[properties.baseEncodingName];
+          }
+          for (charCode = 0; charCode < 256; charCode++) {
+            var glyphName;
+            if (this.differences && charCode in this.differences) {
+              glyphName = this.differences[charCode];
+            } else if (charCode in baseEncoding &&
+                       baseEncoding[charCode] !== '') {
+              glyphName = baseEncoding[charCode];
+            } else {
+              glyphName = Encodings.StandardEncoding[charCode];
+            }
+            if (!glyphName) {
+              continue;
+            }
+            var unicodeOrCharCode;
+            if (cmapPlatformId === 3 && cmapEncodingId === 1) {
+              unicodeOrCharCode = GlyphsUnicode[glyphName];
+            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
+              // TODO: the encoding needs to be updated with mac os table.
+              unicodeOrCharCode = Encodings.MacRomanEncoding.indexOf(glyphName);
+            }
+
+            var found = false;
+            for (i = 0; i < cmapMappingsLength; ++i) {
+              if (cmapMappings[i].charCode === unicodeOrCharCode) {
+                charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
+                found = true;
+                break;
+              }
+            }
+            if (!found && properties.glyphNames) {
+              // Try to map using the post table. There are currently no known
+              // pdfs that this fixes.
+              glyphId = properties.glyphNames.indexOf(glyphName);
+              if (glyphId > 0) {
+                charCodeToGlyphId[charCode] = glyphId;
+              }
+            }
+          }
+        } else {
+          // For (3, 0) cmap tables:
+          // The charcode key being stored in charCodeToGlyphId is the lower
+          // byte of the two-byte charcodes of the cmap table since according to
+          // the spec: 'each byte from the string shall be prepended with the
+          // high byte of the range [of charcodes in the cmap table], to form
+          // a two-byte character, which shall be used to select the
+          // associated glyph description from the subtable'.
+          //
+          // For (1, 0) cmap tables:
+          // 'single bytes from the string shall be used to look up the
+          // associated glyph descriptions from the subtable'. This means
+          // charcodes in the cmap will be single bytes, so no-op since
+          // glyph.charCode & 0xFF === glyph.charCode
+          for (i = 0; i < cmapMappingsLength; ++i) {
+            charCode = cmapMappings[i].charCode & 0xFF;
+            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
+          }
+        }
+      }
+
+      if (charCodeToGlyphId.length === 0) {
+        // defines at least one glyph
+        charCodeToGlyphId[0] = 0;
+      }
+
+      // Converting glyphs and ids into font's cmap table
+      var newMapping = adjustMapping(charCodeToGlyphId, properties);
+      this.toFontChar = newMapping.toFontChar;
+      tables.cmap = {
+        tag: 'cmap',
+        data: createCmapTable(newMapping.charCodeToGlyphId)
+      };
+
+      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {
+        // extract some more font properties from the OpenType head and
+        // hhea tables; yMin and descent value are always negative
+        var override = {
+          unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),
+          yMax: int16(tables.head.data[42], tables.head.data[43]),
+          yMin: int16(tables.head.data[38], tables.head.data[39]) - 0x10000,
+          ascent: int16(tables.hhea.data[4], tables.hhea.data[5]),
+          descent: int16(tables.hhea.data[6], tables.hhea.data[7]) - 0x10000
+        };
+
+        tables['OS/2'] = {
+          tag: 'OS/2',
+          data: stringToArray(createOS2Table(properties,
+                                             newMapping.charCodeToGlyphId,
+                                             override))
+        };
+      }
+
+      // Rewrite the 'post' table if needed
+      if (!tables.post) {
+        tables.post = {
+          tag: 'post',
+          data: stringToArray(createPostTable(properties))
+        };
+      }
+
+      if (!isTrueType) {
+        try {
+          // Trying to repair CFF file
+          cffFile = new Stream(tables['CFF '].data);
+          var parser = new CFFParser(cffFile, properties);
+          cff = parser.parse();
+          var compiler = new CFFCompiler(cff);
+          tables['CFF '].data = compiler.compile();
+        } catch (e) {
+          warn('Failed to compile font ' + properties.loadedName);
+        }
+      }
+
+      // Re-creating 'name' table
+      if (!tables.name) {
+        tables.name = {
+          tag: 'name',
+          data: stringToArray(createNameTable(this.name))
+        };
+      } else {
+        // ... using existing 'name' table as prototype
+        var namePrototype = readNameTable(tables.name);
+        tables.name.data = stringToArray(createNameTable(name, namePrototype));
+      }
+
+      // rewrite the tables but tweak offsets
+      for (i = 0; i < numTables; i++) {
+        table = tables[tablesNames[i]];
+        var data = [];
+
+        tableData = table.data;
+        for (var j = 0, jj = tableData.length; j < jj; j++) {
+          data.push(tableData[j]);
+        }
+        createTableEntry(ttf, table.tag, data);
+      }
+
+      // Add the table datas
+      for (i = 0; i < numTables; i++) {
+        table = tables[tablesNames[i]];
+        tableData = table.data;
+        ttf.file += bytesToString(new Uint8Array(tableData));
+
+        // 4-byte aligned data
+        while (ttf.file.length & 3) {
+          ttf.file += String.fromCharCode(0);
+        }
+      }
+
+      return stringToArray(ttf.file);
+    },
+
+    convert: function Font_convert(fontName, font, properties) {
+      // The offsets object holds at the same time a representation of where
+      // to write the table entry information about a table and another offset
+      // representing the offset where to draw the actual data of a particular
+      // table
+      var otf = {
+        file: '',
+        virtualOffset: 9 * (4 * 4)
+      };
+
+      createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
+
+      // TODO: Check the charstring widths to determine this.
+      properties.fixedPitch = false;
+
+      var mapping = font.getGlyphMapping(properties);
+      var newMapping = adjustMapping(mapping, properties);
+      this.toFontChar = newMapping.toFontChar;
+      var numGlyphs = font.numGlyphs;
+
+      function getCharCode(charCodeToGlyphId, glyphId, addMap) {
+        for (var charCode in charCodeToGlyphId) {
+          if (glyphId === charCodeToGlyphId[charCode]) {
+            return charCode | 0;
+          }
+        }
+        if (addMap) {
+          newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] =
+              glyphId;
+          return newMapping.nextAvailableFontCharCode++;
+        }
+        return null;
+      }
+
+      var seacs = font.seacs;
+      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {
+        var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;
+        var charset = font.getCharset();
+        var seacMap = Object.create(null);
+        for (var glyphId in seacs) {
+          glyphId |= 0;
+          var seac = seacs[glyphId];
+          var baseGlyphName = Encodings.StandardEncoding[seac[2]];
+          var accentGlyphName = Encodings.StandardEncoding[seac[3]];
+          var baseGlyphId = charset.indexOf(baseGlyphName);
+          var accentGlyphId = charset.indexOf(accentGlyphName);
+          if (baseGlyphId < 0 || accentGlyphId < 0) {
+            continue;
+          }
+          var accentOffset = {
+            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
+            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
+          };
+
+          var charCode = getCharCode(mapping, glyphId);
+          if (charCode === null) {
+            // There's no point in mapping it if the char code was never mapped
+            // to begin with.
+            continue;
+          }
+          // Find a fontCharCode that maps to the base and accent glyphs. If one
+          // doesn't exists, create it.
+          var charCodeToGlyphId = newMapping.charCodeToGlyphId;
+          var baseFontCharCode = getCharCode(charCodeToGlyphId, baseGlyphId,
+                                             true);
+          var accentFontCharCode = getCharCode(charCodeToGlyphId, accentGlyphId,
+                                               true);
+          seacMap[charCode] = {
+            baseFontCharCode: baseFontCharCode,
+            accentFontCharCode: accentFontCharCode,
+            accentOffset: accentOffset
+          };
+        }
+        properties.seacMap = seacMap;
+      }
+
+      var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0];
+
+      var fields = {
+        // PostScript Font Program
+        'CFF ': font.data,
+
+        // OS/2 and Windows Specific metrics
+        'OS/2': stringToArray(createOS2Table(properties,
+                                             newMapping.charCodeToGlyphId)),
+
+        // Character to glyphs mapping
+        'cmap': createCmapTable(newMapping.charCodeToGlyphId),
+
+        // Font header
+        'head': (function fontFieldsHead() {
+          return stringToArray(
+            '\x00\x01\x00\x00' + // Version number
+            '\x00\x00\x10\x00' + // fontRevision
+            '\x00\x00\x00\x00' + // checksumAdjustement
+            '\x5F\x0F\x3C\xF5' + // magicNumber
+            '\x00\x00' + // Flags
+            safeString16(unitsPerEm) + // unitsPerEM
+            '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
+            '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
+            '\x00\x00' + // xMin
+            safeString16(properties.descent) + // yMin
+            '\x0F\xFF' + // xMax
+            safeString16(properties.ascent) + // yMax
+            string16(properties.italicAngle ? 2 : 0) + // macStyle
+            '\x00\x11' + // lowestRecPPEM
+            '\x00\x00' + // fontDirectionHint
+            '\x00\x00' + // indexToLocFormat
+            '\x00\x00');  // glyphDataFormat
+        })(),
+
+        // Horizontal header
+        'hhea': (function fontFieldsHhea() {
+          return stringToArray(
+            '\x00\x01\x00\x00' + // Version number
+            safeString16(properties.ascent) + // Typographic Ascent
+            safeString16(properties.descent) + // Typographic Descent
+            '\x00\x00' + // Line Gap
+            '\xFF\xFF' + // advanceWidthMax
+            '\x00\x00' + // minLeftSidebearing
+            '\x00\x00' + // minRightSidebearing
+            '\x00\x00' + // xMaxExtent
+            safeString16(properties.capHeight) + // caretSlopeRise
+            safeString16(Math.tan(properties.italicAngle) *
+                         properties.xHeight) + // caretSlopeRun
+            '\x00\x00' + // caretOffset
+            '\x00\x00' + // -reserved-
+            '\x00\x00' + // -reserved-
+            '\x00\x00' + // -reserved-
+            '\x00\x00' + // -reserved-
+            '\x00\x00' + // metricDataFormat
+            string16(numGlyphs)); // Number of HMetrics
+        })(),
+
+        // Horizontal metrics
+        'hmtx': (function fontFieldsHmtx() {
+          var charstrings = font.charstrings;
+          var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
+          for (var i = 1, ii = numGlyphs; i < ii; i++) {
+            // TODO: For CFF fonts the width should technically match th x in
+            // the glyph, but it doesn't seem to matter.
+            var charstring = charstrings ? charstrings[i - 1] : {};
+            var width = 'width' in charstring ? charstring.width : 0;
+            hmtx += string16(width) + string16(0);
+          }
+          return stringToArray(hmtx);
+        })(),
+
+        // Maximum profile
+        'maxp': (function fontFieldsMaxp() {
+          return stringToArray(
+            '\x00\x00\x50\x00' + // Version number
+            string16(numGlyphs)); // Num of glyphs
+        })(),
+
+        // Naming tables
+        'name': stringToArray(createNameTable(fontName)),
+
+        // PostScript informations
+        'post': stringToArray(createPostTable(properties))
+      };
+
+      var field;
+      for (field in fields) {
+        createTableEntry(otf, field, fields[field]);
+      }
+      for (field in fields) {
+        var table = fields[field];
+        otf.file += bytesToString(new Uint8Array(table));
+      }
+
+      return stringToArray(otf.file);
+    },
+
+    /**
+     * Builds a char code to unicode map based on section 9.10 of the spec.
+     * @param {Object} properties Font properties object.
+     * @return {Object} Has two properties: 'toUnicode' which maps char codes to
+     * unicode (string) values and 'isIdentity' which is true if an identity map
+     * is used.
+     */
+    buildToUnicode: function Font_buildToUnicode(properties) {
+      var map = {
+        isIdentity: false,
+        toUnicode: null
+      };
+      // Section 9.10.2 Mapping Character Codes to Unicode Values
+      if (properties.toUnicode && properties.toUnicode.length !== 0) {
+        map.toUnicode = properties.toUnicode;
+        return map;
+      }
+      // According to the spec if the font is a simple font we should only map
+      // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or
+      // the differences array only contains adobe standard or symbol set names,
+      // in pratice it seems better to always try to create a toUnicode
+      // map based of the default encoding.
+      var toUnicode, charcode;
+      if (!properties.composite /* is simple font */) {
+        toUnicode = [];
+        var encoding = properties.defaultEncoding.slice();
+        // Merge in the differences array.
+        var differences = properties.differences;
+        for (charcode in differences) {
+          encoding[charcode] = differences[charcode];
+        }
+        for (charcode in encoding) {
+          // a) Map the character code to a character name.
+          var glyphName = encoding[charcode];
+          // b) Look up the character name in the Adobe Glyph List (see the
+          //    Bibliography) to obtain the corresponding Unicode value.
+          if (glyphName === '' || !(glyphName in GlyphsUnicode)) {
+            // (undocumented) c) Few heuristics to recognize unknown glyphs
+            // NOTE: Adobe Reader does not do this step, but OSX Preview does
+            var code;
+            // Gxx glyph
+            if (glyphName.length === 3 &&
+                glyphName[0] === 'G' &&
+                (code = parseInt(glyphName.substr(1), 16))) {
+              toUnicode[charcode] = String.fromCharCode(code);
+            }
+            // Cddd glyph
+            if (glyphName.length >= 3 &&
+                glyphName[0] === 'C' &&
+                (code = +glyphName.substr(1))) {
+              toUnicode[charcode] = String.fromCharCode(code);
+            }
+            continue;
+          }
+          toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]);
+        }
+        map.toUnicode = toUnicode;
+        return map;
+      }
+      // If the font is a composite font that uses one of the predefined CMaps
+      // listed in Table 118 (except Identity–H and Identity–V) or whose
+      // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or
+      // Adobe-Korea1 character collection:
+      if (properties.composite && (
+           (properties.cMap.builtInCMap &&
+            !(properties.cMap instanceof IdentityCMap)) ||
+           (properties.cidSystemInfo.registry === 'Adobe' &&
+             (properties.cidSystemInfo.ordering === 'GB1' ||
+              properties.cidSystemInfo.ordering === 'CNS1' ||
+              properties.cidSystemInfo.ordering === 'Japan1' ||
+              properties.cidSystemInfo.ordering === 'Korea1')))) {
+        // Then:
+        // a) Map the character code to a character identifier (CID) according
+        // to the font’s CMap.
+        // b) Obtain the registry and ordering of the character collection used
+        // by the font’s CMap (for example, Adobe and Japan1) from its
+        // CIDSystemInfo dictionary.
+        var registry = properties.cidSystemInfo.registry;
+        var ordering = properties.cidSystemInfo.ordering;
+        // c) Construct a second CMap name by concatenating the registry and
+        // ordering obtained in step (b) in the format registry–ordering–UCS2
+        // (for example, Adobe–Japan1–UCS2).
+        var ucs2CMapName = new Name(registry + '-' + ordering + '-UCS2');
+        // d) Obtain the CMap with the name constructed in step (c) (available
+        // from the ASN Web site; see the Bibliography).
+        var ucs2CMap = CMapFactory.create(ucs2CMapName,
+          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
+        var cMap = properties.cMap;
+        toUnicode = [];
+        for (charcode in cMap.map) {
+          var cid = cMap.map[charcode];
+          assert(cid.length === 1, 'Max size of CID is 65,535');
+          // e) Map the CID obtained in step (a) according to the CMap obtained
+          // in step (d), producing a Unicode value.
+          var ucs2 = ucs2CMap.map[cid.charCodeAt(0)];
+          if (!ucs2) {
+            continue;
+          }
+          toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) +
+                                                    ucs2.charCodeAt(1));
+        }
+        map.toUnicode = toUnicode;
+        return map;
+      }
+
+      // The viewer's choice, just use an identity map.
+      toUnicode = [];
+      var firstChar = properties.firstChar, lastChar = properties.lastChar;
+      for (var i = firstChar; i <= lastChar; i++) {
+        toUnicode[i] = String.fromCharCode(i);
+      }
+      map.isIdentity = true;
+      map.toUnicode = toUnicode;
+      return map;
+    },
+
+    get spaceWidth() {
+      if ('_shadowWidth' in this) {
+        return this._shadowWidth;
+      }
+
+      // trying to estimate space character width
+      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
+      var width;
+      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
+        var glyphName = possibleSpaceReplacements[i];
+        // if possible, getting width by glyph name
+        if (glyphName in this.widths) {
+          width = this.widths[glyphName];
+          break;
+        }
+        var glyphUnicode = GlyphsUnicode[glyphName];
+        // finding the charcode via unicodeToCID map
+        var charcode = 0;
+        if (this.composite) {
+          if (glyphUnicode in this.cMap.map) {
+            charcode = this.cMap.lookup(glyphUnicode).charCodeAt(0);
+          }
+        }
+        // ... via toUnicode map
+        if (!charcode && 'toUnicode' in this) {
+          charcode = this.toUnicode.indexOf(glyphUnicode);
+        }
+        // setting it to unicode if negative or undefined
+        if (charcode <= 0) {
+          charcode = glyphUnicode;
+        }
+        // trying to get width via charcode
+        width = this.widths[charcode];
+        if (width) {
+          break; // the non-zero width found
+        }
+      }
+      width = width || this.defaultWidth;
+      // Do not shadow the property here. See discussion:
+      // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280
+      this._shadowWidth = width;
+      return width;
+    },
+
+    charToGlyph: function Font_charToGlyph(charcode) {
+      var fontCharCode, width, operatorList;
+
+      var widthCode = charcode;
+      if (this.cMap && charcode in this.cMap.map) {
+        widthCode = this.cMap.map[charcode].charCodeAt(0);
+      }
+      width = this.widths[widthCode];
+      width = isNum(width) ? width : this.defaultWidth;
+      var vmetric = this.vmetrics && this.vmetrics[widthCode];
+
+      var unicode = this.toUnicode[charcode] || charcode;
+      if (typeof unicode === 'number') {
+        unicode = String.fromCharCode(unicode);
+      }
+
+      // First try the toFontChar map, if it's not there then try falling
+      // back to the char code.
+      fontCharCode = this.toFontChar[charcode] || charcode;
+      if (this.missingFile) {
+        fontCharCode = mapSpecialUnicodeValues(fontCharCode);
+      }
+
+      if (this.type === 'Type3') {
+        // Font char code in this case is actually a glyph name.
+        operatorList = this.charProcOperatorList[fontCharCode];
+      }
+
+      var accent = null;
+      if (this.seacMap && this.seacMap[charcode]) {
+        var seac = this.seacMap[charcode];
+        fontCharCode = seac.baseFontCharCode;
+        accent = {
+          fontChar: String.fromCharCode(seac.accentFontCharCode),
+          offset: seac.accentOffset
+        };
+      }
+
+      var fontChar = String.fromCharCode(fontCharCode);
+
+      var glyph = this.glyphCache[charcode];
+      if (!glyph ||
+          !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
+                                 operatorList)) {
+        glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
+                          operatorList);
+        this.glyphCache[charcode] = glyph;
+      }
+      return glyph;
+    },
+
+    charsToGlyphs: function Font_charsToGlyphs(chars) {
+      var charsCache = this.charsCache;
+      var glyphs, glyph, charcode;
+
+      // if we translated this string before, just grab it from the cache
+      if (charsCache) {
+        glyphs = charsCache[chars];
+        if (glyphs) {
+          return glyphs;
+        }
+      }
+
+      // lazily create the translation cache
+      if (!charsCache) {
+        charsCache = this.charsCache = Object.create(null);
+      }
+
+      glyphs = [];
+      var charsCacheKey = chars;
+      var i = 0, ii;
+
+      if (this.cMap) {
+        // composite fonts have multi-byte strings convert the string from
+        // single-byte to multi-byte
+        while (i < chars.length) {
+          var c = this.cMap.readCharCode(chars, i);
+          charcode = c[0];
+          var length = c[1];
+          i += length;
+          glyph = this.charToGlyph(charcode);
+          glyphs.push(glyph);
+          // placing null after each word break charcode (ASCII SPACE)
+          // Ignore occurences of 0x20 in multiple-byte codes.
+          if (length === 1 && chars.charCodeAt(i - 1) === 0x20) {
+            glyphs.push(null);
+          }
+        }
+      } else {
+        for (i = 0, ii = chars.length; i < ii; ++i) {
+          charcode = chars.charCodeAt(i);
+          glyph = this.charToGlyph(charcode);
+          glyphs.push(glyph);
+          if (charcode == 0x20) {
+            glyphs.push(null);
+          }
+        }
+      }
+
+      // Enter the translated string into the cache
+      return (charsCache[charsCacheKey] = glyphs);
+    }
+  };
+
+  return Font;
+})();
+
+var ErrorFont = (function ErrorFontClosure() {
+  function ErrorFont(error) {
+    this.error = error;
+  }
+
+  ErrorFont.prototype = {
+    charsToGlyphs: function ErrorFont_charsToGlyphs() {
+      return [];
+    },
+    exportData: function ErrorFont_exportData() {
+      return {error: this.error};
+    }
+  };
+
+  return ErrorFont;
+})();
+
+/**
+ * Shared logic for building a char code to glyph id mapping for Type1 and
+ * simple CFF fonts. See section 9.6.6.2 of the spec.
+ * @param {Object} properties Font properties object.
+ * @param {Object} builtInEncoding The encoding contained within the actual font
+ * data.
+ * @param {Array} Array of glyph names where the index is the glyph ID.
+ * @returns {Object} A char code to glyph ID map.
+ */
+function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
+  var charCodeToGlyphId = Object.create(null);
+  var glyphId, charCode, baseEncoding;
+
+  if (properties.baseEncodingName) {
+    // If a valid base encoding name was used, the mapping is initialized with
+    // that.
+    baseEncoding = Encodings[properties.baseEncodingName];
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      }
+    }
+  } else if (!!(properties.flags & FontFlags.Symbolic)) {
+    // For a symbolic font the encoding should be the fonts built-in
+    // encoding.
+    for (charCode in builtInEncoding) {
+      charCodeToGlyphId[charCode] = builtInEncoding[charCode];
+    }
+  } else {
+    // For non-symbolic fonts that don't have a base encoding the standard
+    // encoding should be used.
+    baseEncoding = Encodings.StandardEncoding;
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      }
+    }
+  }
+
+  // Lastly, merge in the differences.
+  var differences = properties.differences;
+  if (differences) {
+    for (charCode in differences) {
+      var glyphName = differences[charCode];
+      glyphId = glyphNames.indexOf(glyphName);
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      }
+    }
+  }
+  return charCodeToGlyphId;
+}
+
+/*
+ * CharStrings are encoded following the the CharString Encoding sequence
+ * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
+ * The value in a byte indicates a command, a number, or subsequent bytes
+ * that are to be interpreted in a special way.
+ *
+ * CharString Number Encoding:
+ *  A CharString byte containing the values from 32 through 255 inclusive
+ *  indicate an integer. These values are decoded in four ranges.
+ *
+ * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
+ * indicate the integer v - 139. Thus, the integer values from -107 through
+ * 107 inclusive may be encoded in single byte.
+ *
+ * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * [(v - 247) x 256] + w + 108
+ *
+ * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * -[(v - 251) * 256] - w - 108
+ *
+ * 4. A CharString containing the value 255 indicates that the next 4 bytes
+ * are a two complement signed integer. The first of these bytes contains the
+ * highest order bits, the second byte contains the next higher order bits
+ * and the fourth byte contain the lowest order bits.
+ *
+ *
+ * CharString Command Encoding:
+ *  CharStrings commands are encoded in 1 or 2 bytes.
+ *
+ *  Single byte commands are encoded in 1 byte that contains a value between
+ *  0 and 31 inclusive.
+ *  If a command byte contains the value 12, then the value in the next byte
+ *  indicates a command. This "escape" mechanism allows many extra commands
+ * to be encoded and this encoding technique helps to minimize the length of
+ * the charStrings.
+ */
+var Type1CharString = (function Type1CharStringClosure() {
+  var COMMAND_MAP = {
+    'hstem': [1],
+    'vstem': [3],
+    'vmoveto': [4],
+    'rlineto': [5],
+    'hlineto': [6],
+    'vlineto': [7],
+    'rrcurveto': [8],
+    'callsubr': [10],
+    'flex': [12, 35],
+    'drop' : [12, 18],
+    'endchar': [14],
+    'rmoveto': [21],
+    'hmoveto': [22],
+    'vhcurveto': [30],
+    'hvcurveto': [31]
+  };
+
+  function Type1CharString() {
+    this.width = 0;
+    this.lsb = 0;
+    this.flexing = false;
+    this.output = [];
+    this.stack = [];
+  }
+
+  Type1CharString.prototype = {
+    convert: function Type1CharString_convert(encoded, subrs) {
+      var count = encoded.length;
+      var error = false;
+      var wx, sbx, subrNumber;
+      for (var i = 0; i < count; i++) {
+        var value = encoded[i];
+        if (value < 32) {
+          if (value === 12) {
+            value = (value << 8) + encoded[++i];
+          }
+          switch (value) {
+            case 1: // hstem
+              if (!HINTING_ENABLED) {
+                this.stack = [];
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.hstem);
+              break;
+            case 3: // vstem
+              if (!HINTING_ENABLED) {
+                this.stack = [];
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.vstem);
+              break;
+            case 4: // vmoveto
+              if (this.flexing) {
+                if (this.stack.length < 1) {
+                  error = true;
+                  break;
+                }
+                // Add the dx for flex and but also swap the values so they are
+                // the right order.
+                var dy = this.stack.pop();
+                this.stack.push(0, dy);
+                break;
+              }
+              error = this.executeCommand(1, COMMAND_MAP.vmoveto);
+              break;
+            case 5: // rlineto
+              error = this.executeCommand(2, COMMAND_MAP.rlineto);
+              break;
+            case 6: // hlineto
+              error = this.executeCommand(1, COMMAND_MAP.hlineto);
+              break;
+            case 7: // vlineto
+              error = this.executeCommand(1, COMMAND_MAP.vlineto);
+              break;
+            case 8: // rrcurveto
+              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
+              break;
+            case 9: // closepath
+              // closepath is a Type1 command that does not take argument and is
+              // useless in Type2 and it can simply be ignored.
+              this.stack = [];
+              break;
+            case 10: // callsubr
+              if (this.stack.length < 1) {
+                error = true;
+                break;
+              }
+              subrNumber = this.stack.pop();
+              error = this.convert(subrs[subrNumber], subrs);
+              break;
+            case 11: // return
+              return error;
+            case 13: // hsbw
+              if (this.stack.length < 2) {
+                error = true;
+                break;
+              }
+              // To convert to type2 we have to move the width value to the
+              // first part of the charstring and then use hmoveto with lsb.
+              wx = this.stack.pop();
+              sbx = this.stack.pop();
+              this.lsb = sbx;
+              this.width = wx;
+              this.stack.push(sbx);
+              error = this.executeCommand(1, COMMAND_MAP.hmoveto);
+              break;
+            case 14: // endchar
+              this.output.push(COMMAND_MAP.endchar[0]);
+              break;
+            case 21: // rmoveto
+              if (this.flexing) {
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.rmoveto);
+              break;
+            case 22: // hmoveto
+              if (this.flexing) {
+                // Add the dy for flex.
+                this.stack.push(0);
+                break;
+              }
+              error = this.executeCommand(1, COMMAND_MAP.hmoveto);
+              break;
+            case 30: // vhcurveto
+              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
+              break;
+            case 31: // hvcurveto
+              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
+              break;
+            case (12 << 8) + 0: // dotsection
+              // dotsection is a Type1 command to specify some hinting feature
+              // for dots that do not take a parameter and it can safely be
+              // ignored for Type2.
+              this.stack = [];
+              break;
+            case (12 << 8) + 1: // vstem3
+              if (!HINTING_ENABLED) {
+                this.stack = [];
+                break;
+              }
+              // [vh]stem3 are Type1 only and Type2 supports [vh]stem with
+              // multiple parameters, so instead of returning [vh]stem3 take a
+              // shortcut and return [vhstem] instead.
+              error = this.executeCommand(2, COMMAND_MAP.vstem);
+              break;
+            case (12 << 8) + 2: // hstem3
+              if (!HINTING_ENABLED) {
+                 this.stack = [];
+                break;
+              }
+              // See vstem3.
+              error = this.executeCommand(2, COMMAND_MAP.hstem);
+              break;
+            case (12 << 8) + 6: // seac
+              // seac is like type 2's special endchar but it doesn't use the
+              // first argument asb, so remove it.
+              if (SEAC_ANALYSIS_ENABLED) {
+                this.seac = this.stack.splice(-4, 4);
+                error = this.executeCommand(0, COMMAND_MAP.endchar);
+              } else {
+                error = this.executeCommand(4, COMMAND_MAP.endchar);
+              }
+              break;
+            case (12 << 8) + 7: // sbw
+              if (this.stack.length < 4) {
+                error = true;
+                break;
+              }
+              // To convert to type2 we have to move the width value to the
+              // first part of the charstring and then use rmoveto with
+              // (dx, dy). The height argument will not be used for vmtx and
+              // vhea tables reconstruction -- ignoring it.
+              var wy = this.stack.pop();
+              wx = this.stack.pop();
+              var sby = this.stack.pop();
+              sbx = this.stack.pop();
+              this.lsb = sbx;
+              this.width = wx;
+              this.stack.push(sbx, sby);
+              error = this.executeCommand(2, COMMAND_MAP.rmoveto);
+              break;
+            case (12 << 8) + 12: // div
+              if (this.stack.length < 2) {
+                error = true;
+                break;
+              }
+              var num2 = this.stack.pop();
+              var num1 = this.stack.pop();
+              this.stack.push(num1 / num2);
+              break;
+            case (12 << 8) + 16: // callothersubr
+              if (this.stack.length < 2) {
+                error = true;
+                break;
+              }
+              subrNumber = this.stack.pop();
+              var numArgs = this.stack.pop();
+              if (subrNumber === 0 && numArgs === 3) {
+                var flexArgs = this.stack.splice(this.stack.length - 17, 17);
+                this.stack.push(
+                  flexArgs[2] + flexArgs[0], // bcp1x + rpx
+                  flexArgs[3] + flexArgs[1], // bcp1y + rpy
+                  flexArgs[4], // bcp2x
+                  flexArgs[5], // bcp2y
+                  flexArgs[6], // p2x
+                  flexArgs[7], // p2y
+                  flexArgs[8], // bcp3x
+                  flexArgs[9], // bcp3y
+                  flexArgs[10], // bcp4x
+                  flexArgs[11], // bcp4y
+                  flexArgs[12], // p3x
+                  flexArgs[13], // p3y
+                  flexArgs[14] // flexDepth
+                  // 15 = finalx unused by flex
+                  // 16 = finaly unused by flex
+                );
+                error = this.executeCommand(13, COMMAND_MAP.flex, true);
+                this.flexing = false;
+                this.stack.push(flexArgs[15], flexArgs[16]);
+              } else if (subrNumber === 1 && numArgs === 0) {
+                this.flexing = true;
+              }
+              break;
+            case (12 << 8) + 17: // pop
+              // Ignore this since it is only used with othersubr.
+              break;
+            case (12 << 8) + 33: // setcurrentpoint
+              // Ignore for now.
+              this.stack = [];
+              break;
+            default:
+              warn('Unknown type 1 charstring command of "' + value + '"');
+              break;
+          }
+          if (error) {
+            break;
+          }
+          continue;
+        } else if (value <= 246) {
+          value = value - 139;
+        } else if (value <= 250) {
+          value = ((value - 247) * 256) + encoded[++i] + 108;
+        } else if (value <= 254) {
+          value = -((value - 251) * 256) - encoded[++i] - 108;
+        } else {
+          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 |
+                  (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
+        }
+        this.stack.push(value);
+      }
+      return error;
+    },
+
+    executeCommand: function(howManyArgs, command, keepStack) {
+      var stackLength = this.stack.length;
+      if (howManyArgs > stackLength) {
+        return true;
+      }
+      var start = stackLength - howManyArgs;
+      for (var i = start; i < stackLength; i++) {
+        var value = this.stack[i];
+        if (value === (value | 0)) { // int
+          this.output.push(28, (value >> 8) & 0xff, value & 0xff);
+        } else { // fixed point
+          value = (65536 * value) | 0;
+          this.output.push(255,
+                           (value >> 24) & 0xFF,
+                           (value >> 16) & 0xFF,
+                           (value >> 8) & 0xFF,
+                           value & 0xFF);
+        }
+      }
+      this.output.push.apply(this.output, command);
+      if (keepStack) {
+        this.stack.splice(start, howManyArgs);
+      } else {
+        this.stack.length = 0;
+      }
+      return false;
+    }
+  };
+
+  return Type1CharString;
+})();
+
+/*
+ * Type1Parser encapsulate the needed code for parsing a Type1 font
+ * program. Some of its logic depends on the Type2 charstrings
+ * structure.
+ * Note: this doesn't really parse the font since that would require evaluation
+ * of PostScript, but it is possible in most cases to extract what we need
+ * without a full parse.
+ */
+var Type1Parser = (function Type1ParserClosure() {
+  /*
+   * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
+   * of Plaintext Bytes. The function took a key as a parameter which can be
+   * for decrypting the eexec block of for decoding charStrings.
+   */
+  var EEXEC_ENCRYPT_KEY = 55665;
+  var CHAR_STRS_ENCRYPT_KEY = 4330;
+
+  function isHexDigit(code) {
+    return code >= 48 && code <= 57 || // '0'-'9'
+           code >= 65 && code <= 70 || // 'A'-'F'
+           code >= 97 && code <= 102;  // 'a'-'f'
+  }
+
+  function decrypt(data, key, discardNumber) {
+    var r = key | 0, c1 = 52845, c2 = 22719;
+    var count = data.length;
+    var decrypted = new Uint8Array(count);
+    for (var i = 0; i < count; i++) {
+      var value = data[i];
+      decrypted[i] = value ^ (r >> 8);
+      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
+    }
+    return Array.prototype.slice.call(decrypted, discardNumber);
+  }
+
+  function decryptAscii(data, key, discardNumber) {
+    var r = key | 0, c1 = 52845, c2 = 22719;
+    var count = data.length, maybeLength = count >>> 1;
+    var decrypted = new Uint8Array(maybeLength);
+    var i, j;
+    for (i = 0, j = 0; i < count; i++) {
+      var digit1 = data[i];
+      if (!isHexDigit(digit1)) {
+        continue;
+      }
+      i++;
+      var digit2;
+      while (i < count && !isHexDigit(digit2 = data[i])) {
+        i++;
+      }
+      if (i < count) {
+        var value = parseInt(String.fromCharCode(digit1, digit2), 16);
+        decrypted[j++] = value ^ (r >> 8);
+        r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
+      }
+    }
+    return Array.prototype.slice.call(decrypted, discardNumber, j);
+  }
+
+  function isSpecial(c) {
+    return c === 0x2F || // '/'
+           c === 0x5B || c === 0x5D || // '[', ']'
+           c === 0x7B || c === 0x7D || // '{', '}'
+           c === 0x28 || c === 0x29; // '(', ')'
+  }
+
+  function Type1Parser(stream, encrypted) {
+    if (encrypted) {
+      var data = stream.getBytes();
+      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) &&
+                       isHexDigit(data[2]) && isHexDigit(data[3]));
+      stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) :
+                          decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
+    }
+    this.stream = stream;
+    this.nextChar();
+  }
+
+  Type1Parser.prototype = {
+    readNumberArray: function Type1Parser_readNumberArray() {
+      this.getToken(); // read '[' or '{' (arrays can start with either)
+      var array = [];
+      while (true) {
+        var token = this.getToken();
+        if (token === null || token === ']' || token === '}') {
+          break;
+        }
+        array.push(parseFloat(token || 0));
+      }
+      return array;
+    },
+
+    readNumber: function Type1Parser_readNumber() {
+      var token = this.getToken();
+      return parseFloat(token || 0);
+    },
+
+    readInt: function Type1Parser_readInt() {
+      // Use '| 0' to prevent setting a double into length such as the double
+      // does not flow into the loop variable.
+      var token = this.getToken();
+      return parseInt(token || 0, 10) | 0;
+    },
+
+    readBoolean: function Type1Parser_readBoolean() {
+      var token = this.getToken();
+
+      // Use 1 and 0 since that's what type2 charstrings use.
+      return token === 'true' ? 1 : 0;
+    },
+
+    nextChar : function Type1_nextChar() {
+      return (this.currentChar = this.stream.getByte());
+    },
+
+    getToken: function Type1Parser_getToken() {
+      // Eat whitespace and comments.
+      var comment = false;
+      var ch = this.currentChar;
+      while (true) {
+        if (ch === -1) {
+          return null;
+        }
+
+        if (comment) {
+          if (ch === 0x0A || ch === 0x0D) {
+            comment = false;
+          }
+        } else if (ch === 0x25) { // '%'
+          comment = true;
+        } else if (!Lexer.isSpace(ch)) {
+          break;
+        }
+        ch = this.nextChar();
+      }
+      if (isSpecial(ch)) {
+        this.nextChar();
+        return String.fromCharCode(ch);
+      }
+      var token = '';
+      do {
+        token += String.fromCharCode(ch);
+        ch = this.nextChar();
+      } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch));
+      return token;
+    },
+
+    /*
+     * Returns an object containing a Subrs array and a CharStrings
+     * array extracted from and eexec encrypted block of data
+     */
+    extractFontProgram: function Type1Parser_extractFontProgram() {
+      var stream = this.stream;
+
+      var subrs = [], charstrings = [];
+      var program = {
+        subrs: [],
+        charstrings: [],
+        properties: {
+          'privateData': {
+            'lenIV': 4
+          }
+        }
+      };
+      var token, length, data, lenIV, encoded;
+      while ((token = this.getToken()) !== null) {
+        if (token !== '/') {
+          continue;
+        }
+        token = this.getToken();
+        switch (token) {
+          case 'CharStrings':
+            // The number immediately following CharStrings must be greater or
+            // equal to the number of CharStrings.
+            this.getToken();
+            this.getToken(); // read in 'dict'
+            this.getToken(); // read in 'dup'
+            this.getToken(); // read in 'begin'
+            while(true) {
+              token = this.getToken();
+              if (token === null || token === 'end') {
+                break;
+              }
+
+              if (token !== '/') {
+                continue;
+              }
+              var glyph = this.getToken();
+              length = this.readInt();
+              this.getToken(); // read in 'RD' or '-|'
+              data = stream.makeSubStream(stream.pos, length);
+              lenIV = program.properties.privateData['lenIV'];
+              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);
+              // Skip past the required space and binary data.
+              stream.skip(length);
+              this.nextChar();
+              token = this.getToken(); // read in 'ND' or '|-'
+              if (token === 'noaccess') {
+                this.getToken(); // read in 'def'
+              }
+              charstrings.push({
+                glyph: glyph,
+                encoded: encoded
+              });
+            }
+            break;
+          case 'Subrs':
+            var num = this.readInt();
+            this.getToken(); // read in 'array'
+            while ((token = this.getToken()) === 'dup') {
+              var index = this.readInt();
+              length = this.readInt();
+              this.getToken(); // read in 'RD' or '-|'
+              data = stream.makeSubStream(stream.pos, length);
+              lenIV = program.properties.privateData['lenIV'];
+              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);
+              // Skip past the required space and binary data.
+              stream.skip(length);
+              this.nextChar();
+              token = this.getToken(); // read in 'NP' or '|'
+              if (token === 'noaccess') {
+                this.getToken(); // read in 'put'
+              }
+              subrs[index] = encoded;
+            }
+            break;
+          case 'BlueValues':
+          case 'OtherBlues':
+          case 'FamilyBlues':
+          case 'FamilyOtherBlues':
+            var blueArray = this.readNumberArray();
+            // *Blue* values may contain invalid data: disables reading of
+            // those values when hinting is disabled.
+            if (blueArray.length > 0 && (blueArray.length % 2) === 0 &&
+                HINTING_ENABLED) {
+              program.properties.privateData[token] = blueArray;
+            }
+            break;
+          case 'StemSnapH':
+          case 'StemSnapV':
+            program.properties.privateData[token] = this.readNumberArray();
+            break;
+          case 'StdHW':
+          case 'StdVW':
+            program.properties.privateData[token] =
+              this.readNumberArray()[0];
+            break;
+          case 'BlueShift':
+          case 'lenIV':
+          case 'BlueFuzz':
+          case 'BlueScale':
+          case 'LanguageGroup':
+          case 'ExpansionFactor':
+            program.properties.privateData[token] = this.readNumber();
+            break;
+          case 'ForceBold':
+            program.properties.privateData[token] = this.readBoolean();
+            break;
+        }
+      }
+
+      for (var i = 0; i < charstrings.length; i++) {
+        glyph = charstrings[i].glyph;
+        encoded = charstrings[i].encoded;
+        var charString = new Type1CharString();
+        var error = charString.convert(encoded, subrs);
+        var output = charString.output;
+        if (error) {
+          // It seems when FreeType encounters an error while evaluating a glyph
+          // that it completely ignores the glyph so we'll mimic that behaviour
+          // here and put an endchar to make the validator happy.
+          output = [14];
+        }
+        program.charstrings.push({
+          glyphName: glyph,
+          charstring: output,
+          width: charString.width,
+          lsb: charString.lsb,
+          seac: charString.seac
+        });
+      }
+
+      return program;
+    },
+
+    extractFontHeader: function Type1Parser_extractFontHeader(properties) {
+      var token;
+      while ((token = this.getToken()) !== null) {
+        if (token !== '/') {
+          continue;
+        }
+        token = this.getToken();
+        switch (token) {
+          case 'FontMatrix':
+            var matrix = this.readNumberArray();
+            properties.fontMatrix = matrix;
+            break;
+          case 'Encoding':
+            var encodingArg = this.getToken();
+            var encoding;
+            if (!/^\d+$/.test(encodingArg)) {
+              // encoding name is specified
+              encoding = Encodings[encodingArg];
+            } else {
+              encoding = [];
+              var size = parseInt(encodingArg, 10) | 0;
+              this.getToken(); // read in 'array'
+
+              for (var j = 0; j < size; j++) {
+                token = this.getToken();
+                // skipping till first dup or def (e.g. ignoring for statement)
+                while (token !== 'dup' && token !== 'def') {
+                  token = this.getToken();
+                  if (token === null) {
+                    return; // invalid header
+                  }
+                }
+                if (token === 'def') {
+                  break; // read all array data
+                }
+                var index = this.readInt();
+                this.getToken(); // read in '/'
+                var glyph = this.getToken();
+                encoding[index] = glyph;
+                this.getToken(); // read the in 'put'
+              }
+            }
+            properties.builtInEncoding = encoding;
+            break;
+          case 'FontBBox':
+            var fontBBox = this.readNumberArray();
+            // adjusting ascent/descent
+            properties.ascent = fontBBox[3];
+            properties.descent = fontBBox[1];
+            properties.ascentScaled = true;
+            break;
+        }
+      }
+    }
+  };
+
+  return Type1Parser;
+})();
+
+/**
+ * The CFF class takes a Type1 file and wrap it into a
+ * 'Compact Font Format' which itself embed Type2 charstrings.
+ */
+var CFFStandardStrings = [
+  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+  'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+  'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
+  'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
+  'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
+  'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
+  'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
+  'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
+  'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
+  'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
+  'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
+  'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
+  'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
+  'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
+  'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
+  'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
+  'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
+  'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
+  'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
+  'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
+  'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
+  'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
+  'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
+  'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
+  'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+  'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
+  'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
+  'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
+  'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
+  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
+  'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+  'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
+  'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
+  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+  'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+  'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
+  'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
+  'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
+  'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
+  'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+  'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
+  'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
+  'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
+  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
+  'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
+  'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
+  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
+  'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
+  'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
+  'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
+  'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
+  'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
+  'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
+];
+
+// Type1Font is also a CIDFontType0.
+var Type1Font = function Type1Font(name, file, properties) {
+  // Some bad generators embed pfb file as is, we have to strip 6-byte headers.
+  // Also, length1 and length2 might be off by 6 bytes as well.
+  // http://www.math.ubc.ca/~cass/piscript/type1.pdf
+  var PFB_HEADER_SIZE = 6;
+  var headerBlockLength = properties.length1;
+  var eexecBlockLength = properties.length2;
+  var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
+  var pfbHeaderPresent = pfbHeader[0] == 0x80 && pfbHeader[1] == 0x01;
+  if (pfbHeaderPresent) {
+    file.skip(PFB_HEADER_SIZE);
+    headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |
+                        (pfbHeader[3] << 8) | pfbHeader[2];
+  }
+
+  // Get the data block containing glyphs and subrs informations
+  var headerBlock = new Stream(file.getBytes(headerBlockLength));
+  var headerBlockParser = new Type1Parser(headerBlock);
+  headerBlockParser.extractFontHeader(properties);
+
+  if (pfbHeaderPresent) {
+    pfbHeader = file.getBytes(PFB_HEADER_SIZE);
+    eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |
+                       (pfbHeader[3] << 8) | pfbHeader[2];
+  }
+
+  // Decrypt the data blocks and retrieve it's content
+  var eexecBlock = new Stream(file.getBytes(eexecBlockLength));
+  var eexecBlockParser = new Type1Parser(eexecBlock, true);
+  var data = eexecBlockParser.extractFontProgram();
+  for (var info in data.properties) {
+    properties[info] = data.properties[info];
+  }
+
+  var charstrings = data.charstrings;
+  var type2Charstrings = this.getType2Charstrings(charstrings);
+  var subrs = this.getType2Subrs(data.subrs);
+
+  this.charstrings = charstrings;
+  this.data = this.wrap(name, type2Charstrings, this.charstrings,
+                        subrs, properties);
+  this.seacs = this.getSeacs(data.charstrings);
+};
+
+Type1Font.prototype = {
+  get numGlyphs() {
+    return this.charstrings.length + 1;
+  },
+
+  getCharset: function Type1Font_getCharset() {
+    var charset = ['.notdef'];
+    var charstrings = this.charstrings;
+    for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {
+      charset.push(charstrings[glyphId].glyphName);
+    }
+    return charset;
+  },
+
+  getGlyphMapping: function Type1Font_getGlyphMapping(properties) {
+    var charstrings = this.charstrings;
+    var glyphNames = ['.notdef'], glyphId;
+    for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
+      glyphNames.push(charstrings[glyphId].glyphName);
+    }
+    var encoding = properties.builtInEncoding;
+    if (encoding) {
+      var builtInEncoding = {};
+      for (var charCode in encoding) {
+        glyphId = glyphNames.indexOf(encoding[charCode]);
+        if (glyphId >= 0) {
+          builtInEncoding[charCode] = glyphId;
+        }
+      }
+    }
+
+    return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
+  },
+
+  getSeacs: function Type1Font_getSeacs(charstrings) {
+    var i, ii;
+    var seacMap = [];
+    for (i = 0, ii = charstrings.length; i < ii; i++) {
+      var charstring = charstrings[i];
+      if (charstring.seac) {
+        // Offset by 1 for .notdef
+        seacMap[i + 1] = charstring.seac;
+      }
+    }
+    return seacMap;
+  },
+
+  getType2Charstrings: function Type1Font_getType2Charstrings(
+                                  type1Charstrings) {
+    var type2Charstrings = [];
+    for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {
+      type2Charstrings.push(type1Charstrings[i].charstring);
+    }
+    return type2Charstrings;
+  },
+
+  getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
+    var bias = 0;
+    var count = type1Subrs.length;
+    if (count < 1133) {
+      bias = 107;
+    } else if (count < 33769) {
+      bias = 1131;
+    } else {
+      bias = 32768;
+    }
+
+    // Add a bunch of empty subrs to deal with the Type2 bias
+    var type2Subrs = [];
+    var i;
+    for (i = 0; i < bias; i++) {
+      type2Subrs.push([0x0B]);
+    }
+
+    for (i = 0; i < count; i++) {
+      type2Subrs.push(type1Subrs[i]);
+    }
+
+    return type2Subrs;
+  },
+
+  wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
+    var cff = new CFF();
+    cff.header = new CFFHeader(1, 0, 4, 4);
+
+    cff.names = [name];
+
+    var topDict = new CFFTopDict();
+    // CFF strings IDs 0...390 are predefined names, so refering
+    // to entries in our own String INDEX starts at SID 391.
+    topDict.setByName('version', 391);
+    topDict.setByName('Notice', 392);
+    topDict.setByName('FullName', 393);
+    topDict.setByName('FamilyName', 394);
+    topDict.setByName('Weight', 395);
+    topDict.setByName('Encoding', null); // placeholder
+    topDict.setByName('FontMatrix', properties.fontMatrix);
+    topDict.setByName('FontBBox', properties.bbox);
+    topDict.setByName('charset', null); // placeholder
+    topDict.setByName('CharStrings', null); // placeholder
+    topDict.setByName('Private', null); // placeholder
+    cff.topDict = topDict;
+
+    var strings = new CFFStrings();
+    strings.add('Version 0.11'); // Version
+    strings.add('See original notice'); // Notice
+    strings.add(name); // FullName
+    strings.add(name); // FamilyName
+    strings.add('Medium'); // Weight
+    cff.strings = strings;
+
+    cff.globalSubrIndex = new CFFIndex();
+
+    var count = glyphs.length;
+    var charsetArray = [0];
+    var i, ii;
+    for (i = 0; i < count; i++) {
+      var index = CFFStandardStrings.indexOf(charstrings[i].glyphName);
+      // TODO: Insert the string and correctly map it.  Previously it was
+      // thought mapping names that aren't in the standard strings to .notdef
+      // was fine, however in issue818 when mapping them all to .notdef the
+      // adieresis glyph no longer worked.
+      if (index == -1) {
+        index = 0;
+      }
+      charsetArray.push((index >> 8) & 0xff, index & 0xff);
+    }
+    cff.charset = new CFFCharset(false, 0, [], charsetArray);
+
+    var charStringsIndex = new CFFIndex();
+    charStringsIndex.add([0x8B, 0x0E]); // .notdef
+    for (i = 0; i < count; i++) {
+      charStringsIndex.add(glyphs[i]);
+    }
+    cff.charStrings = charStringsIndex;
+
+    var privateDict = new CFFPrivateDict();
+    privateDict.setByName('Subrs', null); // placeholder
+    var fields = [
+      'BlueValues',
+      'OtherBlues',
+      'FamilyBlues',
+      'FamilyOtherBlues',
+      'StemSnapH',
+      'StemSnapV',
+      'BlueShift',
+      'BlueFuzz',
+      'BlueScale',
+      'LanguageGroup',
+      'ExpansionFactor',
+      'ForceBold',
+      'StdHW',
+      'StdVW'
+    ];
+    for (i = 0, ii = fields.length; i < ii; i++) {
+      var field = fields[i];
+      if (!properties.privateData.hasOwnProperty(field)) {
+        continue;
+      }
+      var value = properties.privateData[field];
+      if (isArray(value)) {
+        // All of the private dictionary array data in CFF must be stored as
+        // "delta-encoded" numbers.
+        for (var j = value.length - 1; j > 0; j--) {
+          value[j] -= value[j - 1]; // ... difference from previous value
+        }
+      }
+      privateDict.setByName(field, value);
+    }
+    cff.topDict.privateDict = privateDict;
+
+    var subrIndex = new CFFIndex();
+    for (i = 0, ii = subrs.length; i < ii; i++) {
+      subrIndex.add(subrs[i]);
+    }
+    privateDict.subrsIndex = subrIndex;
+
+    var compiler = new CFFCompiler(cff);
+    return compiler.compile();
+  }
+};
+
+var CFFFont = (function CFFFontClosure() {
+  function CFFFont(file, properties) {
+    this.properties = properties;
+
+    var parser = new CFFParser(file, properties);
+    this.cff = parser.parse();
+    var compiler = new CFFCompiler(this.cff);
+    this.seacs = this.cff.seacs;
+    try {
+      this.data = compiler.compile();
+    } catch (e) {
+      warn('Failed to compile font ' + properties.loadedName);
+      // There may have just been an issue with the compiler, set the data
+      // anyway and hope the font loaded.
+      this.data = file;
+    }
+  }
+
+  CFFFont.prototype = {
+    get numGlyphs() {
+      return this.cff.charStrings.count;
+    },
+    getCharset: function CFFFont_getCharset() {
+      return this.cff.charset.charset;
+    },
+    getGlyphMapping: function CFFFont_getGlyphMapping() {
+      var cff = this.cff;
+      var properties = this.properties;
+      var charsets = cff.charset.charset;
+      var charCodeToGlyphId;
+      var glyphId;
+
+      if (properties.composite) {
+        charCodeToGlyphId = Object.create(null);
+        if (cff.isCIDFont) {
+          // If the font is actually a CID font then we should use the charset
+          // to map CIDs to GIDs.
+          for (glyphId = 0; glyphId < charsets.length; glyphId++) {
+            var cidString = String.fromCharCode(charsets[glyphId]);
+            var charCode = properties.cMap.map.indexOf(cidString);
+            charCodeToGlyphId[charCode] = glyphId;
+          }
+        } else {
+          // If it is NOT actually a CID font then CIDs should be mapped
+          // directly to GIDs.
+          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
+            charCodeToGlyphId[glyphId] = glyphId;
+          }
+        }
+        return charCodeToGlyphId;
+      }
+
+      var encoding = cff.encoding ? cff.encoding.encoding : null;
+      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
+      return charCodeToGlyphId;
+    }
+  };
+
+  return CFFFont;
+})();
+
+var CFFParser = (function CFFParserClosure() {
+  var CharstringValidationData = [
+    null,
+    { id: 'hstem', min: 2, resetStack: true, stem: true },
+    null,
+    { id: 'vstem', min: 2, resetStack: true, stem: true },
+    { id: 'vmoveto', min: 1, resetStack: true },
+    { id: 'rlineto', min: 2, resetStack: true },
+    { id: 'hlineto', min: 1, resetStack: true },
+    { id: 'vlineto', min: 1, resetStack: true },
+    { id: 'rrcurveto', min: 6, resetStack: true },
+    null,
+    { id: 'callsubr', min: 1, undefStack: true },
+    { id: 'return', min: 0, undefStack: true },
+    null, // 12
+    null,
+    null, // endchar
+    null,
+    null,
+    null,
+    { id: 'hstemhm', min: 2, resetStack: true, stem: true },
+    null, // hintmask
+    null, // cntrmask
+    { id: 'rmoveto', min: 2, resetStack: true },
+    { id: 'hmoveto', min: 1, resetStack: true },
+    { id: 'vstemhm', min: 2, resetStack: true, stem: true },
+    { id: 'rcurveline', min: 8, resetStack: true },
+    { id: 'rlinecurve', min: 8, resetStack: true },
+    { id: 'vvcurveto', min: 4, resetStack: true },
+    { id: 'hhcurveto', min: 4, resetStack: true },
+    null, // shortint
+    { id: 'callgsubr', min: 1, undefStack: true },
+    { id: 'vhcurveto', min: 4, resetStack: true },
+    { id: 'hvcurveto', min: 4, resetStack: true }
+  ];
+  var CharstringValidationData12 = [
+    null,
+    null,
+    null,
+    { id: 'and', min: 2, stackDelta: -1 },
+    { id: 'or', min: 2, stackDelta: -1 },
+    { id: 'not', min: 1, stackDelta: 0 },
+    null,
+    null,
+    null,
+    { id: 'abs', min: 1, stackDelta: 0 },
+    { id: 'add', min: 2, stackDelta: -1,
+      stackFn: function stack_div(stack, index) {
+        stack[index - 2] = stack[index - 2] + stack[index - 1];
+      }
+    },
+    { id: 'sub', min: 2, stackDelta: -1,
+      stackFn: function stack_div(stack, index) {
+        stack[index - 2] = stack[index - 2] - stack[index - 1];
+      }
+    },
+    { id: 'div', min: 2, stackDelta: -1,
+      stackFn: function stack_div(stack, index) {
+        stack[index - 2] = stack[index - 2] / stack[index - 1];
+      }
+    },
+    null,
+    { id: 'neg', min: 1, stackDelta: 0,
+      stackFn: function stack_div(stack, index) {
+        stack[index - 1] = -stack[index - 1];
+      }
+    },
+    { id: 'eq', min: 2, stackDelta: -1 },
+    null,
+    null,
+    { id: 'drop', min: 1, stackDelta: -1 },
+    null,
+    { id: 'put', min: 2, stackDelta: -2 },
+    { id: 'get', min: 1, stackDelta: 0 },
+    { id: 'ifelse', min: 4, stackDelta: -3 },
+    { id: 'random', min: 0, stackDelta: 1 },
+    { id: 'mul', min: 2, stackDelta: -1,
+      stackFn: function stack_div(stack, index) {
+        stack[index - 2] = stack[index - 2] * stack[index - 1];
+      }
+    },
+    null,
+    { id: 'sqrt', min: 1, stackDelta: 0 },
+    { id: 'dup', min: 1, stackDelta: 1 },
+    { id: 'exch', min: 2, stackDelta: 0 },
+    { id: 'index', min: 2, stackDelta: 0 },
+    { id: 'roll', min: 3, stackDelta: -2 },
+    null,
+    null,
+    null,
+    { id: 'hflex', min: 7, resetStack: true },
+    { id: 'flex', min: 13, resetStack: true },
+    { id: 'hflex1', min: 9, resetStack: true },
+    { id: 'flex1', min: 11, resetStack: true }
+  ];
+
+  function CFFParser(file, properties) {
+    this.bytes = file.getBytes();
+    this.properties = properties;
+  }
+  CFFParser.prototype = {
+    parse: function CFFParser_parse() {
+      var properties = this.properties;
+      var cff = new CFF();
+      this.cff = cff;
+
+      // The first five sections must be in order, all the others are reached
+      // via offsets contained in one of the below.
+      var header = this.parseHeader();
+      var nameIndex = this.parseIndex(header.endPos);
+      var topDictIndex = this.parseIndex(nameIndex.endPos);
+      var stringIndex = this.parseIndex(topDictIndex.endPos);
+      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
+
+      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
+      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
+
+      cff.header = header.obj;
+      cff.names = this.parseNameIndex(nameIndex.obj);
+      cff.strings = this.parseStringIndex(stringIndex.obj);
+      cff.topDict = topDict;
+      cff.globalSubrIndex = globalSubrIndex.obj;
+
+      this.parsePrivateDict(cff.topDict);
+
+      cff.isCIDFont = topDict.hasName('ROS');
+
+      var charStringOffset = topDict.getByName('CharStrings');
+      var charStringsAndSeacs = this.parseCharStrings(charStringOffset);
+      cff.charStrings = charStringsAndSeacs.charStrings;
+      cff.seacs = charStringsAndSeacs.seacs;
+
+      var fontMatrix = topDict.getByName('FontMatrix');
+      if (fontMatrix) {
+        properties.fontMatrix = fontMatrix;
+      }
+
+      var fontBBox = topDict.getByName('FontBBox');
+      if (fontBBox) {
+        // adjusting ascent/descent
+        properties.ascent = fontBBox[3];
+        properties.descent = fontBBox[1];
+        properties.ascentScaled = true;
+      }
+
+      var charset, encoding;
+      if (cff.isCIDFont) {
+        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
+        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
+          var dictRaw = fdArrayIndex.get(i);
+          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
+                                         cff.strings);
+          this.parsePrivateDict(fontDict);
+          cff.fdArray.push(fontDict);
+        }
+        // cid fonts don't have an encoding
+        encoding = null;
+        charset = this.parseCharsets(topDict.getByName('charset'),
+                                     cff.charStrings.count, cff.strings, true);
+        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
+                                             cff.charStrings.count);
+      } else {
+        charset = this.parseCharsets(topDict.getByName('charset'),
+                                     cff.charStrings.count, cff.strings, false);
+        encoding = this.parseEncoding(topDict.getByName('Encoding'),
+                                      properties,
+                                      cff.strings, charset.charset);
+      }
+      cff.charset = charset;
+      cff.encoding = encoding;
+
+      return cff;
+    },
+    parseHeader: function CFFParser_parseHeader() {
+      var bytes = this.bytes;
+      var bytesLength = bytes.length;
+      var offset = 0;
+
+      // Prevent an infinite loop, by checking that the offset is within the
+      // bounds of the bytes array. Necessary in empty, or invalid, font files.
+      while (offset < bytesLength && bytes[offset] !== 1) {
+        ++offset;
+      }
+      if (offset >= bytesLength) {
+        error('Invalid CFF header');
+      } else if (offset !== 0) {
+        info('cff data is shifted');
+        bytes = bytes.subarray(offset);
+        this.bytes = bytes;
+      }
+      var major = bytes[0];
+      var minor = bytes[1];
+      var hdrSize = bytes[2];
+      var offSize = bytes[3];
+      var header = new CFFHeader(major, minor, hdrSize, offSize);
+      return { obj: header, endPos: hdrSize };
+    },
+    parseDict: function CFFParser_parseDict(dict) {
+      var pos = 0;
+
+      function parseOperand() {
+        var value = dict[pos++];
+        if (value === 30) {
+          return parseFloatOperand(pos);
+        } else if (value === 28) {
+          value = dict[pos++];
+          value = ((value << 24) | (dict[pos++] << 16)) >> 16;
+          return value;
+        } else if (value === 29) {
+          value = dict[pos++];
+          value = (value << 8) | dict[pos++];
+          value = (value << 8) | dict[pos++];
+          value = (value << 8) | dict[pos++];
+          return value;
+        } else if (value >= 32 && value <= 246) {
+          return value - 139;
+        } else if (value >= 247 && value <= 250) {
+          return ((value - 247) * 256) + dict[pos++] + 108;
+        } else if (value >= 251 && value <= 254) {
+          return -((value - 251) * 256) - dict[pos++] - 108;
+        } else {
+          error('255 is not a valid DICT command');
+        }
+        return -1;
+      }
+
+      function parseFloatOperand() {
+        var str = '';
+        var eof = 15;
+        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
+            '9', '.', 'E', 'E-', null, '-'];
+        var length = dict.length;
+        while (pos < length) {
+          var b = dict[pos++];
+          var b1 = b >> 4;
+          var b2 = b & 15;
+
+          if (b1 == eof) {
+            break;
+          }
+          str += lookup[b1];
+
+          if (b2 == eof) {
+            break;
+          }
+          str += lookup[b2];
+        }
+        return parseFloat(str);
+      }
+
+      var operands = [];
+      var entries = [];
+
+      pos = 0;
+      var end = dict.length;
+      while (pos < end) {
+        var b = dict[pos];
+        if (b <= 21) {
+          if (b === 12) {
+            b = (b << 8) | dict[++pos];
+          }
+          entries.push([b, operands]);
+          operands = [];
+          ++pos;
+        } else {
+          operands.push(parseOperand());
+        }
+      }
+      return entries;
+    },
+    parseIndex: function CFFParser_parseIndex(pos) {
+      var cffIndex = new CFFIndex();
+      var bytes = this.bytes;
+      var count = (bytes[pos++] << 8) | bytes[pos++];
+      var offsets = [];
+      var end = pos;
+      var i, ii;
+
+      if (count !== 0) {
+        var offsetSize = bytes[pos++];
+        // add 1 for offset to determine size of last object
+        var startPos = pos + ((count + 1) * offsetSize) - 1;
+
+        for (i = 0, ii = count + 1; i < ii; ++i) {
+          var offset = 0;
+          for (var j = 0; j < offsetSize; ++j) {
+            offset <<= 8;
+            offset += bytes[pos++];
+          }
+          offsets.push(startPos + offset);
+        }
+        end = offsets[count];
+      }
+      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
+        var offsetStart = offsets[i];
+        var offsetEnd = offsets[i + 1];
+        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
+      }
+      return {obj: cffIndex, endPos: end};
+    },
+    parseNameIndex: function CFFParser_parseNameIndex(index) {
+      var names = [];
+      for (var i = 0, ii = index.count; i < ii; ++i) {
+        var name = index.get(i);
+        // OTS doesn't allow names to be over 127 characters.
+        var length = Math.min(name.length, 127);
+        var data = [];
+        // OTS also only permits certain characters in the name.
+        for (var j = 0; j < length; ++j) {
+          var c = name[j];
+          if (j === 0 && c === 0) {
+            data[j] = c;
+            continue;
+          }
+          if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
+              c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
+              c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
+              c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) {
+            data[j] = 95;
+            continue;
+          }
+          data[j] = c;
+        }
+        names.push(bytesToString(data));
+      }
+      return names;
+    },
+    parseStringIndex: function CFFParser_parseStringIndex(index) {
+      var strings = new CFFStrings();
+      for (var i = 0, ii = index.count; i < ii; ++i) {
+        var data = index.get(i);
+        strings.add(bytesToString(data));
+      }
+      return strings;
+    },
+    createDict: function CFFParser_createDict(Type, dict, strings) {
+      var cffDict = new Type(strings);
+      for (var i = 0, ii = dict.length; i < ii; ++i) {
+        var pair = dict[i];
+        var key = pair[0];
+        var value = pair[1];
+        cffDict.setByKey(key, value);
+      }
+      return cffDict;
+    },
+    parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
+      var charStrings = this.parseIndex(charStringOffset).obj;
+      var seacs = [];
+      var count = charStrings.count;
+      for (var i = 0; i < count; i++) {
+        var charstring = charStrings.get(i);
+
+        var stackSize = 0;
+        var stack = [];
+        var undefStack = true;
+        var hints = 0;
+        var valid = true;
+        var data = charstring;
+        var length = data.length;
+        for (var j = 0; j < length;) {
+          var value = data[j++];
+          var validationCommand = null;
+          if (value == 12) {
+            var q = data[j++];
+            if (q === 0) {
+              // The CFF specification state that the 'dotsection' command
+              // (12, 0) is deprecated and treated as a no-op, but all Type2
+              // charstrings processors should support them. Unfortunately
+              // the font sanitizer don't. As a workaround the sequence (12, 0)
+              // is replaced by a useless (0, hmoveto).
+              data[j - 2] = 139;
+              data[j - 1] = 22;
+              stackSize = 0;
+            } else {
+              validationCommand = CharstringValidationData12[q];
+            }
+          } else if (value === 28) { // number (16 bit)
+            stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16;
+            j += 2;
+            stackSize++;
+          } else if (value == 14) {
+            if (stackSize >= 4) {
+              stackSize -= 4;
+              if (SEAC_ANALYSIS_ENABLED) {
+                seacs[i] = stack.slice(stackSize, stackSize + 4);
+                valid = false;
+              }
+            }
+          } else if (value >= 32 && value <= 246) {  // number
+            stack[stackSize] = value - 139;
+            stackSize++;
+          } else if (value >= 247 && value <= 254) {  // number (+1 bytes)
+            stack[stackSize] = (value < 251 ?
+                                ((value - 247) << 8) + data[j] + 108 :
+                                -((value - 251) << 8) - data[j] - 108);
+            j++;
+            stackSize++;
+          } else if (value == 255) {  // number (32 bit)
+            stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) |
+                                (data[j + 2] << 8) | data[j + 3]) / 65536;
+            j += 4;
+            stackSize++;
+          } else if (value == 19 || value == 20) {
+            hints += stackSize >> 1;
+            j += (hints + 7) >> 3; // skipping right amount of hints flag data
+            stackSize = 0;
+          } else {
+            validationCommand = CharstringValidationData[value];
+          }
+          if (validationCommand) {
+            if (validationCommand.stem) {
+              hints += stackSize >> 1;
+            }
+            if ('min' in validationCommand) {
+              if (!undefStack && stackSize < validationCommand.min) {
+                warn('Not enough parameters for ' + validationCommand.id +
+                     '; actual: ' + stackSize +
+                     ', expected: ' + validationCommand.min);
+                valid = false;
+                break;
+              }
+            }
+            if ('stackDelta' in validationCommand) {
+              if ('stackFn' in validationCommand) {
+                validationCommand.stackFn(stack, stackSize);
+              }
+              stackSize += validationCommand.stackDelta;
+            } else if (validationCommand.resetStack) {
+              stackSize = 0;
+              undefStack = false;
+            } else if (validationCommand.undefStack) {
+              stackSize = 0;
+              undefStack = true;
+            }
+          }
+        }
+        if (!valid) {
+          // resetting invalid charstring to single 'endchar'
+          charStrings.set(i, new Uint8Array([14]));
+        }
+      }
+      return { charStrings: charStrings, seacs: seacs };
+    },
+    emptyPrivateDictionary:
+      function CFFParser_emptyPrivateDictionary(parentDict) {
+      var privateDict = this.createDict(CFFPrivateDict, [],
+                                        parentDict.strings);
+      parentDict.setByKey(18, [0, 0]);
+      parentDict.privateDict = privateDict;
+    },
+    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
+      // no private dict, do nothing
+      if (!parentDict.hasName('Private')) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
+      var privateOffset = parentDict.getByName('Private');
+      // make sure the params are formatted correctly
+      if (!isArray(privateOffset) || privateOffset.length !== 2) {
+        parentDict.removeByName('Private');
+        return;
+      }
+      var size = privateOffset[0];
+      var offset = privateOffset[1];
+      // remove empty dicts or ones that refer to invalid location
+      if (size === 0 || offset >= this.bytes.length) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
+
+      var privateDictEnd = offset + size;
+      var dictData = this.bytes.subarray(offset, privateDictEnd);
+      var dict = this.parseDict(dictData);
+      var privateDict = this.createDict(CFFPrivateDict, dict,
+                                        parentDict.strings);
+      parentDict.privateDict = privateDict;
+
+      // Parse the Subrs index also since it's relative to the private dict.
+      if (!privateDict.getByName('Subrs')) {
+        return;
+      }
+      var subrsOffset = privateDict.getByName('Subrs');
+      var relativeOffset = offset + subrsOffset;
+      // Validate the offset.
+      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
+      var subrsIndex = this.parseIndex(relativeOffset);
+      privateDict.subrsIndex = subrsIndex.obj;
+    },
+    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
+      if (pos === 0) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
+                              ISOAdobeCharset);
+      } else if (pos == 1) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
+                              ExpertCharset);
+      } else if (pos == 2) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
+                              ExpertSubsetCharset);
+      }
+
+      var bytes = this.bytes;
+      var start = pos;
+      var format = bytes[pos++];
+      var charset = ['.notdef'];
+      var id, count, i;
+
+      // subtract 1 for the .notdef glyph
+      length -= 1;
+
+      switch (format) {
+        case 0:
+          for (i = 0; i < length; i++) {
+            id = (bytes[pos++] << 8) | bytes[pos++];
+            charset.push(cid ? id : strings.get(id));
+          }
+          break;
+        case 1:
+          while (charset.length <= length) {
+            id = (bytes[pos++] << 8) | bytes[pos++];
+            count = bytes[pos++];
+            for (i = 0; i <= count; i++) {
+              charset.push(cid ? id++ : strings.get(id++));
+            }
+          }
+          break;
+        case 2:
+          while (charset.length <= length) {
+            id = (bytes[pos++] << 8) | bytes[pos++];
+            count = (bytes[pos++] << 8) | bytes[pos++];
+            for (i = 0; i <= count; i++) {
+              charset.push(cid ? id++ : strings.get(id++));
+            }
+          }
+          break;
+        default:
+          error('Unknown charset format');
+      }
+      // Raw won't be needed if we actually compile the charset.
+      var end = pos;
+      var raw = bytes.subarray(start, end);
+
+      return new CFFCharset(false, format, charset, raw);
+    },
+    parseEncoding: function CFFParser_parseEncoding(pos,
+                                                    properties,
+                                                    strings,
+                                                    charset) {
+      var encoding = {};
+      var bytes = this.bytes;
+      var predefined = false;
+      var hasSupplement = false;
+      var format, i, ii;
+      var raw = null;
+
+      function readSupplement() {
+        var supplementsCount = bytes[pos++];
+        for (i = 0; i < supplementsCount; i++) {
+          var code = bytes[pos++];
+          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+          encoding[code] = charset.indexOf(strings.get(sid));
+        }
+      }
+
+      if (pos === 0 || pos == 1) {
+        predefined = true;
+        format = pos;
+        var baseEncoding = pos ? Encodings.ExpertEncoding :
+                                 Encodings.StandardEncoding;
+        for (i = 0, ii = charset.length; i < ii; i++) {
+          var index = baseEncoding.indexOf(charset[i]);
+          if (index != -1) {
+            encoding[index] = i;
+          }
+        }
+      } else {
+        var dataStart = pos;
+        format = bytes[pos++];
+        switch (format & 0x7f) {
+          case 0:
+            var glyphsCount = bytes[pos++];
+            for (i = 1; i <= glyphsCount; i++) {
+              encoding[bytes[pos++]] = i;
+            }
+            break;
+
+          case 1:
+            var rangesCount = bytes[pos++];
+            var gid = 1;
+            for (i = 0; i < rangesCount; i++) {
+              var start = bytes[pos++];
+              var left = bytes[pos++];
+              for (var j = start; j <= start + left; j++) {
+                encoding[j] = gid++;
+              }
+            }
+            break;
+
+          default:
+            error('Unknow encoding format: ' + format + ' in CFF');
+            break;
+        }
+        var dataEnd = pos;
+        if (format & 0x80) {
+          // The font sanitizer does not support CFF encoding with a
+          // supplement, since the encoding is not really used to map
+          // between gid to glyph, let's overwrite what is declared in
+          // the top dictionary to let the sanitizer think the font use
+          // StandardEncoding, that's a lie but that's ok.
+          bytes[dataStart] &= 0x7f;
+          readSupplement();
+          hasSupplement = true;
+        }
+        raw = bytes.subarray(dataStart, dataEnd);
+      }
+      format = format & 0x7f;
+      return new CFFEncoding(predefined, format, encoding, raw);
+    },
+    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
+      var start = pos;
+      var bytes = this.bytes;
+      var format = bytes[pos++];
+      var fdSelect = [];
+      var i;
+
+      switch (format) {
+        case 0:
+          for (i = 0; i < length; ++i) {
+            var id = bytes[pos++];
+            fdSelect.push(id);
+          }
+          break;
+        case 3:
+          var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
+          for (i = 0; i < rangesCount; ++i) {
+            var first = (bytes[pos++] << 8) | bytes[pos++];
+            var fdIndex = bytes[pos++];
+            var next = (bytes[pos] << 8) | bytes[pos + 1];
+            for (var j = first; j < next; ++j) {
+              fdSelect.push(fdIndex);
+            }
+          }
+          // Advance past the sentinel(next).
+          pos += 2;
+          break;
+        default:
+          error('Unknown fdselect format ' + format);
+          break;
+      }
+      var end = pos;
+      return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
+    }
+  };
+  return CFFParser;
+})();
+
+// Compact Font Format
+var CFF = (function CFFClosure() {
+  function CFF() {
+    this.header = null;
+    this.names = [];
+    this.topDict = null;
+    this.strings = new CFFStrings();
+    this.globalSubrIndex = null;
+
+    // The following could really be per font, but since we only have one font
+    // store them here.
+    this.encoding = null;
+    this.charset = null;
+    this.charStrings = null;
+    this.fdArray = [];
+    this.fdSelect = null;
+
+    this.isCIDFont = false;
+  }
+  return CFF;
+})();
+
+var CFFHeader = (function CFFHeaderClosure() {
+  function CFFHeader(major, minor, hdrSize, offSize) {
+    this.major = major;
+    this.minor = minor;
+    this.hdrSize = hdrSize;
+    this.offSize = offSize;
+  }
+  return CFFHeader;
+})();
+
+var CFFStrings = (function CFFStringsClosure() {
+  function CFFStrings() {
+    this.strings = [];
+  }
+  CFFStrings.prototype = {
+    get: function CFFStrings_get(index) {
+      if (index >= 0 && index <= 390) {
+        return CFFStandardStrings[index];
+      }
+      if (index - 391 <= this.strings.length) {
+        return this.strings[index - 391];
+      }
+      return CFFStandardStrings[0];
+    },
+    add: function CFFStrings_add(value) {
+      this.strings.push(value);
+    },
+    get count() {
+      return this.strings.length;
+    }
+  };
+  return CFFStrings;
+})();
+
+var CFFIndex = (function CFFIndexClosure() {
+  function CFFIndex() {
+    this.objects = [];
+    this.length = 0;
+  }
+  CFFIndex.prototype = {
+    add: function CFFIndex_add(data) {
+      this.length += data.length;
+      this.objects.push(data);
+    },
+    set: function CFFIndex_set(index, data) {
+      this.length += data.length - this.objects[index].length;
+      this.objects[index] = data;
+    },
+    get: function CFFIndex_get(index) {
+      return this.objects[index];
+    },
+    get count() {
+      return this.objects.length;
+    }
+  };
+  return CFFIndex;
+})();
+
+var CFFDict = (function CFFDictClosure() {
+  function CFFDict(tables, strings) {
+    this.keyToNameMap = tables.keyToNameMap;
+    this.nameToKeyMap = tables.nameToKeyMap;
+    this.defaults = tables.defaults;
+    this.types = tables.types;
+    this.opcodes = tables.opcodes;
+    this.order = tables.order;
+    this.strings = strings;
+    this.values = {};
+  }
+  CFFDict.prototype = {
+    // value should always be an array
+    setByKey: function CFFDict_setByKey(key, value) {
+      if (!(key in this.keyToNameMap)) {
+        return false;
+      }
+      // ignore empty values
+      if (value.length === 0) {
+        return true;
+      }
+      var type = this.types[key];
+      // remove the array wrapping these types of values
+      if (type === 'num' || type === 'sid' || type === 'offset') {
+        value = value[0];
+      }
+      this.values[key] = value;
+      return true;
+    },
+    setByName: function CFFDict_setByName(name, value) {
+      if (!(name in this.nameToKeyMap)) {
+        error('Invalid dictionary name "' + name + '"');
+      }
+      this.values[this.nameToKeyMap[name]] = value;
+    },
+    hasName: function CFFDict_hasName(name) {
+      return this.nameToKeyMap[name] in this.values;
+    },
+    getByName: function CFFDict_getByName(name) {
+      if (!(name in this.nameToKeyMap)) {
+        error('Invalid dictionary name "' + name + '"');
+      }
+      var key = this.nameToKeyMap[name];
+      if (!(key in this.values)) {
+        return this.defaults[key];
+      }
+      return this.values[key];
+    },
+    removeByName: function CFFDict_removeByName(name) {
+      delete this.values[this.nameToKeyMap[name]];
+    }
+  };
+  CFFDict.createTables = function CFFDict_createTables(layout) {
+    var tables = {
+      keyToNameMap: {},
+      nameToKeyMap: {},
+      defaults: {},
+      types: {},
+      opcodes: {},
+      order: []
+    };
+    for (var i = 0, ii = layout.length; i < ii; ++i) {
+      var entry = layout[i];
+      var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
+      tables.keyToNameMap[key] = entry[1];
+      tables.nameToKeyMap[entry[1]] = key;
+      tables.types[key] = entry[2];
+      tables.defaults[key] = entry[3];
+      tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
+      tables.order.push(key);
+    }
+    return tables;
+  };
+  return CFFDict;
+})();
+
+var CFFTopDict = (function CFFTopDictClosure() {
+  var layout = [
+    [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
+    [[12, 20], 'SyntheticBase', 'num', null],
+    [0, 'version', 'sid', null],
+    [1, 'Notice', 'sid', null],
+    [[12, 0], 'Copyright', 'sid', null],
+    [2, 'FullName', 'sid', null],
+    [3, 'FamilyName', 'sid', null],
+    [4, 'Weight', 'sid', null],
+    [[12, 1], 'isFixedPitch', 'num', 0],
+    [[12, 2], 'ItalicAngle', 'num', 0],
+    [[12, 3], 'UnderlinePosition', 'num', -100],
+    [[12, 4], 'UnderlineThickness', 'num', 50],
+    [[12, 5], 'PaintType', 'num', 0],
+    [[12, 6], 'CharstringType', 'num', 2],
+    [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
+                            [0.001, 0, 0, 0.001, 0, 0]],
+    [13, 'UniqueID', 'num', null],
+    [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
+    [[12, 8], 'StrokeWidth', 'num', 0],
+    [14, 'XUID', 'array', null],
+    [15, 'charset', 'offset', 0],
+    [16, 'Encoding', 'offset', 0],
+    [17, 'CharStrings', 'offset', 0],
+    [18, 'Private', ['offset', 'offset'], null],
+    [[12, 21], 'PostScript', 'sid', null],
+    [[12, 22], 'BaseFontName', 'sid', null],
+    [[12, 23], 'BaseFontBlend', 'delta', null],
+    [[12, 31], 'CIDFontVersion', 'num', 0],
+    [[12, 32], 'CIDFontRevision', 'num', 0],
+    [[12, 33], 'CIDFontType', 'num', 0],
+    [[12, 34], 'CIDCount', 'num', 8720],
+    [[12, 35], 'UIDBase', 'num', null],
+    // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes
+    // before FDArray.
+    [[12, 37], 'FDSelect', 'offset', null],
+    [[12, 36], 'FDArray', 'offset', null],
+    [[12, 38], 'FontName', 'sid', null]
+  ];
+  var tables = null;
+  function CFFTopDict(strings) {
+    if (tables === null) {
+      tables = CFFDict.createTables(layout);
+    }
+    CFFDict.call(this, tables, strings);
+    this.privateDict = null;
+  }
+  CFFTopDict.prototype = Object.create(CFFDict.prototype);
+  return CFFTopDict;
+})();
+
+var CFFPrivateDict = (function CFFPrivateDictClosure() {
+  var layout = [
+    [6, 'BlueValues', 'delta', null],
+    [7, 'OtherBlues', 'delta', null],
+    [8, 'FamilyBlues', 'delta', null],
+    [9, 'FamilyOtherBlues', 'delta', null],
+    [[12, 9], 'BlueScale', 'num', 0.039625],
+    [[12, 10], 'BlueShift', 'num', 7],
+    [[12, 11], 'BlueFuzz', 'num', 1],
+    [10, 'StdHW', 'num', null],
+    [11, 'StdVW', 'num', null],
+    [[12, 12], 'StemSnapH', 'delta', null],
+    [[12, 13], 'StemSnapV', 'delta', null],
+    [[12, 14], 'ForceBold', 'num', 0],
+    [[12, 17], 'LanguageGroup', 'num', 0],
+    [[12, 18], 'ExpansionFactor', 'num', 0.06],
+    [[12, 19], 'initialRandomSeed', 'num', 0],
+    [20, 'defaultWidthX', 'num', 0],
+    [21, 'nominalWidthX', 'num', 0],
+    [19, 'Subrs', 'offset', null]
+  ];
+  var tables = null;
+  function CFFPrivateDict(strings) {
+    if (tables === null) {
+      tables = CFFDict.createTables(layout);
+    }
+    CFFDict.call(this, tables, strings);
+    this.subrsIndex = null;
+  }
+  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
+  return CFFPrivateDict;
+})();
+
+var CFFCharsetPredefinedTypes = {
+  ISO_ADOBE: 0,
+  EXPERT: 1,
+  EXPERT_SUBSET: 2
+};
+var CFFCharset = (function CFFCharsetClosure() {
+  function CFFCharset(predefined, format, charset, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.charset = charset;
+    this.raw = raw;
+  }
+  return CFFCharset;
+})();
+
+var CFFEncoding = (function CFFEncodingClosure() {
+  function CFFEncoding(predefined, format, encoding, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.encoding = encoding;
+    this.raw = raw;
+  }
+  return CFFEncoding;
+})();
+
+var CFFFDSelect = (function CFFFDSelectClosure() {
+  function CFFFDSelect(fdSelect, raw) {
+    this.fdSelect = fdSelect;
+    this.raw = raw;
+  }
+  return CFFFDSelect;
+})();
+
+// Helper class to keep track of where an offset is within the data and helps
+// filling in that offset once it's known.
+var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
+  function CFFOffsetTracker() {
+    this.offsets = {};
+  }
+  CFFOffsetTracker.prototype = {
+    isTracking: function CFFOffsetTracker_isTracking(key) {
+      return key in this.offsets;
+    },
+    track: function CFFOffsetTracker_track(key, location) {
+      if (key in this.offsets) {
+        error('Already tracking location of ' + key);
+      }
+      this.offsets[key] = location;
+    },
+    offset: function CFFOffsetTracker_offset(value) {
+      for (var key in this.offsets) {
+        this.offsets[key] += value;
+      }
+    },
+    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
+                                                                 values,
+                                                                 output) {
+      if (!(key in this.offsets)) {
+        error('Not tracking location of ' + key);
+      }
+      var data = output.data;
+      var dataOffset = this.offsets[key];
+      var size = 5;
+      for (var i = 0, ii = values.length; i < ii; ++i) {
+        var offset0 = i * size + dataOffset;
+        var offset1 = offset0 + 1;
+        var offset2 = offset0 + 2;
+        var offset3 = offset0 + 3;
+        var offset4 = offset0 + 4;
+        // It's easy to screw up offsets so perform this sanity check.
+        if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
+            data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
+          error('writing to an offset that is not empty');
+        }
+        var value = values[i];
+        data[offset0] = 0x1d;
+        data[offset1] = (value >> 24) & 0xFF;
+        data[offset2] = (value >> 16) & 0xFF;
+        data[offset3] = (value >> 8) & 0xFF;
+        data[offset4] = value & 0xFF;
+      }
+    }
+  };
+  return CFFOffsetTracker;
+})();
+
+// Takes a CFF and converts it to the binary representation.
+var CFFCompiler = (function CFFCompilerClosure() {
+  function CFFCompiler(cff) {
+    this.cff = cff;
+  }
+  CFFCompiler.prototype = {
+    compile: function CFFCompiler_compile() {
+      var cff = this.cff;
+      var output = {
+        data: [],
+        length: 0,
+        add: function CFFCompiler_add(data) {
+          this.data = this.data.concat(data);
+          this.length = this.data.length;
+        }
+      };
+
+      // Compile the five entries that must be in order.
+      var header = this.compileHeader(cff.header);
+      output.add(header);
+
+      var nameIndex = this.compileNameIndex(cff.names);
+      output.add(nameIndex);
+
+      if (cff.isCIDFont) {
+        // The spec is unclear on how font matrices should relate to each other
+        // when there is one in the main top dict and the sub top dicts.
+        // Windows handles this differently than linux and osx so we have to
+        // normalize to work on all.
+        // Rules based off of some mailing list discussions:
+        // - If main font has a matrix and subfont doesn't, use the main matrix.
+        // - If no main font matrix and there is a subfont matrix, use the
+        //   subfont matrix.
+        // - If both have matrices, concat together.
+        // - If neither have matrices, use default.
+        // To make this work on all platforms we move the top matrix into each
+        // sub top dict and concat if necessary.
+        if (cff.topDict.hasName('FontMatrix')) {
+          var base = cff.topDict.getByName('FontMatrix');
+          cff.topDict.removeByName('FontMatrix');
+          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
+            var subDict = cff.fdArray[i];
+            var matrix = base.slice(0);
+            if (subDict.hasName('FontMatrix')) {
+              matrix = Util.transform(matrix, subDict.getByName('FontMatrix'));
+            }
+            subDict.setByName('FontMatrix', matrix);
+          }
+        }
+      }
+
+      var compiled = this.compileTopDicts([cff.topDict],
+                                          output.length,
+                                          cff.isCIDFont);
+      output.add(compiled.output);
+      var topDictTracker = compiled.trackers[0];
+
+      var stringIndex = this.compileStringIndex(cff.strings.strings);
+      output.add(stringIndex);
+
+      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
+      output.add(globalSubrIndex);
+
+      // Now start on the other entries that have no specfic order.
+      if (cff.encoding && cff.topDict.hasName('Encoding')) {
+        if (cff.encoding.predefined) {
+          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
+                                          output);
+        } else {
+          var encoding = this.compileEncoding(cff.encoding);
+          topDictTracker.setEntryLocation('Encoding', [output.length], output);
+          output.add(encoding);
+        }
+      }
+
+      if (cff.charset && cff.topDict.hasName('charset')) {
+        if (cff.charset.predefined) {
+          topDictTracker.setEntryLocation('charset', [cff.charset.format],
+                                          output);
+        } else {
+          var charset = this.compileCharset(cff.charset);
+          topDictTracker.setEntryLocation('charset', [output.length], output);
+          output.add(charset);
+        }
+      }
+
+      var charStrings = this.compileCharStrings(cff.charStrings);
+      topDictTracker.setEntryLocation('CharStrings', [output.length], output);
+      output.add(charStrings);
+
+      if (cff.isCIDFont) {
+        // For some reason FDSelect must be in front of FDArray on windows. OSX
+        // and linux don't seem to care.
+        topDictTracker.setEntryLocation('FDSelect', [output.length], output);
+        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
+        output.add(fdSelect);
+        // It is unclear if the sub font dictionary can have CID related
+        // dictionary keys, but the sanitizer doesn't like them so remove them.
+        compiled = this.compileTopDicts(cff.fdArray, output.length, true);
+        topDictTracker.setEntryLocation('FDArray', [output.length], output);
+        output.add(compiled.output);
+        var fontDictTrackers = compiled.trackers;
+
+        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
+      }
+
+      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
+
+      // If the font data ends with INDEX whose object data is zero-length,
+      // the sanitizer will bail out. Add a dummy byte to avoid that.
+      output.add([0]);
+
+      return output.data;
+    },
+    encodeNumber: function CFFCompiler_encodeNumber(value) {
+      if (parseFloat(value) == parseInt(value, 10) && !isNaN(value)) { // isInt
+        return this.encodeInteger(value);
+      } else {
+        return this.encodeFloat(value);
+      }
+    },
+    encodeFloat: function CFFCompiler_encodeFloat(num) {
+      var value = num.toString();
+
+      // rounding inaccurate doubles
+      var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);
+      if (m) {
+        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));
+        value = (Math.round(num * epsilon) / epsilon).toString();
+      }
+
+      var nibbles = '';
+      var i, ii;
+      for (i = 0, ii = value.length; i < ii; ++i) {
+        var a = value[i];
+        if (a === 'e') {
+          nibbles += value[++i] === '-' ? 'c' : 'b';
+        } else if (a === '.') {
+          nibbles += 'a';
+        } else if (a === '-') {
+          nibbles += 'e';
+        } else {
+          nibbles += a;
+        }
+      }
+      nibbles += (nibbles.length & 1) ? 'f' : 'ff';
+      var out = [30];
+      for (i = 0, ii = nibbles.length; i < ii; i += 2) {
+        out.push(parseInt(nibbles.substr(i, 2), 16));
+      }
+      return out;
+    },
+    encodeInteger: function CFFCompiler_encodeInteger(value) {
+      var code;
+      if (value >= -107 && value <= 107) {
+        code = [value + 139];
+      } else if (value >= 108 && value <= 1131) {
+        value = [value - 108];
+        code = [(value >> 8) + 247, value & 0xFF];
+      } else if (value >= -1131 && value <= -108) {
+        value = -value - 108;
+        code = [(value >> 8) + 251, value & 0xFF];
+      } else if (value >= -32768 && value <= 32767) {
+        code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
+      } else {
+        code = [0x1d,
+                (value >> 24) & 0xFF,
+                (value >> 16) & 0xFF,
+                (value >> 8) & 0xFF,
+                 value & 0xFF];
+      }
+      return code;
+    },
+    compileHeader: function CFFCompiler_compileHeader(header) {
+      return [
+        header.major,
+        header.minor,
+        header.hdrSize,
+        header.offSize
+      ];
+    },
+    compileNameIndex: function CFFCompiler_compileNameIndex(names) {
+      var nameIndex = new CFFIndex();
+      for (var i = 0, ii = names.length; i < ii; ++i) {
+        nameIndex.add(stringToArray(names[i]));
+      }
+      return this.compileIndex(nameIndex);
+    },
+    compileTopDicts: function CFFCompiler_compileTopDicts(dicts,
+                                                          length,
+                                                          removeCidKeys) {
+      var fontDictTrackers = [];
+      var fdArrayIndex = new CFFIndex();
+      for (var i = 0, ii = dicts.length; i < ii; ++i) {
+        var fontDict = dicts[i];
+        if (removeCidKeys) {
+          fontDict.removeByName('CIDFontVersion');
+          fontDict.removeByName('CIDFontRevision');
+          fontDict.removeByName('CIDFontType');
+          fontDict.removeByName('CIDCount');
+          fontDict.removeByName('UIDBase');
+        }
+        var fontDictTracker = new CFFOffsetTracker();
+        var fontDictData = this.compileDict(fontDict, fontDictTracker);
+        fontDictTrackers.push(fontDictTracker);
+        fdArrayIndex.add(fontDictData);
+        fontDictTracker.offset(length);
+      }
+      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
+      return {
+        trackers: fontDictTrackers,
+        output: fdArrayIndex
+      };
+    },
+    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
+                                                                  trackers,
+                                                                  output) {
+      for (var i = 0, ii = dicts.length; i < ii; ++i) {
+        var fontDict = dicts[i];
+        assert(fontDict.privateDict && fontDict.hasName('Private'),
+               'There must be an private dictionary.');
+        var privateDict = fontDict.privateDict;
+        var privateDictTracker = new CFFOffsetTracker();
+        var privateDictData = this.compileDict(privateDict, privateDictTracker);
+
+        var outputLength = output.length;
+        privateDictTracker.offset(outputLength);
+        if (!privateDictData.length) {
+          // The private dictionary was empty, set the output length to zero to
+          // ensure the offset length isn't out of bounds in the eyes of the
+          // sanitizer.
+          outputLength = 0;
+        }
+
+        trackers[i].setEntryLocation('Private',
+                                     [privateDictData.length, outputLength],
+                                     output);
+        output.add(privateDictData);
+
+        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
+          var subrs = this.compileIndex(privateDict.subrsIndex);
+          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
+                                              output);
+          output.add(subrs);
+        }
+      }
+    },
+    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
+      var out = [];
+      // The dictionary keys must be in a certain order.
+      var order = dict.order;
+      for (var i = 0; i < order.length; ++i) {
+        var key = order[i];
+        if (!(key in dict.values)) {
+          continue;
+        }
+        var values = dict.values[key];
+        var types = dict.types[key];
+        if (!isArray(types)) {
+          types = [types];
+        }
+        if (!isArray(values)) {
+          values = [values];
+        }
+
+        // Remove any empty dict values.
+        if (values.length === 0) {
+          continue;
+        }
+
+        for (var j = 0, jj = types.length; j < jj; ++j) {
+          var type = types[j];
+          var value = values[j];
+          switch (type) {
+            case 'num':
+            case 'sid':
+              out = out.concat(this.encodeNumber(value));
+              break;
+            case 'offset':
+              // For offsets we just insert a 32bit integer so we don't have to
+              // deal with figuring out the length of the offset when it gets
+              // replaced later on by the compiler.
+              var name = dict.keyToNameMap[key];
+              // Some offsets have the offset and the length, so just record the
+              // position of the first one.
+              if (!offsetTracker.isTracking(name)) {
+                offsetTracker.track(name, out.length);
+              }
+              out = out.concat([0x1d, 0, 0, 0, 0]);
+              break;
+            case 'array':
+            case 'delta':
+              out = out.concat(this.encodeNumber(value));
+              for (var k = 1, kk = values.length; k < kk; ++k) {
+                out = out.concat(this.encodeNumber(values[k]));
+              }
+              break;
+            default:
+              error('Unknown data type of ' + type);
+              break;
+          }
+        }
+        out = out.concat(dict.opcodes[key]);
+      }
+      return out;
+    },
+    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
+      var stringIndex = new CFFIndex();
+      for (var i = 0, ii = strings.length; i < ii; ++i) {
+        stringIndex.add(stringToArray(strings[i]));
+      }
+      return this.compileIndex(stringIndex);
+    },
+    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
+      var globalSubrIndex = this.cff.globalSubrIndex;
+      this.out.writeByteArray(this.compileIndex(globalSubrIndex));
+    },
+    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
+      return this.compileIndex(charStrings);
+    },
+    compileCharset: function CFFCompiler_compileCharset(charset) {
+      return this.compileTypedArray(charset.raw);
+    },
+    compileEncoding: function CFFCompiler_compileEncoding(encoding) {
+      return this.compileTypedArray(encoding.raw);
+    },
+    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
+      return this.compileTypedArray(fdSelect);
+    },
+    compileTypedArray: function CFFCompiler_compileTypedArray(data) {
+      var out = [];
+      for (var i = 0, ii = data.length; i < ii; ++i) {
+        out[i] = data[i];
+      }
+      return out;
+    },
+    compileIndex: function CFFCompiler_compileIndex(index, trackers) {
+      trackers = trackers || [];
+      var objects = index.objects;
+      // First 2 bytes contains the number of objects contained into this index
+      var count = objects.length;
+
+      // If there is no object, just create an index. This technically
+      // should just be [0, 0] but OTS has an issue with that.
+      if (count === 0) {
+        return [0, 0, 0];
+      }
+
+      var data = [(count >> 8) & 0xFF, count & 0xff];
+
+      var lastOffset = 1, i;
+      for (i = 0; i < count; ++i) {
+        lastOffset += objects[i].length;
+      }
+
+      var offsetSize;
+      if (lastOffset < 0x100) {
+        offsetSize = 1;
+      } else if (lastOffset < 0x10000) {
+        offsetSize = 2;
+      } else if (lastOffset < 0x1000000) {
+        offsetSize = 3;
+      } else {
+        offsetSize = 4;
+      }
+
+      // Next byte contains the offset size use to reference object in the file
+      data.push(offsetSize);
+
+      // Add another offset after this one because we need a new offset
+      var relativeOffset = 1;
+      for (i = 0; i < count + 1; i++) {
+        if (offsetSize === 1) {
+          data.push(relativeOffset & 0xFF);
+        } else if (offsetSize === 2) {
+          data.push((relativeOffset >> 8) & 0xFF,
+                     relativeOffset & 0xFF);
+        } else if (offsetSize === 3) {
+          data.push((relativeOffset >> 16) & 0xFF,
+                    (relativeOffset >> 8) & 0xFF,
+                     relativeOffset & 0xFF);
+        } else {
+          data.push((relativeOffset >>> 24) & 0xFF,
+                    (relativeOffset >> 16) & 0xFF,
+                    (relativeOffset >> 8) & 0xFF,
+                     relativeOffset & 0xFF);
+        }
+
+        if (objects[i]) {
+          relativeOffset += objects[i].length;
+        }
+      }
+
+      for (i = 0; i < count; i++) {
+        // Notify the tracker where the object will be offset in the data.
+        if (trackers[i]) {
+          trackers[i].offset(data.length);
+        }
+        for (var j = 0, jj = objects[i].length; j < jj; j++) {
+          data.push(objects[i][j]);
+        }
+      }
+      return data;
+    }
+  };
+  return CFFCompiler;
+})();
+
+// Workaround for seac on Windows.
+(function checkSeacSupport() {
+  if (/Windows/.test(navigator.userAgent)) {
+    SEAC_ANALYSIS_ENABLED = true;
+  }
+})();
+
+// Workaround for Private Use Area characters in Chrome on Windows
+// http://code.google.com/p/chromium/issues/detail?id=122465
+// https://github.com/mozilla/pdf.js/issues/1689
+(function checkChromeWindows() {
+  if (/Windows.*Chrome/.test(navigator.userAgent)) {
+    SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true;
+  }
+})();
+
+
+var FontRendererFactory = (function FontRendererFactoryClosure() {
+  function getLong(data, offset) {
+    return (data[offset] << 24) | (data[offset + 1] << 16) |
+           (data[offset + 2] << 8) | data[offset + 3];
+  }
+
+  function getUshort(data, offset) {
+    return (data[offset] << 8) | data[offset + 1];
+  }
+
+  function parseCmap(data, start, end) {
+    var offset = (getUshort(data, start + 2) === 1 ?
+                  getLong(data, start + 8) : getLong(data, start + 16));
+    var format = getUshort(data, start + offset);
+    var length, ranges, p, i;
+    if (format === 4) {
+      length = getUshort(data, start + offset + 2);
+      var segCount = getUshort(data, start + offset + 6) >> 1;
+      p = start + offset + 14;
+      ranges = [];
+      for (i = 0; i < segCount; i++, p += 2) {
+        ranges[i] = {end: getUshort(data, p)};
+      }
+      p += 2;
+      for (i = 0; i < segCount; i++, p += 2) {
+        ranges[i].start = getUshort(data, p);
+      }
+      for (i = 0; i < segCount; i++, p += 2) {
+        ranges[i].idDelta = getUshort(data, p);
+      }
+      for (i = 0; i < segCount; i++, p += 2) {
+        var idOffset = getUshort(data, p);
+        if (idOffset === 0) {
+          continue;
+        }
+        ranges[i].ids = [];
+        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
+          ranges[i].ids[j] = getUshort(data, p + idOffset);
+          idOffset += 2;
+        }
+      }
+      return ranges;
+    } else if (format === 12) {
+      length = getLong(data, start + offset + 4);
+      var groups = getLong(data, start + offset + 12);
+      p = start + offset + 16;
+      ranges = [];
+      for (i = 0; i < groups; i++) {
+        ranges.push({
+          start: getLong(data, p),
+          end: getLong(data, p + 4),
+          idDelta: getLong(data, p + 8) - getLong(data, p)
+        });
+        p += 12;
+      }
+      return ranges;
+    }
+    error('not supported cmap: ' + format);
+  }
+
+  function parseCff(data, start, end) {
+    var properties = {};
+    var parser = new CFFParser(new Stream(data, start, end - start),
+                               properties);
+    var cff = parser.parse();
+    return {
+      glyphs: cff.charStrings.objects,
+      subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex &&
+              cff.topDict.privateDict.subrsIndex.objects),
+      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects
+    };
+  }
+
+  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
+    var itemSize, itemDecode;
+    if (isGlyphLocationsLong) {
+      itemSize = 4;
+      itemDecode = function fontItemDecodeLong(data, offset) {
+        return (data[offset] << 24) | (data[offset + 1] << 16) |
+               (data[offset + 2] << 8) | data[offset + 3];
+      };
+    } else {
+      itemSize = 2;
+      itemDecode = function fontItemDecode(data, offset) {
+        return (data[offset] << 9) | (data[offset + 1] << 1);
+      };
+    }
+    var glyphs = [];
+    var startOffset = itemDecode(loca, 0);
+    for (var j = itemSize; j < loca.length; j += itemSize) {
+      var endOffset = itemDecode(loca, j);
+      glyphs.push(glyf.subarray(startOffset, endOffset));
+      startOffset = endOffset;
+    }
+    return glyphs;
+  }
+
+  function lookupCmap(ranges, unicode) {
+    var code = unicode.charCodeAt(0);
+    var l = 0, r = ranges.length - 1;
+    while (l < r) {
+      var c = (l + r + 1) >> 1;
+      if (code < ranges[c].start) {
+        r = c - 1;
+      } else {
+        l = c;
+      }
+    }
+    if (ranges[l].start <= code && code <= ranges[l].end) {
+      return (ranges[l].idDelta + (ranges[l].ids ?
+        ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF;
+    }
+    return 0;
+  }
+
+  function compileGlyf(code, js, font) {
+    function moveTo(x, y) {
+      js.push('c.moveTo(' + x + ',' + y + ');');
+    }
+    function lineTo(x, y) {
+      js.push('c.lineTo(' + x + ',' + y + ');');
+    }
+    function quadraticCurveTo(xa, ya, x, y) {
+      js.push('c.quadraticCurveTo(' + xa + ',' + ya + ',' +
+                                   x + ',' + y + ');');
+    }
+
+    var i = 0;
+    var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+    var flags;
+    var x = 0, y = 0;
+    i += 10;
+    if (numberOfContours < 0) {
+      // composite glyph
+      do {
+        flags = (code[i] << 8) | code[i + 1];
+        var glyphIndex = (code[i + 2] << 8) | code[i + 3];
+        i += 4;
+        var arg1, arg2;
+        if ((flags & 0x01)) {
+          arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+          arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16;
+          i += 4;
+        } else {
+          arg1 = code[i++]; arg2 = code[i++];
+        }
+        if ((flags & 0x02)) {
+           x = arg1;
+           y = arg2;
+        } else {
+           x = 0; y = 0; // TODO "they are points" ?
+        }
+        var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0;
+        if ((flags & 0x08)) {
+          scaleX =
+          scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
+          i += 2;
+        } else if ((flags & 0x40)) {
+          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
+          scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;
+          i += 4;
+        } else if ((flags & 0x80)) {
+          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
+          scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;
+          scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824;
+          scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824;
+          i += 8;
+        }
+        var subglyph = font.glyphs[glyphIndex];
+        if (subglyph) {
+          js.push('c.save();');
+          js.push('c.transform(' + scaleX + ',' + scale01 + ',' +
+                  scale10 + ',' + scaleY + ',' + x + ',' + y + ');');
+          compileGlyf(subglyph, js, font);
+          js.push('c.restore();');
+        }
+      } while ((flags & 0x20));
+    } else {
+      // simple glyph
+      var endPtsOfContours = [];
+      var j, jj;
+      for (j = 0; j < numberOfContours; j++) {
+        endPtsOfContours.push((code[i] << 8) | code[i + 1]);
+        i += 2;
+      }
+      var instructionLength = (code[i] << 8) | code[i + 1];
+      i += 2 + instructionLength; // skipping the instructions
+      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;
+      var points = [];
+      while (points.length < numberOfPoints) {
+        flags = code[i++];
+        var repeat = 1;
+        if ((flags & 0x08)) {
+          repeat += code[i++];
+        }
+        while (repeat-- > 0) {
+          points.push({flags: flags});
+        }
+      }
+      for (j = 0; j < numberOfPoints; j++) {
+        switch (points[j].flags & 0x12) {
+          case 0x00:
+            x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+            i += 2;
+            break;
+          case 0x02:
+            x -= code[i++];
+            break;
+          case 0x12:
+            x += code[i++];
+            break;
+        }
+        points[j].x = x;
+      }
+      for (j = 0; j < numberOfPoints; j++) {
+        switch (points[j].flags & 0x24) {
+          case 0x00:
+            y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+            i += 2;
+            break;
+          case 0x04:
+            y -= code[i++];
+            break;
+          case 0x24:
+            y += code[i++];
+            break;
+        }
+        points[j].y = y;
+      }
+
+      var startPoint = 0;
+      for (i = 0; i < numberOfContours; i++) {
+        var endPoint = endPtsOfContours[i];
+        // contours might have implicit points, which is located in the middle
+        // between two neighboring off-curve points
+        var contour = points.slice(startPoint, endPoint + 1);
+        if ((contour[0].flags & 1)) {
+          contour.push(contour[0]); // using start point at the contour end
+        } else if ((contour[contour.length - 1].flags & 1)) {
+          // first is off-curve point, trying to use one from the end
+          contour.unshift(contour[contour.length - 1]);
+        } else {
+          // start and end are off-curve points, creating implicit one
+          var p = {
+            flags: 1,
+            x: (contour[0].x + contour[contour.length - 1].x) / 2,
+            y: (contour[0].y + contour[contour.length - 1].y) / 2
+          };
+          contour.unshift(p);
+          contour.push(p);
+        }
+        moveTo(contour[0].x, contour[0].y);
+        for (j = 1, jj = contour.length; j < jj; j++) {
+          if ((contour[j].flags & 1)) {
+            lineTo(contour[j].x, contour[j].y);
+          } else if ((contour[j + 1].flags & 1)){
+            quadraticCurveTo(contour[j].x, contour[j].y,
+                             contour[j + 1].x, contour[j + 1].y);
+            j++;
+          } else {
+            quadraticCurveTo(contour[j].x, contour[j].y,
+              (contour[j].x + contour[j + 1].x) / 2,
+              (contour[j].y + contour[j + 1].y) / 2);
+          }
+        }
+        startPoint = endPoint + 1;
+      }
+    }
+  }
+
+  function compileCharString(code, js, font) {
+    var stack = [];
+    var x = 0, y = 0;
+    var stems = 0;
+
+    function moveTo(x, y) {
+      js.push('c.moveTo(' + x + ',' + y + ');');
+    }
+    function lineTo(x, y) {
+      js.push('c.lineTo(' + x + ',' + y + ');');
+    }
+    function bezierCurveTo(x1, y1, x2, y2, x, y) {
+      js.push('c.bezierCurveTo(' + x1 + ',' + y1 + ',' + x2 + ',' + y2 + ',' +
+                                   x + ',' + y + ');');
+    }
+
+    function parse(code) {
+      var i = 0;
+      while (i < code.length) {
+        var stackClean = false;
+        var v = code[i++];
+        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;
+        switch (v) {
+          case 1: // hstem
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 3: // vstem
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 4: // vmoveto
+            y += stack.pop();
+            moveTo(x, y);
+            stackClean = true;
+            break;
+          case 5: // rlineto
+            while (stack.length > 0) {
+              x += stack.shift();
+              y += stack.shift();
+              lineTo(x, y);
+            }
+            break;
+          case 6: // hlineto
+            while (stack.length > 0) {
+              x += stack.shift();
+              lineTo(x, y);
+              if (stack.length === 0) {
+                break;
+              }
+              y += stack.shift();
+              lineTo(x, y);
+            }
+            break;
+          case 7: // vlineto
+            while (stack.length > 0) {
+              y += stack.shift();
+              lineTo(x, y);
+              if (stack.length === 0) {
+                break;
+              }
+              x += stack.shift();
+              lineTo(x, y);
+            }
+            break;
+          case 8: // rrcurveto
+            while (stack.length > 0) {
+              xa = x + stack.shift(); ya = y + stack.shift();
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              x = xb + stack.shift(); y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 10: // callsubr
+            n = stack.pop() + font.subrsBias;
+            subrCode = font.subrs[n];
+            if (subrCode) {
+              parse(subrCode);
+            }
+            break;
+          case 11: // return
+            return;
+          case 12:
+            v = code[i++];
+            switch (v) {
+              case 34: // flex
+                xa = x + stack.shift();
+                xb = xa + stack.shift(); y1 = y + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y, xb, y1, x, y1);
+                xa = x + stack.shift();
+                xb = xa + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y1, xb, y, x, y);
+                break;
+              case 35: // flex
+                xa = x + stack.shift(); ya = y + stack.shift();
+                xb = xa + stack.shift(); yb = ya + stack.shift();
+                x = xb + stack.shift(); y = yb + stack.shift();
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                xa = x + stack.shift(); ya = y + stack.shift();
+                xb = xa + stack.shift(); yb = ya + stack.shift();
+                x = xb + stack.shift(); y = yb + stack.shift();
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                stack.pop(); // fd
+                break;
+              case 36: // hflex1
+                xa = x + stack.shift(); y1 = y + stack.shift();
+                xb = xa + stack.shift(); y2 = y1 + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y1, xb, y2, x, y2);
+                xa = x + stack.shift();
+                xb = xa + stack.shift(); y3 = y2 + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y2, xb, y3, x, y);
+                break;
+              case 37: // flex1
+                var x0 = x, y0 = y;
+                xa = x + stack.shift(); ya = y + stack.shift();
+                xb = xa + stack.shift(); yb = ya + stack.shift();
+                x = xb + stack.shift(); y = yb + stack.shift();
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                xa = x + stack.shift(); ya = y + stack.shift();
+                xb = xa + stack.shift(); yb = ya + stack.shift();
+                x = xb; y = yb;
+                if (Math.abs(x - x0) > Math.abs(y - y0)) {
+                  x += stack.shift();
+                } else  {
+                  y += stack.shift();
+                }
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                break;
+              default:
+                error('unknown operator: 12 ' + v);
+            }
+            break;
+          case 14: // endchar
+            if (stack.length >= 4) {
+              var achar = stack.pop();
+              var bchar = stack.pop();
+              y = stack.pop();
+              x = stack.pop();
+              js.push('c.save();');
+              js.push('c.translate('+ x + ',' + y + ');');
+              var gid = lookupCmap(font.cmap, String.fromCharCode(
+                font.glyphNameMap[Encodings.StandardEncoding[achar]]));
+              compileCharString(font.glyphs[gid], js, font);
+              js.push('c.restore();');
+
+              gid = lookupCmap(font.cmap, String.fromCharCode(
+                font.glyphNameMap[Encodings.StandardEncoding[bchar]]));
+              compileCharString(font.glyphs[gid], js, font);
+            }
+            return;
+          case 18: // hstemhm
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 19: // hintmask
+            stems += stack.length >> 1;
+            i += (stems + 7) >> 3;
+            stackClean = true;
+            break;
+          case 20: // cntrmask
+            stems += stack.length >> 1;
+            i += (stems + 7) >> 3;
+            stackClean = true;
+            break;
+          case 21: // rmoveto
+            y += stack.pop();
+            x += stack.pop();
+            moveTo(x, y);
+            stackClean = true;
+            break;
+          case 22: // hmoveto
+            x += stack.pop();
+            moveTo(x, y);
+            stackClean = true;
+            break;
+          case 23: // vstemhm
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 24: // rcurveline
+            while (stack.length > 2) {
+              xa = x + stack.shift(); ya = y + stack.shift();
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              x = xb + stack.shift(); y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            x += stack.shift();
+            y += stack.shift();
+            lineTo(x, y);
+            break;
+          case 25: // rlinecurve
+            while (stack.length > 6) {
+              x += stack.shift();
+              y += stack.shift();
+              lineTo(x, y);
+            }
+            xa = x + stack.shift(); ya = y + stack.shift();
+            xb = xa + stack.shift(); yb = ya + stack.shift();
+            x = xb + stack.shift(); y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+            break;
+          case 26: // vvcurveto
+            if (stack.length % 2) {
+              x += stack.shift();
+            }
+            while (stack.length > 0) {
+              xa = x; ya = y + stack.shift();
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              x = xb; y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 27: // hhcurveto
+            if (stack.length % 2) {
+              y += stack.shift();
+            }
+            while (stack.length > 0) {
+              xa = x + stack.shift(); ya = y;
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              x = xb + stack.shift(); y = yb;
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 28:
+            stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16);
+            i += 2;
+            break;
+          case 29: // callgsubr
+            n = stack.pop() + font.gsubrsBias;
+            subrCode = font.gsubrs[n];
+            if (subrCode) {
+              parse(subrCode);
+            }
+            break;
+          case 30: // vhcurveto
+            while (stack.length > 0) {
+              xa = x; ya = y + stack.shift();
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              if (stack.length === 0) {
+                break;
+              }
+
+              xa = x + stack.shift(); ya = y;
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              y = yb + stack.shift();
+              x = xb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 31: // hvcurveto
+            while (stack.length > 0) {
+              xa = x + stack.shift(); ya = y;
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              y = yb + stack.shift();
+              x = xb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              if (stack.length === 0) {
+                break;
+              }
+
+              xa = x; ya = y + stack.shift();
+              xb = xa + stack.shift(); yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          default:
+            if (v < 32) {
+              error('unknown operator: ' + v);
+            }
+            if (v < 247) {
+              stack.push(v - 139);
+            } else if (v < 251) {
+              stack.push((v - 247) * 256 + code[i++] + 108);
+            } else if (v < 255) {
+              stack.push(-(v - 251) * 256 - code[i++] - 108);
+            } else {
+              stack.push(((code[i] << 24) | (code[i + 1] << 16) |
+                         (code[i + 2] << 8) | code[i + 3]) / 65536);
+              i += 4;
+            }
+            break;
+        }
+        if (stackClean) {
+          stack.length = 0;
+        }
+      }
+    }
+    parse(code);
+  }
+
+  var noop = '';
+
+  function CompiledFont(fontMatrix) {
+    this.compiledGlyphs = {};
+    this.fontMatrix = fontMatrix;
+  }
+  CompiledFont.prototype = {
+    getPathJs: function (unicode) {
+      var gid = lookupCmap(this.cmap, unicode);
+      var fn = this.compiledGlyphs[gid];
+      if (!fn) {
+        this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]);
+      }
+      return fn;
+    },
+
+    compileGlyph: function (code) {
+      if (!code || code.length === 0 || code[0] === 14) {
+        return noop;
+      }
+
+      var js = [];
+      js.push('c.save();');
+      js.push('c.transform(' + this.fontMatrix.join(',') + ');');
+      js.push('c.scale(size, -size);');
+
+      this.compileGlyphImpl(code, js);
+
+      js.push('c.restore();');
+
+      return js.join('\n');
+    },
+
+    compileGlyphImpl: function () {
+      error('Children classes should implement this.');
+    },
+
+    hasBuiltPath: function (unicode) {
+      var gid = lookupCmap(this.cmap, unicode);
+      return gid in this.compiledGlyphs;
+    }
+  };
+
+  function TrueTypeCompiled(glyphs, cmap, fontMatrix) {
+    fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0];
+    CompiledFont.call(this, fontMatrix);
+
+    this.glyphs = glyphs;
+    this.cmap = cmap;
+
+    this.compiledGlyphs = [];
+  }
+
+  Util.inherit(TrueTypeCompiled, CompiledFont, {
+    compileGlyphImpl: function (code, js) {
+      compileGlyf(code, js, this);
+    }
+  });
+
+  function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {
+    fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0];
+    CompiledFont.call(this, fontMatrix);
+    this.glyphs = cffInfo.glyphs;
+    this.gsubrs = cffInfo.gsubrs || [];
+    this.subrs = cffInfo.subrs || [];
+    this.cmap = cmap;
+    this.glyphNameMap = glyphNameMap || GlyphsUnicode;
+
+    this.compiledGlyphs = [];
+    this.gsubrsBias = (this.gsubrs.length < 1240 ?
+                       107 : (this.gsubrs.length < 33900 ? 1131 : 32768));
+    this.subrsBias = (this.subrs.length < 1240 ?
+                      107 : (this.subrs.length < 33900 ? 1131 : 32768));
+  }
+
+  Util.inherit(Type2Compiled, CompiledFont, {
+    compileGlyphImpl: function (code, js) {
+      compileCharString(code, js, this);
+    }
+  });
+
+
+  return {
+    create: function FontRendererFactory_create(font) {
+      var data = new Uint8Array(font.data);
+      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
+      var numTables = getUshort(data, 4);
+      for (var i = 0, p = 12; i < numTables; i++, p += 16) {
+        var tag = bytesToString(data.subarray(p, p + 4));
+        var offset = getLong(data, p + 8);
+        var length = getLong(data, p + 12);
+        switch (tag) {
+          case 'cmap':
+            cmap = parseCmap(data, offset, offset + length);
+            break;
+          case 'glyf':
+            glyf = data.subarray(offset, offset + length);
+            break;
+          case 'loca':
+            loca = data.subarray(offset, offset + length);
+            break;
+          case 'head':
+            unitsPerEm = getUshort(data, offset + 18);
+            indexToLocFormat = getUshort(data, offset + 50);
+            break;
+          case 'CFF ':
+            cff = parseCff(data, offset, offset + length);
+            break;
+        }
+      }
+
+      if (glyf) {
+        var fontMatrix = (!unitsPerEm ? font.fontMatrix :
+                          [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]);
+        return new TrueTypeCompiled(
+          parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
+      } else {
+        return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
+      }
+    }
+  };
+})();
+
+
+
+var GlyphsUnicode = {
+  A: 0x0041,
+  AE: 0x00C6,
+  AEacute: 0x01FC,
+  AEmacron: 0x01E2,
+  AEsmall: 0xF7E6,
+  Aacute: 0x00C1,
+  Aacutesmall: 0xF7E1,
+  Abreve: 0x0102,
+  Abreveacute: 0x1EAE,
+  Abrevecyrillic: 0x04D0,
+  Abrevedotbelow: 0x1EB6,
+  Abrevegrave: 0x1EB0,
+  Abrevehookabove: 0x1EB2,
+  Abrevetilde: 0x1EB4,
+  Acaron: 0x01CD,
+  Acircle: 0x24B6,
+  Acircumflex: 0x00C2,
+  Acircumflexacute: 0x1EA4,
+  Acircumflexdotbelow: 0x1EAC,
+  Acircumflexgrave: 0x1EA6,
+  Acircumflexhookabove: 0x1EA8,
+  Acircumflexsmall: 0xF7E2,
+  Acircumflextilde: 0x1EAA,
+  Acute: 0xF6C9,
+  Acutesmall: 0xF7B4,
+  Acyrillic: 0x0410,
+  Adblgrave: 0x0200,
+  Adieresis: 0x00C4,
+  Adieresiscyrillic: 0x04D2,
+  Adieresismacron: 0x01DE,
+  Adieresissmall: 0xF7E4,
+  Adotbelow: 0x1EA0,
+  Adotmacron: 0x01E0,
+  Agrave: 0x00C0,
+  Agravesmall: 0xF7E0,
+  Ahookabove: 0x1EA2,
+  Aiecyrillic: 0x04D4,
+  Ainvertedbreve: 0x0202,
+  Alpha: 0x0391,
+  Alphatonos: 0x0386,
+  Amacron: 0x0100,
+  Amonospace: 0xFF21,
+  Aogonek: 0x0104,
+  Aring: 0x00C5,
+  Aringacute: 0x01FA,
+  Aringbelow: 0x1E00,
+  Aringsmall: 0xF7E5,
+  Asmall: 0xF761,
+  Atilde: 0x00C3,
+  Atildesmall: 0xF7E3,
+  Aybarmenian: 0x0531,
+  B: 0x0042,
+  Bcircle: 0x24B7,
+  Bdotaccent: 0x1E02,
+  Bdotbelow: 0x1E04,
+  Becyrillic: 0x0411,
+  Benarmenian: 0x0532,
+  Beta: 0x0392,
+  Bhook: 0x0181,
+  Blinebelow: 0x1E06,
+  Bmonospace: 0xFF22,
+  Brevesmall: 0xF6F4,
+  Bsmall: 0xF762,
+  Btopbar: 0x0182,
+  C: 0x0043,
+  Caarmenian: 0x053E,
+  Cacute: 0x0106,
+  Caron: 0xF6CA,
+  Caronsmall: 0xF6F5,
+  Ccaron: 0x010C,
+  Ccedilla: 0x00C7,
+  Ccedillaacute: 0x1E08,
+  Ccedillasmall: 0xF7E7,
+  Ccircle: 0x24B8,
+  Ccircumflex: 0x0108,
+  Cdot: 0x010A,
+  Cdotaccent: 0x010A,
+  Cedillasmall: 0xF7B8,
+  Chaarmenian: 0x0549,
+  Cheabkhasiancyrillic: 0x04BC,
+  Checyrillic: 0x0427,
+  Chedescenderabkhasiancyrillic: 0x04BE,
+  Chedescendercyrillic: 0x04B6,
+  Chedieresiscyrillic: 0x04F4,
+  Cheharmenian: 0x0543,
+  Chekhakassiancyrillic: 0x04CB,
+  Cheverticalstrokecyrillic: 0x04B8,
+  Chi: 0x03A7,
+  Chook: 0x0187,
+  Circumflexsmall: 0xF6F6,
+  Cmonospace: 0xFF23,
+  Coarmenian: 0x0551,
+  Csmall: 0xF763,
+  D: 0x0044,
+  DZ: 0x01F1,
+  DZcaron: 0x01C4,
+  Daarmenian: 0x0534,
+  Dafrican: 0x0189,
+  Dcaron: 0x010E,
+  Dcedilla: 0x1E10,
+  Dcircle: 0x24B9,
+  Dcircumflexbelow: 0x1E12,
+  Dcroat: 0x0110,
+  Ddotaccent: 0x1E0A,
+  Ddotbelow: 0x1E0C,
+  Decyrillic: 0x0414,
+  Deicoptic: 0x03EE,
+  Delta: 0x2206,
+  Deltagreek: 0x0394,
+  Dhook: 0x018A,
+  Dieresis: 0xF6CB,
+  DieresisAcute: 0xF6CC,
+  DieresisGrave: 0xF6CD,
+  Dieresissmall: 0xF7A8,
+  Digammagreek: 0x03DC,
+  Djecyrillic: 0x0402,
+  Dlinebelow: 0x1E0E,
+  Dmonospace: 0xFF24,
+  Dotaccentsmall: 0xF6F7,
+  Dslash: 0x0110,
+  Dsmall: 0xF764,
+  Dtopbar: 0x018B,
+  Dz: 0x01F2,
+  Dzcaron: 0x01C5,
+  Dzeabkhasiancyrillic: 0x04E0,
+  Dzecyrillic: 0x0405,
+  Dzhecyrillic: 0x040F,
+  E: 0x0045,
+  Eacute: 0x00C9,
+  Eacutesmall: 0xF7E9,
+  Ebreve: 0x0114,
+  Ecaron: 0x011A,
+  Ecedillabreve: 0x1E1C,
+  Echarmenian: 0x0535,
+  Ecircle: 0x24BA,
+  Ecircumflex: 0x00CA,
+  Ecircumflexacute: 0x1EBE,
+  Ecircumflexbelow: 0x1E18,
+  Ecircumflexdotbelow: 0x1EC6,
+  Ecircumflexgrave: 0x1EC0,
+  Ecircumflexhookabove: 0x1EC2,
+  Ecircumflexsmall: 0xF7EA,
+  Ecircumflextilde: 0x1EC4,
+  Ecyrillic: 0x0404,
+  Edblgrave: 0x0204,
+  Edieresis: 0x00CB,
+  Edieresissmall: 0xF7EB,
+  Edot: 0x0116,
+  Edotaccent: 0x0116,
+  Edotbelow: 0x1EB8,
+  Efcyrillic: 0x0424,
+  Egrave: 0x00C8,
+  Egravesmall: 0xF7E8,
+  Eharmenian: 0x0537,
+  Ehookabove: 0x1EBA,
+  Eightroman: 0x2167,
+  Einvertedbreve: 0x0206,
+  Eiotifiedcyrillic: 0x0464,
+  Elcyrillic: 0x041B,
+  Elevenroman: 0x216A,
+  Emacron: 0x0112,
+  Emacronacute: 0x1E16,
+  Emacrongrave: 0x1E14,
+  Emcyrillic: 0x041C,
+  Emonospace: 0xFF25,
+  Encyrillic: 0x041D,
+  Endescendercyrillic: 0x04A2,
+  Eng: 0x014A,
+  Enghecyrillic: 0x04A4,
+  Enhookcyrillic: 0x04C7,
+  Eogonek: 0x0118,
+  Eopen: 0x0190,
+  Epsilon: 0x0395,
+  Epsilontonos: 0x0388,
+  Ercyrillic: 0x0420,
+  Ereversed: 0x018E,
+  Ereversedcyrillic: 0x042D,
+  Escyrillic: 0x0421,
+  Esdescendercyrillic: 0x04AA,
+  Esh: 0x01A9,
+  Esmall: 0xF765,
+  Eta: 0x0397,
+  Etarmenian: 0x0538,
+  Etatonos: 0x0389,
+  Eth: 0x00D0,
+  Ethsmall: 0xF7F0,
+  Etilde: 0x1EBC,
+  Etildebelow: 0x1E1A,
+  Euro: 0x20AC,
+  Ezh: 0x01B7,
+  Ezhcaron: 0x01EE,
+  Ezhreversed: 0x01B8,
+  F: 0x0046,
+  Fcircle: 0x24BB,
+  Fdotaccent: 0x1E1E,
+  Feharmenian: 0x0556,
+  Feicoptic: 0x03E4,
+  Fhook: 0x0191,
+  Fitacyrillic: 0x0472,
+  Fiveroman: 0x2164,
+  Fmonospace: 0xFF26,
+  Fourroman: 0x2163,
+  Fsmall: 0xF766,
+  G: 0x0047,
+  GBsquare: 0x3387,
+  Gacute: 0x01F4,
+  Gamma: 0x0393,
+  Gammaafrican: 0x0194,
+  Gangiacoptic: 0x03EA,
+  Gbreve: 0x011E,
+  Gcaron: 0x01E6,
+  Gcedilla: 0x0122,
+  Gcircle: 0x24BC,
+  Gcircumflex: 0x011C,
+  Gcommaaccent: 0x0122,
+  Gdot: 0x0120,
+  Gdotaccent: 0x0120,
+  Gecyrillic: 0x0413,
+  Ghadarmenian: 0x0542,
+  Ghemiddlehookcyrillic: 0x0494,
+  Ghestrokecyrillic: 0x0492,
+  Gheupturncyrillic: 0x0490,
+  Ghook: 0x0193,
+  Gimarmenian: 0x0533,
+  Gjecyrillic: 0x0403,
+  Gmacron: 0x1E20,
+  Gmonospace: 0xFF27,
+  Grave: 0xF6CE,
+  Gravesmall: 0xF760,
+  Gsmall: 0xF767,
+  Gsmallhook: 0x029B,
+  Gstroke: 0x01E4,
+  H: 0x0048,
+  H18533: 0x25CF,
+  H18543: 0x25AA,
+  H18551: 0x25AB,
+  H22073: 0x25A1,
+  HPsquare: 0x33CB,
+  Haabkhasiancyrillic: 0x04A8,
+  Hadescendercyrillic: 0x04B2,
+  Hardsigncyrillic: 0x042A,
+  Hbar: 0x0126,
+  Hbrevebelow: 0x1E2A,
+  Hcedilla: 0x1E28,
+  Hcircle: 0x24BD,
+  Hcircumflex: 0x0124,
+  Hdieresis: 0x1E26,
+  Hdotaccent: 0x1E22,
+  Hdotbelow: 0x1E24,
+  Hmonospace: 0xFF28,
+  Hoarmenian: 0x0540,
+  Horicoptic: 0x03E8,
+  Hsmall: 0xF768,
+  Hungarumlaut: 0xF6CF,
+  Hungarumlautsmall: 0xF6F8,
+  Hzsquare: 0x3390,
+  I: 0x0049,
+  IAcyrillic: 0x042F,
+  IJ: 0x0132,
+  IUcyrillic: 0x042E,
+  Iacute: 0x00CD,
+  Iacutesmall: 0xF7ED,
+  Ibreve: 0x012C,
+  Icaron: 0x01CF,
+  Icircle: 0x24BE,
+  Icircumflex: 0x00CE,
+  Icircumflexsmall: 0xF7EE,
+  Icyrillic: 0x0406,
+  Idblgrave: 0x0208,
+  Idieresis: 0x00CF,
+  Idieresisacute: 0x1E2E,
+  Idieresiscyrillic: 0x04E4,
+  Idieresissmall: 0xF7EF,
+  Idot: 0x0130,
+  Idotaccent: 0x0130,
+  Idotbelow: 0x1ECA,
+  Iebrevecyrillic: 0x04D6,
+  Iecyrillic: 0x0415,
+  Ifraktur: 0x2111,
+  Igrave: 0x00CC,
+  Igravesmall: 0xF7EC,
+  Ihookabove: 0x1EC8,
+  Iicyrillic: 0x0418,
+  Iinvertedbreve: 0x020A,
+  Iishortcyrillic: 0x0419,
+  Imacron: 0x012A,
+  Imacroncyrillic: 0x04E2,
+  Imonospace: 0xFF29,
+  Iniarmenian: 0x053B,
+  Iocyrillic: 0x0401,
+  Iogonek: 0x012E,
+  Iota: 0x0399,
+  Iotaafrican: 0x0196,
+  Iotadieresis: 0x03AA,
+  Iotatonos: 0x038A,
+  Ismall: 0xF769,
+  Istroke: 0x0197,
+  Itilde: 0x0128,
+  Itildebelow: 0x1E2C,
+  Izhitsacyrillic: 0x0474,
+  Izhitsadblgravecyrillic: 0x0476,
+  J: 0x004A,
+  Jaarmenian: 0x0541,
+  Jcircle: 0x24BF,
+  Jcircumflex: 0x0134,
+  Jecyrillic: 0x0408,
+  Jheharmenian: 0x054B,
+  Jmonospace: 0xFF2A,
+  Jsmall: 0xF76A,
+  K: 0x004B,
+  KBsquare: 0x3385,
+  KKsquare: 0x33CD,
+  Kabashkircyrillic: 0x04A0,
+  Kacute: 0x1E30,
+  Kacyrillic: 0x041A,
+  Kadescendercyrillic: 0x049A,
+  Kahookcyrillic: 0x04C3,
+  Kappa: 0x039A,
+  Kastrokecyrillic: 0x049E,
+  Kaverticalstrokecyrillic: 0x049C,
+  Kcaron: 0x01E8,
+  Kcedilla: 0x0136,
+  Kcircle: 0x24C0,
+  Kcommaaccent: 0x0136,
+  Kdotbelow: 0x1E32,
+  Keharmenian: 0x0554,
+  Kenarmenian: 0x053F,
+  Khacyrillic: 0x0425,
+  Kheicoptic: 0x03E6,
+  Khook: 0x0198,
+  Kjecyrillic: 0x040C,
+  Klinebelow: 0x1E34,
+  Kmonospace: 0xFF2B,
+  Koppacyrillic: 0x0480,
+  Koppagreek: 0x03DE,
+  Ksicyrillic: 0x046E,
+  Ksmall: 0xF76B,
+  L: 0x004C,
+  LJ: 0x01C7,
+  LL: 0xF6BF,
+  Lacute: 0x0139,
+  Lambda: 0x039B,
+  Lcaron: 0x013D,
+  Lcedilla: 0x013B,
+  Lcircle: 0x24C1,
+  Lcircumflexbelow: 0x1E3C,
+  Lcommaaccent: 0x013B,
+  Ldot: 0x013F,
+  Ldotaccent: 0x013F,
+  Ldotbelow: 0x1E36,
+  Ldotbelowmacron: 0x1E38,
+  Liwnarmenian: 0x053C,
+  Lj: 0x01C8,
+  Ljecyrillic: 0x0409,
+  Llinebelow: 0x1E3A,
+  Lmonospace: 0xFF2C,
+  Lslash: 0x0141,
+  Lslashsmall: 0xF6F9,
+  Lsmall: 0xF76C,
+  M: 0x004D,
+  MBsquare: 0x3386,
+  Macron: 0xF6D0,
+  Macronsmall: 0xF7AF,
+  Macute: 0x1E3E,
+  Mcircle: 0x24C2,
+  Mdotaccent: 0x1E40,
+  Mdotbelow: 0x1E42,
+  Menarmenian: 0x0544,
+  Mmonospace: 0xFF2D,
+  Msmall: 0xF76D,
+  Mturned: 0x019C,
+  Mu: 0x039C,
+  N: 0x004E,
+  NJ: 0x01CA,
+  Nacute: 0x0143,
+  Ncaron: 0x0147,
+  Ncedilla: 0x0145,
+  Ncircle: 0x24C3,
+  Ncircumflexbelow: 0x1E4A,
+  Ncommaaccent: 0x0145,
+  Ndotaccent: 0x1E44,
+  Ndotbelow: 0x1E46,
+  Nhookleft: 0x019D,
+  Nineroman: 0x2168,
+  Nj: 0x01CB,
+  Njecyrillic: 0x040A,
+  Nlinebelow: 0x1E48,
+  Nmonospace: 0xFF2E,
+  Nowarmenian: 0x0546,
+  Nsmall: 0xF76E,
+  Ntilde: 0x00D1,
+  Ntildesmall: 0xF7F1,
+  Nu: 0x039D,
+  O: 0x004F,
+  OE: 0x0152,
+  OEsmall: 0xF6FA,
+  Oacute: 0x00D3,
+  Oacutesmall: 0xF7F3,
+  Obarredcyrillic: 0x04E8,
+  Obarreddieresiscyrillic: 0x04EA,
+  Obreve: 0x014E,
+  Ocaron: 0x01D1,
+  Ocenteredtilde: 0x019F,
+  Ocircle: 0x24C4,
+  Ocircumflex: 0x00D4,
+  Ocircumflexacute: 0x1ED0,
+  Ocircumflexdotbelow: 0x1ED8,
+  Ocircumflexgrave: 0x1ED2,
+  Ocircumflexhookabove: 0x1ED4,
+  Ocircumflexsmall: 0xF7F4,
+  Ocircumflextilde: 0x1ED6,
+  Ocyrillic: 0x041E,
+  Odblacute: 0x0150,
+  Odblgrave: 0x020C,
+  Odieresis: 0x00D6,
+  Odieresiscyrillic: 0x04E6,
+  Odieresissmall: 0xF7F6,
+  Odotbelow: 0x1ECC,
+  Ogoneksmall: 0xF6FB,
+  Ograve: 0x00D2,
+  Ogravesmall: 0xF7F2,
+  Oharmenian: 0x0555,
+  Ohm: 0x2126,
+  Ohookabove: 0x1ECE,
+  Ohorn: 0x01A0,
+  Ohornacute: 0x1EDA,
+  Ohorndotbelow: 0x1EE2,
+  Ohorngrave: 0x1EDC,
+  Ohornhookabove: 0x1EDE,
+  Ohorntilde: 0x1EE0,
+  Ohungarumlaut: 0x0150,
+  Oi: 0x01A2,
+  Oinvertedbreve: 0x020E,
+  Omacron: 0x014C,
+  Omacronacute: 0x1E52,
+  Omacrongrave: 0x1E50,
+  Omega: 0x2126,
+  Omegacyrillic: 0x0460,
+  Omegagreek: 0x03A9,
+  Omegaroundcyrillic: 0x047A,
+  Omegatitlocyrillic: 0x047C,
+  Omegatonos: 0x038F,
+  Omicron: 0x039F,
+  Omicrontonos: 0x038C,
+  Omonospace: 0xFF2F,
+  Oneroman: 0x2160,
+  Oogonek: 0x01EA,
+  Oogonekmacron: 0x01EC,
+  Oopen: 0x0186,
+  Oslash: 0x00D8,
+  Oslashacute: 0x01FE,
+  Oslashsmall: 0xF7F8,
+  Osmall: 0xF76F,
+  Ostrokeacute: 0x01FE,
+  Otcyrillic: 0x047E,
+  Otilde: 0x00D5,
+  Otildeacute: 0x1E4C,
+  Otildedieresis: 0x1E4E,
+  Otildesmall: 0xF7F5,
+  P: 0x0050,
+  Pacute: 0x1E54,
+  Pcircle: 0x24C5,
+  Pdotaccent: 0x1E56,
+  Pecyrillic: 0x041F,
+  Peharmenian: 0x054A,
+  Pemiddlehookcyrillic: 0x04A6,
+  Phi: 0x03A6,
+  Phook: 0x01A4,
+  Pi: 0x03A0,
+  Piwrarmenian: 0x0553,
+  Pmonospace: 0xFF30,
+  Psi: 0x03A8,
+  Psicyrillic: 0x0470,
+  Psmall: 0xF770,
+  Q: 0x0051,
+  Qcircle: 0x24C6,
+  Qmonospace: 0xFF31,
+  Qsmall: 0xF771,
+  R: 0x0052,
+  Raarmenian: 0x054C,
+  Racute: 0x0154,
+  Rcaron: 0x0158,
+  Rcedilla: 0x0156,
+  Rcircle: 0x24C7,
+  Rcommaaccent: 0x0156,
+  Rdblgrave: 0x0210,
+  Rdotaccent: 0x1E58,
+  Rdotbelow: 0x1E5A,
+  Rdotbelowmacron: 0x1E5C,
+  Reharmenian: 0x0550,
+  Rfraktur: 0x211C,
+  Rho: 0x03A1,
+  Ringsmall: 0xF6FC,
+  Rinvertedbreve: 0x0212,
+  Rlinebelow: 0x1E5E,
+  Rmonospace: 0xFF32,
+  Rsmall: 0xF772,
+  Rsmallinverted: 0x0281,
+  Rsmallinvertedsuperior: 0x02B6,
+  S: 0x0053,
+  SF010000: 0x250C,
+  SF020000: 0x2514,
+  SF030000: 0x2510,
+  SF040000: 0x2518,
+  SF050000: 0x253C,
+  SF060000: 0x252C,
+  SF070000: 0x2534,
+  SF080000: 0x251C,
+  SF090000: 0x2524,
+  SF100000: 0x2500,
+  SF110000: 0x2502,
+  SF190000: 0x2561,
+  SF200000: 0x2562,
+  SF210000: 0x2556,
+  SF220000: 0x2555,
+  SF230000: 0x2563,
+  SF240000: 0x2551,
+  SF250000: 0x2557,
+  SF260000: 0x255D,
+  SF270000: 0x255C,
+  SF280000: 0x255B,
+  SF360000: 0x255E,
+  SF370000: 0x255F,
+  SF380000: 0x255A,
+  SF390000: 0x2554,
+  SF400000: 0x2569,
+  SF410000: 0x2566,
+  SF420000: 0x2560,
+  SF430000: 0x2550,
+  SF440000: 0x256C,
+  SF450000: 0x2567,
+  SF460000: 0x2568,
+  SF470000: 0x2564,
+  SF480000: 0x2565,
+  SF490000: 0x2559,
+  SF500000: 0x2558,
+  SF510000: 0x2552,
+  SF520000: 0x2553,
+  SF530000: 0x256B,
+  SF540000: 0x256A,
+  Sacute: 0x015A,
+  Sacutedotaccent: 0x1E64,
+  Sampigreek: 0x03E0,
+  Scaron: 0x0160,
+  Scarondotaccent: 0x1E66,
+  Scaronsmall: 0xF6FD,
+  Scedilla: 0x015E,
+  Schwa: 0x018F,
+  Schwacyrillic: 0x04D8,
+  Schwadieresiscyrillic: 0x04DA,
+  Scircle: 0x24C8,
+  Scircumflex: 0x015C,
+  Scommaaccent: 0x0218,
+  Sdotaccent: 0x1E60,
+  Sdotbelow: 0x1E62,
+  Sdotbelowdotaccent: 0x1E68,
+  Seharmenian: 0x054D,
+  Sevenroman: 0x2166,
+  Shaarmenian: 0x0547,
+  Shacyrillic: 0x0428,
+  Shchacyrillic: 0x0429,
+  Sheicoptic: 0x03E2,
+  Shhacyrillic: 0x04BA,
+  Shimacoptic: 0x03EC,
+  Sigma: 0x03A3,
+  Sixroman: 0x2165,
+  Smonospace: 0xFF33,
+  Softsigncyrillic: 0x042C,
+  Ssmall: 0xF773,
+  Stigmagreek: 0x03DA,
+  T: 0x0054,
+  Tau: 0x03A4,
+  Tbar: 0x0166,
+  Tcaron: 0x0164,
+  Tcedilla: 0x0162,
+  Tcircle: 0x24C9,
+  Tcircumflexbelow: 0x1E70,
+  Tcommaaccent: 0x0162,
+  Tdotaccent: 0x1E6A,
+  Tdotbelow: 0x1E6C,
+  Tecyrillic: 0x0422,
+  Tedescendercyrillic: 0x04AC,
+  Tenroman: 0x2169,
+  Tetsecyrillic: 0x04B4,
+  Theta: 0x0398,
+  Thook: 0x01AC,
+  Thorn: 0x00DE,
+  Thornsmall: 0xF7FE,
+  Threeroman: 0x2162,
+  Tildesmall: 0xF6FE,
+  Tiwnarmenian: 0x054F,
+  Tlinebelow: 0x1E6E,
+  Tmonospace: 0xFF34,
+  Toarmenian: 0x0539,
+  Tonefive: 0x01BC,
+  Tonesix: 0x0184,
+  Tonetwo: 0x01A7,
+  Tretroflexhook: 0x01AE,
+  Tsecyrillic: 0x0426,
+  Tshecyrillic: 0x040B,
+  Tsmall: 0xF774,
+  Twelveroman: 0x216B,
+  Tworoman: 0x2161,
+  U: 0x0055,
+  Uacute: 0x00DA,
+  Uacutesmall: 0xF7FA,
+  Ubreve: 0x016C,
+  Ucaron: 0x01D3,
+  Ucircle: 0x24CA,
+  Ucircumflex: 0x00DB,
+  Ucircumflexbelow: 0x1E76,
+  Ucircumflexsmall: 0xF7FB,
+  Ucyrillic: 0x0423,
+  Udblacute: 0x0170,
+  Udblgrave: 0x0214,
+  Udieresis: 0x00DC,
+  Udieresisacute: 0x01D7,
+  Udieresisbelow: 0x1E72,
+  Udieresiscaron: 0x01D9,
+  Udieresiscyrillic: 0x04F0,
+  Udieresisgrave: 0x01DB,
+  Udieresismacron: 0x01D5,
+  Udieresissmall: 0xF7FC,
+  Udotbelow: 0x1EE4,
+  Ugrave: 0x00D9,
+  Ugravesmall: 0xF7F9,
+  Uhookabove: 0x1EE6,
+  Uhorn: 0x01AF,
+  Uhornacute: 0x1EE8,
+  Uhorndotbelow: 0x1EF0,
+  Uhorngrave: 0x1EEA,
+  Uhornhookabove: 0x1EEC,
+  Uhorntilde: 0x1EEE,
+  Uhungarumlaut: 0x0170,
+  Uhungarumlautcyrillic: 0x04F2,
+  Uinvertedbreve: 0x0216,
+  Ukcyrillic: 0x0478,
+  Umacron: 0x016A,
+  Umacroncyrillic: 0x04EE,
+  Umacrondieresis: 0x1E7A,
+  Umonospace: 0xFF35,
+  Uogonek: 0x0172,
+  Upsilon: 0x03A5,
+  Upsilon1: 0x03D2,
+  Upsilonacutehooksymbolgreek: 0x03D3,
+  Upsilonafrican: 0x01B1,
+  Upsilondieresis: 0x03AB,
+  Upsilondieresishooksymbolgreek: 0x03D4,
+  Upsilonhooksymbol: 0x03D2,
+  Upsilontonos: 0x038E,
+  Uring: 0x016E,
+  Ushortcyrillic: 0x040E,
+  Usmall: 0xF775,
+  Ustraightcyrillic: 0x04AE,
+  Ustraightstrokecyrillic: 0x04B0,
+  Utilde: 0x0168,
+  Utildeacute: 0x1E78,
+  Utildebelow: 0x1E74,
+  V: 0x0056,
+  Vcircle: 0x24CB,
+  Vdotbelow: 0x1E7E,
+  Vecyrillic: 0x0412,
+  Vewarmenian: 0x054E,
+  Vhook: 0x01B2,
+  Vmonospace: 0xFF36,
+  Voarmenian: 0x0548,
+  Vsmall: 0xF776,
+  Vtilde: 0x1E7C,
+  W: 0x0057,
+  Wacute: 0x1E82,
+  Wcircle: 0x24CC,
+  Wcircumflex: 0x0174,
+  Wdieresis: 0x1E84,
+  Wdotaccent: 0x1E86,
+  Wdotbelow: 0x1E88,
+  Wgrave: 0x1E80,
+  Wmonospace: 0xFF37,
+  Wsmall: 0xF777,
+  X: 0x0058,
+  Xcircle: 0x24CD,
+  Xdieresis: 0x1E8C,
+  Xdotaccent: 0x1E8A,
+  Xeharmenian: 0x053D,
+  Xi: 0x039E,
+  Xmonospace: 0xFF38,
+  Xsmall: 0xF778,
+  Y: 0x0059,
+  Yacute: 0x00DD,
+  Yacutesmall: 0xF7FD,
+  Yatcyrillic: 0x0462,
+  Ycircle: 0x24CE,
+  Ycircumflex: 0x0176,
+  Ydieresis: 0x0178,
+  Ydieresissmall: 0xF7FF,
+  Ydotaccent: 0x1E8E,
+  Ydotbelow: 0x1EF4,
+  Yericyrillic: 0x042B,
+  Yerudieresiscyrillic: 0x04F8,
+  Ygrave: 0x1EF2,
+  Yhook: 0x01B3,
+  Yhookabove: 0x1EF6,
+  Yiarmenian: 0x0545,
+  Yicyrillic: 0x0407,
+  Yiwnarmenian: 0x0552,
+  Ymonospace: 0xFF39,
+  Ysmall: 0xF779,
+  Ytilde: 0x1EF8,
+  Yusbigcyrillic: 0x046A,
+  Yusbigiotifiedcyrillic: 0x046C,
+  Yuslittlecyrillic: 0x0466,
+  Yuslittleiotifiedcyrillic: 0x0468,
+  Z: 0x005A,
+  Zaarmenian: 0x0536,
+  Zacute: 0x0179,
+  Zcaron: 0x017D,
+  Zcaronsmall: 0xF6FF,
+  Zcircle: 0x24CF,
+  Zcircumflex: 0x1E90,
+  Zdot: 0x017B,
+  Zdotaccent: 0x017B,
+  Zdotbelow: 0x1E92,
+  Zecyrillic: 0x0417,
+  Zedescendercyrillic: 0x0498,
+  Zedieresiscyrillic: 0x04DE,
+  Zeta: 0x0396,
+  Zhearmenian: 0x053A,
+  Zhebrevecyrillic: 0x04C1,
+  Zhecyrillic: 0x0416,
+  Zhedescendercyrillic: 0x0496,
+  Zhedieresiscyrillic: 0x04DC,
+  Zlinebelow: 0x1E94,
+  Zmonospace: 0xFF3A,
+  Zsmall: 0xF77A,
+  Zstroke: 0x01B5,
+  a: 0x0061,
+  aabengali: 0x0986,
+  aacute: 0x00E1,
+  aadeva: 0x0906,
+  aagujarati: 0x0A86,
+  aagurmukhi: 0x0A06,
+  aamatragurmukhi: 0x0A3E,
+  aarusquare: 0x3303,
+  aavowelsignbengali: 0x09BE,
+  aavowelsigndeva: 0x093E,
+  aavowelsigngujarati: 0x0ABE,
+  abbreviationmarkarmenian: 0x055F,
+  abbreviationsigndeva: 0x0970,
+  abengali: 0x0985,
+  abopomofo: 0x311A,
+  abreve: 0x0103,
+  abreveacute: 0x1EAF,
+  abrevecyrillic: 0x04D1,
+  abrevedotbelow: 0x1EB7,
+  abrevegrave: 0x1EB1,
+  abrevehookabove: 0x1EB3,
+  abrevetilde: 0x1EB5,
+  acaron: 0x01CE,
+  acircle: 0x24D0,
+  acircumflex: 0x00E2,
+  acircumflexacute: 0x1EA5,
+  acircumflexdotbelow: 0x1EAD,
+  acircumflexgrave: 0x1EA7,
+  acircumflexhookabove: 0x1EA9,
+  acircumflextilde: 0x1EAB,
+  acute: 0x00B4,
+  acutebelowcmb: 0x0317,
+  acutecmb: 0x0301,
+  acutecomb: 0x0301,
+  acutedeva: 0x0954,
+  acutelowmod: 0x02CF,
+  acutetonecmb: 0x0341,
+  acyrillic: 0x0430,
+  adblgrave: 0x0201,
+  addakgurmukhi: 0x0A71,
+  adeva: 0x0905,
+  adieresis: 0x00E4,
+  adieresiscyrillic: 0x04D3,
+  adieresismacron: 0x01DF,
+  adotbelow: 0x1EA1,
+  adotmacron: 0x01E1,
+  ae: 0x00E6,
+  aeacute: 0x01FD,
+  aekorean: 0x3150,
+  aemacron: 0x01E3,
+  afii00208: 0x2015,
+  afii08941: 0x20A4,
+  afii10017: 0x0410,
+  afii10018: 0x0411,
+  afii10019: 0x0412,
+  afii10020: 0x0413,
+  afii10021: 0x0414,
+  afii10022: 0x0415,
+  afii10023: 0x0401,
+  afii10024: 0x0416,
+  afii10025: 0x0417,
+  afii10026: 0x0418,
+  afii10027: 0x0419,
+  afii10028: 0x041A,
+  afii10029: 0x041B,
+  afii10030: 0x041C,
+  afii10031: 0x041D,
+  afii10032: 0x041E,
+  afii10033: 0x041F,
+  afii10034: 0x0420,
+  afii10035: 0x0421,
+  afii10036: 0x0422,
+  afii10037: 0x0423,
+  afii10038: 0x0424,
+  afii10039: 0x0425,
+  afii10040: 0x0426,
+  afii10041: 0x0427,
+  afii10042: 0x0428,
+  afii10043: 0x0429,
+  afii10044: 0x042A,
+  afii10045: 0x042B,
+  afii10046: 0x042C,
+  afii10047: 0x042D,
+  afii10048: 0x042E,
+  afii10049: 0x042F,
+  afii10050: 0x0490,
+  afii10051: 0x0402,
+  afii10052: 0x0403,
+  afii10053: 0x0404,
+  afii10054: 0x0405,
+  afii10055: 0x0406,
+  afii10056: 0x0407,
+  afii10057: 0x0408,
+  afii10058: 0x0409,
+  afii10059: 0x040A,
+  afii10060: 0x040B,
+  afii10061: 0x040C,
+  afii10062: 0x040E,
+  afii10063: 0xF6C4,
+  afii10064: 0xF6C5,
+  afii10065: 0x0430,
+  afii10066: 0x0431,
+  afii10067: 0x0432,
+  afii10068: 0x0433,
+  afii10069: 0x0434,
+  afii10070: 0x0435,
+  afii10071: 0x0451,
+  afii10072: 0x0436,
+  afii10073: 0x0437,
+  afii10074: 0x0438,
+  afii10075: 0x0439,
+  afii10076: 0x043A,
+  afii10077: 0x043B,
+  afii10078: 0x043C,
+  afii10079: 0x043D,
+  afii10080: 0x043E,
+  afii10081: 0x043F,
+  afii10082: 0x0440,
+  afii10083: 0x0441,
+  afii10084: 0x0442,
+  afii10085: 0x0443,
+  afii10086: 0x0444,
+  afii10087: 0x0445,
+  afii10088: 0x0446,
+  afii10089: 0x0447,
+  afii10090: 0x0448,
+  afii10091: 0x0449,
+  afii10092: 0x044A,
+  afii10093: 0x044B,
+  afii10094: 0x044C,
+  afii10095: 0x044D,
+  afii10096: 0x044E,
+  afii10097: 0x044F,
+  afii10098: 0x0491,
+  afii10099: 0x0452,
+  afii10100: 0x0453,
+  afii10101: 0x0454,
+  afii10102: 0x0455,
+  afii10103: 0x0456,
+  afii10104: 0x0457,
+  afii10105: 0x0458,
+  afii10106: 0x0459,
+  afii10107: 0x045A,
+  afii10108: 0x045B,
+  afii10109: 0x045C,
+  afii10110: 0x045E,
+  afii10145: 0x040F,
+  afii10146: 0x0462,
+  afii10147: 0x0472,
+  afii10148: 0x0474,
+  afii10192: 0xF6C6,
+  afii10193: 0x045F,
+  afii10194: 0x0463,
+  afii10195: 0x0473,
+  afii10196: 0x0475,
+  afii10831: 0xF6C7,
+  afii10832: 0xF6C8,
+  afii10846: 0x04D9,
+  afii299: 0x200E,
+  afii300: 0x200F,
+  afii301: 0x200D,
+  afii57381: 0x066A,
+  afii57388: 0x060C,
+  afii57392: 0x0660,
+  afii57393: 0x0661,
+  afii57394: 0x0662,
+  afii57395: 0x0663,
+  afii57396: 0x0664,
+  afii57397: 0x0665,
+  afii57398: 0x0666,
+  afii57399: 0x0667,
+  afii57400: 0x0668,
+  afii57401: 0x0669,
+  afii57403: 0x061B,
+  afii57407: 0x061F,
+  afii57409: 0x0621,
+  afii57410: 0x0622,
+  afii57411: 0x0623,
+  afii57412: 0x0624,
+  afii57413: 0x0625,
+  afii57414: 0x0626,
+  afii57415: 0x0627,
+  afii57416: 0x0628,
+  afii57417: 0x0629,
+  afii57418: 0x062A,
+  afii57419: 0x062B,
+  afii57420: 0x062C,
+  afii57421: 0x062D,
+  afii57422: 0x062E,
+  afii57423: 0x062F,
+  afii57424: 0x0630,
+  afii57425: 0x0631,
+  afii57426: 0x0632,
+  afii57427: 0x0633,
+  afii57428: 0x0634,
+  afii57429: 0x0635,
+  afii57430: 0x0636,
+  afii57431: 0x0637,
+  afii57432: 0x0638,
+  afii57433: 0x0639,
+  afii57434: 0x063A,
+  afii57440: 0x0640,
+  afii57441: 0x0641,
+  afii57442: 0x0642,
+  afii57443: 0x0643,
+  afii57444: 0x0644,
+  afii57445: 0x0645,
+  afii57446: 0x0646,
+  afii57448: 0x0648,
+  afii57449: 0x0649,
+  afii57450: 0x064A,
+  afii57451: 0x064B,
+  afii57452: 0x064C,
+  afii57453: 0x064D,
+  afii57454: 0x064E,
+  afii57455: 0x064F,
+  afii57456: 0x0650,
+  afii57457: 0x0651,
+  afii57458: 0x0652,
+  afii57470: 0x0647,
+  afii57505: 0x06A4,
+  afii57506: 0x067E,
+  afii57507: 0x0686,
+  afii57508: 0x0698,
+  afii57509: 0x06AF,
+  afii57511: 0x0679,
+  afii57512: 0x0688,
+  afii57513: 0x0691,
+  afii57514: 0x06BA,
+  afii57519: 0x06D2,
+  afii57534: 0x06D5,
+  afii57636: 0x20AA,
+  afii57645: 0x05BE,
+  afii57658: 0x05C3,
+  afii57664: 0x05D0,
+  afii57665: 0x05D1,
+  afii57666: 0x05D2,
+  afii57667: 0x05D3,
+  afii57668: 0x05D4,
+  afii57669: 0x05D5,
+  afii57670: 0x05D6,
+  afii57671: 0x05D7,
+  afii57672: 0x05D8,
+  afii57673: 0x05D9,
+  afii57674: 0x05DA,
+  afii57675: 0x05DB,
+  afii57676: 0x05DC,
+  afii57677: 0x05DD,
+  afii57678: 0x05DE,
+  afii57679: 0x05DF,
+  afii57680: 0x05E0,
+  afii57681: 0x05E1,
+  afii57682: 0x05E2,
+  afii57683: 0x05E3,
+  afii57684: 0x05E4,
+  afii57685: 0x05E5,
+  afii57686: 0x05E6,
+  afii57687: 0x05E7,
+  afii57688: 0x05E8,
+  afii57689: 0x05E9,
+  afii57690: 0x05EA,
+  afii57694: 0xFB2A,
+  afii57695: 0xFB2B,
+  afii57700: 0xFB4B,
+  afii57705: 0xFB1F,
+  afii57716: 0x05F0,
+  afii57717: 0x05F1,
+  afii57718: 0x05F2,
+  afii57723: 0xFB35,
+  afii57793: 0x05B4,
+  afii57794: 0x05B5,
+  afii57795: 0x05B6,
+  afii57796: 0x05BB,
+  afii57797: 0x05B8,
+  afii57798: 0x05B7,
+  afii57799: 0x05B0,
+  afii57800: 0x05B2,
+  afii57801: 0x05B1,
+  afii57802: 0x05B3,
+  afii57803: 0x05C2,
+  afii57804: 0x05C1,
+  afii57806: 0x05B9,
+  afii57807: 0x05BC,
+  afii57839: 0x05BD,
+  afii57841: 0x05BF,
+  afii57842: 0x05C0,
+  afii57929: 0x02BC,
+  afii61248: 0x2105,
+  afii61289: 0x2113,
+  afii61352: 0x2116,
+  afii61573: 0x202C,
+  afii61574: 0x202D,
+  afii61575: 0x202E,
+  afii61664: 0x200C,
+  afii63167: 0x066D,
+  afii64937: 0x02BD,
+  agrave: 0x00E0,
+  agujarati: 0x0A85,
+  agurmukhi: 0x0A05,
+  ahiragana: 0x3042,
+  ahookabove: 0x1EA3,
+  aibengali: 0x0990,
+  aibopomofo: 0x311E,
+  aideva: 0x0910,
+  aiecyrillic: 0x04D5,
+  aigujarati: 0x0A90,
+  aigurmukhi: 0x0A10,
+  aimatragurmukhi: 0x0A48,
+  ainarabic: 0x0639,
+  ainfinalarabic: 0xFECA,
+  aininitialarabic: 0xFECB,
+  ainmedialarabic: 0xFECC,
+  ainvertedbreve: 0x0203,
+  aivowelsignbengali: 0x09C8,
+  aivowelsigndeva: 0x0948,
+  aivowelsigngujarati: 0x0AC8,
+  akatakana: 0x30A2,
+  akatakanahalfwidth: 0xFF71,
+  akorean: 0x314F,
+  alef: 0x05D0,
+  alefarabic: 0x0627,
+  alefdageshhebrew: 0xFB30,
+  aleffinalarabic: 0xFE8E,
+  alefhamzaabovearabic: 0x0623,
+  alefhamzaabovefinalarabic: 0xFE84,
+  alefhamzabelowarabic: 0x0625,
+  alefhamzabelowfinalarabic: 0xFE88,
+  alefhebrew: 0x05D0,
+  aleflamedhebrew: 0xFB4F,
+  alefmaddaabovearabic: 0x0622,
+  alefmaddaabovefinalarabic: 0xFE82,
+  alefmaksuraarabic: 0x0649,
+  alefmaksurafinalarabic: 0xFEF0,
+  alefmaksurainitialarabic: 0xFEF3,
+  alefmaksuramedialarabic: 0xFEF4,
+  alefpatahhebrew: 0xFB2E,
+  alefqamatshebrew: 0xFB2F,
+  aleph: 0x2135,
+  allequal: 0x224C,
+  alpha: 0x03B1,
+  alphatonos: 0x03AC,
+  amacron: 0x0101,
+  amonospace: 0xFF41,
+  ampersand: 0x0026,
+  ampersandmonospace: 0xFF06,
+  ampersandsmall: 0xF726,
+  amsquare: 0x33C2,
+  anbopomofo: 0x3122,
+  angbopomofo: 0x3124,
+  angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
+  angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
+  angkhankhuthai: 0x0E5A,
+  angle: 0x2220,
+  anglebracketleft: 0x3008,
+  anglebracketleftvertical: 0xFE3F,
+  anglebracketright: 0x3009,
+  anglebracketrightvertical: 0xFE40,
+  angleleft: 0x2329,
+  angleright: 0x232A,
+  angstrom: 0x212B,
+  anoteleia: 0x0387,
+  anudattadeva: 0x0952,
+  anusvarabengali: 0x0982,
+  anusvaradeva: 0x0902,
+  anusvaragujarati: 0x0A82,
+  aogonek: 0x0105,
+  apaatosquare: 0x3300,
+  aparen: 0x249C,
+  apostrophearmenian: 0x055A,
+  apostrophemod: 0x02BC,
+  apple: 0xF8FF,
+  approaches: 0x2250,
+  approxequal: 0x2248,
+  approxequalorimage: 0x2252,
+  approximatelyequal: 0x2245,
+  araeaekorean: 0x318E,
+  araeakorean: 0x318D,
+  arc: 0x2312,
+  arighthalfring: 0x1E9A,
+  aring: 0x00E5,
+  aringacute: 0x01FB,
+  aringbelow: 0x1E01,
+  arrowboth: 0x2194,
+  arrowdashdown: 0x21E3,
+  arrowdashleft: 0x21E0,
+  arrowdashright: 0x21E2,
+  arrowdashup: 0x21E1,
+  arrowdblboth: 0x21D4,
+  arrowdbldown: 0x21D3,
+  arrowdblleft: 0x21D0,
+  arrowdblright: 0x21D2,
+  arrowdblup: 0x21D1,
+  arrowdown: 0x2193,
+  arrowdownleft: 0x2199,
+  arrowdownright: 0x2198,
+  arrowdownwhite: 0x21E9,
+  arrowheaddownmod: 0x02C5,
+  arrowheadleftmod: 0x02C2,
+  arrowheadrightmod: 0x02C3,
+  arrowheadupmod: 0x02C4,
+  arrowhorizex: 0xF8E7,
+  arrowleft: 0x2190,
+  arrowleftdbl: 0x21D0,
+  arrowleftdblstroke: 0x21CD,
+  arrowleftoverright: 0x21C6,
+  arrowleftwhite: 0x21E6,
+  arrowright: 0x2192,
+  arrowrightdblstroke: 0x21CF,
+  arrowrightheavy: 0x279E,
+  arrowrightoverleft: 0x21C4,
+  arrowrightwhite: 0x21E8,
+  arrowtableft: 0x21E4,
+  arrowtabright: 0x21E5,
+  arrowup: 0x2191,
+  arrowupdn: 0x2195,
+  arrowupdnbse: 0x21A8,
+  arrowupdownbase: 0x21A8,
+  arrowupleft: 0x2196,
+  arrowupleftofdown: 0x21C5,
+  arrowupright: 0x2197,
+  arrowupwhite: 0x21E7,
+  arrowvertex: 0xF8E6,
+  asciicircum: 0x005E,
+  asciicircummonospace: 0xFF3E,
+  asciitilde: 0x007E,
+  asciitildemonospace: 0xFF5E,
+  ascript: 0x0251,
+  ascriptturned: 0x0252,
+  asmallhiragana: 0x3041,
+  asmallkatakana: 0x30A1,
+  asmallkatakanahalfwidth: 0xFF67,
+  asterisk: 0x002A,
+  asteriskaltonearabic: 0x066D,
+  asteriskarabic: 0x066D,
+  asteriskmath: 0x2217,
+  asteriskmonospace: 0xFF0A,
+  asterisksmall: 0xFE61,
+  asterism: 0x2042,
+  asuperior: 0xF6E9,
+  asymptoticallyequal: 0x2243,
+  at: 0x0040,
+  atilde: 0x00E3,
+  atmonospace: 0xFF20,
+  atsmall: 0xFE6B,
+  aturned: 0x0250,
+  aubengali: 0x0994,
+  aubopomofo: 0x3120,
+  audeva: 0x0914,
+  augujarati: 0x0A94,
+  augurmukhi: 0x0A14,
+  aulengthmarkbengali: 0x09D7,
+  aumatragurmukhi: 0x0A4C,
+  auvowelsignbengali: 0x09CC,
+  auvowelsigndeva: 0x094C,
+  auvowelsigngujarati: 0x0ACC,
+  avagrahadeva: 0x093D,
+  aybarmenian: 0x0561,
+  ayin: 0x05E2,
+  ayinaltonehebrew: 0xFB20,
+  ayinhebrew: 0x05E2,
+  b: 0x0062,
+  babengali: 0x09AC,
+  backslash: 0x005C,
+  backslashmonospace: 0xFF3C,
+  badeva: 0x092C,
+  bagujarati: 0x0AAC,
+  bagurmukhi: 0x0A2C,
+  bahiragana: 0x3070,
+  bahtthai: 0x0E3F,
+  bakatakana: 0x30D0,
+  bar: 0x007C,
+  barmonospace: 0xFF5C,
+  bbopomofo: 0x3105,
+  bcircle: 0x24D1,
+  bdotaccent: 0x1E03,
+  bdotbelow: 0x1E05,
+  beamedsixteenthnotes: 0x266C,
+  because: 0x2235,
+  becyrillic: 0x0431,
+  beharabic: 0x0628,
+  behfinalarabic: 0xFE90,
+  behinitialarabic: 0xFE91,
+  behiragana: 0x3079,
+  behmedialarabic: 0xFE92,
+  behmeeminitialarabic: 0xFC9F,
+  behmeemisolatedarabic: 0xFC08,
+  behnoonfinalarabic: 0xFC6D,
+  bekatakana: 0x30D9,
+  benarmenian: 0x0562,
+  bet: 0x05D1,
+  beta: 0x03B2,
+  betasymbolgreek: 0x03D0,
+  betdagesh: 0xFB31,
+  betdageshhebrew: 0xFB31,
+  bethebrew: 0x05D1,
+  betrafehebrew: 0xFB4C,
+  bhabengali: 0x09AD,
+  bhadeva: 0x092D,
+  bhagujarati: 0x0AAD,
+  bhagurmukhi: 0x0A2D,
+  bhook: 0x0253,
+  bihiragana: 0x3073,
+  bikatakana: 0x30D3,
+  bilabialclick: 0x0298,
+  bindigurmukhi: 0x0A02,
+  birusquare: 0x3331,
+  blackcircle: 0x25CF,
+  blackdiamond: 0x25C6,
+  blackdownpointingtriangle: 0x25BC,
+  blackleftpointingpointer: 0x25C4,
+  blackleftpointingtriangle: 0x25C0,
+  blacklenticularbracketleft: 0x3010,
+  blacklenticularbracketleftvertical: 0xFE3B,
+  blacklenticularbracketright: 0x3011,
+  blacklenticularbracketrightvertical: 0xFE3C,
+  blacklowerlefttriangle: 0x25E3,
+  blacklowerrighttriangle: 0x25E2,
+  blackrectangle: 0x25AC,
+  blackrightpointingpointer: 0x25BA,
+  blackrightpointingtriangle: 0x25B6,
+  blacksmallsquare: 0x25AA,
+  blacksmilingface: 0x263B,
+  blacksquare: 0x25A0,
+  blackstar: 0x2605,
+  blackupperlefttriangle: 0x25E4,
+  blackupperrighttriangle: 0x25E5,
+  blackuppointingsmalltriangle: 0x25B4,
+  blackuppointingtriangle: 0x25B2,
+  blank: 0x2423,
+  blinebelow: 0x1E07,
+  block: 0x2588,
+  bmonospace: 0xFF42,
+  bobaimaithai: 0x0E1A,
+  bohiragana: 0x307C,
+  bokatakana: 0x30DC,
+  bparen: 0x249D,
+  bqsquare: 0x33C3,
+  braceex: 0xF8F4,
+  braceleft: 0x007B,
+  braceleftbt: 0xF8F3,
+  braceleftmid: 0xF8F2,
+  braceleftmonospace: 0xFF5B,
+  braceleftsmall: 0xFE5B,
+  bracelefttp: 0xF8F1,
+  braceleftvertical: 0xFE37,
+  braceright: 0x007D,
+  bracerightbt: 0xF8FE,
+  bracerightmid: 0xF8FD,
+  bracerightmonospace: 0xFF5D,
+  bracerightsmall: 0xFE5C,
+  bracerighttp: 0xF8FC,
+  bracerightvertical: 0xFE38,
+  bracketleft: 0x005B,
+  bracketleftbt: 0xF8F0,
+  bracketleftex: 0xF8EF,
+  bracketleftmonospace: 0xFF3B,
+  bracketlefttp: 0xF8EE,
+  bracketright: 0x005D,
+  bracketrightbt: 0xF8FB,
+  bracketrightex: 0xF8FA,
+  bracketrightmonospace: 0xFF3D,
+  bracketrighttp: 0xF8F9,
+  breve: 0x02D8,
+  brevebelowcmb: 0x032E,
+  brevecmb: 0x0306,
+  breveinvertedbelowcmb: 0x032F,
+  breveinvertedcmb: 0x0311,
+  breveinverteddoublecmb: 0x0361,
+  bridgebelowcmb: 0x032A,
+  bridgeinvertedbelowcmb: 0x033A,
+  brokenbar: 0x00A6,
+  bstroke: 0x0180,
+  bsuperior: 0xF6EA,
+  btopbar: 0x0183,
+  buhiragana: 0x3076,
+  bukatakana: 0x30D6,
+  bullet: 0x2022,
+  bulletinverse: 0x25D8,
+  bulletoperator: 0x2219,
+  bullseye: 0x25CE,
+  c: 0x0063,
+  caarmenian: 0x056E,
+  cabengali: 0x099A,
+  cacute: 0x0107,
+  cadeva: 0x091A,
+  cagujarati: 0x0A9A,
+  cagurmukhi: 0x0A1A,
+  calsquare: 0x3388,
+  candrabindubengali: 0x0981,
+  candrabinducmb: 0x0310,
+  candrabindudeva: 0x0901,
+  candrabindugujarati: 0x0A81,
+  capslock: 0x21EA,
+  careof: 0x2105,
+  caron: 0x02C7,
+  caronbelowcmb: 0x032C,
+  caroncmb: 0x030C,
+  carriagereturn: 0x21B5,
+  cbopomofo: 0x3118,
+  ccaron: 0x010D,
+  ccedilla: 0x00E7,
+  ccedillaacute: 0x1E09,
+  ccircle: 0x24D2,
+  ccircumflex: 0x0109,
+  ccurl: 0x0255,
+  cdot: 0x010B,
+  cdotaccent: 0x010B,
+  cdsquare: 0x33C5,
+  cedilla: 0x00B8,
+  cedillacmb: 0x0327,
+  cent: 0x00A2,
+  centigrade: 0x2103,
+  centinferior: 0xF6DF,
+  centmonospace: 0xFFE0,
+  centoldstyle: 0xF7A2,
+  centsuperior: 0xF6E0,
+  chaarmenian: 0x0579,
+  chabengali: 0x099B,
+  chadeva: 0x091B,
+  chagujarati: 0x0A9B,
+  chagurmukhi: 0x0A1B,
+  chbopomofo: 0x3114,
+  cheabkhasiancyrillic: 0x04BD,
+  checkmark: 0x2713,
+  checyrillic: 0x0447,
+  chedescenderabkhasiancyrillic: 0x04BF,
+  chedescendercyrillic: 0x04B7,
+  chedieresiscyrillic: 0x04F5,
+  cheharmenian: 0x0573,
+  chekhakassiancyrillic: 0x04CC,
+  cheverticalstrokecyrillic: 0x04B9,
+  chi: 0x03C7,
+  chieuchacirclekorean: 0x3277,
+  chieuchaparenkorean: 0x3217,
+  chieuchcirclekorean: 0x3269,
+  chieuchkorean: 0x314A,
+  chieuchparenkorean: 0x3209,
+  chochangthai: 0x0E0A,
+  chochanthai: 0x0E08,
+  chochingthai: 0x0E09,
+  chochoethai: 0x0E0C,
+  chook: 0x0188,
+  cieucacirclekorean: 0x3276,
+  cieucaparenkorean: 0x3216,
+  cieuccirclekorean: 0x3268,
+  cieuckorean: 0x3148,
+  cieucparenkorean: 0x3208,
+  cieucuparenkorean: 0x321C,
+  circle: 0x25CB,
+  circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
+  circlemultiply: 0x2297,
+  circleot: 0x2299,
+  circleplus: 0x2295,
+  circlepostalmark: 0x3036,
+  circlewithlefthalfblack: 0x25D0,
+  circlewithrighthalfblack: 0x25D1,
+  circumflex: 0x02C6,
+  circumflexbelowcmb: 0x032D,
+  circumflexcmb: 0x0302,
+  clear: 0x2327,
+  clickalveolar: 0x01C2,
+  clickdental: 0x01C0,
+  clicklateral: 0x01C1,
+  clickretroflex: 0x01C3,
+  club: 0x2663,
+  clubsuitblack: 0x2663,
+  clubsuitwhite: 0x2667,
+  cmcubedsquare: 0x33A4,
+  cmonospace: 0xFF43,
+  cmsquaredsquare: 0x33A0,
+  coarmenian: 0x0581,
+  colon: 0x003A,
+  colonmonetary: 0x20A1,
+  colonmonospace: 0xFF1A,
+  colonsign: 0x20A1,
+  colonsmall: 0xFE55,
+  colontriangularhalfmod: 0x02D1,
+  colontriangularmod: 0x02D0,
+  comma: 0x002C,
+  commaabovecmb: 0x0313,
+  commaaboverightcmb: 0x0315,
+  commaaccent: 0xF6C3,
+  commaarabic: 0x060C,
+  commaarmenian: 0x055D,
+  commainferior: 0xF6E1,
+  commamonospace: 0xFF0C,
+  commareversedabovecmb: 0x0314,
+  commareversedmod: 0x02BD,
+  commasmall: 0xFE50,
+  commasuperior: 0xF6E2,
+  commaturnedabovecmb: 0x0312,
+  commaturnedmod: 0x02BB,
+  compass: 0x263C,
+  congruent: 0x2245,
+  contourintegral: 0x222E,
+  control: 0x2303,
+  controlACK: 0x0006,
+  controlBEL: 0x0007,
+  controlBS: 0x0008,
+  controlCAN: 0x0018,
+  controlCR: 0x000D,
+  controlDC1: 0x0011,
+  controlDC2: 0x0012,
+  controlDC3: 0x0013,
+  controlDC4: 0x0014,
+  controlDEL: 0x007F,
+  controlDLE: 0x0010,
+  controlEM: 0x0019,
+  controlENQ: 0x0005,
+  controlEOT: 0x0004,
+  controlESC: 0x001B,
+  controlETB: 0x0017,
+  controlETX: 0x0003,
+  controlFF: 0x000C,
+  controlFS: 0x001C,
+  controlGS: 0x001D,
+  controlHT: 0x0009,
+  controlLF: 0x000A,
+  controlNAK: 0x0015,
+  controlRS: 0x001E,
+  controlSI: 0x000F,
+  controlSO: 0x000E,
+  controlSOT: 0x0002,
+  controlSTX: 0x0001,
+  controlSUB: 0x001A,
+  controlSYN: 0x0016,
+  controlUS: 0x001F,
+  controlVT: 0x000B,
+  copyright: 0x00A9,
+  copyrightsans: 0xF8E9,
+  copyrightserif: 0xF6D9,
+  cornerbracketleft: 0x300C,
+  cornerbracketlefthalfwidth: 0xFF62,
+  cornerbracketleftvertical: 0xFE41,
+  cornerbracketright: 0x300D,
+  cornerbracketrighthalfwidth: 0xFF63,
+  cornerbracketrightvertical: 0xFE42,
+  corporationsquare: 0x337F,
+  cosquare: 0x33C7,
+  coverkgsquare: 0x33C6,
+  cparen: 0x249E,
+  cruzeiro: 0x20A2,
+  cstretched: 0x0297,
+  curlyand: 0x22CF,
+  curlyor: 0x22CE,
+  currency: 0x00A4,
+  cyrBreve: 0xF6D1,
+  cyrFlex: 0xF6D2,
+  cyrbreve: 0xF6D4,
+  cyrflex: 0xF6D5,
+  d: 0x0064,
+  daarmenian: 0x0564,
+  dabengali: 0x09A6,
+  dadarabic: 0x0636,
+  dadeva: 0x0926,
+  dadfinalarabic: 0xFEBE,
+  dadinitialarabic: 0xFEBF,
+  dadmedialarabic: 0xFEC0,
+  dagesh: 0x05BC,
+  dageshhebrew: 0x05BC,
+  dagger: 0x2020,
+  daggerdbl: 0x2021,
+  dagujarati: 0x0AA6,
+  dagurmukhi: 0x0A26,
+  dahiragana: 0x3060,
+  dakatakana: 0x30C0,
+  dalarabic: 0x062F,
+  dalet: 0x05D3,
+  daletdagesh: 0xFB33,
+  daletdageshhebrew: 0xFB33,
+  dalethebrew: 0x05D3,
+  dalfinalarabic: 0xFEAA,
+  dammaarabic: 0x064F,
+  dammalowarabic: 0x064F,
+  dammatanaltonearabic: 0x064C,
+  dammatanarabic: 0x064C,
+  danda: 0x0964,
+  dargahebrew: 0x05A7,
+  dargalefthebrew: 0x05A7,
+  dasiapneumatacyrilliccmb: 0x0485,
+  dblGrave: 0xF6D3,
+  dblanglebracketleft: 0x300A,
+  dblanglebracketleftvertical: 0xFE3D,
+  dblanglebracketright: 0x300B,
+  dblanglebracketrightvertical: 0xFE3E,
+  dblarchinvertedbelowcmb: 0x032B,
+  dblarrowleft: 0x21D4,
+  dblarrowright: 0x21D2,
+  dbldanda: 0x0965,
+  dblgrave: 0xF6D6,
+  dblgravecmb: 0x030F,
+  dblintegral: 0x222C,
+  dbllowline: 0x2017,
+  dbllowlinecmb: 0x0333,
+  dbloverlinecmb: 0x033F,
+  dblprimemod: 0x02BA,
+  dblverticalbar: 0x2016,
+  dblverticallineabovecmb: 0x030E,
+  dbopomofo: 0x3109,
+  dbsquare: 0x33C8,
+  dcaron: 0x010F,
+  dcedilla: 0x1E11,
+  dcircle: 0x24D3,
+  dcircumflexbelow: 0x1E13,
+  dcroat: 0x0111,
+  ddabengali: 0x09A1,
+  ddadeva: 0x0921,
+  ddagujarati: 0x0AA1,
+  ddagurmukhi: 0x0A21,
+  ddalarabic: 0x0688,
+  ddalfinalarabic: 0xFB89,
+  dddhadeva: 0x095C,
+  ddhabengali: 0x09A2,
+  ddhadeva: 0x0922,
+  ddhagujarati: 0x0AA2,
+  ddhagurmukhi: 0x0A22,
+  ddotaccent: 0x1E0B,
+  ddotbelow: 0x1E0D,
+  decimalseparatorarabic: 0x066B,
+  decimalseparatorpersian: 0x066B,
+  decyrillic: 0x0434,
+  degree: 0x00B0,
+  dehihebrew: 0x05AD,
+  dehiragana: 0x3067,
+  deicoptic: 0x03EF,
+  dekatakana: 0x30C7,
+  deleteleft: 0x232B,
+  deleteright: 0x2326,
+  delta: 0x03B4,
+  deltaturned: 0x018D,
+  denominatorminusonenumeratorbengali: 0x09F8,
+  dezh: 0x02A4,
+  dhabengali: 0x09A7,
+  dhadeva: 0x0927,
+  dhagujarati: 0x0AA7,
+  dhagurmukhi: 0x0A27,
+  dhook: 0x0257,
+  dialytikatonos: 0x0385,
+  dialytikatonoscmb: 0x0344,
+  diamond: 0x2666,
+  diamondsuitwhite: 0x2662,
+  dieresis: 0x00A8,
+  dieresisacute: 0xF6D7,
+  dieresisbelowcmb: 0x0324,
+  dieresiscmb: 0x0308,
+  dieresisgrave: 0xF6D8,
+  dieresistonos: 0x0385,
+  dihiragana: 0x3062,
+  dikatakana: 0x30C2,
+  dittomark: 0x3003,
+  divide: 0x00F7,
+  divides: 0x2223,
+  divisionslash: 0x2215,
+  djecyrillic: 0x0452,
+  dkshade: 0x2593,
+  dlinebelow: 0x1E0F,
+  dlsquare: 0x3397,
+  dmacron: 0x0111,
+  dmonospace: 0xFF44,
+  dnblock: 0x2584,
+  dochadathai: 0x0E0E,
+  dodekthai: 0x0E14,
+  dohiragana: 0x3069,
+  dokatakana: 0x30C9,
+  dollar: 0x0024,
+  dollarinferior: 0xF6E3,
+  dollarmonospace: 0xFF04,
+  dollaroldstyle: 0xF724,
+  dollarsmall: 0xFE69,
+  dollarsuperior: 0xF6E4,
+  dong: 0x20AB,
+  dorusquare: 0x3326,
+  dotaccent: 0x02D9,
+  dotaccentcmb: 0x0307,
+  dotbelowcmb: 0x0323,
+  dotbelowcomb: 0x0323,
+  dotkatakana: 0x30FB,
+  dotlessi: 0x0131,
+  dotlessj: 0xF6BE,
+  dotlessjstrokehook: 0x0284,
+  dotmath: 0x22C5,
+  dottedcircle: 0x25CC,
+  doubleyodpatah: 0xFB1F,
+  doubleyodpatahhebrew: 0xFB1F,
+  downtackbelowcmb: 0x031E,
+  downtackmod: 0x02D5,
+  dparen: 0x249F,
+  dsuperior: 0xF6EB,
+  dtail: 0x0256,
+  dtopbar: 0x018C,
+  duhiragana: 0x3065,
+  dukatakana: 0x30C5,
+  dz: 0x01F3,
+  dzaltone: 0x02A3,
+  dzcaron: 0x01C6,
+  dzcurl: 0x02A5,
+  dzeabkhasiancyrillic: 0x04E1,
+  dzecyrillic: 0x0455,
+  dzhecyrillic: 0x045F,
+  e: 0x0065,
+  eacute: 0x00E9,
+  earth: 0x2641,
+  ebengali: 0x098F,
+  ebopomofo: 0x311C,
+  ebreve: 0x0115,
+  ecandradeva: 0x090D,
+  ecandragujarati: 0x0A8D,
+  ecandravowelsigndeva: 0x0945,
+  ecandravowelsigngujarati: 0x0AC5,
+  ecaron: 0x011B,
+  ecedillabreve: 0x1E1D,
+  echarmenian: 0x0565,
+  echyiwnarmenian: 0x0587,
+  ecircle: 0x24D4,
+  ecircumflex: 0x00EA,
+  ecircumflexacute: 0x1EBF,
+  ecircumflexbelow: 0x1E19,
+  ecircumflexdotbelow: 0x1EC7,
+  ecircumflexgrave: 0x1EC1,
+  ecircumflexhookabove: 0x1EC3,
+  ecircumflextilde: 0x1EC5,
+  ecyrillic: 0x0454,
+  edblgrave: 0x0205,
+  edeva: 0x090F,
+  edieresis: 0x00EB,
+  edot: 0x0117,
+  edotaccent: 0x0117,
+  edotbelow: 0x1EB9,
+  eegurmukhi: 0x0A0F,
+  eematragurmukhi: 0x0A47,
+  efcyrillic: 0x0444,
+  egrave: 0x00E8,
+  egujarati: 0x0A8F,
+  eharmenian: 0x0567,
+  ehbopomofo: 0x311D,
+  ehiragana: 0x3048,
+  ehookabove: 0x1EBB,
+  eibopomofo: 0x311F,
+  eight: 0x0038,
+  eightarabic: 0x0668,
+  eightbengali: 0x09EE,
+  eightcircle: 0x2467,
+  eightcircleinversesansserif: 0x2791,
+  eightdeva: 0x096E,
+  eighteencircle: 0x2471,
+  eighteenparen: 0x2485,
+  eighteenperiod: 0x2499,
+  eightgujarati: 0x0AEE,
+  eightgurmukhi: 0x0A6E,
+  eighthackarabic: 0x0668,
+  eighthangzhou: 0x3028,
+  eighthnotebeamed: 0x266B,
+  eightideographicparen: 0x3227,
+  eightinferior: 0x2088,
+  eightmonospace: 0xFF18,
+  eightoldstyle: 0xF738,
+  eightparen: 0x247B,
+  eightperiod: 0x248F,
+  eightpersian: 0x06F8,
+  eightroman: 0x2177,
+  eightsuperior: 0x2078,
+  eightthai: 0x0E58,
+  einvertedbreve: 0x0207,
+  eiotifiedcyrillic: 0x0465,
+  ekatakana: 0x30A8,
+  ekatakanahalfwidth: 0xFF74,
+  ekonkargurmukhi: 0x0A74,
+  ekorean: 0x3154,
+  elcyrillic: 0x043B,
+  element: 0x2208,
+  elevencircle: 0x246A,
+  elevenparen: 0x247E,
+  elevenperiod: 0x2492,
+  elevenroman: 0x217A,
+  ellipsis: 0x2026,
+  ellipsisvertical: 0x22EE,
+  emacron: 0x0113,
+  emacronacute: 0x1E17,
+  emacrongrave: 0x1E15,
+  emcyrillic: 0x043C,
+  emdash: 0x2014,
+  emdashvertical: 0xFE31,
+  emonospace: 0xFF45,
+  emphasismarkarmenian: 0x055B,
+  emptyset: 0x2205,
+  enbopomofo: 0x3123,
+  encyrillic: 0x043D,
+  endash: 0x2013,
+  endashvertical: 0xFE32,
+  endescendercyrillic: 0x04A3,
+  eng: 0x014B,
+  engbopomofo: 0x3125,
+  enghecyrillic: 0x04A5,
+  enhookcyrillic: 0x04C8,
+  enspace: 0x2002,
+  eogonek: 0x0119,
+  eokorean: 0x3153,
+  eopen: 0x025B,
+  eopenclosed: 0x029A,
+  eopenreversed: 0x025C,
+  eopenreversedclosed: 0x025E,
+  eopenreversedhook: 0x025D,
+  eparen: 0x24A0,
+  epsilon: 0x03B5,
+  epsilontonos: 0x03AD,
+  equal: 0x003D,
+  equalmonospace: 0xFF1D,
+  equalsmall: 0xFE66,
+  equalsuperior: 0x207C,
+  equivalence: 0x2261,
+  erbopomofo: 0x3126,
+  ercyrillic: 0x0440,
+  ereversed: 0x0258,
+  ereversedcyrillic: 0x044D,
+  escyrillic: 0x0441,
+  esdescendercyrillic: 0x04AB,
+  esh: 0x0283,
+  eshcurl: 0x0286,
+  eshortdeva: 0x090E,
+  eshortvowelsigndeva: 0x0946,
+  eshreversedloop: 0x01AA,
+  eshsquatreversed: 0x0285,
+  esmallhiragana: 0x3047,
+  esmallkatakana: 0x30A7,
+  esmallkatakanahalfwidth: 0xFF6A,
+  estimated: 0x212E,
+  esuperior: 0xF6EC,
+  eta: 0x03B7,
+  etarmenian: 0x0568,
+  etatonos: 0x03AE,
+  eth: 0x00F0,
+  etilde: 0x1EBD,
+  etildebelow: 0x1E1B,
+  etnahtafoukhhebrew: 0x0591,
+  etnahtafoukhlefthebrew: 0x0591,
+  etnahtahebrew: 0x0591,
+  etnahtalefthebrew: 0x0591,
+  eturned: 0x01DD,
+  eukorean: 0x3161,
+  euro: 0x20AC,
+  evowelsignbengali: 0x09C7,
+  evowelsigndeva: 0x0947,
+  evowelsigngujarati: 0x0AC7,
+  exclam: 0x0021,
+  exclamarmenian: 0x055C,
+  exclamdbl: 0x203C,
+  exclamdown: 0x00A1,
+  exclamdownsmall: 0xF7A1,
+  exclammonospace: 0xFF01,
+  exclamsmall: 0xF721,
+  existential: 0x2203,
+  ezh: 0x0292,
+  ezhcaron: 0x01EF,
+  ezhcurl: 0x0293,
+  ezhreversed: 0x01B9,
+  ezhtail: 0x01BA,
+  f: 0x0066,
+  fadeva: 0x095E,
+  fagurmukhi: 0x0A5E,
+  fahrenheit: 0x2109,
+  fathaarabic: 0x064E,
+  fathalowarabic: 0x064E,
+  fathatanarabic: 0x064B,
+  fbopomofo: 0x3108,
+  fcircle: 0x24D5,
+  fdotaccent: 0x1E1F,
+  feharabic: 0x0641,
+  feharmenian: 0x0586,
+  fehfinalarabic: 0xFED2,
+  fehinitialarabic: 0xFED3,
+  fehmedialarabic: 0xFED4,
+  feicoptic: 0x03E5,
+  female: 0x2640,
+  ff: 0xFB00,
+  ffi: 0xFB03,
+  ffl: 0xFB04,
+  fi: 0xFB01,
+  fifteencircle: 0x246E,
+  fifteenparen: 0x2482,
+  fifteenperiod: 0x2496,
+  figuredash: 0x2012,
+  filledbox: 0x25A0,
+  filledrect: 0x25AC,
+  finalkaf: 0x05DA,
+  finalkafdagesh: 0xFB3A,
+  finalkafdageshhebrew: 0xFB3A,
+  finalkafhebrew: 0x05DA,
+  finalmem: 0x05DD,
+  finalmemhebrew: 0x05DD,
+  finalnun: 0x05DF,
+  finalnunhebrew: 0x05DF,
+  finalpe: 0x05E3,
+  finalpehebrew: 0x05E3,
+  finaltsadi: 0x05E5,
+  finaltsadihebrew: 0x05E5,
+  firsttonechinese: 0x02C9,
+  fisheye: 0x25C9,
+  fitacyrillic: 0x0473,
+  five: 0x0035,
+  fivearabic: 0x0665,
+  fivebengali: 0x09EB,
+  fivecircle: 0x2464,
+  fivecircleinversesansserif: 0x278E,
+  fivedeva: 0x096B,
+  fiveeighths: 0x215D,
+  fivegujarati: 0x0AEB,
+  fivegurmukhi: 0x0A6B,
+  fivehackarabic: 0x0665,
+  fivehangzhou: 0x3025,
+  fiveideographicparen: 0x3224,
+  fiveinferior: 0x2085,
+  fivemonospace: 0xFF15,
+  fiveoldstyle: 0xF735,
+  fiveparen: 0x2478,
+  fiveperiod: 0x248C,
+  fivepersian: 0x06F5,
+  fiveroman: 0x2174,
+  fivesuperior: 0x2075,
+  fivethai: 0x0E55,
+  fl: 0xFB02,
+  florin: 0x0192,
+  fmonospace: 0xFF46,
+  fmsquare: 0x3399,
+  fofanthai: 0x0E1F,
+  fofathai: 0x0E1D,
+  fongmanthai: 0x0E4F,
+  forall: 0x2200,
+  four: 0x0034,
+  fourarabic: 0x0664,
+  fourbengali: 0x09EA,
+  fourcircle: 0x2463,
+  fourcircleinversesansserif: 0x278D,
+  fourdeva: 0x096A,
+  fourgujarati: 0x0AEA,
+  fourgurmukhi: 0x0A6A,
+  fourhackarabic: 0x0664,
+  fourhangzhou: 0x3024,
+  fourideographicparen: 0x3223,
+  fourinferior: 0x2084,
+  fourmonospace: 0xFF14,
+  fournumeratorbengali: 0x09F7,
+  fouroldstyle: 0xF734,
+  fourparen: 0x2477,
+  fourperiod: 0x248B,
+  fourpersian: 0x06F4,
+  fourroman: 0x2173,
+  foursuperior: 0x2074,
+  fourteencircle: 0x246D,
+  fourteenparen: 0x2481,
+  fourteenperiod: 0x2495,
+  fourthai: 0x0E54,
+  fourthtonechinese: 0x02CB,
+  fparen: 0x24A1,
+  fraction: 0x2044,
+  franc: 0x20A3,
+  g: 0x0067,
+  gabengali: 0x0997,
+  gacute: 0x01F5,
+  gadeva: 0x0917,
+  gafarabic: 0x06AF,
+  gaffinalarabic: 0xFB93,
+  gafinitialarabic: 0xFB94,
+  gafmedialarabic: 0xFB95,
+  gagujarati: 0x0A97,
+  gagurmukhi: 0x0A17,
+  gahiragana: 0x304C,
+  gakatakana: 0x30AC,
+  gamma: 0x03B3,
+  gammalatinsmall: 0x0263,
+  gammasuperior: 0x02E0,
+  gangiacoptic: 0x03EB,
+  gbopomofo: 0x310D,
+  gbreve: 0x011F,
+  gcaron: 0x01E7,
+  gcedilla: 0x0123,
+  gcircle: 0x24D6,
+  gcircumflex: 0x011D,
+  gcommaaccent: 0x0123,
+  gdot: 0x0121,
+  gdotaccent: 0x0121,
+  gecyrillic: 0x0433,
+  gehiragana: 0x3052,
+  gekatakana: 0x30B2,
+  geometricallyequal: 0x2251,
+  gereshaccenthebrew: 0x059C,
+  gereshhebrew: 0x05F3,
+  gereshmuqdamhebrew: 0x059D,
+  germandbls: 0x00DF,
+  gershayimaccenthebrew: 0x059E,
+  gershayimhebrew: 0x05F4,
+  getamark: 0x3013,
+  ghabengali: 0x0998,
+  ghadarmenian: 0x0572,
+  ghadeva: 0x0918,
+  ghagujarati: 0x0A98,
+  ghagurmukhi: 0x0A18,
+  ghainarabic: 0x063A,
+  ghainfinalarabic: 0xFECE,
+  ghaininitialarabic: 0xFECF,
+  ghainmedialarabic: 0xFED0,
+  ghemiddlehookcyrillic: 0x0495,
+  ghestrokecyrillic: 0x0493,
+  gheupturncyrillic: 0x0491,
+  ghhadeva: 0x095A,
+  ghhagurmukhi: 0x0A5A,
+  ghook: 0x0260,
+  ghzsquare: 0x3393,
+  gihiragana: 0x304E,
+  gikatakana: 0x30AE,
+  gimarmenian: 0x0563,
+  gimel: 0x05D2,
+  gimeldagesh: 0xFB32,
+  gimeldageshhebrew: 0xFB32,
+  gimelhebrew: 0x05D2,
+  gjecyrillic: 0x0453,
+  glottalinvertedstroke: 0x01BE,
+  glottalstop: 0x0294,
+  glottalstopinverted: 0x0296,
+  glottalstopmod: 0x02C0,
+  glottalstopreversed: 0x0295,
+  glottalstopreversedmod: 0x02C1,
+  glottalstopreversedsuperior: 0x02E4,
+  glottalstopstroke: 0x02A1,
+  glottalstopstrokereversed: 0x02A2,
+  gmacron: 0x1E21,
+  gmonospace: 0xFF47,
+  gohiragana: 0x3054,
+  gokatakana: 0x30B4,
+  gparen: 0x24A2,
+  gpasquare: 0x33AC,
+  gradient: 0x2207,
+  grave: 0x0060,
+  gravebelowcmb: 0x0316,
+  gravecmb: 0x0300,
+  gravecomb: 0x0300,
+  gravedeva: 0x0953,
+  gravelowmod: 0x02CE,
+  gravemonospace: 0xFF40,
+  gravetonecmb: 0x0340,
+  greater: 0x003E,
+  greaterequal: 0x2265,
+  greaterequalorless: 0x22DB,
+  greatermonospace: 0xFF1E,
+  greaterorequivalent: 0x2273,
+  greaterorless: 0x2277,
+  greateroverequal: 0x2267,
+  greatersmall: 0xFE65,
+  gscript: 0x0261,
+  gstroke: 0x01E5,
+  guhiragana: 0x3050,
+  guillemotleft: 0x00AB,
+  guillemotright: 0x00BB,
+  guilsinglleft: 0x2039,
+  guilsinglright: 0x203A,
+  gukatakana: 0x30B0,
+  guramusquare: 0x3318,
+  gysquare: 0x33C9,
+  h: 0x0068,
+  haabkhasiancyrillic: 0x04A9,
+  haaltonearabic: 0x06C1,
+  habengali: 0x09B9,
+  hadescendercyrillic: 0x04B3,
+  hadeva: 0x0939,
+  hagujarati: 0x0AB9,
+  hagurmukhi: 0x0A39,
+  haharabic: 0x062D,
+  hahfinalarabic: 0xFEA2,
+  hahinitialarabic: 0xFEA3,
+  hahiragana: 0x306F,
+  hahmedialarabic: 0xFEA4,
+  haitusquare: 0x332A,
+  hakatakana: 0x30CF,
+  hakatakanahalfwidth: 0xFF8A,
+  halantgurmukhi: 0x0A4D,
+  hamzaarabic: 0x0621,
+  hamzalowarabic: 0x0621,
+  hangulfiller: 0x3164,
+  hardsigncyrillic: 0x044A,
+  harpoonleftbarbup: 0x21BC,
+  harpoonrightbarbup: 0x21C0,
+  hasquare: 0x33CA,
+  hatafpatah: 0x05B2,
+  hatafpatah16: 0x05B2,
+  hatafpatah23: 0x05B2,
+  hatafpatah2f: 0x05B2,
+  hatafpatahhebrew: 0x05B2,
+  hatafpatahnarrowhebrew: 0x05B2,
+  hatafpatahquarterhebrew: 0x05B2,
+  hatafpatahwidehebrew: 0x05B2,
+  hatafqamats: 0x05B3,
+  hatafqamats1b: 0x05B3,
+  hatafqamats28: 0x05B3,
+  hatafqamats34: 0x05B3,
+  hatafqamatshebrew: 0x05B3,
+  hatafqamatsnarrowhebrew: 0x05B3,
+  hatafqamatsquarterhebrew: 0x05B3,
+  hatafqamatswidehebrew: 0x05B3,
+  hatafsegol: 0x05B1,
+  hatafsegol17: 0x05B1,
+  hatafsegol24: 0x05B1,
+  hatafsegol30: 0x05B1,
+  hatafsegolhebrew: 0x05B1,
+  hatafsegolnarrowhebrew: 0x05B1,
+  hatafsegolquarterhebrew: 0x05B1,
+  hatafsegolwidehebrew: 0x05B1,
+  hbar: 0x0127,
+  hbopomofo: 0x310F,
+  hbrevebelow: 0x1E2B,
+  hcedilla: 0x1E29,
+  hcircle: 0x24D7,
+  hcircumflex: 0x0125,
+  hdieresis: 0x1E27,
+  hdotaccent: 0x1E23,
+  hdotbelow: 0x1E25,
+  he: 0x05D4,
+  heart: 0x2665,
+  heartsuitblack: 0x2665,
+  heartsuitwhite: 0x2661,
+  hedagesh: 0xFB34,
+  hedageshhebrew: 0xFB34,
+  hehaltonearabic: 0x06C1,
+  heharabic: 0x0647,
+  hehebrew: 0x05D4,
+  hehfinalaltonearabic: 0xFBA7,
+  hehfinalalttwoarabic: 0xFEEA,
+  hehfinalarabic: 0xFEEA,
+  hehhamzaabovefinalarabic: 0xFBA5,
+  hehhamzaaboveisolatedarabic: 0xFBA4,
+  hehinitialaltonearabic: 0xFBA8,
+  hehinitialarabic: 0xFEEB,
+  hehiragana: 0x3078,
+  hehmedialaltonearabic: 0xFBA9,
+  hehmedialarabic: 0xFEEC,
+  heiseierasquare: 0x337B,
+  hekatakana: 0x30D8,
+  hekatakanahalfwidth: 0xFF8D,
+  hekutaarusquare: 0x3336,
+  henghook: 0x0267,
+  herutusquare: 0x3339,
+  het: 0x05D7,
+  hethebrew: 0x05D7,
+  hhook: 0x0266,
+  hhooksuperior: 0x02B1,
+  hieuhacirclekorean: 0x327B,
+  hieuhaparenkorean: 0x321B,
+  hieuhcirclekorean: 0x326D,
+  hieuhkorean: 0x314E,
+  hieuhparenkorean: 0x320D,
+  hihiragana: 0x3072,
+  hikatakana: 0x30D2,
+  hikatakanahalfwidth: 0xFF8B,
+  hiriq: 0x05B4,
+  hiriq14: 0x05B4,
+  hiriq21: 0x05B4,
+  hiriq2d: 0x05B4,
+  hiriqhebrew: 0x05B4,
+  hiriqnarrowhebrew: 0x05B4,
+  hiriqquarterhebrew: 0x05B4,
+  hiriqwidehebrew: 0x05B4,
+  hlinebelow: 0x1E96,
+  hmonospace: 0xFF48,
+  hoarmenian: 0x0570,
+  hohipthai: 0x0E2B,
+  hohiragana: 0x307B,
+  hokatakana: 0x30DB,
+  hokatakanahalfwidth: 0xFF8E,
+  holam: 0x05B9,
+  holam19: 0x05B9,
+  holam26: 0x05B9,
+  holam32: 0x05B9,
+  holamhebrew: 0x05B9,
+  holamnarrowhebrew: 0x05B9,
+  holamquarterhebrew: 0x05B9,
+  holamwidehebrew: 0x05B9,
+  honokhukthai: 0x0E2E,
+  hookabovecomb: 0x0309,
+  hookcmb: 0x0309,
+  hookpalatalizedbelowcmb: 0x0321,
+  hookretroflexbelowcmb: 0x0322,
+  hoonsquare: 0x3342,
+  horicoptic: 0x03E9,
+  horizontalbar: 0x2015,
+  horncmb: 0x031B,
+  hotsprings: 0x2668,
+  house: 0x2302,
+  hparen: 0x24A3,
+  hsuperior: 0x02B0,
+  hturned: 0x0265,
+  huhiragana: 0x3075,
+  huiitosquare: 0x3333,
+  hukatakana: 0x30D5,
+  hukatakanahalfwidth: 0xFF8C,
+  hungarumlaut: 0x02DD,
+  hungarumlautcmb: 0x030B,
+  hv: 0x0195,
+  hyphen: 0x002D,
+  hypheninferior: 0xF6E5,
+  hyphenmonospace: 0xFF0D,
+  hyphensmall: 0xFE63,
+  hyphensuperior: 0xF6E6,
+  hyphentwo: 0x2010,
+  i: 0x0069,
+  iacute: 0x00ED,
+  iacyrillic: 0x044F,
+  ibengali: 0x0987,
+  ibopomofo: 0x3127,
+  ibreve: 0x012D,
+  icaron: 0x01D0,
+  icircle: 0x24D8,
+  icircumflex: 0x00EE,
+  icyrillic: 0x0456,
+  idblgrave: 0x0209,
+  ideographearthcircle: 0x328F,
+  ideographfirecircle: 0x328B,
+  ideographicallianceparen: 0x323F,
+  ideographiccallparen: 0x323A,
+  ideographiccentrecircle: 0x32A5,
+  ideographicclose: 0x3006,
+  ideographiccomma: 0x3001,
+  ideographiccommaleft: 0xFF64,
+  ideographiccongratulationparen: 0x3237,
+  ideographiccorrectcircle: 0x32A3,
+  ideographicearthparen: 0x322F,
+  ideographicenterpriseparen: 0x323D,
+  ideographicexcellentcircle: 0x329D,
+  ideographicfestivalparen: 0x3240,
+  ideographicfinancialcircle: 0x3296,
+  ideographicfinancialparen: 0x3236,
+  ideographicfireparen: 0x322B,
+  ideographichaveparen: 0x3232,
+  ideographichighcircle: 0x32A4,
+  ideographiciterationmark: 0x3005,
+  ideographiclaborcircle: 0x3298,
+  ideographiclaborparen: 0x3238,
+  ideographicleftcircle: 0x32A7,
+  ideographiclowcircle: 0x32A6,
+  ideographicmedicinecircle: 0x32A9,
+  ideographicmetalparen: 0x322E,
+  ideographicmoonparen: 0x322A,
+  ideographicnameparen: 0x3234,
+  ideographicperiod: 0x3002,
+  ideographicprintcircle: 0x329E,
+  ideographicreachparen: 0x3243,
+  ideographicrepresentparen: 0x3239,
+  ideographicresourceparen: 0x323E,
+  ideographicrightcircle: 0x32A8,
+  ideographicsecretcircle: 0x3299,
+  ideographicselfparen: 0x3242,
+  ideographicsocietyparen: 0x3233,
+  ideographicspace: 0x3000,
+  ideographicspecialparen: 0x3235,
+  ideographicstockparen: 0x3231,
+  ideographicstudyparen: 0x323B,
+  ideographicsunparen: 0x3230,
+  ideographicsuperviseparen: 0x323C,
+  ideographicwaterparen: 0x322C,
+  ideographicwoodparen: 0x322D,
+  ideographiczero: 0x3007,
+  ideographmetalcircle: 0x328E,
+  ideographmooncircle: 0x328A,
+  ideographnamecircle: 0x3294,
+  ideographsuncircle: 0x3290,
+  ideographwatercircle: 0x328C,
+  ideographwoodcircle: 0x328D,
+  ideva: 0x0907,
+  idieresis: 0x00EF,
+  idieresisacute: 0x1E2F,
+  idieresiscyrillic: 0x04E5,
+  idotbelow: 0x1ECB,
+  iebrevecyrillic: 0x04D7,
+  iecyrillic: 0x0435,
+  ieungacirclekorean: 0x3275,
+  ieungaparenkorean: 0x3215,
+  ieungcirclekorean: 0x3267,
+  ieungkorean: 0x3147,
+  ieungparenkorean: 0x3207,
+  igrave: 0x00EC,
+  igujarati: 0x0A87,
+  igurmukhi: 0x0A07,
+  ihiragana: 0x3044,
+  ihookabove: 0x1EC9,
+  iibengali: 0x0988,
+  iicyrillic: 0x0438,
+  iideva: 0x0908,
+  iigujarati: 0x0A88,
+  iigurmukhi: 0x0A08,
+  iimatragurmukhi: 0x0A40,
+  iinvertedbreve: 0x020B,
+  iishortcyrillic: 0x0439,
+  iivowelsignbengali: 0x09C0,
+  iivowelsigndeva: 0x0940,
+  iivowelsigngujarati: 0x0AC0,
+  ij: 0x0133,
+  ikatakana: 0x30A4,
+  ikatakanahalfwidth: 0xFF72,
+  ikorean: 0x3163,
+  ilde: 0x02DC,
+  iluyhebrew: 0x05AC,
+  imacron: 0x012B,
+  imacroncyrillic: 0x04E3,
+  imageorapproximatelyequal: 0x2253,
+  imatragurmukhi: 0x0A3F,
+  imonospace: 0xFF49,
+  increment: 0x2206,
+  infinity: 0x221E,
+  iniarmenian: 0x056B,
+  integral: 0x222B,
+  integralbottom: 0x2321,
+  integralbt: 0x2321,
+  integralex: 0xF8F5,
+  integraltop: 0x2320,
+  integraltp: 0x2320,
+  intersection: 0x2229,
+  intisquare: 0x3305,
+  invbullet: 0x25D8,
+  invcircle: 0x25D9,
+  invsmileface: 0x263B,
+  iocyrillic: 0x0451,
+  iogonek: 0x012F,
+  iota: 0x03B9,
+  iotadieresis: 0x03CA,
+  iotadieresistonos: 0x0390,
+  iotalatin: 0x0269,
+  iotatonos: 0x03AF,
+  iparen: 0x24A4,
+  irigurmukhi: 0x0A72,
+  ismallhiragana: 0x3043,
+  ismallkatakana: 0x30A3,
+  ismallkatakanahalfwidth: 0xFF68,
+  issharbengali: 0x09FA,
+  istroke: 0x0268,
+  isuperior: 0xF6ED,
+  iterationhiragana: 0x309D,
+  iterationkatakana: 0x30FD,
+  itilde: 0x0129,
+  itildebelow: 0x1E2D,
+  iubopomofo: 0x3129,
+  iucyrillic: 0x044E,
+  ivowelsignbengali: 0x09BF,
+  ivowelsigndeva: 0x093F,
+  ivowelsigngujarati: 0x0ABF,
+  izhitsacyrillic: 0x0475,
+  izhitsadblgravecyrillic: 0x0477,
+  j: 0x006A,
+  jaarmenian: 0x0571,
+  jabengali: 0x099C,
+  jadeva: 0x091C,
+  jagujarati: 0x0A9C,
+  jagurmukhi: 0x0A1C,
+  jbopomofo: 0x3110,
+  jcaron: 0x01F0,
+  jcircle: 0x24D9,
+  jcircumflex: 0x0135,
+  jcrossedtail: 0x029D,
+  jdotlessstroke: 0x025F,
+  jecyrillic: 0x0458,
+  jeemarabic: 0x062C,
+  jeemfinalarabic: 0xFE9E,
+  jeeminitialarabic: 0xFE9F,
+  jeemmedialarabic: 0xFEA0,
+  jeharabic: 0x0698,
+  jehfinalarabic: 0xFB8B,
+  jhabengali: 0x099D,
+  jhadeva: 0x091D,
+  jhagujarati: 0x0A9D,
+  jhagurmukhi: 0x0A1D,
+  jheharmenian: 0x057B,
+  jis: 0x3004,
+  jmonospace: 0xFF4A,
+  jparen: 0x24A5,
+  jsuperior: 0x02B2,
+  k: 0x006B,
+  kabashkircyrillic: 0x04A1,
+  kabengali: 0x0995,
+  kacute: 0x1E31,
+  kacyrillic: 0x043A,
+  kadescendercyrillic: 0x049B,
+  kadeva: 0x0915,
+  kaf: 0x05DB,
+  kafarabic: 0x0643,
+  kafdagesh: 0xFB3B,
+  kafdageshhebrew: 0xFB3B,
+  kaffinalarabic: 0xFEDA,
+  kafhebrew: 0x05DB,
+  kafinitialarabic: 0xFEDB,
+  kafmedialarabic: 0xFEDC,
+  kafrafehebrew: 0xFB4D,
+  kagujarati: 0x0A95,
+  kagurmukhi: 0x0A15,
+  kahiragana: 0x304B,
+  kahookcyrillic: 0x04C4,
+  kakatakana: 0x30AB,
+  kakatakanahalfwidth: 0xFF76,
+  kappa: 0x03BA,
+  kappasymbolgreek: 0x03F0,
+  kapyeounmieumkorean: 0x3171,
+  kapyeounphieuphkorean: 0x3184,
+  kapyeounpieupkorean: 0x3178,
+  kapyeounssangpieupkorean: 0x3179,
+  karoriisquare: 0x330D,
+  kashidaautoarabic: 0x0640,
+  kashidaautonosidebearingarabic: 0x0640,
+  kasmallkatakana: 0x30F5,
+  kasquare: 0x3384,
+  kasraarabic: 0x0650,
+  kasratanarabic: 0x064D,
+  kastrokecyrillic: 0x049F,
+  katahiraprolongmarkhalfwidth: 0xFF70,
+  kaverticalstrokecyrillic: 0x049D,
+  kbopomofo: 0x310E,
+  kcalsquare: 0x3389,
+  kcaron: 0x01E9,
+  kcedilla: 0x0137,
+  kcircle: 0x24DA,
+  kcommaaccent: 0x0137,
+  kdotbelow: 0x1E33,
+  keharmenian: 0x0584,
+  kehiragana: 0x3051,
+  kekatakana: 0x30B1,
+  kekatakanahalfwidth: 0xFF79,
+  kenarmenian: 0x056F,
+  kesmallkatakana: 0x30F6,
+  kgreenlandic: 0x0138,
+  khabengali: 0x0996,
+  khacyrillic: 0x0445,
+  khadeva: 0x0916,
+  khagujarati: 0x0A96,
+  khagurmukhi: 0x0A16,
+  khaharabic: 0x062E,
+  khahfinalarabic: 0xFEA6,
+  khahinitialarabic: 0xFEA7,
+  khahmedialarabic: 0xFEA8,
+  kheicoptic: 0x03E7,
+  khhadeva: 0x0959,
+  khhagurmukhi: 0x0A59,
+  khieukhacirclekorean: 0x3278,
+  khieukhaparenkorean: 0x3218,
+  khieukhcirclekorean: 0x326A,
+  khieukhkorean: 0x314B,
+  khieukhparenkorean: 0x320A,
+  khokhaithai: 0x0E02,
+  khokhonthai: 0x0E05,
+  khokhuatthai: 0x0E03,
+  khokhwaithai: 0x0E04,
+  khomutthai: 0x0E5B,
+  khook: 0x0199,
+  khorakhangthai: 0x0E06,
+  khzsquare: 0x3391,
+  kihiragana: 0x304D,
+  kikatakana: 0x30AD,
+  kikatakanahalfwidth: 0xFF77,
+  kiroguramusquare: 0x3315,
+  kiromeetorusquare: 0x3316,
+  kirosquare: 0x3314,
+  kiyeokacirclekorean: 0x326E,
+  kiyeokaparenkorean: 0x320E,
+  kiyeokcirclekorean: 0x3260,
+  kiyeokkorean: 0x3131,
+  kiyeokparenkorean: 0x3200,
+  kiyeoksioskorean: 0x3133,
+  kjecyrillic: 0x045C,
+  klinebelow: 0x1E35,
+  klsquare: 0x3398,
+  kmcubedsquare: 0x33A6,
+  kmonospace: 0xFF4B,
+  kmsquaredsquare: 0x33A2,
+  kohiragana: 0x3053,
+  kohmsquare: 0x33C0,
+  kokaithai: 0x0E01,
+  kokatakana: 0x30B3,
+  kokatakanahalfwidth: 0xFF7A,
+  kooposquare: 0x331E,
+  koppacyrillic: 0x0481,
+  koreanstandardsymbol: 0x327F,
+  koroniscmb: 0x0343,
+  kparen: 0x24A6,
+  kpasquare: 0x33AA,
+  ksicyrillic: 0x046F,
+  ktsquare: 0x33CF,
+  kturned: 0x029E,
+  kuhiragana: 0x304F,
+  kukatakana: 0x30AF,
+  kukatakanahalfwidth: 0xFF78,
+  kvsquare: 0x33B8,
+  kwsquare: 0x33BE,
+  l: 0x006C,
+  labengali: 0x09B2,
+  lacute: 0x013A,
+  ladeva: 0x0932,
+  lagujarati: 0x0AB2,
+  lagurmukhi: 0x0A32,
+  lakkhangyaothai: 0x0E45,
+  lamaleffinalarabic: 0xFEFC,
+  lamalefhamzaabovefinalarabic: 0xFEF8,
+  lamalefhamzaaboveisolatedarabic: 0xFEF7,
+  lamalefhamzabelowfinalarabic: 0xFEFA,
+  lamalefhamzabelowisolatedarabic: 0xFEF9,
+  lamalefisolatedarabic: 0xFEFB,
+  lamalefmaddaabovefinalarabic: 0xFEF6,
+  lamalefmaddaaboveisolatedarabic: 0xFEF5,
+  lamarabic: 0x0644,
+  lambda: 0x03BB,
+  lambdastroke: 0x019B,
+  lamed: 0x05DC,
+  lameddagesh: 0xFB3C,
+  lameddageshhebrew: 0xFB3C,
+  lamedhebrew: 0x05DC,
+  lamfinalarabic: 0xFEDE,
+  lamhahinitialarabic: 0xFCCA,
+  laminitialarabic: 0xFEDF,
+  lamjeeminitialarabic: 0xFCC9,
+  lamkhahinitialarabic: 0xFCCB,
+  lamlamhehisolatedarabic: 0xFDF2,
+  lammedialarabic: 0xFEE0,
+  lammeemhahinitialarabic: 0xFD88,
+  lammeeminitialarabic: 0xFCCC,
+  largecircle: 0x25EF,
+  lbar: 0x019A,
+  lbelt: 0x026C,
+  lbopomofo: 0x310C,
+  lcaron: 0x013E,
+  lcedilla: 0x013C,
+  lcircle: 0x24DB,
+  lcircumflexbelow: 0x1E3D,
+  lcommaaccent: 0x013C,
+  ldot: 0x0140,
+  ldotaccent: 0x0140,
+  ldotbelow: 0x1E37,
+  ldotbelowmacron: 0x1E39,
+  leftangleabovecmb: 0x031A,
+  lefttackbelowcmb: 0x0318,
+  less: 0x003C,
+  lessequal: 0x2264,
+  lessequalorgreater: 0x22DA,
+  lessmonospace: 0xFF1C,
+  lessorequivalent: 0x2272,
+  lessorgreater: 0x2276,
+  lessoverequal: 0x2266,
+  lesssmall: 0xFE64,
+  lezh: 0x026E,
+  lfblock: 0x258C,
+  lhookretroflex: 0x026D,
+  lira: 0x20A4,
+  liwnarmenian: 0x056C,
+  lj: 0x01C9,
+  ljecyrillic: 0x0459,
+  ll: 0xF6C0,
+  lladeva: 0x0933,
+  llagujarati: 0x0AB3,
+  llinebelow: 0x1E3B,
+  llladeva: 0x0934,
+  llvocalicbengali: 0x09E1,
+  llvocalicdeva: 0x0961,
+  llvocalicvowelsignbengali: 0x09E3,
+  llvocalicvowelsigndeva: 0x0963,
+  lmiddletilde: 0x026B,
+  lmonospace: 0xFF4C,
+  lmsquare: 0x33D0,
+  lochulathai: 0x0E2C,
+  logicaland: 0x2227,
+  logicalnot: 0x00AC,
+  logicalnotreversed: 0x2310,
+  logicalor: 0x2228,
+  lolingthai: 0x0E25,
+  longs: 0x017F,
+  lowlinecenterline: 0xFE4E,
+  lowlinecmb: 0x0332,
+  lowlinedashed: 0xFE4D,
+  lozenge: 0x25CA,
+  lparen: 0x24A7,
+  lslash: 0x0142,
+  lsquare: 0x2113,
+  lsuperior: 0xF6EE,
+  ltshade: 0x2591,
+  luthai: 0x0E26,
+  lvocalicbengali: 0x098C,
+  lvocalicdeva: 0x090C,
+  lvocalicvowelsignbengali: 0x09E2,
+  lvocalicvowelsigndeva: 0x0962,
+  lxsquare: 0x33D3,
+  m: 0x006D,
+  mabengali: 0x09AE,
+  macron: 0x00AF,
+  macronbelowcmb: 0x0331,
+  macroncmb: 0x0304,
+  macronlowmod: 0x02CD,
+  macronmonospace: 0xFFE3,
+  macute: 0x1E3F,
+  madeva: 0x092E,
+  magujarati: 0x0AAE,
+  magurmukhi: 0x0A2E,
+  mahapakhhebrew: 0x05A4,
+  mahapakhlefthebrew: 0x05A4,
+  mahiragana: 0x307E,
+  maichattawalowleftthai: 0xF895,
+  maichattawalowrightthai: 0xF894,
+  maichattawathai: 0x0E4B,
+  maichattawaupperleftthai: 0xF893,
+  maieklowleftthai: 0xF88C,
+  maieklowrightthai: 0xF88B,
+  maiekthai: 0x0E48,
+  maiekupperleftthai: 0xF88A,
+  maihanakatleftthai: 0xF884,
+  maihanakatthai: 0x0E31,
+  maitaikhuleftthai: 0xF889,
+  maitaikhuthai: 0x0E47,
+  maitholowleftthai: 0xF88F,
+  maitholowrightthai: 0xF88E,
+  maithothai: 0x0E49,
+  maithoupperleftthai: 0xF88D,
+  maitrilowleftthai: 0xF892,
+  maitrilowrightthai: 0xF891,
+  maitrithai: 0x0E4A,
+  maitriupperleftthai: 0xF890,
+  maiyamokthai: 0x0E46,
+  makatakana: 0x30DE,
+  makatakanahalfwidth: 0xFF8F,
+  male: 0x2642,
+  mansyonsquare: 0x3347,
+  maqafhebrew: 0x05BE,
+  mars: 0x2642,
+  masoracirclehebrew: 0x05AF,
+  masquare: 0x3383,
+  mbopomofo: 0x3107,
+  mbsquare: 0x33D4,
+  mcircle: 0x24DC,
+  mcubedsquare: 0x33A5,
+  mdotaccent: 0x1E41,
+  mdotbelow: 0x1E43,
+  meemarabic: 0x0645,
+  meemfinalarabic: 0xFEE2,
+  meeminitialarabic: 0xFEE3,
+  meemmedialarabic: 0xFEE4,
+  meemmeeminitialarabic: 0xFCD1,
+  meemmeemisolatedarabic: 0xFC48,
+  meetorusquare: 0x334D,
+  mehiragana: 0x3081,
+  meizierasquare: 0x337E,
+  mekatakana: 0x30E1,
+  mekatakanahalfwidth: 0xFF92,
+  mem: 0x05DE,
+  memdagesh: 0xFB3E,
+  memdageshhebrew: 0xFB3E,
+  memhebrew: 0x05DE,
+  menarmenian: 0x0574,
+  merkhahebrew: 0x05A5,
+  merkhakefulahebrew: 0x05A6,
+  merkhakefulalefthebrew: 0x05A6,
+  merkhalefthebrew: 0x05A5,
+  mhook: 0x0271,
+  mhzsquare: 0x3392,
+  middledotkatakanahalfwidth: 0xFF65,
+  middot: 0x00B7,
+  mieumacirclekorean: 0x3272,
+  mieumaparenkorean: 0x3212,
+  mieumcirclekorean: 0x3264,
+  mieumkorean: 0x3141,
+  mieumpansioskorean: 0x3170,
+  mieumparenkorean: 0x3204,
+  mieumpieupkorean: 0x316E,
+  mieumsioskorean: 0x316F,
+  mihiragana: 0x307F,
+  mikatakana: 0x30DF,
+  mikatakanahalfwidth: 0xFF90,
+  minus: 0x2212,
+  minusbelowcmb: 0x0320,
+  minuscircle: 0x2296,
+  minusmod: 0x02D7,
+  minusplus: 0x2213,
+  minute: 0x2032,
+  miribaarusquare: 0x334A,
+  mirisquare: 0x3349,
+  mlonglegturned: 0x0270,
+  mlsquare: 0x3396,
+  mmcubedsquare: 0x33A3,
+  mmonospace: 0xFF4D,
+  mmsquaredsquare: 0x339F,
+  mohiragana: 0x3082,
+  mohmsquare: 0x33C1,
+  mokatakana: 0x30E2,
+  mokatakanahalfwidth: 0xFF93,
+  molsquare: 0x33D6,
+  momathai: 0x0E21,
+  moverssquare: 0x33A7,
+  moverssquaredsquare: 0x33A8,
+  mparen: 0x24A8,
+  mpasquare: 0x33AB,
+  mssquare: 0x33B3,
+  msuperior: 0xF6EF,
+  mturned: 0x026F,
+  mu: 0x00B5,
+  mu1: 0x00B5,
+  muasquare: 0x3382,
+  muchgreater: 0x226B,
+  muchless: 0x226A,
+  mufsquare: 0x338C,
+  mugreek: 0x03BC,
+  mugsquare: 0x338D,
+  muhiragana: 0x3080,
+  mukatakana: 0x30E0,
+  mukatakanahalfwidth: 0xFF91,
+  mulsquare: 0x3395,
+  multiply: 0x00D7,
+  mumsquare: 0x339B,
+  munahhebrew: 0x05A3,
+  munahlefthebrew: 0x05A3,
+  musicalnote: 0x266A,
+  musicalnotedbl: 0x266B,
+  musicflatsign: 0x266D,
+  musicsharpsign: 0x266F,
+  mussquare: 0x33B2,
+  muvsquare: 0x33B6,
+  muwsquare: 0x33BC,
+  mvmegasquare: 0x33B9,
+  mvsquare: 0x33B7,
+  mwmegasquare: 0x33BF,
+  mwsquare: 0x33BD,
+  n: 0x006E,
+  nabengali: 0x09A8,
+  nabla: 0x2207,
+  nacute: 0x0144,
+  nadeva: 0x0928,
+  nagujarati: 0x0AA8,
+  nagurmukhi: 0x0A28,
+  nahiragana: 0x306A,
+  nakatakana: 0x30CA,
+  nakatakanahalfwidth: 0xFF85,
+  napostrophe: 0x0149,
+  nasquare: 0x3381,
+  nbopomofo: 0x310B,
+  nbspace: 0x00A0,
+  ncaron: 0x0148,
+  ncedilla: 0x0146,
+  ncircle: 0x24DD,
+  ncircumflexbelow: 0x1E4B,
+  ncommaaccent: 0x0146,
+  ndotaccent: 0x1E45,
+  ndotbelow: 0x1E47,
+  nehiragana: 0x306D,
+  nekatakana: 0x30CD,
+  nekatakanahalfwidth: 0xFF88,
+  newsheqelsign: 0x20AA,
+  nfsquare: 0x338B,
+  ngabengali: 0x0999,
+  ngadeva: 0x0919,
+  ngagujarati: 0x0A99,
+  ngagurmukhi: 0x0A19,
+  ngonguthai: 0x0E07,
+  nhiragana: 0x3093,
+  nhookleft: 0x0272,
+  nhookretroflex: 0x0273,
+  nieunacirclekorean: 0x326F,
+  nieunaparenkorean: 0x320F,
+  nieuncieuckorean: 0x3135,
+  nieuncirclekorean: 0x3261,
+  nieunhieuhkorean: 0x3136,
+  nieunkorean: 0x3134,
+  nieunpansioskorean: 0x3168,
+  nieunparenkorean: 0x3201,
+  nieunsioskorean: 0x3167,
+  nieuntikeutkorean: 0x3166,
+  nihiragana: 0x306B,
+  nikatakana: 0x30CB,
+  nikatakanahalfwidth: 0xFF86,
+  nikhahitleftthai: 0xF899,
+  nikhahitthai: 0x0E4D,
+  nine: 0x0039,
+  ninearabic: 0x0669,
+  ninebengali: 0x09EF,
+  ninecircle: 0x2468,
+  ninecircleinversesansserif: 0x2792,
+  ninedeva: 0x096F,
+  ninegujarati: 0x0AEF,
+  ninegurmukhi: 0x0A6F,
+  ninehackarabic: 0x0669,
+  ninehangzhou: 0x3029,
+  nineideographicparen: 0x3228,
+  nineinferior: 0x2089,
+  ninemonospace: 0xFF19,
+  nineoldstyle: 0xF739,
+  nineparen: 0x247C,
+  nineperiod: 0x2490,
+  ninepersian: 0x06F9,
+  nineroman: 0x2178,
+  ninesuperior: 0x2079,
+  nineteencircle: 0x2472,
+  nineteenparen: 0x2486,
+  nineteenperiod: 0x249A,
+  ninethai: 0x0E59,
+  nj: 0x01CC,
+  njecyrillic: 0x045A,
+  nkatakana: 0x30F3,
+  nkatakanahalfwidth: 0xFF9D,
+  nlegrightlong: 0x019E,
+  nlinebelow: 0x1E49,
+  nmonospace: 0xFF4E,
+  nmsquare: 0x339A,
+  nnabengali: 0x09A3,
+  nnadeva: 0x0923,
+  nnagujarati: 0x0AA3,
+  nnagurmukhi: 0x0A23,
+  nnnadeva: 0x0929,
+  nohiragana: 0x306E,
+  nokatakana: 0x30CE,
+  nokatakanahalfwidth: 0xFF89,
+  nonbreakingspace: 0x00A0,
+  nonenthai: 0x0E13,
+  nonuthai: 0x0E19,
+  noonarabic: 0x0646,
+  noonfinalarabic: 0xFEE6,
+  noonghunnaarabic: 0x06BA,
+  noonghunnafinalarabic: 0xFB9F,
+  nooninitialarabic: 0xFEE7,
+  noonjeeminitialarabic: 0xFCD2,
+  noonjeemisolatedarabic: 0xFC4B,
+  noonmedialarabic: 0xFEE8,
+  noonmeeminitialarabic: 0xFCD5,
+  noonmeemisolatedarabic: 0xFC4E,
+  noonnoonfinalarabic: 0xFC8D,
+  notcontains: 0x220C,
+  notelement: 0x2209,
+  notelementof: 0x2209,
+  notequal: 0x2260,
+  notgreater: 0x226F,
+  notgreaternorequal: 0x2271,
+  notgreaternorless: 0x2279,
+  notidentical: 0x2262,
+  notless: 0x226E,
+  notlessnorequal: 0x2270,
+  notparallel: 0x2226,
+  notprecedes: 0x2280,
+  notsubset: 0x2284,
+  notsucceeds: 0x2281,
+  notsuperset: 0x2285,
+  nowarmenian: 0x0576,
+  nparen: 0x24A9,
+  nssquare: 0x33B1,
+  nsuperior: 0x207F,
+  ntilde: 0x00F1,
+  nu: 0x03BD,
+  nuhiragana: 0x306C,
+  nukatakana: 0x30CC,
+  nukatakanahalfwidth: 0xFF87,
+  nuktabengali: 0x09BC,
+  nuktadeva: 0x093C,
+  nuktagujarati: 0x0ABC,
+  nuktagurmukhi: 0x0A3C,
+  numbersign: 0x0023,
+  numbersignmonospace: 0xFF03,
+  numbersignsmall: 0xFE5F,
+  numeralsigngreek: 0x0374,
+  numeralsignlowergreek: 0x0375,
+  numero: 0x2116,
+  nun: 0x05E0,
+  nundagesh: 0xFB40,
+  nundageshhebrew: 0xFB40,
+  nunhebrew: 0x05E0,
+  nvsquare: 0x33B5,
+  nwsquare: 0x33BB,
+  nyabengali: 0x099E,
+  nyadeva: 0x091E,
+  nyagujarati: 0x0A9E,
+  nyagurmukhi: 0x0A1E,
+  o: 0x006F,
+  oacute: 0x00F3,
+  oangthai: 0x0E2D,
+  obarred: 0x0275,
+  obarredcyrillic: 0x04E9,
+  obarreddieresiscyrillic: 0x04EB,
+  obengali: 0x0993,
+  obopomofo: 0x311B,
+  obreve: 0x014F,
+  ocandradeva: 0x0911,
+  ocandragujarati: 0x0A91,
+  ocandravowelsigndeva: 0x0949,
+  ocandravowelsigngujarati: 0x0AC9,
+  ocaron: 0x01D2,
+  ocircle: 0x24DE,
+  ocircumflex: 0x00F4,
+  ocircumflexacute: 0x1ED1,
+  ocircumflexdotbelow: 0x1ED9,
+  ocircumflexgrave: 0x1ED3,
+  ocircumflexhookabove: 0x1ED5,
+  ocircumflextilde: 0x1ED7,
+  ocyrillic: 0x043E,
+  odblacute: 0x0151,
+  odblgrave: 0x020D,
+  odeva: 0x0913,
+  odieresis: 0x00F6,
+  odieresiscyrillic: 0x04E7,
+  odotbelow: 0x1ECD,
+  oe: 0x0153,
+  oekorean: 0x315A,
+  ogonek: 0x02DB,
+  ogonekcmb: 0x0328,
+  ograve: 0x00F2,
+  ogujarati: 0x0A93,
+  oharmenian: 0x0585,
+  ohiragana: 0x304A,
+  ohookabove: 0x1ECF,
+  ohorn: 0x01A1,
+  ohornacute: 0x1EDB,
+  ohorndotbelow: 0x1EE3,
+  ohorngrave: 0x1EDD,
+  ohornhookabove: 0x1EDF,
+  ohorntilde: 0x1EE1,
+  ohungarumlaut: 0x0151,
+  oi: 0x01A3,
+  oinvertedbreve: 0x020F,
+  okatakana: 0x30AA,
+  okatakanahalfwidth: 0xFF75,
+  okorean: 0x3157,
+  olehebrew: 0x05AB,
+  omacron: 0x014D,
+  omacronacute: 0x1E53,
+  omacrongrave: 0x1E51,
+  omdeva: 0x0950,
+  omega: 0x03C9,
+  omega1: 0x03D6,
+  omegacyrillic: 0x0461,
+  omegalatinclosed: 0x0277,
+  omegaroundcyrillic: 0x047B,
+  omegatitlocyrillic: 0x047D,
+  omegatonos: 0x03CE,
+  omgujarati: 0x0AD0,
+  omicron: 0x03BF,
+  omicrontonos: 0x03CC,
+  omonospace: 0xFF4F,
+  one: 0x0031,
+  onearabic: 0x0661,
+  onebengali: 0x09E7,
+  onecircle: 0x2460,
+  onecircleinversesansserif: 0x278A,
+  onedeva: 0x0967,
+  onedotenleader: 0x2024,
+  oneeighth: 0x215B,
+  onefitted: 0xF6DC,
+  onegujarati: 0x0AE7,
+  onegurmukhi: 0x0A67,
+  onehackarabic: 0x0661,
+  onehalf: 0x00BD,
+  onehangzhou: 0x3021,
+  oneideographicparen: 0x3220,
+  oneinferior: 0x2081,
+  onemonospace: 0xFF11,
+  onenumeratorbengali: 0x09F4,
+  oneoldstyle: 0xF731,
+  oneparen: 0x2474,
+  oneperiod: 0x2488,
+  onepersian: 0x06F1,
+  onequarter: 0x00BC,
+  oneroman: 0x2170,
+  onesuperior: 0x00B9,
+  onethai: 0x0E51,
+  onethird: 0x2153,
+  oogonek: 0x01EB,
+  oogonekmacron: 0x01ED,
+  oogurmukhi: 0x0A13,
+  oomatragurmukhi: 0x0A4B,
+  oopen: 0x0254,
+  oparen: 0x24AA,
+  openbullet: 0x25E6,
+  option: 0x2325,
+  ordfeminine: 0x00AA,
+  ordmasculine: 0x00BA,
+  orthogonal: 0x221F,
+  oshortdeva: 0x0912,
+  oshortvowelsigndeva: 0x094A,
+  oslash: 0x00F8,
+  oslashacute: 0x01FF,
+  osmallhiragana: 0x3049,
+  osmallkatakana: 0x30A9,
+  osmallkatakanahalfwidth: 0xFF6B,
+  ostrokeacute: 0x01FF,
+  osuperior: 0xF6F0,
+  otcyrillic: 0x047F,
+  otilde: 0x00F5,
+  otildeacute: 0x1E4D,
+  otildedieresis: 0x1E4F,
+  oubopomofo: 0x3121,
+  overline: 0x203E,
+  overlinecenterline: 0xFE4A,
+  overlinecmb: 0x0305,
+  overlinedashed: 0xFE49,
+  overlinedblwavy: 0xFE4C,
+  overlinewavy: 0xFE4B,
+  overscore: 0x00AF,
+  ovowelsignbengali: 0x09CB,
+  ovowelsigndeva: 0x094B,
+  ovowelsigngujarati: 0x0ACB,
+  p: 0x0070,
+  paampssquare: 0x3380,
+  paasentosquare: 0x332B,
+  pabengali: 0x09AA,
+  pacute: 0x1E55,
+  padeva: 0x092A,
+  pagedown: 0x21DF,
+  pageup: 0x21DE,
+  pagujarati: 0x0AAA,
+  pagurmukhi: 0x0A2A,
+  pahiragana: 0x3071,
+  paiyannoithai: 0x0E2F,
+  pakatakana: 0x30D1,
+  palatalizationcyrilliccmb: 0x0484,
+  palochkacyrillic: 0x04C0,
+  pansioskorean: 0x317F,
+  paragraph: 0x00B6,
+  parallel: 0x2225,
+  parenleft: 0x0028,
+  parenleftaltonearabic: 0xFD3E,
+  parenleftbt: 0xF8ED,
+  parenleftex: 0xF8EC,
+  parenleftinferior: 0x208D,
+  parenleftmonospace: 0xFF08,
+  parenleftsmall: 0xFE59,
+  parenleftsuperior: 0x207D,
+  parenlefttp: 0xF8EB,
+  parenleftvertical: 0xFE35,
+  parenright: 0x0029,
+  parenrightaltonearabic: 0xFD3F,
+  parenrightbt: 0xF8F8,
+  parenrightex: 0xF8F7,
+  parenrightinferior: 0x208E,
+  parenrightmonospace: 0xFF09,
+  parenrightsmall: 0xFE5A,
+  parenrightsuperior: 0x207E,
+  parenrighttp: 0xF8F6,
+  parenrightvertical: 0xFE36,
+  partialdiff: 0x2202,
+  paseqhebrew: 0x05C0,
+  pashtahebrew: 0x0599,
+  pasquare: 0x33A9,
+  patah: 0x05B7,
+  patah11: 0x05B7,
+  patah1d: 0x05B7,
+  patah2a: 0x05B7,
+  patahhebrew: 0x05B7,
+  patahnarrowhebrew: 0x05B7,
+  patahquarterhebrew: 0x05B7,
+  patahwidehebrew: 0x05B7,
+  pazerhebrew: 0x05A1,
+  pbopomofo: 0x3106,
+  pcircle: 0x24DF,
+  pdotaccent: 0x1E57,
+  pe: 0x05E4,
+  pecyrillic: 0x043F,
+  pedagesh: 0xFB44,
+  pedageshhebrew: 0xFB44,
+  peezisquare: 0x333B,
+  pefinaldageshhebrew: 0xFB43,
+  peharabic: 0x067E,
+  peharmenian: 0x057A,
+  pehebrew: 0x05E4,
+  pehfinalarabic: 0xFB57,
+  pehinitialarabic: 0xFB58,
+  pehiragana: 0x307A,
+  pehmedialarabic: 0xFB59,
+  pekatakana: 0x30DA,
+  pemiddlehookcyrillic: 0x04A7,
+  perafehebrew: 0xFB4E,
+  percent: 0x0025,
+  percentarabic: 0x066A,
+  percentmonospace: 0xFF05,
+  percentsmall: 0xFE6A,
+  period: 0x002E,
+  periodarmenian: 0x0589,
+  periodcentered: 0x00B7,
+  periodhalfwidth: 0xFF61,
+  periodinferior: 0xF6E7,
+  periodmonospace: 0xFF0E,
+  periodsmall: 0xFE52,
+  periodsuperior: 0xF6E8,
+  perispomenigreekcmb: 0x0342,
+  perpendicular: 0x22A5,
+  perthousand: 0x2030,
+  peseta: 0x20A7,
+  pfsquare: 0x338A,
+  phabengali: 0x09AB,
+  phadeva: 0x092B,
+  phagujarati: 0x0AAB,
+  phagurmukhi: 0x0A2B,
+  phi: 0x03C6,
+  phi1: 0x03D5,
+  phieuphacirclekorean: 0x327A,
+  phieuphaparenkorean: 0x321A,
+  phieuphcirclekorean: 0x326C,
+  phieuphkorean: 0x314D,
+  phieuphparenkorean: 0x320C,
+  philatin: 0x0278,
+  phinthuthai: 0x0E3A,
+  phisymbolgreek: 0x03D5,
+  phook: 0x01A5,
+  phophanthai: 0x0E1E,
+  phophungthai: 0x0E1C,
+  phosamphaothai: 0x0E20,
+  pi: 0x03C0,
+  pieupacirclekorean: 0x3273,
+  pieupaparenkorean: 0x3213,
+  pieupcieuckorean: 0x3176,
+  pieupcirclekorean: 0x3265,
+  pieupkiyeokkorean: 0x3172,
+  pieupkorean: 0x3142,
+  pieupparenkorean: 0x3205,
+  pieupsioskiyeokkorean: 0x3174,
+  pieupsioskorean: 0x3144,
+  pieupsiostikeutkorean: 0x3175,
+  pieupthieuthkorean: 0x3177,
+  pieuptikeutkorean: 0x3173,
+  pihiragana: 0x3074,
+  pikatakana: 0x30D4,
+  pisymbolgreek: 0x03D6,
+  piwrarmenian: 0x0583,
+  plus: 0x002B,
+  plusbelowcmb: 0x031F,
+  pluscircle: 0x2295,
+  plusminus: 0x00B1,
+  plusmod: 0x02D6,
+  plusmonospace: 0xFF0B,
+  plussmall: 0xFE62,
+  plussuperior: 0x207A,
+  pmonospace: 0xFF50,
+  pmsquare: 0x33D8,
+  pohiragana: 0x307D,
+  pointingindexdownwhite: 0x261F,
+  pointingindexleftwhite: 0x261C,
+  pointingindexrightwhite: 0x261E,
+  pointingindexupwhite: 0x261D,
+  pokatakana: 0x30DD,
+  poplathai: 0x0E1B,
+  postalmark: 0x3012,
+  postalmarkface: 0x3020,
+  pparen: 0x24AB,
+  precedes: 0x227A,
+  prescription: 0x211E,
+  primemod: 0x02B9,
+  primereversed: 0x2035,
+  product: 0x220F,
+  projective: 0x2305,
+  prolongedkana: 0x30FC,
+  propellor: 0x2318,
+  propersubset: 0x2282,
+  propersuperset: 0x2283,
+  proportion: 0x2237,
+  proportional: 0x221D,
+  psi: 0x03C8,
+  psicyrillic: 0x0471,
+  psilipneumatacyrilliccmb: 0x0486,
+  pssquare: 0x33B0,
+  puhiragana: 0x3077,
+  pukatakana: 0x30D7,
+  pvsquare: 0x33B4,
+  pwsquare: 0x33BA,
+  q: 0x0071,
+  qadeva: 0x0958,
+  qadmahebrew: 0x05A8,
+  qafarabic: 0x0642,
+  qaffinalarabic: 0xFED6,
+  qafinitialarabic: 0xFED7,
+  qafmedialarabic: 0xFED8,
+  qamats: 0x05B8,
+  qamats10: 0x05B8,
+  qamats1a: 0x05B8,
+  qamats1c: 0x05B8,
+  qamats27: 0x05B8,
+  qamats29: 0x05B8,
+  qamats33: 0x05B8,
+  qamatsde: 0x05B8,
+  qamatshebrew: 0x05B8,
+  qamatsnarrowhebrew: 0x05B8,
+  qamatsqatanhebrew: 0x05B8,
+  qamatsqatannarrowhebrew: 0x05B8,
+  qamatsqatanquarterhebrew: 0x05B8,
+  qamatsqatanwidehebrew: 0x05B8,
+  qamatsquarterhebrew: 0x05B8,
+  qamatswidehebrew: 0x05B8,
+  qarneyparahebrew: 0x059F,
+  qbopomofo: 0x3111,
+  qcircle: 0x24E0,
+  qhook: 0x02A0,
+  qmonospace: 0xFF51,
+  qof: 0x05E7,
+  qofdagesh: 0xFB47,
+  qofdageshhebrew: 0xFB47,
+  qofhebrew: 0x05E7,
+  qparen: 0x24AC,
+  quarternote: 0x2669,
+  qubuts: 0x05BB,
+  qubuts18: 0x05BB,
+  qubuts25: 0x05BB,
+  qubuts31: 0x05BB,
+  qubutshebrew: 0x05BB,
+  qubutsnarrowhebrew: 0x05BB,
+  qubutsquarterhebrew: 0x05BB,
+  qubutswidehebrew: 0x05BB,
+  question: 0x003F,
+  questionarabic: 0x061F,
+  questionarmenian: 0x055E,
+  questiondown: 0x00BF,
+  questiondownsmall: 0xF7BF,
+  questiongreek: 0x037E,
+  questionmonospace: 0xFF1F,
+  questionsmall: 0xF73F,
+  quotedbl: 0x0022,
+  quotedblbase: 0x201E,
+  quotedblleft: 0x201C,
+  quotedblmonospace: 0xFF02,
+  quotedblprime: 0x301E,
+  quotedblprimereversed: 0x301D,
+  quotedblright: 0x201D,
+  quoteleft: 0x2018,
+  quoteleftreversed: 0x201B,
+  quotereversed: 0x201B,
+  quoteright: 0x2019,
+  quoterightn: 0x0149,
+  quotesinglbase: 0x201A,
+  quotesingle: 0x0027,
+  quotesinglemonospace: 0xFF07,
+  r: 0x0072,
+  raarmenian: 0x057C,
+  rabengali: 0x09B0,
+  racute: 0x0155,
+  radeva: 0x0930,
+  radical: 0x221A,
+  radicalex: 0xF8E5,
+  radoverssquare: 0x33AE,
+  radoverssquaredsquare: 0x33AF,
+  radsquare: 0x33AD,
+  rafe: 0x05BF,
+  rafehebrew: 0x05BF,
+  ragujarati: 0x0AB0,
+  ragurmukhi: 0x0A30,
+  rahiragana: 0x3089,
+  rakatakana: 0x30E9,
+  rakatakanahalfwidth: 0xFF97,
+  ralowerdiagonalbengali: 0x09F1,
+  ramiddlediagonalbengali: 0x09F0,
+  ramshorn: 0x0264,
+  ratio: 0x2236,
+  rbopomofo: 0x3116,
+  rcaron: 0x0159,
+  rcedilla: 0x0157,
+  rcircle: 0x24E1,
+  rcommaaccent: 0x0157,
+  rdblgrave: 0x0211,
+  rdotaccent: 0x1E59,
+  rdotbelow: 0x1E5B,
+  rdotbelowmacron: 0x1E5D,
+  referencemark: 0x203B,
+  reflexsubset: 0x2286,
+  reflexsuperset: 0x2287,
+  registered: 0x00AE,
+  registersans: 0xF8E8,
+  registerserif: 0xF6DA,
+  reharabic: 0x0631,
+  reharmenian: 0x0580,
+  rehfinalarabic: 0xFEAE,
+  rehiragana: 0x308C,
+  rekatakana: 0x30EC,
+  rekatakanahalfwidth: 0xFF9A,
+  resh: 0x05E8,
+  reshdageshhebrew: 0xFB48,
+  reshhebrew: 0x05E8,
+  reversedtilde: 0x223D,
+  reviahebrew: 0x0597,
+  reviamugrashhebrew: 0x0597,
+  revlogicalnot: 0x2310,
+  rfishhook: 0x027E,
+  rfishhookreversed: 0x027F,
+  rhabengali: 0x09DD,
+  rhadeva: 0x095D,
+  rho: 0x03C1,
+  rhook: 0x027D,
+  rhookturned: 0x027B,
+  rhookturnedsuperior: 0x02B5,
+  rhosymbolgreek: 0x03F1,
+  rhotichookmod: 0x02DE,
+  rieulacirclekorean: 0x3271,
+  rieulaparenkorean: 0x3211,
+  rieulcirclekorean: 0x3263,
+  rieulhieuhkorean: 0x3140,
+  rieulkiyeokkorean: 0x313A,
+  rieulkiyeoksioskorean: 0x3169,
+  rieulkorean: 0x3139,
+  rieulmieumkorean: 0x313B,
+  rieulpansioskorean: 0x316C,
+  rieulparenkorean: 0x3203,
+  rieulphieuphkorean: 0x313F,
+  rieulpieupkorean: 0x313C,
+  rieulpieupsioskorean: 0x316B,
+  rieulsioskorean: 0x313D,
+  rieulthieuthkorean: 0x313E,
+  rieultikeutkorean: 0x316A,
+  rieulyeorinhieuhkorean: 0x316D,
+  rightangle: 0x221F,
+  righttackbelowcmb: 0x0319,
+  righttriangle: 0x22BF,
+  rihiragana: 0x308A,
+  rikatakana: 0x30EA,
+  rikatakanahalfwidth: 0xFF98,
+  ring: 0x02DA,
+  ringbelowcmb: 0x0325,
+  ringcmb: 0x030A,
+  ringhalfleft: 0x02BF,
+  ringhalfleftarmenian: 0x0559,
+  ringhalfleftbelowcmb: 0x031C,
+  ringhalfleftcentered: 0x02D3,
+  ringhalfright: 0x02BE,
+  ringhalfrightbelowcmb: 0x0339,
+  ringhalfrightcentered: 0x02D2,
+  rinvertedbreve: 0x0213,
+  rittorusquare: 0x3351,
+  rlinebelow: 0x1E5F,
+  rlongleg: 0x027C,
+  rlonglegturned: 0x027A,
+  rmonospace: 0xFF52,
+  rohiragana: 0x308D,
+  rokatakana: 0x30ED,
+  rokatakanahalfwidth: 0xFF9B,
+  roruathai: 0x0E23,
+  rparen: 0x24AD,
+  rrabengali: 0x09DC,
+  rradeva: 0x0931,
+  rragurmukhi: 0x0A5C,
+  rreharabic: 0x0691,
+  rrehfinalarabic: 0xFB8D,
+  rrvocalicbengali: 0x09E0,
+  rrvocalicdeva: 0x0960,
+  rrvocalicgujarati: 0x0AE0,
+  rrvocalicvowelsignbengali: 0x09C4,
+  rrvocalicvowelsigndeva: 0x0944,
+  rrvocalicvowelsigngujarati: 0x0AC4,
+  rsuperior: 0xF6F1,
+  rtblock: 0x2590,
+  rturned: 0x0279,
+  rturnedsuperior: 0x02B4,
+  ruhiragana: 0x308B,
+  rukatakana: 0x30EB,
+  rukatakanahalfwidth: 0xFF99,
+  rupeemarkbengali: 0x09F2,
+  rupeesignbengali: 0x09F3,
+  rupiah: 0xF6DD,
+  ruthai: 0x0E24,
+  rvocalicbengali: 0x098B,
+  rvocalicdeva: 0x090B,
+  rvocalicgujarati: 0x0A8B,
+  rvocalicvowelsignbengali: 0x09C3,
+  rvocalicvowelsigndeva: 0x0943,
+  rvocalicvowelsigngujarati: 0x0AC3,
+  s: 0x0073,
+  sabengali: 0x09B8,
+  sacute: 0x015B,
+  sacutedotaccent: 0x1E65,
+  sadarabic: 0x0635,
+  sadeva: 0x0938,
+  sadfinalarabic: 0xFEBA,
+  sadinitialarabic: 0xFEBB,
+  sadmedialarabic: 0xFEBC,
+  sagujarati: 0x0AB8,
+  sagurmukhi: 0x0A38,
+  sahiragana: 0x3055,
+  sakatakana: 0x30B5,
+  sakatakanahalfwidth: 0xFF7B,
+  sallallahoualayhewasallamarabic: 0xFDFA,
+  samekh: 0x05E1,
+  samekhdagesh: 0xFB41,
+  samekhdageshhebrew: 0xFB41,
+  samekhhebrew: 0x05E1,
+  saraaathai: 0x0E32,
+  saraaethai: 0x0E41,
+  saraaimaimalaithai: 0x0E44,
+  saraaimaimuanthai: 0x0E43,
+  saraamthai: 0x0E33,
+  saraathai: 0x0E30,
+  saraethai: 0x0E40,
+  saraiileftthai: 0xF886,
+  saraiithai: 0x0E35,
+  saraileftthai: 0xF885,
+  saraithai: 0x0E34,
+  saraothai: 0x0E42,
+  saraueeleftthai: 0xF888,
+  saraueethai: 0x0E37,
+  saraueleftthai: 0xF887,
+  sarauethai: 0x0E36,
+  sarauthai: 0x0E38,
+  sarauuthai: 0x0E39,
+  sbopomofo: 0x3119,
+  scaron: 0x0161,
+  scarondotaccent: 0x1E67,
+  scedilla: 0x015F,
+  schwa: 0x0259,
+  schwacyrillic: 0x04D9,
+  schwadieresiscyrillic: 0x04DB,
+  schwahook: 0x025A,
+  scircle: 0x24E2,
+  scircumflex: 0x015D,
+  scommaaccent: 0x0219,
+  sdotaccent: 0x1E61,
+  sdotbelow: 0x1E63,
+  sdotbelowdotaccent: 0x1E69,
+  seagullbelowcmb: 0x033C,
+  second: 0x2033,
+  secondtonechinese: 0x02CA,
+  section: 0x00A7,
+  seenarabic: 0x0633,
+  seenfinalarabic: 0xFEB2,
+  seeninitialarabic: 0xFEB3,
+  seenmedialarabic: 0xFEB4,
+  segol: 0x05B6,
+  segol13: 0x05B6,
+  segol1f: 0x05B6,
+  segol2c: 0x05B6,
+  segolhebrew: 0x05B6,
+  segolnarrowhebrew: 0x05B6,
+  segolquarterhebrew: 0x05B6,
+  segoltahebrew: 0x0592,
+  segolwidehebrew: 0x05B6,
+  seharmenian: 0x057D,
+  sehiragana: 0x305B,
+  sekatakana: 0x30BB,
+  sekatakanahalfwidth: 0xFF7E,
+  semicolon: 0x003B,
+  semicolonarabic: 0x061B,
+  semicolonmonospace: 0xFF1B,
+  semicolonsmall: 0xFE54,
+  semivoicedmarkkana: 0x309C,
+  semivoicedmarkkanahalfwidth: 0xFF9F,
+  sentisquare: 0x3322,
+  sentosquare: 0x3323,
+  seven: 0x0037,
+  sevenarabic: 0x0667,
+  sevenbengali: 0x09ED,
+  sevencircle: 0x2466,
+  sevencircleinversesansserif: 0x2790,
+  sevendeva: 0x096D,
+  seveneighths: 0x215E,
+  sevengujarati: 0x0AED,
+  sevengurmukhi: 0x0A6D,
+  sevenhackarabic: 0x0667,
+  sevenhangzhou: 0x3027,
+  sevenideographicparen: 0x3226,
+  seveninferior: 0x2087,
+  sevenmonospace: 0xFF17,
+  sevenoldstyle: 0xF737,
+  sevenparen: 0x247A,
+  sevenperiod: 0x248E,
+  sevenpersian: 0x06F7,
+  sevenroman: 0x2176,
+  sevensuperior: 0x2077,
+  seventeencircle: 0x2470,
+  seventeenparen: 0x2484,
+  seventeenperiod: 0x2498,
+  seventhai: 0x0E57,
+  sfthyphen: 0x00AD,
+  shaarmenian: 0x0577,
+  shabengali: 0x09B6,
+  shacyrillic: 0x0448,
+  shaddaarabic: 0x0651,
+  shaddadammaarabic: 0xFC61,
+  shaddadammatanarabic: 0xFC5E,
+  shaddafathaarabic: 0xFC60,
+  shaddakasraarabic: 0xFC62,
+  shaddakasratanarabic: 0xFC5F,
+  shade: 0x2592,
+  shadedark: 0x2593,
+  shadelight: 0x2591,
+  shademedium: 0x2592,
+  shadeva: 0x0936,
+  shagujarati: 0x0AB6,
+  shagurmukhi: 0x0A36,
+  shalshelethebrew: 0x0593,
+  shbopomofo: 0x3115,
+  shchacyrillic: 0x0449,
+  sheenarabic: 0x0634,
+  sheenfinalarabic: 0xFEB6,
+  sheeninitialarabic: 0xFEB7,
+  sheenmedialarabic: 0xFEB8,
+  sheicoptic: 0x03E3,
+  sheqel: 0x20AA,
+  sheqelhebrew: 0x20AA,
+  sheva: 0x05B0,
+  sheva115: 0x05B0,
+  sheva15: 0x05B0,
+  sheva22: 0x05B0,
+  sheva2e: 0x05B0,
+  shevahebrew: 0x05B0,
+  shevanarrowhebrew: 0x05B0,
+  shevaquarterhebrew: 0x05B0,
+  shevawidehebrew: 0x05B0,
+  shhacyrillic: 0x04BB,
+  shimacoptic: 0x03ED,
+  shin: 0x05E9,
+  shindagesh: 0xFB49,
+  shindageshhebrew: 0xFB49,
+  shindageshshindot: 0xFB2C,
+  shindageshshindothebrew: 0xFB2C,
+  shindageshsindot: 0xFB2D,
+  shindageshsindothebrew: 0xFB2D,
+  shindothebrew: 0x05C1,
+  shinhebrew: 0x05E9,
+  shinshindot: 0xFB2A,
+  shinshindothebrew: 0xFB2A,
+  shinsindot: 0xFB2B,
+  shinsindothebrew: 0xFB2B,
+  shook: 0x0282,
+  sigma: 0x03C3,
+  sigma1: 0x03C2,
+  sigmafinal: 0x03C2,
+  sigmalunatesymbolgreek: 0x03F2,
+  sihiragana: 0x3057,
+  sikatakana: 0x30B7,
+  sikatakanahalfwidth: 0xFF7C,
+  siluqhebrew: 0x05BD,
+  siluqlefthebrew: 0x05BD,
+  similar: 0x223C,
+  sindothebrew: 0x05C2,
+  siosacirclekorean: 0x3274,
+  siosaparenkorean: 0x3214,
+  sioscieuckorean: 0x317E,
+  sioscirclekorean: 0x3266,
+  sioskiyeokkorean: 0x317A,
+  sioskorean: 0x3145,
+  siosnieunkorean: 0x317B,
+  siosparenkorean: 0x3206,
+  siospieupkorean: 0x317D,
+  siostikeutkorean: 0x317C,
+  six: 0x0036,
+  sixarabic: 0x0666,
+  sixbengali: 0x09EC,
+  sixcircle: 0x2465,
+  sixcircleinversesansserif: 0x278F,
+  sixdeva: 0x096C,
+  sixgujarati: 0x0AEC,
+  sixgurmukhi: 0x0A6C,
+  sixhackarabic: 0x0666,
+  sixhangzhou: 0x3026,
+  sixideographicparen: 0x3225,
+  sixinferior: 0x2086,
+  sixmonospace: 0xFF16,
+  sixoldstyle: 0xF736,
+  sixparen: 0x2479,
+  sixperiod: 0x248D,
+  sixpersian: 0x06F6,
+  sixroman: 0x2175,
+  sixsuperior: 0x2076,
+  sixteencircle: 0x246F,
+  sixteencurrencydenominatorbengali: 0x09F9,
+  sixteenparen: 0x2483,
+  sixteenperiod: 0x2497,
+  sixthai: 0x0E56,
+  slash: 0x002F,
+  slashmonospace: 0xFF0F,
+  slong: 0x017F,
+  slongdotaccent: 0x1E9B,
+  smileface: 0x263A,
+  smonospace: 0xFF53,
+  sofpasuqhebrew: 0x05C3,
+  softhyphen: 0x00AD,
+  softsigncyrillic: 0x044C,
+  sohiragana: 0x305D,
+  sokatakana: 0x30BD,
+  sokatakanahalfwidth: 0xFF7F,
+  soliduslongoverlaycmb: 0x0338,
+  solidusshortoverlaycmb: 0x0337,
+  sorusithai: 0x0E29,
+  sosalathai: 0x0E28,
+  sosothai: 0x0E0B,
+  sosuathai: 0x0E2A,
+  space: 0x0020,
+  spacehackarabic: 0x0020,
+  spade: 0x2660,
+  spadesuitblack: 0x2660,
+  spadesuitwhite: 0x2664,
+  sparen: 0x24AE,
+  squarebelowcmb: 0x033B,
+  squarecc: 0x33C4,
+  squarecm: 0x339D,
+  squarediagonalcrosshatchfill: 0x25A9,
+  squarehorizontalfill: 0x25A4,
+  squarekg: 0x338F,
+  squarekm: 0x339E,
+  squarekmcapital: 0x33CE,
+  squareln: 0x33D1,
+  squarelog: 0x33D2,
+  squaremg: 0x338E,
+  squaremil: 0x33D5,
+  squaremm: 0x339C,
+  squaremsquared: 0x33A1,
+  squareorthogonalcrosshatchfill: 0x25A6,
+  squareupperlefttolowerrightfill: 0x25A7,
+  squareupperrighttolowerleftfill: 0x25A8,
+  squareverticalfill: 0x25A5,
+  squarewhitewithsmallblack: 0x25A3,
+  srsquare: 0x33DB,
+  ssabengali: 0x09B7,
+  ssadeva: 0x0937,
+  ssagujarati: 0x0AB7,
+  ssangcieuckorean: 0x3149,
+  ssanghieuhkorean: 0x3185,
+  ssangieungkorean: 0x3180,
+  ssangkiyeokkorean: 0x3132,
+  ssangnieunkorean: 0x3165,
+  ssangpieupkorean: 0x3143,
+  ssangsioskorean: 0x3146,
+  ssangtikeutkorean: 0x3138,
+  ssuperior: 0xF6F2,
+  sterling: 0x00A3,
+  sterlingmonospace: 0xFFE1,
+  strokelongoverlaycmb: 0x0336,
+  strokeshortoverlaycmb: 0x0335,
+  subset: 0x2282,
+  subsetnotequal: 0x228A,
+  subsetorequal: 0x2286,
+  succeeds: 0x227B,
+  suchthat: 0x220B,
+  suhiragana: 0x3059,
+  sukatakana: 0x30B9,
+  sukatakanahalfwidth: 0xFF7D,
+  sukunarabic: 0x0652,
+  summation: 0x2211,
+  sun: 0x263C,
+  superset: 0x2283,
+  supersetnotequal: 0x228B,
+  supersetorequal: 0x2287,
+  svsquare: 0x33DC,
+  syouwaerasquare: 0x337C,
+  t: 0x0074,
+  tabengali: 0x09A4,
+  tackdown: 0x22A4,
+  tackleft: 0x22A3,
+  tadeva: 0x0924,
+  tagujarati: 0x0AA4,
+  tagurmukhi: 0x0A24,
+  taharabic: 0x0637,
+  tahfinalarabic: 0xFEC2,
+  tahinitialarabic: 0xFEC3,
+  tahiragana: 0x305F,
+  tahmedialarabic: 0xFEC4,
+  taisyouerasquare: 0x337D,
+  takatakana: 0x30BF,
+  takatakanahalfwidth: 0xFF80,
+  tatweelarabic: 0x0640,
+  tau: 0x03C4,
+  tav: 0x05EA,
+  tavdages: 0xFB4A,
+  tavdagesh: 0xFB4A,
+  tavdageshhebrew: 0xFB4A,
+  tavhebrew: 0x05EA,
+  tbar: 0x0167,
+  tbopomofo: 0x310A,
+  tcaron: 0x0165,
+  tccurl: 0x02A8,
+  tcedilla: 0x0163,
+  tcheharabic: 0x0686,
+  tchehfinalarabic: 0xFB7B,
+  tchehinitialarabic: 0xFB7C,
+  tchehmedialarabic: 0xFB7D,
+  tcircle: 0x24E3,
+  tcircumflexbelow: 0x1E71,
+  tcommaaccent: 0x0163,
+  tdieresis: 0x1E97,
+  tdotaccent: 0x1E6B,
+  tdotbelow: 0x1E6D,
+  tecyrillic: 0x0442,
+  tedescendercyrillic: 0x04AD,
+  teharabic: 0x062A,
+  tehfinalarabic: 0xFE96,
+  tehhahinitialarabic: 0xFCA2,
+  tehhahisolatedarabic: 0xFC0C,
+  tehinitialarabic: 0xFE97,
+  tehiragana: 0x3066,
+  tehjeeminitialarabic: 0xFCA1,
+  tehjeemisolatedarabic: 0xFC0B,
+  tehmarbutaarabic: 0x0629,
+  tehmarbutafinalarabic: 0xFE94,
+  tehmedialarabic: 0xFE98,
+  tehmeeminitialarabic: 0xFCA4,
+  tehmeemisolatedarabic: 0xFC0E,
+  tehnoonfinalarabic: 0xFC73,
+  tekatakana: 0x30C6,
+  tekatakanahalfwidth: 0xFF83,
+  telephone: 0x2121,
+  telephoneblack: 0x260E,
+  telishagedolahebrew: 0x05A0,
+  telishaqetanahebrew: 0x05A9,
+  tencircle: 0x2469,
+  tenideographicparen: 0x3229,
+  tenparen: 0x247D,
+  tenperiod: 0x2491,
+  tenroman: 0x2179,
+  tesh: 0x02A7,
+  tet: 0x05D8,
+  tetdagesh: 0xFB38,
+  tetdageshhebrew: 0xFB38,
+  tethebrew: 0x05D8,
+  tetsecyrillic: 0x04B5,
+  tevirhebrew: 0x059B,
+  tevirlefthebrew: 0x059B,
+  thabengali: 0x09A5,
+  thadeva: 0x0925,
+  thagujarati: 0x0AA5,
+  thagurmukhi: 0x0A25,
+  thalarabic: 0x0630,
+  thalfinalarabic: 0xFEAC,
+  thanthakhatlowleftthai: 0xF898,
+  thanthakhatlowrightthai: 0xF897,
+  thanthakhatthai: 0x0E4C,
+  thanthakhatupperleftthai: 0xF896,
+  theharabic: 0x062B,
+  thehfinalarabic: 0xFE9A,
+  thehinitialarabic: 0xFE9B,
+  thehmedialarabic: 0xFE9C,
+  thereexists: 0x2203,
+  therefore: 0x2234,
+  theta: 0x03B8,
+  theta1: 0x03D1,
+  thetasymbolgreek: 0x03D1,
+  thieuthacirclekorean: 0x3279,
+  thieuthaparenkorean: 0x3219,
+  thieuthcirclekorean: 0x326B,
+  thieuthkorean: 0x314C,
+  thieuthparenkorean: 0x320B,
+  thirteencircle: 0x246C,
+  thirteenparen: 0x2480,
+  thirteenperiod: 0x2494,
+  thonangmonthothai: 0x0E11,
+  thook: 0x01AD,
+  thophuthaothai: 0x0E12,
+  thorn: 0x00FE,
+  thothahanthai: 0x0E17,
+  thothanthai: 0x0E10,
+  thothongthai: 0x0E18,
+  thothungthai: 0x0E16,
+  thousandcyrillic: 0x0482,
+  thousandsseparatorarabic: 0x066C,
+  thousandsseparatorpersian: 0x066C,
+  three: 0x0033,
+  threearabic: 0x0663,
+  threebengali: 0x09E9,
+  threecircle: 0x2462,
+  threecircleinversesansserif: 0x278C,
+  threedeva: 0x0969,
+  threeeighths: 0x215C,
+  threegujarati: 0x0AE9,
+  threegurmukhi: 0x0A69,
+  threehackarabic: 0x0663,
+  threehangzhou: 0x3023,
+  threeideographicparen: 0x3222,
+  threeinferior: 0x2083,
+  threemonospace: 0xFF13,
+  threenumeratorbengali: 0x09F6,
+  threeoldstyle: 0xF733,
+  threeparen: 0x2476,
+  threeperiod: 0x248A,
+  threepersian: 0x06F3,
+  threequarters: 0x00BE,
+  threequartersemdash: 0xF6DE,
+  threeroman: 0x2172,
+  threesuperior: 0x00B3,
+  threethai: 0x0E53,
+  thzsquare: 0x3394,
+  tihiragana: 0x3061,
+  tikatakana: 0x30C1,
+  tikatakanahalfwidth: 0xFF81,
+  tikeutacirclekorean: 0x3270,
+  tikeutaparenkorean: 0x3210,
+  tikeutcirclekorean: 0x3262,
+  tikeutkorean: 0x3137,
+  tikeutparenkorean: 0x3202,
+  tilde: 0x02DC,
+  tildebelowcmb: 0x0330,
+  tildecmb: 0x0303,
+  tildecomb: 0x0303,
+  tildedoublecmb: 0x0360,
+  tildeoperator: 0x223C,
+  tildeoverlaycmb: 0x0334,
+  tildeverticalcmb: 0x033E,
+  timescircle: 0x2297,
+  tipehahebrew: 0x0596,
+  tipehalefthebrew: 0x0596,
+  tippigurmukhi: 0x0A70,
+  titlocyrilliccmb: 0x0483,
+  tiwnarmenian: 0x057F,
+  tlinebelow: 0x1E6F,
+  tmonospace: 0xFF54,
+  toarmenian: 0x0569,
+  tohiragana: 0x3068,
+  tokatakana: 0x30C8,
+  tokatakanahalfwidth: 0xFF84,
+  tonebarextrahighmod: 0x02E5,
+  tonebarextralowmod: 0x02E9,
+  tonebarhighmod: 0x02E6,
+  tonebarlowmod: 0x02E8,
+  tonebarmidmod: 0x02E7,
+  tonefive: 0x01BD,
+  tonesix: 0x0185,
+  tonetwo: 0x01A8,
+  tonos: 0x0384,
+  tonsquare: 0x3327,
+  topatakthai: 0x0E0F,
+  tortoiseshellbracketleft: 0x3014,
+  tortoiseshellbracketleftsmall: 0xFE5D,
+  tortoiseshellbracketleftvertical: 0xFE39,
+  tortoiseshellbracketright: 0x3015,
+  tortoiseshellbracketrightsmall: 0xFE5E,
+  tortoiseshellbracketrightvertical: 0xFE3A,
+  totaothai: 0x0E15,
+  tpalatalhook: 0x01AB,
+  tparen: 0x24AF,
+  trademark: 0x2122,
+  trademarksans: 0xF8EA,
+  trademarkserif: 0xF6DB,
+  tretroflexhook: 0x0288,
+  triagdn: 0x25BC,
+  triaglf: 0x25C4,
+  triagrt: 0x25BA,
+  triagup: 0x25B2,
+  ts: 0x02A6,
+  tsadi: 0x05E6,
+  tsadidagesh: 0xFB46,
+  tsadidageshhebrew: 0xFB46,
+  tsadihebrew: 0x05E6,
+  tsecyrillic: 0x0446,
+  tsere: 0x05B5,
+  tsere12: 0x05B5,
+  tsere1e: 0x05B5,
+  tsere2b: 0x05B5,
+  tserehebrew: 0x05B5,
+  tserenarrowhebrew: 0x05B5,
+  tserequarterhebrew: 0x05B5,
+  tserewidehebrew: 0x05B5,
+  tshecyrillic: 0x045B,
+  tsuperior: 0xF6F3,
+  ttabengali: 0x099F,
+  ttadeva: 0x091F,
+  ttagujarati: 0x0A9F,
+  ttagurmukhi: 0x0A1F,
+  tteharabic: 0x0679,
+  ttehfinalarabic: 0xFB67,
+  ttehinitialarabic: 0xFB68,
+  ttehmedialarabic: 0xFB69,
+  tthabengali: 0x09A0,
+  tthadeva: 0x0920,
+  tthagujarati: 0x0AA0,
+  tthagurmukhi: 0x0A20,
+  tturned: 0x0287,
+  tuhiragana: 0x3064,
+  tukatakana: 0x30C4,
+  tukatakanahalfwidth: 0xFF82,
+  tusmallhiragana: 0x3063,
+  tusmallkatakana: 0x30C3,
+  tusmallkatakanahalfwidth: 0xFF6F,
+  twelvecircle: 0x246B,
+  twelveparen: 0x247F,
+  twelveperiod: 0x2493,
+  twelveroman: 0x217B,
+  twentycircle: 0x2473,
+  twentyhangzhou: 0x5344,
+  twentyparen: 0x2487,
+  twentyperiod: 0x249B,
+  two: 0x0032,
+  twoarabic: 0x0662,
+  twobengali: 0x09E8,
+  twocircle: 0x2461,
+  twocircleinversesansserif: 0x278B,
+  twodeva: 0x0968,
+  twodotenleader: 0x2025,
+  twodotleader: 0x2025,
+  twodotleadervertical: 0xFE30,
+  twogujarati: 0x0AE8,
+  twogurmukhi: 0x0A68,
+  twohackarabic: 0x0662,
+  twohangzhou: 0x3022,
+  twoideographicparen: 0x3221,
+  twoinferior: 0x2082,
+  twomonospace: 0xFF12,
+  twonumeratorbengali: 0x09F5,
+  twooldstyle: 0xF732,
+  twoparen: 0x2475,
+  twoperiod: 0x2489,
+  twopersian: 0x06F2,
+  tworoman: 0x2171,
+  twostroke: 0x01BB,
+  twosuperior: 0x00B2,
+  twothai: 0x0E52,
+  twothirds: 0x2154,
+  u: 0x0075,
+  uacute: 0x00FA,
+  ubar: 0x0289,
+  ubengali: 0x0989,
+  ubopomofo: 0x3128,
+  ubreve: 0x016D,
+  ucaron: 0x01D4,
+  ucircle: 0x24E4,
+  ucircumflex: 0x00FB,
+  ucircumflexbelow: 0x1E77,
+  ucyrillic: 0x0443,
+  udattadeva: 0x0951,
+  udblacute: 0x0171,
+  udblgrave: 0x0215,
+  udeva: 0x0909,
+  udieresis: 0x00FC,
+  udieresisacute: 0x01D8,
+  udieresisbelow: 0x1E73,
+  udieresiscaron: 0x01DA,
+  udieresiscyrillic: 0x04F1,
+  udieresisgrave: 0x01DC,
+  udieresismacron: 0x01D6,
+  udotbelow: 0x1EE5,
+  ugrave: 0x00F9,
+  ugujarati: 0x0A89,
+  ugurmukhi: 0x0A09,
+  uhiragana: 0x3046,
+  uhookabove: 0x1EE7,
+  uhorn: 0x01B0,
+  uhornacute: 0x1EE9,
+  uhorndotbelow: 0x1EF1,
+  uhorngrave: 0x1EEB,
+  uhornhookabove: 0x1EED,
+  uhorntilde: 0x1EEF,
+  uhungarumlaut: 0x0171,
+  uhungarumlautcyrillic: 0x04F3,
+  uinvertedbreve: 0x0217,
+  ukatakana: 0x30A6,
+  ukatakanahalfwidth: 0xFF73,
+  ukcyrillic: 0x0479,
+  ukorean: 0x315C,
+  umacron: 0x016B,
+  umacroncyrillic: 0x04EF,
+  umacrondieresis: 0x1E7B,
+  umatragurmukhi: 0x0A41,
+  umonospace: 0xFF55,
+  underscore: 0x005F,
+  underscoredbl: 0x2017,
+  underscoremonospace: 0xFF3F,
+  underscorevertical: 0xFE33,
+  underscorewavy: 0xFE4F,
+  union: 0x222A,
+  universal: 0x2200,
+  uogonek: 0x0173,
+  uparen: 0x24B0,
+  upblock: 0x2580,
+  upperdothebrew: 0x05C4,
+  upsilon: 0x03C5,
+  upsilondieresis: 0x03CB,
+  upsilondieresistonos: 0x03B0,
+  upsilonlatin: 0x028A,
+  upsilontonos: 0x03CD,
+  uptackbelowcmb: 0x031D,
+  uptackmod: 0x02D4,
+  uragurmukhi: 0x0A73,
+  uring: 0x016F,
+  ushortcyrillic: 0x045E,
+  usmallhiragana: 0x3045,
+  usmallkatakana: 0x30A5,
+  usmallkatakanahalfwidth: 0xFF69,
+  ustraightcyrillic: 0x04AF,
+  ustraightstrokecyrillic: 0x04B1,
+  utilde: 0x0169,
+  utildeacute: 0x1E79,
+  utildebelow: 0x1E75,
+  uubengali: 0x098A,
+  uudeva: 0x090A,
+  uugujarati: 0x0A8A,
+  uugurmukhi: 0x0A0A,
+  uumatragurmukhi: 0x0A42,
+  uuvowelsignbengali: 0x09C2,
+  uuvowelsigndeva: 0x0942,
+  uuvowelsigngujarati: 0x0AC2,
+  uvowelsignbengali: 0x09C1,
+  uvowelsigndeva: 0x0941,
+  uvowelsigngujarati: 0x0AC1,
+  v: 0x0076,
+  vadeva: 0x0935,
+  vagujarati: 0x0AB5,
+  vagurmukhi: 0x0A35,
+  vakatakana: 0x30F7,
+  vav: 0x05D5,
+  vavdagesh: 0xFB35,
+  vavdagesh65: 0xFB35,
+  vavdageshhebrew: 0xFB35,
+  vavhebrew: 0x05D5,
+  vavholam: 0xFB4B,
+  vavholamhebrew: 0xFB4B,
+  vavvavhebrew: 0x05F0,
+  vavyodhebrew: 0x05F1,
+  vcircle: 0x24E5,
+  vdotbelow: 0x1E7F,
+  vecyrillic: 0x0432,
+  veharabic: 0x06A4,
+  vehfinalarabic: 0xFB6B,
+  vehinitialarabic: 0xFB6C,
+  vehmedialarabic: 0xFB6D,
+  vekatakana: 0x30F9,
+  venus: 0x2640,
+  verticalbar: 0x007C,
+  verticallineabovecmb: 0x030D,
+  verticallinebelowcmb: 0x0329,
+  verticallinelowmod: 0x02CC,
+  verticallinemod: 0x02C8,
+  vewarmenian: 0x057E,
+  vhook: 0x028B,
+  vikatakana: 0x30F8,
+  viramabengali: 0x09CD,
+  viramadeva: 0x094D,
+  viramagujarati: 0x0ACD,
+  visargabengali: 0x0983,
+  visargadeva: 0x0903,
+  visargagujarati: 0x0A83,
+  vmonospace: 0xFF56,
+  voarmenian: 0x0578,
+  voicediterationhiragana: 0x309E,
+  voicediterationkatakana: 0x30FE,
+  voicedmarkkana: 0x309B,
+  voicedmarkkanahalfwidth: 0xFF9E,
+  vokatakana: 0x30FA,
+  vparen: 0x24B1,
+  vtilde: 0x1E7D,
+  vturned: 0x028C,
+  vuhiragana: 0x3094,
+  vukatakana: 0x30F4,
+  w: 0x0077,
+  wacute: 0x1E83,
+  waekorean: 0x3159,
+  wahiragana: 0x308F,
+  wakatakana: 0x30EF,
+  wakatakanahalfwidth: 0xFF9C,
+  wakorean: 0x3158,
+  wasmallhiragana: 0x308E,
+  wasmallkatakana: 0x30EE,
+  wattosquare: 0x3357,
+  wavedash: 0x301C,
+  wavyunderscorevertical: 0xFE34,
+  wawarabic: 0x0648,
+  wawfinalarabic: 0xFEEE,
+  wawhamzaabovearabic: 0x0624,
+  wawhamzaabovefinalarabic: 0xFE86,
+  wbsquare: 0x33DD,
+  wcircle: 0x24E6,
+  wcircumflex: 0x0175,
+  wdieresis: 0x1E85,
+  wdotaccent: 0x1E87,
+  wdotbelow: 0x1E89,
+  wehiragana: 0x3091,
+  weierstrass: 0x2118,
+  wekatakana: 0x30F1,
+  wekorean: 0x315E,
+  weokorean: 0x315D,
+  wgrave: 0x1E81,
+  whitebullet: 0x25E6,
+  whitecircle: 0x25CB,
+  whitecircleinverse: 0x25D9,
+  whitecornerbracketleft: 0x300E,
+  whitecornerbracketleftvertical: 0xFE43,
+  whitecornerbracketright: 0x300F,
+  whitecornerbracketrightvertical: 0xFE44,
+  whitediamond: 0x25C7,
+  whitediamondcontainingblacksmalldiamond: 0x25C8,
+  whitedownpointingsmalltriangle: 0x25BF,
+  whitedownpointingtriangle: 0x25BD,
+  whiteleftpointingsmalltriangle: 0x25C3,
+  whiteleftpointingtriangle: 0x25C1,
+  whitelenticularbracketleft: 0x3016,
+  whitelenticularbracketright: 0x3017,
+  whiterightpointingsmalltriangle: 0x25B9,
+  whiterightpointingtriangle: 0x25B7,
+  whitesmallsquare: 0x25AB,
+  whitesmilingface: 0x263A,
+  whitesquare: 0x25A1,
+  whitestar: 0x2606,
+  whitetelephone: 0x260F,
+  whitetortoiseshellbracketleft: 0x3018,
+  whitetortoiseshellbracketright: 0x3019,
+  whiteuppointingsmalltriangle: 0x25B5,
+  whiteuppointingtriangle: 0x25B3,
+  wihiragana: 0x3090,
+  wikatakana: 0x30F0,
+  wikorean: 0x315F,
+  wmonospace: 0xFF57,
+  wohiragana: 0x3092,
+  wokatakana: 0x30F2,
+  wokatakanahalfwidth: 0xFF66,
+  won: 0x20A9,
+  wonmonospace: 0xFFE6,
+  wowaenthai: 0x0E27,
+  wparen: 0x24B2,
+  wring: 0x1E98,
+  wsuperior: 0x02B7,
+  wturned: 0x028D,
+  wynn: 0x01BF,
+  x: 0x0078,
+  xabovecmb: 0x033D,
+  xbopomofo: 0x3112,
+  xcircle: 0x24E7,
+  xdieresis: 0x1E8D,
+  xdotaccent: 0x1E8B,
+  xeharmenian: 0x056D,
+  xi: 0x03BE,
+  xmonospace: 0xFF58,
+  xparen: 0x24B3,
+  xsuperior: 0x02E3,
+  y: 0x0079,
+  yaadosquare: 0x334E,
+  yabengali: 0x09AF,
+  yacute: 0x00FD,
+  yadeva: 0x092F,
+  yaekorean: 0x3152,
+  yagujarati: 0x0AAF,
+  yagurmukhi: 0x0A2F,
+  yahiragana: 0x3084,
+  yakatakana: 0x30E4,
+  yakatakanahalfwidth: 0xFF94,
+  yakorean: 0x3151,
+  yamakkanthai: 0x0E4E,
+  yasmallhiragana: 0x3083,
+  yasmallkatakana: 0x30E3,
+  yasmallkatakanahalfwidth: 0xFF6C,
+  yatcyrillic: 0x0463,
+  ycircle: 0x24E8,
+  ycircumflex: 0x0177,
+  ydieresis: 0x00FF,
+  ydotaccent: 0x1E8F,
+  ydotbelow: 0x1EF5,
+  yeharabic: 0x064A,
+  yehbarreearabic: 0x06D2,
+  yehbarreefinalarabic: 0xFBAF,
+  yehfinalarabic: 0xFEF2,
+  yehhamzaabovearabic: 0x0626,
+  yehhamzaabovefinalarabic: 0xFE8A,
+  yehhamzaaboveinitialarabic: 0xFE8B,
+  yehhamzaabovemedialarabic: 0xFE8C,
+  yehinitialarabic: 0xFEF3,
+  yehmedialarabic: 0xFEF4,
+  yehmeeminitialarabic: 0xFCDD,
+  yehmeemisolatedarabic: 0xFC58,
+  yehnoonfinalarabic: 0xFC94,
+  yehthreedotsbelowarabic: 0x06D1,
+  yekorean: 0x3156,
+  yen: 0x00A5,
+  yenmonospace: 0xFFE5,
+  yeokorean: 0x3155,
+  yeorinhieuhkorean: 0x3186,
+  yerahbenyomohebrew: 0x05AA,
+  yerahbenyomolefthebrew: 0x05AA,
+  yericyrillic: 0x044B,
+  yerudieresiscyrillic: 0x04F9,
+  yesieungkorean: 0x3181,
+  yesieungpansioskorean: 0x3183,
+  yesieungsioskorean: 0x3182,
+  yetivhebrew: 0x059A,
+  ygrave: 0x1EF3,
+  yhook: 0x01B4,
+  yhookabove: 0x1EF7,
+  yiarmenian: 0x0575,
+  yicyrillic: 0x0457,
+  yikorean: 0x3162,
+  yinyang: 0x262F,
+  yiwnarmenian: 0x0582,
+  ymonospace: 0xFF59,
+  yod: 0x05D9,
+  yoddagesh: 0xFB39,
+  yoddageshhebrew: 0xFB39,
+  yodhebrew: 0x05D9,
+  yodyodhebrew: 0x05F2,
+  yodyodpatahhebrew: 0xFB1F,
+  yohiragana: 0x3088,
+  yoikorean: 0x3189,
+  yokatakana: 0x30E8,
+  yokatakanahalfwidth: 0xFF96,
+  yokorean: 0x315B,
+  yosmallhiragana: 0x3087,
+  yosmallkatakana: 0x30E7,
+  yosmallkatakanahalfwidth: 0xFF6E,
+  yotgreek: 0x03F3,
+  yoyaekorean: 0x3188,
+  yoyakorean: 0x3187,
+  yoyakthai: 0x0E22,
+  yoyingthai: 0x0E0D,
+  yparen: 0x24B4,
+  ypogegrammeni: 0x037A,
+  ypogegrammenigreekcmb: 0x0345,
+  yr: 0x01A6,
+  yring: 0x1E99,
+  ysuperior: 0x02B8,
+  ytilde: 0x1EF9,
+  yturned: 0x028E,
+  yuhiragana: 0x3086,
+  yuikorean: 0x318C,
+  yukatakana: 0x30E6,
+  yukatakanahalfwidth: 0xFF95,
+  yukorean: 0x3160,
+  yusbigcyrillic: 0x046B,
+  yusbigiotifiedcyrillic: 0x046D,
+  yuslittlecyrillic: 0x0467,
+  yuslittleiotifiedcyrillic: 0x0469,
+  yusmallhiragana: 0x3085,
+  yusmallkatakana: 0x30E5,
+  yusmallkatakanahalfwidth: 0xFF6D,
+  yuyekorean: 0x318B,
+  yuyeokorean: 0x318A,
+  yyabengali: 0x09DF,
+  yyadeva: 0x095F,
+  z: 0x007A,
+  zaarmenian: 0x0566,
+  zacute: 0x017A,
+  zadeva: 0x095B,
+  zagurmukhi: 0x0A5B,
+  zaharabic: 0x0638,
+  zahfinalarabic: 0xFEC6,
+  zahinitialarabic: 0xFEC7,
+  zahiragana: 0x3056,
+  zahmedialarabic: 0xFEC8,
+  zainarabic: 0x0632,
+  zainfinalarabic: 0xFEB0,
+  zakatakana: 0x30B6,
+  zaqefgadolhebrew: 0x0595,
+  zaqefqatanhebrew: 0x0594,
+  zarqahebrew: 0x0598,
+  zayin: 0x05D6,
+  zayindagesh: 0xFB36,
+  zayindageshhebrew: 0xFB36,
+  zayinhebrew: 0x05D6,
+  zbopomofo: 0x3117,
+  zcaron: 0x017E,
+  zcircle: 0x24E9,
+  zcircumflex: 0x1E91,
+  zcurl: 0x0291,
+  zdot: 0x017C,
+  zdotaccent: 0x017C,
+  zdotbelow: 0x1E93,
+  zecyrillic: 0x0437,
+  zedescendercyrillic: 0x0499,
+  zedieresiscyrillic: 0x04DF,
+  zehiragana: 0x305C,
+  zekatakana: 0x30BC,
+  zero: 0x0030,
+  zeroarabic: 0x0660,
+  zerobengali: 0x09E6,
+  zerodeva: 0x0966,
+  zerogujarati: 0x0AE6,
+  zerogurmukhi: 0x0A66,
+  zerohackarabic: 0x0660,
+  zeroinferior: 0x2080,
+  zeromonospace: 0xFF10,
+  zerooldstyle: 0xF730,
+  zeropersian: 0x06F0,
+  zerosuperior: 0x2070,
+  zerothai: 0x0E50,
+  zerowidthjoiner: 0xFEFF,
+  zerowidthnonjoiner: 0x200C,
+  zerowidthspace: 0x200B,
+  zeta: 0x03B6,
+  zhbopomofo: 0x3113,
+  zhearmenian: 0x056A,
+  zhebrevecyrillic: 0x04C2,
+  zhecyrillic: 0x0436,
+  zhedescendercyrillic: 0x0497,
+  zhedieresiscyrillic: 0x04DD,
+  zihiragana: 0x3058,
+  zikatakana: 0x30B8,
+  zinorhebrew: 0x05AE,
+  zlinebelow: 0x1E95,
+  zmonospace: 0xFF5A,
+  zohiragana: 0x305E,
+  zokatakana: 0x30BE,
+  zparen: 0x24B5,
+  zretroflexhook: 0x0290,
+  zstroke: 0x01B6,
+  zuhiragana: 0x305A,
+  zukatakana: 0x30BA,
+  '.notdef': 0x0000
+};
+
+
+
+var PDFImage = (function PDFImageClosure() {
+  /**
+   * Decode the image in the main thread if it supported. Resovles the promise
+   * when the image data is ready.
+   */
+  function handleImageData(handler, xref, res, image) {
+    if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
+      // For natively supported jpegs send them to the main thread for decoding.
+      var dict = image.dict;
+      var colorSpace = dict.get('ColorSpace', 'CS');
+      colorSpace = ColorSpace.parse(colorSpace, xref, res);
+      var numComps = colorSpace.numComps;
+      var resolvePromise;
+      handler.send('JpegDecode', [image.getIR(), numComps], function(message) {
+        var data = message.data;
+        var stream = new Stream(data, 0, data.length, image.dict);
+        resolvePromise(stream);
+      });
+      return new Promise(function (resolve) {
+        resolvePromise = resolve;
+      });
+    } else {
+      return Promise.resolve(image);
+    }
+  }
+  /**
+   * Decode and clamp a value. The formula is different from the spec because we
+   * don't decode to float range [0,1], we decode it in the [0,max] range.
+   */
+  function decodeAndClamp(value, addend, coefficient, max) {
+    value = addend + value * coefficient;
+    // Clamp the value to the range
+    return (value < 0 ? 0 : (value > max ? max : value));
+  }
+  function PDFImage(xref, res, image, inline, smask, mask, isMask) {
+    this.image = image;
+    var dict = image.dict;
+    if (dict.has('Filter')) {
+      var filter = dict.get('Filter').name;
+      if (filter === 'JPXDecode') {
+        var jpxImage = new JpxImage();
+        jpxImage.parseImageProperties(image.stream);
+        image.stream.reset();
+        image.bitsPerComponent = jpxImage.bitsPerComponent;
+        image.numComps = jpxImage.componentsCount;
+      } else if (filter === 'JBIG2Decode') {
+        image.bitsPerComponent = 1;
+        image.numComps = 1;
+      }
+    }
+    // TODO cache rendered images?
+
+    this.width = dict.get('Width', 'W');
+    this.height = dict.get('Height', 'H');
+
+    if (this.width < 1 || this.height < 1) {
+      error('Invalid image width: ' + this.width + ' or height: ' +
+            this.height);
+    }
+
+    this.interpolate = dict.get('Interpolate', 'I') || false;
+    this.imageMask = dict.get('ImageMask', 'IM') || false;
+    this.matte = dict.get('Matte') || false;
+
+    var bitsPerComponent = image.bitsPerComponent;
+    if (!bitsPerComponent) {
+      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
+      if (!bitsPerComponent) {
+        if (this.imageMask) {
+          bitsPerComponent = 1;
+        } else {
+          error('Bits per component missing in image: ' + this.imageMask);
+        }
+      }
+    }
+    this.bpc = bitsPerComponent;
+
+    if (!this.imageMask) {
+      var colorSpace = dict.get('ColorSpace', 'CS');
+      if (!colorSpace) {
+        info('JPX images (which do not require color spaces)');
+        switch (image.numComps) {
+          case 1:
+            colorSpace = Name.get('DeviceGray');
+            break;
+          case 3:
+            colorSpace = Name.get('DeviceRGB');
+            break;
+          case 4:
+            colorSpace = Name.get('DeviceCMYK');
+            break;
+          default:
+            error('JPX images with ' + this.numComps +
+                  ' color components not supported.');
+        }
+      }
+      this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
+      this.numComps = this.colorSpace.numComps;
+    }
+
+    this.decode = dict.get('Decode', 'D');
+    this.needsDecode = false;
+    if (this.decode &&
+        ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) ||
+         (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) {
+      this.needsDecode = true;
+      // Do some preprocessing to avoid more math.
+      var max = (1 << bitsPerComponent) - 1;
+      this.decodeCoefficients = [];
+      this.decodeAddends = [];
+      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
+        var dmin = this.decode[i];
+        var dmax = this.decode[i + 1];
+        this.decodeCoefficients[j] = dmax - dmin;
+        this.decodeAddends[j] = max * dmin;
+      }
+    }
+
+    if (smask) {
+      this.smask = new PDFImage(xref, res, smask, false);
+    } else if (mask) {
+      if (isStream(mask)) {
+        this.mask = new PDFImage(xref, res, mask, false, null, null, true);
+      } else {
+        // Color key mask (just an array).
+        this.mask = mask;
+      }
+    }
+  }
+  /**
+   * Handles processing of image data and returns the Promise that is resolved
+   * with a PDFImage when the image is ready to be used.
+   */
+  PDFImage.buildImage = function PDFImage_buildImage(handler, xref,
+                                                     res, image, inline) {
+    var imagePromise = handleImageData(handler, xref, res, image);
+    var smaskPromise;
+    var maskPromise;
+
+    var smask = image.dict.get('SMask');
+    var mask = image.dict.get('Mask');
+
+    if (smask) {
+      smaskPromise = handleImageData(handler, xref, res, smask);
+      maskPromise = Promise.resolve(null);
+    } else {
+      smaskPromise = Promise.resolve(null);
+      if (mask) {
+        if (isStream(mask)) {
+          maskPromise = handleImageData(handler, xref, res, mask);
+        } else if (isArray(mask)) {
+          maskPromise = Promise.resolve(mask);
+        } else {
+          warn('Unsupported mask format.');
+          maskPromise = Promise.resolve(null);
+        }
+      } else {
+        maskPromise = Promise.resolve(null);
+      }
+    }
+    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(
+      function(results) {
+        var imageData = results[0];
+        var smaskData = results[1];
+        var maskData = results[2];
+        return new PDFImage(xref, res, imageData, inline, smaskData, maskData);
+      });
+  };
+
+  /**
+   * Resize an image using the nearest neighbor algorithm. Currently only
+   * supports one and three component images.
+   * @param {TypedArray} pixels The original image with one component.
+   * @param {Number} bpc Number of bits per component.
+   * @param {Number} components Number of color components, 1 or 3 is supported.
+   * @param {Number} w1 Original width.
+   * @param {Number} h1 Original height.
+   * @param {Number} w2 New width.
+   * @param {Number} h2 New height.
+   * @param {TypedArray} dest (Optional) The destination buffer.
+   * @param {Number} alpha01 (Optional) Size reserved for the alpha channel.
+   * @return {TypedArray} Resized image data.
+   */
+  PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
+                                             w1, h1, w2, h2, dest, alpha01) {
+
+    if (components !== 1 && components !== 3) {
+      error('Unsupported component count for resizing.');
+    }
+
+    var length = w2 * h2 * components;
+    var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) :
+        (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));
+    var xRatio = w1 / w2;
+    var yRatio = h1 / h2;
+    var i, j, py, newIndex = 0, oldIndex;
+    var xScaled = new Uint16Array(w2);
+    var w1Scanline = w1 * components;
+    if (alpha01 !== 1) {
+      alpha01 = 0;
+    }
+
+    for (j = 0; j < w2; j++) {
+      xScaled[j] = Math.floor(j * xRatio) * components;
+    }
+
+    if (components === 1) {
+      for (i = 0; i < h2; i++) {
+        py = Math.floor(i * yRatio) * w1Scanline;
+        for (j = 0; j < w2; j++) {
+          oldIndex = py + xScaled[j];
+          temp[newIndex++] = pixels[oldIndex];
+        }
+      }
+    } else if (components === 3) {
+      for (i = 0; i < h2; i++) {
+        py = Math.floor(i * yRatio) * w1Scanline;
+        for (j = 0; j < w2; j++) {
+          oldIndex = py + xScaled[j];
+          temp[newIndex++] = pixels[oldIndex++];
+          temp[newIndex++] = pixels[oldIndex++];
+          temp[newIndex++] = pixels[oldIndex++];
+          newIndex += alpha01;
+        }
+      }
+    }
+    return temp;
+  };
+
+  PDFImage.createMask =
+      function PDFImage_createMask(imgArray, width, height, canTransfer,
+                                   inverseDecode) {
+    // If imgArray came from a DecodeStream, we're safe to transfer it.
+    // Otherwise, copy it.
+    var actualLength = imgArray.byteLength;
+    var data;
+    if (canTransfer) {
+      data = imgArray;
+    } else {
+      data = new Uint8Array(actualLength);
+      data.set(imgArray);
+    }
+    // Invert if necessary. It's safe to modify the array -- whether it's the
+    // original or a copy, we're about to transfer it anyway, so nothing else
+    // in this thread can be relying on its contents.
+    if (inverseDecode) {
+      for (var i = 0; i < actualLength; i++) {
+        data[i] = ~data[i];
+      }
+    }
+
+    return {data: data, width: width, height: height};
+  };
+
+  PDFImage.prototype = {
+    get drawWidth() {
+      return Math.max(this.width,
+                      this.smask && this.smask.width || 0,
+                      this.mask && this.mask.width || 0);
+    },
+    get drawHeight() {
+      return Math.max(this.height,
+                      this.smask && this.smask.height || 0,
+                      this.mask && this.mask.height || 0);
+    },
+    decodeBuffer: function PDFImage_decodeBuffer(buffer) {
+      var bpc = this.bpc;
+      var numComps = this.numComps;
+
+      var decodeAddends = this.decodeAddends;
+      var decodeCoefficients = this.decodeCoefficients;
+      var max = (1 << bpc) - 1;
+      var i, ii;
+
+      if (bpc === 1) {
+        // If the buffer needed decode that means it just needs to be inverted.
+        for (i = 0, ii = buffer.length; i < ii; i++) {
+          buffer[i] = +!(buffer[i]);
+        }
+        return;
+      }
+      var index = 0;
+      for (i = 0, ii = this.width * this.height; i < ii; i++) {
+        for (var j = 0; j < numComps; j++) {
+          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j],
+                                         decodeCoefficients[j], max);
+          index++;
+        }
+      }
+    },
+    getComponents: function PDFImage_getComponents(buffer) {
+      var bpc = this.bpc;
+
+      // This image doesn't require any extra work.
+      if (bpc === 8) {
+        return buffer;
+      }
+
+      var width = this.width;
+      var height = this.height;
+      var numComps = this.numComps;
+
+      var length = width * height * numComps;
+      var bufferPos = 0;
+      var output = (bpc <= 8 ? new Uint8Array(length) :
+        (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));
+      var rowComps = width * numComps;
+
+      var max = (1 << bpc) - 1;
+      var i = 0, ii, buf;
+
+      if (bpc === 1) {
+        // Optimization for reading 1 bpc images.
+        var mask, loop1End, loop2End;
+        for (var j = 0; j < height; j++) {
+          loop1End = i + (rowComps & ~7);
+          loop2End = i + rowComps;
+
+          // unroll loop for all full bytes
+          while (i < loop1End) {
+            buf = buffer[bufferPos++];
+            output[i] = (buf >> 7) & 1;
+            output[i + 1] = (buf >> 6) & 1;
+            output[i + 2] = (buf >> 5) & 1;
+            output[i + 3] = (buf >> 4) & 1;
+            output[i + 4] = (buf >> 3) & 1;
+            output[i + 5] = (buf >> 2) & 1;
+            output[i + 6] = (buf >> 1) & 1;
+            output[i + 7] = buf & 1;
+            i += 8;
+          }
+
+          // handle remaing bits
+          if (i < loop2End) {
+            buf = buffer[bufferPos++];
+            mask = 128;
+            while (i < loop2End) {
+              output[i++] = +!!(buf & mask);
+              mask >>= 1;
+            }
+          }
+        }
+      } else {
+        // The general case that handles all other bpc values.
+        var bits = 0;
+        buf = 0;
+        for (i = 0, ii = length; i < ii; ++i) {
+          if (i % rowComps === 0) {
+            buf = 0;
+            bits = 0;
+          }
+
+          while (bits < bpc) {
+            buf = (buf << 8) | buffer[bufferPos++];
+            bits += 8;
+          }
+
+          var remainingBits = bits - bpc;
+          var value = buf >> remainingBits;
+          output[i] = (value < 0 ? 0 : (value > max ? max : value));
+          buf = buf & ((1 << remainingBits) - 1);
+          bits = remainingBits;
+        }
+      }
+      return output;
+    },
+    fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height,
+                                               actualHeight, image) {
+      var smask = this.smask;
+      var mask = this.mask;
+      var alphaBuf, sw, sh, i, ii, j;
+
+      if (smask) {
+        sw = smask.width;
+        sh = smask.height;
+        alphaBuf = new Uint8Array(sw * sh);
+        smask.fillGrayBuffer(alphaBuf);
+        if (sw != width || sh != height) {
+          alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width,
+                                     height);
+        }
+      } else if (mask) {
+        if (mask instanceof PDFImage) {
+          sw = mask.width;
+          sh = mask.height;
+          alphaBuf = new Uint8Array(sw * sh);
+          mask.numComps = 1;
+          mask.fillGrayBuffer(alphaBuf);
+
+          // Need to invert values in rgbaBuf
+          for (i = 0, ii = sw * sh; i < ii; ++i) {
+            alphaBuf[i] = 255 - alphaBuf[i];
+          }
+
+          if (sw != width || sh != height) {
+            alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width,
+                                       height);
+          }
+        } else if (isArray(mask)) {
+          // Color key mask: if any of the compontents are outside the range
+          // then they should be painted.
+          alphaBuf = new Uint8Array(width * height);
+          var numComps = this.numComps;
+          for (i = 0, ii = width * height; i < ii; ++i) {
+            var opacity = 0;
+            var imageOffset = i * numComps;
+            for (j = 0; j < numComps; ++j) {
+              var color = image[imageOffset + j];
+              var maskOffset = j * 2;
+              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
+                opacity = 255;
+                break;
+              }
+            }
+            alphaBuf[i] = opacity;
+          }
+        } else {
+          error('Unknown mask format.');
+        }
+      }
+
+      if (alphaBuf) {
+        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+          rgbaBuf[j] = alphaBuf[i];
+        }
+      } else {
+        // No mask.
+        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+          rgbaBuf[j] = 255;
+        }
+      }
+    },
+    undoPreblend: function PDFImage_undoPreblend(buffer, width, height) {
+      var matte = this.smask && this.smask.matte;
+      if (!matte) {
+        return;
+      }
+
+      function clamp(value) {
+        return (value < 0 ? 0 : (value > 255 ? 255 : value)) | 0;
+      }
+
+      var matteRgb = this.colorSpace.getRgb(matte, 0);
+      var length = width * height * 4;
+      for (var i = 0; i < length; i += 4) {
+        var alpha = buffer[i + 3];
+        if (alpha === 0) {
+          // according formula we have to get Infinity in all components
+          // making it as white (tipical paper color) should be okay
+          buffer[i] = 255;
+          buffer[i + 1] = 255;
+          buffer[i + 2] = 255;
+          continue;
+        }
+        var k = 255 / alpha;
+        buffer[i] = clamp((buffer[i] - matteRgb[0]) * k + matteRgb[0]);
+        buffer[i + 1] = clamp((buffer[i + 1] - matteRgb[1]) * k + matteRgb[1]);
+        buffer[i + 2] = clamp((buffer[i + 2] - matteRgb[2]) * k + matteRgb[2]);
+      }
+    },
+    createImageData: function PDFImage_createImageData(forceRGBA) {
+      var drawWidth = this.drawWidth;
+      var drawHeight = this.drawHeight;
+      var imgData = { // other fields are filled in below
+        width: drawWidth,
+        height: drawHeight
+      };
+
+      var numComps = this.numComps;
+      var originalWidth = this.width;
+      var originalHeight = this.height;
+      var bpc = this.bpc;
+
+      // Rows start at byte boundary.
+      var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
+      var imgArray = this.getImageBytes(originalHeight * rowBytes);
+
+      if (!forceRGBA) {
+        // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image
+        // without any complications, we pass a same-sized copy to the main
+        // thread rather than expanding by 32x to RGBA form. This saves *lots*
+        // of memory for many scanned documents. It's also much faster.
+        //
+        // Similarly, if it is a 24-bit-per pixel RGB image without any
+        // complications, we avoid expanding by 1.333x to RGBA form.
+        var kind;
+        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {
+          kind = ImageKind.GRAYSCALE_1BPP;
+        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8) {
+          kind = ImageKind.RGB_24BPP;
+        }
+        if (kind && !this.smask && !this.mask && !this.needsDecode &&
+            drawWidth === originalWidth && drawHeight === originalHeight) {
+          imgData.kind = kind;
+
+          // If imgArray came from a DecodeStream, we're safe to transfer it
+          // (and thus neuter it) because it will constitute the entire
+          // DecodeStream's data.  But if it came from a Stream, we need to
+          // copy it because it'll only be a portion of the Stream's data, and
+          // the rest will be read later on.
+          if (this.image instanceof DecodeStream) {
+            imgData.data = imgArray;
+          } else {
+            var newArray = new Uint8Array(imgArray.length);
+            newArray.set(imgArray);
+            imgData.data = newArray;
+          }
+          return imgData;
+        }
+      }
+
+      // imgArray can be incomplete (e.g. after CCITT fax encoding).
+      var actualHeight = 0 | (imgArray.length / rowBytes *
+                         drawHeight / originalHeight);
+
+      var comps = this.getComponents(imgArray);
+
+      // If opacity data is present, use RGBA_32BPP form. Otherwise, use the
+      // more compact RGB_24BPP form if allowable.
+      var alpha01, maybeUndoPreblend;
+      if (!forceRGBA && !this.smask && !this.mask) {
+        imgData.kind = ImageKind.RGB_24BPP;
+        imgData.data = new Uint8Array(drawWidth * drawHeight * 3);
+        alpha01 = 0;
+        maybeUndoPreblend = false;
+      } else {
+        imgData.kind = ImageKind.RGBA_32BPP;
+        imgData.data = new Uint8Array(drawWidth * drawHeight * 4);
+        alpha01 = 1;
+        maybeUndoPreblend = true;
+
+        // Color key masking (opacity) must be performed before decoding.
+        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight,
+                         comps);
+      }
+
+      if (this.needsDecode) {
+        this.decodeBuffer(comps);
+      }
+      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight,
+                              drawWidth, drawHeight, actualHeight, bpc, comps,
+                              alpha01);
+      if (maybeUndoPreblend) {
+        this.undoPreblend(imgData.data, drawWidth, actualHeight);
+      }
+
+      return imgData;
+    },
+    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
+      var numComps = this.numComps;
+      if (numComps != 1) {
+        error('Reading gray scale from a color image: ' + numComps);
+      }
+
+      var width = this.width;
+      var height = this.height;
+      var bpc = this.bpc;
+
+      // rows start at byte boundary
+      var rowBytes = (width * numComps * bpc + 7) >> 3;
+      var imgArray = this.getImageBytes(height * rowBytes);
+
+      var comps = this.getComponents(imgArray);
+      var i, length;
+
+      if (bpc === 1) {
+        // inline decoding (= inversion) for 1 bpc images
+        length = width * height;
+        if (this.needsDecode) {
+          // invert and scale to {0, 255}
+          for (i = 0; i < length; ++i) {
+            buffer[i] = (comps[i] - 1) & 255;
+          }
+        } else {
+          // scale to {0, 255}
+          for (i = 0; i < length; ++i) {
+            buffer[i] = (-comps[i]) & 255;
+          }
+        }
+        return;
+      }
+
+      if (this.needsDecode) {
+        this.decodeBuffer(comps);
+      }
+      length = width * height;
+      // we aren't using a colorspace so we need to scale the value
+      var scale = 255 / ((1 << bpc) - 1);
+      for (i = 0; i < length; ++i) {
+        buffer[i] = (scale * comps[i]) | 0;
+      }
+    },
+    getImageBytes: function PDFImage_getImageBytes(length) {
+      this.image.reset();
+      return this.image.getBytes(length);
+    }
+  };
+  return PDFImage;
+})();
+
+
+// The Metrics object contains glyph widths (in glyph space units).
+// As per PDF spec, for most fonts (Type 3 being an exception) a glyph
+// space unit corresponds to 1/1000th of text space unit.
+var Metrics = {
+  'Courier': 600,
+  'Courier-Bold': 600,
+  'Courier-BoldOblique': 600,
+  'Courier-Oblique': 600,
+  'Helvetica' : {
+    'space': 278,
+    'exclam': 278,
+    'quotedbl': 355,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 667,
+    'quoteright': 222,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 556,
+    'at': 1015,
+    'A': 667,
+    'B': 667,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 500,
+    'K': 667,
+    'L': 556,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 278,
+    'backslash': 278,
+    'bracketright': 278,
+    'asciicircum': 469,
+    'underscore': 556,
+    'quoteleft': 222,
+    'a': 556,
+    'b': 556,
+    'c': 500,
+    'd': 556,
+    'e': 556,
+    'f': 278,
+    'g': 556,
+    'h': 556,
+    'i': 222,
+    'j': 222,
+    'k': 500,
+    'l': 222,
+    'm': 833,
+    'n': 556,
+    'o': 556,
+    'p': 556,
+    'q': 556,
+    'r': 333,
+    's': 500,
+    't': 278,
+    'u': 556,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 500,
+    'braceleft': 334,
+    'bar': 260,
+    'braceright': 334,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 191,
+    'quotedblleft': 333,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 500,
+    'fl': 500,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 537,
+    'bullet': 350,
+    'quotesinglbase': 222,
+    'quotedblbase': 333,
+    'quotedblright': 333,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 556,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 222,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 556,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 667,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 500,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 500,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 222,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 500,
+    'scedilla': 500,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 556,
+    'acircumflex': 556,
+    'Amacron': 667,
+    'rcaron': 333,
+    'ccedilla': 500,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 643,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 667,
+    'Abreve': 667,
+    'multiply': 584,
+    'uacute': 556,
+    'Tcaron': 611,
+    'partialdiff': 476,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 500,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 260,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 333,
+    'omacron': 556,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 222,
+    'tcaron': 317,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 667,
+    'Adieresis': 667,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 222,
+    'Oacute': 778,
+    'oacute': 556,
+    'amacron': 556,
+    'sacute': 500,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 556,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 556,
+    'igrave': 278,
+    'ohungarumlaut': 556,
+    'Eogonek': 667,
+    'dcroat': 556,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 299,
+    'Kcommaaccent': 667,
+    'Lacute': 556,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 556,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 556,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 556,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 556,
+    'Ccaron': 722,
+    'ugrave': 556,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 333,
+    'Ntilde': 722,
+    'otilde': 556,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 556,
+    'Atilde': 667,
+    'Aogonek': 667,
+    'Aring': 667,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 500,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 556,
+    'tcommaaccent': 278,
+    'logicalnot': 584,
+    'odieresis': 556,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 556,
+    'eth': 556,
+    'zcaron': 500,
+    'ncommaaccent': 556,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Helvetica-Bold': {
+    'space': 278,
+    'exclam': 333,
+    'quotedbl': 474,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 722,
+    'quoteright': 278,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 611,
+    'at': 975,
+    'A': 722,
+    'B': 722,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 556,
+    'K': 722,
+    'L': 611,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 584,
+    'underscore': 556,
+    'quoteleft': 278,
+    'a': 556,
+    'b': 611,
+    'c': 556,
+    'd': 611,
+    'e': 556,
+    'f': 333,
+    'g': 611,
+    'h': 611,
+    'i': 278,
+    'j': 278,
+    'k': 556,
+    'l': 278,
+    'm': 889,
+    'n': 611,
+    'o': 611,
+    'p': 611,
+    'q': 611,
+    'r': 389,
+    's': 556,
+    't': 333,
+    'u': 611,
+    'v': 556,
+    'w': 778,
+    'x': 556,
+    'y': 556,
+    'z': 500,
+    'braceleft': 389,
+    'bar': 280,
+    'braceright': 389,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 238,
+    'quotedblleft': 500,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 611,
+    'fl': 611,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 556,
+    'bullet': 350,
+    'quotesinglbase': 278,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 611,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 611,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 722,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 556,
+    'scommaaccent': 556,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 611,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 556,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 556,
+    'scedilla': 556,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 611,
+    'acircumflex': 556,
+    'Amacron': 722,
+    'rcaron': 389,
+    'ccedilla': 556,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 743,
+    'Umacron': 722,
+    'uring': 611,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 584,
+    'uacute': 611,
+    'Tcaron': 611,
+    'partialdiff': 494,
+    'ydieresis': 556,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 556,
+    'nacute': 611,
+    'umacron': 611,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 280,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 389,
+    'omacron': 611,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 278,
+    'tcaron': 389,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 278,
+    'Oacute': 778,
+    'oacute': 611,
+    'amacron': 556,
+    'sacute': 556,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 611,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 611,
+    'igrave': 278,
+    'ohungarumlaut': 611,
+    'Eogonek': 667,
+    'dcroat': 611,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 400,
+    'Kcommaaccent': 722,
+    'Lacute': 611,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 611,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 611,
+    'ntilde': 611,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 611,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 611,
+    'Ccaron': 722,
+    'ugrave': 611,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 722,
+    'otilde': 611,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 611,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 556,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 611,
+    'tcommaaccent': 333,
+    'logicalnot': 584,
+    'odieresis': 611,
+    'udieresis': 611,
+    'notequal': 549,
+    'gcommaaccent': 611,
+    'eth': 611,
+    'zcaron': 500,
+    'ncommaaccent': 611,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Helvetica-BoldOblique': {
+    'space': 278,
+    'exclam': 333,
+    'quotedbl': 474,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 722,
+    'quoteright': 278,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 611,
+    'at': 975,
+    'A': 722,
+    'B': 722,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 556,
+    'K': 722,
+    'L': 611,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 584,
+    'underscore': 556,
+    'quoteleft': 278,
+    'a': 556,
+    'b': 611,
+    'c': 556,
+    'd': 611,
+    'e': 556,
+    'f': 333,
+    'g': 611,
+    'h': 611,
+    'i': 278,
+    'j': 278,
+    'k': 556,
+    'l': 278,
+    'm': 889,
+    'n': 611,
+    'o': 611,
+    'p': 611,
+    'q': 611,
+    'r': 389,
+    's': 556,
+    't': 333,
+    'u': 611,
+    'v': 556,
+    'w': 778,
+    'x': 556,
+    'y': 556,
+    'z': 500,
+    'braceleft': 389,
+    'bar': 280,
+    'braceright': 389,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 238,
+    'quotedblleft': 500,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 611,
+    'fl': 611,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 556,
+    'bullet': 350,
+    'quotesinglbase': 278,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 611,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 611,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 722,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 556,
+    'scommaaccent': 556,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 611,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 556,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 556,
+    'scedilla': 556,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 611,
+    'acircumflex': 556,
+    'Amacron': 722,
+    'rcaron': 389,
+    'ccedilla': 556,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 743,
+    'Umacron': 722,
+    'uring': 611,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 584,
+    'uacute': 611,
+    'Tcaron': 611,
+    'partialdiff': 494,
+    'ydieresis': 556,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 556,
+    'nacute': 611,
+    'umacron': 611,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 280,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 389,
+    'omacron': 611,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 278,
+    'tcaron': 389,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 278,
+    'Oacute': 778,
+    'oacute': 611,
+    'amacron': 556,
+    'sacute': 556,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 611,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 611,
+    'igrave': 278,
+    'ohungarumlaut': 611,
+    'Eogonek': 667,
+    'dcroat': 611,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 400,
+    'Kcommaaccent': 722,
+    'Lacute': 611,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 611,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 611,
+    'ntilde': 611,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 611,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 611,
+    'Ccaron': 722,
+    'ugrave': 611,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 722,
+    'otilde': 611,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 611,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 556,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 611,
+    'tcommaaccent': 333,
+    'logicalnot': 584,
+    'odieresis': 611,
+    'udieresis': 611,
+    'notequal': 549,
+    'gcommaaccent': 611,
+    'eth': 611,
+    'zcaron': 500,
+    'ncommaaccent': 611,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Helvetica-Oblique' : {
+    'space': 278,
+    'exclam': 278,
+    'quotedbl': 355,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 667,
+    'quoteright': 222,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 556,
+    'at': 1015,
+    'A': 667,
+    'B': 667,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 500,
+    'K': 667,
+    'L': 556,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 278,
+    'backslash': 278,
+    'bracketright': 278,
+    'asciicircum': 469,
+    'underscore': 556,
+    'quoteleft': 222,
+    'a': 556,
+    'b': 556,
+    'c': 500,
+    'd': 556,
+    'e': 556,
+    'f': 278,
+    'g': 556,
+    'h': 556,
+    'i': 222,
+    'j': 222,
+    'k': 500,
+    'l': 222,
+    'm': 833,
+    'n': 556,
+    'o': 556,
+    'p': 556,
+    'q': 556,
+    'r': 333,
+    's': 500,
+    't': 278,
+    'u': 556,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 500,
+    'braceleft': 334,
+    'bar': 260,
+    'braceright': 334,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 191,
+    'quotedblleft': 333,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 500,
+    'fl': 500,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 537,
+    'bullet': 350,
+    'quotesinglbase': 222,
+    'quotedblbase': 333,
+    'quotedblright': 333,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 556,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 222,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 556,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 667,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 500,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 500,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 222,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 500,
+    'scedilla': 500,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 556,
+    'acircumflex': 556,
+    'Amacron': 667,
+    'rcaron': 333,
+    'ccedilla': 500,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 643,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 667,
+    'Abreve': 667,
+    'multiply': 584,
+    'uacute': 556,
+    'Tcaron': 611,
+    'partialdiff': 476,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 500,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 260,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 333,
+    'omacron': 556,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 222,
+    'tcaron': 317,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 667,
+    'Adieresis': 667,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 222,
+    'Oacute': 778,
+    'oacute': 556,
+    'amacron': 556,
+    'sacute': 500,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 556,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 556,
+    'igrave': 278,
+    'ohungarumlaut': 556,
+    'Eogonek': 667,
+    'dcroat': 556,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 299,
+    'Kcommaaccent': 667,
+    'Lacute': 556,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 556,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 556,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 556,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 556,
+    'Ccaron': 722,
+    'ugrave': 556,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 333,
+    'Ntilde': 722,
+    'otilde': 556,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 556,
+    'Atilde': 667,
+    'Aogonek': 667,
+    'Aring': 667,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 500,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 556,
+    'tcommaaccent': 278,
+    'logicalnot': 584,
+    'odieresis': 556,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 556,
+    'eth': 556,
+    'zcaron': 500,
+    'ncommaaccent': 556,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Symbol': {
+    'space': 250,
+    'exclam': 333,
+    'universal': 713,
+    'numbersign': 500,
+    'existential': 549,
+    'percent': 833,
+    'ampersand': 778,
+    'suchthat': 439,
+    'parenleft': 333,
+    'parenright': 333,
+    'asteriskmath': 500,
+    'plus': 549,
+    'comma': 250,
+    'minus': 549,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 549,
+    'equal': 549,
+    'greater': 549,
+    'question': 444,
+    'congruent': 549,
+    'Alpha': 722,
+    'Beta': 667,
+    'Chi': 722,
+    'Delta': 612,
+    'Epsilon': 611,
+    'Phi': 763,
+    'Gamma': 603,
+    'Eta': 722,
+    'Iota': 333,
+    'theta1': 631,
+    'Kappa': 722,
+    'Lambda': 686,
+    'Mu': 889,
+    'Nu': 722,
+    'Omicron': 722,
+    'Pi': 768,
+    'Theta': 741,
+    'Rho': 556,
+    'Sigma': 592,
+    'Tau': 611,
+    'Upsilon': 690,
+    'sigma1': 439,
+    'Omega': 768,
+    'Xi': 645,
+    'Psi': 795,
+    'Zeta': 611,
+    'bracketleft': 333,
+    'therefore': 863,
+    'bracketright': 333,
+    'perpendicular': 658,
+    'underscore': 500,
+    'radicalex': 500,
+    'alpha': 631,
+    'beta': 549,
+    'chi': 549,
+    'delta': 494,
+    'epsilon': 439,
+    'phi': 521,
+    'gamma': 411,
+    'eta': 603,
+    'iota': 329,
+    'phi1': 603,
+    'kappa': 549,
+    'lambda': 549,
+    'mu': 576,
+    'nu': 521,
+    'omicron': 549,
+    'pi': 549,
+    'theta': 521,
+    'rho': 549,
+    'sigma': 603,
+    'tau': 439,
+    'upsilon': 576,
+    'omega1': 713,
+    'omega': 686,
+    'xi': 493,
+    'psi': 686,
+    'zeta': 494,
+    'braceleft': 480,
+    'bar': 200,
+    'braceright': 480,
+    'similar': 549,
+    'Euro': 750,
+    'Upsilon1': 620,
+    'minute': 247,
+    'lessequal': 549,
+    'fraction': 167,
+    'infinity': 713,
+    'florin': 500,
+    'club': 753,
+    'diamond': 753,
+    'heart': 753,
+    'spade': 753,
+    'arrowboth': 1042,
+    'arrowleft': 987,
+    'arrowup': 603,
+    'arrowright': 987,
+    'arrowdown': 603,
+    'degree': 400,
+    'plusminus': 549,
+    'second': 411,
+    'greaterequal': 549,
+    'multiply': 549,
+    'proportional': 713,
+    'partialdiff': 494,
+    'bullet': 460,
+    'divide': 549,
+    'notequal': 549,
+    'equivalence': 549,
+    'approxequal': 549,
+    'ellipsis': 1000,
+    'arrowvertex': 603,
+    'arrowhorizex': 1000,
+    'carriagereturn': 658,
+    'aleph': 823,
+    'Ifraktur': 686,
+    'Rfraktur': 795,
+    'weierstrass': 987,
+    'circlemultiply': 768,
+    'circleplus': 768,
+    'emptyset': 823,
+    'intersection': 768,
+    'union': 768,
+    'propersuperset': 713,
+    'reflexsuperset': 713,
+    'notsubset': 713,
+    'propersubset': 713,
+    'reflexsubset': 713,
+    'element': 713,
+    'notelement': 713,
+    'angle': 768,
+    'gradient': 713,
+    'registerserif': 790,
+    'copyrightserif': 790,
+    'trademarkserif': 890,
+    'product': 823,
+    'radical': 549,
+    'dotmath': 250,
+    'logicalnot': 713,
+    'logicaland': 603,
+    'logicalor': 603,
+    'arrowdblboth': 1042,
+    'arrowdblleft': 987,
+    'arrowdblup': 603,
+    'arrowdblright': 987,
+    'arrowdbldown': 603,
+    'lozenge': 494,
+    'angleleft': 329,
+    'registersans': 790,
+    'copyrightsans': 790,
+    'trademarksans': 786,
+    'summation': 713,
+    'parenlefttp': 384,
+    'parenleftex': 384,
+    'parenleftbt': 384,
+    'bracketlefttp': 384,
+    'bracketleftex': 384,
+    'bracketleftbt': 384,
+    'bracelefttp': 494,
+    'braceleftmid': 494,
+    'braceleftbt': 494,
+    'braceex': 494,
+    'angleright': 329,
+    'integral': 274,
+    'integraltp': 686,
+    'integralex': 686,
+    'integralbt': 686,
+    'parenrighttp': 384,
+    'parenrightex': 384,
+    'parenrightbt': 384,
+    'bracketrighttp': 384,
+    'bracketrightex': 384,
+    'bracketrightbt': 384,
+    'bracerighttp': 494,
+    'bracerightmid': 494,
+    'bracerightbt': 494,
+    'apple': 790
+  },
+  'Times-Roman': {
+    'space': 250,
+    'exclam': 333,
+    'quotedbl': 408,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 833,
+    'ampersand': 778,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 564,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 564,
+    'equal': 564,
+    'greater': 564,
+    'question': 444,
+    'at': 921,
+    'A': 722,
+    'B': 667,
+    'C': 667,
+    'D': 722,
+    'E': 611,
+    'F': 556,
+    'G': 722,
+    'H': 722,
+    'I': 333,
+    'J': 389,
+    'K': 722,
+    'L': 611,
+    'M': 889,
+    'N': 722,
+    'O': 722,
+    'P': 556,
+    'Q': 722,
+    'R': 667,
+    'S': 556,
+    'T': 611,
+    'U': 722,
+    'V': 722,
+    'W': 944,
+    'X': 722,
+    'Y': 722,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 469,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 444,
+    'b': 500,
+    'c': 444,
+    'd': 500,
+    'e': 444,
+    'f': 333,
+    'g': 500,
+    'h': 500,
+    'i': 278,
+    'j': 278,
+    'k': 500,
+    'l': 278,
+    'm': 778,
+    'n': 500,
+    'o': 500,
+    'p': 500,
+    'q': 500,
+    'r': 333,
+    's': 389,
+    't': 278,
+    'u': 500,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 444,
+    'braceleft': 480,
+    'bar': 200,
+    'braceright': 480,
+    'asciitilde': 541,
+    'exclamdown': 333,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 180,
+    'quotedblleft': 444,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 556,
+    'fl': 556,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 453,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 444,
+    'quotedblright': 444,
+    'guillemotright': 500,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 444,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 889,
+    'ordfeminine': 276,
+    'Lslash': 611,
+    'Oslash': 722,
+    'OE': 889,
+    'ordmasculine': 310,
+    'ae': 667,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 722,
+    'germandbls': 500,
+    'Idieresis': 333,
+    'eacute': 444,
+    'abreve': 444,
+    'uhungarumlaut': 500,
+    'ecaron': 444,
+    'Ydieresis': 722,
+    'divide': 564,
+    'Yacute': 722,
+    'Acircumflex': 722,
+    'aacute': 444,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 444,
+    'Uacute': 722,
+    'uogonek': 500,
+    'Edieresis': 611,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 760,
+    'Emacron': 611,
+    'ccaron': 444,
+    'aring': 444,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 444,
+    'Tcommaaccent': 611,
+    'Cacute': 667,
+    'atilde': 444,
+    'Edotaccent': 611,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 667,
+    'Gcommaaccent': 722,
+    'ucircumflex': 500,
+    'acircumflex': 444,
+    'Amacron': 722,
+    'rcaron': 333,
+    'ccedilla': 444,
+    'Zdotaccent': 611,
+    'Thorn': 556,
+    'Omacron': 722,
+    'Racute': 667,
+    'Sacute': 556,
+    'dcaron': 588,
+    'Umacron': 722,
+    'uring': 500,
+    'threesuperior': 300,
+    'Ograve': 722,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 564,
+    'uacute': 500,
+    'Tcaron': 611,
+    'partialdiff': 476,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 611,
+    'adieresis': 444,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 500,
+    'umacron': 500,
+    'Ncaron': 722,
+    'Iacute': 333,
+    'plusminus': 564,
+    'brokenbar': 200,
+    'registered': 760,
+    'Gbreve': 722,
+    'Idotaccent': 333,
+    'summation': 600,
+    'Egrave': 611,
+    'racute': 333,
+    'omacron': 500,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 667,
+    'lcommaaccent': 278,
+    'tcaron': 326,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 444,
+    'zacute': 444,
+    'iogonek': 278,
+    'Oacute': 722,
+    'oacute': 500,
+    'amacron': 444,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 722,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 500,
+    'twosuperior': 300,
+    'Odieresis': 722,
+    'mu': 500,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 611,
+    'dcroat': 500,
+    'threequarters': 750,
+    'Scedilla': 556,
+    'lcaron': 344,
+    'Kcommaaccent': 722,
+    'Lacute': 611,
+    'trademark': 980,
+    'edotaccent': 444,
+    'Igrave': 333,
+    'Imacron': 333,
+    'Lcaron': 611,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 500,
+    'Uhungarumlaut': 722,
+    'Eacute': 611,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 556,
+    'Scommaaccent': 556,
+    'Ohungarumlaut': 722,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 667,
+    'ugrave': 500,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 333,
+    'Ntilde': 722,
+    'otilde': 500,
+    'Rcommaaccent': 667,
+    'Lcommaaccent': 611,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 722,
+    'zdotaccent': 444,
+    'Ecaron': 611,
+    'Iogonek': 333,
+    'kcommaaccent': 500,
+    'minus': 564,
+    'Icircumflex': 333,
+    'ncaron': 500,
+    'tcommaaccent': 278,
+    'logicalnot': 564,
+    'odieresis': 500,
+    'udieresis': 500,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 444,
+    'ncommaaccent': 500,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'Times-Bold': {
+    'space': 250,
+    'exclam': 333,
+    'quotedbl': 555,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 1000,
+    'ampersand': 833,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 570,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 570,
+    'equal': 570,
+    'greater': 570,
+    'question': 500,
+    'at': 930,
+    'A': 722,
+    'B': 667,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 778,
+    'I': 389,
+    'J': 500,
+    'K': 778,
+    'L': 667,
+    'M': 944,
+    'N': 722,
+    'O': 778,
+    'P': 611,
+    'Q': 778,
+    'R': 722,
+    'S': 556,
+    'T': 667,
+    'U': 722,
+    'V': 722,
+    'W': 1000,
+    'X': 722,
+    'Y': 722,
+    'Z': 667,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 581,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 500,
+    'b': 556,
+    'c': 444,
+    'd': 556,
+    'e': 444,
+    'f': 333,
+    'g': 500,
+    'h': 556,
+    'i': 278,
+    'j': 333,
+    'k': 556,
+    'l': 278,
+    'm': 833,
+    'n': 556,
+    'o': 500,
+    'p': 556,
+    'q': 556,
+    'r': 444,
+    's': 389,
+    't': 333,
+    'u': 556,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 444,
+    'braceleft': 394,
+    'bar': 220,
+    'braceright': 394,
+    'asciitilde': 520,
+    'exclamdown': 333,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 278,
+    'quotedblleft': 500,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 556,
+    'fl': 556,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 540,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 500,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 500,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 300,
+    'Lslash': 667,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 330,
+    'ae': 722,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 722,
+    'germandbls': 556,
+    'Idieresis': 389,
+    'eacute': 444,
+    'abreve': 500,
+    'uhungarumlaut': 556,
+    'ecaron': 444,
+    'Ydieresis': 722,
+    'divide': 570,
+    'Yacute': 722,
+    'Acircumflex': 722,
+    'aacute': 500,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 500,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 747,
+    'Emacron': 667,
+    'ccaron': 444,
+    'aring': 500,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 500,
+    'Tcommaaccent': 667,
+    'Cacute': 722,
+    'atilde': 500,
+    'Edotaccent': 667,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 556,
+    'acircumflex': 500,
+    'Amacron': 722,
+    'rcaron': 444,
+    'ccedilla': 444,
+    'Zdotaccent': 667,
+    'Thorn': 611,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 556,
+    'dcaron': 672,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 300,
+    'Ograve': 778,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 570,
+    'uacute': 556,
+    'Tcaron': 667,
+    'partialdiff': 494,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 500,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 389,
+    'plusminus': 570,
+    'brokenbar': 220,
+    'registered': 747,
+    'Gbreve': 778,
+    'Idotaccent': 389,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 444,
+    'omacron': 500,
+    'Zacute': 667,
+    'Zcaron': 667,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 278,
+    'tcaron': 416,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 444,
+    'zacute': 444,
+    'iogonek': 278,
+    'Oacute': 778,
+    'oacute': 500,
+    'amacron': 500,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 556,
+    'twosuperior': 300,
+    'Odieresis': 778,
+    'mu': 556,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 667,
+    'dcroat': 556,
+    'threequarters': 750,
+    'Scedilla': 556,
+    'lcaron': 394,
+    'Kcommaaccent': 778,
+    'Lacute': 667,
+    'trademark': 1000,
+    'edotaccent': 444,
+    'Igrave': 389,
+    'Imacron': 389,
+    'Lcaron': 667,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 556,
+    'Scommaaccent': 556,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 722,
+    'ugrave': 556,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 444,
+    'Ntilde': 722,
+    'otilde': 500,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 667,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 778,
+    'zdotaccent': 444,
+    'Ecaron': 667,
+    'Iogonek': 389,
+    'kcommaaccent': 556,
+    'minus': 570,
+    'Icircumflex': 389,
+    'ncaron': 556,
+    'tcommaaccent': 333,
+    'logicalnot': 570,
+    'odieresis': 500,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 444,
+    'ncommaaccent': 556,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'Times-BoldItalic': {
+    'space': 250,
+    'exclam': 389,
+    'quotedbl': 555,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 833,
+    'ampersand': 778,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 570,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 570,
+    'equal': 570,
+    'greater': 570,
+    'question': 500,
+    'at': 832,
+    'A': 667,
+    'B': 667,
+    'C': 667,
+    'D': 722,
+    'E': 667,
+    'F': 667,
+    'G': 722,
+    'H': 778,
+    'I': 389,
+    'J': 500,
+    'K': 667,
+    'L': 611,
+    'M': 889,
+    'N': 722,
+    'O': 722,
+    'P': 611,
+    'Q': 722,
+    'R': 667,
+    'S': 556,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 889,
+    'X': 667,
+    'Y': 611,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 570,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 500,
+    'b': 500,
+    'c': 444,
+    'd': 500,
+    'e': 444,
+    'f': 333,
+    'g': 500,
+    'h': 556,
+    'i': 278,
+    'j': 278,
+    'k': 500,
+    'l': 278,
+    'm': 778,
+    'n': 556,
+    'o': 500,
+    'p': 500,
+    'q': 500,
+    'r': 389,
+    's': 389,
+    't': 278,
+    'u': 556,
+    'v': 444,
+    'w': 667,
+    'x': 500,
+    'y': 444,
+    'z': 389,
+    'braceleft': 348,
+    'bar': 220,
+    'braceright': 348,
+    'asciitilde': 570,
+    'exclamdown': 389,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 278,
+    'quotedblleft': 500,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 556,
+    'fl': 556,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 500,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 500,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 500,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 944,
+    'ordfeminine': 266,
+    'Lslash': 611,
+    'Oslash': 722,
+    'OE': 944,
+    'ordmasculine': 300,
+    'ae': 722,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 722,
+    'germandbls': 500,
+    'Idieresis': 389,
+    'eacute': 444,
+    'abreve': 500,
+    'uhungarumlaut': 556,
+    'ecaron': 444,
+    'Ydieresis': 611,
+    'divide': 570,
+    'Yacute': 611,
+    'Acircumflex': 667,
+    'aacute': 500,
+    'Ucircumflex': 722,
+    'yacute': 444,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 500,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 747,
+    'Emacron': 667,
+    'ccaron': 444,
+    'aring': 500,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 500,
+    'Tcommaaccent': 611,
+    'Cacute': 667,
+    'atilde': 500,
+    'Edotaccent': 667,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 667,
+    'Gcommaaccent': 722,
+    'ucircumflex': 556,
+    'acircumflex': 500,
+    'Amacron': 667,
+    'rcaron': 389,
+    'ccedilla': 444,
+    'Zdotaccent': 611,
+    'Thorn': 611,
+    'Omacron': 722,
+    'Racute': 667,
+    'Sacute': 556,
+    'dcaron': 608,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 300,
+    'Ograve': 722,
+    'Agrave': 667,
+    'Abreve': 667,
+    'multiply': 570,
+    'uacute': 556,
+    'Tcaron': 611,
+    'partialdiff': 494,
+    'ydieresis': 444,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 500,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 389,
+    'plusminus': 570,
+    'brokenbar': 220,
+    'registered': 747,
+    'Gbreve': 722,
+    'Idotaccent': 389,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 389,
+    'omacron': 500,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 667,
+    'lcommaaccent': 278,
+    'tcaron': 366,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 667,
+    'Adieresis': 667,
+    'egrave': 444,
+    'zacute': 389,
+    'iogonek': 278,
+    'Oacute': 722,
+    'oacute': 500,
+    'amacron': 500,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 722,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 500,
+    'twosuperior': 300,
+    'Odieresis': 722,
+    'mu': 576,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 667,
+    'dcroat': 500,
+    'threequarters': 750,
+    'Scedilla': 556,
+    'lcaron': 382,
+    'Kcommaaccent': 667,
+    'Lacute': 611,
+    'trademark': 1000,
+    'edotaccent': 444,
+    'Igrave': 389,
+    'Imacron': 389,
+    'Lcaron': 611,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 556,
+    'Scommaaccent': 556,
+    'Ohungarumlaut': 722,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 667,
+    'ugrave': 556,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 722,
+    'otilde': 500,
+    'Rcommaaccent': 667,
+    'Lcommaaccent': 611,
+    'Atilde': 667,
+    'Aogonek': 667,
+    'Aring': 667,
+    'Otilde': 722,
+    'zdotaccent': 389,
+    'Ecaron': 667,
+    'Iogonek': 389,
+    'kcommaaccent': 500,
+    'minus': 606,
+    'Icircumflex': 389,
+    'ncaron': 556,
+    'tcommaaccent': 278,
+    'logicalnot': 606,
+    'odieresis': 500,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 389,
+    'ncommaaccent': 556,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'Times-Italic': {
+    'space': 250,
+    'exclam': 333,
+    'quotedbl': 420,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 833,
+    'ampersand': 778,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 675,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 675,
+    'equal': 675,
+    'greater': 675,
+    'question': 500,
+    'at': 920,
+    'A': 611,
+    'B': 611,
+    'C': 667,
+    'D': 722,
+    'E': 611,
+    'F': 611,
+    'G': 722,
+    'H': 722,
+    'I': 333,
+    'J': 444,
+    'K': 667,
+    'L': 556,
+    'M': 833,
+    'N': 667,
+    'O': 722,
+    'P': 611,
+    'Q': 722,
+    'R': 611,
+    'S': 500,
+    'T': 556,
+    'U': 722,
+    'V': 611,
+    'W': 833,
+    'X': 611,
+    'Y': 556,
+    'Z': 556,
+    'bracketleft': 389,
+    'backslash': 278,
+    'bracketright': 389,
+    'asciicircum': 422,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 500,
+    'b': 500,
+    'c': 444,
+    'd': 500,
+    'e': 444,
+    'f': 278,
+    'g': 500,
+    'h': 500,
+    'i': 278,
+    'j': 278,
+    'k': 444,
+    'l': 278,
+    'm': 722,
+    'n': 500,
+    'o': 500,
+    'p': 500,
+    'q': 500,
+    'r': 389,
+    's': 389,
+    't': 278,
+    'u': 500,
+    'v': 444,
+    'w': 667,
+    'x': 444,
+    'y': 444,
+    'z': 389,
+    'braceleft': 400,
+    'bar': 275,
+    'braceright': 400,
+    'asciitilde': 541,
+    'exclamdown': 389,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 214,
+    'quotedblleft': 556,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 500,
+    'fl': 500,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 523,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 556,
+    'quotedblright': 556,
+    'guillemotright': 500,
+    'ellipsis': 889,
+    'perthousand': 1000,
+    'questiondown': 500,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 889,
+    'AE': 889,
+    'ordfeminine': 276,
+    'Lslash': 556,
+    'Oslash': 722,
+    'OE': 944,
+    'ordmasculine': 310,
+    'ae': 667,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 667,
+    'germandbls': 500,
+    'Idieresis': 333,
+    'eacute': 444,
+    'abreve': 500,
+    'uhungarumlaut': 500,
+    'ecaron': 444,
+    'Ydieresis': 556,
+    'divide': 675,
+    'Yacute': 556,
+    'Acircumflex': 611,
+    'aacute': 500,
+    'Ucircumflex': 722,
+    'yacute': 444,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 500,
+    'Uacute': 722,
+    'uogonek': 500,
+    'Edieresis': 611,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 760,
+    'Emacron': 611,
+    'ccaron': 444,
+    'aring': 500,
+    'Ncommaaccent': 667,
+    'lacute': 278,
+    'agrave': 500,
+    'Tcommaaccent': 556,
+    'Cacute': 667,
+    'atilde': 500,
+    'Edotaccent': 611,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 611,
+    'Gcommaaccent': 722,
+    'ucircumflex': 500,
+    'acircumflex': 500,
+    'Amacron': 611,
+    'rcaron': 389,
+    'ccedilla': 444,
+    'Zdotaccent': 556,
+    'Thorn': 611,
+    'Omacron': 722,
+    'Racute': 611,
+    'Sacute': 500,
+    'dcaron': 544,
+    'Umacron': 722,
+    'uring': 500,
+    'threesuperior': 300,
+    'Ograve': 722,
+    'Agrave': 611,
+    'Abreve': 611,
+    'multiply': 675,
+    'uacute': 500,
+    'Tcaron': 556,
+    'partialdiff': 476,
+    'ydieresis': 444,
+    'Nacute': 667,
+    'icircumflex': 278,
+    'Ecircumflex': 611,
+    'adieresis': 500,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 500,
+    'umacron': 500,
+    'Ncaron': 667,
+    'Iacute': 333,
+    'plusminus': 675,
+    'brokenbar': 275,
+    'registered': 760,
+    'Gbreve': 722,
+    'Idotaccent': 333,
+    'summation': 600,
+    'Egrave': 611,
+    'racute': 389,
+    'omacron': 500,
+    'Zacute': 556,
+    'Zcaron': 556,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 667,
+    'lcommaaccent': 278,
+    'tcaron': 300,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 611,
+    'Adieresis': 611,
+    'egrave': 444,
+    'zacute': 389,
+    'iogonek': 278,
+    'Oacute': 722,
+    'oacute': 500,
+    'amacron': 500,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 722,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 500,
+    'twosuperior': 300,
+    'Odieresis': 722,
+    'mu': 500,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 611,
+    'dcroat': 500,
+    'threequarters': 750,
+    'Scedilla': 500,
+    'lcaron': 300,
+    'Kcommaaccent': 667,
+    'Lacute': 556,
+    'trademark': 980,
+    'edotaccent': 444,
+    'Igrave': 333,
+    'Imacron': 333,
+    'Lcaron': 611,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 500,
+    'Uhungarumlaut': 722,
+    'Eacute': 611,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 500,
+    'Scommaaccent': 500,
+    'Ohungarumlaut': 722,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 667,
+    'ugrave': 500,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 667,
+    'otilde': 500,
+    'Rcommaaccent': 611,
+    'Lcommaaccent': 556,
+    'Atilde': 611,
+    'Aogonek': 611,
+    'Aring': 611,
+    'Otilde': 722,
+    'zdotaccent': 389,
+    'Ecaron': 611,
+    'Iogonek': 333,
+    'kcommaaccent': 444,
+    'minus': 675,
+    'Icircumflex': 333,
+    'ncaron': 500,
+    'tcommaaccent': 278,
+    'logicalnot': 675,
+    'odieresis': 500,
+    'udieresis': 500,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 389,
+    'ncommaaccent': 500,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'ZapfDingbats': {
+    'space': 278,
+    'a1': 974,
+    'a2': 961,
+    'a202': 974,
+    'a3': 980,
+    'a4': 719,
+    'a5': 789,
+    'a119': 790,
+    'a118': 791,
+    'a117': 690,
+    'a11': 960,
+    'a12': 939,
+    'a13': 549,
+    'a14': 855,
+    'a15': 911,
+    'a16': 933,
+    'a105': 911,
+    'a17': 945,
+    'a18': 974,
+    'a19': 755,
+    'a20': 846,
+    'a21': 762,
+    'a22': 761,
+    'a23': 571,
+    'a24': 677,
+    'a25': 763,
+    'a26': 760,
+    'a27': 759,
+    'a28': 754,
+    'a6': 494,
+    'a7': 552,
+    'a8': 537,
+    'a9': 577,
+    'a10': 692,
+    'a29': 786,
+    'a30': 788,
+    'a31': 788,
+    'a32': 790,
+    'a33': 793,
+    'a34': 794,
+    'a35': 816,
+    'a36': 823,
+    'a37': 789,
+    'a38': 841,
+    'a39': 823,
+    'a40': 833,
+    'a41': 816,
+    'a42': 831,
+    'a43': 923,
+    'a44': 744,
+    'a45': 723,
+    'a46': 749,
+    'a47': 790,
+    'a48': 792,
+    'a49': 695,
+    'a50': 776,
+    'a51': 768,
+    'a52': 792,
+    'a53': 759,
+    'a54': 707,
+    'a55': 708,
+    'a56': 682,
+    'a57': 701,
+    'a58': 826,
+    'a59': 815,
+    'a60': 789,
+    'a61': 789,
+    'a62': 707,
+    'a63': 687,
+    'a64': 696,
+    'a65': 689,
+    'a66': 786,
+    'a67': 787,
+    'a68': 713,
+    'a69': 791,
+    'a70': 785,
+    'a71': 791,
+    'a72': 873,
+    'a73': 761,
+    'a74': 762,
+    'a203': 762,
+    'a75': 759,
+    'a204': 759,
+    'a76': 892,
+    'a77': 892,
+    'a78': 788,
+    'a79': 784,
+    'a81': 438,
+    'a82': 138,
+    'a83': 277,
+    'a84': 415,
+    'a97': 392,
+    'a98': 392,
+    'a99': 668,
+    'a100': 668,
+    'a89': 390,
+    'a90': 390,
+    'a93': 317,
+    'a94': 317,
+    'a91': 276,
+    'a92': 276,
+    'a205': 509,
+    'a85': 509,
+    'a206': 410,
+    'a86': 410,
+    'a87': 234,
+    'a88': 234,
+    'a95': 334,
+    'a96': 334,
+    'a101': 732,
+    'a102': 544,
+    'a103': 544,
+    'a104': 910,
+    'a106': 667,
+    'a107': 760,
+    'a108': 760,
+    'a112': 776,
+    'a111': 595,
+    'a110': 694,
+    'a109': 626,
+    'a120': 788,
+    'a121': 788,
+    'a122': 788,
+    'a123': 788,
+    'a124': 788,
+    'a125': 788,
+    'a126': 788,
+    'a127': 788,
+    'a128': 788,
+    'a129': 788,
+    'a130': 788,
+    'a131': 788,
+    'a132': 788,
+    'a133': 788,
+    'a134': 788,
+    'a135': 788,
+    'a136': 788,
+    'a137': 788,
+    'a138': 788,
+    'a139': 788,
+    'a140': 788,
+    'a141': 788,
+    'a142': 788,
+    'a143': 788,
+    'a144': 788,
+    'a145': 788,
+    'a146': 788,
+    'a147': 788,
+    'a148': 788,
+    'a149': 788,
+    'a150': 788,
+    'a151': 788,
+    'a152': 788,
+    'a153': 788,
+    'a154': 788,
+    'a155': 788,
+    'a156': 788,
+    'a157': 788,
+    'a158': 788,
+    'a159': 788,
+    'a160': 894,
+    'a161': 838,
+    'a163': 1016,
+    'a164': 458,
+    'a196': 748,
+    'a165': 924,
+    'a192': 748,
+    'a166': 918,
+    'a167': 927,
+    'a168': 928,
+    'a169': 928,
+    'a170': 834,
+    'a171': 873,
+    'a172': 828,
+    'a173': 924,
+    'a162': 924,
+    'a174': 917,
+    'a175': 930,
+    'a176': 931,
+    'a177': 463,
+    'a178': 883,
+    'a179': 836,
+    'a193': 836,
+    'a180': 867,
+    'a199': 867,
+    'a181': 696,
+    'a200': 696,
+    'a182': 874,
+    'a201': 874,
+    'a183': 760,
+    'a184': 946,
+    'a197': 771,
+    'a185': 865,
+    'a194': 771,
+    'a198': 888,
+    'a186': 967,
+    'a195': 888,
+    'a187': 831,
+    'a188': 873,
+    'a189': 927,
+    'a190': 970,
+    'a191': 918
+  }
+};
+
+
+
+var EOF = {};
+
+function isEOF(v) {
+  return (v == EOF);
+}
+
+var Parser = (function ParserClosure() {
+  function Parser(lexer, allowStreams, xref) {
+    this.lexer = lexer;
+    this.allowStreams = allowStreams;
+    this.xref = xref;
+    this.imageCache = {
+      length: 0,
+      adler32: 0,
+      stream: null
+    };
+    this.refill();
+  }
+
+  Parser.prototype = {
+    refill: function Parser_refill() {
+      this.buf1 = this.lexer.getObj();
+      this.buf2 = this.lexer.getObj();
+    },
+    shift: function Parser_shift() {
+      if (isCmd(this.buf2, 'ID')) {
+        this.buf1 = this.buf2;
+        this.buf2 = null;
+      } else {
+        this.buf1 = this.buf2;
+        this.buf2 = this.lexer.getObj();
+      }
+    },
+    getObj: function Parser_getObj(cipherTransform) {
+      if (isCmd(this.buf1, 'BI')) { // inline image
+        this.shift();
+        return this.makeInlineImage(cipherTransform);
+      }
+      if (isCmd(this.buf1, '[')) { // array
+        this.shift();
+        var array = [];
+        while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) {
+          array.push(this.getObj(cipherTransform));
+        }
+        if (isEOF(this.buf1)) {
+          error('End of file inside array');
+        }
+        this.shift();
+        return array;
+      }
+      if (isCmd(this.buf1, '<<')) { // dictionary or stream
+        this.shift();
+        var dict = new Dict(this.xref);
+        while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
+          if (!isName(this.buf1)) {
+            info('Malformed dictionary: key must be a name object');
+            this.shift();
+            continue;
+          }
+
+          var key = this.buf1.name;
+          this.shift();
+          if (isEOF(this.buf1)) {
+            break;
+          }
+          dict.set(key, this.getObj(cipherTransform));
+        }
+        if (isEOF(this.buf1)) {
+          error('End of file inside dictionary');
+        }
+
+        // Stream objects are not allowed inside content streams or
+        // object streams.
+        if (isCmd(this.buf2, 'stream')) {
+          return (this.allowStreams ?
+                  this.makeStream(dict, cipherTransform) : dict);
+        }
+        this.shift();
+        return dict;
+      }
+      if (isInt(this.buf1)) { // indirect reference or integer
+        var num = this.buf1;
+        this.shift();
+        if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
+          var ref = new Ref(num, this.buf1);
+          this.shift();
+          this.shift();
+          return ref;
+        }
+        return num;
+      }
+      if (isString(this.buf1)) { // string
+        var str = this.buf1;
+        this.shift();
+        if (cipherTransform) {
+          str = cipherTransform.decryptString(str);
+        }
+        return str;
+      }
+
+      // simple object
+      var obj = this.buf1;
+      this.shift();
+      return obj;
+    },
+    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
+      var lexer = this.lexer;
+      var stream = lexer.stream;
+
+      // parse dictionary
+      var dict = new Dict(null);
+      while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
+        if (!isName(this.buf1)) {
+          error('Dictionary key must be a name object');
+        }
+
+        var key = this.buf1.name;
+        this.shift();
+        if (isEOF(this.buf1)) {
+          break;
+        }
+        dict.set(key, this.getObj(cipherTransform));
+      }
+
+      // parse image stream
+      var startPos = stream.pos;
+
+      // searching for the /EI\s/
+      var state = 0, ch, i, ii;
+      while (state != 4 && (ch = stream.getByte()) !== -1) {
+        switch (ch | 0) {
+          case 0x20:
+          case 0x0D:
+          case 0x0A:
+            // let's check next five bytes to be ASCII... just be sure
+            var followingBytes = stream.peekBytes(5);
+            for (i = 0, ii = followingBytes.length; i < ii; i++) {
+              ch = followingBytes[i];
+              if (ch !== 0x0A && ch !== 0x0D && (ch < 0x20 || ch > 0x7F)) {
+                // not a LF, CR, SPACE or any visible ASCII character
+                state = 0;
+                break; // some binary stuff found, resetting the state
+              }
+            }
+            state = (state === 3 ? 4 : 0);
+            break;
+          case 0x45:
+            state = 2;
+            break;
+          case 0x49:
+            state = (state === 2 ? 3 : 0);
+            break;
+          default:
+            state = 0;
+            break;
+        }
+      }
+
+      var length = (stream.pos - 4) - startPos;
+      var imageStream = stream.makeSubStream(startPos, length, dict);
+
+      // trying to cache repeat images, first we are trying to "warm up" caching
+      // using length, then comparing adler32
+      var MAX_LENGTH_TO_CACHE = 1000;
+      var cacheImage = false, adler32;
+      if (length < MAX_LENGTH_TO_CACHE && this.imageCache.length === length) {
+        var imageBytes = imageStream.getBytes();
+        imageStream.reset();
+
+        var a = 1;
+        var b = 0;
+        for (i = 0, ii = imageBytes.length; i < ii; ++i) {
+          a = (a + (imageBytes[i] & 0xff)) % 65521;
+          b = (b + a) % 65521;
+        }
+        adler32 = (b << 16) | a;
+
+        if (this.imageCache.stream && this.imageCache.adler32 === adler32) {
+          this.buf2 = Cmd.get('EI');
+          this.shift();
+
+          this.imageCache.stream.reset();
+          return this.imageCache.stream;
+        }
+        cacheImage = true;
+      }
+      if (!cacheImage && !this.imageCache.stream) {
+        this.imageCache.length = length;
+        this.imageCache.stream = null;
+      }
+
+      if (cipherTransform) {
+        imageStream = cipherTransform.createStream(imageStream, length);
+      }
+
+      imageStream = this.filter(imageStream, dict, length);
+      imageStream.dict = dict;
+      if (cacheImage) {
+        imageStream.cacheKey = 'inline_' + length + '_' + adler32;
+        this.imageCache.adler32 = adler32;
+        this.imageCache.stream = imageStream;
+      }
+
+      this.buf2 = Cmd.get('EI');
+      this.shift();
+
+      return imageStream;
+    },
+    fetchIfRef: function Parser_fetchIfRef(obj) {
+      // not relying on the xref.fetchIfRef -- xref might not be set
+      return (isRef(obj) ? this.xref.fetch(obj) : obj);
+    },
+    makeStream: function Parser_makeStream(dict, cipherTransform) {
+      var lexer = this.lexer;
+      var stream = lexer.stream;
+
+      // get stream start position
+      lexer.skipToNextLine();
+      var pos = stream.pos - 1;
+
+      // get length
+      var length = this.fetchIfRef(dict.get('Length'));
+      if (!isInt(length)) {
+        info('Bad ' + length + ' attribute in stream');
+        length = 0;
+      }
+
+      // skip over the stream data
+      stream.pos = pos + length;
+      lexer.nextChar();
+
+      this.shift(); // '>>'
+      this.shift(); // 'stream'
+      if (!isCmd(this.buf1, 'endstream')) {
+        // bad stream length, scanning for endstream
+        stream.pos = pos;
+        var SCAN_BLOCK_SIZE = 2048;
+        var ENDSTREAM_SIGNATURE_LENGTH = 9;
+        var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65,
+                                   0x61, 0x6D];
+        var skipped = 0, found = false, i, j;
+        while (stream.pos < stream.end) {
+          var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE);
+          var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH;
+          found = false;
+          for (i = 0, j = 0; i < scanLength; i++) {
+            var b = scanBytes[i];
+            if (b !== ENDSTREAM_SIGNATURE[j]) {
+              i -= j;
+              j = 0;
+            } else {
+              j++;
+              if (j >= ENDSTREAM_SIGNATURE_LENGTH) {
+                i++;
+                found = true;
+                break;
+              }
+            }
+          }
+          if (found) {
+            skipped += i - ENDSTREAM_SIGNATURE_LENGTH;
+            stream.pos += i - ENDSTREAM_SIGNATURE_LENGTH;
+            break;
+          }
+          skipped += scanLength;
+          stream.pos += scanLength;
+        }
+        if (!found) {
+          error('Missing endstream');
+        }
+        length = skipped;
+
+        lexer.nextChar();
+        this.shift();
+        this.shift();
+      }
+      this.shift(); // 'endstream'
+
+      stream = stream.makeSubStream(pos, length, dict);
+      if (cipherTransform) {
+        stream = cipherTransform.createStream(stream, length);
+      }
+      stream = this.filter(stream, dict, length);
+      stream.dict = dict;
+      return stream;
+    },
+    filter: function Parser_filter(stream, dict, length) {
+      var filter = this.fetchIfRef(dict.get('Filter', 'F'));
+      var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
+      if (isName(filter)) {
+        return this.makeFilter(stream, filter.name, length, params);
+      }
+
+      var maybeLength = length;
+      if (isArray(filter)) {
+        var filterArray = filter;
+        var paramsArray = params;
+        for (var i = 0, ii = filterArray.length; i < ii; ++i) {
+          filter = filterArray[i];
+          if (!isName(filter)) {
+            error('Bad filter name: ' + filter);
+          }
+
+          params = null;
+          if (isArray(paramsArray) && (i in paramsArray)) {
+            params = paramsArray[i];
+          }
+          stream = this.makeFilter(stream, filter.name, maybeLength, params);
+          // after the first stream the length variable is invalid
+          maybeLength = null;
+        }
+      }
+      return stream;
+    },
+    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {
+      if (stream.dict.get('Length') === 0) {
+        return new NullStream(stream);
+      }
+      if (name == 'FlateDecode' || name == 'Fl') {
+        if (params) {
+          return new PredictorStream(new FlateStream(stream, maybeLength),
+                                     maybeLength, params);
+        }
+        return new FlateStream(stream, maybeLength);
+      }
+      if (name == 'LZWDecode' || name == 'LZW') {
+        var earlyChange = 1;
+        if (params) {
+          if (params.has('EarlyChange')) {
+            earlyChange = params.get('EarlyChange');
+          }
+          return new PredictorStream(
+            new LZWStream(stream, maybeLength, earlyChange),
+                          maybeLength, params);
+        }
+        return new LZWStream(stream, maybeLength, earlyChange);
+      }
+      if (name == 'DCTDecode' || name == 'DCT') {
+        return new JpegStream(stream, maybeLength, stream.dict, this.xref);
+      }
+      if (name == 'JPXDecode' || name == 'JPX') {
+        return new JpxStream(stream, maybeLength, stream.dict);
+      }
+      if (name == 'ASCII85Decode' || name == 'A85') {
+        return new Ascii85Stream(stream, maybeLength);
+      }
+      if (name == 'ASCIIHexDecode' || name == 'AHx') {
+        return new AsciiHexStream(stream, maybeLength);
+      }
+      if (name == 'CCITTFaxDecode' || name == 'CCF') {
+        return new CCITTFaxStream(stream, maybeLength, params);
+      }
+      if (name == 'RunLengthDecode' || name == 'RL') {
+        return new RunLengthStream(stream, maybeLength);
+      }
+      if (name == 'JBIG2Decode') {
+        return new Jbig2Stream(stream, maybeLength, stream.dict);
+      }
+      warn('filter "' + name + '" not supported yet');
+      return stream;
+    }
+  };
+
+  return Parser;
+})();
+
+var Lexer = (function LexerClosure() {
+  function Lexer(stream, knownCommands) {
+    this.stream = stream;
+    this.nextChar();
+
+    // While lexing, we build up many strings one char at a time. Using += for
+    // this can result in lots of garbage strings. It's better to build an
+    // array of single-char strings and then join() them together at the end.
+    // And reusing a single array (i.e. |this.strBuf|) over and over for this
+    // purpose uses less memory than using a new array for each string.
+    this.strBuf = [];
+
+    // The PDFs might have "glued" commands with other commands, operands or
+    // literals, e.g. "q1". The knownCommands is a dictionary of the valid
+    // commands and their prefixes. The prefixes are built the following way:
+    // if there a command that is a prefix of the other valid command or
+    // literal (e.g. 'f' and 'false') the following prefixes must be included,
+    // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no
+    // other commands or literals as a prefix. The knowCommands is optional.
+    this.knownCommands = knownCommands;
+  }
+
+  Lexer.isSpace = function Lexer_isSpace(ch) {
+    // Space is one of the following characters: SPACE, TAB, CR or LF.
+    return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A);
+  };
+
+  // A '1' in this array means the character is white space. A '1' or
+  // '2' means the character ends a name or command.
+  var specialChars = [
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
+    1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  // fx
+  ];
+
+  function toHexDigit(ch) {
+    if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'
+      return ch & 0x0F;
+    }
+    if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {
+      // 'A'-'F', 'a'-'f'
+      return (ch & 0x0F) + 9;
+    }
+    return -1;
+  }
+
+  Lexer.prototype = {
+    nextChar: function Lexer_nextChar() {
+      return (this.currentChar = this.stream.getByte());
+    },
+    peekChar: function Lexer_peekChar() {
+      return this.stream.peekBytes(1)[0];
+    },
+    getNumber: function Lexer_getNumber() {
+      var ch = this.currentChar;
+      var eNotation = false;
+      var divideBy = 0; // different from 0 if it's a floating point value
+      var sign = 1;
+
+      if (ch === 0x2D) { // '-'
+        sign = -1;
+        ch = this.nextChar();
+      } else if (ch === 0x2B) { // '+'
+        ch = this.nextChar();
+      }
+      if (ch === 0x2E) { // '.'
+        divideBy = 10;
+        ch = this.nextChar();
+      }
+      if (ch < 0x30 || ch > 0x39) { // '0' - '9'
+        error('Invalid number: ' + String.fromCharCode(ch));
+        return 0;
+      }
+
+      var baseValue = ch - 0x30; // '0'
+      var powerValue = 0;
+      var powerValueSign = 1;
+
+      while ((ch = this.nextChar()) >= 0) {
+        if (0x30 <= ch && ch <= 0x39) { // '0' - '9'
+          var currentDigit = ch - 0x30; // '0'
+          if (eNotation) { // We are after an 'e' or 'E'
+            powerValue = powerValue * 10 + currentDigit;
+          } else {
+            if (divideBy !== 0) { // We are after a point
+              divideBy *= 10;
+            }
+            baseValue = baseValue * 10 + currentDigit;
+          }
+        } else if (ch === 0x2E) { // '.'
+          if (divideBy === 0) {
+            divideBy = 1;
+          } else {
+            // A number can have only one '.'
+            break;
+          }
+        } else if (ch === 0x2D) { // '-'
+          // ignore minus signs in the middle of numbers to match
+          // Adobe's behavior
+          warn('Badly formated number');
+        } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e'
+          // 'E' can be either a scientific notation or the beginning of a new
+          // operator
+          ch = this.peekChar();
+          if (ch === 0x2B || ch === 0x2D) { // '+', '-'
+            powerValueSign = (ch === 0x2D) ? -1 : 1;
+            this.nextChar(); // Consume the sign character
+          } else if (ch < 0x30 || ch > 0x39) { // '0' - '9'
+            // The 'E' must be the beginning of a new operator
+            break;
+          }
+          eNotation = true;
+        } else {
+          // the last character doesn't belong to us
+          break;
+        }
+      }
+
+      if (divideBy !== 0) {
+        baseValue /= divideBy;
+      }
+      if (eNotation) {
+        baseValue *= Math.pow(10, powerValueSign * powerValue);
+      }
+      return sign * baseValue;
+    },
+    getString: function Lexer_getString() {
+      var numParen = 1;
+      var done = false;
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+
+      var ch = this.nextChar();
+      while (true) {
+        var charBuffered = false;
+        switch (ch | 0) {
+          case -1:
+            warn('Unterminated string');
+            done = true;
+            break;
+          case 0x28: // '('
+            ++numParen;
+            strBuf.push('(');
+            break;
+          case 0x29: // ')'
+            if (--numParen === 0) {
+              this.nextChar(); // consume strings ')'
+              done = true;
+            } else {
+              strBuf.push(')');
+            }
+            break;
+          case 0x5C: // '\\'
+            ch = this.nextChar();
+            switch (ch) {
+              case -1:
+                warn('Unterminated string');
+                done = true;
+                break;
+              case 0x6E: // 'n'
+                strBuf.push('\n');
+                break;
+              case 0x72: // 'r'
+                strBuf.push('\r');
+                break;
+              case 0x74: // 't'
+                strBuf.push('\t');
+                break;
+              case 0x62: // 'b'
+                strBuf.push('\b');
+                break;
+              case 0x66: // 'f'
+                strBuf.push('\f');
+                break;
+              case 0x5C: // '\'
+              case 0x28: // '('
+              case 0x29: // ')'
+                strBuf.push(String.fromCharCode(ch));
+                break;
+              case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3'
+              case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7'
+                var x = ch & 0x0F;
+                ch = this.nextChar();
+                charBuffered = true;
+                if (ch >= 0x30 && ch <= 0x37) { // '0'-'7'
+                  x = (x << 3) + (ch & 0x0F);
+                  ch = this.nextChar();
+                  if (ch >= 0x30 && ch <= 0x37) {  // '0'-'7'
+                    charBuffered = false;
+                    x = (x << 3) + (ch & 0x0F);
+                  }
+                }
+                strBuf.push(String.fromCharCode(x));
+                break;
+              case 0x0D: // CR
+                if (this.peekChar() === 0x0A) { // LF
+                  this.nextChar();
+                }
+                break;
+              case 0x0A: // LF
+                break;
+              default:
+                strBuf.push(String.fromCharCode(ch));
+                break;
+            }
+            break;
+          default:
+            strBuf.push(String.fromCharCode(ch));
+            break;
+        }
+        if (done) {
+          break;
+        }
+        if (!charBuffered) {
+          ch = this.nextChar();
+        }
+      }
+      return strBuf.join('');
+    },
+    getName: function Lexer_getName() {
+      var ch;
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+        if (ch === 0x23) { // '#'
+          ch = this.nextChar();
+          var x = toHexDigit(ch);
+          if (x != -1) {
+            var x2 = toHexDigit(this.nextChar());
+            if (x2 == -1) {
+              error('Illegal digit in hex char in name: ' + x2);
+            }
+            strBuf.push(String.fromCharCode((x << 4) | x2));
+          } else {
+            strBuf.push('#', String.fromCharCode(ch));
+          }
+        } else {
+          strBuf.push(String.fromCharCode(ch));
+        }
+      }
+      if (strBuf.length > 128) {
+        error('Warning: name token is longer than allowed by the spec: ' +
+              strBuf.length);
+      }
+      return Name.get(strBuf.join(''));
+    },
+    getHexString: function Lexer_getHexString() {
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      var ch = this.currentChar;
+      var isFirstHex = true;
+      var firstDigit;
+      var secondDigit;
+      while (true) {
+        if (ch < 0) {
+          warn('Unterminated hex string');
+          break;
+        } else if (ch === 0x3E) { // '>'
+          this.nextChar();
+          break;
+        } else if (specialChars[ch] === 1) {
+          ch = this.nextChar();
+          continue;
+        } else {
+          if (isFirstHex) {
+            firstDigit = toHexDigit(ch);
+            if (firstDigit === -1) {
+              warn('Ignoring invalid character "' + ch + '" in hex string');
+              ch = this.nextChar();
+              continue;
+            }
+          } else {
+            secondDigit = toHexDigit(ch);
+            if (secondDigit === -1) {
+              warn('Ignoring invalid character "' + ch + '" in hex string');
+              ch = this.nextChar();
+              continue;
+            }
+            strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit));
+          }
+          isFirstHex = !isFirstHex;
+          ch = this.nextChar();
+        }
+      }
+      return strBuf.join('');
+    },
+    getObj: function Lexer_getObj() {
+      // skip whitespace and comments
+      var comment = false;
+      var ch = this.currentChar;
+      while (true) {
+        if (ch < 0) {
+          return EOF;
+        }
+        if (comment) {
+          if (ch === 0x0A || ch == 0x0D) { // LF, CR
+            comment = false;
+          }
+        } else if (ch === 0x25) { // '%'
+          comment = true;
+        } else if (specialChars[ch] !== 1) {
+          break;
+        }
+        ch = this.nextChar();
+      }
+
+      // start reading token
+      switch (ch | 0) {
+        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'
+        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'
+        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'
+          return this.getNumber();
+        case 0x28: // '('
+          return this.getString();
+        case 0x2F: // '/'
+          return this.getName();
+        // array punctuation
+        case 0x5B: // '['
+          this.nextChar();
+          return Cmd.get('[');
+        case 0x5D: // ']'
+          this.nextChar();
+          return Cmd.get(']');
+        // hex string or dict punctuation
+        case 0x3C: // '<'
+          ch = this.nextChar();
+          if (ch === 0x3C) {
+            // dict punctuation
+            this.nextChar();
+            return Cmd.get('<<');
+          }
+          return this.getHexString();
+        // dict punctuation
+        case 0x3E: // '>'
+          ch = this.nextChar();
+          if (ch === 0x3E) {
+            this.nextChar();
+            return Cmd.get('>>');
+          }
+          return Cmd.get('>');
+        case 0x7B: // '{'
+          this.nextChar();
+          return Cmd.get('{');
+        case 0x7D: // '}'
+          this.nextChar();
+          return Cmd.get('}');
+        case 0x29: // ')'
+          error('Illegal character: ' + ch);
+          break;
+      }
+
+      // command
+      var str = String.fromCharCode(ch);
+      var knownCommands = this.knownCommands;
+      var knownCommandFound = knownCommands && (str in knownCommands);
+      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+        // stop if known command is found and next character does not make
+        // the str a command
+        var possibleCommand = str + String.fromCharCode(ch);
+        if (knownCommandFound && !(possibleCommand in knownCommands)) {
+          break;
+        }
+        if (str.length == 128) {
+          error('Command token too long: ' + str.length);
+        }
+        str = possibleCommand;
+        knownCommandFound = knownCommands && (str in knownCommands);
+      }
+      if (str == 'true') {
+        return true;
+      }
+      if (str == 'false') {
+        return false;
+      }
+      if (str == 'null') {
+        return null;
+      }
+      return Cmd.get(str);
+    },
+    skipToNextLine: function Lexer_skipToNextLine() {
+      var ch = this.currentChar;
+      while (ch >= 0) {
+        if (ch === 0x0D) { // CR
+          ch = this.nextChar();
+          if (ch === 0x0A) { // LF
+            this.nextChar();
+          }
+          break;
+        } else if (ch === 0x0A) { // LF
+          this.nextChar();
+          break;
+        }
+        ch = this.nextChar();
+      }
+    }
+  };
+
+  return Lexer;
+})();
+
+var Linearization = (function LinearizationClosure() {
+  function Linearization(stream) {
+    this.parser = new Parser(new Lexer(stream), false, null);
+    var obj1 = this.parser.getObj();
+    var obj2 = this.parser.getObj();
+    var obj3 = this.parser.getObj();
+    this.linDict = this.parser.getObj();
+    if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
+        isDict(this.linDict)) {
+      var obj = this.linDict.get('Linearized');
+      if (!(isNum(obj) && obj > 0)) {
+        this.linDict = null;
+      }
+    }
+  }
+
+  Linearization.prototype = {
+    getInt: function Linearization_getInt(name) {
+      var linDict = this.linDict;
+      var obj;
+      if (isDict(linDict) && isInt(obj = linDict.get(name)) && obj > 0) {
+        return obj;
+      }
+      error('"' + name + '" field in linearization table is invalid');
+    },
+    getHint: function Linearization_getHint(index) {
+      var linDict = this.linDict;
+      var obj1, obj2;
+      if (isDict(linDict) && isArray(obj1 = linDict.get('H')) &&
+          obj1.length >= 2 && isInt(obj2 = obj1[index]) && obj2 > 0) {
+        return obj2;
+      }
+      error('Hints table in linearization table is invalid: ' + index);
+    },
+    get length() {
+      if (!isDict(this.linDict)) {
+        return 0;
+      }
+      return this.getInt('L');
+    },
+    get hintsOffset() {
+      return this.getHint(0);
+    },
+    get hintsLength() {
+      return this.getHint(1);
+    },
+    get hintsOffset2() {
+      return this.getHint(2);
+    },
+    get hintsLenth2() {
+      return this.getHint(3);
+    },
+    get objectNumberFirst() {
+      return this.getInt('O');
+    },
+    get endFirst() {
+      return this.getInt('E');
+    },
+    get numPages() {
+      return this.getInt('N');
+    },
+    get mainXRefEntriesOffset() {
+      return this.getInt('T');
+    },
+    get pageFirst() {
+      return this.getInt('P');
+    }
+  };
+
+  return Linearization;
+})();
+
+
+
+var PostScriptParser = (function PostScriptParserClosure() {
+  function PostScriptParser(lexer) {
+    this.lexer = lexer;
+    this.operators = [];
+    this.token = null;
+    this.prev = null;
+  }
+  PostScriptParser.prototype = {
+    nextToken: function PostScriptParser_nextToken() {
+      this.prev = this.token;
+      this.token = this.lexer.getToken();
+    },
+    accept: function PostScriptParser_accept(type) {
+      if (this.token.type == type) {
+        this.nextToken();
+        return true;
+      }
+      return false;
+    },
+    expect: function PostScriptParser_expect(type) {
+      if (this.accept(type)) {
+        return true;
+      }
+      error('Unexpected symbol: found ' + this.token.type + ' expected ' +
+        type + '.');
+    },
+    parse: function PostScriptParser_parse() {
+      this.nextToken();
+      this.expect(PostScriptTokenTypes.LBRACE);
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      return this.operators;
+    },
+    parseBlock: function PostScriptParser_parseBlock() {
+      while (true) {
+        if (this.accept(PostScriptTokenTypes.NUMBER)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+          this.parseCondition();
+        } else {
+          return;
+        }
+      }
+    },
+    parseCondition: function PostScriptParser_parseCondition() {
+      // Add two place holders that will be updated later
+      var conditionLocation = this.operators.length;
+      this.operators.push(null, null);
+
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      if (this.accept(PostScriptTokenTypes.IF)) {
+        // The true block is right after the 'if' so it just falls through on
+        // true else it jumps and skips the true block.
+        this.operators[conditionLocation] = this.operators.length;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+        var jumpLocation = this.operators.length;
+        this.operators.push(null, null);
+        var endOfTrue = this.operators.length;
+        this.parseBlock();
+        this.expect(PostScriptTokenTypes.RBRACE);
+        this.expect(PostScriptTokenTypes.IFELSE);
+        // The jump is added at the end of the true block to skip the false
+        // block.
+        this.operators[jumpLocation] = this.operators.length;
+        this.operators[jumpLocation + 1] = 'j';
+
+        this.operators[conditionLocation] = endOfTrue;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else {
+        error('PS Function: error parsing conditional.');
+      }
+    }
+  };
+  return PostScriptParser;
+})();
+
+var PostScriptTokenTypes = {
+  LBRACE: 0,
+  RBRACE: 1,
+  NUMBER: 2,
+  OPERATOR: 3,
+  IF: 4,
+  IFELSE: 5
+};
+
+var PostScriptToken = (function PostScriptTokenClosure() {
+  function PostScriptToken(type, value) {
+    this.type = type;
+    this.value = value;
+  }
+
+  var opCache = {};
+
+  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
+    var opValue = opCache[op];
+    if (opValue) {
+      return opValue;
+    }
+    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
+  };
+
+  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
+    '{');
+  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
+    '}');
+  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
+  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
+    'IFELSE');
+  return PostScriptToken;
+})();
+
+var PostScriptLexer = (function PostScriptLexerClosure() {
+  function PostScriptLexer(stream) {
+    this.stream = stream;
+    this.nextChar();
+  }
+  PostScriptLexer.prototype = {
+    nextChar: function PostScriptLexer_nextChar() {
+      return (this.currentChar = this.stream.getByte());
+    },
+    getToken: function PostScriptLexer_getToken() {
+      var comment = false;
+      var ch = this.currentChar;
+
+      // skip comments
+      while (true) {
+        if (ch < 0) {
+          return EOF;
+        }
+
+        if (comment) {
+          if (ch === 0x0A || ch === 0x0D) {
+            comment = false;
+          }
+        } else if (ch == 0x25) { // '%'
+          comment = true;
+        } else if (!Lexer.isSpace(ch)) {
+          break;
+        }
+        ch = this.nextChar();
+      }
+      switch (ch | 0) {
+        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'
+        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'
+        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'
+          return new PostScriptToken(PostScriptTokenTypes.NUMBER,
+                                     this.getNumber());
+        case 0x7B: // '{'
+          this.nextChar();
+          return PostScriptToken.LBRACE;
+        case 0x7D: // '}'
+          this.nextChar();
+          return PostScriptToken.RBRACE;
+      }
+      // operator
+      var str = String.fromCharCode(ch);
+      while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z'
+             ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) {
+        str += String.fromCharCode(ch);
+      }
+      switch (str.toLowerCase()) {
+        case 'if':
+          return PostScriptToken.IF;
+        case 'ifelse':
+          return PostScriptToken.IFELSE;
+        default:
+          return PostScriptToken.getOperator(str);
+      }
+    },
+    getNumber: function PostScriptLexer_getNumber() {
+      var ch = this.currentChar;
+      var str = String.fromCharCode(ch);
+      while ((ch = this.nextChar()) >= 0) {
+        if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9'
+            ch === 0x2D || ch === 0x2E) { // '-', '.'
+          str += String.fromCharCode(ch);
+        } else {
+          break;
+        }
+      }
+      var value = parseFloat(str);
+      if (isNaN(value)) {
+        error('Invalid floating point number: ' + value);
+      }
+      return value;
+    }
+  };
+  return PostScriptLexer;
+})();
+
+
+var Stream = (function StreamClosure() {
+  function Stream(arrayBuffer, start, length, dict) {
+    this.bytes = (arrayBuffer instanceof Uint8Array ?
+                  arrayBuffer : new Uint8Array(arrayBuffer));
+    this.start = start || 0;
+    this.pos = this.start;
+    this.end = (start + length) || this.bytes.length;
+    this.dict = dict;
+  }
+
+  // required methods for a stream. if a particular stream does not
+  // implement these, an error should be thrown
+  Stream.prototype = {
+    get length() {
+      return this.end - this.start;
+    },
+    getByte: function Stream_getByte() {
+      if (this.pos >= this.end) {
+        return -1;
+      }
+      return this.bytes[this.pos++];
+    },
+    getUint16: function Stream_getUint16() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      return (b0 << 8) + b1;
+    },
+    getInt32: function Stream_getInt32() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      var b2 = this.getByte();
+      var b3 = this.getByte();
+      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+    },
+    // returns subarray of original buffer
+    // should only be read
+    getBytes: function Stream_getBytes(length) {
+      var bytes = this.bytes;
+      var pos = this.pos;
+      var strEnd = this.end;
+
+      if (!length) {
+        return bytes.subarray(pos, strEnd);
+      }
+      var end = pos + length;
+      if (end > strEnd) {
+        end = strEnd;
+      }
+      this.pos = end;
+      return bytes.subarray(pos, end);
+    },
+    peekBytes: function Stream_peekBytes(length) {
+      var bytes = this.getBytes(length);
+      this.pos -= bytes.length;
+      return bytes;
+    },
+    skip: function Stream_skip(n) {
+      if (!n) {
+        n = 1;
+      }
+      this.pos += n;
+    },
+    reset: function Stream_reset() {
+      this.pos = this.start;
+    },
+    moveStart: function Stream_moveStart() {
+      this.start = this.pos;
+    },
+    makeSubStream: function Stream_makeSubStream(start, length, dict) {
+      return new Stream(this.bytes.buffer, start, length, dict);
+    },
+    isStream: true
+  };
+
+  return Stream;
+})();
+
+var StringStream = (function StringStreamClosure() {
+  function StringStream(str) {
+    var length = str.length;
+    var bytes = new Uint8Array(length);
+    for (var n = 0; n < length; ++n) {
+      bytes[n] = str.charCodeAt(n);
+    }
+    Stream.call(this, bytes);
+  }
+
+  StringStream.prototype = Stream.prototype;
+
+  return StringStream;
+})();
+
+// super class for the decoding streams
+var DecodeStream = (function DecodeStreamClosure() {
+  function DecodeStream(maybeMinBufferLength) {
+    this.pos = 0;
+    this.bufferLength = 0;
+    this.eof = false;
+    this.buffer = null;
+    this.minBufferLength = 512;
+    if (maybeMinBufferLength) {
+      // Compute the first power of two that is as big as maybeMinBufferLength.
+      while (this.minBufferLength < maybeMinBufferLength) {
+        this.minBufferLength *= 2;
+      }
+    }
+  }
+
+  DecodeStream.prototype = {
+    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
+      var buffer = this.buffer;
+      var current;
+      if (buffer) {
+        current = buffer.byteLength;
+        if (requested <= current) {
+          return buffer;
+        }
+      } else {
+        current = 0;
+      }
+      var size = this.minBufferLength;
+      while (size < requested) {
+        size *= 2;
+      }
+      var buffer2 = new Uint8Array(size);
+      for (var i = 0; i < current; ++i) {
+        buffer2[i] = buffer[i];
+      }
+      return (this.buffer = buffer2);
+    },
+    getByte: function DecodeStream_getByte() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof) {
+          return -1;
+        }
+        this.readBlock();
+      }
+      return this.buffer[this.pos++];
+    },
+    getUint16: function DecodeStream_getUint16() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      return (b0 << 8) + b1;
+    },
+    getInt32: function DecodeStream_getInt32() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      var b2 = this.getByte();
+      var b3 = this.getByte();
+      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+    },
+    getBytes: function DecodeStream_getBytes(length) {
+      var end, pos = this.pos;
+
+      if (length) {
+        this.ensureBuffer(pos + length);
+        end = pos + length;
+
+        while (!this.eof && this.bufferLength < end) {
+          this.readBlock();
+        }
+        var bufEnd = this.bufferLength;
+        if (end > bufEnd) {
+          end = bufEnd;
+        }
+      } else {
+        while (!this.eof) {
+          this.readBlock();
+        }
+        end = this.bufferLength;
+
+        // checking if bufferLength is still 0 then
+        // the buffer has to be initialized
+        if (!end) {
+          this.buffer = new Uint8Array(0);
+        }
+      }
+
+      this.pos = end;
+      return this.buffer.subarray(pos, end);
+    },
+    peekBytes: function DecodeStream_peekBytes(length) {
+      var bytes = this.getBytes(length);
+      this.pos -= bytes.length;
+      return bytes;
+    },
+    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
+      var end = start + length;
+      while (this.bufferLength <= end && !this.eof) {
+        this.readBlock();
+      }
+      return new Stream(this.buffer, start, length, dict);
+    },
+    skip: function Stream_skip(n) {
+      if (!n) {
+        n = 1;
+      }
+      this.pos += n;
+    },
+    reset: function DecodeStream_reset() {
+      this.pos = 0;
+    },
+    getBaseStreams: function DecodeStream_getBaseStreams() {
+      if (this.str && this.str.getBaseStreams) {
+        return this.str.getBaseStreams();
+      }
+      return [];
+    }
+  };
+
+  return DecodeStream;
+})();
+
+var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
+  function StreamsSequenceStream(streams) {
+    this.streams = streams;
+    DecodeStream.call(this, /* maybeLength = */ null);
+  }
+
+  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
+
+  StreamsSequenceStream.prototype.readBlock =
+      function streamSequenceStreamReadBlock() {
+
+    var streams = this.streams;
+    if (streams.length === 0) {
+      this.eof = true;
+      return;
+    }
+    var stream = streams.shift();
+    var chunk = stream.getBytes();
+    var bufferLength = this.bufferLength;
+    var newLength = bufferLength + chunk.length;
+    var buffer = this.ensureBuffer(newLength);
+    buffer.set(chunk, bufferLength);
+    this.bufferLength = newLength;
+  };
+
+  StreamsSequenceStream.prototype.getBaseStreams =
+    function StreamsSequenceStream_getBaseStreams() {
+
+    var baseStreams = [];
+    for (var i = 0, ii = this.streams.length; i < ii; i++) {
+      var stream = this.streams[i];
+      if (stream.getBaseStreams) {
+        Util.concatenateToArray(baseStreams, stream.getBaseStreams());
+      }
+    }
+    return baseStreams;
+  };
+
+  return StreamsSequenceStream;
+})();
+
+var FlateStream = (function FlateStreamClosure() {
+  var codeLenCodeMap = new Uint32Array([
+    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+  ]);
+
+  var lengthDecode = new Uint32Array([
+    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
+    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
+    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
+    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
+  ]);
+
+  var distDecode = new Uint32Array([
+    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
+    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
+    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
+    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
+  ]);
+
+  var fixedLitCodeTab = [new Uint32Array([
+    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
+    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
+    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
+    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
+    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
+    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
+    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
+    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
+    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
+    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
+    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
+    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
+    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
+    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
+    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
+    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
+    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
+    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
+    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
+    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
+    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
+    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
+    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
+    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
+    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
+    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
+    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
+    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
+    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
+    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
+    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
+    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
+    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
+    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
+    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
+    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
+    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
+    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
+    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
+    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
+    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
+    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
+    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
+    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
+    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
+    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
+    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
+    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
+    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
+    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
+    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
+    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
+    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
+    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
+    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
+    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
+    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
+    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
+    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
+    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
+    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
+    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
+    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
+    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
+  ]), 9];
+
+  var fixedDistCodeTab = [new Uint32Array([
+    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
+    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
+    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
+    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
+  ]), 5];
+
+  function FlateStream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+
+    var cmf = str.getByte();
+    var flg = str.getByte();
+    if (cmf == -1 || flg == -1) {
+      error('Invalid header in flate stream: ' + cmf + ', ' + flg);
+    }
+    if ((cmf & 0x0f) != 0x08) {
+      error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
+    }
+    if ((((cmf << 8) + flg) % 31) !== 0) {
+      error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
+    }
+    if (flg & 0x20) {
+      error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
+    }
+
+    this.codeSize = 0;
+    this.codeBuf = 0;
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  FlateStream.prototype = Object.create(DecodeStream.prototype);
+
+  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
+    var str = this.str;
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+
+    var b;
+    while (codeSize < bits) {
+      if ((b = str.getByte()) === -1) {
+        error('Bad encoding in flate stream');
+      }
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
+    b = codeBuf & ((1 << bits) - 1);
+    this.codeBuf = codeBuf >> bits;
+    this.codeSize = codeSize -= bits;
+
+    return b;
+  };
+
+  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
+    var str = this.str;
+    var codes = table[0];
+    var maxLen = table[1];
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+
+    while (codeSize < maxLen) {
+      var b;
+      if ((b = str.getByte()) === -1) {
+        error('Bad encoding in flate stream');
+      }
+      codeBuf |= (b << codeSize);
+      codeSize += 8;
+    }
+    var code = codes[codeBuf & ((1 << maxLen) - 1)];
+    var codeLen = code >> 16;
+    var codeVal = code & 0xffff;
+    if (codeSize === 0 || codeSize < codeLen || codeLen === 0) {
+      error('Bad encoding in flate stream');
+    }
+    this.codeBuf = (codeBuf >> codeLen);
+    this.codeSize = (codeSize - codeLen);
+    return codeVal;
+  };
+
+  FlateStream.prototype.generateHuffmanTable =
+    function flateStreamGenerateHuffmanTable(lengths) {
+    var n = lengths.length;
+
+    // find max code length
+    var maxLen = 0;
+    var i;
+    for (i = 0; i < n; ++i) {
+      if (lengths[i] > maxLen) {
+        maxLen = lengths[i];
+      }
+    }
+
+    // build the table
+    var size = 1 << maxLen;
+    var codes = new Uint32Array(size);
+    for (var len = 1, code = 0, skip = 2;
+         len <= maxLen;
+         ++len, code <<= 1, skip <<= 1) {
+      for (var val = 0; val < n; ++val) {
+        if (lengths[val] == len) {
+          // bit-reverse the code
+          var code2 = 0;
+          var t = code;
+          for (i = 0; i < len; ++i) {
+            code2 = (code2 << 1) | (t & 1);
+            t >>= 1;
+          }
+
+          // fill the table entries
+          for (i = code2; i < size; i += skip) {
+            codes[i] = (len << 16) | val;
+          }
+          ++code;
+        }
+      }
+    }
+
+    return [codes, maxLen];
+  };
+
+  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
+    var buffer, len;
+    var str = this.str;
+    // read block header
+    var hdr = this.getBits(3);
+    if (hdr & 1) {
+      this.eof = true;
+    }
+    hdr >>= 1;
+
+    if (hdr === 0) { // uncompressed block
+      var b;
+
+      if ((b = str.getByte()) === -1) {
+        error('Bad block header in flate stream');
+      }
+      var blockLen = b;
+      if ((b = str.getByte()) === -1) {
+        error('Bad block header in flate stream');
+      }
+      blockLen |= (b << 8);
+      if ((b = str.getByte()) === -1) {
+        error('Bad block header in flate stream');
+      }
+      var check = b;
+      if ((b = str.getByte()) === -1) {
+        error('Bad block header in flate stream');
+      }
+      check |= (b << 8);
+      if (check != (~blockLen & 0xffff) &&
+          (blockLen !== 0 || check !== 0)) {
+        // Ignoring error for bad "empty" block (see issue 1277)
+        error('Bad uncompressed block length in flate stream');
+      }
+
+      this.codeBuf = 0;
+      this.codeSize = 0;
+
+      var bufferLength = this.bufferLength;
+      buffer = this.ensureBuffer(bufferLength + blockLen);
+      var end = bufferLength + blockLen;
+      this.bufferLength = end;
+      if (blockLen === 0) {
+        if (str.peekBytes(1).length === 0) {
+          this.eof = true;
+        }
+      } else {
+        for (var n = bufferLength; n < end; ++n) {
+          if ((b = str.getByte()) === -1) {
+            this.eof = true;
+            break;
+          }
+          buffer[n] = b;
+        }
+      }
+      return;
+    }
+
+    var litCodeTable;
+    var distCodeTable;
+    if (hdr == 1) { // compressed block, fixed codes
+      litCodeTable = fixedLitCodeTab;
+      distCodeTable = fixedDistCodeTab;
+    } else if (hdr == 2) { // compressed block, dynamic codes
+      var numLitCodes = this.getBits(5) + 257;
+      var numDistCodes = this.getBits(5) + 1;
+      var numCodeLenCodes = this.getBits(4) + 4;
+
+      // build the code lengths code table
+      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+
+      var i;
+      for (i = 0; i < numCodeLenCodes; ++i) {
+        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+      }
+      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+
+      // build the literal and distance code tables
+      len = 0;
+      i = 0;
+      var codes = numLitCodes + numDistCodes;
+      var codeLengths = new Uint8Array(codes);
+      var bitsLength, bitsOffset, what;
+      while (i < codes) {
+        var code = this.getCode(codeLenCodeTab);
+        if (code == 16) {
+          bitsLength = 2; bitsOffset = 3; what = len;
+        } else if (code == 17) {
+          bitsLength = 3; bitsOffset = 3; what = (len = 0);
+        } else if (code == 18) {
+          bitsLength = 7; bitsOffset = 11; what = (len = 0);
+        } else {
+          codeLengths[i++] = len = code;
+          continue;
+        }
+
+        var repeatLength = this.getBits(bitsLength) + bitsOffset;
+        while (repeatLength-- > 0) {
+          codeLengths[i++] = what;
+        }
+      }
+
+      litCodeTable =
+        this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+      distCodeTable =
+        this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+    } else {
+      error('Unknown block type in flate stream');
+    }
+
+    buffer = this.buffer;
+    var limit = buffer ? buffer.length : 0;
+    var pos = this.bufferLength;
+    while (true) {
+      var code1 = this.getCode(litCodeTable);
+      if (code1 < 256) {
+        if (pos + 1 >= limit) {
+          buffer = this.ensureBuffer(pos + 1);
+          limit = buffer.length;
+        }
+        buffer[pos++] = code1;
+        continue;
+      }
+      if (code1 == 256) {
+        this.bufferLength = pos;
+        return;
+      }
+      code1 -= 257;
+      code1 = lengthDecode[code1];
+      var code2 = code1 >> 16;
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
+      }
+      len = (code1 & 0xffff) + code2;
+      code1 = this.getCode(distCodeTable);
+      code1 = distDecode[code1];
+      code2 = code1 >> 16;
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
+      }
+      var dist = (code1 & 0xffff) + code2;
+      if (pos + len >= limit) {
+        buffer = this.ensureBuffer(pos + len);
+        limit = buffer.length;
+      }
+      for (var k = 0; k < len; ++k, ++pos) {
+        buffer[pos] = buffer[pos - dist];
+      }
+    }
+  };
+
+  return FlateStream;
+})();
+
+var PredictorStream = (function PredictorStreamClosure() {
+  function PredictorStream(str, maybeLength, params) {
+    var predictor = this.predictor = params.get('Predictor') || 1;
+
+    if (predictor <= 1) {
+      return str; // no prediction
+    }
+    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
+      error('Unsupported predictor: ' + predictor);
+    }
+
+    if (predictor === 2) {
+      this.readBlock = this.readBlockTiff;
+    } else {
+      this.readBlock = this.readBlockPng;
+    }
+
+    this.str = str;
+    this.dict = str.dict;
+
+    var colors = this.colors = params.get('Colors') || 1;
+    var bits = this.bits = params.get('BitsPerComponent') || 8;
+    var columns = this.columns = params.get('Columns') || 1;
+
+    this.pixBytes = (colors * bits + 7) >> 3;
+    this.rowBytes = (columns * colors * bits + 7) >> 3;
+
+    DecodeStream.call(this, maybeLength);
+    return this;
+  }
+
+  PredictorStream.prototype = Object.create(DecodeStream.prototype);
+
+  PredictorStream.prototype.readBlockTiff =
+      function predictorStreamReadBlockTiff() {
+    var rowBytes = this.rowBytes;
+
+    var bufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+    var bits = this.bits;
+    var colors = this.colors;
+
+    var rawBytes = this.str.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
+    if (this.eof) {
+      return;
+    }
+
+    var inbuf = 0, outbuf = 0;
+    var inbits = 0, outbits = 0;
+    var pos = bufferLength;
+    var i;
+
+    if (bits === 1) {
+      for (i = 0; i < rowBytes; ++i) {
+        var c = rawBytes[i];
+        inbuf = (inbuf << 8) | c;
+        // bitwise addition is exclusive or
+        // first shift inbuf and then add
+        buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
+        // truncate inbuf (assumes colors < 16)
+        inbuf &= 0xFFFF;
+      }
+    } else if (bits === 8) {
+      for (i = 0; i < colors; ++i) {
+        buffer[pos++] = rawBytes[i];
+      }
+      for (; i < rowBytes; ++i) {
+        buffer[pos] = buffer[pos - colors] + rawBytes[i];
+        pos++;
+      }
+    } else {
+      var compArray = new Uint8Array(colors + 1);
+      var bitMask = (1 << bits) - 1;
+      var j = 0, k = bufferLength;
+      var columns = this.columns;
+      for (i = 0; i < columns; ++i) {
+        for (var kk = 0; kk < colors; ++kk) {
+          if (inbits < bits) {
+            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
+            inbits += 8;
+          }
+          compArray[kk] = (compArray[kk] +
+                           (inbuf >> (inbits - bits))) & bitMask;
+          inbits -= bits;
+          outbuf = (outbuf << bits) | compArray[kk];
+          outbits += bits;
+          if (outbits >= 8) {
+            buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
+            outbits -= 8;
+          }
+        }
+      }
+      if (outbits > 0) {
+        buffer[k++] = (outbuf << (8 - outbits)) +
+                      (inbuf & ((1 << (8 - outbits)) - 1));
+      }
+    }
+    this.bufferLength += rowBytes;
+  };
+
+  PredictorStream.prototype.readBlockPng =
+      function predictorStreamReadBlockPng() {
+
+    var rowBytes = this.rowBytes;
+    var pixBytes = this.pixBytes;
+
+    var predictor = this.str.getByte();
+    var rawBytes = this.str.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
+    if (this.eof) {
+      return;
+    }
+
+    var bufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
+    if (prevRow.length === 0) {
+      prevRow = new Uint8Array(rowBytes);
+    }
+
+    var i, j = bufferLength, up, c;
+    switch (predictor) {
+      case 0:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
+        break;
+      case 1:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
+          j++;
+        }
+        break;
+      case 2:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
+        }
+        break;
+      case 3:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
+        }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
+                           rawBytes[i]) & 0xFF;
+          j++;
+        }
+        break;
+      case 4:
+        // we need to save the up left pixels values. the simplest way
+        // is to create a new buffer
+        for (i = 0; i < pixBytes; ++i) {
+          up = prevRow[i];
+          c = rawBytes[i];
+          buffer[j++] = up + c;
+        }
+        for (; i < rowBytes; ++i) {
+          up = prevRow[i];
+          var upLeft = prevRow[i - pixBytes];
+          var left = buffer[j - pixBytes];
+          var p = left + up - upLeft;
+
+          var pa = p - left;
+          if (pa < 0) {
+            pa = -pa;
+          }
+          var pb = p - up;
+          if (pb < 0) {
+            pb = -pb;
+          }
+          var pc = p - upLeft;
+          if (pc < 0) {
+            pc = -pc;
+          }
+
+          c = rawBytes[i];
+          if (pa <= pb && pa <= pc) {
+            buffer[j++] = left + c;
+          } else if (pb <= pc) {
+            buffer[j++] = up + c;
+          } else {
+            buffer[j++] = upLeft + c;
+          }
+        }
+        break;
+      default:
+        error('Unsupported predictor: ' + predictor);
+    }
+    this.bufferLength += rowBytes;
+  };
+
+  return PredictorStream;
+})();
+
+/**
+ * Depending on the type of JPEG a JpegStream is handled in different ways. For
+ * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
+ * data is stored and then loaded by the browser.  For unsupported JPEG's we use
+ * a library to decode these images and the stream behaves like all the other
+ * DecodeStreams.
+ */
+var JpegStream = (function JpegStreamClosure() {
+  function JpegStream(stream, maybeLength, dict, xref) {
+    // TODO: per poppler, some images may have 'junk' before that
+    // need to be removed
+    this.stream = stream;
+    this.maybeLength = maybeLength;
+    this.dict = dict;
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  JpegStream.prototype = Object.create(DecodeStream.prototype);
+
+  Object.defineProperty(JpegStream.prototype, 'bytes', {
+    get: function JpegStream_bytes() {
+      // If this.maybeLength is null, we'll get the entire stream.
+      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
+    },
+    configurable: true
+  });
+
+  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
+    if (this.bufferLength) {
+      return;
+    }
+    try {
+      var jpegImage = new JpegImage();
+      if (this.colorTransform != -1) {
+        jpegImage.colorTransform = this.colorTransform;
+      }
+      jpegImage.parse(this.bytes);
+      var width = jpegImage.width;
+      var height = jpegImage.height;
+      var data = jpegImage.getData(width, height);
+      this.buffer = data;
+      this.bufferLength = data.length;
+      this.eof = true;
+    } catch (e) {
+      error('JPEG error: ' + e);
+    }
+  };
+  JpegStream.prototype.getIR = function JpegStream_getIR() {
+    return PDFJS.createObjectURL(this.bytes, 'image/jpeg');
+  };
+  /**
+   * Checks if the image can be decoded and displayed by the browser without any
+   * further processing such as color space conversions.
+   */
+  JpegStream.prototype.isNativelySupported =
+      function JpegStream_isNativelySupported(xref, res) {
+    var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
+    return cs.name === 'DeviceGray' || cs.name === 'DeviceRGB';
+  };
+  /**
+   * Checks if the image can be decoded by the browser.
+   */
+  JpegStream.prototype.isNativelyDecodable =
+      function JpegStream_isNativelyDecodable(xref, res) {
+    var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
+    var numComps = cs.numComps;
+    return numComps == 1 || numComps == 3;
+  };
+
+  return JpegStream;
+})();
+
+/**
+ * For JPEG 2000's we use a library to decode these images and
+ * the stream behaves like all the other DecodeStreams.
+ */
+var JpxStream = (function JpxStreamClosure() {
+  function JpxStream(stream, maybeLength, dict) {
+    this.stream = stream;
+    this.maybeLength = maybeLength;
+    this.dict = dict;
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  JpxStream.prototype = Object.create(DecodeStream.prototype);
+
+  Object.defineProperty(JpxStream.prototype, 'bytes', {
+    get: function JpxStream_bytes() {
+      // If this.maybeLength is null, we'll get the entire stream.
+      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
+    },
+    configurable: true
+  });
+
+  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
+    if (this.bufferLength) {
+      return;
+    }
+
+    var jpxImage = new JpxImage();
+    jpxImage.parse(this.bytes);
+
+    var width = jpxImage.width;
+    var height = jpxImage.height;
+    var componentsCount = jpxImage.componentsCount;
+    var tileCount = jpxImage.tiles.length;
+    if (tileCount === 1) {
+      this.buffer = jpxImage.tiles[0].items;
+    } else {
+      var data = new Uint8Array(width * height * componentsCount);
+
+      for (var k = 0; k < tileCount; k++) {
+        var tileComponents = jpxImage.tiles[k];
+        var tileWidth = tileComponents.width;
+        var tileHeight = tileComponents.height;
+        var tileLeft = tileComponents.left;
+        var tileTop = tileComponents.top;
+
+        var src = tileComponents.items;
+        var srcPosition = 0;
+        var dataPosition = (width * tileTop + tileLeft) * componentsCount;
+        var imgRowSize = width * componentsCount;
+        var tileRowSize = tileWidth * componentsCount;
+
+        for (var j = 0; j < tileHeight; j++) {
+          var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);
+          data.set(rowBytes, dataPosition);
+          srcPosition += tileRowSize;
+          dataPosition += imgRowSize;
+        }
+      }
+      this.buffer = data;
+    }
+    this.bufferLength = this.buffer.length;
+    this.eof = true;
+  };
+
+  return JpxStream;
+})();
+
+/**
+ * For JBIG2's we use a library to decode these images and
+ * the stream behaves like all the other DecodeStreams.
+ */
+var Jbig2Stream = (function Jbig2StreamClosure() {
+  function Jbig2Stream(stream, maybeLength, dict) {
+    this.stream = stream;
+    this.maybeLength = maybeLength;
+    this.dict = dict;
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  Jbig2Stream.prototype = Object.create(DecodeStream.prototype);
+
+  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {
+    get: function Jbig2Stream_bytes() {
+      // If this.maybeLength is null, we'll get the entire stream.
+      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
+    },
+    configurable: true
+  });
+
+  Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {
+    if (this.bufferLength) {
+      return;
+    }
+
+    var jbig2Image = new Jbig2Image();
+
+    var chunks = [], decodeParams = this.dict.get('DecodeParms');
+
+    // According to the PDF specification, DecodeParms can be either
+    // a dictionary, or an array whose elements are dictionaries.
+    if (isArray(decodeParams)) {
+      if (decodeParams.length > 1) {
+        warn('JBIG2 - \'DecodeParms\' array with multiple elements ' +
+             'not supported.');
+      }
+      decodeParams = decodeParams[0];
+    }
+    if (decodeParams && decodeParams.has('JBIG2Globals')) {
+      var globalsStream = decodeParams.get('JBIG2Globals');
+      var globals = globalsStream.getBytes();
+      chunks.push({data: globals, start: 0, end: globals.length});
+    }
+    chunks.push({data: this.bytes, start: 0, end: this.bytes.length});
+    var data = jbig2Image.parseChunks(chunks);
+    var dataLength = data.length;
+
+    // JBIG2 had black as 1 and white as 0, inverting the colors
+    for (var i = 0; i < dataLength; i++) {
+      data[i] ^= 0xFF;
+    }
+
+    this.buffer = data;
+    this.bufferLength = dataLength;
+    this.eof = true;
+  };
+
+  return Jbig2Stream;
+})();
+
+var DecryptStream = (function DecryptStreamClosure() {
+  function DecryptStream(str, maybeLength, decrypt) {
+    this.str = str;
+    this.dict = str.dict;
+    this.decrypt = decrypt;
+    this.nextChunk = null;
+    this.initialized = false;
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  var chunkSize = 512;
+
+  DecryptStream.prototype = Object.create(DecodeStream.prototype);
+
+  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
+    var chunk;
+    if (this.initialized) {
+      chunk = this.nextChunk;
+    } else {
+      chunk = this.str.getBytes(chunkSize);
+      this.initialized = true;
+    }
+    if (!chunk || chunk.length === 0) {
+      this.eof = true;
+      return;
+    }
+    this.nextChunk = this.str.getBytes(chunkSize);
+    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;
+
+    var decrypt = this.decrypt;
+    chunk = decrypt(chunk, !hasMoreData);
+
+    var bufferLength = this.bufferLength;
+    var i, n = chunk.length;
+    var buffer = this.ensureBuffer(bufferLength + n);
+    for (i = 0; i < n; i++) {
+      buffer[bufferLength++] = chunk[i];
+    }
+    this.bufferLength = bufferLength;
+  };
+
+  return DecryptStream;
+})();
+
+var Ascii85Stream = (function Ascii85StreamClosure() {
+  function Ascii85Stream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+    this.input = new Uint8Array(5);
+
+    // Most streams increase in size when decoded, but Ascii85 streams
+    // typically shrink by ~20%.
+    if (maybeLength) {
+      maybeLength = 0.8 * maybeLength;
+    }
+    DecodeStream.call(this, maybeLength);
+  }
+
+  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
+
+  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
+    var TILDA_CHAR = 0x7E; // '~'
+    var Z_LOWER_CHAR = 0x7A; // 'z'
+    var EOF = -1;
+
+    var str = this.str;
+
+    var c = str.getByte();
+    while (Lexer.isSpace(c)) {
+      c = str.getByte();
+    }
+
+    if (c === EOF || c === TILDA_CHAR) {
+      this.eof = true;
+      return;
+    }
+
+    var bufferLength = this.bufferLength, buffer;
+    var i;
+
+    // special code for z
+    if (c == Z_LOWER_CHAR) {
+      buffer = this.ensureBuffer(bufferLength + 4);
+      for (i = 0; i < 4; ++i) {
+        buffer[bufferLength + i] = 0;
+      }
+      this.bufferLength += 4;
+    } else {
+      var input = this.input;
+      input[0] = c;
+      for (i = 1; i < 5; ++i) {
+        c = str.getByte();
+        while (Lexer.isSpace(c)) {
+          c = str.getByte();
+        }
+
+        input[i] = c;
+
+        if (c === EOF || c == TILDA_CHAR) {
+          break;
+        }
+      }
+      buffer = this.ensureBuffer(bufferLength + i - 1);
+      this.bufferLength += i - 1;
+
+      // partial ending;
+      if (i < 5) {
+        for (; i < 5; ++i) {
+          input[i] = 0x21 + 84;
+        }
+        this.eof = true;
+      }
+      var t = 0;
+      for (i = 0; i < 5; ++i) {
+        t = t * 85 + (input[i] - 0x21);
+      }
+
+      for (i = 3; i >= 0; --i) {
+        buffer[bufferLength + i] = t & 0xFF;
+        t >>= 8;
+      }
+    }
+  };
+
+  return Ascii85Stream;
+})();
+
+var AsciiHexStream = (function AsciiHexStreamClosure() {
+  function AsciiHexStream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+
+    this.firstDigit = -1;
+
+    // Most streams increase in size when decoded, but AsciiHex streams shrink
+    // by 50%.
+    if (maybeLength) {
+      maybeLength = 0.5 * maybeLength;
+    }
+    DecodeStream.call(this, maybeLength);
+  }
+
+  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
+
+  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
+    var UPSTREAM_BLOCK_SIZE = 8000;
+    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);
+    if (!bytes.length) {
+      this.eof = true;
+      return;
+    }
+
+    var maxDecodeLength = (bytes.length + 1) >> 1;
+    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
+    var bufferLength = this.bufferLength;
+
+    var firstDigit = this.firstDigit;
+    for (var i = 0, ii = bytes.length; i < ii; i++) {
+      var ch = bytes[i], digit;
+      if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'
+        digit = ch & 0x0F;
+      } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {
+        // 'A'-'Z', 'a'-'z'
+        digit = (ch & 0x0F) + 9;
+      } else if (ch === 0x3E) { // '>'
+        this.eof = true;
+        break;
+      } else { // probably whitespace
+        continue; // ignoring
+      }
+      if (firstDigit < 0) {
+        firstDigit = digit;
+      } else {
+        buffer[bufferLength++] = (firstDigit << 4) | digit;
+        firstDigit = -1;
+      }
+    }
+    if (firstDigit >= 0 && this.eof) {
+      // incomplete byte
+      buffer[bufferLength++] = (firstDigit << 4);
+      firstDigit = -1;
+    }
+    this.firstDigit = firstDigit;
+    this.bufferLength = bufferLength;
+  };
+
+  return AsciiHexStream;
+})();
+
+var RunLengthStream = (function RunLengthStreamClosure() {
+  function RunLengthStream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  RunLengthStream.prototype = Object.create(DecodeStream.prototype);
+
+  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
+    // The repeatHeader has following format. The first byte defines type of run
+    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
+    // (in addition to the second byte from the header), n = 129 through 255 -
+    // duplicate the second byte from the header (257 - n) times, n = 128 - end.
+    var repeatHeader = this.str.getBytes(2);
+    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) {
+      this.eof = true;
+      return;
+    }
+
+    var buffer;
+    var bufferLength = this.bufferLength;
+    var n = repeatHeader[0];
+    if (n < 128) {
+      // copy n bytes
+      buffer = this.ensureBuffer(bufferLength + n + 1);
+      buffer[bufferLength++] = repeatHeader[1];
+      if (n > 0) {
+        var source = this.str.getBytes(n);
+        buffer.set(source, bufferLength);
+        bufferLength += n;
+      }
+    } else {
+      n = 257 - n;
+      var b = repeatHeader[1];
+      buffer = this.ensureBuffer(bufferLength + n + 1);
+      for (var i = 0; i < n; i++) {
+        buffer[bufferLength++] = b;
+      }
+    }
+    this.bufferLength = bufferLength;
+  };
+
+  return RunLengthStream;
+})();
+
+var CCITTFaxStream = (function CCITTFaxStreamClosure() {
+
+  var ccittEOL = -2;
+  var twoDimPass = 0;
+  var twoDimHoriz = 1;
+  var twoDimVert0 = 2;
+  var twoDimVertR1 = 3;
+  var twoDimVertL1 = 4;
+  var twoDimVertR2 = 5;
+  var twoDimVertL2 = 6;
+  var twoDimVertR3 = 7;
+  var twoDimVertL3 = 8;
+
+  var twoDimTable = [
+    [-1, -1], [-1, -1],                   // 000000x
+    [7, twoDimVertL3],                    // 0000010
+    [7, twoDimVertR3],                    // 0000011
+    [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
+    [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
+    [4, twoDimPass], [4, twoDimPass],     // 0001xxx
+    [4, twoDimPass], [4, twoDimPass],
+    [4, twoDimPass], [4, twoDimPass],
+    [4, twoDimPass], [4, twoDimPass],
+    [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0]
+  ];
+
+  var whiteTable1 = [
+    [-1, -1],                               // 00000
+    [12, ccittEOL],                         // 00001
+    [-1, -1], [-1, -1],                     // 0001x
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
+    [11, 1792], [11, 1792],                 // 1000x
+    [12, 1984],                             // 10010
+    [12, 2048],                             // 10011
+    [12, 2112],                             // 10100
+    [12, 2176],                             // 10101
+    [12, 2240],                             // 10110
+    [12, 2304],                             // 10111
+    [11, 1856], [11, 1856],                 // 1100x
+    [11, 1920], [11, 1920],                 // 1101x
+    [12, 2368],                             // 11100
+    [12, 2432],                             // 11101
+    [12, 2496],                             // 11110
+    [12, 2560]                              // 11111
+  ];
+
+  var whiteTable2 = [
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx
+    [8, 29], [8, 29],                           // 00000010x
+    [8, 30], [8, 30],                           // 00000011x
+    [8, 45], [8, 45],                           // 00000100x
+    [8, 46], [8, 46],                           // 00000101x
+    [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx
+    [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx
+    [8, 47], [8, 47],                           // 00001010x
+    [8, 48], [8, 48],                           // 00001011x
+    [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx
+    [6, 13], [6, 13], [6, 13], [6, 13],
+    [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx
+    [8, 33], [8, 33],                           // 00010010x
+    [8, 34], [8, 34],                           // 00010011x
+    [8, 35], [8, 35],                           // 00010100x
+    [8, 36], [8, 36],                           // 00010101x
+    [8, 37], [8, 37],                           // 00010110x
+    [8, 38], [8, 38],                           // 00010111x
+    [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx
+    [8, 31], [8, 31],                           // 00011010x
+    [8, 32], [8, 32],                           // 00011011x
+    [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx
+    [6, 1], [6, 1], [6, 1], [6, 1],
+    [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx
+    [6, 12], [6, 12], [6, 12], [6, 12],
+    [8, 53], [8, 53],                           // 00100100x
+    [8, 54], [8, 54],                           // 00100101x
+    [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx
+    [8, 39], [8, 39],                           // 00101000x
+    [8, 40], [8, 40],                           // 00101001x
+    [8, 41], [8, 41],                           // 00101010x
+    [8, 42], [8, 42],                           // 00101011x
+    [8, 43], [8, 43],                           // 00101100x
+    [8, 44], [8, 44],                           // 00101101x
+    [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx
+    [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx
+    [8, 61], [8, 61],                           // 00110010x
+    [8, 62], [8, 62],                           // 00110011x
+    [8, 63], [8, 63],                           // 00110100x
+    [8, 0], [8, 0],                             // 00110101x
+    [8, 320], [8, 320],                         // 00110110x
+    [8, 384], [8, 384],                         // 00110111x
+    [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx
+    [5, 10], [5, 10], [5, 10], [5, 10],
+    [5, 10], [5, 10], [5, 10], [5, 10],
+    [5, 10], [5, 10], [5, 10], [5, 10],
+    [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx
+    [5, 11], [5, 11], [5, 11], [5, 11],
+    [5, 11], [5, 11], [5, 11], [5, 11],
+    [5, 11], [5, 11], [5, 11], [5, 11],
+    [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx
+    [8, 59], [8, 59],                           // 01001010x
+    [8, 60], [8, 60],                           // 01001011x
+    [9, 1472],                                  // 010011000
+    [9, 1536],                                  // 010011001
+    [9, 1600],                                  // 010011010
+    [9, 1728],                                  // 010011011
+    [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx
+    [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx
+    [8, 49], [8, 49],                           // 01010010x
+    [8, 50], [8, 50],                           // 01010011x
+    [8, 51], [8, 51],                           // 01010100x
+    [8, 52], [8, 52],                           // 01010101x
+    [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx
+    [8, 55], [8, 55],                           // 01011000x
+    [8, 56], [8, 56],                           // 01011001x
+    [8, 57], [8, 57],                           // 01011010x
+    [8, 58], [8, 58],                           // 01011011x
+    [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx
+    [6, 192], [6, 192], [6, 192], [6, 192],
+    [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
+    [6, 1664], [6, 1664], [6, 1664], [6, 1664],
+    [8, 448], [8, 448],                         // 01100100x
+    [8, 512], [8, 512],                         // 01100101x
+    [9, 704],                                   // 011001100
+    [9, 768],                                   // 011001101
+    [8, 640], [8, 640],                         // 01100111x
+    [8, 576], [8, 576],                         // 01101000x
+    [9, 832],                                   // 011010010
+    [9, 896],                                   // 011010011
+    [9, 960],                                   // 011010100
+    [9, 1024],                                  // 011010101
+    [9, 1088],                                  // 011010110
+    [9, 1152],                                  // 011010111
+    [9, 1216],                                  // 011011000
+    [9, 1280],                                  // 011011001
+    [9, 1344],                                  // 011011010
+    [9, 1408],                                  // 011011011
+    [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx
+    [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx
+    [5, 128], [5, 128], [5, 128], [5, 128],
+    [5, 128], [5, 128], [5, 128], [5, 128],
+    [5, 128], [5, 128], [5, 128], [5, 128],
+    [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx
+    [5, 8], [5, 8], [5, 8], [5, 8],
+    [5, 8], [5, 8], [5, 8], [5, 8],
+    [5, 8], [5, 8], [5, 8], [5, 8],
+    [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx
+    [5, 9], [5, 9], [5, 9], [5, 9],
+    [5, 9], [5, 9], [5, 9], [5, 9],
+    [5, 9], [5, 9], [5, 9], [5, 9],
+    [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx
+    [6, 16], [6, 16], [6, 16], [6, 16],
+    [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx
+    [6, 17], [6, 17], [6, 17], [6, 17],
+    [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx
+    [6, 14], [6, 14], [6, 14], [6, 14],
+    [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx
+    [6, 15], [6, 15], [6, 15], [6, 15],
+    [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx
+    [5, 64], [5, 64], [5, 64], [5, 64],
+    [5, 64], [5, 64], [5, 64], [5, 64],
+    [5, 64], [5, 64], [5, 64], [5, 64],
+    [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7]
+  ];
+
+  var blackTable1 = [
+    [-1, -1], [-1, -1],                             // 000000000000x
+    [12, ccittEOL], [12, ccittEOL],                 // 000000000001x
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx
+    [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
+    [12, 1984], [12, 1984],                         // 000000010010x
+    [12, 2048], [12, 2048],                         // 000000010011x
+    [12, 2112], [12, 2112],                         // 000000010100x
+    [12, 2176], [12, 2176],                         // 000000010101x
+    [12, 2240], [12, 2240],                         // 000000010110x
+    [12, 2304], [12, 2304],                         // 000000010111x
+    [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
+    [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
+    [12, 2368], [12, 2368],                         // 000000011100x
+    [12, 2432], [12, 2432],                         // 000000011101x
+    [12, 2496], [12, 2496],                         // 000000011110x
+    [12, 2560], [12, 2560],                         // 000000011111x
+    [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx
+    [10, 18], [10, 18], [10, 18], [10, 18],
+    [12, 52], [12, 52],                             // 000000100100x
+    [13, 640],                                      // 0000001001010
+    [13, 704],                                      // 0000001001011
+    [13, 768],                                      // 0000001001100
+    [13, 832],                                      // 0000001001101
+    [12, 55], [12, 55],                             // 000000100111x
+    [12, 56], [12, 56],                             // 000000101000x
+    [13, 1280],                                     // 0000001010010
+    [13, 1344],                                     // 0000001010011
+    [13, 1408],                                     // 0000001010100
+    [13, 1472],                                     // 0000001010101
+    [12, 59], [12, 59],                             // 000000101011x
+    [12, 60], [12, 60],                             // 000000101100x
+    [13, 1536],                                     // 0000001011010
+    [13, 1600],                                     // 0000001011011
+    [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx
+    [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx
+    [13, 1664],                                     // 0000001100100
+    [13, 1728],                                     // 0000001100101
+    [12, 320], [12, 320],                           // 000000110011x
+    [12, 384], [12, 384],                           // 000000110100x
+    [12, 448], [12, 448],                           // 000000110101x
+    [13, 512],                                      // 0000001101100
+    [13, 576],                                      // 0000001101101
+    [12, 53], [12, 53],                             // 000000110111x
+    [12, 54], [12, 54],                             // 000000111000x
+    [13, 896],                                      // 0000001110010
+    [13, 960],                                      // 0000001110011
+    [13, 1024],                                     // 0000001110100
+    [13, 1088],                                     // 0000001110101
+    [13, 1152],                                     // 0000001110110
+    [13, 1216],                                     // 0000001110111
+    [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx
+    [10, 64], [10, 64], [10, 64], [10, 64]
+  ];
+
+  var blackTable2 = [
+    [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx
+    [8, 13], [8, 13], [8, 13], [8, 13],
+    [8, 13], [8, 13], [8, 13], [8, 13],
+    [8, 13], [8, 13], [8, 13], [8, 13],
+    [11, 23], [11, 23],                     // 00000101000x
+    [12, 50],                               // 000001010010
+    [12, 51],                               // 000001010011
+    [12, 44],                               // 000001010100
+    [12, 45],                               // 000001010101
+    [12, 46],                               // 000001010110
+    [12, 47],                               // 000001010111
+    [12, 57],                               // 000001011000
+    [12, 58],                               // 000001011001
+    [12, 61],                               // 000001011010
+    [12, 256],                              // 000001011011
+    [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
+    [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
+    [12, 48],                               // 000001100100
+    [12, 49],                               // 000001100101
+    [12, 62],                               // 000001100110
+    [12, 63],                               // 000001100111
+    [12, 30],                               // 000001101000
+    [12, 31],                               // 000001101001
+    [12, 32],                               // 000001101010
+    [12, 33],                               // 000001101011
+    [12, 40],                               // 000001101100
+    [12, 41],                               // 000001101101
+    [11, 22], [11, 22],                     // 00000110111x
+    [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx
+    [8, 14], [8, 14], [8, 14], [8, 14],
+    [8, 14], [8, 14], [8, 14], [8, 14],
+    [8, 14], [8, 14], [8, 14], [8, 14],
+    [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx
+    [9, 15], [9, 15], [9, 15], [9, 15],
+    [12, 128],                              // 000011001000
+    [12, 192],                              // 000011001001
+    [12, 26],                               // 000011001010
+    [12, 27],                               // 000011001011
+    [12, 28],                               // 000011001100
+    [12, 29],                               // 000011001101
+    [11, 19], [11, 19],                     // 00001100111x
+    [11, 20], [11, 20],                     // 00001101000x
+    [12, 34],                               // 000011010010
+    [12, 35],                               // 000011010011
+    [12, 36],                               // 000011010100
+    [12, 37],                               // 000011010101
+    [12, 38],                               // 000011010110
+    [12, 39],                               // 000011010111
+    [11, 21], [11, 21],                     // 00001101100x
+    [12, 42],                               // 000011011010
+    [12, 43],                               // 000011011011
+    [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx
+    [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12]
+  ];
+
+  var blackTable3 = [
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
+    [6, 9],                                 // 000100
+    [6, 8],                                 // 000101
+    [5, 7], [5, 7],                         // 00011x
+    [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx
+    [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx
+    [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx
+    [3, 1], [3, 1], [3, 1], [3, 1],
+    [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx
+    [3, 4], [3, 4], [3, 4], [3, 4],
+    [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx
+    [2, 3], [2, 3], [2, 3], [2, 3],
+    [2, 3], [2, 3], [2, 3], [2, 3],
+    [2, 3], [2, 3], [2, 3], [2, 3],
+    [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx
+    [2, 2], [2, 2], [2, 2], [2, 2],
+    [2, 2], [2, 2], [2, 2], [2, 2],
+    [2, 2], [2, 2], [2, 2], [2, 2]
+  ];
+
+  function CCITTFaxStream(str, maybeLength, params) {
+    this.str = str;
+    this.dict = str.dict;
+
+    params = params || Dict.empty;
+
+    this.encoding = params.get('K') || 0;
+    this.eoline = params.get('EndOfLine') || false;
+    this.byteAlign = params.get('EncodedByteAlign') || false;
+    this.columns = params.get('Columns') || 1728;
+    this.rows = params.get('Rows') || 0;
+    var eoblock = params.get('EndOfBlock');
+    if (eoblock === null || eoblock === undefined) {
+      eoblock = true;
+    }
+    this.eoblock = eoblock;
+    this.black = params.get('BlackIs1') || false;
+
+    this.codingLine = new Uint32Array(this.columns + 1);
+    this.refLine = new Uint32Array(this.columns + 2);
+
+    this.codingLine[0] = this.columns;
+    this.codingPos = 0;
+
+    this.row = 0;
+    this.nextLine2D = this.encoding < 0;
+    this.inputBits = 0;
+    this.inputBuf = 0;
+    this.outputBits = 0;
+
+    var code1;
+    while ((code1 = this.lookBits(12)) === 0) {
+      this.eatBits(1);
+    }
+    if (code1 == 1) {
+      this.eatBits(12);
+    }
+    if (this.encoding > 0) {
+      this.nextLine2D = !this.lookBits(1);
+      this.eatBits(1);
+    }
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
+
+  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
+    while (!this.eof) {
+      var c = this.lookChar();
+      this.ensureBuffer(this.bufferLength + 1);
+      this.buffer[this.bufferLength++] = c;
+    }
+  };
+
+  CCITTFaxStream.prototype.addPixels =
+      function ccittFaxStreamAddPixels(a1, blackPixels) {
+    var codingLine = this.codingLine;
+    var codingPos = this.codingPos;
+
+    if (a1 > codingLine[codingPos]) {
+      if (a1 > this.columns) {
+        info('row is wrong length');
+        this.err = true;
+        a1 = this.columns;
+      }
+      if ((codingPos & 1) ^ blackPixels) {
+        ++codingPos;
+      }
+
+      codingLine[codingPos] = a1;
+    }
+    this.codingPos = codingPos;
+  };
+
+  CCITTFaxStream.prototype.addPixelsNeg =
+      function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
+    var codingLine = this.codingLine;
+    var codingPos = this.codingPos;
+
+    if (a1 > codingLine[codingPos]) {
+      if (a1 > this.columns) {
+        info('row is wrong length');
+        this.err = true;
+        a1 = this.columns;
+      }
+      if ((codingPos & 1) ^ blackPixels) {
+        ++codingPos;
+      }
+
+      codingLine[codingPos] = a1;
+    } else if (a1 < codingLine[codingPos]) {
+      if (a1 < 0) {
+        info('invalid code');
+        this.err = true;
+        a1 = 0;
+      }
+      while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
+        --codingPos;
+      }
+      codingLine[codingPos] = a1;
+    }
+
+    this.codingPos = codingPos;
+  };
+
+  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
+    var refLine = this.refLine;
+    var codingLine = this.codingLine;
+    var columns = this.columns;
+
+    var refPos, blackPixels, bits, i;
+
+    if (this.outputBits === 0) {
+      if (this.eof) {
+        return null;
+      }
+      this.err = false;
+
+      var code1, code2, code3;
+      if (this.nextLine2D) {
+        for (i = 0; codingLine[i] < columns; ++i) {
+          refLine[i] = codingLine[i];
+        }
+        refLine[i++] = columns;
+        refLine[i] = columns;
+        codingLine[0] = 0;
+        this.codingPos = 0;
+        refPos = 0;
+        blackPixels = 0;
+
+        while (codingLine[this.codingPos] < columns) {
+          code1 = this.getTwoDimCode();
+          switch (code1) {
+            case twoDimPass:
+              this.addPixels(refLine[refPos + 1], blackPixels);
+              if (refLine[refPos + 1] < columns) {
+                refPos += 2;
+              }
+              break;
+            case twoDimHoriz:
+              code1 = code2 = 0;
+              if (blackPixels) {
+                do {
+                  code1 += (code3 = this.getBlackCode());
+                } while (code3 >= 64);
+                do {
+                  code2 += (code3 = this.getWhiteCode());
+                } while (code3 >= 64);
+              } else {
+                do {
+                  code1 += (code3 = this.getWhiteCode());
+                } while (code3 >= 64);
+                do {
+                  code2 += (code3 = this.getBlackCode());
+                } while (code3 >= 64);
+              }
+              this.addPixels(codingLine[this.codingPos] +
+                             code1, blackPixels);
+              if (codingLine[this.codingPos] < columns) {
+                this.addPixels(codingLine[this.codingPos] + code2,
+                               blackPixels ^ 1);
+              }
+              while (refLine[refPos] <= codingLine[this.codingPos] &&
+                     refLine[refPos] < columns) {
+                refPos += 2;
+              }
+              break;
+            case twoDimVertR3:
+              this.addPixels(refLine[refPos] + 3, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case twoDimVertR2:
+              this.addPixels(refLine[refPos] + 2, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case twoDimVertR1:
+              this.addPixels(refLine[refPos] + 1, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case twoDimVert0:
+              this.addPixels(refLine[refPos], blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case twoDimVertL3:
+              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0) {
+                  --refPos;
+                } else {
+                  ++refPos;
+                }
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case twoDimVertL2:
+              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0) {
+                  --refPos;
+                } else {
+                  ++refPos;
+                }
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case twoDimVertL1:
+              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0) {
+                  --refPos;
+                } else {
+                  ++refPos;
+                }
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case EOF:
+              this.addPixels(columns, 0);
+              this.eof = true;
+              break;
+            default:
+              info('bad 2d code');
+              this.addPixels(columns, 0);
+              this.err = true;
+          }
+        }
+      } else {
+        codingLine[0] = 0;
+        this.codingPos = 0;
+        blackPixels = 0;
+        while (codingLine[this.codingPos] < columns) {
+          code1 = 0;
+          if (blackPixels) {
+            do {
+              code1 += (code3 = this.getBlackCode());
+            } while (code3 >= 64);
+          } else {
+            do {
+              code1 += (code3 = this.getWhiteCode());
+            } while (code3 >= 64);
+          }
+          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
+          blackPixels ^= 1;
+        }
+      }
+
+      if (this.byteAlign) {
+        this.inputBits &= ~7;
+      }
+
+      var gotEOL = false;
+
+      if (!this.eoblock && this.row == this.rows - 1) {
+        this.eof = true;
+      } else {
+        code1 = this.lookBits(12);
+        while (code1 === 0) {
+          this.eatBits(1);
+          code1 = this.lookBits(12);
+        }
+        if (code1 == 1) {
+          this.eatBits(12);
+          gotEOL = true;
+        } else if (code1 == EOF) {
+          this.eof = true;
+        }
+      }
+
+      if (!this.eof && this.encoding > 0) {
+        this.nextLine2D = !this.lookBits(1);
+        this.eatBits(1);
+      }
+
+      if (this.eoblock && gotEOL) {
+        code1 = this.lookBits(12);
+        if (code1 == 1) {
+          this.eatBits(12);
+          if (this.encoding > 0) {
+            this.lookBits(1);
+            this.eatBits(1);
+          }
+          if (this.encoding >= 0) {
+            for (i = 0; i < 4; ++i) {
+              code1 = this.lookBits(12);
+              if (code1 != 1) {
+                info('bad rtc code: ' + code1);
+              }
+              this.eatBits(12);
+              if (this.encoding > 0) {
+                this.lookBits(1);
+                this.eatBits(1);
+              }
+            }
+          }
+          this.eof = true;
+        }
+      } else if (this.err && this.eoline) {
+        while (true) {
+          code1 = this.lookBits(13);
+          if (code1 == EOF) {
+            this.eof = true;
+            return null;
+          }
+          if ((code1 >> 1) == 1) {
+            break;
+          }
+          this.eatBits(1);
+        }
+        this.eatBits(12);
+        if (this.encoding > 0) {
+          this.eatBits(1);
+          this.nextLine2D = !(code1 & 1);
+        }
+      }
+
+      if (codingLine[0] > 0) {
+        this.outputBits = codingLine[this.codingPos = 0];
+      } else {
+        this.outputBits = codingLine[this.codingPos = 1];
+      }
+      this.row++;
+    }
+
+    var c;
+    if (this.outputBits >= 8) {
+      c = (this.codingPos & 1) ? 0 : 0xFF;
+      this.outputBits -= 8;
+      if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
+        this.codingPos++;
+        this.outputBits = (codingLine[this.codingPos] -
+                           codingLine[this.codingPos - 1]);
+      }
+    } else {
+      bits = 8;
+      c = 0;
+      do {
+        if (this.outputBits > bits) {
+          c <<= bits;
+          if (!(this.codingPos & 1)) {
+            c |= 0xFF >> (8 - bits);
+          }
+          this.outputBits -= bits;
+          bits = 0;
+        } else {
+          c <<= this.outputBits;
+          if (!(this.codingPos & 1)) {
+            c |= 0xFF >> (8 - this.outputBits);
+          }
+          bits -= this.outputBits;
+          this.outputBits = 0;
+          if (codingLine[this.codingPos] < columns) {
+            this.codingPos++;
+            this.outputBits = (codingLine[this.codingPos] -
+                               codingLine[this.codingPos - 1]);
+          } else if (bits > 0) {
+            c <<= bits;
+            bits = 0;
+          }
+        }
+      } while (bits);
+    }
+    if (this.black) {
+      c ^= 0xFF;
+    }
+    return c;
+  };
+
+  // This functions returns the code found from the table.
+  // The start and end parameters set the boundaries for searching the table.
+  // The limit parameter is optional. Function returns an array with three
+  // values. The first array element indicates whether a valid code is being
+  // returned. The second array element is the actual code. The third array
+  // element indicates whether EOF was reached.
+  CCITTFaxStream.prototype.findTableCode =
+      function ccittFaxStreamFindTableCode(start, end, table, limit) {
+
+    var limitValue = limit || 0;
+    for (var i = start; i <= end; ++i) {
+      var code = this.lookBits(i);
+      if (code == EOF) {
+        return [true, 1, false];
+      }
+      if (i < end) {
+        code <<= end - i;
+      }
+      if (!limitValue || code >= limitValue) {
+        var p = table[code - limitValue];
+        if (p[0] == i) {
+          this.eatBits(i);
+          return [true, p[1], true];
+        }
+      }
+    }
+    return [false, 0, false];
+  };
+
+  CCITTFaxStream.prototype.getTwoDimCode =
+      function ccittFaxStreamGetTwoDimCode() {
+
+    var code = 0;
+    var p;
+    if (this.eoblock) {
+      code = this.lookBits(7);
+      p = twoDimTable[code];
+      if (p && p[0] > 0) {
+        this.eatBits(p[0]);
+        return p[1];
+      }
+    } else {
+      var result = this.findTableCode(1, 7, twoDimTable);
+      if (result[0] && result[2]) {
+        return result[1];
+      }
+    }
+    info('Bad two dim code');
+    return EOF;
+  };
+
+  CCITTFaxStream.prototype.getWhiteCode =
+      function ccittFaxStreamGetWhiteCode() {
+
+    var code = 0;
+    var p;
+    if (this.eoblock) {
+      code = this.lookBits(12);
+      if (code == EOF) {
+        return 1;
+      }
+
+      if ((code >> 5) === 0) {
+        p = whiteTable1[code];
+      } else {
+        p = whiteTable2[code >> 3];
+      }
+
+      if (p[0] > 0) {
+        this.eatBits(p[0]);
+        return p[1];
+      }
+    } else {
+      var result = this.findTableCode(1, 9, whiteTable2);
+      if (result[0]) {
+        return result[1];
+      }
+
+      result = this.findTableCode(11, 12, whiteTable1);
+      if (result[0]) {
+        return result[1];
+      }
+    }
+    info('bad white code');
+    this.eatBits(1);
+    return 1;
+  };
+
+  CCITTFaxStream.prototype.getBlackCode =
+      function ccittFaxStreamGetBlackCode() {
+
+    var code, p;
+    if (this.eoblock) {
+      code = this.lookBits(13);
+      if (code == EOF) {
+        return 1;
+      }
+      if ((code >> 7) === 0) {
+        p = blackTable1[code];
+      } else if ((code >> 9) === 0 && (code >> 7) !== 0) {
+        p = blackTable2[(code >> 1) - 64];
+      } else {
+        p = blackTable3[code >> 7];
+      }
+
+      if (p[0] > 0) {
+        this.eatBits(p[0]);
+        return p[1];
+      }
+    } else {
+      var result = this.findTableCode(2, 6, blackTable3);
+      if (result[0]) {
+        return result[1];
+      }
+
+      result = this.findTableCode(7, 12, blackTable2, 64);
+      if (result[0]) {
+        return result[1];
+      }
+
+      result = this.findTableCode(10, 13, blackTable1);
+      if (result[0]) {
+        return result[1];
+      }
+    }
+    info('bad black code');
+    this.eatBits(1);
+    return 1;
+  };
+
+  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
+    var c;
+    while (this.inputBits < n) {
+      if ((c = this.str.getByte()) === -1) {
+        if (this.inputBits === 0) {
+          return EOF;
+        }
+        return ((this.inputBuf << (n - this.inputBits)) &
+                (0xFFFF >> (16 - n)));
+      }
+      this.inputBuf = (this.inputBuf << 8) + c;
+      this.inputBits += 8;
+    }
+    return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
+  };
+
+  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
+    if ((this.inputBits -= n) < 0) {
+      this.inputBits = 0;
+    }
+  };
+
+  return CCITTFaxStream;
+})();
+
+var LZWStream = (function LZWStreamClosure() {
+  function LZWStream(str, maybeLength, earlyChange) {
+    this.str = str;
+    this.dict = str.dict;
+    this.cachedData = 0;
+    this.bitsCached = 0;
+
+    var maxLzwDictionarySize = 4096;
+    var lzwState = {
+      earlyChange: earlyChange,
+      codeLength: 9,
+      nextCode: 258,
+      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+      currentSequence: new Uint8Array(maxLzwDictionarySize),
+      currentSequenceLength: 0
+    };
+    for (var i = 0; i < 256; ++i) {
+      lzwState.dictionaryValues[i] = i;
+      lzwState.dictionaryLengths[i] = 1;
+    }
+    this.lzwState = lzwState;
+
+    DecodeStream.call(this, maybeLength);
+  }
+
+  LZWStream.prototype = Object.create(DecodeStream.prototype);
+
+  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
+    var bitsCached = this.bitsCached;
+    var cachedData = this.cachedData;
+    while (bitsCached < n) {
+      var c = this.str.getByte();
+      if (c === -1) {
+        this.eof = true;
+        return null;
+      }
+      cachedData = (cachedData << 8) | c;
+      bitsCached += 8;
+    }
+    this.bitsCached = (bitsCached -= n);
+    this.cachedData = cachedData;
+    this.lastCode = null;
+    return (cachedData >>> bitsCached) & ((1 << n) - 1);
+  };
+
+  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
+    var blockSize = 512;
+    var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
+    var i, j, q;
+
+    var lzwState = this.lzwState;
+    if (!lzwState) {
+      return; // eof was found
+    }
+
+    var earlyChange = lzwState.earlyChange;
+    var nextCode = lzwState.nextCode;
+    var dictionaryValues = lzwState.dictionaryValues;
+    var dictionaryLengths = lzwState.dictionaryLengths;
+    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+    var codeLength = lzwState.codeLength;
+    var prevCode = lzwState.prevCode;
+    var currentSequence = lzwState.currentSequence;
+    var currentSequenceLength = lzwState.currentSequenceLength;
+
+    var decodedLength = 0;
+    var currentBufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+
+    for (i = 0; i < blockSize; i++) {
+      var code = this.readBits(codeLength);
+      var hasPrev = currentSequenceLength > 0;
+      if (code < 256) {
+        currentSequence[0] = code;
+        currentSequenceLength = 1;
+      } else if (code >= 258) {
+        if (code < nextCode) {
+          currentSequenceLength = dictionaryLengths[code];
+          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+            currentSequence[j] = dictionaryValues[q];
+            q = dictionaryPrevCodes[q];
+          }
+        } else {
+          currentSequence[currentSequenceLength++] = currentSequence[0];
+        }
+      } else if (code == 256) {
+        codeLength = 9;
+        nextCode = 258;
+        currentSequenceLength = 0;
+        continue;
+      } else {
+        this.eof = true;
+        delete this.lzwState;
+        break;
+      }
+
+      if (hasPrev) {
+        dictionaryPrevCodes[nextCode] = prevCode;
+        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+        dictionaryValues[nextCode] = currentSequence[0];
+        nextCode++;
+        codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
+          codeLength : Math.min(Math.log(nextCode + earlyChange) /
+          0.6931471805599453 + 1, 12) | 0;
+      }
+      prevCode = code;
+
+      decodedLength += currentSequenceLength;
+      if (estimatedDecodedSize < decodedLength) {
+        do {
+          estimatedDecodedSize += decodedSizeDelta;
+        } while (estimatedDecodedSize < decodedLength);
+        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+      }
+      for (j = 0; j < currentSequenceLength; j++) {
+        buffer[currentBufferLength++] = currentSequence[j];
+      }
+    }
+    lzwState.nextCode = nextCode;
+    lzwState.codeLength = codeLength;
+    lzwState.prevCode = prevCode;
+    lzwState.currentSequenceLength = currentSequenceLength;
+
+    this.bufferLength = currentBufferLength;
+  };
+
+  return LZWStream;
+})();
+
+var NullStream = (function NullStreamClosure() {
+  function NullStream() {
+    Stream.call(this, new Uint8Array(0));
+  }
+
+  NullStream.prototype = Stream.prototype;
+
+  return NullStream;
+})();
+
+
+var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
+  setup: function wphSetup(handler) {
+    var pdfManager;
+
+    function loadDocument(recoveryMode) {
+      var loadDocumentPromise = new LegacyPromise();
+
+      var parseSuccess = function parseSuccess() {
+        var numPagesPromise = pdfManager.ensureDoc('numPages');
+        var fingerprintPromise = pdfManager.ensureDoc('fingerprint');
+        var outlinePromise = pdfManager.ensureCatalog('documentOutline');
+        var infoPromise = pdfManager.ensureDoc('documentInfo');
+        var metadataPromise = pdfManager.ensureCatalog('metadata');
+        var encryptedPromise = pdfManager.ensureXRef('encrypt');
+        var javaScriptPromise = pdfManager.ensureCatalog('javaScript');
+        Promise.all([numPagesPromise, fingerprintPromise, outlinePromise,
+                     infoPromise, metadataPromise, encryptedPromise,
+                     javaScriptPromise]).then(function onDocReady(results) {
+
+          var doc = {
+            numPages: results[0],
+            fingerprint: results[1],
+            outline: results[2],
+            info: results[3],
+            metadata: results[4],
+            encrypted: !!results[5],
+            javaScript: results[6]
+          };
+          loadDocumentPromise.resolve(doc);
+        },
+        parseFailure);
+      };
+
+      var parseFailure = function parseFailure(e) {
+        loadDocumentPromise.reject(e);
+      };
+
+      pdfManager.ensureDoc('checkHeader', []).then(function() {
+        pdfManager.ensureDoc('parseStartXRef', []).then(function() {
+          pdfManager.ensureDoc('parse', [recoveryMode]).then(
+            parseSuccess, parseFailure);
+        }, parseFailure);
+      }, parseFailure);
+
+      return loadDocumentPromise;
+    }
+
+    function getPdfManager(data) {
+      var pdfManagerPromise = new LegacyPromise();
+
+      var source = data.source;
+      var disableRange = data.disableRange;
+      if (source.data) {
+        try {
+          pdfManager = new LocalPdfManager(source.data, source.password);
+          pdfManagerPromise.resolve();
+        } catch (ex) {
+          pdfManagerPromise.reject(ex);
+        }
+        return pdfManagerPromise;
+      } else if (source.chunkedViewerLoading) {
+        try {
+          pdfManager = new NetworkPdfManager(source, handler);
+          pdfManagerPromise.resolve();
+        } catch (ex) {
+          pdfManagerPromise.reject(ex);
+        }
+        return pdfManagerPromise;
+      }
+
+      var networkManager = new NetworkManager(source.url, {
+        httpHeaders: source.httpHeaders,
+        withCredentials: source.withCredentials
+      });
+      var fullRequestXhrId = networkManager.requestFull({
+        onHeadersReceived: function onHeadersReceived() {
+          if (disableRange) {
+            return;
+          }
+
+          var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
+          if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
+            return;
+          }
+
+          var contentEncoding =
+            fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
+          if (contentEncoding !== 'identity') {
+            return;
+          }
+
+          var length = fullRequestXhr.getResponseHeader('Content-Length');
+          length = parseInt(length, 10);
+          if (!isInt(length)) {
+            return;
+          }
+          source.length = length;
+          if (length <= 2 * RANGE_CHUNK_SIZE) {
+            // The file size is smaller than the size of two chunks, so it does
+            // not make any sense to abort the request and retry with a range
+            // request.
+            return;
+          }
+
+          // NOTE: by cancelling the full request, and then issuing range
+          // requests, there will be an issue for sites where you can only
+          // request the pdf once. However, if this is the case, then the
+          // server should not be returning that it can support range requests.
+          networkManager.abortRequest(fullRequestXhrId);
+
+          try {
+            pdfManager = new NetworkPdfManager(source, handler);
+            pdfManagerPromise.resolve(pdfManager);
+          } catch (ex) {
+            pdfManagerPromise.reject(ex);
+          }
+        },
+
+        onDone: function onDone(args) {
+          // the data is array, instantiating directly from it
+          try {
+            pdfManager = new LocalPdfManager(args.chunk, source.password);
+            pdfManagerPromise.resolve();
+          } catch (ex) {
+            pdfManagerPromise.reject(ex);
+          }
+        },
+
+        onError: function onError(status) {
+          if (status == 404) {
+            var exception = new MissingPDFException('Missing PDF "' +
+                                                    source.url + '".');
+            handler.send('MissingPDF', { exception: exception });
+          } else {
+            handler.send('DocError', 'Unexpected server response (' +
+                         status + ') while retrieving PDF "' +
+                         source.url + '".');
+          }
+        },
+
+        onProgress: function onProgress(evt) {
+          handler.send('DocProgress', {
+            loaded: evt.loaded,
+            total: evt.lengthComputable ? evt.total : source.length
+          });
+        }
+      });
+
+      return pdfManagerPromise;
+    }
+
+    handler.on('test', function wphSetupTest(data) {
+      // check if Uint8Array can be sent to worker
+      if (!(data instanceof Uint8Array)) {
+        handler.send('test', false);
+        return;
+      }
+      // making sure postMessage transfers are working
+      var supportTransfers = data[0] === 255;
+      handler.postMessageTransfers = supportTransfers;
+      // check if the response property is supported by xhr
+      var xhr = new XMLHttpRequest();
+      var responseExists = 'response' in xhr;
+      // check if the property is actually implemented
+      try {
+        var dummy = xhr.responseType;
+      } catch (e) {
+        responseExists = false;
+      }
+      if (!responseExists) {
+        handler.send('test', false);
+        return;
+      }
+      handler.send('test', {
+        supportTypedArray: true,
+        supportTransfers: supportTransfers
+      });
+    });
+
+    handler.on('GetDocRequest', function wphSetupDoc(data) {
+
+      var onSuccess = function(doc) {
+        handler.send('GetDoc', { pdfInfo: doc });
+      };
+
+      var onFailure = function(e) {
+        if (e instanceof PasswordException) {
+          if (e.code === PasswordResponses.NEED_PASSWORD) {
+            handler.send('NeedPassword', {
+              exception: e
+            });
+          } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) {
+            handler.send('IncorrectPassword', {
+              exception: e
+            });
+          }
+        } else if (e instanceof InvalidPDFException) {
+          handler.send('InvalidPDF', {
+            exception: e
+          });
+        } else if (e instanceof MissingPDFException) {
+          handler.send('MissingPDF', {
+            exception: e
+          });
+        } else {
+          handler.send('UnknownError', {
+            exception: new UnknownErrorException(e.message, e.toString())
+          });
+        }
+      };
+
+      PDFJS.maxImageSize = data.maxImageSize === undefined ?
+                           -1 : data.maxImageSize;
+      PDFJS.disableFontFace = data.disableFontFace;
+      PDFJS.disableCreateObjectURL = data.disableCreateObjectURL;
+      PDFJS.verbosity = data.verbosity;
+      PDFJS.cMapUrl = data.cMapUrl === undefined ?
+                           null : data.cMapUrl;
+      PDFJS.cMapPacked = data.cMapPacked === true;
+
+      getPdfManager(data).then(function () {
+        pdfManager.onLoadedStream().then(function(stream) {
+          handler.send('DataLoaded', { length: stream.bytes.byteLength });
+        });
+      }).then(function pdfManagerReady() {
+        loadDocument(false).then(onSuccess, function loadFailure(ex) {
+          // Try again with recoveryMode == true
+          if (!(ex instanceof XRefParseException)) {
+            if (ex instanceof PasswordException) {
+              // after password exception prepare to receive a new password
+              // to repeat loading
+              pdfManager.passwordChangedPromise = new LegacyPromise();
+              pdfManager.passwordChangedPromise.then(pdfManagerReady);
+            }
+
+            onFailure(ex);
+            return;
+          }
+
+          pdfManager.requestLoadedStream();
+          pdfManager.onLoadedStream().then(function() {
+            loadDocument(true).then(onSuccess, onFailure);
+          });
+        }, onFailure);
+      }, onFailure);
+    });
+
+    handler.on('GetPageRequest', function wphSetupGetPage(data) {
+      var pageIndex = data.pageIndex;
+      pdfManager.getPage(pageIndex).then(function(page) {
+        var rotatePromise = pdfManager.ensure(page, 'rotate');
+        var refPromise = pdfManager.ensure(page, 'ref');
+        var viewPromise = pdfManager.ensure(page, 'view');
+
+        Promise.all([rotatePromise, refPromise, viewPromise]).then(
+            function(results) {
+          var page = {
+            pageIndex: data.pageIndex,
+            rotate: results[0],
+            ref: results[1],
+            view: results[2]
+          };
+
+          handler.send('GetPage', { pageInfo: page });
+        });
+      });
+    });
+
+    handler.on('GetPageIndex', function wphSetupGetPageIndex(data, deferred) {
+      var ref = new Ref(data.ref.num, data.ref.gen);
+      var catalog = pdfManager.pdfDocument.catalog;
+      catalog.getPageIndex(ref).then(function (pageIndex) {
+        deferred.resolve(pageIndex);
+      }, deferred.reject);
+    });
+
+    handler.on('GetDestinations',
+      function wphSetupGetDestinations(data, deferred) {
+        pdfManager.ensureCatalog('destinations').then(function(destinations) {
+          deferred.resolve(destinations);
+        });
+      }
+    );
+
+    handler.on('GetAttachments',
+      function wphSetupGetAttachments(data, deferred) {
+        pdfManager.ensureCatalog('attachments').then(function(attachments) {
+          deferred.resolve(attachments);
+        }, deferred.reject);
+      }
+    );
+
+    handler.on('GetData', function wphSetupGetData(data, deferred) {
+      pdfManager.requestLoadedStream();
+      pdfManager.onLoadedStream().then(function(stream) {
+        deferred.resolve(stream.bytes);
+      });
+    });
+
+    handler.on('UpdatePassword', function wphSetupUpdatePassword(data) {
+      pdfManager.updatePassword(data);
+    });
+
+    handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) {
+      pdfManager.getPage(data.pageIndex).then(function(page) {
+        pdfManager.ensure(page, 'getAnnotationsData', []).then(
+          function(annotationsData) {
+            handler.send('GetAnnotations', {
+              pageIndex: data.pageIndex,
+              annotations: annotationsData
+            });
+          }
+        );
+      });
+    });
+
+    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
+      pdfManager.getPage(data.pageIndex).then(function(page) {
+
+        var pageNum = data.pageIndex + 1;
+        var start = Date.now();
+        // Pre compile the pdf page and fetch the fonts/images.
+        page.getOperatorList(handler, data.intent).then(function(operatorList) {
+
+          info('page=' + pageNum + ' - getOperatorList: time=' +
+               (Date.now() - start) + 'ms, len=' + operatorList.fnArray.length);
+
+        }, function(e) {
+
+          var minimumStackMessage =
+            'worker.js: while trying to getPage() and getOperatorList()';
+
+          var wrappedException;
+
+          // Turn the error into an obj that can be serialized
+          if (typeof e === 'string') {
+            wrappedException = {
+              message: e,
+              stack: minimumStackMessage
+            };
+          } else if (typeof e === 'object') {
+            wrappedException = {
+              message: e.message || e.toString(),
+              stack: e.stack || minimumStackMessage
+            };
+          } else {
+            wrappedException = {
+              message: 'Unknown exception type: ' + (typeof e),
+              stack: minimumStackMessage
+            };
+          }
+
+          handler.send('PageError', {
+            pageNum: pageNum,
+            error: wrappedException,
+            intent: data.intent
+          });
+        });
+      });
+    }, this);
+
+    handler.on('GetTextContent', function wphExtractText(data, deferred) {
+      pdfManager.getPage(data.pageIndex).then(function(page) {
+        var pageNum = data.pageIndex + 1;
+        var start = Date.now();
+        page.extractTextContent().then(function(textContent) {
+          deferred.resolve(textContent);
+          info('text indexing: page=' + pageNum + ' - time=' +
+               (Date.now() - start) + 'ms');
+        }, function (e) {
+          // Skip errored pages
+          deferred.reject(e);
+        });
+      });
+    });
+
+    handler.on('Cleanup', function wphCleanup(data, deferred) {
+      pdfManager.cleanup();
+      deferred.resolve(true);
+    });
+
+    handler.on('Terminate', function wphTerminate(data, deferred) {
+      pdfManager.terminate();
+      deferred.resolve();
+    });
+  }
+};
+
+var consoleTimer = {};
+
+var workerConsole = {
+  log: function log() {
+    var args = Array.prototype.slice.call(arguments);
+    globalScope.postMessage({
+      action: 'console_log',
+      data: args
+    });
+  },
+
+  error: function error() {
+    var args = Array.prototype.slice.call(arguments);
+    globalScope.postMessage({
+      action: 'console_error',
+      data: args
+    });
+    throw 'pdf.js execution error';
+  },
+
+  time: function time(name) {
+    consoleTimer[name] = Date.now();
+  },
+
+  timeEnd: function timeEnd(name) {
+    var time = consoleTimer[name];
+    if (!time) {
+      error('Unknown timer name ' + name);
+    }
+    this.log('Timer:', name, Date.now() - time);
+  }
+};
+
+
+// Worker thread?
+if (typeof window === 'undefined') {
+  if (!('console' in globalScope)) {
+    globalScope.console = workerConsole;
+  }
+
+  // Listen for unsupported features so we can pass them on to the main thread.
+  PDFJS.UnsupportedManager.listen(function (msg) {
+    globalScope.postMessage({
+      action: '_unsupported_feature',
+      data: msg
+    });
+  });
+
+  var handler = new MessageHandler('worker_processor', this);
+  WorkerMessageHandler.setup(handler);
+}
+
+
+/* This class implements the QM Coder decoding as defined in
+ *   JPEG 2000 Part I Final Committee Draft Version 1.0
+ *   Annex C.3 Arithmetic decoding procedure
+ * available at http://www.jpeg.org/public/fcd15444-1.pdf
+ *
+ * The arithmetic decoder is used in conjunction with context models to decode
+ * JPEG2000 and JBIG2 streams.
+ */
+var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
+  // Table C-2
+  var QeTable = [
+    {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
+    {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
+    {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
+    {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
+    {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
+    {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
+    {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
+    {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
+    {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
+    {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
+    {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
+    {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
+    {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
+    {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
+    {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
+    {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
+    {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
+    {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
+    {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
+    {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
+    {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
+    {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
+    {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
+    {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
+    {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
+    {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
+    {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
+    {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
+    {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
+    {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
+    {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
+    {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
+    {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
+    {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
+    {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
+    {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
+    {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
+    {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
+    {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
+    {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
+    {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
+    {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
+    {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
+    {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
+    {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
+    {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
+    {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
+  ];
+
+  // C.3.5 Initialisation of the decoder (INITDEC)
+  function ArithmeticDecoder(data, start, end) {
+    this.data = data;
+    this.bp = start;
+    this.dataEnd = end;
+
+    this.chigh = data[start];
+    this.clow = 0;
+
+    this.byteIn();
+
+    this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
+    this.clow = (this.clow << 7) & 0xFFFF;
+    this.ct -= 7;
+    this.a = 0x8000;
+  }
+
+  ArithmeticDecoder.prototype = {
+    // C.3.4 Compressed data input (BYTEIN)
+    byteIn: function ArithmeticDecoder_byteIn() {
+      var data = this.data;
+      var bp = this.bp;
+      if (data[bp] == 0xFF) {
+        var b1 = data[bp + 1];
+        if (b1 > 0x8F) {
+          this.clow += 0xFF00;
+          this.ct = 8;
+        } else {
+          bp++;
+          this.clow += (data[bp] << 9);
+          this.ct = 7;
+          this.bp = bp;
+        }
+      } else {
+        bp++;
+        this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
+        this.ct = 8;
+        this.bp = bp;
+      }
+      if (this.clow > 0xFFFF) {
+        this.chigh += (this.clow >> 16);
+        this.clow &= 0xFFFF;
+      }
+    },
+    // C.3.2 Decoding a decision (DECODE)
+    readBit: function ArithmeticDecoder_readBit(contexts, pos) {
+      // contexts are packed into 1 byte:
+      // highest 7 bits carry cx.index, lowest bit carries cx.mps
+      var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1;
+      var qeTableIcx = QeTable[cx_index];
+      var qeIcx = qeTableIcx.qe;
+      var d;
+      var a = this.a - qeIcx;
+
+      if (this.chigh < qeIcx) {
+        // exchangeLps
+        if (a < qeIcx) {
+          a = qeIcx;
+          d = cx_mps;
+          cx_index = qeTableIcx.nmps;
+        } else {
+          a = qeIcx;
+          d = 1 ^ cx_mps;
+          if (qeTableIcx.switchFlag === 1) {
+            cx_mps = d;
+          }
+          cx_index = qeTableIcx.nlps;
+        }
+      } else {
+        this.chigh -= qeIcx;
+        if ((a & 0x8000) !== 0) {
+          this.a = a;
+          return cx_mps;
+        }
+        // exchangeMps
+        if (a < qeIcx) {
+          d = 1 ^ cx_mps;
+          if (qeTableIcx.switchFlag === 1) {
+            cx_mps = d;
+          }
+          cx_index = qeTableIcx.nlps;
+        } else {
+          d = cx_mps;
+          cx_index = qeTableIcx.nmps;
+        }
+      }
+      // C.3.3 renormD;
+      do {
+        if (this.ct === 0) {
+          this.byteIn();
+        }
+
+        a <<= 1;
+        this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
+        this.clow = (this.clow << 1) & 0xFFFF;
+        this.ct--;
+      } while ((a & 0x8000) === 0);
+      this.a = a;
+
+      contexts[pos] = cx_index << 1 | cx_mps;
+      return d;
+    }
+  };
+
+  return ArithmeticDecoder;
+})();
+
+
+var JpxImage = (function JpxImageClosure() {
+  // Table E.1
+  var SubbandsGainLog2 = {
+    'LL': 0,
+    'LH': 1,
+    'HL': 1,
+    'HH': 2
+  };
+  function JpxImage() {
+    this.failOnCorruptedImage = false;
+  }
+  JpxImage.prototype = {
+    load: function JpxImage_load(url) {
+      var xhr = new XMLHttpRequest();
+      xhr.open('GET', url, true);
+      xhr.responseType = 'arraybuffer';
+      xhr.onload = (function() {
+        // TODO catch parse error
+        var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
+        this.parse(data);
+        if (this.onload) {
+          this.onload();
+        }
+      }).bind(this);
+      xhr.send(null);
+    },
+    parse: function JpxImage_parse(data) {
+
+      var head = readUint16(data, 0);
+      // No box header, immediate start of codestream (SOC)
+      if (head === 0xFF4F) {
+        this.parseCodestream(data, 0, data.length);
+        return;
+      }
+
+      var position = 0, length = data.length;
+      while (position < length) {
+        var headerSize = 8;
+        var lbox = readUint32(data, position);
+        var tbox = readUint32(data, position + 4);
+        position += headerSize;
+        if (lbox === 1) {
+          // XLBox: read UInt64 according to spec.
+          // JavaScript's int precision of 53 bit should be sufficient here.
+          lbox = readUint32(data, position) * 4294967296 +
+                 readUint32(data, position + 4);
+          position += 8;
+          headerSize += 8;
+        }
+        if (lbox === 0) {
+          lbox = length - position + headerSize;
+        }
+        if (lbox < headerSize) {
+          error('JPX error: Invalid box field size');
+        }
+        var dataLength = lbox - headerSize;
+        var jumpDataLength = true;
+        switch (tbox) {
+          case 0x6A501A1A: // 'jP\032\032'
+            // TODO
+            break;
+          case 0x6A703268: // 'jp2h'
+            jumpDataLength = false; // parsing child boxes
+            break;
+          case 0x636F6C72: // 'colr'
+            // TODO
+            break;
+          case 0x6A703263: // 'jp2c'
+            this.parseCodestream(data, position, position + dataLength);
+            break;
+        }
+        if (jumpDataLength) {
+          position += dataLength;
+        }
+      }
+    },
+    parseImageProperties: function JpxImage_parseImageProperties(stream) {
+      try {
+        var newByte = stream.getByte();
+        while (newByte >= 0) {
+          var oldByte = newByte;
+          newByte = stream.getByte();
+          var code = (oldByte << 8) | newByte;
+          // Image and tile size (SIZ)
+          if (code == 0xFF51) {
+            stream.skip(4);
+            var Xsiz = stream.getInt32() >>> 0; // Byte 4
+            var Ysiz = stream.getInt32() >>> 0; // Byte 8
+            var XOsiz = stream.getInt32() >>> 0; // Byte 12
+            var YOsiz = stream.getInt32() >>> 0; // Byte 16
+            stream.skip(16);
+            var Csiz = stream.getUint16(); // Byte 36
+            this.width = Xsiz - XOsiz;
+            this.height = Ysiz - YOsiz;
+            this.componentsCount = Csiz;
+            // Results are always returned as Uint8Arrays
+            this.bitsPerComponent = 8;
+            return;
+          }
+        }
+        throw 'No size marker found in JPX stream';
+      } catch (e) {
+        if (this.failOnCorruptedImage) {
+          error('JPX error: ' + e);
+        } else {
+          warn('JPX error: ' + e + '. Trying to recover');
+        }
+      }
+    },
+    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
+      var context = {};
+      try {
+        var position = start;
+        while (position + 1 < end) {
+          var code = readUint16(data, position);
+          position += 2;
+
+          var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile;
+          switch (code) {
+            case 0xFF4F: // Start of codestream (SOC)
+              context.mainHeader = true;
+              break;
+            case 0xFFD9: // End of codestream (EOC)
+              break;
+            case 0xFF51: // Image and tile size (SIZ)
+              length = readUint16(data, position);
+              var siz = {};
+              siz.Xsiz = readUint32(data, position + 4);
+              siz.Ysiz = readUint32(data, position + 8);
+              siz.XOsiz = readUint32(data, position + 12);
+              siz.YOsiz = readUint32(data, position + 16);
+              siz.XTsiz = readUint32(data, position + 20);
+              siz.YTsiz = readUint32(data, position + 24);
+              siz.XTOsiz = readUint32(data, position + 28);
+              siz.YTOsiz = readUint32(data, position + 32);
+              var componentsCount = readUint16(data, position + 36);
+              siz.Csiz = componentsCount;
+              var components = [];
+              j = position + 38;
+              for (var i = 0; i < componentsCount; i++) {
+                var component = {
+                  precision: (data[j] & 0x7F) + 1,
+                  isSigned: !!(data[j] & 0x80),
+                  XRsiz: data[j + 1],
+                  YRsiz: data[j + 1]
+                };
+                calculateComponentDimensions(component, siz);
+                components.push(component);
+              }
+              context.SIZ = siz;
+              context.components = components;
+              calculateTileGrids(context, components);
+              context.QCC = [];
+              context.COC = [];
+              break;
+            case 0xFF5C: // Quantization default (QCD)
+              length = readUint16(data, position);
+              var qcd = {};
+              j = position + 2;
+              sqcd = data[j++];
+              switch (sqcd & 0x1F) {
+                case 0:
+                  spqcdSize = 8;
+                  scalarExpounded = true;
+                  break;
+                case 1:
+                  spqcdSize = 16;
+                  scalarExpounded = false;
+                  break;
+                case 2:
+                  spqcdSize = 16;
+                  scalarExpounded = true;
+                  break;
+                default:
+                  throw 'Invalid SQcd value ' + sqcd;
+              }
+              qcd.noQuantization = (spqcdSize == 8);
+              qcd.scalarExpounded = scalarExpounded;
+              qcd.guardBits = sqcd >> 5;
+              spqcds = [];
+              while (j < length + position) {
+                var spqcd = {};
+                if (spqcdSize == 8) {
+                  spqcd.epsilon = data[j++] >> 3;
+                  spqcd.mu = 0;
+                } else {
+                  spqcd.epsilon = data[j] >> 3;
+                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
+                  j += 2;
+                }
+                spqcds.push(spqcd);
+              }
+              qcd.SPqcds = spqcds;
+              if (context.mainHeader) {
+                context.QCD = qcd;
+              } else {
+                context.currentTile.QCD = qcd;
+                context.currentTile.QCC = [];
+              }
+              break;
+            case 0xFF5D: // Quantization component (QCC)
+              length = readUint16(data, position);
+              var qcc = {};
+              j = position + 2;
+              var cqcc;
+              if (context.SIZ.Csiz < 257) {
+                cqcc = data[j++];
+              } else {
+                cqcc = readUint16(data, j);
+                j += 2;
+              }
+              sqcd = data[j++];
+              switch (sqcd & 0x1F) {
+                case 0:
+                  spqcdSize = 8;
+                  scalarExpounded = true;
+                  break;
+                case 1:
+                  spqcdSize = 16;
+                  scalarExpounded = false;
+                  break;
+                case 2:
+                  spqcdSize = 16;
+                  scalarExpounded = true;
+                  break;
+                default:
+                  throw 'Invalid SQcd value ' + sqcd;
+              }
+              qcc.noQuantization = (spqcdSize == 8);
+              qcc.scalarExpounded = scalarExpounded;
+              qcc.guardBits = sqcd >> 5;
+              spqcds = [];
+              while (j < (length + position)) {
+                spqcd = {};
+                if (spqcdSize == 8) {
+                  spqcd.epsilon = data[j++] >> 3;
+                  spqcd.mu = 0;
+                } else {
+                  spqcd.epsilon = data[j] >> 3;
+                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
+                  j += 2;
+                }
+                spqcds.push(spqcd);
+              }
+              qcc.SPqcds = spqcds;
+              if (context.mainHeader) {
+                context.QCC[cqcc] = qcc;
+              } else {
+                context.currentTile.QCC[cqcc] = qcc;
+              }
+              break;
+            case 0xFF52: // Coding style default (COD)
+              length = readUint16(data, position);
+              var cod = {};
+              j = position + 2;
+              var scod = data[j++];
+              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
+              cod.sopMarkerUsed = !!(scod & 2);
+              cod.ephMarkerUsed = !!(scod & 4);
+              cod.progressionOrder = data[j++];
+              cod.layersCount = readUint16(data, j);
+              j += 2;
+              cod.multipleComponentTransform = data[j++];
+
+              cod.decompositionLevelsCount = data[j++];
+              cod.xcb = (data[j++] & 0xF) + 2;
+              cod.ycb = (data[j++] & 0xF) + 2;
+              var blockStyle = data[j++];
+              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
+              cod.resetContextProbabilities = !!(blockStyle & 2);
+              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
+              cod.verticalyStripe = !!(blockStyle & 8);
+              cod.predictableTermination = !!(blockStyle & 16);
+              cod.segmentationSymbolUsed = !!(blockStyle & 32);
+              cod.reversibleTransformation = data[j++];
+              if (cod.entropyCoderWithCustomPrecincts) {
+                var precinctsSizes = [];
+                while (j < length + position) {
+                  var precinctsSize = data[j++];
+                  precinctsSizes.push({
+                    PPx: precinctsSize & 0xF,
+                    PPy: precinctsSize >> 4
+                  });
+                }
+                cod.precinctsSizes = precinctsSizes;
+              }
+
+              if (cod.sopMarkerUsed || cod.ephMarkerUsed ||
+                  cod.selectiveArithmeticCodingBypass ||
+                  cod.resetContextProbabilities ||
+                  cod.terminationOnEachCodingPass ||
+                  cod.verticalyStripe || cod.predictableTermination) {
+                throw 'Unsupported COD options: ' +
+                  globalScope.JSON.stringify(cod);
+              }
+
+              if (context.mainHeader) {
+                context.COD = cod;
+              } else {
+                context.currentTile.COD = cod;
+                context.currentTile.COC = [];
+              }
+              break;
+            case 0xFF90: // Start of tile-part (SOT)
+              length = readUint16(data, position);
+              tile = {};
+              tile.index = readUint16(data, position + 2);
+              tile.length = readUint32(data, position + 4);
+              tile.dataEnd = tile.length + position - 2;
+              tile.partIndex = data[position + 8];
+              tile.partsCount = data[position + 9];
+
+              context.mainHeader = false;
+              if (tile.partIndex === 0) {
+                // reset component specific settings
+                tile.COD = context.COD;
+                tile.COC = context.COC.slice(0); // clone of the global COC
+                tile.QCD = context.QCD;
+                tile.QCC = context.QCC.slice(0); // clone of the global COC
+              }
+              context.currentTile = tile;
+              break;
+            case 0xFF93: // Start of data (SOD)
+              tile = context.currentTile;
+              if (tile.partIndex === 0) {
+                initializeTile(context, tile.index);
+                buildPackets(context);
+              }
+
+              // moving to the end of the data
+              length = tile.dataEnd - position;
+              parseTilePackets(context, data, position, length);
+              break;
+            case 0xFF64: // Comment (COM)
+              length = readUint16(data, position);
+              // skipping content
+              break;
+            case 0xFF53: // Coding style component (COC)
+              throw 'Codestream code 0xFF53 (COC) is not implemented';
+            default:
+              throw 'Unknown codestream code: ' + code.toString(16);
+          }
+          position += length;
+        }
+      } catch (e) {
+        if (this.failOnCorruptedImage) {
+          error('JPX error: ' + e);
+        } else {
+          warn('JPX error: ' + e + '. Trying to recover');
+        }
+      }
+      this.tiles = transformComponents(context);
+      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
+      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
+      this.componentsCount = context.SIZ.Csiz;
+    }
+  };
+  function calculateComponentDimensions(component, siz) {
+    // Section B.2 Component mapping
+    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
+    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
+    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
+    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
+    component.width = component.x1 - component.x0;
+    component.height = component.y1 - component.y0;
+  }
+  function calculateTileGrids(context, components) {
+    var siz = context.SIZ;
+    // Section B.3 Division into tile and tile-components
+    var tile, tiles = [];
+    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
+    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
+    for (var q = 0; q < numYtiles; q++) {
+      for (var p = 0; p < numXtiles; p++) {
+        tile = {};
+        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
+        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
+        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
+        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
+        tile.width = tile.tx1 - tile.tx0;
+        tile.height = tile.ty1 - tile.ty0;
+        tile.components = [];
+        tiles.push(tile);
+      }
+    }
+    context.tiles = tiles;
+
+    var componentsCount = siz.Csiz;
+    for (var i = 0, ii = componentsCount; i < ii; i++) {
+      var component = components[i];
+      for (var j = 0, jj = tiles.length; j < jj; j++) {
+        var tileComponent = {};
+        tile = tiles[j];
+        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
+        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
+        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
+        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
+        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
+        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
+        tile.components[i] = tileComponent;
+      }
+    }
+  }
+  function getBlocksDimensions(context, component, r) {
+    var codOrCoc = component.codingStyleParameters;
+    var result = {};
+    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
+      result.PPx = 15;
+      result.PPy = 15;
+    } else {
+      result.PPx = codOrCoc.precinctsSizes[r].PPx;
+      result.PPy = codOrCoc.precinctsSizes[r].PPy;
+    }
+    // calculate codeblock size as described in section B.7
+    result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
+                   Math.min(codOrCoc.xcb, result.PPx));
+    result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
+                   Math.min(codOrCoc.ycb, result.PPy));
+    return result;
+  }
+  function buildPrecincts(context, resolution, dimensions) {
+    // Section B.6 Division resolution to precincts
+    var precinctWidth = 1 << dimensions.PPx;
+    var precinctHeight = 1 << dimensions.PPy;
+    var numprecinctswide = (resolution.trx1 > resolution.trx0 ?
+      Math.ceil(resolution.trx1 / precinctWidth) -
+      Math.floor(resolution.trx0 / precinctWidth) : 0);
+    var numprecinctshigh = (resolution.try1 > resolution.try0 ?
+      Math.ceil(resolution.try1 / precinctHeight) -
+      Math.floor(resolution.try0 / precinctHeight) : 0);
+    var numprecincts = numprecinctswide * numprecinctshigh;
+    var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
+                          precinctWidth;
+    var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
+                          precinctHeight;
+    resolution.precinctParameters = {
+      precinctXOffset: precinctXOffset,
+      precinctYOffset: precinctYOffset,
+      precinctWidth: precinctWidth,
+      precinctHeight: precinctHeight,
+      numprecinctswide: numprecinctswide,
+      numprecinctshigh: numprecinctshigh,
+      numprecincts: numprecincts
+    };
+  }
+  function buildCodeblocks(context, subband, dimensions) {
+    // Section B.7 Division sub-band into code-blocks
+    var xcb_ = dimensions.xcb_;
+    var ycb_ = dimensions.ycb_;
+    var codeblockWidth = 1 << xcb_;
+    var codeblockHeight = 1 << ycb_;
+    var cbx0 = subband.tbx0 >> xcb_;
+    var cby0 = subband.tby0 >> ycb_;
+    var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_;
+    var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_;
+    var precinctParameters = subband.resolution.precinctParameters;
+    var codeblocks = [];
+    var precincts = [];
+    var i, j, codeblock, precinctNumber;
+    for (j = cby0; j < cby1; j++) {
+      for (i = cbx0; i < cbx1; i++) {
+        codeblock = {
+          cbx: i,
+          cby: j,
+          tbx0: codeblockWidth * i,
+          tby0: codeblockHeight * j,
+          tbx1: codeblockWidth * (i + 1),
+          tby1: codeblockHeight * (j + 1)
+        };
+        // calculate precinct number
+        var pi = Math.floor((codeblock.tbx0 -
+                 precinctParameters.precinctXOffset) /
+                 precinctParameters.precinctWidth);
+        var pj = Math.floor((codeblock.tby0 -
+                 precinctParameters.precinctYOffset) /
+                 precinctParameters.precinctHeight);
+        precinctNumber = pj + pi * precinctParameters.numprecinctswide;
+        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
+        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
+        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
+        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
+        codeblock.precinctNumber = precinctNumber;
+        codeblock.subbandType = subband.type;
+        codeblock.Lblock = 3;
+        codeblocks.push(codeblock);
+        // building precinct for the sub-band
+        var precinct = precincts[precinctNumber];
+        if (precinct !== undefined) {
+          if (i < precinct.cbxMin) {
+            precinct.cbxMin = i;
+          } else if (i > precinct.cbxMax) {
+            precinct.cbxMax = i;
+          }
+          if (j < precinct.cbyMin) {
+            precinct.cbxMin = j;
+          } else if (j > precinct.cbyMax) {
+            precinct.cbyMax = j;
+          }
+        } else {
+          precincts[precinctNumber] = precinct = {
+            cbxMin: i,
+            cbyMin: j,
+            cbxMax: i,
+            cbyMax: j
+          };
+        }
+        codeblock.precinct = precinct;
+      }
+    }
+    subband.codeblockParameters = {
+      codeblockWidth: xcb_,
+      codeblockHeight: ycb_,
+      numcodeblockwide: cbx1 - cbx0 + 1,
+      numcodeblockhigh: cby1 - cby1 + 1
+    };
+    subband.codeblocks = codeblocks;
+    subband.precincts = precincts;
+  }
+  function createPacket(resolution, precinctNumber, layerNumber) {
+    var precinctCodeblocks = [];
+    // Section B.10.8 Order of info in packet
+    var subbands = resolution.subbands;
+    // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
+    for (var i = 0, ii = subbands.length; i < ii; i++) {
+      var subband = subbands[i];
+      var codeblocks = subband.codeblocks;
+      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
+        var codeblock = codeblocks[j];
+        if (codeblock.precinctNumber != precinctNumber) {
+          continue;
+        }
+        precinctCodeblocks.push(codeblock);
+      }
+    }
+    return {
+      layerNumber: layerNumber,
+      codeblocks: precinctCodeblocks
+    };
+  }
+  function LayerResolutionComponentPositionIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var maxDecompositionLevelsCount = 0;
+    for (var q = 0; q < componentsCount; q++) {
+      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
+        tile.components[q].codingStyleParameters.decompositionLevelsCount);
+    }
+
+    var l = 0, r = 0, i = 0, k = 0;
+
+    this.nextPacket = function JpxImage_nextPacket() {
+      // Section B.12.1.1 Layer-resolution-component-position
+      for (; l < layersCount; l++) {
+        for (; r <= maxDecompositionLevelsCount; r++) {
+          for (; i < componentsCount; i++) {
+            var component = tile.components[i];
+            if (r > component.codingStyleParameters.decompositionLevelsCount) {
+              continue;
+            }
+
+            var resolution = component.resolutions[r];
+            var numprecincts = resolution.precinctParameters.numprecincts;
+            for (; k < numprecincts;) {
+              var packet = createPacket(resolution, k, l);
+              k++;
+              return packet;
+            }
+            k = 0;
+          }
+          i = 0;
+        }
+        r = 0;
+      }
+      throw 'Out of packets';
+    };
+  }
+  function ResolutionLayerComponentPositionIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var maxDecompositionLevelsCount = 0;
+    for (var q = 0; q < componentsCount; q++) {
+      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
+        tile.components[q].codingStyleParameters.decompositionLevelsCount);
+    }
+
+    var r = 0, l = 0, i = 0, k = 0;
+
+    this.nextPacket = function JpxImage_nextPacket() {
+      // Section B.12.1.2 Resolution-layer-component-position
+      for (; r <= maxDecompositionLevelsCount; r++) {
+        for (; l < layersCount; l++) {
+          for (; i < componentsCount; i++) {
+            var component = tile.components[i];
+            if (r > component.codingStyleParameters.decompositionLevelsCount) {
+              continue;
+            }
+
+            var resolution = component.resolutions[r];
+            var numprecincts = resolution.precinctParameters.numprecincts;
+            for (; k < numprecincts;) {
+              var packet = createPacket(resolution, k, l);
+              k++;
+              return packet;
+            }
+            k = 0;
+          }
+          i = 0;
+        }
+        l = 0;
+      }
+      throw 'Out of packets';
+    };
+  }
+  function buildPackets(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var componentsCount = siz.Csiz;
+    // Creating resolutions and sub-bands for each component
+    for (var c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      var decompositionLevelsCount =
+        component.codingStyleParameters.decompositionLevelsCount;
+      // Section B.5 Resolution levels and sub-bands
+      var resolutions = [];
+      var subbands = [];
+      for (var r = 0; r <= decompositionLevelsCount; r++) {
+        var blocksDimensions = getBlocksDimensions(context, component, r);
+        var resolution = {};
+        var scale = 1 << (decompositionLevelsCount - r);
+        resolution.trx0 = Math.ceil(component.tcx0 / scale);
+        resolution.try0 = Math.ceil(component.tcy0 / scale);
+        resolution.trx1 = Math.ceil(component.tcx1 / scale);
+        resolution.try1 = Math.ceil(component.tcy1 / scale);
+        buildPrecincts(context, resolution, blocksDimensions);
+        resolutions.push(resolution);
+
+        var subband;
+        if (r === 0) {
+          // one sub-band (LL) with last decomposition
+          subband = {};
+          subband.type = 'LL';
+          subband.tbx0 = Math.ceil(component.tcx0 / scale);
+          subband.tby0 = Math.ceil(component.tcy0 / scale);
+          subband.tbx1 = Math.ceil(component.tcx1 / scale);
+          subband.tby1 = Math.ceil(component.tcy1 / scale);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolution.subbands = [subband];
+        } else {
+          var bscale = 1 << (decompositionLevelsCount - r + 1);
+          var resolutionSubbands = [];
+          // three sub-bands (HL, LH and HH) with rest of decompositions
+          subband = {};
+          subband.type = 'HL';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+
+          subband = {};
+          subband.type = 'LH';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+
+          subband = {};
+          subband.type = 'HH';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+
+          resolution.subbands = resolutionSubbands;
+        }
+      }
+      component.resolutions = resolutions;
+      component.subbands = subbands;
+    }
+    // Generate the packets sequence
+    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
+    switch (progressionOrder) {
+      case 0:
+        tile.packetsIterator =
+          new LayerResolutionComponentPositionIterator(context);
+        break;
+      case 1:
+        tile.packetsIterator =
+          new ResolutionLayerComponentPositionIterator(context);
+        break;
+      default:
+        throw 'Unsupported progression order ' + progressionOrder;
+    }
+  }
+  function parseTilePackets(context, data, offset, dataLength) {
+    var position = 0;
+    var buffer, bufferSize = 0, skipNextBit = false;
+    function readBits(count) {
+      while (bufferSize < count) {
+        var b = data[offset + position];
+        position++;
+        if (skipNextBit) {
+          buffer = (buffer << 7) | b;
+          bufferSize += 7;
+          skipNextBit = false;
+        } else {
+          buffer = (buffer << 8) | b;
+          bufferSize += 8;
+        }
+        if (b == 0xFF) {
+          skipNextBit = true;
+        }
+      }
+      bufferSize -= count;
+      return (buffer >>> bufferSize) & ((1 << count) - 1);
+    }
+    function alignToByte() {
+      bufferSize = 0;
+      if (skipNextBit) {
+        position++;
+        skipNextBit = false;
+      }
+    }
+    function readCodingpasses() {
+      if (readBits(1) === 0) {
+        return 1;
+      }
+      if (readBits(1) === 0) {
+        return 2;
+      }
+      var value = readBits(2);
+      if (value < 3) {
+        return value + 3;
+      }
+      value = readBits(5);
+      if (value < 31) {
+        return value + 6;
+      }
+      value = readBits(7);
+      return value + 37;
+    }
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var packetsIterator = tile.packetsIterator;
+    while (position < dataLength) {
+      var packet = packetsIterator.nextPacket();
+      if (!readBits(1)) {
+        alignToByte();
+        continue;
+      }
+      var layerNumber = packet.layerNumber;
+      var queue = [], codeblock;
+      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
+        codeblock = packet.codeblocks[i];
+        var precinct = codeblock.precinct;
+        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
+        var codeblockRow = codeblock.cby - precinct.cbyMin;
+        var codeblockIncluded = false;
+        var firstTimeInclusion = false;
+        var valueReady;
+        if ('included' in codeblock) {
+          codeblockIncluded = !!readBits(1);
+        } else {
+          // reading inclusion tree
+          precinct = codeblock.precinct;
+          var inclusionTree, zeroBitPlanesTree;
+          if ('inclusionTree' in precinct) {
+            inclusionTree = precinct.inclusionTree;
+          } else {
+            // building inclusion and zero bit-planes trees
+            var width = precinct.cbxMax - precinct.cbxMin + 1;
+            var height = precinct.cbyMax - precinct.cbyMin + 1;
+            inclusionTree = new InclusionTree(width, height, layerNumber);
+            zeroBitPlanesTree = new TagTree(width, height);
+            precinct.inclusionTree = inclusionTree;
+            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
+          }
+
+          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
+            while (true) {
+              if (readBits(1)) {
+                valueReady = !inclusionTree.nextLevel();
+                if (valueReady) {
+                  codeblock.included = true;
+                  codeblockIncluded = firstTimeInclusion = true;
+                  break;
+                }
+              } else {
+                inclusionTree.incrementValue(layerNumber);
+                break;
+              }
+            }
+          }
+        }
+        if (!codeblockIncluded) {
+          continue;
+        }
+        if (firstTimeInclusion) {
+          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
+          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
+          while (true) {
+            if (readBits(1)) {
+              valueReady = !zeroBitPlanesTree.nextLevel();
+              if (valueReady) {
+                break;
+              }
+            } else {
+              zeroBitPlanesTree.incrementValue();
+            }
+          }
+          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
+        }
+        var codingpasses = readCodingpasses();
+        while (readBits(1)) {
+          codeblock.Lblock++;
+        }
+        var codingpassesLog2 = log2(codingpasses);
+        // rounding down log2
+        var bits = ((codingpasses < (1 << codingpassesLog2)) ?
+          codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
+        var codedDataLength = readBits(bits);
+        queue.push({
+          codeblock: codeblock,
+          codingpasses: codingpasses,
+          dataLength: codedDataLength
+        });
+      }
+      alignToByte();
+      while (queue.length > 0) {
+        var packetItem = queue.shift();
+        codeblock = packetItem.codeblock;
+        if (!('data' in codeblock)) {
+          codeblock.data = [];
+        }
+        codeblock.data.push({
+          data: data,
+          start: offset + position,
+          end: offset + position + packetItem.dataLength,
+          codingpasses: packetItem.codingpasses
+        });
+        position += packetItem.dataLength;
+      }
+    }
+    return position;
+  }
+  function copyCoefficients(coefficients, levelWidth, levelHeight, subband,
+                            delta, mb, reversible, segmentationSymbolUsed) {
+    var x0 = subband.tbx0;
+    var y0 = subband.tby0;
+    var width = subband.tbx1 - subband.tbx0;
+    var codeblocks = subband.codeblocks;
+    var right = subband.type.charAt(0) === 'H' ? 1 : 0;
+    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;
+
+    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
+      var codeblock = codeblocks[i];
+      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
+      var blockHeight = codeblock.tby1_ - codeblock.tby0_;
+      if (blockWidth === 0 || blockHeight === 0) {
+        continue;
+      }
+      if (!('data' in codeblock)) {
+        continue;
+      }
+
+      var bitModel, currentCodingpassType;
+      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
+                              codeblock.zeroBitPlanes, mb);
+      currentCodingpassType = 2; // first bit plane starts from cleanup
+
+      // collect data
+      var data = codeblock.data, totalLength = 0, codingpasses = 0;
+      var j, jj, dataItem;
+      for (j = 0, jj = data.length; j < jj; j++) {
+        dataItem = data[j];
+        totalLength += dataItem.end - dataItem.start;
+        codingpasses += dataItem.codingpasses;
+      }
+      var encodedData = new Uint8Array(totalLength);
+      var position = 0;
+      for (j = 0, jj = data.length; j < jj; j++) {
+        dataItem = data[j];
+        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
+        encodedData.set(chunk, position);
+        position += chunk.length;
+      }
+      // decoding the item
+      var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
+      bitModel.setDecoder(decoder);
+
+      for (j = 0; j < codingpasses; j++) {
+        switch (currentCodingpassType) {
+          case 0:
+            bitModel.runSignificancePropogationPass();
+            break;
+          case 1:
+            bitModel.runMagnitudeRefinementPass();
+            break;
+          case 2:
+            bitModel.runCleanupPass();
+            if (segmentationSymbolUsed) {
+              bitModel.checkSegmentationSymbol();
+            }
+            break;
+        }
+        currentCodingpassType = (currentCodingpassType + 1) % 3;
+      }
+
+      var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
+      var sign = bitModel.coefficentsSign;
+      var magnitude = bitModel.coefficentsMagnitude;
+      var bitsDecoded = bitModel.bitsDecoded;
+      var magnitudeCorrection = reversible ? 0 : 0.5;
+      var k, n, nb;
+      position = 0;
+      // Do the interleaving of Section F.3.3 here, so we do not need
+      // to copy later. LL level is not interleaved, just copied.
+      var interleave = (subband.type !== 'LL');
+      for (j = 0; j < blockHeight; j++) {
+        var row = (offset / width) | 0; // row in the non-interleaved subband
+        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;
+        for (k = 0; k < blockWidth; k++) {
+          n = magnitude[position];
+          if (n !== 0) {
+            n = (n + magnitudeCorrection) * delta;
+            if (sign[position] !== 0) {
+              n = -n;
+            }
+            nb = bitsDecoded[position];
+            var pos = interleave ? (levelOffset + (offset << 1)) : offset;
+            if (reversible && (nb >= mb)) {
+              coefficients[pos] = n;
+            } else {
+              coefficients[pos] = n * (1 << (mb - nb));
+            }
+          }
+          offset++;
+          position++;
+        }
+        offset += width - blockWidth;
+      }
+    }
+  }
+  function transformTile(context, tile, c) {
+    var component = tile.components[c];
+    var codingStyleParameters = component.codingStyleParameters;
+    var quantizationParameters = component.quantizationParameters;
+    var decompositionLevelsCount =
+      codingStyleParameters.decompositionLevelsCount;
+    var spqcds = quantizationParameters.SPqcds;
+    var scalarExpounded = quantizationParameters.scalarExpounded;
+    var guardBits = quantizationParameters.guardBits;
+    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
+    var precision = context.components[c].precision;
+
+    var reversible = codingStyleParameters.reversibleTransformation;
+    var transform = (reversible ? new ReversibleTransform() :
+                                  new IrreversibleTransform());
+
+    var subbandCoefficients = [];
+    var b = 0;
+    for (var i = 0; i <= decompositionLevelsCount; i++) {
+      var resolution = component.resolutions[i];
+
+      var width = resolution.trx1 - resolution.trx0;
+      var height = resolution.try1 - resolution.try0;
+      // Allocate space for the whole sublevel.
+      var coefficients = new Float32Array(width * height);
+
+      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
+        var mu, epsilon;
+        if (!scalarExpounded) {
+          // formula E-5
+          mu = spqcds[0].mu;
+          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
+        } else {
+          mu = spqcds[b].mu;
+          epsilon = spqcds[b].epsilon;
+          b++;
+        }
+
+        var subband = resolution.subbands[j];
+        var gainLog2 = SubbandsGainLog2[subband.type];
+
+        // calulate quantization coefficient (Section E.1.1.1)
+        var delta = (reversible ? 1 :
+          Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048));
+        var mb = (guardBits + epsilon - 1);
+
+        // In the first resolution level, copyCoefficients will fill the
+        // whole array with coefficients. In the succeding passes,
+        // copyCoefficients will consecutively fill in the values that belong
+        // to the interleaved positions of the HL, LH, and HH coefficients.
+        // The LL coefficients will then be interleaved in Transform.iterate().
+        copyCoefficients(coefficients, width, height, subband, delta, mb,
+                         reversible, segmentationSymbolUsed);
+      }
+      subbandCoefficients.push({
+        width: width,
+        height: height,
+        items: coefficients
+      });
+    }
+
+    var result = transform.calculate(subbandCoefficients,
+                                     component.tcx0, component.tcy0);
+    return {
+      left: component.tcx0,
+      top: component.tcy0,
+      width: result.width,
+      height: result.height,
+      items: result.items
+    };
+  }
+  function transformComponents(context) {
+    var siz = context.SIZ;
+    var components = context.components;
+    var componentsCount = siz.Csiz;
+    var resultImages = [];
+    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
+      var tile = context.tiles[i];
+      var transformedTiles = [];
+      var c;
+      for (c = 0; c < componentsCount; c++) {
+        transformedTiles[c] = transformTile(context, tile, c);
+      }
+      var tile0 = transformedTiles[0];
+      var out = new Uint8Array(tile0.items.length * componentsCount);
+      var result = {
+        left: tile0.left,
+        top: tile0.top,
+        width: tile0.width,
+        height: tile0.height,
+        items: out
+      };
+
+      // Section G.2.2 Inverse multi component transform
+      var shift, offset, max, min;
+      var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val;
+      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
+        var fourComponents = componentsCount === 4;
+        var y0items = transformedTiles[0].items;
+        var y1items = transformedTiles[1].items;
+        var y2items = transformedTiles[2].items;
+        var y3items = fourComponents ? transformedTiles[3].items : null;
+
+        // HACK: The multiple component transform formulas below assume that
+        // all components have the same precision. With this in mind, we
+        // compute shift and offset only once.
+        shift = components[0].precision - 8;
+        offset = (128 << shift) + 0.5;
+        max = (127.5 * (1 << shift));
+        min = -max;
+
+        var component0 = tile.components[0];
+        if (!component0.codingStyleParameters.reversibleTransformation) {
+          // inverse irreversible multiple component transform
+          for (j = 0, jj = y0items.length; j < jj; ++j) {
+            y0 = y0items[j];
+            y1 = y1items[j];
+            y2 = y2items[j];
+            r = y0 + 1.402 * y2;
+            g = y0 - 0.34413 * y1 - 0.71414 * y2;
+            b = y0 + 1.772 * y1;
+            out[pos++] = r <= min ? 0 : r >= max ? 255 : (r + offset) >> shift;
+            out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift;
+            out[pos++] = b <= min ? 0 : b >= max ? 255 : (b + offset) >> shift;
+            if (fourComponents) {
+              k = y3items[j];
+              out[pos++] =
+                k <= min ? 0 : k >= max ? 255 : (k + offset) >> shift;
+            }
+          }
+        } else {
+          // inverse reversible multiple component transform
+          for (j = 0, jj = y0items.length; j < jj; ++j) {
+            y0 = y0items[j];
+            y1 = y1items[j];
+            y2 = y2items[j];
+            g = y0 - ((y2 + y1) >> 2);
+            r = g + y2;
+            b = g + y1;
+            out[pos++] = r <= min ? 0 : r >= max ? 255 : (r + offset) >> shift;
+            out[pos++] = g <= min ? 0 : g >= max ? 255 : (g + offset) >> shift;
+            out[pos++] = b <= min ? 0 : b >= max ? 255 : (b + offset) >> shift;
+            if (fourComponents) {
+              k = y3items[j];
+              out[pos++] =
+                k <= min ? 0 : k >= max ? 255 : (k + offset) >> shift;
+            }
+          }
+        }
+      } else { // no multi-component transform
+        for (c = 0; c < componentsCount; c++) {
+          var items = transformedTiles[c].items;
+          shift = components[c].precision - 8;
+          offset = (128 << shift) + 0.5;
+          max = (127.5 * (1 << shift));
+          min = -max;
+          for (pos = c, j = 0, jj = items.length; j < jj; j++) {
+            val = items[j];
+            out[pos] = val <= min ? 0 :
+                       val >= max ? 255 : (val + offset) >> shift;
+            pos += componentsCount;
+          }
+        }
+      }
+      resultImages.push(result);
+    }
+    return resultImages;
+  }
+  function initializeTile(context, tileIndex) {
+    var siz = context.SIZ;
+    var componentsCount = siz.Csiz;
+    var tile = context.tiles[tileIndex];
+    for (var c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      var qcdOrQcc = (c in context.currentTile.QCC ?
+        context.currentTile.QCC[c] : context.currentTile.QCD);
+      component.quantizationParameters = qcdOrQcc;
+      var codOrCoc = (c in context.currentTile.COC ?
+        context.currentTile.COC[c] : context.currentTile.COD);
+      component.codingStyleParameters = codOrCoc;
+    }
+    tile.codingStyleDefaultParameters = context.currentTile.COD;
+  }
+
+  // Section B.10.2 Tag trees
+  var TagTree = (function TagTreeClosure() {
+    function TagTree(width, height) {
+      var levelsLength = log2(Math.max(width, height)) + 1;
+      this.levels = [];
+      for (var i = 0; i < levelsLength; i++) {
+        var level = {
+          width: width,
+          height: height,
+          items: []
+        };
+        this.levels.push(level);
+        width = Math.ceil(width / 2);
+        height = Math.ceil(height / 2);
+      }
+    }
+    TagTree.prototype = {
+      reset: function TagTree_reset(i, j) {
+        var currentLevel = 0, value = 0, level;
+        while (currentLevel < this.levels.length) {
+          level = this.levels[currentLevel];
+          var index = i + j * level.width;
+          if (index in level.items) {
+            value = level.items[index];
+            break;
+          }
+          level.index = index;
+          i >>= 1;
+          j >>= 1;
+          currentLevel++;
+        }
+        currentLevel--;
+        level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        this.currentLevel = currentLevel;
+        delete this.value;
+      },
+      incrementValue: function TagTree_incrementValue() {
+        var level = this.levels[this.currentLevel];
+        level.items[level.index]++;
+      },
+      nextLevel: function TagTree_nextLevel() {
+        var currentLevel = this.currentLevel;
+        var level = this.levels[currentLevel];
+        var value = level.items[level.index];
+        currentLevel--;
+        if (currentLevel < 0) {
+          this.value = value;
+          return false;
+        }
+
+        this.currentLevel = currentLevel;
+        level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        return true;
+      }
+    };
+    return TagTree;
+  })();
+
+  var InclusionTree = (function InclusionTreeClosure() {
+    function InclusionTree(width, height,  defaultValue) {
+      var levelsLength = log2(Math.max(width, height)) + 1;
+      this.levels = [];
+      for (var i = 0; i < levelsLength; i++) {
+        var items = new Uint8Array(width * height);
+        for (var j = 0, jj = items.length; j < jj; j++) {
+          items[j] = defaultValue;
+        }
+
+        var level = {
+          width: width,
+          height: height,
+          items: items
+        };
+        this.levels.push(level);
+
+        width = Math.ceil(width / 2);
+        height = Math.ceil(height / 2);
+      }
+    }
+    InclusionTree.prototype = {
+      reset: function InclusionTree_reset(i, j, stopValue) {
+        var currentLevel = 0;
+        while (currentLevel < this.levels.length) {
+          var level = this.levels[currentLevel];
+          var index = i + j * level.width;
+          level.index = index;
+          var value = level.items[index];
+
+          if (value == 0xFF) {
+            break;
+          }
+
+          if (value > stopValue) {
+            this.currentLevel = currentLevel;
+            // already know about this one, propagating the value to top levels
+            this.propagateValues();
+            return false;
+          }
+
+          i >>= 1;
+          j >>= 1;
+          currentLevel++;
+        }
+        this.currentLevel = currentLevel - 1;
+        return true;
+      },
+      incrementValue: function InclusionTree_incrementValue(stopValue) {
+        var level = this.levels[this.currentLevel];
+        level.items[level.index] = stopValue + 1;
+        this.propagateValues();
+      },
+      propagateValues: function InclusionTree_propagateValues() {
+        var levelIndex = this.currentLevel;
+        var level = this.levels[levelIndex];
+        var currentValue = level.items[level.index];
+        while (--levelIndex >= 0) {
+          level = this.levels[levelIndex];
+          level.items[level.index] = currentValue;
+        }
+      },
+      nextLevel: function InclusionTree_nextLevel() {
+        var currentLevel = this.currentLevel;
+        var level = this.levels[currentLevel];
+        var value = level.items[level.index];
+        level.items[level.index] = 0xFF;
+        currentLevel--;
+        if (currentLevel < 0) {
+          return false;
+        }
+
+        this.currentLevel = currentLevel;
+        level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        return true;
+      }
+    };
+    return InclusionTree;
+  })();
+
+  // Section D. Coefficient bit modeling
+  var BitModel = (function BitModelClosure() {
+    var UNIFORM_CONTEXT = 17;
+    var RUNLENGTH_CONTEXT = 18;
+    // Table D-1
+    // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
+    // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
+    var LLAndLHContextsLabel = new Uint8Array([
+      0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
+      7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
+      8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
+    ]);
+    var HLContextLabel = new Uint8Array([
+      0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
+      8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
+      4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
+    ]);
+    var HHContextLabel = new Uint8Array([
+      0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
+      5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
+      8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
+    ]);
+
+    function BitModel(width, height, subband, zeroBitPlanes, mb) {
+      this.width = width;
+      this.height = height;
+
+      this.contextLabelTable = (subband == 'HH' ? HHContextLabel :
+        (subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel));
+
+      var coefficientCount = width * height;
+
+      // coefficients outside the encoding region treated as insignificant
+      // add border state cells for significanceState
+      this.neighborsSignificance = new Uint8Array(coefficientCount);
+      this.coefficentsSign = new Uint8Array(coefficientCount);
+      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) :
+                                  mb > 6 ? new Uint16Array(coefficientCount) :
+                                  new Uint8Array(coefficientCount);
+      this.processingFlags = new Uint8Array(coefficientCount);
+
+      var bitsDecoded = new Uint8Array(coefficientCount);
+      if (zeroBitPlanes !== 0) {
+        for (var i = 0; i < coefficientCount; i++) {
+          bitsDecoded[i] = zeroBitPlanes;
+        }
+      }
+      this.bitsDecoded = bitsDecoded;
+
+      this.reset();
+    }
+
+    BitModel.prototype = {
+      setDecoder: function BitModel_setDecoder(decoder) {
+        this.decoder = decoder;
+      },
+      reset: function BitModel_reset() {
+        // We have 17 contexts that are accessed via context labels,
+        // plus the uniform and runlength context.
+        this.contexts = new Int8Array(19);
+
+        // Contexts are packed into 1 byte:
+        // highest 7 bits carry the index, lowest bit carries mps
+        this.contexts[0] = (4 << 1) | 0;
+        this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0;
+        this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0;
+      },
+      setNeighborsSignificance:
+        function BitModel_setNeighborsSignificance(row, column, index) {
+        var neighborsSignificance = this.neighborsSignificance;
+        var width = this.width, height = this.height;
+        var left = (column > 0);
+        var right = (column + 1 < width);
+        var i;
+
+        if (row > 0) {
+          i = index - width;
+          if (left) {
+            neighborsSignificance[i - 1] += 0x10;
+          }
+          if (right) {
+            neighborsSignificance[i + 1] += 0x10;
+          }
+          neighborsSignificance[i] += 0x04;
+        }
+
+        if (row + 1 < height) {
+          i = index + width;
+          if (left) {
+            neighborsSignificance[i - 1] += 0x10;
+          }
+          if (right) {
+            neighborsSignificance[i + 1] += 0x10;
+          }
+          neighborsSignificance[i] += 0x04;
+        }
+
+        if (left) {
+          neighborsSignificance[index - 1] += 0x01;
+        }
+        if (right) {
+          neighborsSignificance[index + 1] += 0x01;
+        }
+        neighborsSignificance[index] |= 0x80;
+      },
+      runSignificancePropogationPass:
+        function BitModel_runSignificancePropogationPass() {
+        var decoder = this.decoder;
+        var width = this.width, height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var neighborsSignificance = this.neighborsSignificance;
+        var processingFlags = this.processingFlags;
+        var contexts = this.contexts;
+        var labels = this.contextLabelTable;
+        var bitsDecoded = this.bitsDecoded;
+        var processedInverseMask = ~1;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+
+        for (var i0 = 0; i0 < height; i0 += 4) {
+          for (var j = 0; j < width; j++) {
+            var index = i0 * width + j;
+            for (var i1 = 0; i1 < 4; i1++, index += width) {
+              var i = i0 + i1;
+              if (i >= height) {
+                break;
+              }
+              // clear processed flag first
+              processingFlags[index] &= processedInverseMask;
+
+              if (coefficentsMagnitude[index] ||
+                  !neighborsSignificance[index]) {
+                continue;
+              }
+
+              var contextLabel = labels[neighborsSignificance[index]];
+              var decision = decoder.readBit(contexts, contextLabel);
+              if (decision) {
+                var sign = this.decodeSignBit(i, j, index);
+                coefficentsSign[index] = sign;
+                coefficentsMagnitude[index] = 1;
+                this.setNeighborsSignificance(i, j, index);
+                processingFlags[index] |= firstMagnitudeBitMask;
+              }
+              bitsDecoded[index]++;
+              processingFlags[index] |= processedMask;
+            }
+          }
+        }
+      },
+      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {
+        var width = this.width, height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var contribution, sign0, sign1, significance1;
+        var contextLabel, decoded;
+
+        // calculate horizontal contribution
+        significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0);
+        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
+          sign1 = coefficentsSign[index + 1];
+          if (significance1) {
+            sign0 = coefficentsSign[index - 1];
+            contribution = 1 - sign1 - sign0;
+          } else {
+            contribution = 1 - sign1 - sign1;
+          }
+        } else if (significance1) {
+          sign0 = coefficentsSign[index - 1];
+          contribution = 1 - sign0 - sign0;
+        } else {
+          contribution = 0;
+        }
+        var horizontalContribution = 3 * contribution;
+
+        // calculate vertical contribution and combine with the horizontal
+        significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0);
+        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
+          sign1 = coefficentsSign[index + width];
+          if (significance1) {
+            sign0 = coefficentsSign[index - width];
+            contribution = 1 - sign1 - sign0 + horizontalContribution;
+          } else {
+            contribution = 1 - sign1 - sign1 + horizontalContribution;
+          }
+        } else if (significance1) {
+          sign0 = coefficentsSign[index - width];
+          contribution = 1 - sign0 - sign0 + horizontalContribution;
+        } else {
+          contribution = horizontalContribution;
+        }
+
+        if (contribution >= 0) {
+          contextLabel = 9 + contribution;
+          decoded = this.decoder.readBit(this.contexts, contextLabel);
+        } else {
+          contextLabel = 9 - contribution;
+          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
+        }
+        return decoded;
+      },
+      runMagnitudeRefinementPass:
+        function BitModel_runMagnitudeRefinementPass() {
+        var decoder = this.decoder;
+        var width = this.width, height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var neighborsSignificance = this.neighborsSignificance;
+        var contexts = this.contexts;
+        var bitsDecoded = this.bitsDecoded;
+        var processingFlags = this.processingFlags;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        var length = width * height;
+        var width4 = width * 4;
+
+        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {
+          indexNext = Math.min(length, index0 + width4);
+          for (var j = 0; j < width; j++) {
+            for (var index = index0 + j; index < indexNext; index += width) {
+
+              // significant but not those that have just become
+              if (!coefficentsMagnitude[index] ||
+                (processingFlags[index] & processedMask) !== 0) {
+                continue;
+              }
+
+              var contextLabel = 16;
+              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
+                processingFlags[index] ^= firstMagnitudeBitMask;
+                // first refinement
+               var significance = neighborsSignificance[index] & 127;
+               contextLabel = significance === 0 ? 15 : 14;
+              }
+
+              var bit = decoder.readBit(contexts, contextLabel);
+              coefficentsMagnitude[index] =
+                (coefficentsMagnitude[index] << 1) | bit;
+              bitsDecoded[index]++;
+              processingFlags[index] |= processedMask;
+            }
+          }
+        }
+      },
+      runCleanupPass: function BitModel_runCleanupPass() {
+        var decoder = this.decoder;
+        var width = this.width, height = this.height;
+        var neighborsSignificance = this.neighborsSignificance;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var contexts = this.contexts;
+        var labels = this.contextLabelTable;
+        var bitsDecoded = this.bitsDecoded;
+        var processingFlags = this.processingFlags;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        var oneRowDown = width;
+        var twoRowsDown = width * 2;
+        var threeRowsDown = width * 3;
+        var iNext;
+        for (var i0 = 0; i0 < height; i0 = iNext) {
+          iNext = Math.min(i0 + 4, height);
+          var indexBase = i0 * width;
+          var checkAllEmpty = i0 + 3 < height;
+          for (var j = 0; j < width; j++) {
+            var index0 = indexBase + j;
+            // using the property: labels[neighborsSignificance[index]] == 0
+            // when neighborsSignificance[index] == 0
+            var allEmpty = (checkAllEmpty &&
+              processingFlags[index0] === 0 &&
+              processingFlags[index0 + oneRowDown] === 0 &&
+              processingFlags[index0 + twoRowsDown] === 0 &&
+              processingFlags[index0 + threeRowsDown] === 0 &&
+              neighborsSignificance[index0] === 0 &&
+              neighborsSignificance[index0 + oneRowDown] === 0 &&
+              neighborsSignificance[index0 + twoRowsDown] === 0 &&
+              neighborsSignificance[index0 + threeRowsDown] === 0);
+            var i1 = 0, index = index0;
+            var i = i0, sign;
+            if (allEmpty) {
+              var hasSignificantCoefficent =
+                decoder.readBit(contexts, RUNLENGTH_CONTEXT);
+              if (!hasSignificantCoefficent) {
+                bitsDecoded[index0]++;
+                bitsDecoded[index0 + oneRowDown]++;
+                bitsDecoded[index0 + twoRowsDown]++;
+                bitsDecoded[index0 + threeRowsDown]++;
+                continue; // next column
+              }
+              i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |
+                    decoder.readBit(contexts, UNIFORM_CONTEXT);
+              if (i1 !== 0) {
+                i = i0 + i1;
+                index += i1 * width;
+              }
+
+              sign = this.decodeSignBit(i, j, index);
+              coefficentsSign[index] = sign;
+              coefficentsMagnitude[index] = 1;
+              this.setNeighborsSignificance(i, j, index);
+              processingFlags[index] |= firstMagnitudeBitMask;
+
+              index = index0;
+              for (var i2 = i0; i2 <= i; i2++, index += width) {
+                bitsDecoded[index]++;
+              }
+
+              i1++;
+            }
+            for (i = i0 + i1; i < iNext; i++, index += width) {
+              if (coefficentsMagnitude[index] ||
+                (processingFlags[index] & processedMask) !== 0) {
+                continue;
+              }
+
+              var contextLabel = labels[neighborsSignificance[index]];
+              var decision = decoder.readBit(contexts, contextLabel);
+              if (decision === 1) {
+                sign = this.decodeSignBit(i, j, index);
+                coefficentsSign[index] = sign;
+                coefficentsMagnitude[index] = 1;
+                this.setNeighborsSignificance(i, j, index);
+                processingFlags[index] |= firstMagnitudeBitMask;
+              }
+              bitsDecoded[index]++;
+            }
+          }
+        }
+      },
+      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
+        var decoder = this.decoder;
+        var contexts = this.contexts;
+        var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) |
+                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) |
+                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |
+                      decoder.readBit(contexts, UNIFORM_CONTEXT);
+        if (symbol != 0xA) {
+          throw 'Invalid segmentation symbol';
+        }
+      }
+    };
+
+    return BitModel;
+  })();
+
+  // Section F, Discrete wavelet transformation
+  var Transform = (function TransformClosure() {
+    function Transform() {}
+
+    Transform.prototype.calculate =
+      function transformCalculate(subbands, u0, v0) {
+      var ll = subbands[0];
+      for (var i = 1, ii = subbands.length; i < ii; i++) {
+        ll = this.iterate(ll, subbands[i], u0, v0);
+      }
+      return ll;
+    };
+    Transform.prototype.extend = function extend(buffer, offset, size) {
+      // Section F.3.7 extending... using max extension of 4
+      var i1 = offset - 1, j1 = offset + 1;
+      var i2 = offset + size - 2, j2 = offset + size;
+      buffer[i1--] = buffer[j1++];
+      buffer[j2++] = buffer[i2--];
+      buffer[i1--] = buffer[j1++];
+      buffer[j2++] = buffer[i2--];
+      buffer[i1--] = buffer[j1++];
+      buffer[j2++] = buffer[i2--];
+      buffer[i1] = buffer[j1];
+      buffer[j2] = buffer[i2];
+    };
+    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh,
+                                                             u0, v0) {
+      var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
+      var width = hl_lh_hh.width;
+      var height = hl_lh_hh.height;
+      var items = hl_lh_hh.items;
+      var i, j, k, l, u, v;
+
+      // Interleave LL according to Section F.3.3
+      for (k = 0, i = 0; i < llHeight; i++) {
+        l = i * 2 * width;
+        for (j = 0; j < llWidth; j++, k++, l += 2) {
+          items[l] = llItems[k];
+        }
+      }
+      // The LL band is not needed anymore.
+      llItems = ll.items = null;
+
+      var bufferPadding = 4;
+      var rowBuffer = new Float32Array(width + 2 * bufferPadding);
+
+      // Section F.3.4 HOR_SR
+      if (width === 1) {
+        // if width = 1, when u0 even keep items as is, when odd divide by 2
+        if ((u0 & 1) !== 0) {
+          for (v = 0, k = 0; v < height; v++, k += width) {
+            items[k] *= 0.5;
+          }
+        }
+      } else {
+        for (v = 0, k = 0; v < height; v++, k += width) {
+          rowBuffer.set(items.subarray(k, k + width), bufferPadding);
+
+          this.extend(rowBuffer, bufferPadding, width);
+          this.filter(rowBuffer, bufferPadding, width);
+
+          items.set(
+            rowBuffer.subarray(bufferPadding, bufferPadding + width),
+            k);
+        }
+      }
+
+      // Accesses to the items array can take long, because it may not fit into
+      // CPU cache and has to be fetched from main memory. Since subsequent
+      // accesses to the items array are not local when reading columns, we
+      // have a cache miss every time. To reduce cache misses, get up to
+      // 'numBuffers' items at a time and store them into the individual
+      // buffers. The colBuffers should be small enough to fit into CPU cache.
+      var numBuffers = 16;
+      var colBuffers = [];
+      for (i = 0; i < numBuffers; i++) {
+        colBuffers.push(new Float32Array(height + 2 * bufferPadding));
+      }
+      var b, currentBuffer = 0;
+      ll = bufferPadding + height;
+
+      // Section F.3.5 VER_SR
+      if (height === 1) {
+          // if height = 1, when v0 even keep items as is, when odd divide by 2
+        if ((v0 & 1) !== 0) {
+          for (u = 0; u < width; u++) {
+            items[u] *= 0.5;
+          }
+        }
+      } else {
+        for (u = 0; u < width; u++) {
+          // if we ran out of buffers, copy several image columns at once
+          if (currentBuffer === 0) {
+            numBuffers = Math.min(width - u, numBuffers);
+            for (k = u, l = bufferPadding; l < ll; k += width, l++) {
+              for (b = 0; b < numBuffers; b++) {
+                colBuffers[b][l] = items[k + b];
+              }
+            }
+            currentBuffer = numBuffers;
+          }
+
+          currentBuffer--;
+          var buffer = colBuffers[currentBuffer];
+          this.extend(buffer, bufferPadding, height);
+          this.filter(buffer, bufferPadding, height);
+
+          // If this is last buffer in this group of buffers, flush all buffers.
+          if (currentBuffer === 0) {
+            k = u - numBuffers + 1;
+            for (l = bufferPadding; l < ll; k += width, l++) {
+              for (b = 0; b < numBuffers; b++) {
+                items[k + b] = colBuffers[b][l];
+              }
+            }
+          }
+        }
+      }
+
+      return {
+        width: width,
+        height: height,
+        items: items
+      };
+    };
+    return Transform;
+  })();
+
+  // Section 3.8.2 Irreversible 9-7 filter
+  var IrreversibleTransform = (function IrreversibleTransformClosure() {
+    function IrreversibleTransform() {
+      Transform.call(this);
+    }
+
+    IrreversibleTransform.prototype = Object.create(Transform.prototype);
+    IrreversibleTransform.prototype.filter =
+      function irreversibleTransformFilter(x, offset, length) {
+      var len = length >> 1;
+      offset = offset | 0;
+      var j, n, current, next;
+
+      var alpha = -1.586134342059924;
+      var beta = -0.052980118572961;
+      var gamma = 0.882911075530934;
+      var delta = 0.443506852043971;
+      var K = 1.230174104914001;
+      var K_ = 1 / K;
+
+      // step 1 is combined with step 3
+
+      // step 2
+      j = offset - 3;
+      for (n = len + 4; n--; j += 2) {
+        x[j] *= K_;
+      }
+
+      // step 1 & 3
+      j = offset - 2;
+      current = delta * x[j -1];
+      for (n = len + 3; n--; j += 2) {
+        next = delta * x[j + 1];
+        x[j] = K * x[j] - current - next;
+        if (n--) {
+          j += 2;
+          current = delta * x[j + 1];
+          x[j] = K * x[j] - current - next;
+        } else {
+          break;
+        }
+      }
+
+      // step 4
+      j = offset - 1;
+      current = gamma * x[j - 1];
+      for (n = len + 2; n--; j += 2) {
+        next = gamma * x[j + 1];
+        x[j] -= current + next;
+        if (n--) {
+          j += 2;
+          current = gamma * x[j + 1];
+          x[j] -= current + next;
+        } else {
+          break;
+        }
+      }
+
+      // step 5
+      j = offset;
+      current = beta * x[j - 1];
+      for (n = len + 1; n--; j += 2) {
+        next = beta * x[j + 1];
+        x[j] -= current + next;
+        if (n--) {
+          j += 2;
+          current = beta * x[j + 1];
+          x[j] -= current + next;
+        } else {
+          break;
+        }
+      }
+
+      // step 6
+      if (len !== 0) {
+        j = offset + 1;
+        current = alpha * x[j - 1];
+        for (n = len; n--; j += 2) {
+          next = alpha * x[j + 1];
+          x[j] -= current + next;
+          if (n--) {
+            j += 2;
+            current = alpha * x[j + 1];
+            x[j] -= current + next;
+          } else {
+            break;
+          }
+        }
+      }
+    };
+
+    return IrreversibleTransform;
+  })();
+
+  // Section 3.8.1 Reversible 5-3 filter
+  var ReversibleTransform = (function ReversibleTransformClosure() {
+    function ReversibleTransform() {
+      Transform.call(this);
+    }
+
+    ReversibleTransform.prototype = Object.create(Transform.prototype);
+    ReversibleTransform.prototype.filter =
+      function reversibleTransformFilter(x, offset, length) {
+      var len = length >> 1;
+      offset = offset | 0;
+      var j, n;
+
+      for (j = offset, n = len + 1; n--; j += 2) {
+        x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2;
+      }
+
+      for (j = offset + 1, n = len; n--; j += 2) {
+        x[j] += (x[j - 1] + x[j + 1]) >> 1;
+      }
+    };
+
+    return ReversibleTransform;
+  })();
+
+  return JpxImage;
+})();
+
+
+
+var Jbig2Image = (function Jbig2ImageClosure() {
+  // Utility data structures
+  function ContextCache() {}
+
+  ContextCache.prototype = {
+    getContexts: function(id) {
+      if (id in this) {
+        return this[id];
+      }
+      return (this[id] = new Int8Array(1<<16));
+    }
+  };
+
+  function DecodingContext(data, start, end) {
+    this.data = data;
+    this.start = start;
+    this.end = end;
+  }
+
+  DecodingContext.prototype = {
+    get decoder() {
+      var decoder = new ArithmeticDecoder(this.data, this.start, this.end);
+      return shadow(this, 'decoder', decoder);
+    },
+    get contextCache() {
+      var cache = new ContextCache();
+      return shadow(this, 'contextCache', cache);
+    }
+  };
+
+  // Annex A. Arithmetic Integer Decoding Procedure
+  // A.2 Procedure for decoding values
+  function decodeInteger(contextCache, procedure, decoder) {
+    var contexts = contextCache.getContexts(procedure);
+
+    var prev = 1;
+    var state = 1, v = 0, s;
+    var toRead = 32, offset = 4436; // defaults for state 7
+    while (state) {
+      var bit = decoder.readBit(contexts, prev);
+      prev = (prev < 256 ? (prev << 1) | bit :
+              (((prev << 1) | bit) & 511) | 256);
+      switch (state) {
+        case 1:
+          s = !!bit;
+          break;
+        case 2:
+          if (bit) {
+            break;
+          }
+          state = 7;
+          toRead = 2;
+          offset = 0;
+          break;
+        case 3:
+          if (bit) {
+            break;
+          }
+          state = 7;
+          toRead = 4;
+          offset = 4;
+          break;
+        case 4:
+          if (bit) {
+            break;
+          }
+          state = 7;
+          toRead = 6;
+          offset = 20;
+          break;
+        case 5:
+          if (bit) {
+            break;
+          }
+          state = 7;
+          toRead = 8;
+          offset = 84;
+          break;
+        case 6:
+          if (bit) {
+            break;
+          }
+          state = 7;
+          toRead = 12;
+          offset = 340;
+          break;
+        default:
+          v = ((v << 1) | bit) >>> 0;
+          if (--toRead === 0) {
+            state = 0;
+          }
+          continue;
+      }
+      state++;
+    }
+    v += offset;
+    return (!s ? v : (v > 0 ? -v : null));
+  }
+
+  // A.3 The IAID decoding procedure
+  function decodeIAID(contextCache, decoder, codeLength) {
+    var contexts = contextCache.getContexts('IAID');
+
+    var prev = 1;
+    for (var i = 0; i < codeLength; i++) {
+      var bit = decoder.readBit(contexts, prev);
+      prev = (prev << 1) | bit;
+    }
+    if (codeLength < 31) {
+      return prev & ((1 << codeLength) - 1);
+    }
+    return prev & 0x7FFFFFFF;
+  }
+
+  // 7.3 Segment types
+  var SegmentTypes = [
+    'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null,
+    'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null,
+    null, null, null, null, null, 'patternDictionary', null, null, null,
+    'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion',
+    'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null,
+    null, null, null, null, null, 'IntermediateGenericRegion', null,
+    'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion',
+    'IntermediateGenericRefinementRegion', null,
+    'ImmediateGenericRefinementRegion',
+    'ImmediateLosslessGenericRefinementRegion', null, null, null, null,
+    'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles',
+    'Tables', null, null, null, null, null, null, null, null,
+    'Extension'
+  ];
+
+  var CodingTemplates = [
+    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
+     {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1},
+     {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
+    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2},
+     {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1},
+     {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
+    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
+     {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0},
+     {x: -1, y: 0}],
+    [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1},
+     {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}]
+  ];
+
+  var RefinementTemplates = [
+    {
+      coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
+      reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0},
+                  {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}]
+    },
+    {
+      coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
+      reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0},
+                  {x: 0, y: 1}, {x: 1, y: 1}]
+    }
+  ];
+
+  var ReusedContexts = [
+    0x1CD3, // '00111001101' (template) + '0011' (at),
+    0x079A, // '001111001101' + '0',
+    0x00E3, // '001110001' + '1',
+    0x018B  // '011000101' + '1'
+  ];
+
+  var RefinementReusedContexts = [
+    0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference)
+    0x0008  // '0000' + '001000'
+  ];
+
+  // 6.2 Generic Region Decoding Procedure
+  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at,
+                        decodingContext) {
+    if (mmr) {
+      error('JBIG2 error: MMR encoding is not supported');
+    }
+
+    var useskip = !!skip;
+    var template = CodingTemplates[templateIndex].concat(at);
+
+    // Sorting is non-standard, and it is not required. But sorting increases
+    // the number of template bits that can be reused from the previous
+    // contextLabel in the main loop.
+    template.sort(function (a, b) {
+      return (a.y - b.y) || (a.x - b.x);
+    });
+
+    var templateLength = template.length;
+    var templateX = new Int8Array(templateLength);
+    var templateY = new Int8Array(templateLength);
+    var changingTemplateEntries = [];
+    var reuseMask = 0, minX = 0, maxX = 0, minY = 0;
+    var c, k;
+
+    for (k = 0; k < templateLength; k++) {
+      templateX[k] = template[k].x;
+      templateY[k] = template[k].y;
+      minX = Math.min(minX, template[k].x);
+      maxX = Math.max(maxX, template[k].x);
+      minY = Math.min(minY, template[k].y);
+      // Check if the template pixel appears in two consecutive context labels,
+      // so it can be reused. Otherwise, we add it to the list of changing
+      // template entries.
+      if (k < templateLength - 1 &&
+          template[k].y === template[k + 1].y &&
+          template[k].x === template[k + 1].x - 1) {
+        reuseMask |= 1 << (templateLength - 1 - k);
+      } else {
+        changingTemplateEntries.push(k);
+      }
+    }
+    var changingEntriesLength = changingTemplateEntries.length;
+
+    var changingTemplateX = new Int8Array(changingEntriesLength);
+    var changingTemplateY = new Int8Array(changingEntriesLength);
+    var changingTemplateBit = new Uint16Array(changingEntriesLength);
+    for (c = 0; c < changingEntriesLength; c++) {
+      k = changingTemplateEntries[c];
+      changingTemplateX[c] = template[k].x;
+      changingTemplateY[c] = template[k].y;
+      changingTemplateBit[c] = 1 << (templateLength - 1 - k);
+    }
+
+    // Get the safe bounding box edges from the width, height, minX, maxX, minY
+    var sbb_left = -minX;
+    var sbb_top = -minY;
+    var sbb_right = width - maxX;
+
+    var pseudoPixelContext = ReusedContexts[templateIndex];
+    var row = new Uint8Array(width);
+    var bitmap = [];
+
+    var decoder = decodingContext.decoder;
+    var contexts = decodingContext.contextCache.getContexts('GB');
+
+    var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift;
+    for (var i = 0; i < height; i++) {
+      if (prediction) {
+        var sltp = decoder.readBit(contexts, pseudoPixelContext);
+        ltp ^= sltp;
+        if (ltp) {
+          bitmap.push(row); // duplicate previous row
+          continue;
+        }
+      }
+      row = new Uint8Array(row);
+      bitmap.push(row);
+      for (j = 0; j < width; j++) {
+        if (useskip && skip[i][j]) {
+          row[j] = 0;
+          continue;
+        }
+        // Are we in the middle of a scanline, so we can reuse contextLabel
+        // bits?
+        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
+          // If yes, we can just shift the bits that are reusable and only
+          // fetch the remaining ones.
+          contextLabel = (contextLabel << 1) & reuseMask;
+          for (k = 0; k < changingEntriesLength; k++) {
+            i0 = i + changingTemplateY[k];
+            j0 = j + changingTemplateX[k];
+            bit = bitmap[i0][j0];
+            if (bit) {
+              bit = changingTemplateBit[k];
+              contextLabel |= bit;
+            }
+          }
+        } else {
+          // compute the contextLabel from scratch
+          contextLabel = 0;
+          shift = templateLength - 1;
+          for (k = 0; k < templateLength; k++, shift--) {
+            j0 = j + templateX[k];
+            if (j0 >= 0 && j0 < width) {
+              i0 = i + templateY[k];
+              if (i0 >= 0) {
+                bit = bitmap[i0][j0];
+                if (bit) {
+                  contextLabel |= bit << shift;
+                }
+              }
+            }
+          }
+        }
+        var pixel = decoder.readBit(contexts, contextLabel);
+        row[j] = pixel;
+      }
+    }
+    return bitmap;
+  }
+
+  // 6.3.2 Generic Refinement Region Decoding Procedure
+  function decodeRefinement(width, height, templateIndex, referenceBitmap,
+                            offsetX, offsetY, prediction, at,
+                            decodingContext) {
+    var codingTemplate = RefinementTemplates[templateIndex].coding;
+    if (templateIndex === 0) {
+      codingTemplate = codingTemplate.concat([at[0]]);
+    }
+    var codingTemplateLength = codingTemplate.length;
+    var codingTemplateX = new Int32Array(codingTemplateLength);
+    var codingTemplateY = new Int32Array(codingTemplateLength);
+    var k;
+    for (k = 0; k < codingTemplateLength; k++) {
+      codingTemplateX[k] = codingTemplate[k].x;
+      codingTemplateY[k] = codingTemplate[k].y;
+    }
+
+    var referenceTemplate = RefinementTemplates[templateIndex].reference;
+    if (templateIndex === 0) {
+      referenceTemplate = referenceTemplate.concat([at[1]]);
+    }
+    var referenceTemplateLength = referenceTemplate.length;
+    var referenceTemplateX = new Int32Array(referenceTemplateLength);
+    var referenceTemplateY = new Int32Array(referenceTemplateLength);
+    for (k = 0; k < referenceTemplateLength; k++) {
+      referenceTemplateX[k] = referenceTemplate[k].x;
+      referenceTemplateY[k] = referenceTemplate[k].y;
+    }
+    var referenceWidth = referenceBitmap[0].length;
+    var referenceHeight = referenceBitmap.length;
+
+    var pseudoPixelContext = RefinementReusedContexts[templateIndex];
+    var bitmap = [];
+
+    var decoder = decodingContext.decoder;
+    var contexts = decodingContext.contextCache.getContexts('GR');
+
+    var ltp = 0;
+    for (var i = 0; i < height; i++) {
+      if (prediction) {
+        var sltp = decoder.readBit(contexts, pseudoPixelContext);
+        ltp ^= sltp;
+        if (ltp) {
+          error('JBIG2 error: prediction is not supported');
+        }
+      }
+      var row = new Uint8Array(width);
+      bitmap.push(row);
+      for (var j = 0; j < width; j++) {
+        var i0, j0;
+        var contextLabel = 0;
+        for (k = 0; k < codingTemplateLength; k++) {
+          i0 = i + codingTemplateY[k];
+          j0 = j + codingTemplateX[k];
+          if (i0 < 0 || j0 < 0 || j0 >= width) {
+            contextLabel <<= 1; // out of bound pixel
+          } else {
+            contextLabel = (contextLabel << 1) | bitmap[i0][j0];
+          }
+        }
+        for (k = 0; k < referenceTemplateLength; k++) {
+          i0 = i + referenceTemplateY[k] + offsetY;
+          j0 = j + referenceTemplateX[k] + offsetX;
+          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 ||
+              j0 >= referenceWidth) {
+            contextLabel <<= 1; // out of bound pixel
+          } else {
+            contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0];
+          }
+        }
+        var pixel = decoder.readBit(contexts, contextLabel);
+        row[j] = pixel;
+      }
+    }
+
+    return bitmap;
+  }
+
+  // 6.5.5 Decoding the symbol dictionary
+  function decodeSymbolDictionary(huffman, refinement, symbols,
+                                  numberOfNewSymbols, numberOfExportedSymbols,
+                                  huffmanTables, templateIndex, at,
+                                  refinementTemplateIndex, refinementAt,
+                                  decodingContext) {
+    if (huffman) {
+      error('JBIG2 error: huffman is not supported');
+    }
+
+    var newSymbols = [];
+    var currentHeight = 0;
+    var symbolCodeLength = log2(symbols.length + numberOfNewSymbols);
+
+    var decoder = decodingContext.decoder;
+    var contextCache = decodingContext.contextCache;
+
+    while (newSymbols.length < numberOfNewSymbols) {
+      var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6
+      currentHeight += deltaHeight;
+      var currentWidth = 0;
+      var totalWidth = 0;
+      while (true) {
+        var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7
+        if (deltaWidth === null) {
+          break; // OOB
+        }
+        currentWidth += deltaWidth;
+        totalWidth += currentWidth;
+        var bitmap;
+        if (refinement) {
+          // 6.5.8.2 Refinement/aggregate-coded symbol bitmap
+          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);
+          if (numberOfInstances > 1) {
+            bitmap = decodeTextRegion(huffman, refinement,
+                                      currentWidth, currentHeight, 0,
+                                      numberOfInstances, 1, //strip size
+                                      symbols.concat(newSymbols),
+                                      symbolCodeLength,
+                                      0, //transposed
+                                      0, //ds offset
+                                      1, //top left 7.4.3.1.1
+                                      0, //OR operator
+                                      huffmanTables,
+                                      refinementTemplateIndex, refinementAt,
+                                      decodingContext);
+          } else {
+            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
+            var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
+            var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
+            var symbol = (symbolId < symbols.length ? symbols[symbolId] :
+                          newSymbols[symbolId - symbols.length]);
+            bitmap = decodeRefinement(currentWidth, currentHeight,
+            refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt,
+            decodingContext);
+          }
+        } else {
+          // 6.5.8.1 Direct-coded symbol bitmap
+          bitmap = decodeBitmap(false, currentWidth, currentHeight,
+            templateIndex, false, null, at, decodingContext);
+        }
+        newSymbols.push(bitmap);
+      }
+    }
+    // 6.5.10 Exported symbols
+    var exportedSymbols = [];
+    var flags = [], currentFlag = false;
+    var totalSymbolsLength = symbols.length + numberOfNewSymbols;
+    while (flags.length < totalSymbolsLength) {
+      var runLength = decodeInteger(contextCache, 'IAEX', decoder);
+      while (runLength--) {
+        flags.push(currentFlag);
+      }
+      currentFlag = !currentFlag;
+    }
+    for (var i = 0, ii = symbols.length; i < ii; i++) {
+      if (flags[i]) {
+        exportedSymbols.push(symbols[i]);
+      }
+    }
+    for (var j = 0; j < numberOfNewSymbols; i++, j++) {
+      if (flags[i]) {
+        exportedSymbols.push(newSymbols[j]);
+      }
+    }
+    return exportedSymbols;
+  }
+
+  function decodeTextRegion(huffman, refinement, width, height,
+                            defaultPixelValue, numberOfSymbolInstances,
+                            stripSize, inputSymbols, symbolCodeLength,
+                            transposed, dsOffset, referenceCorner,
+                            combinationOperator, huffmanTables,
+                            refinementTemplateIndex, refinementAt,
+                            decodingContext) {
+    if (huffman) {
+      error('JBIG2 error: huffman is not supported');
+    }
+
+    // Prepare bitmap
+    var bitmap = [];
+    var i, row;
+    for (i = 0; i < height; i++) {
+      row = new Uint8Array(width);
+      if (defaultPixelValue) {
+        for (var j = 0; j < width; j++) {
+          row[j] = defaultPixelValue;
+        }
+      }
+      bitmap.push(row);
+    }
+
+    var decoder = decodingContext.decoder;
+    var contextCache = decodingContext.contextCache;
+    var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
+    var firstS = 0;
+    i = 0;
+    while (i < numberOfSymbolInstances) {
+      var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
+      stripT += deltaT;
+
+      var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7
+      firstS += deltaFirstS;
+      var currentS = firstS;
+      do {
+        var currentT = (stripSize == 1 ? 0 :
+                        decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9
+        var t = stripSize * stripT + currentT;
+        var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
+        var applyRefinement = (refinement &&
+                               decodeInteger(contextCache, 'IARI', decoder));
+        var symbolBitmap = inputSymbols[symbolId];
+        var symbolWidth = symbolBitmap[0].length;
+        var symbolHeight = symbolBitmap.length;
+        if (applyRefinement) {
+          var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1
+          var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2
+          var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
+          var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
+          symbolWidth += rdw;
+          symbolHeight += rdh;
+          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight,
+            refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx,
+            (rdh >> 1) + rdy, false, refinementAt,
+            decodingContext);
+        }
+        var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight);
+        var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0);
+        var s2, t2, symbolRow;
+        if (transposed) {
+          // Place Symbol Bitmap from T1,S1
+          for (s2 = 0; s2 < symbolHeight; s2++) {
+            row = bitmap[offsetS + s2];
+            if (!row) {
+              continue;
+            }
+            symbolRow = symbolBitmap[s2];
+            // To ignore Parts of Symbol bitmap which goes
+            // outside bitmap region
+            var maxWidth = Math.min(width - offsetT, symbolWidth);
+            switch (combinationOperator) {
+              case 0: // OR
+                for (t2 = 0; t2 < maxWidth; t2++) {
+                  row[offsetT + t2] |= symbolRow[t2];
+                }
+                break;
+              case 2: // XOR
+                for (t2 = 0; t2 < maxWidth; t2++) {
+                  row[offsetT + t2] ^= symbolRow[t2];
+                }
+                break;
+              default:
+                error('JBIG2 error: operator ' + combinationOperator +
+                      ' is not supported');
+            }
+          }
+          currentS += symbolHeight - 1;
+        } else {
+          for (t2 = 0; t2 < symbolHeight; t2++) {
+            row = bitmap[offsetT + t2];
+            if (!row) {
+              continue;
+            }
+            symbolRow = symbolBitmap[t2];
+            switch (combinationOperator) {
+              case 0: // OR
+                for (s2 = 0; s2 < symbolWidth; s2++) {
+                  row[offsetS + s2] |= symbolRow[s2];
+                }
+                break;
+              case 2: // XOR
+                for (s2 = 0; s2 < symbolWidth; s2++) {
+                  row[offsetS + s2] ^= symbolRow[s2];
+                }
+                break;
+              default:
+                error('JBIG2 error: operator ' + combinationOperator +
+                      ' is not supported');
+            }
+          }
+          currentS += symbolWidth - 1;
+        }
+        i++;
+        var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8
+        if (deltaS === null) {
+          break; // OOB
+        }
+        currentS += deltaS + dsOffset;
+      } while (true);
+    }
+    return bitmap;
+  }
+
+  function readSegmentHeader(data, start) {
+    var segmentHeader = {};
+    segmentHeader.number = readUint32(data, start);
+    var flags = data[start + 4];
+    var segmentType = flags & 0x3F;
+    if (!SegmentTypes[segmentType]) {
+      error('JBIG2 error: invalid segment type: ' + segmentType);
+    }
+    segmentHeader.type = segmentType;
+    segmentHeader.typeName = SegmentTypes[segmentType];
+    segmentHeader.deferredNonRetain = !!(flags & 0x80);
+
+    var pageAssociationFieldSize = !!(flags & 0x40);
+    var referredFlags = data[start + 5];
+    var referredToCount = (referredFlags >> 5) & 7;
+    var retainBits = [referredFlags & 31];
+    var position = start + 6;
+    if (referredFlags == 7) {
+      referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF;
+      position += 3;
+      var bytes = (referredToCount + 7) >> 3;
+      retainBits[0] = data[position++];
+      while (--bytes > 0) {
+        retainBits.push(data[position++]);
+      }
+    } else if (referredFlags == 5 || referredFlags == 6) {
+      error('JBIG2 error: invalid referred-to flags');
+    }
+
+    segmentHeader.retainBits = retainBits;
+    var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 :
+      (segmentHeader.number <= 65536 ? 2 : 4));
+    var referredTo = [];
+    var i, ii;
+    for (i = 0; i < referredToCount; i++) {
+      var number = (referredToSegmentNumberSize == 1 ? data[position] :
+        (referredToSegmentNumberSize == 2 ? readUint16(data, position) :
+        readUint32(data, position)));
+      referredTo.push(number);
+      position += referredToSegmentNumberSize;
+    }
+    segmentHeader.referredTo = referredTo;
+    if (!pageAssociationFieldSize) {
+      segmentHeader.pageAssociation = data[position++];
+    } else {
+      segmentHeader.pageAssociation = readUint32(data, position);
+      position += 4;
+    }
+    segmentHeader.length = readUint32(data, position);
+    position += 4;
+
+    if (segmentHeader.length == 0xFFFFFFFF) {
+      // 7.2.7 Segment data length, unknown segment length
+      if (segmentType === 38) { // ImmediateGenericRegion
+        var genericRegionInfo = readRegionSegmentInformation(data, position);
+        var genericRegionSegmentFlags = data[position +
+          RegionSegmentInformationFieldLength];
+        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);
+        // searching for the segment end
+        var searchPatternLength = 6;
+        var searchPattern = new Uint8Array(searchPatternLength);
+        if (!genericRegionMmr) {
+          searchPattern[0] = 0xFF;
+          searchPattern[1] = 0xAC;
+        }
+        searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF;
+        searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF;
+        searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF;
+        searchPattern[5] = genericRegionInfo.height & 0xFF;
+        for (i = position, ii = data.length; i < ii; i++) {
+          var j = 0;
+          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
+            j++;
+          }
+          if (j == searchPatternLength) {
+            segmentHeader.length = i + searchPatternLength;
+            break;
+          }
+        }
+        if (segmentHeader.length == 0xFFFFFFFF) {
+          error('JBIG2 error: segment end was not found');
+        }
+      } else {
+        error('JBIG2 error: invalid unknown segment length');
+      }
+    }
+    segmentHeader.headerEnd = position;
+    return segmentHeader;
+  }
+
+  function readSegments(header, data, start, end) {
+    var segments = [];
+    var position = start;
+    while (position < end) {
+      var segmentHeader = readSegmentHeader(data, position);
+      position = segmentHeader.headerEnd;
+      var segment = {
+        header: segmentHeader,
+        data: data
+      };
+      if (!header.randomAccess) {
+        segment.start = position;
+        position += segmentHeader.length;
+        segment.end = position;
+      }
+      segments.push(segment);
+      if (segmentHeader.type == 51) {
+        break; // end of file is found
+      }
+    }
+    if (header.randomAccess) {
+      for (var i = 0, ii = segments.length; i < ii; i++) {
+        segments[i].start = position;
+        position += segments[i].header.length;
+        segments[i].end = position;
+      }
+    }
+    return segments;
+  }
+
+  // 7.4.1 Region segment information field
+  function readRegionSegmentInformation(data, start) {
+    return {
+      width: readUint32(data, start),
+      height: readUint32(data, start + 4),
+      x: readUint32(data, start + 8),
+      y: readUint32(data, start + 12),
+      combinationOperator: data[start + 16] & 7
+    };
+  }
+  var RegionSegmentInformationFieldLength = 17;
+
+  function processSegment(segment, visitor) {
+    var header = segment.header;
+
+    var data = segment.data, position = segment.start, end = segment.end;
+    var args, at, i, atLength;
+    switch (header.type) {
+      case 0: // SymbolDictionary
+        // 7.4.2 Symbol dictionary segment syntax
+        var dictionary = {};
+        var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1
+        dictionary.huffman = !!(dictionaryFlags & 1);
+        dictionary.refinement = !!(dictionaryFlags & 2);
+        dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3;
+        dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3;
+        dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1;
+        dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1;
+        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
+        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
+        dictionary.template = (dictionaryFlags >> 10) & 3;
+        dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1;
+        position += 2;
+        if (!dictionary.huffman) {
+          atLength = dictionary.template === 0 ? 4 : 1;
+          at = [];
+          for (i = 0; i < atLength; i++) {
+            at.push({
+              x: readInt8(data, position),
+              y: readInt8(data, position + 1)
+            });
+            position += 2;
+          }
+          dictionary.at = at;
+        }
+        if (dictionary.refinement && !dictionary.refinementTemplate) {
+          at = [];
+          for (i = 0; i < 2; i++) {
+            at.push({
+              x: readInt8(data, position),
+              y: readInt8(data, position + 1)
+            });
+            position += 2;
+          }
+          dictionary.refinementAt = at;
+        }
+        dictionary.numberOfExportedSymbols = readUint32(data, position);
+        position += 4;
+        dictionary.numberOfNewSymbols = readUint32(data, position);
+        position += 4;
+        args = [dictionary, header.number, header.referredTo,
+                data, position, end];
+        break;
+      case 6: // ImmediateTextRegion
+      case 7: // ImmediateLosslessTextRegion
+        var textRegion = {};
+        textRegion.info = readRegionSegmentInformation(data, position);
+        position += RegionSegmentInformationFieldLength;
+        var textRegionSegmentFlags = readUint16(data, position);
+        position += 2;
+        textRegion.huffman = !!(textRegionSegmentFlags & 1);
+        textRegion.refinement = !!(textRegionSegmentFlags & 2);
+        textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3);
+        textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3;
+        textRegion.transposed = !!(textRegionSegmentFlags & 64);
+        textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3;
+        textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1;
+        textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27;
+        textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1;
+        if (textRegion.huffman) {
+          var textRegionHuffmanFlags = readUint16(data, position);
+          position += 2;
+          textRegion.huffmanFS = (textRegionHuffmanFlags) & 3;
+          textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3;
+          textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3;
+          textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3;
+          textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3;
+          textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3;
+          textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3;
+          textRegion.huffmanRefinementSizeSelector =
+            !!(textRegionHuffmanFlags & 14);
+        }
+        if (textRegion.refinement && !textRegion.refinementTemplate) {
+          at = [];
+          for (i = 0; i < 2; i++) {
+            at.push({
+              x: readInt8(data, position),
+              y: readInt8(data, position + 1)
+            });
+            position += 2;
+          }
+          textRegion.refinementAt = at;
+        }
+        textRegion.numberOfSymbolInstances = readUint32(data, position);
+        position += 4;
+        // TODO 7.4.3.1.7 Symbol ID Huffman table decoding
+        if (textRegion.huffman) {
+          error('JBIG2 error: huffman is not supported');
+        }
+        args = [textRegion, header.referredTo, data, position, end];
+        break;
+      case 38: // ImmediateGenericRegion
+      case 39: // ImmediateLosslessGenericRegion
+        var genericRegion = {};
+        genericRegion.info = readRegionSegmentInformation(data, position);
+        position += RegionSegmentInformationFieldLength;
+        var genericRegionSegmentFlags = data[position++];
+        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
+        genericRegion.template = (genericRegionSegmentFlags >> 1) & 3;
+        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
+        if (!genericRegion.mmr) {
+          atLength = genericRegion.template === 0 ? 4 : 1;
+          at = [];
+          for (i = 0; i < atLength; i++) {
+            at.push({
+              x: readInt8(data, position),
+              y: readInt8(data, position + 1)
+            });
+            position += 2;
+          }
+          genericRegion.at = at;
+        }
+        args = [genericRegion, data, position, end];
+        break;
+      case 48: // PageInformation
+        var pageInfo = {
+          width: readUint32(data, position),
+          height: readUint32(data, position + 4),
+          resolutionX: readUint32(data, position + 8),
+          resolutionY: readUint32(data, position + 12)
+        };
+        if (pageInfo.height == 0xFFFFFFFF) {
+          delete pageInfo.height;
+        }
+        var pageSegmentFlags = data[position + 16];
+        var pageStripingInformatiom = readUint16(data, position + 17);
+        pageInfo.lossless = !!(pageSegmentFlags & 1);
+        pageInfo.refinement = !!(pageSegmentFlags & 2);
+        pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1;
+        pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3;
+        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
+        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
+        args = [pageInfo];
+        break;
+      case 49: // EndOfPage
+        break;
+      case 50: // EndOfStripe
+        break;
+      case 51: // EndOfFile
+        break;
+      case 62: // 7.4.15 defines 2 extension types which
+               // are comments and can be ignored.
+        break;
+      default:
+        error('JBIG2 error: segment type ' + header.typeName + '(' +
+              header.type + ') is not implemented');
+    }
+    var callbackName = 'on' + header.typeName;
+    if (callbackName in visitor) {
+      visitor[callbackName].apply(visitor, args);
+    }
+  }
+
+  function processSegments(segments, visitor) {
+    for (var i = 0, ii = segments.length; i < ii; i++) {
+      processSegment(segments[i], visitor);
+    }
+  }
+
+  function parseJbig2(data, start, end) {
+    var position = start;
+    if (data[position] != 0x97 || data[position + 1] != 0x4A ||
+        data[position + 2] != 0x42 || data[position + 3] != 0x32 ||
+        data[position + 4] != 0x0D || data[position + 5] != 0x0A ||
+        data[position + 6] != 0x1A || data[position + 7] != 0x0A) {
+      error('JBIG2 error: invalid header');
+    }
+    var header = {};
+    position += 8;
+    var flags = data[position++];
+    header.randomAccess = !(flags & 1);
+    if (!(flags & 2)) {
+      header.numberOfPages = readUint32(data, position);
+      position += 4;
+    }
+    var segments = readSegments(header, data, position, end);
+    error('Not implemented');
+    // processSegments(segments, new SimpleSegmentVisitor());
+  }
+
+  function parseJbig2Chunks(chunks) {
+    var visitor = new SimpleSegmentVisitor();
+    for (var i = 0, ii = chunks.length; i < ii; i++) {
+      var chunk = chunks[i];
+      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
+      processSegments(segments, visitor);
+    }
+    return visitor.buffer;
+  }
+
+  function SimpleSegmentVisitor() {}
+
+  SimpleSegmentVisitor.prototype = {
+    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
+      this.currentPageInfo = info;
+      var rowSize = (info.width + 7) >> 3;
+      var buffer = new Uint8Array(rowSize * info.height);
+      // The contents of ArrayBuffers are initialized to 0.
+      // Fill the buffer with 0xFF only if info.defaultPixelValue is set
+      if (info.defaultPixelValue) {
+        for (var i = 0, ii = buffer.length; i < ii; i++) {
+          buffer[i] = 0xFF;
+        }
+      }
+      this.buffer = buffer;
+    },
+    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
+      var pageInfo = this.currentPageInfo;
+      var width = regionInfo.width, height = regionInfo.height;
+      var rowSize = (pageInfo.width + 7) >> 3;
+      var combinationOperator = pageInfo.combinationOperatorOverride ?
+        regionInfo.combinationOperator : pageInfo.combinationOperator;
+      var buffer = this.buffer;
+      var mask0 =  128 >> (regionInfo.x & 7);
+      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
+      var i, j, mask, offset;
+      switch (combinationOperator) {
+        case 0: // OR
+          for (i = 0; i < height; i++) {
+            mask = mask0;
+            offset = offset0;
+            for (j = 0; j < width; j++) {
+              if (bitmap[i][j]) {
+                buffer[offset] |= mask;
+              }
+              mask >>= 1;
+              if (!mask) {
+                mask = 128;
+                offset++;
+              }
+            }
+            offset0 += rowSize;
+          }
+        break;
+        case 2: // XOR
+          for (i = 0; i < height; i++) {
+            mask = mask0;
+            offset = offset0;
+            for (j = 0; j < width; j++) {
+              if (bitmap[i][j]) {
+                buffer[offset] ^= mask;
+              }
+              mask >>= 1;
+              if (!mask) {
+                mask = 128;
+                offset++;
+              }
+            }
+            offset0 += rowSize;
+          }
+          break;
+        default:
+          error('JBIG2 error: operator ' + combinationOperator +
+                ' is not supported');
+      }
+    },
+    onImmediateGenericRegion:
+      function SimpleSegmentVisitor_onImmediateGenericRegion(region, data,
+                                                             start, end) {
+      var regionInfo = region.info;
+      var decodingContext = new DecodingContext(data, start, end);
+      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height,
+                                region.template, region.prediction, null,
+                                region.at, decodingContext);
+      this.drawBitmap(regionInfo, bitmap);
+    },
+    onImmediateLosslessGenericRegion:
+      function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {
+      this.onImmediateGenericRegion.apply(this, arguments);
+    },
+    onSymbolDictionary:
+      function SimpleSegmentVisitor_onSymbolDictionary(dictionary,
+                                                       currentSegment,
+                                                       referredSegments,
+                                                       data, start, end) {
+      var huffmanTables;
+      if (dictionary.huffman) {
+        error('JBIG2 error: huffman is not supported');
+      }
+
+      // Combines exported symbols from all referred segments
+      var symbols = this.symbols;
+      if (!symbols) {
+        this.symbols = symbols = {};
+      }
+
+      var inputSymbols = [];
+      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
+        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
+      }
+
+      var decodingContext = new DecodingContext(data, start, end);
+      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman,
+        dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols,
+        dictionary.numberOfExportedSymbols, huffmanTables,
+        dictionary.template, dictionary.at,
+        dictionary.refinementTemplate, dictionary.refinementAt,
+        decodingContext);
+    },
+    onImmediateTextRegion:
+      function SimpleSegmentVisitor_onImmediateTextRegion(region,
+                                                          referredSegments,
+                                                          data, start, end) {
+      var regionInfo = region.info;
+      var huffmanTables;
+
+      // Combines exported symbols from all referred segments
+      var symbols = this.symbols;
+      var inputSymbols = [];
+      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
+        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
+      }
+      var symbolCodeLength = log2(inputSymbols.length);
+
+      var decodingContext = new DecodingContext(data, start, end);
+      var bitmap = decodeTextRegion(region.huffman, region.refinement,
+        regionInfo.width, regionInfo.height, region.defaultPixelValue,
+        region.numberOfSymbolInstances, region.stripSize, inputSymbols,
+        symbolCodeLength, region.transposed, region.dsOffset,
+        region.referenceCorner, region.combinationOperator, huffmanTables,
+        region.refinementTemplate, region.refinementAt, decodingContext);
+      this.drawBitmap(regionInfo, bitmap);
+    },
+    onImmediateLosslessTextRegion:
+      function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {
+      this.onImmediateTextRegion.apply(this, arguments);
+    }
+  };
+
+  function Jbig2Image() {}
+
+  Jbig2Image.prototype = {
+    parseChunks: function Jbig2Image_parseChunks(chunks) {
+      return parseJbig2Chunks(chunks);
+    }
+  };
+
+  return Jbig2Image;
+})();
+
+
+var bidi = PDFJS.bidi = (function bidiClosure() {
+  // Character types for symbols from 0000 to 00FF.
+  var baseTypes = [
+    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
+    'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+    'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
+    'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
+    'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
+    'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
+    'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
+    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+    'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
+    'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
+    'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
+  ];
+
+  // Character types for symbols from 0600 to 06FF
+  var arabicTypes = [
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
+    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
+    'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
+    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
+    'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
+  ];
+
+  function isOdd(i) {
+    return (i & 1) !== 0;
+  }
+
+  function isEven(i) {
+    return (i & 1) === 0;
+  }
+
+  function findUnequal(arr, start, value) {
+    for (var j = start, jj = arr.length; j < jj; ++j) {
+      if (arr[j] != value) {
+        return j;
+      }
+    }
+    return j;
+  }
+
+  function setValues(arr, start, end, value) {
+    for (var j = start; j < end; ++j) {
+      arr[j] = value;
+    }
+  }
+
+  function reverseValues(arr, start, end) {
+    for (var i = start, j = end - 1; i < j; ++i, --j) {
+      var temp = arr[i];
+      arr[i] = arr[j];
+      arr[j] = temp;
+    }
+  }
+
+  function createBidiText(str, isLTR, vertical) {
+    return {
+      str: str,
+      dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl'))
+    };
+  }
+
+  // These are used in bidi(), which is called frequently. We re-use them on
+  // each call to avoid unnecessary allocations.
+  var chars = [];
+  var types = [];
+
+  function bidi(str, startLevel, vertical) {
+    var isLTR = true;
+    var strLength = str.length;
+    if (strLength === 0 || vertical) {
+      return createBidiText(str, isLTR, vertical);
+    }
+
+    // Get types and fill arrays
+    chars.length = 0;
+    types.length = 0;
+    var numBidi = 0;
+
+    var i, ii;
+    for (i = 0; i < strLength; ++i) {
+      chars[i] = str.charAt(i);
+
+      var charCode = str.charCodeAt(i);
+      var charType = 'L';
+      if (charCode <= 0x00ff) {
+        charType = baseTypes[charCode];
+      } else if (0x0590 <= charCode && charCode <= 0x05f4) {
+        charType = 'R';
+      } else if (0x0600 <= charCode && charCode <= 0x06ff) {
+        charType = arabicTypes[charCode & 0xff];
+      } else if (0x0700 <= charCode && charCode <= 0x08AC) {
+        charType = 'AL';
+      }
+      if (charType == 'R' || charType == 'AL' || charType == 'AN') {
+        numBidi++;
+      }
+      types[i] = charType;
+    }
+
+    // Detect the bidi method
+    // - If there are no rtl characters then no bidi needed
+    // - If less than 30% chars are rtl then string is primarily ltr
+    // - If more than 30% chars are rtl then string is primarily rtl
+    if (numBidi === 0) {
+      isLTR = true;
+      return createBidiText(str, isLTR);
+    }
+
+    if (startLevel == -1) {
+      if ((strLength / numBidi) < 0.3) {
+        isLTR = true;
+        startLevel = 0;
+      } else {
+        isLTR = false;
+        startLevel = 1;
+      }
+    }
+
+    var levels = [];
+    for (i = 0; i < strLength; ++i) {
+      levels[i] = startLevel;
+    }
+
+    /*
+     X1-X10: skip most of this, since we are NOT doing the embeddings.
+     */
+    var e = (isOdd(startLevel) ? 'R' : 'L');
+    var sor = e;
+    var eor = sor;
+
+    /*
+     W1. Examine each non-spacing mark (NSM) in the level run, and change the
+     type of the NSM to the type of the previous character. If the NSM is at the
+     start of the level run, it will get the type of sor.
+     */
+    var lastType = sor;
+    for (i = 0; i < strLength; ++i) {
+      if (types[i] == 'NSM') {
+        types[i] = lastType;
+      } else {
+        lastType = types[i];
+      }
+    }
+
+    /*
+     W2. Search backwards from each instance of a European number until the
+     first strong type (R, L, AL, or sor) is found.  If an AL is found, change
+     the type of the European number to Arabic number.
+     */
+    lastType = sor;
+    var t;
+    for (i = 0; i < strLength; ++i) {
+      t = types[i];
+      if (t == 'EN') {
+        types[i] = (lastType == 'AL') ? 'AN' : 'EN';
+      } else if (t == 'R' || t == 'L' || t == 'AL') {
+        lastType = t;
+      }
+    }
+
+    /*
+     W3. Change all ALs to R.
+     */
+    for (i = 0; i < strLength; ++i) {
+      t = types[i];
+      if (t == 'AL') {
+        types[i] = 'R';
+      }
+    }
+
+    /*
+     W4. A single European separator between two European numbers changes to a
+     European number. A single common separator between two numbers of the same
+     type changes to that type:
+     */
+    for (i = 1; i < strLength - 1; ++i) {
+      if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN') {
+        types[i] = 'EN';
+      }
+      if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') &&
+          types[i + 1] == types[i - 1]) {
+        types[i] = types[i - 1];
+      }
+    }
+
+    /*
+     W5. A sequence of European terminators adjacent to European numbers changes
+     to all European numbers:
+     */
+    for (i = 0; i < strLength; ++i) {
+      if (types[i] == 'EN') {
+        // do before
+        var j;
+        for (j = i - 1; j >= 0; --j) {
+          if (types[j] != 'ET') {
+            break;
+          }
+          types[j] = 'EN';
+        }
+        // do after
+        for (j = i + 1; j < strLength; --j) {
+          if (types[j] != 'ET') {
+            break;
+          }
+          types[j] = 'EN';
+        }
+      }
+    }
+
+    /*
+     W6. Otherwise, separators and terminators change to Other Neutral:
+     */
+    for (i = 0; i < strLength; ++i) {
+      t = types[i];
+      if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS') {
+        types[i] = 'ON';
+      }
+    }
+
+    /*
+     W7. Search backwards from each instance of a European number until the
+     first strong type (R, L, or sor) is found. If an L is found,  then change
+     the type of the European number to L.
+     */
+    lastType = sor;
+    for (i = 0; i < strLength; ++i) {
+      t = types[i];
+      if (t == 'EN') {
+        types[i] = ((lastType == 'L') ? 'L' : 'EN');
+      } else if (t == 'R' || t == 'L') {
+        lastType = t;
+      }
+    }
+
+    /*
+     N1. A sequence of neutrals takes the direction of the surrounding strong
+     text if the text on both sides has the same direction. European and Arabic
+     numbers are treated as though they were R. Start-of-level-run (sor) and
+     end-of-level-run (eor) are used at level run boundaries.
+     */
+    for (i = 0; i < strLength; ++i) {
+      if (types[i] == 'ON') {
+        var end = findUnequal(types, i + 1, 'ON');
+        var before = sor;
+        if (i > 0) {
+          before = types[i - 1];
+        }
+
+        var after = eor;
+        if (end + 1 < strLength) {
+          after = types[end + 1];
+        }
+        if (before != 'L') {
+          before = 'R';
+        }
+        if (after != 'L') {
+          after = 'R';
+        }
+        if (before == after) {
+          setValues(types, i, end, before);
+        }
+        i = end - 1; // reset to end (-1 so next iteration is ok)
+      }
+    }
+
+    /*
+     N2. Any remaining neutrals take the embedding direction.
+     */
+    for (i = 0; i < strLength; ++i) {
+      if (types[i] == 'ON') {
+        types[i] = e;
+      }
+    }
+
+    /*
+     I1. For all characters with an even (left-to-right) embedding direction,
+     those of type R go up one level and those of type AN or EN go up two
+     levels.
+     I2. For all characters with an odd (right-to-left) embedding direction,
+     those of type L, EN or AN go up one level.
+     */
+    for (i = 0; i < strLength; ++i) {
+      t = types[i];
+      if (isEven(levels[i])) {
+        if (t == 'R') {
+          levels[i] += 1;
+        } else if (t == 'AN' || t == 'EN') {
+          levels[i] += 2;
+        }
+      } else { // isOdd
+        if (t == 'L' || t == 'AN' || t == 'EN') {
+          levels[i] += 1;
+        }
+      }
+    }
+
+    /*
+     L1. On each line, reset the embedding level of the following characters to
+     the paragraph embedding level:
+
+     segment separators,
+     paragraph separators,
+     any sequence of whitespace characters preceding a segment separator or
+     paragraph separator, and any sequence of white space characters at the end
+     of the line.
+     */
+
+    // don't bother as text is only single line
+
+    /*
+     L2. From the highest level found in the text to the lowest odd level on
+     each line, reverse any contiguous sequence of characters that are at that
+     level or higher.
+     */
+
+    // find highest level & lowest odd level
+    var highestLevel = -1;
+    var lowestOddLevel = 99;
+    var level;
+    for (i = 0, ii = levels.length; i < ii; ++i) {
+      level = levels[i];
+      if (highestLevel < level) {
+        highestLevel = level;
+      }
+      if (lowestOddLevel > level && isOdd(level)) {
+        lowestOddLevel = level;
+      }
+    }
+
+    // now reverse between those limits
+    for (level = highestLevel; level >= lowestOddLevel; --level) {
+      // find segments to reverse
+      var start = -1;
+      for (i = 0, ii = levels.length; i < ii; ++i) {
+        if (levels[i] < level) {
+          if (start >= 0) {
+            reverseValues(chars, start, i);
+            start = -1;
+          }
+        } else if (start < 0) {
+          start = i;
+        }
+      }
+      if (start >= 0) {
+        reverseValues(chars, start, levels.length);
+      }
+    }
+
+    /*
+     L3. Combining marks applied to a right-to-left base character will at this
+     point precede their base character. If the rendering engine expects them to
+     follow the base characters in the final display process, then the ordering
+     of the marks and the base character must be reversed.
+     */
+
+    // don't bother for now
+
+    /*
+     L4. A character that possesses the mirrored property as specified by
+     Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
+     directionality of that character is R.
+     */
+
+    // don't mirror as characters are already mirrored in the pdf
+
+    // Finally, return string
+    var result = '';
+    for (i = 0, ii = chars.length; i < ii; ++i) {
+      var ch = chars[i];
+      if (ch != '<' && ch != '>') {
+        result += ch;
+      }
+    }
+    return createBidiText(result, isLTR);
+  }
+
+  return bidi;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+/* Copyright 2014 Opera Software ASA
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.
+ * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.
+ */
+/* globals Uint32ArrayView */
+
+'use strict';
+
+var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) {
+  // Workaround for missing math precison in JS.
+  var MASK_HIGH = 0xffff0000;
+  var MASK_LOW = 0xffff;
+
+  function MurmurHash3_64 (seed) {
+    var SEED = 0xc3d2e1f0;
+    this.h1 = seed ? seed & 0xffffffff : SEED;
+    this.h2 = seed ? seed & 0xffffffff : SEED;
+  }
+
+  MurmurHash3_64.prototype = {
+    update: function MurmurHash3_64_update(input) {
+      var useUint32ArrayView = false;
+      var i;
+      if (typeof input == 'string') {
+        var data = new Uint8Array(input.length * 2);
+        var length = 0;
+        for (i = 0; i < input.length; i++) {
+          var code = input.charCodeAt(i);
+          if (code <= 0xff) {
+            data[length++] = code;
+          }
+          else {
+            data[length++] = code >>> 8;
+            data[length++] = code & 0xff;
+          }
+        }
+      } else if (input instanceof Uint8Array) {
+        data = input;
+        length = data.length;
+      } else if (typeof input === 'object' && ('length' in input)) {
+        // processing regular arrays as well, e.g. for IE9
+        data = input;
+        length = data.length;
+        useUint32ArrayView = true;
+      } else {
+        throw new Error('Wrong data format in MurmurHash3_64_update. ' +
+                        'Input must be a string or array.');
+      }
+
+      var blockCounts = length >> 2;
+      var tailLength = length - blockCounts * 4;
+      // we don't care about endianness here
+      var dataUint32 = useUint32ArrayView ?
+        new Uint32ArrayView(data, blockCounts) :
+        new Uint32Array(data.buffer, 0, blockCounts);
+      var k1 = 0;
+      var k2 = 0;
+      var h1 = this.h1;
+      var h2 = this.h2;
+      var C1 = 0xcc9e2d51;
+      var C2 = 0x1b873593;
+      var C1_LOW = C1 & MASK_LOW;
+      var C2_LOW = C2 & MASK_LOW;
+
+      for (i = 0; i < blockCounts; i++) {
+        if (i & 1) {
+          k1 = dataUint32[i];
+          k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);
+          k1 = k1 << 15 | k1 >>> 17;
+          k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);
+          h1 ^= k1;
+          h1 = h1 << 13 | h1 >>> 19;
+          h1 = h1 * 5 + 0xe6546b64;
+        } else {
+          k2 = dataUint32[i];
+          k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW);
+          k2 = k2 << 15 | k2 >>> 17;
+          k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW);
+          h2 ^= k2;
+          h2 = h2 << 13 | h2 >>> 19;
+          h2 = h2 * 5 + 0xe6546b64;
+        }
+      }
+
+      k1 = 0;
+
+      switch (tailLength) {
+        case 3:
+          k1 ^= data[blockCounts * 4 + 2] << 16;
+          /* falls through */
+        case 2:
+          k1 ^= data[blockCounts * 4 + 1] << 8;
+          /* falls through */
+        case 1:
+          k1 ^= data[blockCounts * 4];
+          /* falls through */
+        k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);
+        k1 = k1 << 15 | k1 >>> 17;
+        k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);
+        if (blockCounts & 1) {
+          h1 ^= k1;
+        } else {
+          h2 ^= k1;
+        }
+      }
+
+      this.h1 = h1;
+      this.h2 = h2;
+      return this;
+    },
+
+    hexdigest: function MurmurHash3_64_hexdigest () {
+      var h1 = this.h1;
+      var h2 = this.h2;
+
+      h1 ^= h2 >>> 1;
+      h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW);
+      h2 = (h2 * 0xff51afd7 & MASK_HIGH) |
+           (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16);
+      h1 ^= h2 >>> 1;
+      h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW);
+      h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) |
+           (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16);
+      h1 ^= h2 >>> 1;
+
+      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {
+        var hex = (arr[i] >>> 0).toString(16);
+        while (hex.length < 8) {
+          hex = '0' + hex;
+        }
+        str += hex;
+      }
+
+      return str;
+    }
+  };
+
+  return MurmurHash3_64;
+})();
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/*
+   Copyright 2011 notmasteryet
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+// - The JPEG specification can be found in the ITU CCITT Recommendation T.81
+//   (www.w3.org/Graphics/JPEG/itu-t81.pdf)
+// - The JFIF specification can be found in the JPEG File Interchange Format
+//   (www.w3.org/Graphics/JPEG/jfif3.pdf)
+// - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
+//   in PostScript Level 2, Technical Note #5116
+//   (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
+
+var JpegImage = (function jpegImage() {
+  "use strict";
+  var dctZigZag = new Int32Array([
+     0,
+     1,  8,
+    16,  9,  2,
+     3, 10, 17, 24,
+    32, 25, 18, 11, 4,
+     5, 12, 19, 26, 33, 40,
+    48, 41, 34, 27, 20, 13,  6,
+     7, 14, 21, 28, 35, 42, 49, 56,
+    57, 50, 43, 36, 29, 22, 15,
+    23, 30, 37, 44, 51, 58,
+    59, 52, 45, 38, 31,
+    39, 46, 53, 60,
+    61, 54, 47,
+    55, 62,
+    63
+  ]);
+
+  var dctCos1  =  4017   // cos(pi/16)
+  var dctSin1  =   799   // sin(pi/16)
+  var dctCos3  =  3406   // cos(3*pi/16)
+  var dctSin3  =  2276   // sin(3*pi/16)
+  var dctCos6  =  1567   // cos(6*pi/16)
+  var dctSin6  =  3784   // sin(6*pi/16)
+  var dctSqrt2 =  5793   // sqrt(2)
+  var dctSqrt1d2 = 2896  // sqrt(2) / 2
+
+  function constructor() {
+  }
+
+  function buildHuffmanTable(codeLengths, values) {
+    var k = 0, code = [], i, j, length = 16;
+    while (length > 0 && !codeLengths[length - 1])
+      length--;
+    code.push({children: [], index: 0});
+    var p = code[0], q;
+    for (i = 0; i < length; i++) {
+      for (j = 0; j < codeLengths[i]; j++) {
+        p = code.pop();
+        p.children[p.index] = values[k];
+        while (p.index > 0) {
+          p = code.pop();
+        }
+        p.index++;
+        code.push(p);
+        while (code.length <= i) {
+          code.push(q = {children: [], index: 0});
+          p.children[p.index] = q.children;
+          p = q;
+        }
+        k++;
+      }
+      if (i + 1 < length) {
+        // p here points to last code
+        code.push(q = {children: [], index: 0});
+        p.children[p.index] = q.children;
+        p = q;
+      }
+    }
+    return code[0].children;
+  }
+
+  function getBlockBufferOffset(component, row, col) {
+    return 64 * ((component.blocksPerLine + 1) * row + col);
+  }
+
+  function decodeScan(data, offset,
+                      frame, components, resetInterval,
+                      spectralStart, spectralEnd,
+                      successivePrev, successive) {
+    var precision = frame.precision;
+    var samplesPerLine = frame.samplesPerLine;
+    var scanLines = frame.scanLines;
+    var mcusPerLine = frame.mcusPerLine;
+    var progressive = frame.progressive;
+    var maxH = frame.maxH, maxV = frame.maxV;
+
+    var startOffset = offset, bitsData = 0, bitsCount = 0;
+
+    function readBit() {
+      if (bitsCount > 0) {
+        bitsCount--;
+        return (bitsData >> bitsCount) & 1;
+      }
+      bitsData = data[offset++];
+      if (bitsData == 0xFF) {
+        var nextByte = data[offset++];
+        if (nextByte) {
+          throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
+        }
+        // unstuff 0
+      }
+      bitsCount = 7;
+      return bitsData >>> 7;
+    }
+
+    function decodeHuffman(tree) {
+      var node = tree;
+      var bit;
+      while ((bit = readBit()) !== null) {
+        node = node[bit];
+        if (typeof node === 'number')
+          return node;
+        if (typeof node !== 'object')
+          throw "invalid huffman sequence";
+      }
+      return null;
+    }
+
+    function receive(length) {
+      var n = 0;
+      while (length > 0) {
+        var bit = readBit();
+        if (bit === null) return;
+        n = (n << 1) | bit;
+        length--;
+      }
+      return n;
+    }
+
+    function receiveAndExtend(length) {
+      var n = receive(length);
+      if (n >= 1 << (length - 1))
+        return n;
+      return n + (-1 << length) + 1;
+    }
+
+    function decodeBaseline(component, offset) {
+      var t = decodeHuffman(component.huffmanTableDC);
+      var diff = t === 0 ? 0 : receiveAndExtend(t);
+      component.blockData[offset] = (component.pred += diff);
+      var k = 1;
+      while (k < 64) {
+        var rs = decodeHuffman(component.huffmanTableAC);
+        var s = rs & 15, r = rs >> 4;
+        if (s === 0) {
+          if (r < 15)
+            break;
+          k += 16;
+          continue;
+        }
+        k += r;
+        var z = dctZigZag[k];
+        component.blockData[offset + z] = receiveAndExtend(s);
+        k++;
+      }
+    }
+
+    function decodeDCFirst(component, offset) {
+      var t = decodeHuffman(component.huffmanTableDC);
+      var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
+      component.blockData[offset] = (component.pred += diff);
+    }
+
+    function decodeDCSuccessive(component, offset) {
+      component.blockData[offset] |= readBit() << successive;
+    }
+
+    var eobrun = 0;
+    function decodeACFirst(component, offset) {
+      if (eobrun > 0) {
+        eobrun--;
+        return;
+      }
+      var k = spectralStart, e = spectralEnd;
+      while (k <= e) {
+        var rs = decodeHuffman(component.huffmanTableAC);
+        var s = rs & 15, r = rs >> 4;
+        if (s === 0) {
+          if (r < 15) {
+            eobrun = receive(r) + (1 << r) - 1;
+            break;
+          }
+          k += 16;
+          continue;
+        }
+        k += r;
+        var z = dctZigZag[k];
+        component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);
+        k++;
+      }
+    }
+
+    var successiveACState = 0, successiveACNextValue;
+    function decodeACSuccessive(component, offset) {
+      var k = spectralStart, e = spectralEnd, r = 0;
+      while (k <= e) {
+        var z = dctZigZag[k];
+        switch (successiveACState) {
+        case 0: // initial state
+          var rs = decodeHuffman(component.huffmanTableAC);
+          var s = rs & 15, r = rs >> 4;
+          if (s === 0) {
+            if (r < 15) {
+              eobrun = receive(r) + (1 << r);
+              successiveACState = 4;
+            } else {
+              r = 16;
+              successiveACState = 1;
+            }
+          } else {
+            if (s !== 1)
+              throw "invalid ACn encoding";
+            successiveACNextValue = receiveAndExtend(s);
+            successiveACState = r ? 2 : 3;
+          }
+          continue;
+        case 1: // skipping r zero items
+        case 2:
+          if (component.blockData[offset + z]) {
+            component.blockData[offset + z] += (readBit() << successive);
+          } else {
+            r--;
+            if (r === 0)
+              successiveACState = successiveACState == 2 ? 3 : 0;
+          }
+          break;
+        case 3: // set value for a zero item
+          if (component.blockData[offset + z]) {
+            component.blockData[offset + z] += (readBit() << successive);
+          } else {
+            component.blockData[offset + z] = successiveACNextValue << successive;
+            successiveACState = 0;
+          }
+          break;
+        case 4: // eob
+          if (component.blockData[offset + z]) {
+            component.blockData[offset + z] += (readBit() << successive);
+          }
+          break;
+        }
+        k++;
+      }
+      if (successiveACState === 4) {
+        eobrun--;
+        if (eobrun === 0)
+          successiveACState = 0;
+      }
+    }
+
+    function decodeMcu(component, decode, mcu, row, col) {
+      var mcuRow = (mcu / mcusPerLine) | 0;
+      var mcuCol = mcu % mcusPerLine;
+      var blockRow = mcuRow * component.v + row;
+      var blockCol = mcuCol * component.h + col;
+      var offset = getBlockBufferOffset(component, blockRow, blockCol);
+      decode(component, offset);
+    }
+
+    function decodeBlock(component, decode, mcu) {
+      var blockRow = (mcu / component.blocksPerLine) | 0;
+      var blockCol = mcu % component.blocksPerLine;
+      var offset = getBlockBufferOffset(component, blockRow, blockCol);
+      decode(component, offset);
+    }
+
+    var componentsLength = components.length;
+    var component, i, j, k, n;
+    var decodeFn;
+    if (progressive) {
+      if (spectralStart === 0)
+        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
+      else
+        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
+    } else {
+      decodeFn = decodeBaseline;
+    }
+
+    var mcu = 0, marker;
+    var mcuExpected;
+    if (componentsLength == 1) {
+      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
+    } else {
+      mcuExpected = mcusPerLine * frame.mcusPerColumn;
+    }
+    if (!resetInterval) {
+      resetInterval = mcuExpected;
+    }
+
+    var h, v;
+    while (mcu < mcuExpected) {
+      // reset interval stuff
+      for (i = 0; i < componentsLength; i++) {
+        components[i].pred = 0;
+      }
+      eobrun = 0;
+
+      if (componentsLength == 1) {
+        component = components[0];
+        for (n = 0; n < resetInterval; n++) {
+          decodeBlock(component, decodeFn, mcu);
+          mcu++;
+        }
+      } else {
+        for (n = 0; n < resetInterval; n++) {
+          for (i = 0; i < componentsLength; i++) {
+            component = components[i];
+            h = component.h;
+            v = component.v;
+            for (j = 0; j < v; j++) {
+              for (k = 0; k < h; k++) {
+                decodeMcu(component, decodeFn, mcu, j, k);
+              }
+            }
+          }
+          mcu++;
+        }
+      }
+
+      // find marker
+      bitsCount = 0;
+      marker = (data[offset] << 8) | data[offset + 1];
+      if (marker <= 0xFF00) {
+        throw "marker was not found";
+      }
+
+      if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
+        offset += 2;
+      } else {
+        break;
+      }
+    }
+
+    return offset - startOffset;
+  }
+
+  // A port of poppler's IDCT method which in turn is taken from:
+  //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
+  //   "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
+  //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
+  //   988-991.
+  function quantizeAndInverse(component, blockBufferOffset, p) {
+    var qt = component.quantizationTable;
+    var v0, v1, v2, v3, v4, v5, v6, v7, t;
+    var i;
+
+    // dequant
+    for (i = 0; i < 64; i++) {
+      p[i] = component.blockData[blockBufferOffset + i] * qt[i];
+    }
+
+    // inverse DCT on rows
+    for (i = 0; i < 8; ++i) {
+      var row = 8 * i;
+
+      // check for all-zero AC coefficients
+      if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
+          p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
+          p[7 + row] == 0) {
+        t = (dctSqrt2 * p[0 + row] + 512) >> 10;
+        p[0 + row] = t;
+        p[1 + row] = t;
+        p[2 + row] = t;
+        p[3 + row] = t;
+        p[4 + row] = t;
+        p[5 + row] = t;
+        p[6 + row] = t;
+        p[7 + row] = t;
+        continue;
+      }
+
+      // stage 4
+      v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
+      v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
+      v2 = p[2 + row];
+      v3 = p[6 + row];
+      v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
+      v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
+      v5 = p[3 + row] << 4;
+      v6 = p[5 + row] << 4;
+
+      // stage 3
+      t = (v0 - v1+ 1) >> 1;
+      v0 = (v0 + v1 + 1) >> 1;
+      v1 = t;
+      t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
+      v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
+      v3 = t;
+      t = (v4 - v6 + 1) >> 1;
+      v4 = (v4 + v6 + 1) >> 1;
+      v6 = t;
+      t = (v7 + v5 + 1) >> 1;
+      v5 = (v7 - v5 + 1) >> 1;
+      v7 = t;
+
+      // stage 2
+      t = (v0 - v3 + 1) >> 1;
+      v0 = (v0 + v3 + 1) >> 1;
+      v3 = t;
+      t = (v1 - v2 + 1) >> 1;
+      v1 = (v1 + v2 + 1) >> 1;
+      v2 = t;
+      t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+      v7 = t;
+      t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+      v6 = t;
+
+      // stage 1
+      p[0 + row] = v0 + v7;
+      p[7 + row] = v0 - v7;
+      p[1 + row] = v1 + v6;
+      p[6 + row] = v1 - v6;
+      p[2 + row] = v2 + v5;
+      p[5 + row] = v2 - v5;
+      p[3 + row] = v3 + v4;
+      p[4 + row] = v3 - v4;
+    }
+
+    // inverse DCT on columns
+    for (i = 0; i < 8; ++i) {
+      var col = i;
+
+      // check for all-zero AC coefficients
+      if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
+          p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
+          p[7*8 + col] == 0) {
+        t = (dctSqrt2 * p[i+0] + 8192) >> 14;
+        p[0*8 + col] = t;
+        p[1*8 + col] = t;
+        p[2*8 + col] = t;
+        p[3*8 + col] = t;
+        p[4*8 + col] = t;
+        p[5*8 + col] = t;
+        p[6*8 + col] = t;
+        p[7*8 + col] = t;
+        continue;
+      }
+
+      // stage 4
+      v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
+      v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
+      v2 = p[2*8 + col];
+      v3 = p[6*8 + col];
+      v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
+      v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
+      v5 = p[3*8 + col];
+      v6 = p[5*8 + col];
+
+      // stage 3
+      t = (v0 - v1 + 1) >> 1;
+      v0 = (v0 + v1 + 1) >> 1;
+      v1 = t;
+      t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
+      v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
+      v3 = t;
+      t = (v4 - v6 + 1) >> 1;
+      v4 = (v4 + v6 + 1) >> 1;
+      v6 = t;
+      t = (v7 + v5 + 1) >> 1;
+      v5 = (v7 - v5 + 1) >> 1;
+      v7 = t;
+
+      // stage 2
+      t = (v0 - v3 + 1) >> 1;
+      v0 = (v0 + v3 + 1) >> 1;
+      v3 = t;
+      t = (v1 - v2 + 1) >> 1;
+      v1 = (v1 + v2 + 1) >> 1;
+      v2 = t;
+      t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+      v7 = t;
+      t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+      v6 = t;
+
+      // stage 1
+      p[0*8 + col] = v0 + v7;
+      p[7*8 + col] = v0 - v7;
+      p[1*8 + col] = v1 + v6;
+      p[6*8 + col] = v1 - v6;
+      p[2*8 + col] = v2 + v5;
+      p[5*8 + col] = v2 - v5;
+      p[3*8 + col] = v3 + v4;
+      p[4*8 + col] = v3 - v4;
+    }
+
+    // convert to 8-bit integers
+    for (i = 0; i < 64; ++i) {
+      var index = blockBufferOffset + i;
+      component.blockData[index] = clampTo8bitInt((p[i] + 2056) >> 4);
+    }
+  }
+
+  function buildComponentData(frame, component) {
+    var lines = [];
+    var blocksPerLine = component.blocksPerLine;
+    var blocksPerColumn = component.blocksPerColumn;
+    var samplesPerLine = blocksPerLine << 3;
+    var computationBuffer = new Int32Array(64);
+
+    var i, j, ll = 0;
+    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+        var offset = getBlockBufferOffset(component, blockRow, blockCol)
+        quantizeAndInverse(component, offset, computationBuffer);
+      }
+    }
+    return component.blockData;
+  }
+
+  function clampTo8bitInt(a) {
+    return a <= 0 ? 0 : a >= 255 ? 255 : a | 0;
+  }
+
+  function clamp0to255(a) {
+    return a <= 0 ? 0 : a >= 255 ? 255 : a;
+  }
+
+  constructor.prototype = {
+    load: function load(path) {
+      var xhr = new XMLHttpRequest();
+      xhr.open("GET", path, true);
+      xhr.responseType = "arraybuffer";
+      xhr.onload = (function() {
+        // TODO catch parse error
+        var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
+        this.parse(data);
+        if (this.onload)
+          this.onload();
+      }).bind(this);
+      xhr.send(null);
+    },
+
+    parse: function parse(data) {
+
+      function readUint16() {
+        var value = (data[offset] << 8) | data[offset + 1];
+        offset += 2;
+        return value;
+      }
+
+      function readDataBlock() {
+        var length = readUint16();
+        var array = data.subarray(offset, offset + length - 2);
+        offset += array.length;
+        return array;
+      }
+
+      function prepareComponents(frame) {
+        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
+        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
+        for (var i = 0; i < frame.components.length; i++) {
+          component = frame.components[i];
+          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
+          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines  / 8) * component.v / frame.maxV);
+          var blocksPerLineForMcu = mcusPerLine * component.h;
+          var blocksPerColumnForMcu = mcusPerColumn * component.v;
+
+          var blocksBufferSize = 64 * blocksPerColumnForMcu
+                                    * (blocksPerLineForMcu + 1);
+          component.blockData = new Int16Array(blocksBufferSize);
+          component.blocksPerLine = blocksPerLine;
+          component.blocksPerColumn = blocksPerColumn;
+        }
+        frame.mcusPerLine = mcusPerLine;
+        frame.mcusPerColumn = mcusPerColumn;
+      }
+
+      var offset = 0, length = data.length;
+      var jfif = null;
+      var adobe = null;
+      var pixels = null;
+      var frame, resetInterval;
+      var quantizationTables = [];
+      var huffmanTablesAC = [], huffmanTablesDC = [];
+      var fileMarker = readUint16();
+      if (fileMarker != 0xFFD8) { // SOI (Start of Image)
+        throw "SOI not found";
+      }
+
+      fileMarker = readUint16();
+      while (fileMarker != 0xFFD9) { // EOI (End of image)
+        var i, j, l;
+        switch(fileMarker) {
+          case 0xFFE0: // APP0 (Application Specific)
+          case 0xFFE1: // APP1
+          case 0xFFE2: // APP2
+          case 0xFFE3: // APP3
+          case 0xFFE4: // APP4
+          case 0xFFE5: // APP5
+          case 0xFFE6: // APP6
+          case 0xFFE7: // APP7
+          case 0xFFE8: // APP8
+          case 0xFFE9: // APP9
+          case 0xFFEA: // APP10
+          case 0xFFEB: // APP11
+          case 0xFFEC: // APP12
+          case 0xFFED: // APP13
+          case 0xFFEE: // APP14
+          case 0xFFEF: // APP15
+          case 0xFFFE: // COM (Comment)
+            var appData = readDataBlock();
+
+            if (fileMarker === 0xFFE0) {
+              if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
+                appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
+                jfif = {
+                  version: { major: appData[5], minor: appData[6] },
+                  densityUnits: appData[7],
+                  xDensity: (appData[8] << 8) | appData[9],
+                  yDensity: (appData[10] << 8) | appData[11],
+                  thumbWidth: appData[12],
+                  thumbHeight: appData[13],
+                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
+                };
+              }
+            }
+            // TODO APP1 - Exif
+            if (fileMarker === 0xFFEE) {
+              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
+                appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
+                adobe = {
+                  version: appData[6],
+                  flags0: (appData[7] << 8) | appData[8],
+                  flags1: (appData[9] << 8) | appData[10],
+                  transformCode: appData[11]
+                };
+              }
+            }
+            break;
+
+          case 0xFFDB: // DQT (Define Quantization Tables)
+            var quantizationTablesLength = readUint16();
+            var quantizationTablesEnd = quantizationTablesLength + offset - 2;
+            while (offset < quantizationTablesEnd) {
+              var quantizationTableSpec = data[offset++];
+              var tableData = new Int32Array(64);
+              if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
+                for (j = 0; j < 64; j++) {
+                  var z = dctZigZag[j];
+                  tableData[z] = data[offset++];
+                }
+              } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
+                for (j = 0; j < 64; j++) {
+                  var z = dctZigZag[j];
+                  tableData[z] = readUint16();
+                }
+              } else
+                throw "DQT: invalid table spec";
+              quantizationTables[quantizationTableSpec & 15] = tableData;
+            }
+            break;
+
+          case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
+          case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)
+          case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
+            if (frame) {
+              throw "Only single frame JPEGs supported";
+            }
+            readUint16(); // skip data length
+            frame = {};
+            frame.extended = (fileMarker === 0xFFC1);
+            frame.progressive = (fileMarker === 0xFFC2);
+            frame.precision = data[offset++];
+            frame.scanLines = readUint16();
+            frame.samplesPerLine = readUint16();
+            frame.components = [];
+            frame.componentIds = {};
+            var componentsCount = data[offset++], componentId;
+            var maxH = 0, maxV = 0;
+            for (i = 0; i < componentsCount; i++) {
+              componentId = data[offset];
+              var h = data[offset + 1] >> 4;
+              var v = data[offset + 1] & 15;
+              if (maxH < h) maxH = h;
+              if (maxV < v) maxV = v;
+              var qId = data[offset + 2];
+              var l = frame.components.push({
+                h: h,
+                v: v,
+                quantizationTable: quantizationTables[qId]
+              });
+              frame.componentIds[componentId] = l - 1;
+              offset += 3;
+            }
+            frame.maxH = maxH;
+            frame.maxV = maxV;
+            prepareComponents(frame);
+            break;
+
+          case 0xFFC4: // DHT (Define Huffman Tables)
+            var huffmanLength = readUint16();
+            for (i = 2; i < huffmanLength;) {
+              var huffmanTableSpec = data[offset++];
+              var codeLengths = new Uint8Array(16);
+              var codeLengthSum = 0;
+              for (j = 0; j < 16; j++, offset++)
+                codeLengthSum += (codeLengths[j] = data[offset]);
+              var huffmanValues = new Uint8Array(codeLengthSum);
+              for (j = 0; j < codeLengthSum; j++, offset++)
+                huffmanValues[j] = data[offset];
+              i += 17 + codeLengthSum;
+
+              ((huffmanTableSpec >> 4) === 0 ?
+                huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
+                buildHuffmanTable(codeLengths, huffmanValues);
+            }
+            break;
+
+          case 0xFFDD: // DRI (Define Restart Interval)
+            readUint16(); // skip data length
+            resetInterval = readUint16();
+            break;
+
+          case 0xFFDA: // SOS (Start of Scan)
+            var scanLength = readUint16();
+            var selectorsCount = data[offset++];
+            var components = [], component;
+            for (i = 0; i < selectorsCount; i++) {
+              var componentIndex = frame.componentIds[data[offset++]];
+              component = frame.components[componentIndex];
+              var tableSpec = data[offset++];
+              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
+              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
+              components.push(component);
+            }
+            var spectralStart = data[offset++];
+            var spectralEnd = data[offset++];
+            var successiveApproximation = data[offset++];
+            var processed = decodeScan(data, offset,
+              frame, components, resetInterval,
+              spectralStart, spectralEnd,
+              successiveApproximation >> 4, successiveApproximation & 15);
+            offset += processed;
+            break;
+          default:
+            if (data[offset - 3] == 0xFF &&
+                data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
+              // could be incorrect encoding -- last 0xFF byte of the previous
+              // block was eaten by the encoder
+              offset -= 3;
+              break;
+            }
+            throw "unknown JPEG marker " + fileMarker.toString(16);
+        }
+        fileMarker = readUint16();
+      }
+
+      this.width = frame.samplesPerLine;
+      this.height = frame.scanLines;
+      this.jfif = jfif;
+      this.adobe = adobe;
+      this.components = [];
+      for (var i = 0; i < frame.components.length; i++) {
+        var component = frame.components[i];
+        this.components.push({
+          output: buildComponentData(frame, component),
+          scaleX: component.h / frame.maxH,
+          scaleY: component.v / frame.maxV,
+          blocksPerLine: component.blocksPerLine,
+          blocksPerColumn: component.blocksPerColumn
+        });
+      }
+    },
+
+    getData: function getData(width, height) {
+      var scaleX = this.width / width, scaleY = this.height / height;
+
+      var component, componentScaleX, componentScaleY;
+      var x, y, i;
+      var offset = 0;
+      var Y, Cb, Cr, K, C, M, Ye, R, G, B;
+      var colorTransform;
+      var numComponents = this.components.length;
+      var dataLength = width * height * numComponents;
+      var data = new Uint8Array(dataLength);
+      var componentLine;
+
+      // lineData is reused for all components. Assume first component is
+      // the biggest
+      var lineData = new Uint8Array((this.components[0].blocksPerLine << 3) *
+                                    this.components[0].blocksPerColumn * 8);
+
+      // First construct image data ...
+      for (i = 0; i < numComponents; i++) {
+        component = this.components[i];
+        var blocksPerLine = component.blocksPerLine;
+        var blocksPerColumn = component.blocksPerColumn;
+        var samplesPerLine = blocksPerLine << 3;
+
+        var j, k, ll = 0;
+        var lineOffset = 0;
+        for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+          var scanLine = blockRow << 3;
+          for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+            var bufferOffset = getBlockBufferOffset(component, blockRow, blockCol);
+            var offset = 0, sample = blockCol << 3;
+            for (j = 0; j < 8; j++) {
+              var lineOffset = (scanLine + j) * samplesPerLine;
+              for (k = 0; k < 8; k++) {
+                lineData[lineOffset + sample + k] =
+                  component.output[bufferOffset + offset++];
+              }
+            }
+          }
+        }
+
+        componentScaleX = component.scaleX * scaleX;
+        componentScaleY = component.scaleY * scaleY;
+        offset = i;
+
+        var cx, cy;
+        var index;
+        for (y = 0; y < height; y++) {
+          for (x = 0; x < width; x++) {
+            cy = 0 | (y * componentScaleY);
+            cx = 0 | (x * componentScaleX);
+            index = cy * samplesPerLine + cx;
+            data[offset] = lineData[index];
+            offset += numComponents;
+          }
+        }
+      }
+
+      // ... then transform colors, if necessary
+      switch (numComponents) {
+        case 1: case 2: break;
+        // no color conversion for one or two compoenents
+
+        case 3:
+          // The default transform for three components is true
+          colorTransform = true;
+          // The adobe transform marker overrides any previous setting
+          if (this.adobe && this.adobe.transformCode)
+            colorTransform = true;
+          else if (typeof this.colorTransform !== 'undefined')
+            colorTransform = !!this.colorTransform;
+
+          if (colorTransform) {
+            for (i = 0; i < dataLength; i += numComponents) {
+              Y  = data[i    ];
+              Cb = data[i + 1];
+              Cr = data[i + 2];
+
+              R = clamp0to255(Y + 1.402 * (Cr - 128));
+              G = clamp0to255(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
+              B = clamp0to255(Y + 1.772 * (Cb - 128));
+
+              data[i    ] = R;
+              data[i + 1] = G;
+              data[i + 2] = B;
+            }
+          }
+          break;
+        case 4:
+          // The default transform for four components is false
+          colorTransform = false;
+          // The adobe transform marker overrides any previous setting
+          if (this.adobe && this.adobe.transformCode)
+            colorTransform = true;
+          else if (typeof this.colorTransform !== 'undefined')
+            colorTransform = !!this.colorTransform;
+
+          if (colorTransform) {
+            for (i = 0; i < dataLength; i += numComponents) {
+              Y  = data[i];
+              Cb = data[i + 1];
+              Cr = data[i + 2];
+
+              C = 255 - clamp0to255(Y + 1.402 * (Cr - 128));
+              M = 255 - clamp0to255(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
+              Ye = 255 - clamp0to255(Y + 1.772 * (Cb - 128));
+
+              data[i    ] = C;
+              data[i + 1] = M;
+              data[i + 2] = Ye;
+              // K is unchanged
+            }
+          }
+          break;
+        default:
+          throw 'Unsupported color mode';
+      }
+      return data;
+    },
+    copyToImageData: function copyToImageData(imageData) {
+      var width = imageData.width, height = imageData.height;
+      var imageDataBytes = width * height * 4;
+      var imageDataArray = imageData.data;
+      var data = this.getData(width, height);
+      var i = 0, j = 0;
+      var Y, K, C, M, R, G, B;
+      switch (this.components.length) {
+        case 1:
+          while (j < imageDataBytes) {
+            Y = data[i++];
+
+            imageDataArray[j++] = Y;
+            imageDataArray[j++] = Y;
+            imageDataArray[j++] = Y;
+            imageDataArray[j++] = 255;
+          }
+          break;
+        case 3:
+          while (j < imageDataBytes) {
+            R = data[i++];
+            G = data[i++];
+            B = data[i++];
+
+            imageDataArray[j++] = R;
+            imageDataArray[j++] = G;
+            imageDataArray[j++] = B;
+            imageDataArray[j++] = 255;
+          }
+          break;
+        case 4:
+          while (j < imageDataBytes) {
+            C = data[i++];
+            M = data[i++];
+            Y = data[i++];
+            K = data[i++];
+
+            R = 255 - clamp0to255(C * (1 - K / 255) + K);
+            G = 255 - clamp0to255(M * (1 - K / 255) + K);
+            B = 255 - clamp0to255(Y * (1 - K / 255) + K);
+
+            imageDataArray[j++] = R;
+            imageDataArray[j++] = G;
+            imageDataArray[j++] = B;
+            imageDataArray[j++] = 255;
+          }
+          break;
+        default:
+          throw 'Unsupported color mode';
+      }
+    }
+  };
+
+  return constructor;
+})();
+
+
+}).call((typeof window === 'undefined') ? this : window);
+
+if (!PDFJS.workerSrc && typeof document !== 'undefined') {
+  // workerSrc is not set -- using last script url to define default location
+  PDFJS.workerSrc = (function () {
+    'use strict';
+    var scriptTagContainer = document.body ||
+                             document.getElementsByTagName('head')[0];
+    var pdfjsSrc = scriptTagContainer.lastChild.src;
+    return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
+  })();
+}
+
+
diff --git a/public/opac/js/universalviewer-2.0.2/lib/pdf.worker.min.js b/public/opac/js/universalviewer-2.0.2/lib/pdf.worker.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..5275488d91ce8ac5a49a17fca45383ff2f42805d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/pdf.worker.min.js
@@ -0,0 +1,891 @@
+"undefined"===typeof PDFJS&&(("undefined"!==typeof window?window:this).PDFJS={});PDFJS.version="1.0.83";PDFJS.build="0045325";
+(function(){function R(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.infos&&console.log("Info: "+a)}function L(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.warnings&&console.log("Warning: "+a)}function u(a){if(1<arguments.length){var b=["Error:"];b.push.apply(b,arguments);console.log.apply(console,b);a=[].join.call(arguments," ")}else console.log("Error: "+a);console.log(Oh());rc.notify(xd.unknown);throw Error(a);}function Oh(){try{throw Error();}catch(a){return a.stack?a.stack.split("\n").slice(2).join("\n"):
+    ""}}function $(a,b){a||u(b)}function yd(a,b){if(!a)return!1;var c=/^[a-z][a-z0-9+\-.]*(?=:)/i.exec(a);if(!c)return b;c=c[0].toLowerCase();switch(c){case "http":case "https":case "ftp":case "mailto":return!0;default:return!1}}function K(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!1});return c}function La(a){var b=a.length;if(8192>b)return String.fromCharCode.apply(null,a);for(var c=[],d=0;d<b;d+=8192){var e=Math.min(d+8192,b),e=a.subarray(d,e);c.push(String.fromCharCode.apply(null,
+    e))}return c.join("")}function Aa(a){for(var b=a.length,c=[],d=0;d<b;++d)c[d]=a.charCodeAt(d);return c}function Cb(a){for(var b=a.length,c=new Uint8Array(b),d=0;d<b;++d)c[d]=a.charCodeAt(d)&255;return c}function ma(a){return String.fromCharCode(a>>24&255,a>>16&255,a>>8&255,a&255)}function sc(a){for(var b=1,c=0;a>b;)b<<=1,c++;return c}function Fa(a,b){return a[b]<<8|a[b+1]}function ga(a,b){return(a[b]<<24|a[b+1]<<16|a[b+2]<<8|a[b+3])>>>0}function Ga(a){var b,c=a.length,d=[];if("\u00fe"===a[0]&&"\u00ff"===
+    a[1])for(b=2;b<c;b+=2)d.push(String.fromCharCode(a.charCodeAt(b)<<8|a.charCodeAt(b+1)));else for(b=0;b<c;++b){var e=Ph[a.charCodeAt(b)];d.push(e?String.fromCharCode(e):a.charAt(b))}return d.join("")}function zd(a){for(var b in a)return!1;return!0}function kb(a){return"boolean"==typeof a}function S(a){return"number"==typeof a&&(a|0)==a}function lb(a){return"number"==typeof a}function oa(a){return"string"==typeof a}function D(a){return a instanceof pa}function Y(a,b){return a instanceof xa&&(!b||a.cmd==
+    b)}function G(a,b){if(!(a instanceof ya))return!1;if(!b)return!0;var c=a.get("Type");return D(c)&&c.name==b}function I(a){return a instanceof Array}function V(a){return"object"==typeof a&&null!==a&&void 0!==a&&"getBytes"in a}function sa(a){return a instanceof tc}function uc(a){if("object"!=typeof a)return!1;if(!G(a))if(V(a))a=a.dict;else return!1;return a.has("FunctionType")}function Be(a,b){this.name=a;this.comObj=b;this.callbackIndex=1;this.postMessageTransfers=!0;var c=this.callbacks={},d=this.actionHandler=
+{};d.console_log=[function(a){console.log.apply(console,a)}];d.console_error=[function(a){console.error.apply(console,a)}];d._unsupported_feature=[function(a){rc.notify(a)}];b.onmessage=function(a){var f=a.data;if(f.isReply)if(a=f.callbackId,f.callbackId in c){var g=c[a];delete c[a];g(f.data)}else u("Cannot resolve callback "+a);else if(f.action in d)if(a=d[f.action],f.callbackId){var h={},g=new Promise(function(a,b){h.resolve=a;h.reject=b});h.promise=g;g.then(function(a){b.postMessage({isReply:!0,
+    callbackId:f.callbackId,data:a})});a[0].call(a[1],f.data,h)}else a[0].call(a[1],f.data);else u("Unkown action from worker: "+f.action)}}function Qh(a,b,c){var d=b.get("Matrix"),e=b.get("BBox"),f=b.get("XStep"),g=b.get("YStep"),h=b.get("PaintType");b=b.get("TilingType");return["TilingPattern",c,a,d,e,f,g,h,b]}function Rh(a){if(65520<=a&&65535>=a)return 0;switch(a){case 63721:case 63193:return 169;case 63720:case 63194:return 174;case 63722:case 63195:return 8482;default:return a}}function Ce(a,b,c){var d=
+    Object.create(null),e,f;if(a.baseEncodingName){f=ta[a.baseEncodingName];for(e=0;e<f.length;e++)b=c.indexOf(f[e]),0<=b&&(d[e]=b)}else if(a.flags&Qa.Symbolic)for(e in b)d[e]=b[e];else{f=ta.StandardEncoding;for(e=0;e<f.length;e++)b=c.indexOf(f[e]),0<=b&&(d[e]=b)}if(a=a.differences)for(e in a)b=c.indexOf(a[e]),0<=b&&(d[e]=b);return d}var qa="undefined"===typeof window?this:window,Ad="undefined"==typeof window,Db=[0.001,0,0,0.001,0,0];qa.PDFJS||(qa.PDFJS={});qa.PDFJS.pdfBug=!1;PDFJS.VERBOSITY_LEVELS={errors:0,
+    warnings:1,infos:5};var r=PDFJS.OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,
+    setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,
+    endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,
+    paintSolidColorImageMask:90},xd=PDFJS.UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"},Bd=[],rc=PDFJS.UnsupportedManager={listen:function(a){Bd.push(a)},notify:function(a){L('Unsupported feature "'+a+'"');for(var b=0,c=Bd.length;b<c;b++)Bd[b](a)}};PDFJS.isValidUrl=yd;var Gc=PDFJS.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2},Nb=function(a,b){this.name="PasswordException";this.message=a;this.code=b};
+    Nb.prototype=Error();Nb.constructor=Nb;var Hc=function(a,b){this.name="UnknownErrorException";this.message=a;this.details=b};Hc.prototype=Error();Hc.constructor=Hc;var vc=function(a){this.name="InvalidPDFException";this.message=a};vc.prototype=Error();vc.constructor=vc;var Yb=function(a){this.name="MissingPDFException";this.message=a};Yb.prototype=Error();Yb.constructor=Yb;var Ma=function(a){this.message=a};Ma.prototype=Error();Ma.prototype.name="NotImplementedException";Ma.constructor=Ma;var db=
+        function(a,b){this.begin=a;this.end=b;this.message="Missing data ["+a+", "+b+")"};db.prototype=Error();db.prototype.name="MissingDataException";db.constructor=db;var Ob=function(a){this.message=a};Ob.prototype=Error();Ob.prototype.name="XRefParseException";Ob.constructor=Ob;Object.defineProperty(PDFJS,"isLittleEndian",{configurable:!0,get:function(){var a=PDFJS,b=new Uint8Array(2);b[0]=1;b=new Uint16Array(b.buffer);return K(a,"isLittleEndian",1===b[0])}});Object.defineProperty(PDFJS,"hasCanvasTypedArrays",
+        {configurable:!0,get:function(){var a=PDFJS,b=document.createElement("canvas");b.width=b.height=1;b=b.getContext("2d").createImageData(1,1);return K(a,"hasCanvasTypedArrays","undefined"!==typeof b.data.buffer)}});var Cd=function(a,b){this.buffer=a;this.byteLength=a.length;for(var c=this.length=void 0===b?this.byteLength>>2:b;Ic<c;)Object.defineProperty(Cd.prototype,Ic,Sh(Ic)),Ic++},Sh=function(a){return{get:function(){var b=this.buffer,c=a<<2;return(b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24)>>>0},set:function(b){var c=
+        this.buffer,d=a<<2;c[d]=b&255;c[d+1]=b>>8&255;c[d+2]=b>>16&255;c[d+3]=b>>>24&255}}};Cd.prototype=Object.create(null);var Ic=0,tb=[1,0,0,1,0,0],Th=PDFJS,T=function(){};T.makeCssRgb=function(a){return"rgb("+a[0]+","+a[1]+","+a[2]+")"};T.makeCssCmyk=function(a){a=U.singletons.cmyk.getRgb(a,0);return T.makeCssRgb(a)};T.transform=function(a,b){return[a[0]*b[0]+a[2]*b[1],a[1]*b[0]+a[3]*b[1],a[0]*b[2]+a[2]*b[3],a[1]*b[2]+a[3]*b[3],a[0]*b[4]+a[2]*b[5]+a[4],a[1]*b[4]+a[3]*b[5]+a[5]]};T.applyTransform=function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  b){return[a[0]*b[0]+a[1]*b[2]+b[4],a[0]*b[1]+a[1]*b[3]+b[5]]};T.applyInverseTransform=function(a,b){var c=b[0]*b[3]-b[1]*b[2];return[(a[0]*b[3]-a[1]*b[2]+b[2]*b[5]-b[4]*b[3])/c,(-a[0]*b[1]+a[1]*b[0]+b[4]*b[1]-b[5]*b[0])/c]};T.getAxialAlignedBoundingBox=function(a,b){var c=T.applyTransform(a,b),d=T.applyTransform(a.slice(2,4),b),e=T.applyTransform([a[0],a[3]],b),f=T.applyTransform([a[2],a[1]],b);return[Math.min(c[0],d[0],e[0],f[0]),Math.min(c[1],d[1],e[1],f[1]),Math.max(c[0],d[0],e[0],f[0]),Math.max(c[1],
+        d[1],e[1],f[1])]};T.inverseTransform=function(a){var b=a[0]*a[3]-a[1]*a[2];return[a[3]/b,-a[1]/b,-a[2]/b,a[0]/b,(a[2]*a[5]-a[4]*a[3])/b,(a[4]*a[1]-a[5]*a[0])/b]};T.apply3dTransform=function(a,b){return[a[0]*b[0]+a[1]*b[1]+a[2]*b[2],a[3]*b[0]+a[4]*b[1]+a[5]*b[2],a[6]*b[0]+a[7]*b[1]+a[8]*b[2]]};T.singularValueDecompose2dScale=function(a){var b=[a[0],a[2],a[1],a[3]],c=a[0]*b[0]+a[1]*b[2],d=a[2]*b[1]+a[3]*b[3],e=(c+d)/2;a=Math.sqrt((c+d)*(c+d)-4*(c*d-(a[2]*b[0]+a[3]*b[2])*(a[0]*b[1]+a[1]*b[3])))/2;b=
+        e-a||1;return[Math.sqrt(e+a||1),Math.sqrt(b)]};T.normalizeRect=function(a){var b=a.slice(0);a[0]>a[2]&&(b[0]=a[2],b[2]=a[0]);a[1]>a[3]&&(b[1]=a[3],b[3]=a[1]);return b};T.intersect=function(a,b){function c(a,b){return a-b}var d=[a[0],a[2],b[0],b[2]].sort(c),e=[a[1],a[3],b[1],b[3]].sort(c),f=[];a=T.normalizeRect(a);b=T.normalizeRect(b);if(d[0]===a[0]&&d[1]===b[0]||d[0]===b[0]&&d[1]===a[0])f[0]=d[1],f[2]=d[2];else return!1;if(e[0]===a[1]&&e[1]===b[1]||e[0]===b[1]&&e[1]===a[1])f[1]=e[1],f[3]=e[2];else return!1;
+        return f};T.sign=function(a){return 0>a?-1:1};T.concatenateToArray=function(a,b){Array.prototype.push.apply(a,b)};T.prependToArray=function(a,b){Array.prototype.unshift.apply(a,b)};T.extendObj=function(a,b){for(var c in b)a[c]=b[c]};T.getInheritableProperty=function(a,b){for(;a&&!a.has(b);)a=a.get("Parent");return!a?null:a.get(b)};T.inherit=function(a,b,c){a.prototype=Object.create(b.prototype);a.prototype.constructor=a;for(var d in c)a.prototype[d]=c[d]};T.loadScript=function(a,b){var c=document.createElement("script"),
+        d=!1;c.setAttribute("src",a);b&&(c.onload=function(){d||b();d=!0});document.getElementsByTagName("head")[0].appendChild(c)};var w=Th.Util=T,Uh=PDFJS,Dd=function(a,b,c,d,e,f){this.viewBox=a;this.scale=b;this.rotation=c;this.offsetX=d;this.offsetY=e;var g=(a[2]+a[0])/2,h=(a[3]+a[1])/2,j,l,k;c%=360;switch(0>c?c+360:c){case 180:c=-1;l=j=0;k=1;break;case 90:c=0;l=j=1;k=0;break;case 270:c=0;l=j=-1;k=0;break;default:c=1,l=j=0,k=-1}f&&(l=-l,k=-k);0===c?(d=Math.abs(h-a[1])*b+d,e=Math.abs(g-a[0])*b+e,f=Math.abs(a[3]-
+            a[1])*b,a=Math.abs(a[2]-a[0])*b):(d=Math.abs(g-a[0])*b+d,e=Math.abs(h-a[1])*b+e,f=Math.abs(a[2]-a[0])*b,a=Math.abs(a[3]-a[1])*b);this.transform=[c*b,j*b,l*b,k*b,d-c*b*g-l*b*h,e-j*b*g-k*b*h];this.width=f;this.height=a;this.fontScale=b};Dd.prototype={clone:function(a){a=a||{};var b="scale"in a?a.scale:this.scale,c="rotation"in a?a.rotation:this.rotation;return new Dd(this.viewBox.slice(),b,c,this.offsetX,this.offsetY,a.dontFlip)},convertToViewportPoint:function(a,b){return w.applyTransform([a,b],this.transform)},
+        convertToViewportRectangle:function(a){var b=w.applyTransform([a[0],a[1]],this.transform);a=w.applyTransform([a[2],a[3]],this.transform);return[b[0],b[1],a[0],a[1]]},convertToPdfPoint:function(a,b){return w.applyInverseTransform([a,b],this.transform)}};Uh.PageViewport=Dd;var Ph=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364],da=PDFJS.LegacyPromise=function(){var a,b,c=new Promise(function(c,e){a=c;b=e});c.resolve=a;c.reject=b;return c};var Na=function(a){this._status=De;this._handlers=[];a.call(this,this._resolve.bind(this),this._reject.bind(this))};if(qa.Promise)"function"!==typeof qa.Promise.all&&(qa.Promise.all=function(a){var b=
+        0,c=[],d,e,f=new qa.Promise(function(a,b){d=a;e=b});a.forEach(function(a,f){b++;a.then(function(a){c[f]=a;b--;0===b&&d(c)},e)});0===b&&d(c);return f}),"function"!==typeof qa.Promise.resolve&&(qa.Promise.resolve=function(a){return new qa.Promise(function(b){b(a)})});else{var De=0,ub=2,Ed={handlers:[],running:!1,unhandledRejections:[],pendingRejectionCheck:!1,scheduleHandlers:function(a){a._status!=De&&(this.handlers=this.handlers.concat(a._handlers),a._handlers=[],this.running||(this.running=!0,setTimeout(this.runHandlers.bind(this),
+        0)))},runHandlers:function(){for(var a=Date.now()+1;0<this.handlers.length;){var b=this.handlers.shift(),c=b.thisPromise._status,d=b.thisPromise._value;try{1===c?"function"==typeof b.onResolve&&(d=b.onResolve(d)):"function"===typeof b.onReject&&(d=b.onReject(d),c=1,b.thisPromise._unhandledRejection&&this.removeUnhandeledRejection(b.thisPromise))}catch(e){c=ub,d=e}b.nextPromise._updateStatus(c,d);if(Date.now()>=a)break}0<this.handlers.length?setTimeout(this.runHandlers.bind(this),0):this.running=!1},
+        addUnhandledRejection:function(a){this.unhandledRejections.push({promise:a,time:Date.now()});this.scheduleRejectionCheck()},removeUnhandeledRejection:function(a){a._unhandledRejection=!1;for(var b=0;b<this.unhandledRejections.length;b++)this.unhandledRejections[b].promise===a&&(this.unhandledRejections.splice(b),b--)},scheduleRejectionCheck:function(){this.pendingRejectionCheck||(this.pendingRejectionCheck=!0,setTimeout(function(){this.pendingRejectionCheck=!1;for(var a=Date.now(),b=0;b<this.unhandledRejections.length;b++)if(500<
+            a-this.unhandledRejections[b].time){var c=this.unhandledRejections[b].promise._value,d="Unhandled rejection: "+c;c.stack&&(d+="\n"+c.stack);L(d);this.unhandledRejections.splice(b);b--}this.unhandledRejections.length&&this.scheduleRejectionCheck()}.bind(this),500))}};Na.all=function(a){function b(a){e._status!==ub&&(g=[],d(a))}var c,d,e=new Na(function(a,b){c=a;d=b}),f=a.length,g=[];if(0===f)return c(g),e;for(var h=0,j=a.length;h<j;++h){var l=a[h],k=function(a){return function(b){e._status!==ub&&(g[a]=
+        b,f--,0===f&&c(g))}}(h);Na.isPromise(l)?l.then(k,b):k(l)}return e};Na.isPromise=function(a){return a&&"function"===typeof a.then};Na.resolve=function(a){return new Na(function(b){b(a)})};Na.prototype={_status:null,_value:null,_handlers:null,_unhandledRejection:null,_updateStatus:function(a,b){1===this._status||this._status===ub||(1==a&&Na.isPromise(b)?b.then(this._updateStatus.bind(this,1),this._updateStatus.bind(this,ub)):(this._status=a,this._value=b,a===ub&&0===this._handlers.length&&(this._unhandledRejection=
+        !0,Ed.addUnhandledRejection(this)),Ed.scheduleHandlers(this)))},_resolve:function(a){this._updateStatus(1,a)},_reject:function(a){this._updateStatus(ub,a)},then:function(a,b){var c=new Na(function(a,b){this.reject=this.resolve=b});this._handlers.push({thisPromise:this,onResolve:a,onReject:b,nextPromise:c});Ed.scheduleHandlers(this);return c}};qa.Promise=Na}PDFJS.createBlob=function(a,b){if("undefined"!==typeof Blob)return new Blob([a],{type:b});var c=new MozBlobBuilder;c.append(a);return c.getBlob(b)};
+    PDFJS.createObjectURL=function(a,b){if(!PDFJS.disableCreateObjectURL&&"undefined"!==typeof URL&&URL.createObjectURL){var c=PDFJS.createBlob(a,b);return URL.createObjectURL(c)}for(var c="data:"+b+";base64,",d=0,e=a.length;d<e;d+=3)var f=a[d]&255,g=a[d+1]&255,h=a[d+2]&255,c=c+("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[f>>2]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[(f&3)<<4|g>>4]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[d+
+        1<e?(g&15)<<2|h>>6:64]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[d+2<e?h&63:64]);return c};Be.prototype={on:function(a,b,c){var d=this.actionHandler;d[a]&&u('There is already an actionName called "'+a+'"');d[a]=[b,c]},send:function(a,b,c,d){a={action:a,data:b};c&&(b=this.callbackIndex++,this.callbacks[b]=c,a.callbackId=b);d&&this.postMessageTransfers?this.comObj.postMessage(a,d):this.comObj.postMessage(a)}};var U,na=function(){u("should not call ColorSpace constructor")};
+    na.prototype={getRgb:function(a,b){var c=new Uint8Array(3);this.getRgbItem(a,b,c,0);return c},getRgbItem:function(){u("Should not call ColorSpace.getRgbItem")},getRgbBuffer:function(){u("Should not call ColorSpace.getRgbBuffer")},getOutputLength:function(){u("Should not call ColorSpace.getOutputLength")},isPassthrough:function(){return!1},fillRgb:function(a,b,c,d,e,f,g,h,j){var l=b*c,k=null,m=1<<g,n=c!=e||b!=d,p;if(this.isPassthrough(g))k=h;else if(1===this.numComps&&l>m&&"DeviceGray"!==this.name&&
+        "DeviceRGB"!==this.name){var q=8>=g?new Uint8Array(m):new Uint16Array(m),s;for(p=0;p<m;p++)q[p]=p;var v=new Uint8Array(3*m);this.getRgbBuffer(q,0,m,v,0,g,0);if(n){k=new Uint8Array(3*l);for(p=q=0;p<l;++p)s=3*h[p],k[q++]=v[s],k[q++]=v[s+1],k[q++]=v[s+2]}else for(p=m=0;p<l;++p)s=3*h[p],a[m++]=v[s],a[m++]=v[s+1],a[m++]=v[s+2],m+=j}else n?(k=new Uint8Array(3*l),this.getRgbBuffer(h,0,l,k,0,g,0)):this.getRgbBuffer(h,0,d*f,a,0,g,j);if(k)if(n)Zb.resize(k,g,3,b,c,d,e,a,j);else{p=m=q=0;for(b=d*f;p<b;p++)a[m++]=
+        k[q++],a[m++]=k[q++],a[m++]=k[q++],m+=j}},usesZeroToOneRange:!0};na.parse=function(a,b,c){a=na.parseToIR(a,b,c);return a instanceof Fd?a:na.fromIR(a)};na.fromIR=function(a){var b=I(a)?a[0]:a,c;switch(b){case "DeviceGrayCS":return this.singletons.gray;case "DeviceRgbCS":return this.singletons.rgb;case "DeviceCmykCS":return this.singletons.cmyk;case "CalGrayCS":return b=a[1].WhitePoint,c=a[1].BlackPoint,new Ee(b,c,a[1].Gamma);case "PatternCS":return(a=a[1])&&(a=na.fromIR(a)),new Fe(a);case "IndexedCS":return b=
+        a[2],c=a[3],new Ge(na.fromIR(a[1]),b,c);case "AlternateCS":return b=a[3],new Fd(a[1],na.fromIR(a[2]),eb.fromIR(b));case "LabCS":return b=a[1].WhitePoint,c=a[1].BlackPoint,new He(b,c,a[1].Range);default:u("Unkown name "+b)}return null};na.parseToIR=function(a,b,c){if(D(a)){var d=c.get("ColorSpace");G(d)&&(d=d.get(a.name))&&(a=d)}a=b.fetchIfRef(a);if(D(a))switch(this.mode=d=a.name,d){case "DeviceGray":case "G":return"DeviceGrayCS";case "DeviceRGB":case "RGB":return"DeviceRgbCS";case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";
+        case "Pattern":return["PatternCS",null];default:u("unrecognized colorspace "+d)}else if(I(a))switch(this.mode=d=a[0].name,d){case "DeviceGray":case "G":return"DeviceGrayCS";case "DeviceRGB":case "RGB":return"DeviceRgbCS";case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";case "CalGray":return b=a[1].getAll(),["CalGrayCS",b];case "CalRGB":return"DeviceRgbCS";case "ICCBased":d=b.fetchIfRef(a[1]).dict.get("N");if(1==d)return"DeviceGrayCS";if(3==d)return"DeviceRgbCS";if(4==d)return"DeviceCmykCS";break;
+        case "Pattern":return(a=a[1])&&(a=na.parseToIR(a,b,c)),["PatternCS",a];case "Indexed":case "I":return c=na.parseToIR(a[1],b,c),d=a[2]+1,b=b.fetchIfRef(a[3]),V(b)&&(b=b.getBytes()),["IndexedCS",c,d,b];case "Separation":case "DeviceN":var e=a[1],d=1;D(e)?d=1:I(e)&&(d=e.length);c=na.parseToIR(a[2],b,c);b=eb.getIR(b,b.fetchIfRef(a[3]));return["AlternateCS",d,c,b];case "Lab":return b=a[1].getAll(),["LabCS",b];default:u('unimplemented color space object "'+d+'"')}else u('unrecognized color space object: "'+
+        a+'"');return null};na.isDefaultDecode=function(a,b){if(!a)return!0;if(2*b!==a.length)return L("The decode map is not the correct length"),!0;for(var c=0,d=a.length;c<d;c+=2)if(0!==a[c]||1!=a[c+1])return!1;return!0};na.singletons={get gray(){return K(this,"gray",new Ie)},get rgb(){return K(this,"rgb",new Je)},get cmyk(){return K(this,"cmyk",new Ke)}};U=na;var Fd,Le=function(a,b,c){this.name="Alternate";this.numComps=a;this.defaultColor=new Float32Array(a);for(var d=0;d<a;++d)this.defaultColor[d]=
+        1;this.base=b;this.tintFn=c};Le.prototype={getRgb:U.prototype.getRgb,getRgbItem:function(a,b,c,d){a="subarray"in a?a.subarray(b,b+this.numComps):Array.prototype.slice.call(a,b,b+this.numComps);a=this.tintFn(a);this.base.getRgbItem(a,0,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){var h=this.tintFn,j=this.base;f=1/((1<<f)-1);var l=j.numComps,k=j.usesZeroToOneRange,m=(j.isPassthrough(8)||!k)&&0===g,n=m?e:0,p=m?d:new Uint8Array(l*c),q=this.numComps,s=new Float32Array(q),v,t;for(v=0;v<c;v++){for(t=0;t<q;t++)s[t]=
+        a[b++]*f;var u=h(s);if(k)for(t=0;t<l;t++)p[n++]=255*u[t];else j.getRgbItem(u,0,p,n),n+=l}m||j.getRgbBuffer(p,0,c,d,e,8,g)},getOutputLength:function(a,b){return this.base.getOutputLength(a*this.base.numComps/this.numComps,b)},isPassthrough:U.prototype.isPassthrough,fillRgb:U.prototype.fillRgb,isDefaultDecode:function(a){return U.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Fd=Le;var Fe,Me=function(a){this.name="Pattern";this.base=a};Me.prototype={};Fe=Me;var Ge,Ne=function(a,b,c){this.name=
+        "Indexed";this.numComps=1;this.defaultColor=new Uint8Array([0]);this.base=a;this.highVal=b;a=a.numComps*b;var d;if(V(c))d=new Uint8Array(a),c=c.getBytes(a),d.set(c);else if(oa(c)){d=new Uint8Array(a);for(b=0;b<a;++b)d[b]=c.charCodeAt(b)}else c instanceof Uint8Array||c instanceof Array?d=c:u("Unrecognized lookup table: "+c);this.lookup=d};Ne.prototype={getRgb:U.prototype.getRgb,getRgbItem:function(a,b,c,d){this.base.getRgbItem(this.lookup,a[b]*this.base.numComps,c,d)},getRgbBuffer:function(a,b,c,d,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      e,f,g){f=this.base;for(var h=f.numComps,j=f.getOutputLength(h,g),l=this.lookup,k=0;k<c;++k){var m=a[b++]*h;f.getRgbBuffer(l,m,1,d,e,8,g);e+=j}},getOutputLength:function(a,b){return this.base.getOutputLength(a*this.base.numComps,b)},isPassthrough:U.prototype.isPassthrough,fillRgb:U.prototype.fillRgb,isDefaultDecode:function(){return!0},usesZeroToOneRange:!0};Ge=Ne;var Ie,Oe=function(){this.name="DeviceGray";this.numComps=1;this.defaultColor=new Float32Array([0])};Oe.prototype={getRgb:U.prototype.getRgb,
+        getRgbItem:function(a,b,c,d){a=255*a[b]|0;c[d]=c[d+1]=c[d+2]=0>a?0:255<a?255:a},getRgbBuffer:function(a,b,c,d,e,f,g){f=255/((1<<f)-1);for(var h=0;h<c;++h){var j=f*a[b++]|0;d[e++]=j;d[e++]=j;d[e++]=j;e+=g}},getOutputLength:function(a,b){return a*(3+b)},isPassthrough:U.prototype.isPassthrough,fillRgb:U.prototype.fillRgb,isDefaultDecode:function(a){return U.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Ie=Oe;var Je,Pe=function(){this.name="DeviceRGB";this.numComps=3;this.defaultColor=new Float32Array([0,
+        0,0])};Pe.prototype={getRgb:U.prototype.getRgb,getRgbItem:function(a,b,c,d){var e=255*a[b]|0,f=255*a[b+1]|0;a=255*a[b+2]|0;c[d]=0>e?0:255<e?255:e;c[d+1]=0>f?0:255<f?255:f;c[d+2]=0>a?0:255<a?255:a},getRgbBuffer:function(a,b,c,d,e,f,g){if(8===f&&0===g)d.set(a.subarray(b,b+3*c),e);else{f=255/((1<<f)-1);for(var h=0;h<c;++h)d[e++]=f*a[b++]|0,d[e++]=f*a[b++]|0,d[e++]=f*a[b++]|0,e+=g}},getOutputLength:function(a,b){return a*(3+b)/3|0},isPassthrough:function(a){return 8==a},fillRgb:U.prototype.fillRgb,isDefaultDecode:function(a){return U.isDefaultDecode(a,
+        this.numComps)},usesZeroToOneRange:!0};Je=Pe;var Ke,Qe=function(a,b,c,d,e){var f=a[b+0]*c,g=a[b+1]*c,h=a[b+2]*c;c*=a[b+3];a=f*(-4.387332384609988*f+54.48615194189176*g+18.82290502165302*h+212.25662451639585*c+-285.2331026137004)+g*(1.7149763477362134*g-5.6096736904047315*h+-17.873870861415444*c-5.497006427196366)+h*(-2.5217340131683033*h-21.248923337353073*c+17.5119270841813)+c*(-21.86122147463605*c-189.48180835922747)+255|0;b=f*(8.841041422036149*f+60.118027045597366*g+6.871425592049007*h+31.159100130055922*
+        c+-79.2970844816548)+g*(-15.310361306967817*g+17.575251261109482*h+131.35250912493976*c-190.9453302588951)+h*(4.444339102852739*h+9.8632861493405*c-24.86741582555878)+c*(-20.737325471181034*c-187.80453709719578)+255|0;f=f*(0.8842522430003296*f+8.078677503112928*g+30.89978309703729*h-0.23883238689178934*c+-14.183576799673286)+g*(10.49593273432072*g+63.02378494754052*h+50.606957656360734*c-112.23884253719248)+h*(0.03296041114873217*h+115.60384449646641*c+-193.58209356861505)+c*(-22.33816807309886*c-
+        180.12613974708367)+255|0;d[e]=255<a?255:0>a?0:a;d[e+1]=255<b?255:0>b?0:b;d[e+2]=255<f?255:0>f?0:f},Re=function(){this.name="DeviceCMYK";this.numComps=4;this.defaultColor=new Float32Array([0,0,0,1])};Re.prototype={getRgb:U.prototype.getRgb,getRgbItem:function(a,b,c,d){Qe(a,b,1,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=1/((1<<f)-1);for(var h=0;h<c;h++)Qe(a,b,f,d,e),b+=4,e+=3+g},getOutputLength:function(a,b){return a/4*(3+b)|0},isPassthrough:U.prototype.isPassthrough,fillRgb:U.prototype.fillRgb,
+        isDefaultDecode:function(a){return U.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Ke=Re;var Ee,Se=function(a,b,c){this.name="CalGray";this.numComps=1;this.defaultColor=new Float32Array([0]);a||u("WhitePoint missing - required for color space CalGray");b=b||[0,0,0];this.XW=a[0];this.YW=a[1];this.ZW=a[2];this.XB=b[0];this.YB=b[1];this.ZB=b[2];this.G=c||1;(0>this.XW||0>this.ZW||1!==this.YW)&&u("Invalid WhitePoint components for "+this.name+", no fallback available");if(0>this.XB||0>this.YB||
+        0>this.ZB)R("Invalid BlackPoint for "+this.name+", falling back to default"),this.XB=this.YB=this.ZB=0;(0!==this.XB||0!==this.YB||0!==this.ZB)&&L(this.name+", BlackPoint: XB: "+this.XB+", YB: "+this.YB+", ZB: "+this.ZB+", only default values are supported.");1>this.G&&(R("Invalid Gamma: "+this.G+" for "+this.name+", falling back to default"),this.G=1)},Te=function(a,b,c,d,e,f){b=Math.pow(b[c]*f,a.G);a=Math.max(116*Math.pow(a.YW*b,1/3)-16,0);d[e]=255*a/100;d[e+1]=255*a/100;d[e+2]=255*a/100};Se.prototype=
+    {getRgb:U.prototype.getRgb,getRgbItem:function(a,b,c,d){Te(this,a,b,c,d,1)},getRgbBuffer:function(a,b,c,d,e,f,g){f=1/((1<<f)-1);for(var h=0;h<c;++h)Te(this,a,b,d,e,f),b+=1,e+=3+g},getOutputLength:function(a,b){return a*(3+b)},isPassthrough:U.prototype.isPassthrough,fillRgb:U.prototype.fillRgb,isDefaultDecode:function(a){return U.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Ee=Se;var He,Ue=function(a,b,c){this.name="Lab";this.numComps=3;this.defaultColor=new Float32Array([0,0,0]);a||u("WhitePoint missing - required for color space Lab");
+        b=b||[0,0,0];c=c||[-100,100,-100,100];this.XW=a[0];this.YW=a[1];this.ZW=a[2];this.amin=c[0];this.amax=c[1];this.bmin=c[2];this.bmax=c[3];this.XB=b[0];this.YB=b[1];this.ZB=b[2];(0>this.XW||0>this.ZW||1!==this.YW)&&u("Invalid WhitePoint components, no fallback available");if(0>this.XB||0>this.YB||0>this.ZB)R("Invalid BlackPoint, falling back to default"),this.XB=this.YB=this.ZB=0;if(this.amin>this.amax||this.bmin>this.bmax)R("Invalid Range, falling back to defaults"),this.amin=-100,this.amax=100,this.bmin=
+            -100,this.bmax=100},Gd=function(a){return a>=6/29?a*a*a:108/841*(a-4/29)},Ve=function(a,b,c,d,e,f){var g=b[c],h=b[c+1];b=b[c+2];!1!==d&&(g=0+100*g/d,h=a.amin+h*(a.amax-a.amin)/d,b=a.bmin+b*(a.bmax-a.bmin)/d);h=h>a.amax?a.amax:h<a.amin?a.amin:h;b=b>a.bmax?a.bmax:b<a.bmin?a.bmin:b;d=(g+16)/116;g=d-b/200;h=a.XW*Gd(d+h/500);d=a.YW*Gd(d);g=a.ZW*Gd(g);1>a.ZW?(a=3.1339*h+-1.617*d+-0.4906*g,b=-0.9785*h+1.916*d+0.0333*g,h=0.072*h+-0.229*d+1.4057*g):(a=3.2406*h+-1.5372*d+-0.4986*g,b=-0.9689*h+1.8758*d+0.0415*
+        g,h=0.0557*h+-0.204*d+1.057*g);e[f]=0>=a?0:1<=a?255:255*Math.sqrt(a)|0;e[f+1]=0>=b?0:1<=b?255:255*Math.sqrt(b)|0;e[f+2]=0>=h?0:1<=h?255:255*Math.sqrt(h)|0};Ue.prototype={getRgb:U.prototype.getRgb,getRgbItem:function(a,b,c,d){Ve(this,a,b,!1,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=(1<<f)-1;for(var h=0;h<c;h++)Ve(this,a,b,f,d,e),b+=3,e+=3+g},getOutputLength:function(a,b){return a*(3+b)/3|0},isPassthrough:U.prototype.isPassthrough,isDefaultDecode:function(){return!0},usesZeroToOneRange:!1};He=Ue;
+    var eb;eb={getSampleArray:function(a,b,c,d){var e,f,g=1;e=0;for(f=a.length;e<f;e++)g*=a[e];g*=b;a=[];f=b=0;var h=1/(Math.pow(2,c)-1);d=d.getBytes((g*c+7)/8);var j=0;for(e=0;e<g;e++){for(;b<c;)f<<=8,f|=d[j++],b+=8;b-=c;a.push((f>>b)*h);f&=(1<<b)-1}return a},getIR:function(a,b){var c=b.dict;c||(c=b);var d=[this.constructSampled,null,this.constructInterpolated,this.constructStiched,this.constructPostScript],e=c.get("FunctionType");(d=d[e])||u("Unknown type of function");return d.call(this,b,c,a)},fromIR:function(a){switch(a[0]){case 0:return this.constructSampledFromIR(a);
+        case 2:return this.constructInterpolatedFromIR(a);case 3:return this.constructStichedFromIR(a);default:return this.constructPostScriptFromIR(a)}},parse:function(a,b){var c=this.getIR(a,b);return this.fromIR(c)},constructSampled:function(a,b){function c(a){for(var b=a.length,c=[],d=0,e=0;e<b;e+=2)c[d]=[a[e],a[e+1]],++d;return c}var d=b.get("Domain"),e=b.get("Range");(!d||!e)&&u("No domain or range");var f=d.length/2,g=e.length/2,d=c(d),e=c(e),h=b.get("Size"),j=b.get("BitsPerSample"),l=b.get("Order")||
+        1;1!==l&&R("No support for cubic spline interpolation: "+l);l=b.get("Encode");if(!l)for(var l=[],k=0;k<f;++k)l.push(0),l.push(h[k]-1);var l=c(l),k=(k=b.get("Decode"))?c(k):e,m=this.getSampleArray(h,g,j,a);return[0,f,d,l,k,m,h,g,Math.pow(2,j)-1,e]},constructSampledFromIR:function(a){return function(b){var c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],j=a[7],l=a[9];c!=b.length&&u("Incorrect number of arguments: "+c+" != "+b.length);var k=1<<c,m=new Float64Array(k),n=new Uint32Array(k),p,q;for(q=0;q<k;q++)m[q]=
+        1;var s=j,v=1;for(p=0;p<c;++p){q=d[p][0];var t=d[p][1],r=Math.min(Math.max(b[p],q),t),aa=e[p][0]+(r-q)*((e[p][1]-e[p][0])/(t-q)),t=h[p],aa=Math.min(Math.max(aa,0),t-1);q=aa<t-1?Math.floor(aa):aa-1;var r=q+1-aa,aa=aa-q,N=q*s,ea=N+s;for(q=0;q<k;q++)q&v?(m[q]*=aa,n[q]+=ea):(m[q]*=r,n[q]+=N);s*=t;v<<=1}b=new Float64Array(j);for(q=0;q<j;++q){for(p=c=0;p<k;p++)c+=g[n[p]+q]*m[p];c=f[q][0]+(c-0)*((f[q][1]-f[q][0])/1);b[q]=Math.min(Math.max(c,l[q][0]),l[q][1])}return b}},constructInterpolated:function(a,b){var c=
+        b.get("C0")||[0],d=b.get("C1")||[1],e=b.get("N");(!I(c)||!I(d))&&u("Illegal dictionary for interpolated function");for(var f=c.length,g=[],h=0;h<f;++h)g.push(d[h]-c[h]);return[2,c,g,e]},constructInterpolatedFromIR:function(a){var b=a[1],c=a[2],d=a[3],e=c.length;return function(a){a=1==d?a[0]:Math.pow(a[0],d);for(var g=[],h=0;h<e;++h)g.push(b[h]+a*c[h]);return g}},constructStiched:function(a,b,c){(a=b.get("Domain"))||u("No domain");1!=a.length/2&&u("Bad domain for stiched function");for(var d=b.get("Functions"),
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       e=[],f=0,g=d.length;f<g;++f)e.push(eb.getIR(c,c.fetchIfRef(d[f])));c=b.get("Bounds");b=b.get("Encode");return[3,a,c,b,e]},constructStichedFromIR:function(a){var b=a[1],c=a[2],d=a[3];a=a[4];for(var e=[],f=0,g=a.length;f<g;f++)e.push(eb.fromIR(a[f]));return function(a){a=a[0];var f=b[0],g=b[1];a>g?a=g:a<f&&(a=f);f=0;for(g=c.length;f<g&&!(a<c[f]);++f);g=b[0];0<f&&(g=c[f-1]);var k=b[1];f<c.length&&(k=c[f]);var m=d[2*f];return e[f]([m+(a-g)*(d[2*f+1]-m)/(k-g)])}},constructPostScript:function(a,b){var c=
+        b.get("Domain"),d=b.get("Range");c||u("No domain.");d||u("No range.");var e=new We(a),e=(new Xe(e)).parse();return[4,c,d,e]},constructPostScriptFromIR:function(a){var b=a[1],c=a[2],d=c.length/2,e=new Ye(a[3]),f=new Ze;return function(a){for(var h=[],j=0,l=b.length/2;j<l;++j)h.push(a[j]);a=h.join("_");if(f.has(a))return f.get(a);h=e.execute(h);l=[];for(j=d-1;0<=j;--j){var k=h.pop(),m=2*j;k<c[m]?k=c[m]:k>c[m+1]&&(k=c[m+1]);l[j]=k}f.set(a,l);return l}}};var Ze,$e=function(){this.cache={};this.total=
+        0};$e.prototype={has:function(a){return a in this.cache},get:function(a){return this.cache[a]},set:function(a,b){1024>this.total&&(this.cache[a]=b,this.total++)}};Ze=$e;var af=function(a){this.stack=a||[]};af.prototype={push:function(a){100<=this.stack.length&&u("PostScript function stack overflow.");this.stack.push(a)},pop:function(){0>=this.stack.length&&u("PostScript function stack underflow.");return this.stack.pop()},copy:function(a){100<=this.stack.length+a&&u("PostScript function stack overflow.");
+        var b=this.stack,c=b.length-a;for(a-=1;0<=a;a--,c++)b.push(b[c])},index:function(a){this.push(this.stack[this.stack.length-a-1])},roll:function(a,b){var c=this.stack,d=c.length-a,e=c.length-1,f=d+(b-Math.floor(b/a)*a),g,h,j;g=d;for(h=e;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j;g=d;for(h=f-1;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j;g=f;for(h=e;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j}};var Ye,bf=function(a){this.operators=a};bf.prototype={execute:function(a){a=new af(a);for(var b=0,c=this.operators,d=c.length,e,f;b<
+    d;)if(e=c[b++],"number"==typeof e)a.push(e);else switch(e){case "jz":f=a.pop();(e=a.pop())||(b=f);break;case "j":b=e=a.pop();break;case "abs":e=a.pop();a.push(Math.abs(e));break;case "add":f=a.pop();e=a.pop();a.push(e+f);break;case "and":f=a.pop();e=a.pop();kb(e)&&kb(f)?a.push(e&&f):a.push(e&f);break;case "atan":e=a.pop();a.push(Math.atan(e));break;case "bitshift":f=a.pop();e=a.pop();0<e?a.push(e<<f):a.push(e>>f);break;case "ceiling":e=a.pop();a.push(Math.ceil(e));break;case "copy":e=a.pop();a.copy(e);
+        break;case "cos":e=a.pop();a.push(Math.cos(e));break;case "cvi":e=a.pop()|0;a.push(e);break;case "cvr":break;case "div":f=a.pop();e=a.pop();a.push(e/f);break;case "dup":a.copy(1);break;case "eq":f=a.pop();e=a.pop();a.push(e==f);break;case "exch":a.roll(2,1);break;case "exp":f=a.pop();e=a.pop();a.push(Math.pow(e,f));break;case "false":a.push(!1);break;case "floor":e=a.pop();a.push(Math.floor(e));break;case "ge":f=a.pop();e=a.pop();a.push(e>=f);break;case "gt":f=a.pop();e=a.pop();a.push(e>f);break;
+        case "idiv":f=a.pop();e=a.pop();a.push(e/f|0);break;case "index":e=a.pop();a.index(e);break;case "le":f=a.pop();e=a.pop();a.push(e<=f);break;case "ln":e=a.pop();a.push(Math.log(e));break;case "log":e=a.pop();a.push(Math.log(e)/Math.LN10);break;case "lt":f=a.pop();e=a.pop();a.push(e<f);break;case "mod":f=a.pop();e=a.pop();a.push(e%f);break;case "mul":f=a.pop();e=a.pop();a.push(e*f);break;case "ne":f=a.pop();e=a.pop();a.push(e!=f);break;case "neg":a.pop();a.push(-f);break;case "not":e=a.pop();kb(e)&&
+        kb(f)?a.push(e&&f):a.push(e&f);break;case "or":f=a.pop();e=a.pop();kb(e)&&kb(f)?a.push(e||f):a.push(e|f);break;case "pop":a.pop();break;case "roll":f=a.pop();e=a.pop();a.roll(e,f);break;case "round":e=a.pop();a.push(Math.round(e));break;case "sin":e=a.pop();a.push(Math.sin(e));break;case "sqrt":e=a.pop();a.push(Math.sqrt(e));break;case "sub":f=a.pop();e=a.pop();a.push(e-f);break;case "true":a.push(!0);break;case "truncate":e=a.pop();e=0>e?Math.ceil(e):Math.floor(e);a.push(e);break;case "xor":f=a.pop();
+            e=a.pop();kb(e)&&kb(f)?a.push(e!=f):a.push(e^f);break;default:u("Unknown operator "+e)}return a.stack}};Ye=bf;var Vh=["Link","Text","Widget"],ba=function(a){if(a.data)this.data=a.data;else{var b=a.dict,c=this.data={};c.subtype=b.get("Subtype").name;var d=b.get("Rect")||[0,0,0,0];c.rect=w.normalizeRect(d);c.annotationFlags=b.get("F");d=b.get("C");c.color=I(d)&&3===d.length?d:[0,0,0];if(b.has("BS"))d=b.get("BS"),c.borderWidth=d.has("W")?d.get("W"):1;else if(d=b.get("Border")||[0,0,1],c.borderWidth=
+            d[2]||0,d=d[3],0<c.borderWidth&&d&&I(d)){var e=d.length;if(0<e){for(var f=!1,g=0,h=0;h<e;h++)if(0<=+d[h])0<d[h]&&g++;else{f=!0;break}if(f||0===g)c.borderWidth=0}}var j;d=b.get("AP");G(d)?(d=d.get("N"),G(d)?(b=b.get("AS"))&&d.has(b.name)&&(j=d.get(b.name)):j=d):j=void 0;this.appearance=j;c.hasAppearance=!!this.appearance;c.id=a.ref.num}};ba.prototype={getData:function(){return this.data},hasHtml:function(){return!1},getHtmlElement:function(){throw new Ma("getHtmlElement() should be implemented in subclass");
+    },getEmptyContainer:function(a,b,c){$(!Ad,"getEmptyContainer() should be called from main thread");c=c||0;b=b||this.data.rect;a=document.createElement(a);a.style.borderWidth=c+"px";var d=b[3]-b[1]-2*c;a.style.width=b[2]-b[0]-2*c+"px";a.style.height=d+"px";return a},isInvisible:function(){var a=this.data;return a&&-1!==Vh.indexOf(a.subtype)?!1:!(!a||!(a.annotationFlags&&a.annotationFlags&1))},isViewable:function(){var a=this.data;return!(this.isInvisible()||!a||a.annotationFlags&&a.annotationFlags&
+    34||!a.rect)},isPrintable:function(){var a=this.data;return!(this.isInvisible()||!a||!a.annotationFlags||!(a.annotationFlags&4&&a.rect))},loadResources:function(a){var b=new da;this.appearance.dict.getAsync("Resources").then(function(c){c?(new Hd(c.map,a,c.xref)).load().then(function(){b.resolve(c)}):b.resolve()}.bind(this));return b},getOperatorList:function(a){var b=new da;if(!this.appearance)return b.resolve(new Eb),b;var c=this.data,d=this.appearance.dict,e=this.loadResources("ExtGState ColorSpace Pattern Shading XObject Font".split(" ")),
+        f=d.get("BBox")||[0,0,1,1],g=d.get("Matrix")||[1,0,0,1,0,0],h;var d=c.rect,j=w.getAxialAlignedBoundingBox(f,g),f=j[0],l=j[1],k=j[2],j=j[3];f===k||l===j?h=[1,0,0,1,d[0],d[1]]:(k=(d[2]-d[0])/(k-f),j=(d[3]-d[1])/(j-l),h=[k,0,0,j,d[0]-f*k,d[1]-l*j]);e.then(function(d){var e=new Eb;e.addOp(r.beginAnnotation,[c.rect,h,g]);a.getOperatorList(this.appearance,d,e);e.addOp(r.endAnnotation,[]);b.resolve(e);this.appearance.reset()}.bind(this));return b}};ba.getConstructor=function(a,b){if(a){if("Link"===a)return cf;
+        if("Text"===a)return df;if("Widget"===a){if(b)return"Tx"===b?ef:Jc}else return ba}};ba.fromData=function(a){var b=ba.getConstructor(a.subtype,a.fieldType);if(b)return new b({data:a})};ba.fromRef=function(a,b){var c=a.fetchIfRef(b);if(G(c)){var d=c.get("Subtype");if(d=D(d)?d.name:""){var e=w.getInheritableProperty(c,"FT"),e=D(e)?e.name:"";if(e=ba.getConstructor(d,e)){c=new e({dict:c,ref:b});if(c.isViewable()||c.isPrintable())return c;L("unimplemented annotation type: "+d)}}}};ba.appendToOperatorList=
+        function(a,b,c,d,e){var f=new da;c=[];for(var g=0,h=a.length;g<h;++g)("display"===e&&a[g].isViewable()||"print"===e&&a[g].isPrintable())&&c.push(a[g].getOperatorList(d));Promise.all(c).then(function(a){b.addOp(r.beginAnnotations,[]);for(var c=0,d=a.length;c<d;++c)b.addOpList(a[c]);b.addOp(r.endAnnotations,[]);f.resolve()},function(a){f.reject(a)});return f};PDFJS.Annotation=ba;var Jc,ff=function(a){ba.call(this,a);if(!a.data){var b=a.dict,c=this.data;c.fieldValue=Ga(w.getInheritableProperty(b,"V")||
+        "");c.alternativeText=Ga(b.get("TU")||"");c.defaultAppearance=w.getInheritableProperty(b,"DA")||"";var d=w.getInheritableProperty(b,"FT");c.fieldType=D(d)?d.name:"";c.fieldFlags=w.getInheritableProperty(b,"Ff")||0;this.fieldResources=w.getInheritableProperty(b,"DR")||ya.empty;var d=[],e=b;for(a=a.ref;e;){var b=e.get("Parent"),f=e.getRaw("Parent");if(e=e.get("T"))d.unshift(Ga(e));else{var e=b.get("Kids"),g,h;g=0;for(h=e.length;g<h;g++){var j=e[g];if(j.num==a.num&&j.gen==a.gen)break}d.unshift("`"+g)}e=
+        b;a=f}c.fullName=d.join(".")}},Wh=ba.prototype;w.inherit(ff,ba,{isViewable:function(){return"Sig"===this.data.fieldType?(L("unimplemented annotation type: Widget signature"),!1):Wh.isViewable.call(this)}});Jc=ff;var ef,gf=function(a){Jc.call(this,a);a.data||(this.data.textAlignment=w.getInheritableProperty(a.dict,"Q"))};w.inherit(gf,Jc,{hasHtml:function(){return!this.data.hasAppearance&&!!this.data.fieldValue},getHtmlElement:function(a){$(!Ad,"getHtmlElement() shall be called from main thread");var b=
+        this.data,c=this.getEmptyContainer("div");c.style.display="table";var d=document.createElement("div");d.textContent=b.fieldValue;d.style.textAlign=["left","center","right"][b.textAlignment];d.style.verticalAlign="middle";d.style.display="table-cell";a=b.fontRefName?a.getData(b.fontRefName):null;var e=d.style;e.fontSize=b.fontSize+"px";e.direction=0>b.fontDirection?"rtl":"ltr";a&&(e.fontWeight=a.black?a.bold?"bolder":"bold":a.bold?"bold":"normal",e.fontStyle=a.italic?"italic":"normal",b=a.loadedName,
+        e.fontFamily=(b?'"'+b+'", ':"")+(a.fallbackName||"Helvetica, sans-serif"));c.appendChild(d);return c},getOperatorList:function(a){if(this.appearance)return ba.prototype.getOperatorList.call(this,a);var b=new da,c=new Eb,d=this.data,e=d.defaultAppearance;if(!e)return b.resolve(c),b;e=new wa(Cb(e));a.getOperatorList(e,this.fieldResources,c);a=c.fnArray;e=c.argsArray;d.rgb=[0,0,0];for(var f=0;0>f;++f){var g=a[f],h=e[f];g===r.setFont?(d.fontRefName=h[0],g=h[1],0>g?(d.fontDirection=-1,d.fontSize=-g):(d.fontDirection=
+        1,d.fontSize=g)):g===r.setFillRGBColor?d.rgb=h:g===r.setFillGray&&(g=255*h[0],d.rgb=[g,g,g])}b.resolve(c);return b}});ef=gf;var Id=function(a){ba.call(this,a)};w.inherit(Id,ba,{hasHtml:function(){return!0},highlight:function(){this.highlightElement&&this.highlightElement.hasAttribute("hidden")&&this.highlightElement.removeAttribute("hidden")},unhighlight:function(){this.highlightElement&&!this.highlightElement.hasAttribute("hidden")&&this.highlightElement.setAttribute("hidden",!0)},initContainer:function(){for(var a=
+        this.data,b=this.getEmptyContainer("section",a.rect,a.borderWidth),c=b.style.backgroundColor=a.color,d=[],e=0;3>e;++e)d[e]=Math.round(255*c[e]);a.colorCssRgb=w.makeCssRgb(d);a=document.createElement("div");a.className="annotationHighlight";a.style.left=a.style.top="-4px";a.style.right=a.style.bottom="-4px";a.setAttribute("hidden",!0);this.highlightElement=a;b.appendChild(this.highlightElement);return b}});var df,hf=function(a){ba.call(this,a);if(!a.data){a=a.dict;var b=this.data,c=a.get("Contents"),
+        d=a.get("T");b.content=Ga(c||"");b.title=Ga(d||"");b.hasAppearance?b.name="NoIcon":(b.rect[1]=b.rect[3]-22,b.rect[2]=b.rect[0]+22,b.name=a.has("Name")?a.get("Name").name:"Note");a.has("C")&&(b.hasBgColor=!0)}};w.inherit(hf,Id,{getHtmlElement:function(){$(!Ad,"getHtmlElement() shall be called from main thread");var a=this.data,b=a.rect;10>b[3]-b[1]&&(b[3]=b[1]+10);10>b[2]-b[0]&&(b[2]=b[0]+(b[3]-b[1]));var c=this.initContainer();c.className="annotText";var d=document.createElement("img");d.style.height=
+        c.style.height;d.style.width=c.style.width;var e=a.name;d.src=PDFJS.imageResourcesPath+"annotation-"+e.toLowerCase()+".svg";d.alt="[{{type}} Annotation]";d.dataset.l10nId="text_annotation_type";d.dataset.l10nArgs=JSON.stringify({type:e});e=document.createElement("div");e.className="annotTextContentWrapper";e.style.left=Math.floor(b[2]-b[0]+5)+"px";e.style.top="-10px";var f=document.createElement("div");f.className="annotTextContent";f.setAttribute("hidden",!0);if(a.hasBgColor){for(var g=a.color,h=
+        [],b=0;3>b;++b){var j=Math.round(255*g[b]);h[b]=Math.round(0.7*(255-j))+j}f.style.backgroundColor=w.makeCssRgb(h)}g=document.createElement("h1");h=document.createElement("p");g.textContent=a.title;if(!a.content&&!a.title)f.setAttribute("hidden",!0);else{for(var j=document.createElement("span"),l=a.content.split(/(?:\r\n?|\n)/),b=0,a=l.length;b<a;++b)j.appendChild(document.createTextNode(l[b])),b<a-1&&j.appendChild(document.createElement("br"));h.appendChild(j);var k=!1,m=function(a){a&&(k=!0);f.hasAttribute("hidden")&&
+    (c.style.zIndex+=1,f.removeAttribute("hidden"))},n=function(a){a&&(k=!1);!f.hasAttribute("hidden")&&!k&&(c.style.zIndex-=1,f.setAttribute("hidden",!0))};d.addEventListener("click",function(){k?n(!0):m(!0)},!1);d.addEventListener("mouseover",function(){m()},!1);d.addEventListener("mouseout",function(){n()},!1);f.addEventListener("click",function(){n(!0)},!1)}f.appendChild(g);f.appendChild(h);e.appendChild(f);c.appendChild(d);c.appendChild(e);return c}});df=hf;var cf,jf=function(a){ba.call(this,a);
+        if(!a.data){var b=a.dict;a=this.data;var c=b.get("A");if(c)if(b=c.get("S").name,"URI"===b){var d=c.get("URI");D(d)?d="/"+d.name:d&&(d=d&&0===d.indexOf("www.")?"http://"+d:d);yd(d,!1)||(d="");a.url=d}else"GoTo"===b?a.dest=c.get("D"):"GoToR"===b?(b=c.get("F"),G(b)&&(d=b.get("F")||""),yd(d,!1)||(d=""),a.url=d,a.dest=c.get("D")):"Named"===b?a.action=c.get("N").name:L("unrecognized link type: "+b);else b.has("Dest")&&(d=b.get("Dest"),a.dest=D(d)?d.name:d)}};w.inherit(jf,Id,{hasOperatorList:function(){return!1},
+        getHtmlElement:function(){var a=this.initContainer();a.className="annotLink";a.style.borderColor=this.data.colorCssRgb;a.style.borderStyle="solid";var b=document.createElement("a");b.href=b.title=this.data.url||"";a.appendChild(b);return a}});cf=jf;var Jd=function(a,b){this.url=a;b=b||{};this.httpHeaders=(this.isHttp=/^https?:/i.test(a))&&b.httpHeaders||{};this.withCredentials=b.withCredentials||!1;this.getXhr=b.getXhr||function(){return new XMLHttpRequest};this.currXhrId=0;this.pendingRequests={};
+        this.loadedRequests={}};Jd.prototype={requestRange:function(a,b,c){a={begin:a,end:b};for(var d in c)a[d]=c[d];return this.request(a)},requestFull:function(a){return this.request(a)},request:function(a){var b=this.getXhr(),c=this.currXhrId++,d=this.pendingRequests[c]={xhr:b};b.open("GET",this.url);b.withCredentials=this.withCredentials;for(var e in this.httpHeaders){var f=this.httpHeaders[e];"undefined"!==typeof f&&b.setRequestHeader(e,f)}this.isHttp&&"begin"in a&&"end"in a?(b.setRequestHeader("Range",
+        "bytes="+(a.begin+"-"+(a.end-1))),d.expectedStatus=206):d.expectedStatus=200;b.mozResponseType=b.responseType="arraybuffer";a.onProgress&&(b.onprogress=a.onProgress);a.onError&&(b.onerror=function(){a.onError(b.status)});b.onreadystatechange=this.onStateChange.bind(this,c);d.onHeadersReceived=a.onHeadersReceived;d.onDone=a.onDone;d.onError=a.onError;b.send(null);return c},onStateChange:function(a){var b=this.pendingRequests[a];if(b){var c=b.xhr;2<=c.readyState&&b.onHeadersReceived&&(b.onHeadersReceived(),
+        delete b.onHeadersReceived);if(4===c.readyState&&a in this.pendingRequests)if(delete this.pendingRequests[a],0===c.status&&this.isHttp){if(b.onError)b.onError(c.status)}else{var d=c.status||200;if(!(200===d&&206===b.expectedStatus)&&d!==b.expectedStatus){if(b.onError)b.onError(c.status)}else{this.loadedRequests[a]=!0;a=c.mozResponseArrayBuffer||c.mozResponse||c.responseArrayBuffer||c.response;if("string"===typeof a){for(var e=a.length,f=new Uint8Array(e),g=0;g<e;g++)f[g]=a.charCodeAt(g)&255;a=f}if(206===
+        d)c=c.getResponseHeader("Content-Range"),c=/bytes (\d+)-(\d+)\/(\d+)/.exec(c),c=parseInt(c[1],10),b.onDone({begin:c,chunk:a});else b.onDone({begin:0,chunk:a})}}}},hasPendingRequests:function(){for(var a in this.pendingRequests)return!0;return!1},getRequestXhr:function(a){return this.pendingRequests[a].xhr},isPendingRequest:function(a){return a in this.pendingRequests},isLoadedRequest:function(a){return a in this.loadedRequests},abortAllRequests:function(){for(var a in this.pendingRequests)this.abortRequest(a|
+        0)},abortRequest:function(a){var b=this.pendingRequests[a].xhr;delete this.pendingRequests[a];b.abort()}};var Kd=function(a,b,c){this.bytes=new Uint8Array(a);this.pos=this.start=0;this.end=a;this.chunkSize=b;this.loadedChunks=[];this.numChunksLoaded=0;this.numChunks=Math.ceil(a/b);this.manager=c;this.initialDataLength=0};Kd.prototype={getMissingChunks:function(){for(var a=[],b=0,c=this.numChunks;b<c;++b)b in this.loadedChunks||a.push(b);return a},getBaseStreams:function(){return[this]},allChunksLoaded:function(){return this.numChunksLoaded===
+        this.numChunks},onReceiveData:function(a,b){var c=a+b.byteLength;$(0===a%this.chunkSize,"Bad begin offset: "+a);var d=this.bytes.length;$(0===c%this.chunkSize||c===d,"Bad end offset: "+c);this.bytes.set(new Uint8Array(b),a);d=this.chunkSize;c=Math.floor((c-1)/d)+1;for(d=Math.floor(a/d);d<c;++d)d in this.loadedChunks||(this.loadedChunks[d]=!0,++this.numChunksLoaded)},onReceiveInitialData:function(a){this.bytes.set(a);this.initialDataLength=a.length;a=this.end===a.length?this.numChunks:Math.floor(a.length/
+        this.chunkSize);for(var b=0;b<a;b++)this.loadedChunks[b]=!0,++this.numChunksLoaded},ensureRange:function(a,b){if(!(a>=b)&&!(b<=this.initialDataLength))for(var c=this.chunkSize,d=Math.floor((b-1)/c)+1,c=Math.floor(a/c);c<d;++c)if(!(c in this.loadedChunks))throw new db(a,b);},nextEmptyChunk:function(a){var b,c;b=a;for(c=this.numChunks;b<c;++b)if(!(b in this.loadedChunks))return b;for(b=0;b<a;++b)if(!(b in this.loadedChunks))return b;return null},hasChunk:function(a){return a in this.loadedChunks},get length(){return this.end-
+        this.start},getByte:function(){var a=this.pos;if(a>=this.end)return-1;this.ensureRange(a,a+1);return this.bytes[this.pos++]},getUint16:function(){var a=this.getByte(),b=this.getByte();return(a<<8)+b},getInt32:function(){var a=this.getByte(),b=this.getByte(),c=this.getByte(),d=this.getByte();return(a<<24)+(b<<16)+(c<<8)+d},getBytes:function(a){var b=this.bytes,c=this.pos,d=this.end;if(!a)return this.ensureRange(c,d),b.subarray(c,d);a=c+a;a>d&&(a=d);this.ensureRange(c,a);this.pos=a;return b.subarray(c,
+        a)},peekBytes:function(a){a=this.getBytes(a);this.pos-=a.length;return a},getByteRange:function(a,b){this.ensureRange(a,b);return this.bytes.subarray(a,b)},skip:function(a){a||(a=1);this.pos+=a},reset:function(){this.pos=this.start},moveStart:function(){this.start=this.pos},makeSubStream:function(a,b,c){function d(){}this.ensureRange(a,a+b);d.prototype=Object.create(this);d.prototype.getMissingChunks=function(){for(var a=this.chunkSize,b=Math.floor((this.end-1)/a)+1,c=[],a=Math.floor(this.start/a);a<
+    b;++a)a in this.loadedChunks||c.push(a);return c};var e=new d;e.pos=e.start=a;e.end=a+b||this.end;e.dict=c;return e},isStream:!0};var kf=function(a,b,c,d){this.stream=new Kd(a,b,this);this.length=a;this.chunkSize=b;this.url=c;this.disableAutoFetch=d.disableAutoFetch;var e=this.msgHandler=d.msgHandler;d.chunkedViewerLoading?(e.on("OnDataRange",this.onReceiveData.bind(this)),e.on("OnDataProgress",this.onProgress.bind(this)),this.sendRequest=function(a,b){e.send("RequestDataRange",{begin:a,end:b})}):
+        (this.networkManager=new Jd(this.url,{getXhr:function(){return new XMLHttpRequest},httpHeaders:d.httpHeaders,withCredentials:d.withCredentials}),this.sendRequest=function(a,b){this.networkManager.requestRange(a,b,{onDone:this.onReceiveData.bind(this),onProgress:this.onProgress.bind(this)})});this.currRequestId=0;this.chunksNeededByRequest={};this.requestsByChunk={};this.callbacksByRequest={};this.loadedStream=new da;d.initialData&&this.setInitialData(d.initialData)};kf.prototype={setInitialData:function(a){this.stream.onReceiveInitialData(a);
+        this.stream.allChunksLoaded()?this.loadedStream.resolve(this.stream):this.msgHandler&&this.msgHandler.send("DocProgress",{loaded:a.length,total:this.length})},onLoadedStream:function(){return this.loadedStream},requestAllChunks:function(){var a=this.stream.getMissingChunks();this.requestChunks(a);return this.loadedStream},requestChunks:function(a,b){var c=this.currRequestId++,d,e,f;this.chunksNeededByRequest[c]=d={};e=0;for(f=a.length;e<f;e++)this.stream.hasChunk(a[e])||(d[a[e]]=!0);if(zd(d))b&&b();
+    else{this.callbacksByRequest[c]=b;e=[];for(var g in d)g|=0,g in this.requestsByChunk||(this.requestsByChunk[g]=[],e.push(g)),this.requestsByChunk[g].push(c);if(e.length){c=this.groupChunks(e);for(e=0;e<c.length;++e)g=c[e],d=g.beginChunk*this.chunkSize,g=Math.min(g.endChunk*this.chunkSize,this.length),this.sendRequest(d,g)}}},getStream:function(){return this.stream},requestRange:function(a,b,c){b=Math.min(b,this.length);a=this.getBeginChunk(a);b=this.getEndChunk(b);for(var d=[];a<b;++a)d.push(a);this.requestChunks(d,
+        c)},requestRanges:function(a,b){a=a||[];for(var c=[],d=0;d<a.length;d++)for(var e=this.getBeginChunk(a[d].begin),f=this.getEndChunk(a[d].end);e<f;++e)0>c.indexOf(e)&&c.push(e);c.sort(function(a,b){return a-b});this.requestChunks(c,b)},groupChunks:function(a){for(var b=[],c=-1,d=-1,e=0;e<a.length;++e){var f=a[e];0>c&&(c=f);0<=d&&d+1!==f&&(b.push({beginChunk:c,endChunk:d+1}),c=f);e+1===a.length&&b.push({beginChunk:c,endChunk:f+1});d=f}return b},onProgress:function(a){this.msgHandler.send("DocProgress",
+        {loaded:this.stream.numChunksLoaded*this.chunkSize+a.loaded,total:this.length})},onReceiveData:function(a){var b=a.chunk;a=a.begin;var c=a+b.byteLength,d=this.getBeginChunk(a),c=this.getEndChunk(c);this.stream.onReceiveData(a,b);this.stream.allChunksLoaded()&&this.loadedStream.resolve(this.stream);a=[];for(var e,b=d;b<c;++b){var f=this.requestsByChunk[b]||[];delete this.requestsByChunk[b];for(d=0;d<f.length;++d){e=f[d];var g=this.chunksNeededByRequest[e];b in g&&delete g[b];zd(g)&&a.push(e)}}if(!this.disableAutoFetch&&
+        zd(this.requestsByChunk)){var h;1===this.stream.numChunksLoaded?(b=this.stream.numChunks-1,this.stream.hasChunk(b)||(h=b)):h=this.stream.nextEmptyChunk(c);S(h)&&this.requestChunks([h])}for(d=0;d<a.length;++d)e=a[d],h=this.callbacksByRequest[e],delete this.callbacksByRequest[e],h&&h();this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize,total:this.length})},getBeginChunk:function(a){return Math.floor(a/this.chunkSize)},getEndChunk:function(a){return 0===a%this.chunkSize?
+    a/this.chunkSize:Math.floor((a-1)/this.chunkSize)+1}};var Ld=function(){throw Error("Cannot initialize BaseManagerManager");};Ld.prototype={onLoadedStream:function(){throw new Ma;},ensureDoc:function(a,b){return this.ensure(this.pdfDocument,a,b)},ensureXRef:function(a,b){return this.ensure(this.pdfDocument.xref,a,b)},ensureCatalog:function(a,b){return this.ensure(this.pdfDocument.catalog,a,b)},getPage:function(a){return this.pdfDocument.getPage(a)},cleanup:function(){return this.pdfDocument.cleanup()},
+        ensure:function(){return new Ma},requestRange:function(){return new Ma},requestLoadedStream:function(){return new Ma},updatePassword:function(a){this.pdfDocument.xref.password=this.password=a;this.passwordChangedPromise&&this.passwordChangedPromise.resolve()},terminate:function(){return new Ma}};var Xa=function(a,b){var c=new wa(a);this.pdfDocument=new Md(this,c,b);this.loadedStream=new da;this.loadedStream.resolve(c)};Xa.prototype=Object.create(Ld.prototype);Xa.prototype.constructor=Xa;Xa.prototype.ensure=
+        function(a,b,c){var d=new da;try{var e=a[b],f;f="function"===typeof e?e.apply(a,c):e;d.resolve(f)}catch(g){console.log(g.stack),d.reject(g)}return d};Xa.prototype.requestRange=function(){var a=new da;a.resolve();return a};Xa.prototype.requestLoadedStream=function(){};Xa.prototype.onLoadedStream=function(){return this.loadedStream};Xa.prototype.terminate=function(){};var Ya=function(a,b){this.msgHandler=b;this.streamManager=new kf(a.length,65536,a.url,{msgHandler:b,httpHeaders:a.httpHeaders,withCredentials:a.withCredentials,
+        chunkedViewerLoading:a.chunkedViewerLoading,disableAutoFetch:a.disableAutoFetch,initialData:a.initialData});this.pdfDocument=new Md(this,this.streamManager.getStream(),a.password)};Ya.prototype=Object.create(Ld.prototype);Ya.prototype.constructor=Ya;Ya.prototype.ensure=function(a,b,c){var d=new da;this.ensureHelper(d,a,b,c);return d};Ya.prototype.ensureHelper=function(a,b,c,d){try{var e,f=b[c];e="function"===typeof f?f.apply(b,d):f;a.resolve(e)}catch(g){g instanceof db?this.streamManager.requestRange(g.begin,
+        g.end,function(){this.ensureHelper(a,b,c,d)}.bind(this)):(console.log(g.stack),a.reject(g))}};Ya.prototype.requestRange=function(a,b){var c=new da;this.streamManager.requestRange(a,b,function(){c.resolve()});return c};Ya.prototype.requestLoadedStream=function(){this.streamManager.requestAllChunks()};Ya.prototype.onLoadedStream=function(){return this.streamManager.onLoadedStream()};Ya.prototype.terminate=function(){this.streamManager.networkManager.abortAllRequests()};var lf=function(a,b,c,d,e,f){this.pdfManager=
+        a;this.pageIndex=c;this.pageDict=d;this.xref=b;this.ref=e;this.fontCache=f;this.idCounters={obj:0};this.resourcesPromise=null},Xh=[0,0,612,792];lf.prototype={getPageProp:function(a){return this.pageDict.get(a)},getInheritedPageProp:function(a){for(var b=this.pageDict,c=b.get(a);void 0===c;){b=b.get("Parent");if(!b)break;c=b.get(a)}return c},get content(){return this.getPageProp("Contents")},get resources(){var a=this.getInheritedPageProp("Resources");void 0===a&&(a=ya.empty);return K(this,"resources",
+        a)},get mediaBox(){var a=this.getInheritedPageProp("MediaBox");if(!I(a)||4!==a.length)a=Xh;return K(this,"mediaBox",a)},get view(){var a=this.mediaBox,b=this.getInheritedPageProp("CropBox");if(!I(b)||4!==b.length)return K(this,"view",a);b=w.intersect(b,a);return!b?K(this,"view",a):K(this,"view",b)},get annotationRefs(){return K(this,"annotationRefs",this.getInheritedPageProp("Annots"))},get rotate(){var a=this.getInheritedPageProp("Rotate")||0;0!==a%90?a=0:360<=a?a%=360:0>a&&(a=(a%360+360)%360);return K(this,
+        "rotate",a)},getContentStream:function(){var a=this.content;if(I(a)){var b=this.xref,c,d=a.length,e=[];for(c=0;c<d;++c)e.push(b.fetchIfRef(a[c]));a=new mf(e)}else a=V(a)?a:new Nd;return a},loadResources:function(a){this.resourcesPromise||(this.resourcesPromise=this.pdfManager.ensure(this,"resources"));var b=new da;this.resourcesPromise.then(function(){(new Hd(this.resources.map,a,this.xref)).load().then(function(){b.resolve()})}.bind(this));return b},getOperatorList:function(a,b){function c(a){e.reject(a)}
+        var d=this,e=new da,f=new da,g=this.pdfManager,h=g.ensure(this,"getContentStream",[]),j=this.loadResources("ExtGState ColorSpace Pattern Shading XObject Font".split(" ")),l=new Od(g,this.xref,a,this.pageIndex,"p"+this.pageIndex+"_",this.idCounters,this.fontCache);Promise.all([h,j],c).then(function(c){c=c[0];var e=new Eb(b,a,d.pageIndex);a.send("StartRenderPage",{transparency:l.hasBlendModes(d.resources),pageIndex:d.pageIndex,intent:b});l.getOperatorList(c,d.resources,e);f.resolve(e)});h=g.ensure(this,
+            "annotations");Promise.all([f,h]).then(function(a){var d=a[0];a=a[1];0===a.length?(d.flush(!0),e.resolve(d)):ba.appendToOperatorList(a,d,g,l,b).then(function(){d.flush(!0);e.resolve(d)},c)},c);return e},extractTextContent:function(){var a={on:function(){},send:function(){}},b=this,c=this.pdfManager,d=c.ensure(this,"getContentStream",[]),e=this.loadResources(["ExtGState","XObject","Font"]);return Promise.all([d,e]).then(function(d){d=d[0];return(new Od(c,b.xref,a,b.pageIndex,"p"+b.pageIndex+"_",b.idCounters,
+        b.fontCache)).getTextContent(d,b.resources)})},getAnnotationsData:function(){for(var a=this.annotations,b=[],c=0,d=a.length;c<d;++c)b.push(a[c].getData());return b},get annotations(){for(var a=[],b=this.annotationRefs||[],c=0,d=b.length;c<d;++c){var e=ba.fromRef(this.xref,b[c]);e&&a.push(e)}return K(this,"annotations",a)}};var Md,of=function(a,b,c){V(b)?nf.call(this,a,b,c):"object"==typeof b&&null!==b&&void 0!==b&&"byteLength"in b?nf.call(this,a,new wa(b),c):u("PDFDocument: Unknown argument type")},
+        nf=function(a,b,c){$(0<b.length,"stream must have data");this.pdfManager=a;this.stream=b;this.xref=new pf(this.stream,c,a)},Pd=function(a,b,c,d){var e=a.pos,f=a.end,g=[];e+c>f&&(c=f-e);for(f=0;f<c;++f)g.push(String.fromCharCode(a.getByte()));c=g.join("");a.pos=e;b=d?c.lastIndexOf(b):c.indexOf(b);if(-1==b)return!1;a.pos+=b;return!0},Yh={get entries(){return K(this,"entries",{Title:oa,Author:oa,Subject:oa,Keywords:oa,Creator:oa,Producer:oa,CreationDate:oa,ModDate:oa,Trapped:D})}};of.prototype={parse:function(a){this.setup(a);
+        try{if(this.acroForm=this.catalog.catDict.get("AcroForm")){this.xfa=this.acroForm.get("XFA");var b=this.acroForm.get("Fields");if((!b||!I(b)||0===b.length)&&!this.xfa)this.acroForm=null}}catch(c){R("Something wrong with AcroForm entry"),this.acroForm=null}},get linearization(){var a=this.stream.length,b=!1;if(a)try{b=new qf(this.stream),b.length!=a&&(b=!1)}catch(c){if(c instanceof db)throw c;R("The linearization data is not available or unreadable PDF data is found");b=!1}return K(this,"linearization",
+        b)},get startXRef(){var a=this.stream,b=0;if(this.linearization)a.reset(),Pd(a,"endobj",1024)&&(b=a.pos+6);else{for(var c=!1,d=a.end;!c&&0<d;)d-=1015,0>d&&(d=0),a.pos=d,c=Pd(a,"startxref",1024,!0);if(c){a.skip(9);do b=a.getByte();while(ca.isSpace(b));for(c="";32<=b&&57>=b;)c+=String.fromCharCode(b),b=a.getByte();b=parseInt(c,10);isNaN(b)&&(b=0)}}return K(this,"startXRef",b)},get mainXRefEntriesOffset(){var a=0,b=this.linearization;b&&(a=b.mainXRefEntriesOffset);return K(this,"mainXRefEntriesOffset",
+        a)},checkHeader:function(){var a=this.stream;a.reset();if(Pd(a,"%PDF-",1024)){a.moveStart();for(var b="",c;32<(c=a.getByte())&&!(12<=b.length);)b+=String.fromCharCode(c);this.pdfFormatVersion=b.substring(5)}},parseStartXRef:function(){this.xref.setStartXRef(this.startXRef)},setup:function(a){this.xref.parse(a);this.catalog=new rf(this.pdfManager,this.xref)},get numPages(){var a=this.linearization;return K(this,"numPages",a?a.numPages:this.catalog.numPages)},get documentInfo(){var a={PDFFormatVersion:this.pdfFormatVersion,
+        IsAcroFormPresent:!!this.acroForm,IsXFAPresent:!!this.xfa},b;try{b=this.xref.trailer.get("Info")}catch(c){R("The document information dictionary is invalid.")}if(b){var d=Yh.entries,e;for(e in d)if(b.has(e)){var f=b.get(e);d[e](f)?a[e]="string"!==typeof f?f:Ga(f):R('Bad value in document info for "'+e+'"')}}return K(this,"documentInfo",a)},get fingerprint(){for(var a=this.xref,b="",a=a.trailer.has("ID")?Cb(a.trailer.get("ID")[0]):Oa(this.stream.bytes.subarray(0,100),0,100),c=0,d=a.length;c<d;c++)b+=
+        a[c].toString(16);return K(this,"fingerprint",b)},getPage:function(a){return this.catalog.getPage(a)},cleanup:function(){return this.catalog.cleanup()}};Md=of;var pa,Kc=function(a){this.name=a};Kc.prototype={};var sf={};Kc.get=function(a){var b=sf[a];return b?b:sf[a]=new Kc(a)};pa=Kc;var xa,Lc=function(a){this.cmd=a};Lc.prototype={};var tf={};Lc.get=function(a){var b=tf[a];return b?b:tf[a]=new Lc(a)};xa=Lc;var ya,Pb=function(a){this.map=Object.create(null);this.xref=a;this.objId=null;this.__nonSerializable__=
+        uf},uf=function(){return uf},vf={Background:!0,ExtGState:!0,Halftone:!0,Layout:!0,Mask:!0,Pagination:!0,Printing:!0};Pb.prototype={assignXref:function(a){this.xref=a},get:function(a,b,c){var d,e=this.xref;if("undefined"!=typeof(d=this.map[a])||a in this.map||"undefined"==typeof b||"undefined"!=typeof(d=this.map[b])||b in this.map||"undefined"==typeof c)return e?e.fetchIfRef(d):d;d=this.map[c]||null;return e?e.fetchIfRef(d):d},getAsync:function(a,b,c){var d,e=this.xref;if(void 0!==typeof(d=this.map[a])||
+        a in this.map||void 0===typeof b){if(e)return e.fetchIfRefAsync(d);a=new da;a.resolve(d);return a}if(void 0!==typeof(d=this.map[b])||b in this.map||void 0===typeof c){if(e)return e.fetchIfRefAsync(d);a=new da;a.resolve(d);return a}d=this.map[c]||null;if(e)return e.fetchIfRefAsync(d);a=new da;a.resolve(d);return a},getRaw:function(a){return this.map[a]},getAll:function(){var a=Object.create(null),b=null,c,d;for(c in this.map)d=this.get(c),d instanceof Pb?!D(d.Type)||!0===vf[d.Type.name]?(b||(b=[])).push({target:a,
+        key:c,obj:d}):a[c]=this.getRaw(c):a[c]=d;if(!b)return a;for(var e=Object.create(null);0<b.length;){var f=b.shift(),g=f.obj,h=g.objId;if(h&&h in e)f.target[f.key]=e[h];else{var j=Object.create(null);for(c in g.map)d=g.get(c),d instanceof Pb?!D(d.Type)||!0===vf[d.Type.name]?b.push({target:j,key:c,obj:d}):j[c]=g.getRaw(c):j[c]=d;h&&(e[h]=j);f.target[f.key]=j}}return a},set:function(a,b){this.map[a]=b},has:function(a){return a in this.map},forEach:function(a){for(var b in this.map)a(b,this.get(b))}};
+    Pb.empty=new Pb(null);ya=Pb;var tc,wf=function(a,b){this.num=a;this.gen=b};wf.prototype={};tc=wf;var Mc=function(){this.dict={}};Mc.prototype={has:function(a){return"R"+a.num+"."+a.gen in this.dict},put:function(a){this.dict["R"+a.num+"."+a.gen]=!0},remove:function(a){delete this.dict["R"+a.num+"."+a.gen]}};var xf=function(){this.dict=Object.create(null)};xf.prototype={get:function(a){return this.dict["R"+a.num+"."+a.gen]},has:function(a){return"R"+a.num+"."+a.gen in this.dict},put:function(a,b){this.dict["R"+
+    a.num+"."+a.gen]=b},putAlias:function(a,b){this.dict["R"+a.num+"."+a.gen]=this.get(b)},forEach:function(a,b){for(var c in this.dict)a.call(b,this.dict[c])},clear:function(){this.dict=Object.create(null)}};var rf,yf=function(a,b){this.pdfManager=a;this.xref=b;this.catDict=b.getCatalogObj();this.fontCache=new xf;$(G(this.catDict),"catalog object is not a dictionary");this.pagePromises=[]};yf.prototype={get metadata(){var a=this.catDict.getRaw("Metadata");if(!sa(a))return K(this,"metadata",null);var a=
+        this.xref.fetch(a,!(!this.xref.encrypt?0:this.xref.encrypt.encryptMetadata)),b;if(a&&G(a.dict)){var c=a.dict.get("Type"),d=a.dict.get("Subtype");if(D(c)&&D(d)&&"Metadata"===c.name&&"XML"===d.name)try{var e=La(a.getBytes());b=decodeURIComponent(escape(e))}catch(f){R("Skipping invalid metadata.")}}return K(this,"metadata",b)},get toplevelPagesDict(){var a=this.catDict.get("Pages");$(G(a),"invalid top-level pages dictionary");return K(this,"toplevelPagesDict",a)},get documentOutline(){var a=null;try{a=
+        this.readDocumentOutline()}catch(b){if(b instanceof db)throw b;L("Unable to read document outline")}return K(this,"documentOutline",a)},readDocumentOutline:function(){var a=this.xref,b=this.catDict.get("Outlines"),c={items:[]};if(G(b)){var b=b.getRaw("First"),d=new Mc;if(sa(b)){var e=[{obj:b,parent:c}];for(d.put(b);0<e.length;){var f=e.shift(),g=a.fetchIfRef(f.obj);if(null!==g){g.has("Title")||u("Invalid outline item");(b=g.get("A"))?b=b.get("D"):g.has("Dest")&&(b=g.getRaw("Dest"),D(b)&&(b=b.name));
+        var h=g.get("Title"),h={dest:b,title:Ga(h),color:g.get("C")||[0,0,0],count:g.get("Count"),bold:!!(g.get("F")&2),italic:!!(g.get("F")&1),items:[]};f.parent.items.push(h);b=g.getRaw("First");sa(b)&&!d.has(b)&&(e.push({obj:b,parent:h}),d.put(b));b=g.getRaw("Next");sa(b)&&!d.has(b)&&(e.push({obj:b,parent:f.parent}),d.put(b))}}}}return 0<c.items.length?c.items:null},get numPages(){var a=this.toplevelPagesDict.get("Count");$(S(a),"page count in top level pages object is not an integer");return K(this,"num",
+        a)},get destinations(){var a=this.xref,b={},c,d,e=this.catDict.get("Names");e?c=e.getRaw("Dests"):this.catDict.has("Dests")&&(d=this.catDict.get("Dests"));d&&d.forEach(function(a,c){c&&(b[a]=G(c)?c.get("D"):c)});if(c){var a=(new Nc(c,a)).getAll(),f;for(f in a)a.hasOwnProperty(f)&&(b[f]=G(a[f])?a[f].get("D"):a[f])}return K(this,"destinations",b)},get attachments(){var a=this.xref,b,c,d=this.catDict.get("Names");d&&(c=d.getRaw("EmbeddedFiles"));if(c){c=(new Nc(c,a)).getAll();for(var e in c)c.hasOwnProperty(e)&&
+    (d=new zf(c[e],a),b||(b={}),b[Ga(e)]=d.serializable)}return K(this,"attachments",b)},get javaScript(){var a=this.xref,b=this.catDict.get("Names"),c=[];if(b&&b.has("JavaScript")){var a=(new Nc(b.getRaw("JavaScript"),a)).getAll(),d;for(d in a)if(a.hasOwnProperty(d)&&(b=a[d],G(b))){var e=b.get("S");if(D(e)&&"JavaScript"===e.name&&(b=b.get("JS"),oa(b)||V(b)))V(b)&&(b=La(b.getBytes())),c.push(Ga(b))}}return K(this,"javaScript",c)},cleanup:function(){this.fontCache.forEach(function(a){delete a.sent;delete a.translated});
+        this.fontCache.clear()},getPage:function(a){a in this.pagePromises||(this.pagePromises[a]=this.getPageDict(a).then(function(b){return new lf(this.pdfManager,this.xref,a,b[0],b[1],this.fontCache)}.bind(this)));return this.pagePromises[a]},getPageDict:function(a){function b(){for(;d.length;){var g=d.pop();if(sa(g)){f.fetchAsync(g).then(function(f){G(f,"Page")||G(f)&&!f.has("Kids")?a===e?c.resolve([f,g]):(e++,b()):(d.push(f),b())}.bind(this),c.reject.bind(c));return}$(G(g),"page dictionary kid reference points to wrong type of object");
+        var h=g.get("Count");if(e+h<=a)e+=h;else{var j=g.get("Kids");$(I(j),"page dictionary kids object is not an array");if(h===j.length)d=[j[a-e]],e=a;else for(h=j.length-1;0<=h;h--)d.push(j[h])}}c.reject("Page index "+a+" not found.")}var c=new da,d=[this.catDict.getRaw("Pages")],e=0,f=this.xref;b();return c},getPageIndex:function(a){function b(a){var f=0,g;return c.fetchAsync(a).then(function(a){if(!a)return null;g=a.getRaw("Parent");return a.getAsync("Parent")}).then(function(a){return!a?null:a.getAsync("Kids")}).then(function(b){if(!b)return null;
+        for(var d=[],l=!1,k=0;k<b.length;k++){var m=b[k];$(sa(m),"kids must be a ref");if(m.num==a.num){l=!0;break}d.push(c.fetchAsync(m).then(function(a){a.has("Count")?(a=a.get("Count"),f+=a):f++}))}l||u("kid ref not found in parents kids");return Promise.all(d).then(function(){return[f,g]})}).then(function(a){if(!a)return d;var c=a[1];d+=a[0];return b(c)})}var c=this.xref,d=0;return b(a)}};rf=yf;var pf,Af=function(a,b){this.stream=a;this.entries=[];this.xrefstms={};this.cache=[];this.password=b};Af.prototype=
+    {setStartXRef:function(a){this.startXRefQueue=[a]},parse:function(a){a?(L("Indexing all PDF objects"),a=this.indexObjects()):a=this.readXRef();a.assignXref(this);this.trailer=a;var b=a.get("Encrypt");if(b){var c=a.get("ID");this.encrypt=new Bf(b,c&&c.length?c[0]:"",this.password)}(this.root=a.get("Root"))||u("Invalid root reference")},processXRefTable:function(a){"tableState"in this||(this.tableState={entryNum:0,streamPos:a.lexer.stream.pos,parserBuf1:a.buf1,parserBuf2:a.buf2});var b=this.readXRefTable(a);
+        Y(b,"trailer")||u("Invalid XRef table: could not find trailer dictionary");a=a.getObj();G(a)||u("Invalid XRef table: could not parse trailer dictionary");delete this.tableState;return a},readXRefTable:function(a){var b=a.lexer.stream,c=this.tableState;b.pos=c.streamPos;a.buf1=c.parserBuf1;a.buf2=c.parserBuf2;for(var d;;){if(!("firstEntryNum"in c)||!("entryCount"in c)){if(Y(d=a.getObj(),"trailer"))break;c.firstEntryNum=d;c.entryCount=a.getObj()}var e=c.firstEntryNum,f=c.entryCount;(!S(e)||!S(f))&&
+    u("Invalid XRef table: wrong types in subsection header");for(var g=c.entryNum;g<f;g++){c.streamPos=b.pos;c.entryNum=g;c.parserBuf1=a.buf1;c.parserBuf2=a.buf2;var h={};h.offset=a.getObj();h.gen=a.getObj();var j=a.getObj();Y(j,"f")?h.free=!0:Y(j,"n")&&(h.uncompressed=!0);if(!S(h.offset)||!S(h.gen)||!h.free&&!h.uncompressed)console.log(h.offset,h.gen,h.free,h.uncompressed),u("Invalid entry in XRef subsection: "+e+", "+f);this.entries[g+e]||(this.entries[g+e]=h)}c.entryNum=0;c.streamPos=b.pos;c.parserBuf1=
+        a.buf1;c.parserBuf2=a.buf2;delete c.firstEntryNum;delete c.entryCount}1===e&&(this.entries[1]&&this.entries[1].free)&&this.entries.shift();this.entries[0]&&!this.entries[0].free&&u("Invalid XRef table: unexpected first object");return d},processXRefStream:function(a){if(!("streamState"in this)){var b=a.dict,c=b.get("W"),d=b.get("Index");d||(d=[0,b.get("Size")]);this.streamState={entryRanges:d,byteWidths:c,entryNum:0,streamPos:a.pos}}this.readXRefStream(a);delete this.streamState;return a.dict},readXRefStream:function(a){var b,
+        c,d=this.streamState;a.pos=d.streamPos;b=d.byteWidths;for(var e=b[0],f=b[1],g=b[2],h=d.entryRanges;0<h.length;){var j=h[0],l=h[1];(!S(j)||!S(l))&&u("Invalid XRef range fields: "+j+", "+l);(!S(e)||!S(f)||!S(g))&&u("Invalid XRef entry fields length: "+j+", "+l);for(b=d.entryNum;b<l;++b){d.entryNum=b;d.streamPos=a.pos;var k=0,m=0,n=0;for(c=0;c<e;++c)k=k<<8|a.getByte();0===e&&(k=1);for(c=0;c<f;++c)m=m<<8|a.getByte();for(c=0;c<g;++c)n=n<<8|a.getByte();c={};c.offset=m;c.gen=n;switch(k){case 0:c.free=!0;
+        break;case 1:c.uncompressed=!0;break;case 2:break;default:u("Invalid XRef entry type: "+k)}this.entries[j+b]||(this.entries[j+b]=c)}d.entryNum=0;d.streamPos=a.pos;h.splice(0,2)}},indexObjects:function(){function a(a,b,c){for(var d=c.length,e=a.length,f=0;b<e;){for(var g=0;g<d&&a[b+g]==c[g];)++g;if(g>=d)break;b++;f++}return f}var b=new Uint8Array([116,114,97,105,108,101,114]),c=new Uint8Array([115,116,97,114,116,120,114,101,102]),d=new Uint8Array([101,110,100,111,98,106]),e=new Uint8Array([47,88,82,
+        101,102]),f=this.stream;f.pos=0;for(var g=f.getBytes(),h=f.start,j=g.length,l=[],k=[];h<j;){var m=g[h];if(32===m||9===m||13===m||10===m)++h;else if(37===m){do{++h;if(h>=j)break;m=g[h]}while(13!==m&&10!==m)}else{for(var m=g,n=h,p="",q=m[n];13!==q&&10!==q&&!(++n>=m.length);)p+=String.fromCharCode(q),q=m[n];m=p;"xref"===m?(h+=a(g,h,b),l.push(h),h+=a(g,h,c)):(n=/^(\d+)\s+(\d+)\s+obj\b/.exec(m))?(this.entries[n[1]]={offset:h,gen:n[2]|0,uncompressed:!0},m=a(g,h,d)+7,n=g.subarray(h,h+m),p=a(n,0,e),p<m&&
+    64>n[p+5]&&(k.push(h),this.xrefstms[h]=1),h+=m):h+=m.length+1}}b=0;for(c=k.length;b<c;++b)this.startXRefQueue.push(k[b]),this.readXRef(!0);for(var s,b=0,c=l.length;b<c;++b)if(f.pos=l[b],k=new vb(new ca(f),!0,null),d=k.getObj(),Y(d,"trailer")&&G(s=k.getObj())&&s.has("ID"))return s;if(s)return s;throw new vc("Invalid PDF structure");},readXRef:function(a){var b=this.stream;try{for(;this.startXRefQueue.length;){b.pos=this.startXRefQueue[0]+b.start;var c=new vb(new ca(b),!0,null),d=c.getObj(),e;if(Y(d,
+            "xref")){if(e=this.processXRefTable(c),this.topDict||(this.topDict=e),d=e.get("XRefStm"),S(d)){var f=d;f in this.xrefstms||(this.xrefstms[f]=1,this.startXRefQueue.push(f))}}else S(d)?((!S(c.getObj())||!Y(c.getObj(),"obj")||!V(d=c.getObj()))&&u("Invalid XRef stream"),e=this.processXRefStream(d),this.topDict||(this.topDict=e),e||u("Failed to read XRef stream")):u("Invalid XRef stream header");d=e.get("Prev");S(d)?this.startXRefQueue.push(d):sa(d)&&this.startXRefQueue.push(d.num);this.startXRefQueue.shift()}return this.topDict}catch(g){if(g instanceof
+        db)throw g;R("(while reading XRef): "+g)}if(!a)throw new Ob;},getEntry:function(a){return(a=this.entries[a])&&!a.free&&a.offset?a:null},fetchIfRef:function(a){return!sa(a)?a:this.fetch(a)},fetch:function(a,b){$(sa(a),"ref object is not a reference");var c=a.num;if(c in this.cache)return this.cache[c];var d=this.getEntry(c);if(null===d)return this.cache[c]=null;d=d.uncompressed?this.fetchUncompressed(a,d,b):this.fetchCompressed(d,b);G(d)&&(d.objId="R"+a.num+"."+a.gen);return d},fetchUncompressed:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     b,c){var d=a.gen,e=a.num;b.gen!==d&&u("inconsistent generation in XRef");var f=this.stream.makeSubStream(b.offset+this.stream.start),f=new vb(new ca(f),!0,this),g=f.getObj(),h=f.getObj(),j=f.getObj();(!S(g)||parseInt(g,10)!==e||!S(h)||parseInt(h,10)!==d||!Y(j))&&u("bad XRef entry");if(!Y(j,"obj")){if(0===j.cmd.indexOf("obj")&&(e=parseInt(j.cmd.substring(3),10),!isNaN(e)))return e;u("bad XRef entry")}if(this.encrypt&&!c)try{b=f.getObj(this.encrypt.createCipherTransform(e,d))}catch(l){return this.fetch(a,
+        !0)}else b=f.getObj();V(b)||(this.cache[e]=b);return b},fetchCompressed:function(a){var b=a.offset,c=this.fetch(new tc(b,0));V(c)||u("bad ObjStm stream");var d=c.dict.get("First"),e=c.dict.get("N");(!S(d)||!S(e))&&u("invalid first and n parameters for ObjStm stream");c=new vb(new ca(c),!1,this);c.allowStreams=!0;for(var f=[],g,h=[],d=0;d<e;++d)g=c.getObj(),S(g)||u("invalid object number in the ObjStm stream: "+g),h.push(g),g=c.getObj(),S(g)||u("invalid object offset in the ObjStm stream: "+g);for(d=
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  0;d<e;++d){f.push(c.getObj());g=h[d];var j=this.entries[g];j&&(j.offset===b&&j.gen===d)&&(this.cache[g]=f[d])}a=f[a.gen];void 0===a&&u("bad XRef entry for compressed object");return a},fetchIfRefAsync:function(a){if(!sa(a)){var b=new da;b.resolve(a);return b}return this.fetchAsync(a)},fetchAsync:function(a,b){var c=new da,d=function(c){try{c.resolve(this.fetch(a,b))}catch(f){f instanceof db?this.stream.manager.requestRange(f.begin,f.end,d):c.reject(f)}}.bind(this,c);d();return c},getCatalogObj:function(){return this.root}};
+    pf=Af;var Nc,Cf=function(a,b){this.root=a;this.xref=b};Cf.prototype={getAll:function(){var a={};if(!this.root)return a;var b=this.xref,c=new Mc;c.put(this.root);for(var d=[this.root];0<d.length;){var e,f;e=b.fetchIfRef(d.shift());if(G(e))if(e.has("Kids")){var g=e.get("Kids");e=0;for(f=g.length;e<f;e++){var h=g[e];c.has(h)&&u("invalid destinations");d.push(h);c.put(h)}}else if(g=e.get("Names")){e=0;for(f=g.length;e<f;e+=2)a[g[e]]=b.fetchIfRef(g[e+1])}}return a}};Nc=Cf;var zf,Df=function(a,b){a&&G(a)&&
+    (this.xref=b,this.root=a,a.has("FS")&&(this.fs=a.get("FS")),this.description=a.has("Desc")?Ga(a.get("Desc")):"",a.has("RF")&&L("Related file specifications are not supported"),this.contentAvailable=!0,a.has("EF")||(this.contentAvailable=!1,L("Non-embedded file specifications are not supported")))},Ef=function(a){return a.has("UF")?a.get("UF"):a.has("F")?a.get("F"):a.has("Unix")?a.get("Unix"):a.has("Mac")?a.get("Mac"):a.has("DOS")?a.get("DOS"):null};Df.prototype={get filename(){if(!this._filename&&
+        this.root){var a=Ef(this.root)||"unnamed";this._filename=Ga(a).replace(/\\\\/g,"\\").replace(/\\\//g,"/").replace(/\\/g,"/")}return this._filename},get content(){if(!this.contentAvailable)return null;!this.contentRef&&this.root&&(this.contentRef=Ef(this.root.get("EF")));var a=null;if(this.contentRef){var b=this.xref.fetchIfRef(this.contentRef);b&&V(b)?a=b.getBytes():L("Embedded file specification points to non-existing/invalid content")}else L("Embedded file specification does not have a content");
+        return a},get serializable(){return{filename:this.filename,content:this.content}}};zf=Df;var Hd,Ff=function(a,b,c){this.obj=a;this.keys=b;this.xref=c;this.refSet=null};Ff.prototype={load:function(){var a=this.keys;this.promise=new da;if(!(this.xref.stream instanceof Kd)||0===this.xref.stream.getMissingChunks().length)return this.promise.resolve(),this.promise;this.refSet=new Mc;for(var b=[],c=0;c<a.length;c++)b.push(this.obj[a[c]]);this.walk(b);return this.promise},walk:function(a){for(var b=[],c=
+        [];a.length;){var d=a.pop();if(sa(d)){if(this.refSet.has(d))continue;try{this.refSet.put(d),d=this.xref.fetch(d)}catch(e){if(!(e instanceof db))throw e;b.push(d);c.push({begin:e.begin,end:e.end})}}if(d&&d.getBaseStreams){for(var f=d.getBaseStreams(),g=!1,h=0;h<f.length;h++){var j=f[h];j.getMissingChunks&&j.getMissingChunks().length&&(g=!0,c.push({begin:j.start,end:j.end}))}g&&b.push(d)}g=d;d=a;f=void 0;if(G(g)||V(g))for(g in h=void 0,h=G(g)?g.map:g.dict.map,g=void 0,h)f=h[g],(sa(f)||G(f)||I(f)||V(f))&&
+    d.push(f);else if(I(g)){h=0;for(j=g.length;h<j;h++)f=g[h],(sa(f)||G(f)||I(f)||V(f))&&d.push(f)}}c.length?this.xref.stream.manager.requestRanges(c,function(){a=b;for(var c=0;c<b.length;c++){var d=b[c];sa(d)&&this.refSet.remove(d)}this.walk(a)}.bind(this)):(this.refSet=null,this.promise.resolve())}};Hd=Ff;var Zh=".notdef space exclam quotedbl numbersign dollar percent ampersand quoteright parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde exclamdown cent sterling fraction yen florin section currency quotesingle quotedblleft guillemotleft guilsinglleft guilsinglright fi fl endash dagger daggerdbl periodcentered paragraph bullet quotesinglbase quotedblbase quotedblright guillemotright ellipsis perthousand questiondown grave acute circumflex tilde macron breve dotaccent dieresis ring cedilla hungarumlaut ogonek caron emdash AE ordfeminine Lslash Oslash OE ordmasculine ae dotlessi lslash oslash oe germandbls onesuperior logicalnot mu trademark Eth onehalf plusminus Thorn onequarter divide brokenbar degree thorn threequarters twosuperior registered minus eth multiply threesuperior copyright Aacute Acircumflex Adieresis Agrave Aring Atilde Ccedilla Eacute Ecircumflex Edieresis Egrave Iacute Icircumflex Idieresis Igrave Ntilde Oacute Ocircumflex Odieresis Ograve Otilde Scaron Uacute Ucircumflex Udieresis Ugrave Yacute Ydieresis Zcaron aacute acircumflex adieresis agrave aring atilde ccedilla eacute ecircumflex edieresis egrave iacute icircumflex idieresis igrave ntilde oacute ocircumflex odieresis ograve otilde scaron uacute ucircumflex udieresis ugrave yacute ydieresis zcaron".split(" "),
+        $h=".notdef space exclamsmall Hungarumlautsmall dollaroldstyle dollarsuperior ampersandsmall Acutesmall parenleftsuperior parenrightsuperior twodotenleader onedotenleader comma hyphen period fraction zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyle colon semicolon commasuperior threequartersemdash periodsuperior questionsmall asuperior bsuperior centsuperior dsuperior esuperior isuperior lsuperior msuperior nsuperior osuperior rsuperior ssuperior tsuperior ff fi fl ffi ffl parenleftinferior parenrightinferior Circumflexsmall hyphensuperior Gravesmall Asmall Bsmall Csmall Dsmall Esmall Fsmall Gsmall Hsmall Ismall Jsmall Ksmall Lsmall Msmall Nsmall Osmall Psmall Qsmall Rsmall Ssmall Tsmall Usmall Vsmall Wsmall Xsmall Ysmall Zsmall colonmonetary onefitted rupiah Tildesmall exclamdownsmall centoldstyle Lslashsmall Scaronsmall Zcaronsmall Dieresissmall Brevesmall Caronsmall Dotaccentsmall Macronsmall figuredash hypheninferior Ogoneksmall Ringsmall Cedillasmall onequarter onehalf threequarters questiondownsmall oneeighth threeeighths fiveeighths seveneighths onethird twothirds zerosuperior onesuperior twosuperior threesuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior centinferior dollarinferior periodinferior commainferior Agravesmall Aacutesmall Acircumflexsmall Atildesmall Adieresissmall Aringsmall AEsmall Ccedillasmall Egravesmall Eacutesmall Ecircumflexsmall Edieresissmall Igravesmall Iacutesmall Icircumflexsmall Idieresissmall Ethsmall Ntildesmall Ogravesmall Oacutesmall Ocircumflexsmall Otildesmall Odieresissmall OEsmall Oslashsmall Ugravesmall Uacutesmall Ucircumflexsmall Udieresissmall Yacutesmall Thornsmall Ydieresissmall".split(" "),
+        ai=".notdef space dollaroldstyle dollarsuperior parenleftsuperior parenrightsuperior twodotenleader onedotenleader comma hyphen period fraction zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyle colon semicolon commasuperior threequartersemdash periodsuperior asuperior bsuperior centsuperior dsuperior esuperior isuperior lsuperior msuperior nsuperior osuperior rsuperior ssuperior tsuperior ff fi fl ffi ffl parenleftinferior parenrightinferior hyphensuperior colonmonetary onefitted rupiah centoldstyle figuredash hypheninferior onequarter onehalf threequarters oneeighth threeeighths fiveeighths seveneighths onethird twothirds zerosuperior onesuperior twosuperior threesuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior centinferior dollarinferior periodinferior commainferior".split(" "),
+        jb=function(a){this.b=this.a=0;var b=new Uint8Array(256),c,d=0,e,f=a.length;for(c=0;256>c;++c)b[c]=c;for(c=0;256>c;++c)e=b[c],d=d+e+a[c%f]&255,b[c]=b[d],b[d]=e;this.s=b};jb.prototype={encryptBlock:function(a){var b,c=a.length,d,e,f=this.a,g=this.b,h=this.s,j=new Uint8Array(c);for(b=0;b<c;++b)f=f+1&255,d=h[f],g=g+d&255,e=h[g],h[f]=e,h[g]=d,j[b]=a[b]^h[d+e&255];this.a=f;this.b=g;return j}};jb.prototype.decryptBlock=jb.prototype.encryptBlock;var Oa,bi=new Uint8Array([7,12,17,22,7,12,17,22,7,12,17,22,
+        7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21]),ci=new Int32Array([-680876936,-389564586,606105819,-1044525330,-176418897,1200080426,-1473231341,-45705983,1770035416,-1958414417,-42063,-1990404162,1804603682,-40341101,-1502002290,1236535329,-165796510,-1069501632,643717713,-373897302,-701558691,38016083,-660478335,-405537848,568446438,-1019803690,-187363961,1163531501,-1444681467,-51403784,1735328473,-1926607734,
+        -378558,-2022574463,1839030562,-35309556,-1530992060,1272893353,-155497632,-1094730640,681279174,-358537222,-722521979,76029189,-640364487,-421815835,530742520,-995338651,-198630844,1126891415,-1416354905,-57434055,1700485571,-1894986606,-1051523,-2054922799,1873313359,-30611744,-1560198380,1309151649,-145523070,-1120210379,718787259,-343485551]);Oa=function(a,b,c){var d=1732584193,e=-271733879,f=-1732584194,g=271733878,h=c+72&-64,j=new Uint8Array(h),l;for(l=0;l<c;++l)j[l]=a[b++];j[l++]=128;for(a=
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                h-8;l<a;)j[l++]=0;j[l++]=c<<3&255;j[l++]=c>>5&255;j[l++]=c>>13&255;j[l++]=c>>21&255;j[l++]=c>>>29&255;j[l++]=0;j[l++]=0;j[l++]=0;a=new Int32Array(16);for(l=0;l<h;){for(c=0;16>c;++c,l+=4)a[c]=j[l]|j[l+1]<<8|j[l+2]<<16|j[l+3]<<24;var k=d;b=e;var m=f,n=g,p,q;for(c=0;64>c;++c){16>c?(p=b&m|~b&n,q=c):32>c?(p=n&b|~n&m,q=5*c+1&15):48>c?(p=b^m^n,q=3*c+5&15):(p=m^(b|~n),q=7*c&15);var s=n,k=k+p+ci[c]+a[q]|0;p=bi[c];n=m;m=b;b=b+(k<<p|k>>>32-p)|0;k=s}d=d+k|0;e=e+b|0;f=f+m|0;g=g+n|0}return new Uint8Array([d&255,
+        d>>8&255,d>>16&255,d>>>24&255,e&255,e>>8&255,e>>16&255,e>>>24&255,f&255,f>>8&255,f>>16&255,f>>>24&255,g&255,g>>8&255,g>>16&255,g>>>24&255])};var Gf=function(){};Gf.prototype={decryptBlock:function(a){return a}};var Hf=function(a){var b=new Uint8Array(176);b.set(a);a=16;for(var c=1;176>a;++c)for(var d=b[a-3],e=b[a-2],f=b[a-1],g=b[a-4],d=Oc[d],e=Oc[e],f=Oc[f],g=Oc[g],d=d^di[c],h=0;4>h;++h)b[a]=d^=b[a-16],a++,b[a]=e^=b[a-16],a++,b[a]=f^=b[a-16],a++,b[a]=g^=b[a-16],a++;this.key=b;this.buffer=new Uint8Array(16);
+        this.bufferPosition=0},ei=function(a,b){var c,d,e;e=a.length;var f=this.buffer;d=this.bufferPosition;var g=[],h=this.iv;for(c=0;c<e;++c)if(f[d]=a[c],++d,!(16>d)){var j,l=f;d=this.key;j=new Uint8Array(16);j.set(l);for(var k=l=void 0,m=void 0,n=k=m=void 0,k=0,m=160;16>k;++k,++m)j[k]^=d[m];for(l=9;1<=l;--l){m=j[13];j[13]=j[9];j[9]=j[5];j[5]=j[1];j[1]=m;m=j[14];k=j[10];j[14]=j[6];j[10]=j[2];j[6]=m;j[2]=k;m=j[15];k=j[11];n=j[7];j[15]=j[3];j[11]=m;j[7]=k;j[3]=n;for(k=0;16>k;++k)j[k]=If[j[k]];k=0;for(m=
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               16*l;16>k;++k,++m)j[k]^=d[m];for(k=0;16>k;k+=4){var m=Pc[j[k+1]],n=Pc[j[k+2]],p=Pc[j[k+3]],m=Pc[j[k]]^m>>>8^m<<24^n>>>16^n<<16^p>>>24^p<<8;j[k]=m>>>24&255;j[k+1]=m>>16&255;j[k+2]=m>>8&255;j[k+3]=m&255}}m=j[13];j[13]=j[9];j[9]=j[5];j[5]=j[1];j[1]=m;m=j[14];k=j[10];j[14]=j[6];j[10]=j[2];j[6]=m;j[2]=k;m=j[15];k=j[11];n=j[7];j[15]=j[3];j[11]=m;j[7]=k;j[3]=n;for(k=0;16>k;++k)j[k]=If[j[k]],j[k]^=d[k];for(d=0;16>d;++d)j[d]^=h[d];h=f;g.push(j);f=new Uint8Array(16);d=0}this.buffer=f;this.bufferLength=d;this.iv=
+        h;if(0===g.length)return new Uint8Array([]);c=16*g.length;b&&(e=g[g.length-1],c-=e[15],g[g.length-1]=e.subarray(0,16-e[15]));f=new Uint8Array(c);d=c=0;for(e=g.length;c<e;++c,d+=16)f.set(g[c],d);return f},di=new Uint8Array([141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,
+        145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,
+        151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141]),Oc=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,
+        51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,
+        137,13,191,230,66,104,65,153,45,15,176,84,187,22]),If=new Uint8Array([82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,
+        175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125]),Pc=new Uint32Array([0,
+        235474187,470948374,303765277,941896748,908933415,607530554,708780849,1883793496,2118214995,1817866830,1649639237,1215061108,1181045119,1417561698,1517767529,3767586992,4003061179,4236429990,4069246893,3635733660,3602770327,3299278474,3400528769,2430122216,2664543715,2362090238,2193862645,2835123396,2801107407,3035535058,3135740889,3678124923,3576870512,3341394285,3374361702,3810496343,3977675356,4279080257,4043610186,2876494627,2776292904,3076639029,3110650942,2472011535,2640243204,2403728665,2169303058,
+        1001089995,899835584,666464733,699432150,59727847,226906860,530400753,294930682,1273168787,1172967064,1475418501,1509430414,1942435775,2110667444,1876241833,1641816226,2910219766,2743034109,2976151520,3211623147,2505202138,2606453969,2302690252,2269728455,3711829422,3543599269,3240894392,3475313331,3843699074,3943906441,4178062228,4144047775,1306967366,1139781709,1374988112,1610459739,1975683434,2076935265,1775276924,1742315127,1034867998,866637845,566021896,800440835,92987698,193195065,429456164,
+        395441711,1984812685,2017778566,1784663195,1683407248,1315562145,1080094634,1383856311,1551037884,101039829,135050206,437757123,337553864,1042385657,807962610,573804783,742039012,2531067453,2564033334,2328828971,2227573024,2935566865,2700099354,3001755655,3168937228,3868552805,3902563182,4203181171,4102977912,3736164937,3501741890,3265478751,3433712980,1106041591,1340463100,1576976609,1408749034,2043211483,2009195472,1708848333,1809054150,832877231,1068351396,766945465,599762354,159417987,126454664,
+        361929877,463180190,2709260871,2943682380,3178106961,3009879386,2572697195,2538681184,2236228733,2336434550,3509871135,3745345300,3441850377,3274667266,3910161971,3877198648,4110568485,4211818798,2597806476,2497604743,2261089178,2295101073,2733856160,2902087851,3202437046,2968011453,3936291284,3835036895,4136440770,4169408201,3535486456,3702665459,3467192302,3231722213,2051518780,1951317047,1716890410,1750902305,1113818384,1282050075,1584504582,1350078989,168810852,67556463,371049330,404016761,841739592,
+        1008918595,775550814,540080725,3969562369,3801332234,4035489047,4269907996,3569255213,3669462566,3366754619,3332740144,2631065433,2463879762,2160117071,2395588676,2767645557,2868897406,3102011747,3069049960,202008497,33778362,270040487,504459436,875451293,975658646,675039627,641025152,2084704233,1917518562,1615861247,1851332852,1147550661,1248802510,1484005843,1451044056,933301370,967311729,733156972,632953703,260388950,25965917,328671808,496906059,1206477858,1239443753,1543208500,1441952575,2144161806,
+        1908694277,1675577880,1842759443,3610369226,3644379585,3408119516,3307916247,4011190502,3776767469,4077384432,4245618683,2809771154,2842737049,3144396420,3043140495,2673705150,2438237621,2203032232,2370213795]);Hf.prototype={decryptBlock:function(a,b){var c,d=a.length,e=this.buffer,f=this.bufferPosition;for(c=0;16>f&&c<d;++c,++f)e[f]=a[c];if(16>f)return this.bufferLength=f,new Uint8Array([]);this.iv=e;this.buffer=new Uint8Array(16);this.bufferLength=0;this.decryptBlock=ei;return this.decryptBlock(a.subarray(16),
+        b)}};var Qd=function(a,b){this.stringCipherConstructor=a;this.streamCipherConstructor=b};Qd.prototype={createStream:function(a,b){var c=new this.streamCipherConstructor;return new Jf(a,b,function(a,b){return c.decryptBlock(a,b)})},decryptString:function(a){var b=new this.stringCipherConstructor;a=Cb(a);a=b.decryptBlock(a,!0);return La(a)}};var Bf,Kf=function(a,b,c,d,e,f,g,h){var j=new Uint8Array(40+c.length+a.length),l=0,k;if(b)for(k=Math.min(32,b.length);l<k;++l)j[l]=b[l];for(b=0;32>l;)j[l++]=Qc[b++];
+        b=0;for(k=c.length;b<k;++b)j[l++]=c[b];j[l++]=e&255;j[l++]=e>>8&255;j[l++]=e>>16&255;j[l++]=e>>>24&255;b=0;for(k=a.length;b<k;++b)j[l++]=a[b];4<=f&&!h&&(j[l++]=255,j[l++]=255,j[l++]=255,j[l++]=255);k=Oa(j,0,l);l=g>>3;if(3<=f)for(b=0;50>b;++b)k=Oa(k,0,l);g=k.subarray(0,l);if(3<=f){for(l=0;32>l;++l)j[l]=Qc[l];b=0;for(k=a.length;b<k;++b)j[l++]=a[b];a=new jb(g);j=a.encryptBlock(Oa(j,0,l));k=g.length;f=new Uint8Array(k);for(b=1;19>=b;++b){for(a=0;a<k;++a)f[a]=g[a]^b;a=new jb(f);j=a.encryptBlock(j)}}else a=
+            new jb(g),j=a.encryptBlock(Qc);b=0;for(k=j.length;b<k;++b)if(d[b]!=j[b])return null;return g},Mf=function(a,b,c){var d=a.get("Filter");(!D(d)||"Standard"!=d.name)&&u("unknown encryption method");this.dict=a;d=a.get("V");(!S(d)||1!=d&&2!=d&&4!=d)&&u("unsupported encryption algorithm");this.algorithm=d;var e=a.get("Length")||40;(!S(e)||40>e||0!==e%8)&&u("invalid key length");var f=Cb(a.get("O")).subarray(0,32),g=Cb(a.get("U")).subarray(0,32),h=a.get("P"),j=a.get("R"),l=4==d&&!1!==a.get("EncryptMetadata");
+        this.encryptMetadata=l;b=Cb(b);var k;c&&(k=Cb(c));var m=Kf(b,k,f,g,h,j,e,l);if(!m&&!c)throw new Nb("No password given",Gc.NEED_PASSWORD);if(!m&&c){c=k;k=new Uint8Array(32);var m=0,n;for(n=Math.min(32,c.length);m<n;++m)k[m]=c[m];for(c=0;32>m;)k[m++]=Qc[c++];k=Oa(k,0,m);m=e>>3;if(3<=j)for(c=0;50>c;++c)k=Oa(k,0,k.length);var p;if(3<=j){n=f;var q=new Uint8Array(m);for(c=19;0<=c;c--){for(p=0;p<m;++p)q[p]=k[p]^c;p=new jb(q);n=p.encryptBlock(n)}}else p=new jb(k.subarray(0,m)),n=p.encryptBlock(f);m=Kf(b,
+            n,f,g,h,j,e,l)}if(!m)throw new Nb("Incorrect Password",Gc.INCORRECT_PASSWORD);this.encryptionKey=m;4==d&&(this.cf=a.get("CF"),this.stmf=a.get("StmF")||Lf,this.strf=a.get("StrF")||Lf,this.eff=a.get("EFF")||this.strf)},Rd=function(a,b,c,d){var e=new Uint8Array(c.length+9),f,g;f=0;for(g=c.length;f<g;++f)e[f]=c[f];e[f++]=a&255;e[f++]=a>>8&255;e[f++]=a>>16&255;e[f++]=b&255;e[f++]=b>>8&255;d&&(e[f++]=115,e[f++]=65,e[f++]=108,e[f++]=84);return Oa(e,0,f).subarray(0,Math.min(c.length+5,16))},Nf=function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                b,c,d,e){a=a.get(b.name);var f;null!==a&&void 0!==a&&(f=a.get("CFM"));if(!f||"None"==f.name)return function(){return new Gf};if("V2"==f.name)return function(){return new jb(Rd(c,d,e,!1))};if("AESV2"==f.name)return function(){return new Hf(Rd(c,d,e,!0))};u("Unknown crypto method")},Qc=new Uint8Array([40,191,78,94,78,117,138,65,100,0,78,86,255,250,1,8,46,46,0,182,208,104,62,128,47,12,169,254,100,83,105,122]),Lf=pa.get("Identity");Mf.prototype={createCipherTransform:function(a,b){if(4==this.algorithm)return new Qd(Nf(this.cf,
+        this.stmf,a,b,this.encryptionKey),Nf(this.cf,this.strf,a,b,this.encryptionKey));var c=Rd(a,b,this.encryptionKey,!1),d=function(){return new jb(c)};return new Qd(d,d)}};Bf=Mf;var Rc=function(){u("should not call Pattern constructor")};Rc.prototype={getPattern:function(a){u("Should not call Pattern.getStyle: "+a)}};Rc.parseShading=function(a,b,c,d){var e=V(a)?a.dict:a;switch(e.get("ShadingType")){case 2:case 3:return new fb.RadialAxial(e,b,c,d);case 4:case 5:case 6:case 7:return new fb.Mesh(a,b,c,d);
+        default:return rc.notify(xd.shadingPattern),new fb.Dummy}};var fb={SMALL_NUMBER:0.01},fi=fb,Of=function(a,b,c,d){this.matrix=b;this.coordsArr=a.get("Coords");this.shadingType=a.get("ShadingType");this.type="Pattern";b=a.get("ColorSpace","CS");this.cs=b=U.parse(b,c,d);d=0;var e=1;if(a.has("Domain")){var f=a.get("Domain");d=f[0];e=f[1]}var g=f=!1;a.has("Extend")&&(g=a.get("Extend"),f=g[0],g=g[1]);if(3===this.shadingType&&(!f||!g)){var h=this.coordsArr[0],j=this.coordsArr[1],l=this.coordsArr[2],k=this.coordsArr[3],
+        m=this.coordsArr[4],n=this.coordsArr[5],h=Math.sqrt((h-k)*(h-k)+(j-m)*(j-m));l<=n+h&&n<=l+h&&L("Unsupported radial gradient.")}this.extendStart=f;this.extendEnd=g;l=a.get("Function");if(I(l)){for(var p=[],n=0,h=l.length;n<h;n++)j=c.fetchIfRef(l[n]),uc(j)||u("Invalid function"),p.push(eb.parse(c,j));l=function(a){for(var b=[],c=0,d=p.length;c<d;c++)b.push(p[c](a)[0]);return b}}else uc(l)||u("Invalid function"),l=eb.parse(c,l);n=e-d;h=n/10;c=this.colorStops=[];if(d>=e||0>=h)R("Bad shading domain.");
+    else{for(j=d;j<=e;j+=h)k=b.getRgb(l([j]),0),k=w.makeCssRgb(k),c.push([(j-d)/n,k]);d="transparent";a.has("Background")&&(k=b.getRgb(a.get("Background"),0),d=w.makeCssRgb(k));f||(c.unshift([0,d]),c[1][0]+=fb.SMALL_NUMBER);g||(c[c.length-1][0]-=fb.SMALL_NUMBER,c.push([1,d]));this.colorStops=c}};Of.prototype={getIR:function(){var a=this.coordsArr,b=this.shadingType,c,d,e,f,g;2==b?(d=[a[0],a[1]],e=[a[2],a[3]],g=f=null,c="axial"):3==b?(d=[a[0],a[1]],e=[a[3],a[4]],f=a[2],g=a[5],c="radial"):u("getPattern type unknown: "+
+        b);if(a=this.matrix)d=w.applyTransform(d,a),e=w.applyTransform(e,a);return["RadialAxial",c,this.colorStops,d,e,f,g]}};fi.RadialAxial=Of;var gi=fb,Pf=function(a,b){this.stream=a;this.context=b;this.bufferLength=this.buffer=0},Qf=function(a){for(var b=a.coords[0][0],c=a.coords[0][1],d=b,e=c,f=1,g=a.coords.length;f<g;f++)var h=a.coords[f][0],j=a.coords[f][1],b=b>h?h:b,c=c>j?j:c,d=d<h?h:d,e=e<j?j:e;a.bounds=[b,c,d,e]},Uf=function(a,b,c,d){$(V(a),"Mesh data is not a stream");var e=a.dict;this.matrix=b;
+        this.shadingType=e.get("ShadingType");this.type="Pattern";this.bbox=e.get("BBox");var f=e.get("ColorSpace","CS");this.cs=f=U.parse(f,c,d);this.background=e.has("Background")?f.getRgb(e.get("Background"),0):null;var g=e.get("Function"),h;if(g)if(I(g)){for(var j=[],l=0,k=g.length;l<k;l++){var m=c.fetchIfRef(g[l]);uc(m)||u("Invalid function");j.push(eb.parse(c,m))}h=function(a){for(var b=[],c=0,d=j.length;c<d;c++)b.push(j[c](a)[0]);return b}}else uc(g)||u("Invalid function"),h=eb.parse(c,g);else h=null;
+        this.coords=[];this.colors=[];this.figures=[];var n={bitsPerCoordinate:e.get("BitsPerCoordinate"),bitsPerComponent:e.get("BitsPerComponent"),bitsPerFlag:e.get("BitsPerFlag"),decode:e.get("Decode"),colorFn:h,colorSpace:f,numComps:h?1:f.numComps},p=new Pf(a,n),q=!1;switch(this.shadingType){case 4:for(var s=this.coords,v=this.colors,t=[],r=[],aa=0;p.hasData;){var N=p.readFlag(),ea=p.readCoordinate(),B=p.readComponents();if(0===aa){$(0<=N&&2>=N,"Unknown type4 flag");switch(N){case 0:aa=3;break;case 1:r.push(r[r.length-
+        2],r[r.length-1]);aa=1;break;case 2:r.push(r[r.length-3],r[r.length-1]),aa=1}t.push(N)}r.push(s.length);s.push(ea);v.push(B);aa--;p.align()}var F=new Int32Array(r);this.figures.push({type:"triangles",coords:F,colors:F});break;case 5:var Sc=e.get("VerticesPerRow")|0;$(2<=Sc,"Invalid VerticesPerRow");for(var Fb=this.coords,Tc=this.colors,Ac=[];p.hasData;){var L=p.readCoordinate(),D=p.readComponents();Ac.push(Fb.length);Fb.push(L);Tc.push(D)}var G=new Int32Array(Ac);this.figures.push({type:"lattice",
+            coords:G,colors:G,verticesPerRow:Sc});break;case 6:for(var A=this.coords,w=this.colors,x=new Int32Array(16),Q=new Int32Array(4);p.hasData;){var mb=p.readFlag();$(0<=mb&&3>=mb,"Unknown type6 flag");var Ha,gb,O=A.length;Ha=0;for(gb=0!==mb?8:12;Ha<gb;Ha++)A.push(p.readCoordinate());var P=w.length;Ha=0;for(gb=0!==mb?2:4;Ha<gb;Ha++)w.push(p.readComponents());var z,R,E,S;switch(mb){case 0:x[12]=O+3;x[13]=O+4;x[14]=O+5;x[15]=O+6;x[8]=O+2;x[11]=O+7;x[4]=O+1;x[7]=O+8;x[0]=O;x[1]=O+11;x[2]=O+10;x[3]=O+9;Q[2]=
+            P+1;Q[3]=P+2;Q[0]=P;Q[1]=P+3;break;case 1:z=x[12];R=x[13];E=x[14];S=x[15];x[12]=O+5;x[13]=O+4;x[14]=O+3;x[15]=O+2;x[8]=O+6;x[11]=O+1;x[4]=O+7;x[7]=O;x[0]=z;x[1]=R;x[2]=E;x[3]=S;z=Q[2];R=Q[3];Q[2]=P+1;Q[3]=P;Q[0]=z;Q[1]=R;break;case 2:x[12]=x[15];x[13]=O+7;x[14]=O+6;x[15]=O+5;x[8]=x[11];x[11]=O+4;x[4]=x[7];x[7]=O+3;x[0]=x[3];x[1]=O;x[2]=O+1;x[3]=O+2;Q[2]=Q[3];Q[3]=P+1;Q[0]=Q[1];Q[1]=P;break;case 3:x[12]=x[0],x[13]=x[1],x[14]=x[2],x[15]=x[3],x[8]=O,x[11]=O+7,x[4]=O+1,x[7]=O+6,x[0]=O+2,x[1]=O+3,x[2]=
+            O+4,x[3]=O+5,Q[2]=Q[0],Q[3]=Q[1],Q[0]=P,Q[1]=P+1}x[5]=A.length;A.push([(-4*A[x[0]][0]-A[x[15]][0]+6*(A[x[4]][0]+A[x[1]][0])-2*(A[x[12]][0]+A[x[3]][0])+3*(A[x[13]][0]+A[x[7]][0]))/9,(-4*A[x[0]][1]-A[x[15]][1]+6*(A[x[4]][1]+A[x[1]][1])-2*(A[x[12]][1]+A[x[3]][1])+3*(A[x[13]][1]+A[x[7]][1]))/9]);x[6]=A.length;A.push([(-4*A[x[3]][0]-A[x[12]][0]+6*(A[x[2]][0]+A[x[7]][0])-2*(A[x[0]][0]+A[x[15]][0])+3*(A[x[4]][0]+A[x[14]][0]))/9,(-4*A[x[3]][1]-A[x[12]][1]+6*(A[x[2]][1]+A[x[7]][1])-2*(A[x[0]][1]+A[x[15]][1])+
+        3*(A[x[4]][1]+A[x[14]][1]))/9]);x[9]=A.length;A.push([(-4*A[x[12]][0]-A[x[3]][0]+6*(A[x[8]][0]+A[x[13]][0])-2*(A[x[0]][0]+A[x[15]][0])+3*(A[x[11]][0]+A[x[1]][0]))/9,(-4*A[x[12]][1]-A[x[3]][1]+6*(A[x[8]][1]+A[x[13]][1])-2*(A[x[0]][1]+A[x[15]][1])+3*(A[x[11]][1]+A[x[1]][1]))/9]);x[10]=A.length;A.push([(-4*A[x[15]][0]-A[x[0]][0]+6*(A[x[11]][0]+A[x[14]][0])-2*(A[x[12]][0]+A[x[3]][0])+3*(A[x[2]][0]+A[x[8]][0]))/9,(-4*A[x[15]][1]-A[x[0]][1]+6*(A[x[11]][1]+A[x[14]][1])-2*(A[x[12]][1]+A[x[3]][1])+3*(A[x[2]][1]+
+        A[x[8]][1]))/9]);this.figures.push({type:"patch",coords:new Int32Array(x),colors:new Int32Array(Q)})}q=!0;break;case 7:for(var K=this.coords,ga=this.colors,C=new Int32Array(16),fa=new Int32Array(4);p.hasData;){var Y=p.readFlag();$(0<=Y&&3>=Y,"Unknown type7 flag");var Z,T,J=K.length;Z=0;for(T=0!==Y?12:16;Z<T;Z++)K.push(p.readCoordinate());var M=ga.length;Z=0;for(T=0!==Y?2:4;Z<T;Z++)ga.push(p.readComponents());var wc,da,ma,ba;switch(Y){case 0:C[12]=J+3;C[13]=J+4;C[14]=J+5;C[15]=J+6;C[8]=J+2;C[9]=J+
+            13;C[10]=J+14;C[11]=J+7;C[4]=J+1;C[5]=J+12;C[6]=J+15;C[7]=J+8;C[0]=J;C[1]=J+11;C[2]=J+10;C[3]=J+9;fa[2]=M+1;fa[3]=M+2;fa[0]=M;fa[1]=M+3;break;case 1:wc=C[12];da=C[13];ma=C[14];ba=C[15];C[12]=J+5;C[13]=J+4;C[14]=J+3;C[15]=J+2;C[8]=J+6;C[9]=J+11;C[10]=J+10;C[11]=J+1;C[4]=J+7;C[5]=J+8;C[6]=J+9;C[7]=J;C[0]=wc;C[1]=da;C[2]=ma;C[3]=ba;wc=fa[2];da=fa[3];fa[2]=M+1;fa[3]=M;fa[0]=wc;fa[1]=da;break;case 2:C[12]=C[15];C[13]=J+7;C[14]=J+6;C[15]=J+5;C[8]=C[11];C[9]=J+8;C[10]=J+11;C[11]=J+4;C[4]=C[7];C[5]=J+9;C[6]=
+            J+10;C[7]=J+3;C[0]=C[3];C[1]=J;C[2]=J+1;C[3]=J+2;fa[2]=fa[3];fa[3]=M+1;fa[0]=fa[1];fa[1]=M;break;case 3:C[12]=C[0],C[13]=C[1],C[14]=C[2],C[15]=C[3],C[8]=J,C[9]=J+9,C[10]=J+8,C[11]=J+7,C[4]=J+1,C[5]=J+10,C[6]=J+11,C[7]=J+6,C[0]=J+2,C[1]=J+3,C[2]=J+4,C[3]=J+5,fa[2]=fa[0],fa[3]=fa[1],fa[0]=M,fa[1]=M+1}this.figures.push({type:"patch",coords:new Int32Array(C),colors:new Int32Array(fa)})}q=!0;break;default:u("Unsupported mesh type.")}if(q){Qf(this);for(var oa=0,hi=this.figures.length;oa<hi;oa++){var ta=
+            oa,wa=this.figures[ta];$("patch"===wa.type,"Unexpected patch mesh figure");for(var W=this.coords,Sb=this.colors,ia=wa.coords,ua=wa.colors,Aa=Math.min(W[ia[0]][0],W[ia[3]][0],W[ia[12]][0],W[ia[15]][0]),Fa=Math.min(W[ia[0]][1],W[ia[3]][1],W[ia[12]][1],W[ia[15]][1]),ii=Math.max(W[ia[0]][0],W[ia[3]][0],W[ia[12]][0],W[ia[15]][0]),sa=Math.max(W[ia[0]][1],W[ia[3]][1],W[ia[12]][1],W[ia[15]][1]),H=Math.ceil((ii-Aa)*Rf/(this.bounds[2]-this.bounds[0])),H=Math.max(Sf,Math.min(Tf,H)),X=Math.ceil((sa-Fa)*Rf/(this.bounds[3]-
+            this.bounds[1])),X=Math.max(Sf,Math.min(Tf,X)),qa=H+1,y=new Int32Array((X+1)*qa),ha=new Int32Array((X+1)*qa),ka=0,la=new Uint8Array(3),na=new Uint8Array(3),ca=Sb[ua[0]],ra=Sb[ua[1]],ya=Sb[ua[2]],Za=Sb[ua[3]],Ja=Sd(X),ji=Sd(H),za=0;za<=X;za++){la[0]=(ca[0]*(X-za)+ya[0]*za)/X|0;la[1]=(ca[1]*(X-za)+ya[1]*za)/X|0;la[2]=(ca[2]*(X-za)+ya[2]*za)/X|0;na[0]=(ra[0]*(X-za)+Za[0]*za)/X|0;na[1]=(ra[1]*(X-za)+Za[1]*za)/X|0;na[2]=(ra[2]*(X-za)+Za[2]*za)/X|0;for(var Ba=0;Ba<=H;Ba++,ka++)if(!(0===za||za===X)||!(0===
+            Ba||Ba===H)){for(var xa=0,Ea=0,Ia=0,xc=0;3>=xc;xc++)for(var La=0;3>=La;La++,Ia++)var Qb=Ja[za][xc]*ji[Ba][La],xa=xa+W[ia[Ia]][0]*Qb,Ea=Ea+W[ia[Ia]][1]*Qb;y[ka]=W.length;W.push([xa,Ea]);ha[ka]=Sb.length;var va=new Uint8Array(3);va[0]=(la[0]*(H-Ba)+na[0]*Ba)/H|0;va[1]=(la[1]*(H-Ba)+na[1]*Ba)/H|0;va[2]=(la[2]*(H-Ba)+na[2]*Ba)/H|0;Sb.push(va)}}y[0]=ia[0];ha[0]=ua[0];y[H]=ia[3];ha[H]=ua[1];y[qa*X]=ia[12];ha[qa*X]=ua[2];y[qa*X+H]=ia[15];ha[qa*X+H]=ua[3];this.figures[ta]={type:"lattice",coords:y,colors:ha,
+            verticesPerRow:qa}}}Qf(this);var Ra,$b,Ca,nb,ac=this.coords,ja=new Float32Array(2*ac.length);Ca=Ra=0;for($b=ac.length;Ra<$b;Ra++){var Fc=ac[Ra];ja[Ca++]=Fc[0];ja[Ca++]=Fc[1]}this.coords=ja;var Sa=this.colors,wb=new Uint8Array(3*Sa.length);Ca=Ra=0;for($b=Sa.length;Ra<$b;Ra++){var Ga=Sa[Ra];wb[Ca++]=Ga[0];wb[Ca++]=Ga[1];wb[Ca++]=Ga[2]}this.colors=wb;var hc=this.figures;Ra=0;for($b=hc.length;Ra<$b;Ra++){var pa=hc[Ra],$a=pa.coords,Gb=pa.colors;Ca=0;for(nb=$a.length;Ca<nb;Ca++)$a[Ca]*=2,Gb[Ca]*=3}};Pf.prototype=
+    {get hasData(){if(this.stream.end)return this.stream.pos<this.stream.end;if(0<this.bufferLength)return!0;var a=this.stream.getByte();if(0>a)return!1;this.buffer=a;this.bufferLength=8;return!0},readBits:function(a){var b=this.buffer,c=this.bufferLength;if(32===a){if(0===c)return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0;b=b<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();a=this.stream.getByte();this.buffer=a&
+        (1<<c)-1;return(b<<8-c|(a&255)>>c)>>>0}if(8===a&&0===c)return this.stream.getByte();for(;c<a;)b=b<<8|this.stream.getByte(),c+=8;this.bufferLength=c-=a;this.buffer=b&(1<<c)-1;return b>>c},align:function(){this.bufferLength=this.buffer=0},readFlag:function(){return this.readBits(this.context.bitsPerFlag)},readCoordinate:function(){var a=this.context.bitsPerCoordinate,b=this.readBits(a),c=this.readBits(a),d=this.context.decode,a=32>a?1/((1<<a)-1):2.3283064365386963E-10;return[b*a*(d[1]-d[0])+d[0],c*
+    a*(d[3]-d[2])+d[2]]},readComponents:function(){for(var a=this.context.numComps,b=this.context.bitsPerComponent,c=32>b?1/((1<<b)-1):2.3283064365386963E-10,d=this.context.decode,e=[],f=0,g=4;f<a;f++,g+=2){var h=this.readBits(b);e.push(h*c*(d[g+1]-d[g])+d[g])}this.context.colorFn&&(e=this.context.colorFn(e));return this.context.colorSpace.getRgb(e,0)}};var Sf=3,Tf=20,Rf=20,Sd,Td=[];Sd=function(a){if(!Td[a]){for(var b=[],c=0;c<=a;c++){var d=c/a,e=1-d;b.push(new Float32Array([e*e*e,3*d*e*e,3*d*d*e,d*d*
+    d]))}Td[a]=b}return Td[a]};Uf.prototype={getIR:function(){return["Mesh",this.shadingType,this.coords,this.colors,this.figures,this.bounds,this.matrix,this.bbox,this.background]}};gi.Mesh=Uf;var ki=fb,Vf=function(){this.type="Pattern"};Vf.prototype={getIR:function(){return["Dummy"]}};ki.Dummy=Vf;var Od,Wf=function(a,b,c,d,e,f,g){this.pdfManager=a;this.xref=b;this.handler=c;this.pageIndex=d;this.uniquePrefix=e;this.idCounters=f;this.fontCache=g};Wf.prototype={hasBlendModes:function(a){if(!G(a))return!1;
+        var b=Object.create(null);a.objId&&(b[a.objId]=!0);for(a=[a];a.length;){var c,d=a.shift(),e=d.get("ExtGState");if(G(e))for(c in e=e.getAll(),e){var f=e[c].BM;if(D(f)&&"Normal"!==f.name)return!0}d=d.get("XObject");if(G(d))for(c in d=d.getAll(),d)if(e=d[c],V(e)&&(e=e.dict.get("Resources"),G(e)&&(!e.objId||!b[e.objId])))a.push(e),e.objId&&(b[e.objId]=!0)}return!1},buildFormXObject:function(a,b,c,d,e){var f=b.dict.get("Matrix"),g=b.dict.get("BBox"),h=b.dict.get("Group");if(h){var j={matrix:f,bbox:g,smask:c,
+        isolated:!1,knockout:!1};c=h.get("S");D(c)&&"Transparency"===c.name&&(j.isolated=h.get("I")||!1,j.knockout=h.get("K")||!1,c=h.get("CS"),j.colorSpace=c?U.parseToIR(c,this.xref,a):null);d.addOp(r.beginGroup,[j])}d.addOp(r.paintFormXObjectBegin,[f,g]);this.getOperatorList(b,b.dict.get("Resources")||a,d,e);d.addOp(r.paintFormXObjectEnd,[]);h&&d.addOp(r.endGroup,[j])},buildPaintImageXObject:function(a,b,c,d,e,f){var g=this,h=b.dict,j=h.get("Width","W"),l=h.get("Height","H");if(!j||!lb(j)||!l||!lb(l))L("Image dimensions are missing, or not numbers.");
+    else if(-1!==PDFJS.maxImageSize&&j*l>PDFJS.maxImageSize)L("Image exceeded maximum allowed size and was removed.");else if(h.get("ImageMask","IM")){a=h.get("Width","W");c=h.get("Height","H");var k=b.getBytes((a+7>>3)*c),h=h.get("Decode","D");b=Zb.createMask(k,a,c,b instanceof Z,!!h&&0<h[0]);b.cached=!0;j=[b];d.addOp(r.paintImageMaskXObject,j);e&&(f.key=e,f.fn=r.paintImageMaskXObject,f.args=j)}else if(k=h.get("SMask","SM")||!1,h=h.get("Mask")||!1,c&&!k&&!h&&!(b instanceof yc)&&200>j+l)b=(new Zb(this.xref,
+        a,b,c,null,null)).createImageData(!0),d.addOp(r.paintInlineImageXObject,[b]);else{var m="img_"+(this.uniquePrefix||"")+ ++this.idCounters.obj;d.addDependency(m);j=[m,j,l];!k&&!h&&b instanceof yc&&b.isNativelySupported(this.xref,a)?(d.addOp(r.paintJpegXObject,j),this.handler.send("obj",[m,this.pageIndex,"JpegStream",b.getIR()])):(Zb.buildImage(g.handler,g.xref,a,b,c).then(function(a){a=a.createImageData(!1);g.handler.send("obj",[m,g.pageIndex,"Image",a],null,[a.data.buffer])}).then(null,function(a){L("Unable to decode image: "+
+        a);g.handler.send("obj",[m,g.pageIndex,"Image",null])}),d.addOp(r.paintImageXObject,j),e&&(f.key=e,f.fn=r.paintImageXObject,f.args=j))}},handleSMask:function(a,b,c,d){var e=a.get("G");a={subtype:a.get("S").name,backdrop:a.get("BC")};this.buildFormXObject(b,e,a,c,d.state.clone())},handleTilingType:function(a,b,c,d,e,f){c=this.getOperatorList(d,e.get("Resources")||c);f.addDependencies(c.dependencies);f.addOp(a,Qh({fnArray:c.fnArray,argsArray:c.argsArray},e,b))},handleSetFont:function(a,b,c,d,e){var f;
+        b&&(b=b.slice(),f=b[0].name);a=this.loadFont(f,c,this.xref,a,d);e.font=a;e=a.loadedName;a.sent||(b=a.translated.exportData(),this.handler.send("commonobj",[e,"Font",b]),a.sent=!0);return e},handleText:function(a,b){var c=b.font.translated,d=c.charsToGlyphs(a),e=!!(b.textRenderingMode&4);if(c.data&&(e||PDFJS.disableFontFace))for(e=0;e<d.length;e++)if(null!==d[e]){var f=d[e].fontChar;if(!c.renderer.hasBuiltPath(f)){var g=c.renderer.getPathJs(f);this.handler.send("commonobj",[c.loadedName+"_path_"+f,
+        "FontPath",g])}}return d},setGState:function(a,b,c,d,e){var f=[];b=b.map;for(var g in b){var h=f,j=g,l=b[g];switch(j){case "Type":break;case "LW":case "LC":case "LJ":case "ML":case "D":case "RI":case "FL":case "CA":case "ca":h.push([j,l]);break;case "Font":var k=this.handleSetFont(a,null,l[0],c,e.state);c.addDependency(k);h.push([j,[k,l[1]]]);break;case "BM":h.push([j,l]);break;case "SMask":if(D(l)&&"None"===l.name){h.push([j,!1]);break}l=d.fetchIfRef(l);G(l)?(this.handleSMask(l,a,c,e),h.push([j,
+        !0])):L("Unsupported SMask type");break;case "OP":case "op":case "OPM":case "BG":case "BG2":case "UCR":case "UCR2":case "TR":case "TR2":case "HT":case "SM":case "SA":case "AIS":case "TK":R("graphic state operator "+j);break;default:R("Unknown graphic state operator "+j)}}c.addOp(r.setGState,[f])},loadFont:function(a,b,c,d,e){function f(){return{translated:new Ud("Font "+a+" is not available"),loadedName:"g_font_error"}}var g;if(b)$(sa(b)),g=b;else if(b=d.get("Font"))g=b.getRaw(a);else return L("fontRes not available"),
+        f();if(this.fontCache.has(g))return this.fontCache.get(g);b=c.fetchIfRef(g);if(!G(b))return f();var h=this.preEvaluateFont(b,c),j=h.descriptor,l=g.num+"_"+g.gen;if(G(j)){j.fontAliases||(j.fontAliases=Object.create(null));l=j.fontAliases;j=h.hash;if(l[j]){var k=l[j].aliasRef;if(k&&this.fontCache.has(k))return this.fontCache.putAlias(g,k),this.fontCache.get(g)}l[j]||(l[j]={fontID:Uc.getFontID()});l[j].aliasRef=g;l=l[j].fontID}(j=G(g))||this.fontCache.put(g,b);b.loadedName="g_font_"+(j?a.replace(/\W/g,
+            ""):l);if(!b.translated){var m;try{m=this.translateFont(h,c)}catch(n){rc.notify(xd.font),m=new Ud(n instanceof Error?n.message:n)}b.translated=m}if(b.translated.loadCharProcs){c=b.get("CharProcs").getAll();d=b.get("Resources")||d;m=Object.keys(c);g={};h=0;for(l=m.length;h<l;++h)j=m[h],k=this.getOperatorList(c[j],d),g[j]=k.getIR(),e&&e.addDependencies(g.dependencies);b.translated.charProcOperatorList=g}b.loaded=!0;return b},getOperatorList:function(a,b,c,d){var e=this.xref,f={};c=c||new Eb;b=b||ya.empty;
+        var g=b.get("XObject")||ya.empty,h=b.get("Pattern")||ya.empty;d=new Vd(d||new Xf);a=new Wd(a,e,d);for(var j,l;j=a.read();){var k=j.args;j=j.fn;switch(j){case r.setStrokeColorN:case r.setFillColorN:if(k[k.length-1].code)break;l=k[k.length-1];var m;if(D(l)&&(m=h.get(l.name))){l=V(m)?m.dict:m;var n=l.get("PatternType");if(1==n){this.handleTilingType(j,k,b,m,l,c);continue}else 2==n?(k=l.get("Shading"),m=l.get("Matrix"),m=Rc.parseShading(k,m,e,b),k=m.getIR()):u("Unkown PatternType "+n)}break;case r.paintXObject:if(k[0].code)break;
+            l=k[0].name;if(f.key===l){c.addOp(f.fn,f.args);continue}if(n=g.get(l)){$(V(n),"XObject should be a stream");var p=n.dict.get("Subtype");$(D(p),"XObject should have a Name subtype");if("Form"==p.name){d.save();this.buildFormXObject(b,n,null,c,d.state.clone());d.restore();continue}else if("Image"==p.name){this.buildPaintImageXObject(b,n,!1,c,l,f);continue}else u("Unhandled XObject subtype "+p.name)}break;case r.setFont:l=this.handleSetFont(b,k,null,c,d.state);c.addDependency(l);k[0]=l;break;case r.endInlineImage:if((j=
+                k[0].cacheKey)&&f.key===j){c.addOp(f.fn,f.args);continue}this.buildPaintImageXObject(b,k[0],!0,c,j,f);continue;case r.showText:k[0]=this.handleText(k[0],d.state);break;case r.showSpacedText:n=k[0];p=n.length;for(l=0;l<p;++l)oa(n[l])&&(n[l]=this.handleText(n[l],d.state));break;case r.nextLineShowText:k[0]=this.handleText(k[0],d.state);break;case r.nextLineSetSpacingShowText:k[2]=this.handleText(k[2],d.state);break;case r.setTextRenderingMode:d.state.textRenderingMode=k[0];break;case r.setFillColorSpace:case r.setStrokeColorSpace:k=
+            [U.parseToIR(k[0],e,b)];break;case r.shadingFill:(j=b.get("Shading"))||u("No shading resource found");(k=j.get(k[0].name))||u("No shading object found");k=[Rc.parseShading(k,null,e,b).getIR()];j=r.shadingFill;break;case r.setGState:l=k[0];n=b.get("ExtGState");if(!G(n)||!n.has(l.name))break;k=n.get(l.name);this.setGState(b,k,c,e,d);continue}c.addOp(j,k)}l=0;for(b=a.savedStatesDepth;l<b;l++)c.addOp(r.restore,[]);return c},getTextContent:function(a,b,c){function d(){var a=q.font;a.loadedName in h.styles||
+    (h.styles[a.loadedName]={fontFamily:a.fallbackName,ascent:a.ascent,descent:a.descent,vertical:a.vertical});return{str:"",dir:null,width:0,height:0,transform:null,fontName:a.loadedName}}function e(a){var b=PDFJS.bidi(a.str,-1,q.font.vertical);a.str=b.str;a.dir=b.dir;return a}function f(a,c){var d=q.font=l.loadFont(a,c,k,b,null).translated;q.fontMatrix=d.fontMatrix?d.fontMatrix:Db}function g(a,b){var c=q.font;b=b||d();if(!b.transform){var e=b.transform=w.transform(q.ctm,w.transform(q.textMatrix,[q.fontSize*
+    q.textHScale,0,0,q.fontSize,0,q.textRise]));c.vertical?b.width=Math.sqrt(e[0]*e[0]+e[1]*e[1]):b.height=Math.sqrt(e[2]*e[2]+e[3]*e[3])}for(var f=e=0,g=c.charsToGlyphs(a),h=0;h<g.length;h++){var j=g[h];if(j){var l=null,l=c.vertical?j.vmetric?j.vmetric[0]:j.width:j.width,j=j.unicode;j in Yf&&(j=Yf[j]);var k=j.length,m;if(!(m=1>=k)){m=j.charCodeAt(0);var p=Vc[13];m>=p.begin&&m<p.end?m=!0:(p=Vc[11],m=m>=p.begin&&m<p.end?!0:!1);m=!m}if(!m){m="";for(k-=1;0<=k;k--)m+=j[k];j=m}m=k=0;c.vertical?(m=l*q.fontMatrix[0]*
+        q.fontSize+q.charSpacing,f+=m):(k=(l*q.fontMatrix[0]*q.fontSize+q.charSpacing)*q.textHScale,e+=k);q.translateTextMatrix(k,m);b.str+=j}else e+=q.wordSpacing*q.textHScale}h=q.textLineMatrix[0];l=q.textLineMatrix[1];g=Math.sqrt(h*h+l*l);h=q.ctm[0];l=q.ctm[1];h=Math.sqrt(h*h+l*l);c.vertical?b.height+=Math.abs(f*h*g):b.width+=e*h*g;return b}c=c||new Vd(new Zf);var h={items:[],styles:Object.create(null)},j=h.items,l=this,k=this.xref;b=k.fetchIfRef(b)||ya.empty;var m=null,n={};a=new Wd(a,k,c);for(var p,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           q;p=a.read();){q=c.state;var s=p.args;switch(p.fn){case r.setFont:f(s[0].name);q.fontSize=s[1];break;case r.setTextRise:q.textRise=s[0];break;case r.setHScale:q.textHScale=s[0]/100;break;case r.setLeading:q.leading=s[0];break;case r.moveText:q.translateTextLineMatrix(s[0],s[1]);q.textMatrix=q.textLineMatrix.slice();break;case r.setLeadingMoveText:q.leading=-s[1];q.translateTextLineMatrix(s[0],s[1]);q.textMatrix=q.textLineMatrix.slice();break;case r.nextLine:q.carriageReturn();break;case r.setTextMatrix:q.setTextMatrix(s[0],
+        s[1],s[2],s[3],s[4],s[5]);q.setTextLineMatrix(s[0],s[1],s[2],s[3],s[4],s[5]);break;case r.setCharSpacing:q.charSpacing=s[0];break;case r.setWordSpacing:q.wordSpacing=s[0];break;case r.beginText:q.textMatrix=tb.slice();q.textLineMatrix=tb.slice();break;case r.showSpacedText:s=s[0];p=d();for(var v,t=0,u=s.length;t<u;t++)if("string"===typeof s[t])g(s[t],p);else if(v=s[t]/1E3,q.font.vertical?(v=-v*q.fontSize*q.textMatrix[3],q.translateTextMatrix(0,v),p.height+=v):(v=-v*q.fontSize*q.textHScale*q.textMatrix[0],
+            q.translateTextMatrix(v,0),p.width+=v),0>s[t]&&0<q.font.spaceWidth)if(v=-s[t]/q.font.spaceWidth,1.5<v)for(v=Math.round(v);v--;)p.str+=" ";else 0.35<v&&(p.str+=" ");j.push(e(p));break;case r.showText:j.push(e(g(s[0])));break;case r.nextLineShowText:q.carriageReturn();j.push(e(g(s[0])));break;case r.nextLineSetSpacingShowText:q.wordSpacing=s[0];q.charSpacing=s[1];q.carriageReturn();j.push(e(g(s[2])));break;case r.paintXObject:if(s[0].code)break;m||(m=b.get("XObject")||ya.empty);s=s[0].name;if(n.key===
+        s){n.texts&&(w.concatenateToArray(j,n.texts.items),w.extendObj(h.styles,n.texts.styles));break}p=m.get(s);if(!p)break;$(V(p),"XObject should be a stream");t=p.dict.get("Subtype");$(D(t),"XObject should have a Name subtype");if("Form"!==t.name){n.key=s;n.texts=null;break}c.save();t=p.dict.get("Matrix");I(t)&&6===t.length&&c.transform(t);p=this.getTextContent(p,p.dict.get("Resources")||b,c);w.concatenateToArray(j,p.items);w.extendObj(h.styles,p.styles);c.restore();n.key=s;n.texts=p;break;case r.setGState:p=
+        s[0];t=b.get("ExtGState");if(!G(t)||!t.has(p.name))break;p=t.get(p.name);for(t=0;t<p.length;t++)"Font"===p[t]&&f(s[0].name)}}return h},extractDataStructures:function(a,b,c,d){if(b=a.get("ToUnicode")||b.get("ToUnicode"))d.toUnicode=this.readToUnicode(b,c,d);d.composite&&(c=a.get("CIDSystemInfo"),G(c)&&(d.cidSystemInfo={registry:c.get("Registry"),ordering:c.get("Ordering"),supplement:c.get("Supplement")}),c=a.get("CIDToGIDMap"),V(c)&&(d.cidToGidMap=this.readCidToGidMap(c)));c=[];b=null;var e;if(a.has("Encoding")){e=
+        a.get("Encoding");if(G(e)){if(b=e.get("BaseEncoding"),b=D(b)?b.name:null,e.has("Differences")){e=e.get("Differences");for(var f=0,g=0,h=e.length;g<h;g++){var j=e[g];lb(j)?f=j:c[f++]=j.name}}}else D(e)?b=e.name:u("Encoding is not a Name nor a Dict");"MacRomanEncoding"!==b&&("MacExpertEncoding"!==b&&"WinAnsiEncoding"!==b)&&(b=null)}b?d.defaultEncoding=ta[b].slice():(e="TrueType"===d.type?ta.WinAnsiEncoding:ta.StandardEncoding,d.flags&Qa.Symbolic&&(e=!d.file&&/Symbol/i.test(d.name)?ta.SymbolSetEncoding:
+        ta.MacRomanEncoding),d.defaultEncoding=e);d.differences=c;d.baseEncodingName=b;d.dict=a},readToUnicode:function(a){if(D(a))return Tb.create(a).map;if(V(a)){var b=Tb.create(a).map;b.forEach(function(a,d){for(var e=[],f=0;f<a.length;f+=2){var g=a.charCodeAt(f)<<8|a.charCodeAt(f+1);if(55296!==(g&63488))e.push(g);else{var f=f+2,h=a.charCodeAt(f)<<8|a.charCodeAt(f+1);e.push(((g&1023)<<10)+(h&1023)+65536)}}b[d]=String.fromCharCode.apply(String,e)});return b}return null},readCidToGidMap:function(a){a=a.getBytes();
+        for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c++]<<8|a[c];0!==e&&(b[c>>1]=e)}return b},extractWidths:function(a,b,c,d){var e=[],f=0,g=[],h,j,l,k,m,n,p;if(d.composite){f=a.get("DW")||1E3;if(p=a.get("W")){j=0;for(l=p.length;j<l;j++)if(c=p[j++],n=b.fetchIfRef(p[j]),I(n)){k=0;for(m=n.length;k<m;k++)e[c++]=n[k]}else{m=p[++j];for(k=c;k<=n;k++)e[k]=m}}if(d.vertical&&(p=a.get("DW2")||[880,-1E3],h=[p[1],0.5*f,p[0]],p=a.get("W2"))){j=0;for(l=p.length;j<l;j++)if(c=p[j++],n=b.fetchIfRef(p[j]),I(n)){k=0;for(m=
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                n.length;k<m;k++)g[c++]=[n[k++],n[k++],n[k]]}else{a=[p[++j],p[++j],p[++j]];for(k=c;k<=n;k++)g[k]=a}}}else if(b=d.firstChar,p=a.get("Widths")){k=b;j=0;for(l=p.length;j<l;j++)e[k++]=p[j];f=parseFloat(c.get("MissingWidth"))||0}else a=a.get("BaseFont"),D(a)&&(f=this.getBaseFontMetrics(a.name),e=this.buildCharCodeToWidth(f.widths,d),f=f.defaultWidth);a=!0;b=f;for(var q in e)if(j=e[q])if(b){if(b!=j){a=!1;break}}else b=j;a&&(d.flags|=Qa.FixedPitch);d.defaultWidth=f;d.widths=e;d.defaultVMetrics=h;d.vmetrics=
+        g},isSerifFont:function(a){a=a.split("-")[0];return a in li||-1!==a.search(/serif/gi)},getBaseFontMetrics:function(a){var b=0,c=[],d=!1,e=Xd[a]||a;e in $f||(e=this.isSerifFont(a)?"Times-Roman":"Helvetica");a=$f[e];lb(a)?(b=a,d=!0):c=a;return{defaultWidth:b,monospace:d,widths:c}},buildCharCodeToWidth:function(a,b){for(var c=Object.create(null),d=b.differences,e=b.defaultEncoding,f=0;256>f;f++)f in d&&a[d[f]]?c[f]=a[d[f]]:f in e&&a[e[f]]&&(c[f]=a[e[f]]);return c},preEvaluateFont:function(a,b){var c=
+        a,d=a.get("Subtype");$(D(d),"invalid font Subtype");var e=!1,f;"Type0"==d.name&&((e=a.get("DescendantFonts"))||u("Descendant fonts are not specified"),a=I(e)?b.fetchIfRef(e[0]):e,d=a.get("Subtype"),$(D(d),"invalid font Subtype"),e=!0);if(d=a.get("FontDescriptor")){var g=new ag;f=c.getRaw("Encoding");D(f)?g.update(f.name):sa(f)&&g.update(f.num+"_"+f.gen);f=a.get("ToUnicode")||c.get("ToUnicode");V(f)?(f=f.str||f,f=f.buffer?new Uint8Array(f.buffer.buffer,0,f.bufferLength):new Uint8Array(f.bytes.buffer,
+        f.start,f.end-f.start),g.update(f)):D(f)&&g.update(f.name);if(f=a.get("Widths")||c.get("Widths"))f=new Uint8Array((new Uint32Array(f)).buffer),g.update(f)}return{descriptor:d,dict:a,baseDict:c,composite:e,hash:g?g.hexdigest():""}},translateFont:function(a,b){var c=a.baseDict,d=a.dict,e=a.composite,f=a.descriptor,g=d.get("Subtype"),h=e?65535:255;if(!f)if("Type3"==g.name)f=new ya(null),f.set("FontName",pa.get(g.name));else{c=d.get("BaseFont");D(c)||u("Base font is not specified");var c=c.name.replace(/[,_]/g,
+        "-"),f=this.getBaseFontMetrics(c),j=c.split("-")[0],j=(this.isSerifFont(j)?Qa.Serif:0)|(f.monospace?Qa.FixedPitch:0)|(mi[j]?Qa.Symbolic:Qa.Nonsymbolic),h={type:g.name,name:c,widths:f.widths,defaultWidth:f.defaultWidth,flags:j,firstChar:0,lastChar:h};this.extractDataStructures(d,d,b,h);h.widths=this.buildCharCodeToWidth(f.widths,h);return new Uc(c,null,h)}var l=d.get("FirstChar")||0,k=d.get("LastChar")||h,j=f.get("FontName"),m=d.get("BaseFont");oa(j)&&(j=pa.get(j));oa(m)&&(m=pa.get(m));if("Type3"!==
+        g.name){var n=j&&j.name,p=m&&m.name;n!==p&&(R("The FontDescriptor's FontName is \""+n+'" but should be the same as the Font\'s BaseFont "'+p+'"'),n&&(p&&0===p.search(n))&&(j=m))}j=j||m;$(D(j),"invalid font name");if((m=f.get("FontFile","FontFile2","FontFile3"))&&m.dict){var q=m.dict.get("Subtype");q&&(q=q.name);var s=m.dict.get("Length1"),v=m.dict.get("Length2")}h={type:g.name,name:j.name,subtype:q,file:m,length1:s,length2:v,loadedName:c.loadedName,composite:e,wideChars:e,fixedPitch:!1,fontMatrix:d.get("FontMatrix")||
+    Db,firstChar:l||0,lastChar:k||h,bbox:f.get("FontBBox"),ascent:f.get("Ascent"),descent:f.get("Descent"),xHeight:f.get("XHeight"),capHeight:f.get("CapHeight"),flags:f.get("Flags"),italicAngle:f.get("ItalicAngle"),coded:!1};e&&(e=c.get("Encoding"),D(e)&&(h.cidEncoding=e.name),h.cMap=Tb.create(e,{url:PDFJS.cMapUrl,packed:PDFJS.cMapPacked},null),h.vertical=h.cMap.vertical);this.extractDataStructures(d,c,b,h);this.extractWidths(d,b,f,h);"Type3"===g.name&&(h.coded=!0);return new Uc(j.name,m,h)}};Od=Wf;var Eb,
+        bg=function(a,b,c){this.messageHandler=b;this.fnArray=[];this.argsArray=[];this.dependencies={};this.pageIndex=c;this.intent=a};bg.prototype={get length(){return this.argsArray.length},addOp:function(a,b){this.fnArray.push(a);this.argsArray.push(b);this.messageHandler&&(1E3<=this.fnArray.length?this.flush():995<=this.fnArray.length&&(a===r.restore||a===r.endText)&&this.flush())},addDependency:function(a){a in this.dependencies||(this.dependencies[a]=!0,this.addOp(r.dependency,[a]))},addDependencies:function(a){for(var b in a)this.addDependency(b)},
+        addOpList:function(a){w.extendObj(this.dependencies,a.dependencies);for(var b=0,c=a.length;b<c;b++)this.addOp(a.fnArray[b],a.argsArray[b])},getIR:function(){return{fnArray:this.fnArray,argsArray:this.argsArray,length:this.length}},flush:function(a){(new cg).optimize(this);for(var b=[],c=this.fnArray,d=this.argsArray,e=0,f=this.length;e<f;e++)switch(c[e]){case r.paintInlineImageXObject:case r.paintInlineImageXObjectGroup:case r.paintImageMaskXObject:var g=d[e][0];g.cached||b.push(g.data.buffer)}this.messageHandler.send("RenderPageChunk",
+            {operatorList:{fnArray:this.fnArray,argsArray:this.argsArray,lastChunk:a,length:this.length},pageIndex:this.pageIndex,intent:this.intent},null,b);this.dependencies={};this.fnArray.length=0;this.argsArray.length=0}};Eb=bg;var Vd,dg=function(a){this.state=a;this.stateStack=[]};dg.prototype={save:function(){var a=this.state;this.stateStack.push(this.state);this.state=a.clone()},restore:function(){var a=this.stateStack.pop();a&&(this.state=a)},transform:function(a){this.state.ctm=w.transform(this.state.ctm,
+        a)}};Vd=dg;var Zf,eg=function(){this.ctm=new Float32Array(tb);this.fontSize=0;this.font=null;this.fontMatrix=Db;this.textMatrix=tb.slice();this.textLineMatrix=tb.slice();this.leading=this.wordSpacing=this.charSpacing=0;this.textHScale=1;this.textRise=0};eg.prototype={setTextMatrix:function(a,b,c,d,e,f){var g=this.textMatrix;g[0]=a;g[1]=b;g[2]=c;g[3]=d;g[4]=e;g[5]=f},setTextLineMatrix:function(a,b,c,d,e,f){var g=this.textLineMatrix;g[0]=a;g[1]=b;g[2]=c;g[3]=d;g[4]=e;g[5]=f},translateTextMatrix:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   b){var c=this.textMatrix;c[4]=c[0]*a+c[2]*b+c[4];c[5]=c[1]*a+c[3]*b+c[5]},translateTextLineMatrix:function(a,b){var c=this.textLineMatrix;c[4]=c[0]*a+c[2]*b+c[4];c[5]=c[1]*a+c[3]*b+c[5]},calcRenderMatrix:function(a){return w.transform(a,w.transform(this.textMatrix,[this.fontSize*this.textHScale,0,0,this.fontSize,0,this.textRise]))},carriageReturn:function(){this.translateTextLineMatrix(0,-this.leading);this.textMatrix=this.textLineMatrix.slice()},clone:function(){var a=Object.create(this);a.textMatrix=
+        this.textMatrix.slice();a.textLineMatrix=this.textLineMatrix.slice();a.fontMatrix=this.fontMatrix.slice();return a}};Zf=eg;var Xf,fg=function(){this.ctm=new Float32Array(tb);this.font=null;this.textRenderingMode=0};fg.prototype={clone:function(){return Object.create(this)}};Xf=fg;var Wd,hg=function(a,b,c){this.parser=new vb(new ca(a,gg),!1,b);this.stateManager=c},gg={w:{id:r.setLineWidth,numArgs:1,variableArgs:!1},J:{id:r.setLineCap,numArgs:1,variableArgs:!1},j:{id:r.setLineJoin,numArgs:1,variableArgs:!1},
+        M:{id:r.setMiterLimit,numArgs:1,variableArgs:!1},d:{id:r.setDash,numArgs:2,variableArgs:!1},ri:{id:r.setRenderingIntent,numArgs:1,variableArgs:!1},i:{id:r.setFlatness,numArgs:1,variableArgs:!1},gs:{id:r.setGState,numArgs:1,variableArgs:!1},q:{id:r.save,numArgs:0,variableArgs:!1},Q:{id:r.restore,numArgs:0,variableArgs:!1},cm:{id:r.transform,numArgs:6,variableArgs:!1},m:{id:r.moveTo,numArgs:2,variableArgs:!1},l:{id:r.lineTo,numArgs:2,variableArgs:!1},c:{id:r.curveTo,numArgs:6,variableArgs:!1},v:{id:r.curveTo2,
+            numArgs:4,variableArgs:!1},y:{id:r.curveTo3,numArgs:4,variableArgs:!1},h:{id:r.closePath,numArgs:0,variableArgs:!1},re:{id:r.rectangle,numArgs:4,variableArgs:!1},S:{id:r.stroke,numArgs:0,variableArgs:!1},s:{id:r.closeStroke,numArgs:0,variableArgs:!1},f:{id:r.fill,numArgs:0,variableArgs:!1},F:{id:r.fill,numArgs:0,variableArgs:!1},"f*":{id:r.eoFill,numArgs:0,variableArgs:!1},B:{id:r.fillStroke,numArgs:0,variableArgs:!1},"B*":{id:r.eoFillStroke,numArgs:0,variableArgs:!1},b:{id:r.closeFillStroke,numArgs:0,
+            variableArgs:!1},"b*":{id:r.closeEOFillStroke,numArgs:0,variableArgs:!1},n:{id:r.endPath,numArgs:0,variableArgs:!1},W:{id:r.clip,numArgs:0,variableArgs:!1},"W*":{id:r.eoClip,numArgs:0,variableArgs:!1},BT:{id:r.beginText,numArgs:0,variableArgs:!1},ET:{id:r.endText,numArgs:0,variableArgs:!1},Tc:{id:r.setCharSpacing,numArgs:1,variableArgs:!1},Tw:{id:r.setWordSpacing,numArgs:1,variableArgs:!1},Tz:{id:r.setHScale,numArgs:1,variableArgs:!1},TL:{id:r.setLeading,numArgs:1,variableArgs:!1},Tf:{id:r.setFont,
+            numArgs:2,variableArgs:!1},Tr:{id:r.setTextRenderingMode,numArgs:1,variableArgs:!1},Ts:{id:r.setTextRise,numArgs:1,variableArgs:!1},Td:{id:r.moveText,numArgs:2,variableArgs:!1},TD:{id:r.setLeadingMoveText,numArgs:2,variableArgs:!1},Tm:{id:r.setTextMatrix,numArgs:6,variableArgs:!1},"T*":{id:r.nextLine,numArgs:0,variableArgs:!1},Tj:{id:r.showText,numArgs:1,variableArgs:!1},TJ:{id:r.showSpacedText,numArgs:1,variableArgs:!1},"'":{id:r.nextLineShowText,numArgs:1,variableArgs:!1},'"':{id:r.nextLineSetSpacingShowText,
+            numArgs:3,variableArgs:!1},d0:{id:r.setCharWidth,numArgs:2,variableArgs:!1},d1:{id:r.setCharWidthAndBounds,numArgs:6,variableArgs:!1},CS:{id:r.setStrokeColorSpace,numArgs:1,variableArgs:!1},cs:{id:r.setFillColorSpace,numArgs:1,variableArgs:!1},SC:{id:r.setStrokeColor,numArgs:4,variableArgs:!0},SCN:{id:r.setStrokeColorN,numArgs:33,variableArgs:!0},sc:{id:r.setFillColor,numArgs:4,variableArgs:!0},scn:{id:r.setFillColorN,numArgs:33,variableArgs:!0},G:{id:r.setStrokeGray,numArgs:1,variableArgs:!1},g:{id:r.setFillGray,
+            numArgs:1,variableArgs:!1},RG:{id:r.setStrokeRGBColor,numArgs:3,variableArgs:!1},rg:{id:r.setFillRGBColor,numArgs:3,variableArgs:!1},K:{id:r.setStrokeCMYKColor,numArgs:4,variableArgs:!1},k:{id:r.setFillCMYKColor,numArgs:4,variableArgs:!1},sh:{id:r.shadingFill,numArgs:1,variableArgs:!1},BI:{id:r.beginInlineImage,numArgs:0,variableArgs:!1},ID:{id:r.beginImageData,numArgs:0,variableArgs:!1},EI:{id:r.endInlineImage,numArgs:1,variableArgs:!1},Do:{id:r.paintXObject,numArgs:1,variableArgs:!1},MP:{id:r.markPoint,
+            numArgs:1,variableArgs:!1},DP:{id:r.markPointProps,numArgs:2,variableArgs:!1},BMC:{id:r.beginMarkedContent,numArgs:1,variableArgs:!1},BDC:{id:r.beginMarkedContentProps,numArgs:2,variableArgs:!1},EMC:{id:r.endMarkedContent,numArgs:0,variableArgs:!1},BX:{id:r.beginCompat,numArgs:0,variableArgs:!1},EX:{id:r.endCompat,numArgs:0,variableArgs:!1},BM:null,BD:null,"true":null,fa:null,fal:null,fals:null,"false":null,nu:null,nul:null,"null":null};hg.prototype={get savedStatesDepth(){return this.stateManager.stateStack.length},
+        read:function(){for(var a=[];;){var b=this.parser.getObj();if(b==M)return null;if(Y(b)){var c=b.cmd;if(b=gg[c]){c=b.id;if(b.variableArgs)a.length>b.numArgs&&R("Command "+c+": expected [0,"+b.numArgs+"] args, but received "+a.length+" args");else if(a.length<b.numArgs){R("Command "+c+": because expected "+b.numArgs+" args, but received "+a.length+" args; skipping");a=[];continue}else a.length>b.numArgs&&R("Command "+c+": expected "+b.numArgs+" args, but received "+a.length+" args");this.preprocessCommand(c,
+            a);return{fn:c,args:a}}L('Unknown command "'+c+'"')}else null!==b&&void 0!==b&&(a.push(b instanceof ya?b.getAll():b),$(33>=a.length,"Too many arguments"))}},preprocessCommand:function(a,b){switch(a|0){case r.save:this.stateManager.save();break;case r.restore:this.stateManager.restore();break;case r.transform:this.stateManager.transform(b)}}};Wd=hg;var cg,Wc=function(a,b,c){for(var d=0,e=b.length-1;d<e;d++){var f=b[d];a=a[f]||(a[f]=[])}a[b[b.length-1]]=c},ig=function(){},bc=[];Wc(bc,[r.save,r.transform,
+        r.paintInlineImageXObject,r.restore],function(a){for(var b=a.fnArray,c=a.argsArray,d=a.currentOperation-3,e=d+4,f=b.length;e<f&&b[e-4]===b[e];e++);f=Math.min(e-d>>2,200);if(10>f)a.currentOperation=e-1;else{var g=0,e=[],h=0,j=1,l=1,k;for(k=0;k<f;k++){var m=c[d+(k<<2)+1],n=c[d+(k<<2)+2][0];1E3<j+n.width&&(g=Math.max(g,j),l+=h+2,h=j=0);e.push({transform:m,x:j,y:l,w:n.width,h:n.height});j+=n.width+2;h=Math.max(h,n.height)}g=Math.max(g,j)+1;h=l+h+1;l=new Uint8Array(4*g*h);j=g<<2;for(k=0;k<f;k++){var m=
+        c[d+(k<<2)+2][0].data,n=e[k].w<<2,p=0,q=e[k].x+e[k].y*g<<2;l.set(m.subarray(0,n),q-j);for(var s=0,v=e[k].h;s<v;s++)l.set(m.subarray(p,p+n),q),p+=n,q+=j;for(l.set(m.subarray(p-n,p),q);0<=q;)m[q-4]=m[q],m[q-3]=m[q+1],m[q-2]=m[q+2],m[q-1]=m[q+3],m[q+n]=m[q+n-4],m[q+n+1]=m[q+n-3],m[q+n+2]=m[q+n-2],m[q+n+3]=m[q+n-1],q-=j}b.splice(d,4*f,r.paintInlineImageXObjectGroup);c.splice(d,4*f,[{width:g,height:h,kind:3,data:l},e]);a.currentOperation=d}});Wc(bc,[r.save,r.transform,r.paintImageMaskXObject,r.restore],
+        function(a){for(var b=a.fnArray,c=a.argsArray,d=a.currentOperation-3,e=d+4,f=b.length;e<f&&b[e-4]===b[e];e++);var g,f=e-d>>2;for(g=0;g<f;g++){var h=c[d+4*g+2];if((h=1==h.length&&h[0])&&1==h.width&&1==h.height&&(!h.data.length||1==h.data.length&&0===h.data[0]))b[d+4*g+2]=r.paintSolidColorImageMask;else break}g=f-g;if(10>g)a.currentOperation=e-1;else{var j=!1;if(0===c[d+1][1]&&0===c[d+1][2]){e=d+4;j=!0;for(f=1;f<g;f++,e+=4){var l=c[e-3],h=c[e+1];if(c[e-2][0]!==c[e+2][0]||l[0]!==h[0]||l[1]!==h[1]||l[2]!==
+            h[2]||l[3]!==h[3]){10>f?j=!1:g=f;break}}}if(j){g=Math.min(g,1E3);j=new Float32Array(2*g);e=d+1;for(f=0;f<g;f++)h=c[e],j[f<<1]=h[4],j[(f<<1)+1]=h[5],e+=4;b.splice(d,4*g,r.paintImageMaskXObjectRepeat);c.splice(d,4*g,[c[d+2][0],c[d+1][0],c[d+1][3],j])}else{g=Math.min(g,100);e=[];for(f=0;f<g;f++)h=c[d+(f<<2)+1],j=c[d+(f<<2)+2][0],e.push({data:j.data,width:j.width,height:j.height,transform:h});b.splice(d,4*g,r.paintImageMaskXObjectGroup);c.splice(d,4*g,[e])}a.currentOperation=d}});Wc(bc,[r.save,r.transform,
+        r.paintImageXObject,r.restore],function(a){var b=a.fnArray,c=a.argsArray,d=a.currentOperation-3,e=d+4;if(!(0!==c[d+1][1]||0!==c[d+1][2])){for(var f=b.length,g;e+3<f&&b[e-4]===b[e]&&!(b[e-3]!==b[e+1]||b[e-2]!==b[e+2]||b[e-1]!==b[e+3])&&c[e-2][0]===c[e+2][0];e+=4){var h=c[e-3];g=c[e+1];if(h[0]!==g[0]||h[1]!==g[1]||h[2]!==g[2]||h[3]!==g[3])break}f=Math.min(e-d>>2,1E3);if(3>f)a.currentOperation=e-1;else{for(var h=new Float32Array(2*f),e=d+1,j=0;j<f;j++)g=c[e],h[j<<1]=g[4],h[(j<<1)+1]=g[5],e+=4;e=[c[d+
+    2][0],c[d+1][0],c[d+1][3],h];b.splice(d,4*f,r.paintImageXObjectRepeat);c.splice(d,4*f,e);a.currentOperation=d}}});Wc(bc,[r.beginText,r.setFont,r.setTextMatrix,r.showText,r.endText],function(a){for(var b=a.fnArray,c=a.argsArray,d=a.currentOperation-4,e=d+5,f=b.length;e<f&&b[e-5]===b[e]&&!(b[e]===r.setFont&&(c[e-5][0]!==c[e][0]||c[e-5][1]!==c[e][1]));e++);f=Math.min((e-d)/5|0,1E3);if(3>f)a.currentOperation=e-1;else{4<=d&&(b[d-4]===b[d+1]&&b[d-3]===b[d+2]&&b[d-2]===b[d+3]&&b[d-1]===b[d+4]&&c[d-4][0]===
+    c[d+1][0]&&c[d-4][1]===c[d+1][1])&&(f++,d-=5);for(var g=d+7,e=d+4,d=1;d<f;d++)b[e]=b[g],c[e]=c[g],b[e+1]=b[g+1],c[e+1]=c[g+1],e+=2,g+=5;d=3*(f-1);b.splice(e,d);c.splice(e,d);a.currentOperation=e}});ig.prototype={optimize:function(a){var b=a.fnArray,c=a.argsArray;a={currentOperation:0,fnArray:b,argsArray:c};for(var d=c.length,e,c=0;c<d;c++)e=(e||bc)[b[c]],"function"===typeof e&&(a.currentOperation=c,e=e(a),c=a.currentOperation,d=a.fnArray.length)}};cg=ig;var ni="Adobe-GB1-UCS2 Adobe-CNS1-UCS2 Adobe-Japan1-UCS2 Adobe-Korea1-UCS2 78-EUC-H 78-EUC-V 78-H 78-RKSJ-H 78-RKSJ-V 78-V 78ms-RKSJ-H 78ms-RKSJ-V 83pv-RKSJ-H 90ms-RKSJ-H 90ms-RKSJ-V 90msp-RKSJ-H 90msp-RKSJ-V 90pv-RKSJ-H 90pv-RKSJ-V Add-H Add-RKSJ-H Add-RKSJ-V Add-V Adobe-CNS1-0 Adobe-CNS1-1 Adobe-CNS1-2 Adobe-CNS1-3 Adobe-CNS1-4 Adobe-CNS1-5 Adobe-CNS1-6 Adobe-GB1-0 Adobe-GB1-1 Adobe-GB1-2 Adobe-GB1-3 Adobe-GB1-4 Adobe-GB1-5 Adobe-Japan1-0 Adobe-Japan1-1 Adobe-Japan1-2 Adobe-Japan1-3 Adobe-Japan1-4 Adobe-Japan1-5 Adobe-Japan1-6 Adobe-Korea1-0 Adobe-Korea1-1 Adobe-Korea1-2 B5-H B5-V B5pc-H B5pc-V CNS-EUC-H CNS-EUC-V CNS1-H CNS1-V CNS2-H CNS2-V ETHK-B5-H ETHK-B5-V ETen-B5-H ETen-B5-V ETenms-B5-H ETenms-B5-V EUC-H EUC-V Ext-H Ext-RKSJ-H Ext-RKSJ-V Ext-V GB-EUC-H GB-EUC-V GB-H GB-V GBK-EUC-H GBK-EUC-V GBK2K-H GBK2K-V GBKp-EUC-H GBKp-EUC-V GBT-EUC-H GBT-EUC-V GBT-H GBT-V GBTpc-EUC-H GBTpc-EUC-V GBpc-EUC-H GBpc-EUC-V H HKdla-B5-H HKdla-B5-V HKdlb-B5-H HKdlb-B5-V HKgccs-B5-H HKgccs-B5-V HKm314-B5-H HKm314-B5-V HKm471-B5-H HKm471-B5-V HKscs-B5-H HKscs-B5-V Hankaku Hiragana KSC-EUC-H KSC-EUC-V KSC-H KSC-Johab-H KSC-Johab-V KSC-V KSCms-UHC-H KSCms-UHC-HW-H KSCms-UHC-HW-V KSCms-UHC-V KSCpc-EUC-H KSCpc-EUC-V Katakana NWP-H NWP-V RKSJ-H RKSJ-V Roman UniCNS-UCS2-H UniCNS-UCS2-V UniCNS-UTF16-H UniCNS-UTF16-V UniCNS-UTF32-H UniCNS-UTF32-V UniCNS-UTF8-H UniCNS-UTF8-V UniGB-UCS2-H UniGB-UCS2-V UniGB-UTF16-H UniGB-UTF16-V UniGB-UTF32-H UniGB-UTF32-V UniGB-UTF8-H UniGB-UTF8-V UniJIS-UCS2-H UniJIS-UCS2-HW-H UniJIS-UCS2-HW-V UniJIS-UCS2-V UniJIS-UTF16-H UniJIS-UTF16-V UniJIS-UTF32-H UniJIS-UTF32-V UniJIS-UTF8-H UniJIS-UTF8-V UniJIS2004-UTF16-H UniJIS2004-UTF16-V UniJIS2004-UTF32-H UniJIS2004-UTF32-V UniJIS2004-UTF8-H UniJIS2004-UTF8-V UniJISPro-UCS2-HW-V UniJISPro-UCS2-V UniJISPro-UTF8-V UniJISX0213-UTF32-H UniJISX0213-UTF32-V UniJISX02132004-UTF32-H UniJISX02132004-UTF32-V UniKS-UCS2-H UniKS-UCS2-V UniKS-UTF16-H UniKS-UTF16-V UniKS-UTF32-H UniKS-UTF32-V UniKS-UTF8-H UniKS-UTF8-V V WP-Symbol".split(" "),
+        ob=function(a){this.codespaceRanges=[[],[],[],[]];this.numCodespaceRanges=0;this.map=[];this.vertical=!1;this.useCMap=null;this.builtInCMap=a};ob.prototype={addCodespaceRange:function(a,b,c){this.codespaceRanges[a-1].push(b,c);this.numCodespaceRanges++},mapRange:function(a,b,c){for(var d=c.length-1;a<=b;)this.map[a]=c,c=c.substr(0,d)+String.fromCharCode(c.charCodeAt(d)+1),++a},mapRangeToArray:function(a,b,c){for(var d=0;a<=b;)this.map[a]=c[d++],++a},mapOne:function(a,b){this.map[a]=b},lookup:function(a){return this.map[a]},
+        readCharCode:function(a,b){for(var c=0,d=this.codespaceRanges,e=this.codespaceRanges.length,f=0;f<e;f++)for(var c=(c<<8|a.charCodeAt(b+f))>>>0,g=d[f],h=0,j=g.length;h<j;){var l=g[h++],k=g[h++];if(c>=l&&c<=k)return[c,f+1]}return[0,1]}};var Xc=function(a,b){ob.call(this);this.vertical=a;this.addCodespaceRange(b,0,65535);this.mapRange(0,65535,"\x00")};w.inherit(Xc,ob,{});var y=function(a,b){for(var c=0,d=0;d<=b;d++)c=c<<8|a[d];return c>>>0},Yc=function(a,b){return String.fromCharCode.apply(null,a.subarray(0,
+        b+1))},ra=function(a,b,c){for(var d=0;0<=c;c--)d+=a[c]+b[c],a[c]=d&255,d>>=8},xb=function(a,b){for(var c=1,d=b;0<=d&&0<c;d--)c+=a[d],a[d]=c&255,c>>=8},jg=function(a){this.buffer=a;this.pos=0;this.end=a.length;this.tmpBuf=new Uint8Array(oi)},kg=function(){},oi=19;jg.prototype={readByte:function(){return this.pos>=this.end?-1:this.buffer[this.pos++]},readNumber:function(){var a=0,b;do{var c=this.readByte();0>c&&u("unexpected EOF in bcmap");b=!(c&128);a=a<<7|c&127}while(!b);return a},readSigned:function(){var a=
+        this.readNumber();return a&1?~(a>>>1):a>>>1},readHex:function(a,b){a.set(this.buffer.subarray(this.pos,this.pos+b+1));this.pos+=b+1},readHexNumber:function(a,b){var c,d=this.tmpBuf,e=0;do{var f=this.readByte();0>f&&u("unexpected EOF in bcmap");c=!(f&128);d[e++]=f&127}while(!c);c=b;for(var g=f=0;0<=c;){for(;8>g&&0<d.length;)f|=d[--e]<<g,g+=7;a[c]=f&255;c--;f>>=8;g-=8}},readHexSigned:function(a,b){this.readHexNumber(a,b);for(var c=a[b]&1?255:0,d=0,e=0;e<=b;e++)d=(d&1)<<8|a[e],a[e]=d>>1^c},readString:function(){for(var a=
+        this.readNumber(),b="",c=0;c<a;c++)b+=String.fromCharCode(this.readNumber());return b}};kg.prototype={read:function(a,b,c){var d=PDFJS.disableWorker,e=new XMLHttpRequest;e.open("GET",a,!1);if(!d)try{e.responseType="arraybuffer",d="arraybuffer"!==e.responseType}catch(f){d=!0}d&&e.overrideMimeType&&e.overrideMimeType("text/plain; charset=x-user-defined");e.send(null);0===e.status&&/^https?:/i.test(a)&&u("Unable to get binary cMap at: "+a);d?(a=Array.prototype.map.call(e.responseText,function(a){return a.charCodeAt(0)&
+        255}),a=new Uint8Array(a)):a=new Uint8Array(e.response);a=new jg(a);d=a.readByte();b.vertical=!!(d&1);for(var d=null,e=new Uint8Array(16),g=new Uint8Array(16),h=new Uint8Array(16),j=new Uint8Array(16),l=new Uint8Array(16),k,m;0<=(m=a.readByte());)if(k=m>>5,7===k)switch(m&31){case 0:a.readString();break;case 1:d=a.readString()}else{var n=!!(m&16);m&=15;$(16>=m+1);var p=a.readNumber(),q;switch(k){case 0:a.readHex(e,m);a.readHexNumber(g,m);ra(g,e,m);b.addCodespaceRange(m+1,y(e,m),y(g,m));for(q=1;q<p;q++)xb(g,
+        m),a.readHexNumber(e,m),ra(e,g,m),a.readHexNumber(g,m),ra(g,e,m),b.addCodespaceRange(m+1,y(e,m),y(g,m));break;case 1:a.readHex(e,m);a.readHexNumber(g,m);ra(g,e,m);a.readNumber();for(q=1;q<p;q++)xb(g,m),a.readHexNumber(e,m),ra(e,g,m),a.readHexNumber(g,m),ra(g,e,m),a.readNumber();break;case 2:a.readHex(h,m);k=a.readNumber();b.mapOne(y(h,m),String.fromCharCode(k));for(q=1;q<p;q++)xb(h,m),n||(a.readHexNumber(l,m),ra(h,l,m)),k=a.readSigned()+(k+1),b.mapOne(y(h,m),String.fromCharCode(k));break;case 3:a.readHex(e,
+        m);a.readHexNumber(g,m);ra(g,e,m);k=a.readNumber();b.mapRange(y(e,m),y(g,m),String.fromCharCode(k));for(q=1;q<p;q++)xb(g,m),n?e.set(g):(a.readHexNumber(e,m),ra(e,g,m)),a.readHexNumber(g,m),ra(g,e,m),k=a.readNumber(),b.mapRange(y(e,m),y(g,m),String.fromCharCode(k));break;case 4:a.readHex(h,1);a.readHex(j,m);b.mapOne(y(h,1),Yc(j,m));for(q=1;q<p;q++)xb(h,1),n||(a.readHexNumber(l,1),ra(h,l,1)),xb(j,m),a.readHexSigned(l,m),ra(j,l,m),b.mapOne(y(h,1),Yc(j,m));break;case 5:a.readHex(e,1);a.readHexNumber(g,
+        1);ra(g,e,1);a.readHex(j,m);b.mapRange(y(e,1),y(g,1),Yc(j,m));for(q=1;q<p;q++)xb(g,1),n?e.set(g):(a.readHexNumber(e,1),ra(e,g,1)),a.readHexNumber(g,1),ra(g,e,1),a.readHex(j,m),b.mapRange(y(e,1),y(g,1),Yc(j,m));break;default:u("Unknown type: "+k)}}d&&c(d);return b}};var Tb,hb=function(a){for(var b=0,c=0;c<a.length;c++)b=b<<8|a.charCodeAt(c);return b>>>0},yb=function(a){oa(a)||u("Malformed CMap: expected string.")},lg=function(a){S(a)||u("Malformed CMap: expected int.")},ng=function(a,b,c,d){var e,
+        f;a:for(;;){var g=b.getObj();if(g==M)break;else if(D(g)){if("WMode"===g.name){e=a;var h=b.getObj();S(h)&&(e.vertical=!!h)}e=g}else if(Y(g))switch(g.cmd){case "endcmap":break a;case "usecmap":D(e)&&(f=e.name);break;case "begincodespacerange":b:{g=a;for(h=b;;){var j=h.getObj();if(j==M)break;if(Y(j,"endcodespacerange"))break b;if(!oa(j))break;var l=hb(j),j=h.getObj();if(!oa(j))break;var k=hb(j);g.addCodespaceRange(j.length,l,k)}u("Invalid codespace range.")}break;case "beginbfchar":g=a;for(h=b;;){j=
+        h.getObj();if(j==M)break;if(Y(j,"endbfchar"))break;yb(j);l=hb(j);j=h.getObj();yb(j);g.mapOne(l,j)}break;case "begincidchar":g=a;for(h=b;;){l=h.getObj();if(l==M)break;if(Y(l,"endcidchar"))break;yb(l);j=hb(l);l=h.getObj();lg(l);l=String.fromCharCode(l);g.mapOne(j,l)}break;case "beginbfrange":b:{g=a;for(h=b;;){k=h.getObj();if(k==M)break;if(Y(k,"endbfrange"))break b;yb(k);j=hb(k);k=h.getObj();yb(k);l=hb(k);k=h.getObj();if(S(k)||oa(k))k=S(k)?String.fromCharCode(k):k,g.mapRange(j,l,k);else if(Y(k,"[")){for(var k=
+        h.getObj(),m=[];!Y(k,"]")&&k!=M;)m.push(k),k=h.getObj();g.mapRangeToArray(j,l,m)}else break}u("Invalid bf range.")}break;case "begincidrange":g=a;for(h=b;;){k=h.getObj();if(k==M)break;if(Y(k,"endcidrange"))break;yb(k);j=hb(k);k=h.getObj();yb(k);l=hb(k);k=h.getObj();lg(k);k=String.fromCharCode(k);g.mapRange(j,l,k)}}}!d&&f&&(d=f);d&&mg(a,c,d)},mg=function(a,b,c){a.useCMap=og(c,b);if(0===a.numCodespaceRanges){b=a.useCMap.codespaceRanges;for(c=0;c<b.length;c++)a.codespaceRanges[c]=b[c].slice();a.numCodespaceRanges=
+        a.useCMap.numCodespaceRanges}for(var d in a.useCMap.map)d in a.map||(a.map[d]=a.useCMap.map[d])},og=function(a,b){if("Identity-H"===a)return new Xc(!1,2);if("Identity-V"===a)return new Xc(!0,2);-1===ni.indexOf(a)&&u("Unknown cMap name: "+a);$(b,"buildin cmap parameters are not provided");if(b.packed){var c=b.url+a+".bcmap",d=new ob(!0);(new kg).read(c,d,function(a){mg(d,b,a)});return d}var c=new XMLHttpRequest,e=b.url+a;c.open("GET",e,!1);c.send(null);0===c.status&&/^https?:/i.test(e)&&u("Unable to get cMap at: "+
+        e);e=new ob(!0);c=new ca(new pg(c.responseText));ng(e,c,b,null);return e};Tb={create:function(a,b,c){if(D(a))return og(a.name,b);if(V(a)){var d=new ob;a=new ca(a);try{ng(d,a,b,c)}catch(e){L("Invalid CMap data. "+e)}return d}u("Encoding required.")}};var qg=!1,Zc=!1,Qa={FixedPitch:1,Serif:2,Symbolic:4,Script:8,Nonsymbolic:32,Italic:64,AllCap:65536,SmallCap:131072,ForceBold:262144},ta={ExpertEncoding:"                                space exclamsmall Hungarumlautsmall  dollaroldstyle dollarsuperior ampersandsmall Acutesmall parenleftsuperior parenrightsuperior twodotenleader onedotenleader comma hyphen period fraction zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyle colon semicolon commasuperior threequartersemdash periodsuperior questionsmall  asuperior bsuperior centsuperior dsuperior esuperior   isuperior   lsuperior msuperior nsuperior osuperior   rsuperior ssuperior tsuperior  ff fi fl ffi ffl parenleftinferior  parenrightinferior Circumflexsmall hyphensuperior Gravesmall Asmall Bsmall Csmall Dsmall Esmall Fsmall Gsmall Hsmall Ismall Jsmall Ksmall Lsmall Msmall Nsmall Osmall Psmall Qsmall Rsmall Ssmall Tsmall Usmall Vsmall Wsmall Xsmall Ysmall Zsmall colonmonetary onefitted rupiah Tildesmall                                   exclamdownsmall centoldstyle Lslashsmall   Scaronsmall Zcaronsmall Dieresissmall Brevesmall Caronsmall  Dotaccentsmall   Macronsmall   figuredash hypheninferior   Ogoneksmall Ringsmall Cedillasmall    onequarter onehalf threequarters questiondownsmall oneeighth threeeighths fiveeighths seveneighths onethird twothirds   zerosuperior onesuperior twosuperior threesuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior centinferior dollarinferior periodinferior commainferior Agravesmall Aacutesmall Acircumflexsmall Atildesmall Adieresissmall Aringsmall AEsmall Ccedillasmall Egravesmall Eacutesmall Ecircumflexsmall Edieresissmall Igravesmall Iacutesmall Icircumflexsmall Idieresissmall Ethsmall Ntildesmall Ogravesmall Oacutesmall Ocircumflexsmall Otildesmall Odieresissmall OEsmall Oslashsmall Ugravesmall Uacutesmall Ucircumflexsmall Udieresissmall Yacutesmall Thornsmall Ydieresissmall".split(" "),
+            MacExpertEncoding:"                                space exclamsmall Hungarumlautsmall centoldstyle dollaroldstyle dollarsuperior ampersandsmall Acutesmall parenleftsuperior parenrightsuperior twodotenleader onedotenleader comma hyphen period fraction zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyle colon semicolon  threequartersemdash  questionsmall     Ethsmall   onequarter onehalf threequarters oneeighth threeeighths fiveeighths seveneighths onethird twothirds       ff fi fl ffi ffl parenleftinferior  parenrightinferior Circumflexsmall hypheninferior Gravesmall Asmall Bsmall Csmall Dsmall Esmall Fsmall Gsmall Hsmall Ismall Jsmall Ksmall Lsmall Msmall Nsmall Osmall Psmall Qsmall Rsmall Ssmall Tsmall Usmall Vsmall Wsmall Xsmall Ysmall Zsmall colonmonetary onefitted rupiah Tildesmall   asuperior centsuperior     Aacutesmall Agravesmall Acircumflexsmall Adieresissmall Atildesmall Aringsmall Ccedillasmall Eacutesmall Egravesmall Ecircumflexsmall Edieresissmall Iacutesmall Igravesmall Icircumflexsmall Idieresissmall Ntildesmall Oacutesmall Ogravesmall Ocircumflexsmall Odieresissmall Otildesmall Uacutesmall Ugravesmall Ucircumflexsmall Udieresissmall  eightsuperior fourinferior threeinferior sixinferior eightinferior seveninferior Scaronsmall  centinferior twoinferior  Dieresissmall  Caronsmall osuperior fiveinferior  commainferior periodinferior Yacutesmall  dollarinferior  Thornsmall  nineinferior zeroinferior Zcaronsmall AEsmall Oslashsmall questiondownsmall oneinferior Lslashsmall       Cedillasmall      OEsmall figuredash hyphensuperior     exclamdownsmall  Ydieresissmall  onesuperior twosuperior threesuperior foursuperior fivesuperior sixsuperior sevensuperior ninesuperior zerosuperior  esuperior rsuperior tsuperior   isuperior ssuperior dsuperior      lsuperior Ogoneksmall Brevesmall Macronsmall bsuperior nsuperior msuperior commasuperior periodsuperior Dotaccentsmall Ringsmall".split(" "),
+            MacRomanEncoding:"                                space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde  Adieresis Aring Ccedilla Eacute Ntilde Odieresis Udieresis aacute agrave acircumflex adieresis atilde aring ccedilla eacute egrave ecircumflex edieresis iacute igrave icircumflex idieresis ntilde oacute ograve ocircumflex odieresis otilde uacute ugrave ucircumflex udieresis dagger degree cent sterling section bullet paragraph germandbls registered copyright trademark acute dieresis notequal AE Oslash infinity plusminus lessequal greaterequal yen mu partialdiff summation product pi integral ordfeminine ordmasculine Omega ae oslash questiondown exclamdown logicalnot radical florin approxequal Delta guillemotleft guillemotright ellipsis space Agrave Atilde Otilde OE oe endash emdash quotedblleft quotedblright quoteleft quoteright divide lozenge ydieresis Ydieresis fraction currency guilsinglleft guilsinglright fi fl daggerdbl periodcentered quotesinglbase quotedblbase perthousand Acircumflex Ecircumflex Aacute Edieresis Egrave Iacute Icircumflex Idieresis Igrave Oacute Ocircumflex apple Ograve Uacute Ucircumflex Ugrave dotlessi circumflex tilde macron breve dotaccent ring cedilla hungarumlaut ogonek caron".split(" "),
+            StandardEncoding:"                                space exclam quotedbl numbersign dollar percent ampersand quoteright parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde                                   exclamdown cent sterling fraction yen florin section currency quotesingle quotedblleft guillemotleft guilsinglleft guilsinglright fi fl  endash dagger daggerdbl periodcentered  paragraph bullet quotesinglbase quotedblbase quotedblright guillemotright ellipsis perthousand  questiondown  grave acute circumflex tilde macron breve dotaccent dieresis  ring cedilla  hungarumlaut ogonek caron emdash                 AE  ordfeminine     Lslash Oslash OE ordmasculine      ae    dotlessi   lslash oslash oe germandbls".split(" "),
+            WinAnsiEncoding:"                                space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde bullet Euro bullet quotesinglbase florin quotedblbase ellipsis dagger daggerdbl circumflex perthousand Scaron guilsinglleft OE bullet Zcaron bullet bullet quoteleft quoteright quotedblleft quotedblright bullet endash emdash tilde trademark scaron guilsinglright oe bullet zcaron Ydieresis space exclamdown cent sterling currency yen brokenbar section dieresis copyright ordfeminine guillemotleft logicalnot hyphen registered macron degree plusminus twosuperior threesuperior acute mu paragraph periodcentered cedilla onesuperior ordmasculine guillemotright onequarter onehalf threequarters questiondown Agrave Aacute Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash Ugrave Uacute Ucircumflex Udieresis Yacute Thorn germandbls agrave aacute acircumflex atilde adieresis aring ae ccedilla egrave eacute ecircumflex edieresis igrave iacute icircumflex idieresis eth ntilde ograve oacute ocircumflex otilde odieresis divide oslash ugrave uacute ucircumflex udieresis yacute thorn ydieresis".split(" "),
+            SymbolSetEncoding:"                                space exclam universal numbersign existential percent ampersand suchthat parenleft parenright asteriskmath plus comma minus period slash zero one two three four five six seven eight nine colon semicolon less equal greater question congruent Alpha Beta Chi Delta Epsilon Phi Gamma Eta Iota theta1 Kappa Lambda Mu Nu Omicron Pi Theta Rho Sigma Tau Upsilon sigma1 Omega Xi Psi Zeta bracketleft therefore bracketright perpendicular underscore radicalex alpha beta chi delta epsilon phi gamma eta iota phi1 kappa lambda mu nu omicron pi theta rho sigma tau upsilon omega1 omega xi psi zeta braceleft bar braceright similar                                  Euro Upsilon1 minute lessequal fraction infinity florin club diamond heart spade arrowboth arrowleft arrowup arrowright arrowdown degree plusminus second greaterequal multiply proportional partialdiff bullet divide notequal equivalence approxequal ellipsis arrowvertex arrowhorizex carriagereturn aleph Ifraktur Rfraktur weierstrass circlemultiply circleplus emptyset intersection union propersuperset reflexsuperset notsubset propersubset reflexsubset element notelement angle gradient registerserif copyrightserif trademarkserif product radical dotmath logicalnot logicaland logicalor arrowdblboth arrowdblleft arrowdblup arrowdblright arrowdbldown lozenge angleleft registersans copyrightsans trademarksans summation parenlefttp parenleftex parenleftbt bracketlefttp bracketleftex bracketleftbt bracelefttp braceleftmid braceleftbt braceex  angleright integral integraltp integralex integralbt parenrighttp parenrightex parenrightbt bracketrighttp bracketrightex bracketrightbt bracerighttp bracerightmid bracerightbt".split(" "),
+            zapfDingbatsEncoding:"                                space a1 a2 a202 a3 a4 a5 a119 a118 a117 a11 a12 a13 a14 a15 a16 a105 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26 a27 a28 a6 a7 a8 a9 a10 a29 a30 a31 a32 a33 a34 a35 a36 a37 a38 a39 a40 a41 a42 a43 a44 a45 a46 a47 a48 a49 a50 a51 a52 a53 a54 a55 a56 a57 a58 a59 a60 a61 a62 a63 a64 a65 a66 a67 a68 a69 a70 a71 a72 a73 a74 a203 a75 a204 a76 a77 a78 a79 a81 a82 a83 a84 a97 a98 a99 a100                                   a101 a102 a103 a104 a106 a107 a108 a112 a111 a110 a109 a120 a121 a122 a123 a124 a125 a126 a127 a128 a129 a130 a131 a132 a133 a134 a135 a136 a137 a138 a139 a140 a141 a142 a143 a144 a145 a146 a147 a148 a149 a150 a151 a152 a153 a154 a155 a156 a157 a158 a159 a160 a161 a163 a164 a196 a165 a192 a166 a167 a168 a169 a170 a171 a172 a173 a162 a174 a175 a176 a177 a178 a179 a193 a180 a199 a181 a200 a182  a201 a183 a184 a197 a185 a194 a198 a186 a195 a187 a188 a189 a190 a191".split(" ")},
+        Xd={ArialNarrow:"Helvetica","ArialNarrow-Bold":"Helvetica-Bold","ArialNarrow-BoldItalic":"Helvetica-BoldOblique","ArialNarrow-Italic":"Helvetica-Oblique",ArialBlack:"Helvetica","ArialBlack-Bold":"Helvetica-Bold","ArialBlack-BoldItalic":"Helvetica-BoldOblique","ArialBlack-Italic":"Helvetica-Oblique",Arial:"Helvetica","Arial-Bold":"Helvetica-Bold","Arial-BoldItalic":"Helvetica-BoldOblique","Arial-Italic":"Helvetica-Oblique","Arial-BoldItalicMT":"Helvetica-BoldOblique","Arial-BoldMT":"Helvetica-Bold",
+            "Arial-ItalicMT":"Helvetica-Oblique",ArialMT:"Helvetica","Courier-Bold":"Courier-Bold","Courier-BoldItalic":"Courier-BoldOblique","Courier-Italic":"Courier-Oblique",CourierNew:"Courier","CourierNew-Bold":"Courier-Bold","CourierNew-BoldItalic":"Courier-BoldOblique","CourierNew-Italic":"Courier-Oblique","CourierNewPS-BoldItalicMT":"Courier-BoldOblique","CourierNewPS-BoldMT":"Courier-Bold","CourierNewPS-ItalicMT":"Courier-Oblique",CourierNewPSMT:"Courier","Helvetica-Bold":"Helvetica-Bold","Helvetica-BoldItalic":"Helvetica-BoldOblique",
+            "Helvetica-Italic":"Helvetica-Oblique","Symbol-Bold":"Symbol","Symbol-BoldItalic":"Symbol","Symbol-Italic":"Symbol",TimesNewRoman:"Times-Roman","TimesNewRoman-Bold":"Times-Bold","TimesNewRoman-BoldItalic":"Times-BoldItalic","TimesNewRoman-Italic":"Times-Italic",TimesNewRomanPS:"Times-Roman","TimesNewRomanPS-Bold":"Times-Bold","TimesNewRomanPS-BoldItalic":"Times-BoldItalic","TimesNewRomanPS-BoldItalicMT":"Times-BoldItalic","TimesNewRomanPS-BoldMT":"Times-Bold","TimesNewRomanPS-Italic":"Times-Italic",
+            "TimesNewRomanPS-ItalicMT":"Times-Italic",TimesNewRomanPSMT:"Times-Roman","TimesNewRomanPSMT-Bold":"Times-Bold","TimesNewRomanPSMT-BoldItalic":"Times-BoldItalic","TimesNewRomanPSMT-Italic":"Times-Italic"},pi={ComicSansMS:"Comic Sans MS","ComicSansMS-Bold":"Comic Sans MS-Bold","ComicSansMS-BoldItalic":"Comic Sans MS-BoldItalic","ComicSansMS-Italic":"Comic Sans MS-Italic",LucidaConsole:"Courier","LucidaConsole-Bold":"Courier-Bold","LucidaConsole-BoldItalic":"Courier-BoldOblique","LucidaConsole-Italic":"Courier-Oblique",
+            "MS-Gothic":"MS Gothic","MS-Gothic-Bold":"MS Gothic-Bold","MS-Gothic-BoldItalic":"MS Gothic-BoldItalic","MS-Gothic-Italic":"MS Gothic-Italic","MS-Mincho":"MS Mincho","MS-Mincho-Bold":"MS Mincho-Bold","MS-Mincho-BoldItalic":"MS Mincho-BoldItalic","MS-Mincho-Italic":"MS Mincho-Italic","MS-PGothic":"MS PGothic","MS-PGothic-Bold":"MS PGothic-Bold","MS-PGothic-BoldItalic":"MS PGothic-BoldItalic","MS-PGothic-Italic":"MS PGothic-Italic","MS-PMincho":"MS PMincho","MS-PMincho-Bold":"MS PMincho-Bold","MS-PMincho-BoldItalic":"MS PMincho-BoldItalic",
+            "MS-PMincho-Italic":"MS PMincho-Italic"},li={"Adobe Jenson":!0,"Adobe Text":!0,Albertus:!0,Aldus:!0,Alexandria:!0,Algerian:!0,"American Typewriter":!0,Antiqua:!0,Apex:!0,Arno:!0,Aster:!0,Aurora:!0,Baskerville:!0,Bell:!0,Bembo:!0,"Bembo Schoolbook":!0,Benguiat:!0,"Berkeley Old Style":!0,"Bernhard Modern":!0,"Berthold City":!0,Bodoni:!0,"Bauer Bodoni":!0,"Book Antiqua":!0,Bookman:!0,"Bordeaux Roman":!0,"Californian FB":!0,Calisto:!0,Calvert:!0,Capitals:!0,Cambria:!0,Cartier:!0,Caslon:!0,Catull:!0,Centaur:!0,
+            "Century Old Style":!0,"Century Schoolbook":!0,Chaparral:!0,"Charis SIL":!0,Cheltenham:!0,"Cholla Slab":!0,Clarendon:!0,Clearface:!0,Cochin:!0,Colonna:!0,"Computer Modern":!0,"Concrete Roman":!0,Constantia:!0,"Cooper Black":!0,Corona:!0,Ecotype:!0,Egyptienne:!0,Elephant:!0,Excelsior:!0,Fairfield:!0,"FF Scala":!0,Folkard:!0,Footlight:!0,FreeSerif:!0,"Friz Quadrata":!0,Garamond:!0,Gentium:!0,Georgia:!0,Gloucester:!0,"Goudy Old Style":!0,"Goudy Schoolbook":!0,"Goudy Pro Font":!0,Granjon:!0,"Guardian Egyptian":!0,
+            Heather:!0,Hercules:!0,"High Tower Text":!0,Hiroshige:!0,"Hoefler Text":!0,"Humana Serif":!0,Imprint:!0,"Ionic No. 5":!0,Janson:!0,Joanna:!0,Korinna:!0,Lexicon:!0,"Liberation Serif":!0,"Linux Libertine":!0,Literaturnaya:!0,Lucida:!0,"Lucida Bright":!0,Melior:!0,Memphis:!0,Miller:!0,Minion:!0,Modern:!0,"Mona Lisa":!0,"Mrs Eaves":!0,"MS Serif":!0,"Museo Slab":!0,"New York":!0,"Nimbus Roman":!0,"NPS Rawlinson Roadway":!0,Palatino:!0,Perpetua:!0,Plantin:!0,"Plantin Schoolbook":!0,Playbill:!0,"Poor Richard":!0,
+            "Rawlinson Roadway":!0,Renault:!0,Requiem:!0,Rockwell:!0,Roman:!0,"Rotis Serif":!0,Sabon:!0,Scala:!0,Seagull:!0,Sistina:!0,Souvenir:!0,STIX:!0,"Stone Informal":!0,"Stone Serif":!0,Sylfaen:!0,Times:!0,Trajan:!0,"Trinit\u00c3\u00a9":!0,"Trump Mediaeval":!0,Utopia:!0,"Vale Type":!0,"Bitstream Vera":!0,"Vera Serif":!0,Versailles:!0,Wanted:!0,Weiss:!0,"Wide Latin":!0,Windsor:!0,XITS:!0},mi={Dingbats:!0,Symbol:!0,ZapfDingbats:!0},rg={2:10,3:32,4:33,5:34,6:35,7:36,8:37,9:38,10:39,11:40,12:41,13:42,14:43,
+            15:44,16:173,17:46,18:47,19:48,20:49,21:50,22:51,23:52,24:53,25:54,26:55,27:56,28:57,29:58,30:894,31:60,32:61,33:62,34:63,35:64,36:65,37:66,38:67,39:68,40:69,41:70,42:71,43:72,44:73,45:74,46:75,47:76,48:77,49:78,50:79,51:80,52:81,53:82,54:83,55:84,56:85,57:86,58:87,59:88,60:89,61:90,62:91,63:92,64:93,65:94,66:95,67:96,68:97,69:98,70:99,71:100,72:101,73:102,74:103,75:104,76:105,77:106,78:107,79:108,80:109,81:110,82:111,83:112,84:113,85:114,86:115,87:116,88:117,89:118,90:119,91:120,92:121,93:122,94:123,
+            95:124,96:125,97:126,98:196,99:197,100:199,101:201,102:209,103:214,104:220,105:225,106:224,107:226,108:228,109:227,110:229,111:231,112:233,113:232,114:234,115:235,116:237,117:236,118:238,119:239,120:241,121:243,122:242,123:244,124:246,125:245,126:250,127:249,128:251,129:252,130:8224,131:176,132:162,133:163,134:167,135:8226,136:182,137:223,138:174,139:169,140:8482,141:180,142:168,143:8800,144:198,145:216,146:8734,147:177,148:8804,149:8805,150:165,151:181,152:8706,153:8721,154:8719,156:8747,157:170,
+            158:186,159:8486,160:230,161:248,162:191,163:161,164:172,165:8730,166:402,167:8776,168:8710,169:171,170:187,171:8230,210:218,305:963,306:964,307:966,308:8215,309:8252,310:8319,311:8359,312:8592,313:8593,337:9552,493:1039,494:1040,705:1524,706:8362,710:64288,711:64298,759:1617,761:1776,763:1778,775:1652,777:1764,778:1780,779:1781,780:1782,782:771,783:64726,786:8363,788:8532,790:768,791:769,792:768,795:803,797:64336,798:64337,799:64342,800:64343,801:64344,802:64345,803:64362,804:64363,805:64364,2424:7821,
+            2425:7822,2426:7823,2427:7824,2428:7825,2429:7826,2430:7827,2433:7682,2678:8045,2679:8046,2830:1552,2838:686,2840:751,2842:753,2843:754,2844:755,2846:757,2856:767,2857:848,2858:849,2862:853,2863:854,2864:855,2865:861,2866:862,2906:7460,2908:7462,2909:7463,2910:7464,2912:7466,2913:7467,2914:7468,2916:7470,2917:7471,2918:7472,2920:7474,2921:7475,2922:7476,2924:7478,2925:7479,2926:7480,2928:7482,2929:7483,2930:7484,2932:7486,2933:7487,2934:7488,2936:7490,2937:7491,2938:7492,2940:7494,2941:7495,2942:7496,
+            2944:7498,2946:7500,2948:7502,2950:7504,2951:7505,2952:7506,2954:7508,2955:7509,2956:7510,2958:7512,2959:7513,2960:7514,2962:7516,2963:7517,2964:7518,2966:7520,2967:7521,2968:7522,2970:7524,2971:7525,2972:7526,2974:7528,2975:7529,2976:7530,2978:1537,2979:1538,2980:1539,2982:1549,2983:1551,2984:1552,2986:1554,2987:1555,2988:1556,2990:1623,2991:1624,2995:1775,2999:1791,3002:64290,3003:64291,3004:64292,3006:64294,3007:64295,3008:64296,3011:1900,3014:8223,3015:8244,3017:7532,3018:7533,3019:7534,3075:7590,
+            3076:7591,3079:7594,3080:7595,3083:7598,3084:7599,3087:7602,3088:7603,3091:7606,3092:7607,3095:7610,3096:7611,3099:7614,3100:7615,3103:7618,3104:7619,3107:8337,3108:8338,3116:1884,3119:1885,3120:1885,3123:1886,3124:1886,3127:1887,3128:1887,3131:1888,3132:1888,3135:1889,3136:1889,3139:1890,3140:1890,3143:1891,3144:1891,3147:1892,3148:1892,3153:580,3154:581,3157:584,3158:585,3161:588,3162:589,3165:891,3166:892,3169:1274,3170:1275,3173:1278,3174:1279,3181:7622,3182:7623,3282:11799,3316:578,3379:42785,
+            3393:1159,3416:8377},Vc=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,
+            end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,
+            end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},
+            {begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},
+            {begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},
+            {begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66E3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}],sg=".notdef .null nonmarkingreturn space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde Adieresis Aring Ccedilla Eacute Ntilde Odieresis Udieresis aacute agrave acircumflex adieresis atilde aring ccedilla eacute egrave ecircumflex edieresis iacute igrave icircumflex idieresis ntilde oacute ograve ocircumflex odieresis otilde uacute ugrave ucircumflex udieresis dagger degree cent sterling section bullet paragraph germandbls registered copyright trademark acute dieresis notequal AE Oslash infinity plusminus lessequal greaterequal yen mu partialdiff summation product pi integral ordfeminine ordmasculine Omega ae oslash questiondown exclamdown logicalnot radical florin approxequal Delta guillemotleft guillemotright ellipsis nonbreakingspace Agrave Atilde Otilde OE oe endash emdash quotedblleft quotedblright quoteleft quoteright divide lozenge ydieresis Ydieresis fraction currency guilsinglleft guilsinglright fi fl daggerdbl periodcentered quotesinglbase quotedblbase perthousand Acircumflex Ecircumflex Aacute Edieresis Egrave Iacute Icircumflex Idieresis Igrave Oacute Ocircumflex apple Ograve Uacute Ucircumflex Ugrave dotlessi circumflex tilde macron breve dotaccent ring cedilla hungarumlaut ogonek caron Lslash lslash Scaron scaron Zcaron zcaron brokenbar Eth eth Yacute yacute Thorn thorn minus multiply onesuperior twosuperior threesuperior onehalf onequarter threequarters franc Gbreve gbreve Idotaccent Scedilla scedilla Cacute cacute Ccaron ccaron dcroat".split(" "),
+        Yf={"\u00a8":" \u0308","\u00af":" \u0304","\u00b4":" \u0301","\u00b5":"\u03bc","\u00b8":" \u0327","\u0132":"IJ","\u0133":"ij","\u013f":"L\u00b7","\u0140":"l\u00b7","\u0149":"\u02bcn","\u017f":"s","\u01c4":"D\u017d","\u01c5":"D\u017e","\u01c6":"d\u017e","\u01c7":"LJ","\u01c8":"Lj","\u01c9":"lj","\u01ca":"NJ","\u01cb":"Nj","\u01cc":"nj","\u01f1":"DZ","\u01f2":"Dz","\u01f3":"dz","\u02d8":" \u0306","\u02d9":" \u0307","\u02da":" \u030a","\u02db":" \u0328","\u02dc":" \u0303","\u02dd":" \u030b","\u037a":" \u0345",
+            "\u0384":" \u0301","\u03d0":"\u03b2","\u03d1":"\u03b8","\u03d2":"\u03a5","\u03d5":"\u03c6","\u03d6":"\u03c0","\u03f0":"\u03ba","\u03f1":"\u03c1","\u03f2":"\u03c2","\u03f4":"\u0398","\u03f5":"\u03b5","\u03f9":"\u03a3","\u0587":"\u0565\u0582","\u0675":"\u0627\u0674","\u0676":"\u0648\u0674","\u0677":"\u06c7\u0674","\u0678":"\u064a\u0674","\u0e33":"\u0e4d\u0e32","\u0eb3":"\u0ecd\u0eb2","\u0edc":"\u0eab\u0e99","\u0edd":"\u0eab\u0ea1","\u0f77":"\u0fb2\u0f81","\u0f79":"\u0fb3\u0f81","\u1e9a":"a\u02be","\u1fbd":" \u0313",
+            "\u1fbf":" \u0313","\u1fc0":" \u0342","\u1ffe":" \u0314","\u2002":" ","\u2003":" ","\u2004":" ","\u2005":" ","\u2006":" ","\u2008":" ","\u2009":" ","\u200a":" ","\u2017":" \u0333","\u2024":".","\u2025":"..","\u2026":"...","\u2033":"\u2032\u2032","\u2034":"\u2032\u2032\u2032","\u2036":"\u2035\u2035","\u2037":"\u2035\u2035\u2035","\u203c":"!!","\u203e":" \u0305","\u2047":"??","\u2048":"?!","\u2049":"!?","\u2057":"\u2032\u2032\u2032\u2032","\u205f":" ","\u20a8":"Rs","\u2100":"a/c","\u2101":"a/s","\u2103":"\u00b0C",
+            "\u2105":"c/o","\u2106":"c/u","\u2107":"\u0190","\u2109":"\u00b0F","\u2116":"No","\u2121":"TEL","\u2135":"\u05d0","\u2136":"\u05d1","\u2137":"\u05d2","\u2138":"\u05d3","\u213b":"FAX","\u2160":"I","\u2161":"II","\u2162":"III","\u2163":"IV","\u2164":"V","\u2165":"VI","\u2166":"VII","\u2167":"VIII","\u2168":"IX","\u2169":"X","\u216a":"XI","\u216b":"XII","\u216c":"L","\u216d":"C","\u216e":"D","\u216f":"M","\u2170":"i","\u2171":"ii","\u2172":"iii","\u2173":"iv","\u2174":"v","\u2175":"vi","\u2176":"vii",
+            "\u2177":"viii","\u2178":"ix","\u2179":"x","\u217a":"xi","\u217b":"xii","\u217c":"l","\u217d":"c","\u217e":"d","\u217f":"m","\u222c":"\u222b\u222b","\u222d":"\u222b\u222b\u222b","\u222f":"\u222e\u222e","\u2230":"\u222e\u222e\u222e","\u2474":"(1)","\u2475":"(2)","\u2476":"(3)","\u2477":"(4)","\u2478":"(5)","\u2479":"(6)","\u247a":"(7)","\u247b":"(8)","\u247c":"(9)","\u247d":"(10)","\u247e":"(11)","\u247f":"(12)","\u2480":"(13)","\u2481":"(14)","\u2482":"(15)","\u2483":"(16)","\u2484":"(17)","\u2485":"(18)",
+            "\u2486":"(19)","\u2487":"(20)","\u2488":"1.","\u2489":"2.","\u248a":"3.","\u248b":"4.","\u248c":"5.","\u248d":"6.","\u248e":"7.","\u248f":"8.","\u2490":"9.","\u2491":"10.","\u2492":"11.","\u2493":"12.","\u2494":"13.","\u2495":"14.","\u2496":"15.","\u2497":"16.","\u2498":"17.","\u2499":"18.","\u249a":"19.","\u249b":"20.","\u249c":"(a)","\u249d":"(b)","\u249e":"(c)","\u249f":"(d)","\u24a0":"(e)","\u24a1":"(f)","\u24a2":"(g)","\u24a3":"(h)","\u24a4":"(i)","\u24a5":"(j)","\u24a6":"(k)","\u24a7":"(l)",
+            "\u24a8":"(m)","\u24a9":"(n)","\u24aa":"(o)","\u24ab":"(p)","\u24ac":"(q)","\u24ad":"(r)","\u24ae":"(s)","\u24af":"(t)","\u24b0":"(u)","\u24b1":"(v)","\u24b2":"(w)","\u24b3":"(x)","\u24b4":"(y)","\u24b5":"(z)","\u2a0c":"\u222b\u222b\u222b\u222b","\u2a74":"::=","\u2a75":"==","\u2a76":"===","\u2e9f":"\u6bcd","\u2ef3":"\u9f9f","\u2f00":"\u4e00","\u2f01":"\u4e28","\u2f02":"\u4e36","\u2f03":"\u4e3f","\u2f04":"\u4e59","\u2f05":"\u4e85","\u2f06":"\u4e8c","\u2f07":"\u4ea0","\u2f08":"\u4eba","\u2f09":"\u513f",
+            "\u2f0a":"\u5165","\u2f0b":"\u516b","\u2f0c":"\u5182","\u2f0d":"\u5196","\u2f0e":"\u51ab","\u2f0f":"\u51e0","\u2f10":"\u51f5","\u2f11":"\u5200","\u2f12":"\u529b","\u2f13":"\u52f9","\u2f14":"\u5315","\u2f15":"\u531a","\u2f16":"\u5338","\u2f17":"\u5341","\u2f18":"\u535c","\u2f19":"\u5369","\u2f1a":"\u5382","\u2f1b":"\u53b6","\u2f1c":"\u53c8","\u2f1d":"\u53e3","\u2f1e":"\u56d7","\u2f1f":"\u571f","\u2f20":"\u58eb","\u2f21":"\u5902","\u2f22":"\u590a","\u2f23":"\u5915","\u2f24":"\u5927","\u2f25":"\u5973",
+            "\u2f26":"\u5b50","\u2f27":"\u5b80","\u2f28":"\u5bf8","\u2f29":"\u5c0f","\u2f2a":"\u5c22","\u2f2b":"\u5c38","\u2f2c":"\u5c6e","\u2f2d":"\u5c71","\u2f2e":"\u5ddb","\u2f2f":"\u5de5","\u2f30":"\u5df1","\u2f31":"\u5dfe","\u2f32":"\u5e72","\u2f33":"\u5e7a","\u2f34":"\u5e7f","\u2f35":"\u5ef4","\u2f36":"\u5efe","\u2f37":"\u5f0b","\u2f38":"\u5f13","\u2f39":"\u5f50","\u2f3a":"\u5f61","\u2f3b":"\u5f73","\u2f3c":"\u5fc3","\u2f3d":"\u6208","\u2f3e":"\u6236","\u2f3f":"\u624b","\u2f40":"\u652f","\u2f41":"\u6534",
+            "\u2f42":"\u6587","\u2f43":"\u6597","\u2f44":"\u65a4","\u2f45":"\u65b9","\u2f46":"\u65e0","\u2f47":"\u65e5","\u2f48":"\u66f0","\u2f49":"\u6708","\u2f4a":"\u6728","\u2f4b":"\u6b20","\u2f4c":"\u6b62","\u2f4d":"\u6b79","\u2f4e":"\u6bb3","\u2f4f":"\u6bcb","\u2f50":"\u6bd4","\u2f51":"\u6bdb","\u2f52":"\u6c0f","\u2f53":"\u6c14","\u2f54":"\u6c34","\u2f55":"\u706b","\u2f56":"\u722a","\u2f57":"\u7236","\u2f58":"\u723b","\u2f59":"\u723f","\u2f5a":"\u7247","\u2f5b":"\u7259","\u2f5c":"\u725b","\u2f5d":"\u72ac",
+            "\u2f5e":"\u7384","\u2f5f":"\u7389","\u2f60":"\u74dc","\u2f61":"\u74e6","\u2f62":"\u7518","\u2f63":"\u751f","\u2f64":"\u7528","\u2f65":"\u7530","\u2f66":"\u758b","\u2f67":"\u7592","\u2f68":"\u7676","\u2f69":"\u767d","\u2f6a":"\u76ae","\u2f6b":"\u76bf","\u2f6c":"\u76ee","\u2f6d":"\u77db","\u2f6e":"\u77e2","\u2f6f":"\u77f3","\u2f70":"\u793a","\u2f71":"\u79b8","\u2f72":"\u79be","\u2f73":"\u7a74","\u2f74":"\u7acb","\u2f75":"\u7af9","\u2f76":"\u7c73","\u2f77":"\u7cf8","\u2f78":"\u7f36","\u2f79":"\u7f51",
+            "\u2f7a":"\u7f8a","\u2f7b":"\u7fbd","\u2f7c":"\u8001","\u2f7d":"\u800c","\u2f7e":"\u8012","\u2f7f":"\u8033","\u2f80":"\u807f","\u2f81":"\u8089","\u2f82":"\u81e3","\u2f83":"\u81ea","\u2f84":"\u81f3","\u2f85":"\u81fc","\u2f86":"\u820c","\u2f87":"\u821b","\u2f88":"\u821f","\u2f89":"\u826e","\u2f8a":"\u8272","\u2f8b":"\u8278","\u2f8c":"\u864d","\u2f8d":"\u866b","\u2f8e":"\u8840","\u2f8f":"\u884c","\u2f90":"\u8863","\u2f91":"\u897e","\u2f92":"\u898b","\u2f93":"\u89d2","\u2f94":"\u8a00","\u2f95":"\u8c37",
+            "\u2f96":"\u8c46","\u2f97":"\u8c55","\u2f98":"\u8c78","\u2f99":"\u8c9d","\u2f9a":"\u8d64","\u2f9b":"\u8d70","\u2f9c":"\u8db3","\u2f9d":"\u8eab","\u2f9e":"\u8eca","\u2f9f":"\u8f9b","\u2fa0":"\u8fb0","\u2fa1":"\u8fb5","\u2fa2":"\u9091","\u2fa3":"\u9149","\u2fa4":"\u91c6","\u2fa5":"\u91cc","\u2fa6":"\u91d1","\u2fa7":"\u9577","\u2fa8":"\u9580","\u2fa9":"\u961c","\u2faa":"\u96b6","\u2fab":"\u96b9","\u2fac":"\u96e8","\u2fad":"\u9751","\u2fae":"\u975e","\u2faf":"\u9762","\u2fb0":"\u9769","\u2fb1":"\u97cb",
+            "\u2fb2":"\u97ed","\u2fb3":"\u97f3","\u2fb4":"\u9801","\u2fb5":"\u98a8","\u2fb6":"\u98db","\u2fb7":"\u98df","\u2fb8":"\u9996","\u2fb9":"\u9999","\u2fba":"\u99ac","\u2fbb":"\u9aa8","\u2fbc":"\u9ad8","\u2fbd":"\u9adf","\u2fbe":"\u9b25","\u2fbf":"\u9b2f","\u2fc0":"\u9b32","\u2fc1":"\u9b3c","\u2fc2":"\u9b5a","\u2fc3":"\u9ce5","\u2fc4":"\u9e75","\u2fc5":"\u9e7f","\u2fc6":"\u9ea5","\u2fc7":"\u9ebb","\u2fc8":"\u9ec3","\u2fc9":"\u9ecd","\u2fca":"\u9ed1","\u2fcb":"\u9ef9","\u2fcc":"\u9efd","\u2fcd":"\u9f0e",
+            "\u2fce":"\u9f13","\u2fcf":"\u9f20","\u2fd0":"\u9f3b","\u2fd1":"\u9f4a","\u2fd2":"\u9f52","\u2fd3":"\u9f8d","\u2fd4":"\u9f9c","\u2fd5":"\u9fa0","\u3036":"\u3012","\u3038":"\u5341","\u3039":"\u5344","\u303a":"\u5345","\u309b":" \u3099","\u309c":" \u309a","\u3131":"\u1100","\u3132":"\u1101","\u3133":"\u11aa","\u3134":"\u1102","\u3135":"\u11ac","\u3136":"\u11ad","\u3137":"\u1103","\u3138":"\u1104","\u3139":"\u1105","\u313a":"\u11b0","\u313b":"\u11b1","\u313c":"\u11b2","\u313d":"\u11b3","\u313e":"\u11b4",
+            "\u313f":"\u11b5","\u3140":"\u111a","\u3141":"\u1106","\u3142":"\u1107","\u3143":"\u1108","\u3144":"\u1121","\u3145":"\u1109","\u3146":"\u110a","\u3147":"\u110b","\u3148":"\u110c","\u3149":"\u110d","\u314a":"\u110e","\u314b":"\u110f","\u314c":"\u1110","\u314d":"\u1111","\u314e":"\u1112","\u314f":"\u1161","\u3150":"\u1162","\u3151":"\u1163","\u3152":"\u1164","\u3153":"\u1165","\u3154":"\u1166","\u3155":"\u1167","\u3156":"\u1168","\u3157":"\u1169","\u3158":"\u116a","\u3159":"\u116b","\u315a":"\u116c",
+            "\u315b":"\u116d","\u315c":"\u116e","\u315d":"\u116f","\u315e":"\u1170","\u315f":"\u1171","\u3160":"\u1172","\u3161":"\u1173","\u3162":"\u1174","\u3163":"\u1175","\u3164":"\u1160","\u3165":"\u1114","\u3166":"\u1115","\u3167":"\u11c7","\u3168":"\u11c8","\u3169":"\u11cc","\u316a":"\u11ce","\u316b":"\u11d3","\u316c":"\u11d7","\u316d":"\u11d9","\u316e":"\u111c","\u316f":"\u11dd","\u3170":"\u11df","\u3171":"\u111d","\u3172":"\u111e","\u3173":"\u1120","\u3174":"\u1122","\u3175":"\u1123","\u3176":"\u1127",
+            "\u3177":"\u1129","\u3178":"\u112b","\u3179":"\u112c","\u317a":"\u112d","\u317b":"\u112e","\u317c":"\u112f","\u317d":"\u1132","\u317e":"\u1136","\u317f":"\u1140","\u3180":"\u1147","\u3181":"\u114c","\u3182":"\u11f1","\u3183":"\u11f2","\u3184":"\u1157","\u3185":"\u1158","\u3186":"\u1159","\u3187":"\u1184","\u3188":"\u1185","\u3189":"\u1188","\u318a":"\u1191","\u318b":"\u1192","\u318c":"\u1194","\u318d":"\u119e","\u318e":"\u11a1","\u3200":"(\u1100)","\u3201":"(\u1102)","\u3202":"(\u1103)","\u3203":"(\u1105)",
+            "\u3204":"(\u1106)","\u3205":"(\u1107)","\u3206":"(\u1109)","\u3207":"(\u110b)","\u3208":"(\u110c)","\u3209":"(\u110e)","\u320a":"(\u110f)","\u320b":"(\u1110)","\u320c":"(\u1111)","\u320d":"(\u1112)","\u320e":"(\u1100\u1161)","\u320f":"(\u1102\u1161)","\u3210":"(\u1103\u1161)","\u3211":"(\u1105\u1161)","\u3212":"(\u1106\u1161)","\u3213":"(\u1107\u1161)","\u3214":"(\u1109\u1161)","\u3215":"(\u110b\u1161)","\u3216":"(\u110c\u1161)","\u3217":"(\u110e\u1161)","\u3218":"(\u110f\u1161)","\u3219":"(\u1110\u1161)",
+            "\u321a":"(\u1111\u1161)","\u321b":"(\u1112\u1161)","\u321c":"(\u110c\u116e)","\u321d":"(\u110b\u1169\u110c\u1165\u11ab)","\u321e":"(\u110b\u1169\u1112\u116e)","\u3220":"(\u4e00)","\u3221":"(\u4e8c)","\u3222":"(\u4e09)","\u3223":"(\u56db)","\u3224":"(\u4e94)","\u3225":"(\u516d)","\u3226":"(\u4e03)","\u3227":"(\u516b)","\u3228":"(\u4e5d)","\u3229":"(\u5341)","\u322a":"(\u6708)","\u322b":"(\u706b)","\u322c":"(\u6c34)","\u322d":"(\u6728)","\u322e":"(\u91d1)","\u322f":"(\u571f)","\u3230":"(\u65e5)","\u3231":"(\u682a)",
+            "\u3232":"(\u6709)","\u3233":"(\u793e)","\u3234":"(\u540d)","\u3235":"(\u7279)","\u3236":"(\u8ca1)","\u3237":"(\u795d)","\u3238":"(\u52b4)","\u3239":"(\u4ee3)","\u323a":"(\u547c)","\u323b":"(\u5b66)","\u323c":"(\u76e3)","\u323d":"(\u4f01)","\u323e":"(\u8cc7)","\u323f":"(\u5354)","\u3240":"(\u796d)","\u3241":"(\u4f11)","\u3242":"(\u81ea)","\u3243":"(\u81f3)","\u32c0":"1\u6708","\u32c1":"2\u6708","\u32c2":"3\u6708","\u32c3":"4\u6708","\u32c4":"5\u6708","\u32c5":"6\u6708","\u32c6":"7\u6708","\u32c7":"8\u6708",
+            "\u32c8":"9\u6708","\u32c9":"10\u6708","\u32ca":"11\u6708","\u32cb":"12\u6708","\u3358":"0\u70b9","\u3359":"1\u70b9","\u335a":"2\u70b9","\u335b":"3\u70b9","\u335c":"4\u70b9","\u335d":"5\u70b9","\u335e":"6\u70b9","\u335f":"7\u70b9","\u3360":"8\u70b9","\u3361":"9\u70b9","\u3362":"10\u70b9","\u3363":"11\u70b9","\u3364":"12\u70b9","\u3365":"13\u70b9","\u3366":"14\u70b9","\u3367":"15\u70b9","\u3368":"16\u70b9","\u3369":"17\u70b9","\u336a":"18\u70b9","\u336b":"19\u70b9","\u336c":"20\u70b9","\u336d":"21\u70b9",
+            "\u336e":"22\u70b9","\u336f":"23\u70b9","\u3370":"24\u70b9","\u33e0":"1\u65e5","\u33e1":"2\u65e5","\u33e2":"3\u65e5","\u33e3":"4\u65e5","\u33e4":"5\u65e5","\u33e5":"6\u65e5","\u33e6":"7\u65e5","\u33e7":"8\u65e5","\u33e8":"9\u65e5","\u33e9":"10\u65e5","\u33ea":"11\u65e5","\u33eb":"12\u65e5","\u33ec":"13\u65e5","\u33ed":"14\u65e5","\u33ee":"15\u65e5","\u33ef":"16\u65e5","\u33f0":"17\u65e5","\u33f1":"18\u65e5","\u33f2":"19\u65e5","\u33f3":"20\u65e5","\u33f4":"21\u65e5","\u33f5":"22\u65e5","\u33f6":"23\u65e5",
+            "\u33f7":"24\u65e5","\u33f8":"25\u65e5","\u33f9":"26\u65e5","\u33fa":"27\u65e5","\u33fb":"28\u65e5","\u33fc":"29\u65e5","\u33fd":"30\u65e5","\u33fe":"31\u65e5","\ufb00":"ff","\ufb01":"fi","\ufb02":"fl","\ufb03":"ffi","\ufb04":"ffl","\ufb05":"\u017ft","\ufb06":"st","\ufb13":"\u0574\u0576","\ufb14":"\u0574\u0565","\ufb15":"\u0574\u056b","\ufb16":"\u057e\u0576","\ufb17":"\u0574\u056d","\ufb4f":"\u05d0\u05dc","\ufb50":"\u0671","\ufb51":"\u0671","\ufb52":"\u067b","\ufb53":"\u067b","\ufb54":"\u067b","\ufb55":"\u067b",
+            "\ufb56":"\u067e","\ufb57":"\u067e","\ufb58":"\u067e","\ufb59":"\u067e","\ufb5a":"\u0680","\ufb5b":"\u0680","\ufb5c":"\u0680","\ufb5d":"\u0680","\ufb5e":"\u067a","\ufb5f":"\u067a","\ufb60":"\u067a","\ufb61":"\u067a","\ufb62":"\u067f","\ufb63":"\u067f","\ufb64":"\u067f","\ufb65":"\u067f","\ufb66":"\u0679","\ufb67":"\u0679","\ufb68":"\u0679","\ufb69":"\u0679","\ufb6a":"\u06a4","\ufb6b":"\u06a4","\ufb6c":"\u06a4","\ufb6d":"\u06a4","\ufb6e":"\u06a6","\ufb6f":"\u06a6","\ufb70":"\u06a6","\ufb71":"\u06a6",
+            "\ufb72":"\u0684","\ufb73":"\u0684","\ufb74":"\u0684","\ufb75":"\u0684","\ufb76":"\u0683","\ufb77":"\u0683","\ufb78":"\u0683","\ufb79":"\u0683","\ufb7a":"\u0686","\ufb7b":"\u0686","\ufb7c":"\u0686","\ufb7d":"\u0686","\ufb7e":"\u0687","\ufb7f":"\u0687","\ufb80":"\u0687","\ufb81":"\u0687","\ufb82":"\u068d","\ufb83":"\u068d","\ufb84":"\u068c","\ufb85":"\u068c","\ufb86":"\u068e","\ufb87":"\u068e","\ufb88":"\u0688","\ufb89":"\u0688","\ufb8a":"\u0698","\ufb8b":"\u0698","\ufb8c":"\u0691","\ufb8d":"\u0691",
+            "\ufb8e":"\u06a9","\ufb8f":"\u06a9","\ufb90":"\u06a9","\ufb91":"\u06a9","\ufb92":"\u06af","\ufb93":"\u06af","\ufb94":"\u06af","\ufb95":"\u06af","\ufb96":"\u06b3","\ufb97":"\u06b3","\ufb98":"\u06b3","\ufb99":"\u06b3","\ufb9a":"\u06b1","\ufb9b":"\u06b1","\ufb9c":"\u06b1","\ufb9d":"\u06b1","\ufb9e":"\u06ba","\ufb9f":"\u06ba","\ufba0":"\u06bb","\ufba1":"\u06bb","\ufba2":"\u06bb","\ufba3":"\u06bb","\ufba4":"\u06c0","\ufba5":"\u06c0","\ufba6":"\u06c1","\ufba7":"\u06c1","\ufba8":"\u06c1","\ufba9":"\u06c1",
+            "\ufbaa":"\u06be","\ufbab":"\u06be","\ufbac":"\u06be","\ufbad":"\u06be","\ufbae":"\u06d2","\ufbaf":"\u06d2","\ufbb0":"\u06d3","\ufbb1":"\u06d3","\ufbd3":"\u06ad","\ufbd4":"\u06ad","\ufbd5":"\u06ad","\ufbd6":"\u06ad","\ufbd7":"\u06c7","\ufbd8":"\u06c7","\ufbd9":"\u06c6","\ufbda":"\u06c6","\ufbdb":"\u06c8","\ufbdc":"\u06c8","\ufbdd":"\u0677","\ufbde":"\u06cb","\ufbdf":"\u06cb","\ufbe0":"\u06c5","\ufbe1":"\u06c5","\ufbe2":"\u06c9","\ufbe3":"\u06c9","\ufbe4":"\u06d0","\ufbe5":"\u06d0","\ufbe6":"\u06d0",
+            "\ufbe7":"\u06d0","\ufbe8":"\u0649","\ufbe9":"\u0649","\ufbea":"\u0626\u0627","\ufbeb":"\u0626\u0627","\ufbec":"\u0626\u06d5","\ufbed":"\u0626\u06d5","\ufbee":"\u0626\u0648","\ufbef":"\u0626\u0648","\ufbf0":"\u0626\u06c7","\ufbf1":"\u0626\u06c7","\ufbf2":"\u0626\u06c6","\ufbf3":"\u0626\u06c6","\ufbf4":"\u0626\u06c8","\ufbf5":"\u0626\u06c8","\ufbf6":"\u0626\u06d0","\ufbf7":"\u0626\u06d0","\ufbf8":"\u0626\u06d0","\ufbf9":"\u0626\u0649","\ufbfa":"\u0626\u0649","\ufbfb":"\u0626\u0649","\ufbfc":"\u06cc",
+            "\ufbfd":"\u06cc","\ufbfe":"\u06cc","\ufbff":"\u06cc","\ufc00":"\u0626\u062c","\ufc01":"\u0626\u062d","\ufc02":"\u0626\u0645","\ufc03":"\u0626\u0649","\ufc04":"\u0626\u064a","\ufc05":"\u0628\u062c","\ufc06":"\u0628\u062d","\ufc07":"\u0628\u062e","\ufc08":"\u0628\u0645","\ufc09":"\u0628\u0649","\ufc0a":"\u0628\u064a","\ufc0b":"\u062a\u062c","\ufc0c":"\u062a\u062d","\ufc0d":"\u062a\u062e","\ufc0e":"\u062a\u0645","\ufc0f":"\u062a\u0649","\ufc10":"\u062a\u064a","\ufc11":"\u062b\u062c","\ufc12":"\u062b\u0645",
+            "\ufc13":"\u062b\u0649","\ufc14":"\u062b\u064a","\ufc15":"\u062c\u062d","\ufc16":"\u062c\u0645","\ufc17":"\u062d\u062c","\ufc18":"\u062d\u0645","\ufc19":"\u062e\u062c","\ufc1a":"\u062e\u062d","\ufc1b":"\u062e\u0645","\ufc1c":"\u0633\u062c","\ufc1d":"\u0633\u062d","\ufc1e":"\u0633\u062e","\ufc1f":"\u0633\u0645","\ufc20":"\u0635\u062d","\ufc21":"\u0635\u0645","\ufc22":"\u0636\u062c","\ufc23":"\u0636\u062d","\ufc24":"\u0636\u062e","\ufc25":"\u0636\u0645","\ufc26":"\u0637\u062d","\ufc27":"\u0637\u0645",
+            "\ufc28":"\u0638\u0645","\ufc29":"\u0639\u062c","\ufc2a":"\u0639\u0645","\ufc2b":"\u063a\u062c","\ufc2c":"\u063a\u0645","\ufc2d":"\u0641\u062c","\ufc2e":"\u0641\u062d","\ufc2f":"\u0641\u062e","\ufc30":"\u0641\u0645","\ufc31":"\u0641\u0649","\ufc32":"\u0641\u064a","\ufc33":"\u0642\u062d","\ufc34":"\u0642\u0645","\ufc35":"\u0642\u0649","\ufc36":"\u0642\u064a","\ufc37":"\u0643\u0627","\ufc38":"\u0643\u062c","\ufc39":"\u0643\u062d","\ufc3a":"\u0643\u062e","\ufc3b":"\u0643\u0644","\ufc3c":"\u0643\u0645",
+            "\ufc3d":"\u0643\u0649","\ufc3e":"\u0643\u064a","\ufc3f":"\u0644\u062c","\ufc40":"\u0644\u062d","\ufc41":"\u0644\u062e","\ufc42":"\u0644\u0645","\ufc43":"\u0644\u0649","\ufc44":"\u0644\u064a","\ufc45":"\u0645\u062c","\ufc46":"\u0645\u062d","\ufc47":"\u0645\u062e","\ufc48":"\u0645\u0645","\ufc49":"\u0645\u0649","\ufc4a":"\u0645\u064a","\ufc4b":"\u0646\u062c","\ufc4c":"\u0646\u062d","\ufc4d":"\u0646\u062e","\ufc4e":"\u0646\u0645","\ufc4f":"\u0646\u0649","\ufc50":"\u0646\u064a","\ufc51":"\u0647\u062c",
+            "\ufc52":"\u0647\u0645","\ufc53":"\u0647\u0649","\ufc54":"\u0647\u064a","\ufc55":"\u064a\u062c","\ufc56":"\u064a\u062d","\ufc57":"\u064a\u062e","\ufc58":"\u064a\u0645","\ufc59":"\u064a\u0649","\ufc5a":"\u064a\u064a","\ufc5b":"\u0630\u0670","\ufc5c":"\u0631\u0670","\ufc5d":"\u0649\u0670","\ufc5e":" \u064c\u0651","\ufc5f":" \u064d\u0651","\ufc60":" \u064e\u0651","\ufc61":" \u064f\u0651","\ufc62":" \u0650\u0651","\ufc63":" \u0651\u0670","\ufc64":"\u0626\u0631","\ufc65":"\u0626\u0632","\ufc66":"\u0626\u0645",
+            "\ufc67":"\u0626\u0646","\ufc68":"\u0626\u0649","\ufc69":"\u0626\u064a","\ufc6a":"\u0628\u0631","\ufc6b":"\u0628\u0632","\ufc6c":"\u0628\u0645","\ufc6d":"\u0628\u0646","\ufc6e":"\u0628\u0649","\ufc6f":"\u0628\u064a","\ufc70":"\u062a\u0631","\ufc71":"\u062a\u0632","\ufc72":"\u062a\u0645","\ufc73":"\u062a\u0646","\ufc74":"\u062a\u0649","\ufc75":"\u062a\u064a","\ufc76":"\u062b\u0631","\ufc77":"\u062b\u0632","\ufc78":"\u062b\u0645","\ufc79":"\u062b\u0646","\ufc7a":"\u062b\u0649","\ufc7b":"\u062b\u064a",
+            "\ufc7c":"\u0641\u0649","\ufc7d":"\u0641\u064a","\ufc7e":"\u0642\u0649","\ufc7f":"\u0642\u064a","\ufc80":"\u0643\u0627","\ufc81":"\u0643\u0644","\ufc82":"\u0643\u0645","\ufc83":"\u0643\u0649","\ufc84":"\u0643\u064a","\ufc85":"\u0644\u0645","\ufc86":"\u0644\u0649","\ufc87":"\u0644\u064a","\ufc88":"\u0645\u0627","\ufc89":"\u0645\u0645","\ufc8a":"\u0646\u0631","\ufc8b":"\u0646\u0632","\ufc8c":"\u0646\u0645","\ufc8d":"\u0646\u0646","\ufc8e":"\u0646\u0649","\ufc8f":"\u0646\u064a","\ufc90":"\u0649\u0670",
+            "\ufc91":"\u064a\u0631","\ufc92":"\u064a\u0632","\ufc93":"\u064a\u0645","\ufc94":"\u064a\u0646","\ufc95":"\u064a\u0649","\ufc96":"\u064a\u064a","\ufc97":"\u0626\u062c","\ufc98":"\u0626\u062d","\ufc99":"\u0626\u062e","\ufc9a":"\u0626\u0645","\ufc9b":"\u0626\u0647","\ufc9c":"\u0628\u062c","\ufc9d":"\u0628\u062d","\ufc9e":"\u0628\u062e","\ufc9f":"\u0628\u0645","\ufca0":"\u0628\u0647","\ufca1":"\u062a\u062c","\ufca2":"\u062a\u062d","\ufca3":"\u062a\u062e","\ufca4":"\u062a\u0645","\ufca5":"\u062a\u0647",
+            "\ufca6":"\u062b\u0645","\ufca7":"\u062c\u062d","\ufca8":"\u062c\u0645","\ufca9":"\u062d\u062c","\ufcaa":"\u062d\u0645","\ufcab":"\u062e\u062c","\ufcac":"\u062e\u0645","\ufcad":"\u0633\u062c","\ufcae":"\u0633\u062d","\ufcaf":"\u0633\u062e","\ufcb0":"\u0633\u0645","\ufcb1":"\u0635\u062d","\ufcb2":"\u0635\u062e","\ufcb3":"\u0635\u0645","\ufcb4":"\u0636\u062c","\ufcb5":"\u0636\u062d","\ufcb6":"\u0636\u062e","\ufcb7":"\u0636\u0645","\ufcb8":"\u0637\u062d","\ufcb9":"\u0638\u0645","\ufcba":"\u0639\u062c",
+            "\ufcbb":"\u0639\u0645","\ufcbc":"\u063a\u062c","\ufcbd":"\u063a\u0645","\ufcbe":"\u0641\u062c","\ufcbf":"\u0641\u062d","\ufcc0":"\u0641\u062e","\ufcc1":"\u0641\u0645","\ufcc2":"\u0642\u062d","\ufcc3":"\u0642\u0645","\ufcc4":"\u0643\u062c","\ufcc5":"\u0643\u062d","\ufcc6":"\u0643\u062e","\ufcc7":"\u0643\u0644","\ufcc8":"\u0643\u0645","\ufcc9":"\u0644\u062c","\ufcca":"\u0644\u062d","\ufccb":"\u0644\u062e","\ufccc":"\u0644\u0645","\ufccd":"\u0644\u0647","\ufcce":"\u0645\u062c","\ufccf":"\u0645\u062d",
+            "\ufcd0":"\u0645\u062e","\ufcd1":"\u0645\u0645","\ufcd2":"\u0646\u062c","\ufcd3":"\u0646\u062d","\ufcd4":"\u0646\u062e","\ufcd5":"\u0646\u0645","\ufcd6":"\u0646\u0647","\ufcd7":"\u0647\u062c","\ufcd8":"\u0647\u0645","\ufcd9":"\u0647\u0670","\ufcda":"\u064a\u062c","\ufcdb":"\u064a\u062d","\ufcdc":"\u064a\u062e","\ufcdd":"\u064a\u0645","\ufcde":"\u064a\u0647","\ufcdf":"\u0626\u0645","\ufce0":"\u0626\u0647","\ufce1":"\u0628\u0645","\ufce2":"\u0628\u0647","\ufce3":"\u062a\u0645","\ufce4":"\u062a\u0647",
+            "\ufce5":"\u062b\u0645","\ufce6":"\u062b\u0647","\ufce7":"\u0633\u0645","\ufce8":"\u0633\u0647","\ufce9":"\u0634\u0645","\ufcea":"\u0634\u0647","\ufceb":"\u0643\u0644","\ufcec":"\u0643\u0645","\ufced":"\u0644\u0645","\ufcee":"\u0646\u0645","\ufcef":"\u0646\u0647","\ufcf0":"\u064a\u0645","\ufcf1":"\u064a\u0647","\ufcf2":"\u0640\u064e\u0651","\ufcf3":"\u0640\u064f\u0651","\ufcf4":"\u0640\u0650\u0651","\ufcf5":"\u0637\u0649","\ufcf6":"\u0637\u064a","\ufcf7":"\u0639\u0649","\ufcf8":"\u0639\u064a","\ufcf9":"\u063a\u0649",
+            "\ufcfa":"\u063a\u064a","\ufcfb":"\u0633\u0649","\ufcfc":"\u0633\u064a","\ufcfd":"\u0634\u0649","\ufcfe":"\u0634\u064a","\ufcff":"\u062d\u0649","\ufd00":"\u062d\u064a","\ufd01":"\u062c\u0649","\ufd02":"\u062c\u064a","\ufd03":"\u062e\u0649","\ufd04":"\u062e\u064a","\ufd05":"\u0635\u0649","\ufd06":"\u0635\u064a","\ufd07":"\u0636\u0649","\ufd08":"\u0636\u064a","\ufd09":"\u0634\u062c","\ufd0a":"\u0634\u062d","\ufd0b":"\u0634\u062e","\ufd0c":"\u0634\u0645","\ufd0d":"\u0634\u0631","\ufd0e":"\u0633\u0631",
+            "\ufd0f":"\u0635\u0631","\ufd10":"\u0636\u0631","\ufd11":"\u0637\u0649","\ufd12":"\u0637\u064a","\ufd13":"\u0639\u0649","\ufd14":"\u0639\u064a","\ufd15":"\u063a\u0649","\ufd16":"\u063a\u064a","\ufd17":"\u0633\u0649","\ufd18":"\u0633\u064a","\ufd19":"\u0634\u0649","\ufd1a":"\u0634\u064a","\ufd1b":"\u062d\u0649","\ufd1c":"\u062d\u064a","\ufd1d":"\u062c\u0649","\ufd1e":"\u062c\u064a","\ufd1f":"\u062e\u0649","\ufd20":"\u062e\u064a","\ufd21":"\u0635\u0649","\ufd22":"\u0635\u064a","\ufd23":"\u0636\u0649",
+            "\ufd24":"\u0636\u064a","\ufd25":"\u0634\u062c","\ufd26":"\u0634\u062d","\ufd27":"\u0634\u062e","\ufd28":"\u0634\u0645","\ufd29":"\u0634\u0631","\ufd2a":"\u0633\u0631","\ufd2b":"\u0635\u0631","\ufd2c":"\u0636\u0631","\ufd2d":"\u0634\u062c","\ufd2e":"\u0634\u062d","\ufd2f":"\u0634\u062e","\ufd30":"\u0634\u0645","\ufd31":"\u0633\u0647","\ufd32":"\u0634\u0647","\ufd33":"\u0637\u0645","\ufd34":"\u0633\u062c","\ufd35":"\u0633\u062d","\ufd36":"\u0633\u062e","\ufd37":"\u0634\u062c","\ufd38":"\u0634\u062d",
+            "\ufd39":"\u0634\u062e","\ufd3a":"\u0637\u0645","\ufd3b":"\u0638\u0645","\ufd3c":"\u0627\u064b","\ufd3d":"\u0627\u064b","\ufd50":"\u062a\u062c\u0645","\ufd51":"\u062a\u062d\u062c","\ufd52":"\u062a\u062d\u062c","\ufd53":"\u062a\u062d\u0645","\ufd54":"\u062a\u062e\u0645","\ufd55":"\u062a\u0645\u062c","\ufd56":"\u062a\u0645\u062d","\ufd57":"\u062a\u0645\u062e","\ufd58":"\u062c\u0645\u062d","\ufd59":"\u062c\u0645\u062d","\ufd5a":"\u062d\u0645\u064a","\ufd5b":"\u062d\u0645\u0649","\ufd5c":"\u0633\u062d\u062c",
+            "\ufd5d":"\u0633\u062c\u062d","\ufd5e":"\u0633\u062c\u0649","\ufd5f":"\u0633\u0645\u062d","\ufd60":"\u0633\u0645\u062d","\ufd61":"\u0633\u0645\u062c","\ufd62":"\u0633\u0645\u0645","\ufd63":"\u0633\u0645\u0645","\ufd64":"\u0635\u062d\u062d","\ufd65":"\u0635\u062d\u062d","\ufd66":"\u0635\u0645\u0645","\ufd67":"\u0634\u062d\u0645","\ufd68":"\u0634\u062d\u0645","\ufd69":"\u0634\u062c\u064a","\ufd6a":"\u0634\u0645\u062e","\ufd6b":"\u0634\u0645\u062e","\ufd6c":"\u0634\u0645\u0645","\ufd6d":"\u0634\u0645\u0645",
+            "\ufd6e":"\u0636\u062d\u0649","\ufd6f":"\u0636\u062e\u0645","\ufd70":"\u0636\u062e\u0645","\ufd71":"\u0637\u0645\u062d","\ufd72":"\u0637\u0645\u062d","\ufd73":"\u0637\u0645\u0645","\ufd74":"\u0637\u0645\u064a","\ufd75":"\u0639\u062c\u0645","\ufd76":"\u0639\u0645\u0645","\ufd77":"\u0639\u0645\u0645","\ufd78":"\u0639\u0645\u0649","\ufd79":"\u063a\u0645\u0645","\ufd7a":"\u063a\u0645\u064a","\ufd7b":"\u063a\u0645\u0649","\ufd7c":"\u0641\u062e\u0645","\ufd7d":"\u0641\u062e\u0645","\ufd7e":"\u0642\u0645\u062d",
+            "\ufd7f":"\u0642\u0645\u0645","\ufd80":"\u0644\u062d\u0645","\ufd81":"\u0644\u062d\u064a","\ufd82":"\u0644\u062d\u0649","\ufd83":"\u0644\u062c\u062c","\ufd84":"\u0644\u062c\u062c","\ufd85":"\u0644\u062e\u0645","\ufd86":"\u0644\u062e\u0645","\ufd87":"\u0644\u0645\u062d","\ufd88":"\u0644\u0645\u062d","\ufd89":"\u0645\u062d\u062c","\ufd8a":"\u0645\u062d\u0645","\ufd8b":"\u0645\u062d\u064a","\ufd8c":"\u0645\u062c\u062d","\ufd8d":"\u0645\u062c\u0645","\ufd8e":"\u0645\u062e\u062c","\ufd8f":"\u0645\u062e\u0645",
+            "\ufd92":"\u0645\u062c\u062e","\ufd93":"\u0647\u0645\u062c","\ufd94":"\u0647\u0645\u0645","\ufd95":"\u0646\u062d\u0645","\ufd96":"\u0646\u062d\u0649","\ufd97":"\u0646\u062c\u0645","\ufd98":"\u0646\u062c\u0645","\ufd99":"\u0646\u062c\u0649","\ufd9a":"\u0646\u0645\u064a","\ufd9b":"\u0646\u0645\u0649","\ufd9c":"\u064a\u0645\u0645","\ufd9d":"\u064a\u0645\u0645","\ufd9e":"\u0628\u062e\u064a","\ufd9f":"\u062a\u062c\u064a","\ufda0":"\u062a\u062c\u0649","\ufda1":"\u062a\u062e\u064a","\ufda2":"\u062a\u062e\u0649",
+            "\ufda3":"\u062a\u0645\u064a","\ufda4":"\u062a\u0645\u0649","\ufda5":"\u062c\u0645\u064a","\ufda6":"\u062c\u062d\u0649","\ufda7":"\u062c\u0645\u0649","\ufda8":"\u0633\u062e\u0649","\ufda9":"\u0635\u062d\u064a","\ufdaa":"\u0634\u062d\u064a","\ufdab":"\u0636\u062d\u064a","\ufdac":"\u0644\u062c\u064a","\ufdad":"\u0644\u0645\u064a","\ufdae":"\u064a\u062d\u064a","\ufdaf":"\u064a\u062c\u064a","\ufdb0":"\u064a\u0645\u064a","\ufdb1":"\u0645\u0645\u064a","\ufdb2":"\u0642\u0645\u064a","\ufdb3":"\u0646\u062d\u064a",
+            "\ufdb4":"\u0642\u0645\u062d","\ufdb5":"\u0644\u062d\u0645","\ufdb6":"\u0639\u0645\u064a","\ufdb7":"\u0643\u0645\u064a","\ufdb8":"\u0646\u062c\u062d","\ufdb9":"\u0645\u062e\u064a","\ufdba":"\u0644\u062c\u0645","\ufdbb":"\u0643\u0645\u0645","\ufdbc":"\u0644\u062c\u0645","\ufdbd":"\u0646\u062c\u062d","\ufdbe":"\u062c\u062d\u064a","\ufdbf":"\u062d\u062c\u064a","\ufdc0":"\u0645\u062c\u064a","\ufdc1":"\u0641\u0645\u064a","\ufdc2":"\u0628\u062d\u064a","\ufdc3":"\u0643\u0645\u0645","\ufdc4":"\u0639\u062c\u0645",
+            "\ufdc5":"\u0635\u0645\u0645","\ufdc6":"\u0633\u062e\u064a","\ufdc7":"\u0646\u062c\u064a","\ufe49":"\u203e","\ufe4a":"\u203e","\ufe4b":"\u203e","\ufe4c":"\u203e","\ufe4d":"_","\ufe4e":"_","\ufe4f":"_","\ufe80":"\u0621","\ufe81":"\u0622","\ufe82":"\u0622","\ufe83":"\u0623","\ufe84":"\u0623","\ufe85":"\u0624","\ufe86":"\u0624","\ufe87":"\u0625","\ufe88":"\u0625","\ufe89":"\u0626","\ufe8a":"\u0626","\ufe8b":"\u0626","\ufe8c":"\u0626","\ufe8d":"\u0627","\ufe8e":"\u0627","\ufe8f":"\u0628","\ufe90":"\u0628",
+            "\ufe91":"\u0628","\ufe92":"\u0628","\ufe93":"\u0629","\ufe94":"\u0629","\ufe95":"\u062a","\ufe96":"\u062a","\ufe97":"\u062a","\ufe98":"\u062a","\ufe99":"\u062b","\ufe9a":"\u062b","\ufe9b":"\u062b","\ufe9c":"\u062b","\ufe9d":"\u062c","\ufe9e":"\u062c","\ufe9f":"\u062c","\ufea0":"\u062c","\ufea1":"\u062d","\ufea2":"\u062d","\ufea3":"\u062d","\ufea4":"\u062d","\ufea5":"\u062e","\ufea6":"\u062e","\ufea7":"\u062e","\ufea8":"\u062e","\ufea9":"\u062f","\ufeaa":"\u062f","\ufeab":"\u0630","\ufeac":"\u0630",
+            "\ufead":"\u0631","\ufeae":"\u0631","\ufeaf":"\u0632","\ufeb0":"\u0632","\ufeb1":"\u0633","\ufeb2":"\u0633","\ufeb3":"\u0633","\ufeb4":"\u0633","\ufeb5":"\u0634","\ufeb6":"\u0634","\ufeb7":"\u0634","\ufeb8":"\u0634","\ufeb9":"\u0635","\ufeba":"\u0635","\ufebb":"\u0635","\ufebc":"\u0635","\ufebd":"\u0636","\ufebe":"\u0636","\ufebf":"\u0636","\ufec0":"\u0636","\ufec1":"\u0637","\ufec2":"\u0637","\ufec3":"\u0637","\ufec4":"\u0637","\ufec5":"\u0638","\ufec6":"\u0638","\ufec7":"\u0638","\ufec8":"\u0638",
+            "\ufec9":"\u0639","\ufeca":"\u0639","\ufecb":"\u0639","\ufecc":"\u0639","\ufecd":"\u063a","\ufece":"\u063a","\ufecf":"\u063a","\ufed0":"\u063a","\ufed1":"\u0641","\ufed2":"\u0641","\ufed3":"\u0641","\ufed4":"\u0641","\ufed5":"\u0642","\ufed6":"\u0642","\ufed7":"\u0642","\ufed8":"\u0642","\ufed9":"\u0643","\ufeda":"\u0643","\ufedb":"\u0643","\ufedc":"\u0643","\ufedd":"\u0644","\ufede":"\u0644","\ufedf":"\u0644","\ufee0":"\u0644","\ufee1":"\u0645","\ufee2":"\u0645","\ufee3":"\u0645","\ufee4":"\u0645",
+            "\ufee5":"\u0646","\ufee6":"\u0646","\ufee7":"\u0646","\ufee8":"\u0646","\ufee9":"\u0647","\ufeea":"\u0647","\ufeeb":"\u0647","\ufeec":"\u0647","\ufeed":"\u0648","\ufeee":"\u0648","\ufeef":"\u0649","\ufef0":"\u0649","\ufef1":"\u064a","\ufef2":"\u064a","\ufef3":"\u064a","\ufef4":"\u064a","\ufef5":"\u0644\u0622","\ufef6":"\u0644\u0622","\ufef7":"\u0644\u0623","\ufef8":"\u0644\u0623","\ufef9":"\u0644\u0625","\ufefa":"\u0644\u0625","\ufefb":"\u0644\u0627","\ufefc":"\u0644\u0627"},tg=function(a,b,c,d,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         e,f){this.fontChar=a;this.unicode=b;this.accent=c;this.width=d;this.vmetric=e;this.operatorList=f};tg.prototype.matchesForCache=function(a,b,c,d,e,f){return this.fontChar===a&&this.unicode===b&&this.accent===c&&this.width===d&&this.vmetric===e&&this.operatorList===f};var Uc,Zd=function(a,b,c){var d;this.name=a;this.loadedName=c.loadedName;this.loadCharProcs=this.coded=c.coded;this.sizes=[];this.glyphCache={};var e=a.split("+"),e=1<e.length?e[1]:e[0];e.split(/[-,_]/g);this.isSerifFont=!!(c.flags&Qa.Serif);
+        this.isSymbolicFont=!!(c.flags&Qa.Symbolic);this.isMonospace=!!(c.flags&Qa.FixedPitch);this.type=e=c.type;this.fallbackName=this.isMonospace?"monospace":this.isSerifFont?"serif":"sans-serif";this.differences=c.differences;this.widths=c.widths;this.defaultWidth=c.defaultWidth;this.composite=c.composite;this.wideChars=c.wideChars;this.cMap=c.cMap;this.ascent=c.ascent/1E3;this.descent=c.descent/1E3;this.fontMatrix=c.fontMatrix;var f=this.buildToUnicode(c);this.toUnicode=c.toUnicode=f.toUnicode;this.isIdentityUnicode=
+            c.isIdentityUnicode=f.isIdentity;this.toFontChar=[];if("Type3"==c.type)for(d=0;256>d;d++)this.toFontChar[d]=this.differences[d]||c.defaultEncoding[d];else{this.cidEncoding=c.cidEncoding;if(this.vertical=c.vertical)this.vmetrics=c.vmetrics,this.defaultVMetrics=c.defaultVMetrics;if(b){d=c.subtype;if("Type1C"==d&&"Type1"!=e&&"MMType1"!=e){var g=b.peekBytes(4);65536===ga(g,0)?d="TrueType":e="Type1"}"CIDFontType0C"==d&&"CIDFontType0"!=e&&(e="CIDFontType0");"OpenType"===d&&(e="OpenType");var h;switch(e){case "Type1":case "CIDFontType0":this.mimetype=
+            "font/opentype";d="Type1C"==d||"CIDFontType0C"==d?new Yd(b,c):new ug(a,b,c);if(c.fontMatrix[0]!==Db[0]){var e=0.001/c.fontMatrix[0],g=c.widths,j;for(j in g)g[j]*=e;c.defaultWidth*=e}h=this.convert(a,d,c);break;case "OpenType":case "TrueType":case "CIDFontType2":this.mimetype="font/opentype";h=this.checkAndRepair(a,b,c);break;default:u("Font "+e+" is not supported")}this.data=h;this.fontMatrix=c.fontMatrix;this.widths=c.widths;this.defaultWidth=c.defaultWidth;this.encoding=c.baseEncoding;this.seacMap=
+            c.seacMap;this.loading=!0}else{this.missingFile=!0;j=a.replace(/[,_]/g,"-");b=j in Xd;j=Xd[j]||pi[j]||j;this.bold=-1!=j.search(/bold/gi);this.italic=-1!=j.search(/oblique/gi)||-1!=j.search(/italic/gi);this.black=-1!=a.search(/Black/g);this.remeasure=0<Object.keys(this.widths).length;if(b&&"CIDFontType2"===e&&0===c.cidEncoding.indexOf("Identity-")){a=[];for(g in rg)a[+g]=rg[g];this.toUnicode=this.toFontChar=a}else if(/Symbol/i.test(j))for(d in a=ta.SymbolSetEncoding,a)(c=Hb[a[d]])&&(this.toFontChar[d]=
+            c);else if(b)for(d in this.toFontChar=[],c.defaultEncoding)this.toFontChar[d]=Hb[c.differences[d]||c.defaultEncoding[d]];else for(d in this.toUnicode)this.toFontChar[d]=this.toUnicode[d].charCodeAt(0);this.loadedName=j.split("-")[0];this.loading=!1}}},vg=function(a){for(var b=0;2<=a;)a/=2,b++;a=2;for(var c=1;c<b;c++)a*=2;return a},z=function(a){return String.fromCharCode(a>>8&255,a&255)},Ib=function(a){a=32767<a?32767:-32768>a?-32768:a;return String.fromCharCode(a>>8&255,a&255)},wg=function(a,b,c){"true"==
+    a&&(a=ma(65536));a+=z(c);var d=vg(c),e=16*d;a+=z(e);a+=z(Math.log(d)/Math.log(2));a+=z(16*c-e);b.file+=a;b.virtualOffset+=a.length},xg=function(a,b,c){for(var d=a.virtualOffset,e=c.length;c.length&3;)c.push(0);for(;a.virtualOffset&3;)a.virtualOffset++;for(var f=0,g=c.length,h=0;h<g;h+=4)f=f+((c[h]<<24)+(c[h+1]<<16)+(c[h+2]<<8)+c[h+3])|0;b=b+ma(f)+ma(d)+ma(e);a.file+=b;a.virtualOffset+=c.length},yg=function(a,b){var c=b.toUnicode,d=!!(b.flags&Qa.Symbolic),e=b.isIdentityUnicode,f=Object.create(null),
+        g=[],h=[],j=57344,l;for(l in a){l|=0;var k=a[l],m=l;if(!e&&l in c){var n=c[m];1===n.length&&(m=n.charCodeAt(0))}if((m in h||31>=m||127===m||173===m||128<=m&&159>=m||d&&e)&&63743>=j){do m=j++,qg&&61440===m&&(m=61472,j=m+1);while(m in h&&63743>=j)}f[m]=k;g[l]=m;h[m]=!0}return{toFontChar:g,charCodeToGlyphId:f,nextAvailableFontCharCode:j}},zg=function(a){var b=[],c;for(c in a)b.push({fontCharCode:c|0,glyphId:a[c]});b.sort(function(a,b){return a.fontCharCode-b.fontCharCode});a=[];c=b.length;for(var d=
+        0;d<c;){var e=b[d].fontCharCode,f=[b[d].glyphId];++d;for(var g=e;d<c&&g+1==b[d].fontCharCode&&!(f.push(b[d].glyphId),++g,++d,65535===g););a.push([e,g,f])}c=65535<a[a.length-1][1]?2:1;for(var b="\x00\x00"+z(c)+"\x00\u0003\x00\u0001"+ma(4+8*c),h,j,d=a.length-1;0<=d&&!(65535>=a[d][0]);--d);e=d+1;65535>a[d][0]&&65535===a[d][1]&&(a[d][1]=65534);for(var l=65535>a[d][1]?1:0,k=e+l,m=2*k,n=2*vg(k),p=Math.log(k)/Math.log(2),q=2*k-n,s="",v="",t="",r="",u="",N=0,ea,B,d=0;d<e;d++){ea=a[d];f=ea[0];g=ea[1];s+=z(f);
+        v+=z(g);B=ea[2];ea=!0;h=1;for(j=B.length;h<j;++h)if(B[h]!==B[h-1]+1){ea=!1;break}if(ea)t+=z(B[0]-f&65535),r+=z(0);else{h=2*(k-d)+2*N;N+=g-f+1;t+=z(0);r+=z(h);h=0;for(j=B.length;h<j;++h)u+=z(B[h])}}0<l&&(v+="\u00ff\u00ff",s+="\u00ff\u00ff",t+="\x00\u0001",r+="\x00\x00");l="\x00\x00"+z(m)+z(n)+z(p)+z(q)+v+"\x00\x00"+s+t+r+u;d=k="";if(1<c){b+="\x00\u0003\x00\n"+ma(8*c+8+l.length);k="";d=0;for(e=a.length;d<e;d++){ea=a[d];f=ea[0];B=ea[2];c=B[0];h=1;for(j=B.length;h<j;++h)B[h]!==B[h-1]+1&&(g=ea[0]+h-1,
+        k+=ma(f)+ma(g)+ma(c),f=g+1,c=B[h]);k+=ma(f)+ma(ea[1])+ma(c)}d="\x00\f\x00\x00"+ma(k.length+16)+"\x00\x00\x00\x00"+ma(k.length/12)}return Aa(b+"\x00\u0004"+z(l.length+4)+l+d+k)},qi=function(a){var b=new wa(a.data),c=b.getUint16();b.getBytes(60);var d=b.getUint16();if(4>c&&d&768)return!1;c=b.getUint16();d=b.getUint16();if(c>d)return!1;b.getBytes(6);if(0===b.getUint16())return!1;a.data[8]=a.data[9]=0;return!0},Ag=function(a,b,c){c=c||{unitsPerEm:0,yMax:0,yMin:0,ascent:0,descent:0};var d=0,e=0,f=0,g=
+        0,h=null,j=0;if(b)for(var l in b){l|=0;if(h>l||!h)h=l;j<l&&(j=l);a:{b=0;for(var k=Vc.length;b<k;b++){var m=Vc[b];if(l>=m.begin&&l<m.end)break a}b=-1}32>b?d|=1<<b:64>b?e|=1<<b-32:96>b?f|=1<<b-64:123>b?g|=1<<b-96:u("Unicode ranges Bits > 123 are reserved for internal usage")}else h=0,j=255;b=a.bbox||[0,0,0,0];l=c.unitsPerEm||1/(a.fontMatrix||Db)[0];k=a.ascentScaled?1:l/1E3;l=c.ascent||Math.round(k*(a.ascent||b[3]));k=c.descent||Math.round(k*(a.descent||b[1]));0<k&&(0<a.descent&&0>b[1])&&(k=-k);b=c.yMax||
+        l;c=-c.yMin||-k;return"\x00\u0003\u0002$\u0001\u00f4\x00\u0005\x00\x00\u0002\u008a\u0002\u00bb\x00\x00\x00\u008c\u0002\u008a\u0002\u00bb\x00\x00\u0001\u00df\x001\u0001\u0002\x00\x00\x00\x00\u0006"+String.fromCharCode(a.fixedPitch?9:0)+"\x00\x00\x00\x00\x00\x00"+ma(d)+ma(e)+ma(f)+ma(g)+"*21*"+z(a.italicAngle?1:0)+z(h||a.firstChar)+z(j||a.lastChar)+z(l)+z(k)+"\x00d"+z(b)+z(c)+"\x00\x00\x00\x00\x00\x00\x00\x00"+z(a.xHeight)+z(a.capHeight)+z(0)+z(h||a.firstChar)+"\x00\u0003"},Bg=function(a){var b=Math.floor(a.italicAngle*
+        Math.pow(2,16));return"\x00\u0003\x00\x00"+ma(b)+"\x00\x00\x00\x00"+ma(a.fixedPitch)+"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"},$d=function(a,b){b||(b=[[],[]]);var c=[b[0][0]||"Original licence",b[0][1]||a,b[0][2]||"Unknown",b[0][3]||"uniqueID",b[0][4]||a,b[0][5]||"Version 0.11",b[0][6]||"",b[0][7]||"Unknown",b[0][8]||"Unknown",b[0][9]||"Unknown"],d=[],e,f,g,h,j;e=0;for(f=c.length;e<f;e++){j=b[1][e]||c[e];var l=[];g=0;for(h=j.length;g<h;g++)l.push(z(j.charCodeAt(g)));d.push(l.join(""))}var l=
+        [c,d],k=["\x00\u0001","\x00\u0003"],m=["\x00\x00","\x00\u0001"],n=["\x00\x00","\u0004\t"];e=c.length*k.length;var p="\x00\x00"+z(e)+z(12*e+6),q=0;e=0;for(f=k.length;e<f;e++){var s=l[e];g=0;for(h=s.length;g<h;g++){j=s[g];var v=k[e]+m[e]+n[e]+z(g)+z(j.length)+z(q),p=p+v,q=q+j.length}}return p+=c.join("")+d.join("")},ri=1;Zd.getFontID=function(){return String(ri++)};Zd.prototype={name:null,font:null,mimetype:null,encoding:null,get renderer(){var a=Cg.create(this);return K(this,"renderer",a)},exportData:function(){var a=
+    {},b;for(b in this)this.hasOwnProperty(b)&&(a[b]=this[b]);return a},checkAndRepair:function(a,b,c){function d(a,b,c,d,e,f){if(12>=c-b)return 0;a=a.subarray(b,c);var g=a[0]<<8|a[1];if(g&32768)return d.set(a,e),a.length;c=10;var h=0;for(b=0;b<g;b++)h=(a[c]<<8|a[c+1])+1,c+=2;var g=c,j=a[c]<<8|a[c+1],l=c+=2+j,k=0;for(b=0;b<h;b++){var m=a[c++];m&192&&(a[c-1]=m&63);var p=(m&2?1:m&16?0:2)+(m&4?1:m&32?0:2),k=k+p;m&8&&(m=a[c++],b+=m,k+=m*p)}if(0===k)return 0;b=c+k;if(b>a.length)return 0;if(!f&&0<j)return d.set(a.subarray(0,
+        g),e),d.set([0,0],e+g),d.set(a.subarray(l,b),e+g+2),b-=j,3<a.length-b&&(b=b+3&-4),b;if(3<a.length-b)return b=b+3&-4,d.set(a.subarray(0,b),e),b;d.set(a,e);return a.length}function e(a,b){for(var c=a.data,d=0,e,g,h,j=0,l=0,k=[],m=[],p=[],n=b.tooComplexToFollowFunctions,q=!1,s=0,v=0,t=c.length;d<t;){var r=c[d++];if(64===r)if(g=c[d++],q||v)d+=g;else for(e=0;e<g;e++)k.push(c[d++]);else if(65===r)if(g=c[d++],q||v)d+=2*g;else for(e=0;e<g;e++)h=c[d++],k.push(h<<8|c[d++]);else if(176===(r&248))if(g=r-176+
+            1,q||v)d+=g;else for(e=0;e<g;e++)k.push(c[d++]);else if(184===(r&248))if(g=r-184+1,q||v)d+=2*g;else for(e=0;e<g;e++)h=c[d++],k.push(h<<8|c[d++]);else if(43===r&&!n){if(!q&&!v)if(g=k[k.length-1],b.functionsUsed[g]=!0,g in b.functionsStackDeltas)k.length+=b.functionsStackDeltas[g];else if(g in b.functionsDefined&&0>p.indexOf(g)){m.push({data:c,i:d,stackTop:k.length-1});p.push(g);e=b.functionsDefined[g];if(!e){L("TT: CALL non-existent function");b.hintsValid=!1;return}c=e.data;d=e.i}}else if(44===r&&
+        !n){if(q||v)L("TT: nested FDEFs not allowed"),n=!0;q=!0;l=d;g=k.pop();b.functionsDefined[g]={data:c,i:d}}else if(45===r)if(q)q=!1,j=d;else{e=m.pop();if(!e){L("TT: ENDF bad stack");b.hintsValid=!1;return}g=p.pop();c=e.data;d=e.i;b.functionsStackDeltas[g]=k.length-e.stackTop}else if(137===r){if(q||v)L("TT: nested IDEFs not allowed"),n=!0;q=!0;l=d}else 88===r?++s:27===r?v=s:89===r?(v===s&&(v=0),--s):28===r&&(!q&&!v)&&(g=k[k.length-1],0<g&&(d+=g-1));if(!q&&!v){e=142>=r?f[r]:192<=r&&223>=r?-1:224<=r?-2:
+        0;113<=r&&117>=r&&(g=k.pop(),g===g&&(e=2*-g));for(;0>e&&0<k.length;)k.pop(),e++;for(;0<e;)k.push(NaN),e--}}b.tooComplexToFollowFunctions=n;k=[c];d>c.length&&k.push(new Uint8Array(d-c.length));l>j&&(L("TT: complementing a missing function tail"),k.push(new Uint8Array([34,45])));if(1<k.length){d=c=0;for(j=k.length;d<j;d++)c+=k[d].length;c=c+3&-4;l=new Uint8Array(c);d=m=0;for(j=k.length;d<j;d++)l.set(k[d],m),m+=k[d].length;a.data=l;a.length=c}}var f=[0,0,0,0,0,0,0,0,-2,-2,-2,-2,0,0,-2,-5,-1,-1,-1,-1,
+        -1,-1,-1,-1,0,0,-1,0,-1,-1,-1,-1,1,-1,-999,0,1,0,-1,-2,0,-1,-2,-1,-1,0,-1,-1,0,0,-999,-999,-1,-1,-1,-1,-2,-999,-2,-2,-999,0,-2,-2,0,0,-2,0,-2,0,0,0,-2,-1,-1,1,1,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,-1,0,-1,-1,0,-999,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,-2,-999,-999,-999,-999,-999,-1,-1,-2,-2,0,0,0,0,-1,-1,-999,-2,-2,0,0,-1,-2,-2,0,0,0,-1,-1,-1,-2];b=new wa(new Uint8Array(b.getBytes()));var g="OS/2;cmap;head;hhea;hmtx;maxp;name;post;loca;glyf;fpgm;prep;cvt ;CFF ".split(";"),h=La(b.getBytes(4)),j=b.getUint16();
+        b.getUint16();b.getUint16();b.getUint16();for(var l=j,k,m,n={"OS/2":null,cmap:null,head:null,hhea:null,hmtx:null,maxp:null,name:null,post:null},p,q,s=0;s<l;s++){var v=b,t=La(v.getBytes(4)),r=v.getInt32(),aa=v.getInt32()>>>0,N=v.getInt32()>>>0,ea=v.pos;v.pos=v.start?v.start:0;v.skip(aa);var B=v.getBytes(N);v.pos=ea;"head"==t&&(B[8]=B[9]=B[10]=B[11]=0,B[17]|=32);p={tag:t,checksum:r,length:N,offset:aa,data:B};0>g.indexOf(p.tag)||0!==p.length&&(n[p.tag]=p)}var F=!n["CFF "];if(F)(!n.glyf||!n.loca)&&u('Required "glyf" or "loca" tables are not found');
+        else{if(!n.head||!n.hhea||!n.maxp||!n.post)return m=new wa(n["CFF "].data),k=new Yd(m,c),this.convert(a,k,c);delete n.glyf;delete n.loca;delete n.fpgm;delete n.prep;delete n["cvt "]}n.maxp||u('Required "maxp" table is not found');b.pos=(b.start||0)+n.maxp.offset;var Sc=b.getInt32(),Fb=b.getUint16(),Tc=0;65536<=Sc&&22<=n.maxp.length&&(b.pos+=8,2<b.getUint16()&&(n.maxp.data[14]=0,n.maxp.data[15]=2),b.pos+=4,Tc=b.getUint16());var Ac=!1;"CIDFontType2"==c.type&&(c.toUnicode&&"\x00"<c.toUnicode[0])&&(Ac=
+            !0,Fb++,n.maxp.data[4]=Fb>>8,n.maxp.data[5]=Fb&255);var G,z=n.fpgm,D=n.prep,A=n["cvt "],w={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};z&&e(z,w);D&&e(D,w);if(z){var x=Tc;if(!w.tooComplexToFollowFunctions)if(w.functionsDefined.length>x)L("TT: more functions defined than expected"),w.hintsValid=!1;else for(var Q=0,mb=w.functionsUsed.length;Q<mb;Q++){if(Q>x){L("TT: invalid function id: "+Q);w.hintsValid=!1;break}if(w.functionsUsed[Q]&&!w.functionsDefined[Q]){L("TT: undefined function: "+
+            Q);w.hintsValid=!1;break}}}if(A&&A.length&1){var Ha=new Uint8Array(A.length+1);Ha.set(A.data);A.data=Ha}G=w.hintsValid;G||(delete n.fpgm,delete n.prep,delete n["cvt "]);var gb=Object.keys(n);gb.sort();var l=gb.length,O={file:"",virtualOffset:16*l};wg(h,O,l);var P=b,E=n.hhea,S=n.hmtx,K=Fb;if(E){P.pos=(P.start?P.start:0)+E.offset;P.pos+=E.length-2;var M=P.getUint16();M>K&&(R("The numOfMetrics ("+M+") should not be greater than the numGlyphs ("+K+")"),M=K,E.data[34]=(M&65280)>>8,E.data[35]=M&255);var Y=
+            K-M-(S.length-4*M>>1),U,C;if(0<Y){P.pos=(P.start?P.start:0)+S.offset;var fa="";U=0;for(C=S.length;U<C;U++)fa+=String.fromCharCode(P.getByte());for(U=0;U<Y;U++)fa+="\x00\x00";S.data=Aa(fa)}}else S&&(S.data=null);n.head||u('Required "head" table is not found');var Z=Fb,ga=F?n.loca.length:0,I=n.head.data,J=(I[0]<<24)+(I[1]<<16)+(I[2]<<8)+I[3];1!==J>>16&&(R("Attempting to fix invalid version in head table: "+J),I[0]=0,I[1]=1,I[2]=0,I[3]=0);var T=(I[50]<<8)+I[51];if(0>T||1<T){R("Attempting to fix invalid indexToLocFormat in head table: "+
+            T);var wc=Z+1;ga===wc<<1?(I[50]=0,I[51]=0):ga===wc<<2?(I[50]=0,I[51]=1):L("Could not fix indexToLocFormat: "+T)}if(F){var da=n.loca,V=n.glyf,qa=Fb,ma=Ac,y,ha,la;(n.head.data[50]<<8)+n.head.data[51]?(y=4,ha=function(a,b){return a[b]<<24|a[b+1]<<16|a[b+2]<<8|a[b+3]},la=function(a,b,c){a[b]=c>>>24&255;a[b+1]=c>>16&255;a[b+2]=c>>8&255;a[b+3]=c&255}):(y=2,ha=function(a,b){return a[b]<<9|a[b+1]<<1},la=function(a,b,c){a[b]=c>>9&255;a[b+1]=c>>1&255});var W=da.data,Sb=y*(1+qa);W.length!==Sb&&(W=new Uint8Array(Sb),
+            W.set(da.data.subarray(0,Sb)),da.data=W);var ia=V.data,ua=ia.length,oa=new Uint8Array(ua),na=ha(W,0),ba=0;la(W,0,ba);var ka,H;ka=0;for(H=y;ka<qa;ka++,H+=y){var X=ha(W,H);X>ua&&(ua+3&-4)===X&&(X=ua);if(!(X>ua))var Fa=d(ia,na,X,oa,ba,G),ba=ba+Fa;la(W,H,ba);na=X}if(0===ba){var sa=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);ka=0;for(H=y;ka<qa;ka++,H+=y)la(W,H,sa.length);V.data=sa}else if(ma){var ca=ha(W,y);oa.length>ca+ba?V.data=oa.subarray(0,ca+ba):(V.data=new Uint8Array(ca+ba),V.data.set(oa.subarray(0,
+            ba)));V.data.set(oa.subarray(0,ca),ba);la(da.data,W.length-y,ba+ca)}else V.data=oa.subarray(0,ba)}n.hhea||u('Required "hhea" table is not found');0===n.hhea.data[10]&&0===n.hhea.data[11]&&(n.hhea.data[10]=255,n.hhea.data[11]=255);var ra;if(ra=n.post){var ya=n.post,xa=Fb,Ea=(b.start?b.start:0)+ya.offset;b.pos=Ea;var Ia=Ea+ya.length,Ga=b.getInt32();b.getBytes(28);var Za,Ja=!0,pa;switch(Ga){case 65536:Za=sg;break;case 131072:var za=b.getUint16();if(za!=xa){Ja=!1;break}var Ba=[];for(pa=0;pa<za;++pa){var Qa=
+            b.getUint16();if(32768<=Qa){Ja=!1;break}Ba.push(Qa)}if(!Ja)break;for(var db=[];b.pos<Ia;){var Ya=b.getByte(),xc="";for(pa=0;pa<Ya;++pa)xc+=String.fromCharCode(b.getByte());db.push(xc)}Za=[];for(pa=0;pa<za;++pa){var Pa=Ba[pa];258>Pa?Za.push(sg[Pa]):Za.push(db[Pa-258])}break;case 196608:break;default:L("Unknown/unsupported post table version "+Ga),Ja=!1}c.glyphNames=Za;ra=!Ja}ra&&(n.post=null);var Qb=[],va;if("CIDFontType2"==c.type){var Ra=c.cidToGidMap||[],$b=c.cMap.map;for(va in $b){va|=0;var Ca=
+            $b[va];$(1===Ca.length,"Max size of CID is 65,535");var Ca=Ca.charCodeAt(0),nb=-1;0===Ra.length?nb=va:Ca in Ra&&(nb=Ra[Ca]);0<=nb&&nb<Fb&&(Qb[va]=nb)}Ac&&(Qb[0]=Fb-1)}else{var ac;var ja=b,Fc=this.isSymbolicFont,Sa,wb=(ja.start?ja.start:0)+n.cmap.offset;ja.pos=wb;ja.getUint16();for(var Ma=ja.getUint16(),hc,Na=!1,$a=0;$a<Ma;$a++){var Gb=ja.getUint16(),Xa=ja.getUint16(),jb=ja.getInt32()>>>0,cb=!1;1==Gb&&0===Xa?cb=!0:!Fc&&3===Gb&&1===Xa?Na=cb=!0:Fc&&(3===Gb&&0===Xa)&&(Na=cb=!0);cb&&(hc={platformId:Gb,
+            encodingId:Xa,offset:jb});if(Na)break}if(hc){ja.pos=wb+hc.offset;var eb=ja.getUint16();ja.getUint16();ja.getUint16();var sb=!1,Ua=[],Ka,Rb;if(0===eb){for(Ka=0;256>Ka;Ka++){var kb=ja.getByte();kb&&Ua.push({charCode:Ka,glyphId:kb})}sb=!0}else if(4===eb){var Oa=ja.getUint16()>>1;ja.getBytes(6);var Da,fb=[];for(Da=0;Da<Oa;Da++)fb.push({end:ja.getUint16()});ja.getUint16();for(Da=0;Da<Oa;Da++)fb[Da].start=ja.getUint16();for(Da=0;Da<Oa;Da++)fb[Da].delta=ja.getUint16();var hb=0;for(Da=0;Da<Oa;Da++){Sa=fb[Da];
+            var Ab=ja.getUint16();if(Ab){var Wa=(Ab>>1)-(Oa-Da);Sa.offsetIndex=Wa;hb=Math.max(hb,Wa+Sa.end-Sa.start+1)}else Sa.offsetIndex=-1}var Cb=[];for(Ka=0;Ka<hb;Ka++)Cb.push(ja.getUint16());for(Da=0;Da<Oa;Da++){Sa=fb[Da];var wb=Sa.start,Db=Sa.end,Nb=Sa.delta,Wa=Sa.offsetIndex;for(Ka=wb;Ka<=Db;Ka++)65535!=Ka&&(Rb=0>Wa?Ka:Cb[Wa+Ka-wb],Rb=Rb+Nb&65535,0!==Rb&&Ua.push({charCode:Ka,glyphId:Rb}))}}else if(6==eb){var Kb=ja.getUint16(),ub=ja.getUint16();for(Ka=0;Ka<ub;Ka++)Rb=ja.getUint16(),Ua.push({charCode:Kb+
+        Ka,glyphId:Rb})}else u("cmap table has unsupported format: "+eb);Ua.sort(function(a,b){return a.charCode-b.charCode});for($a=1;$a<Ua.length;$a++)Ua[$a-1].charCode===Ua[$a].charCode&&(Ua.splice($a,1),$a--);ac={platformId:hc.platformId,encodingId:hc.encodingId,mappings:Ua,hasShortCmap:sb}}else L("Could not find a preferred cmap table."),ac=[];var $c=ac.platformId,pb=ac.encodingId,Vb=ac.mappings,vb=Vb.length;if((c.differences.length||c.baseEncodingName)&&(3===$c&&1===pb||1===$c&&0===pb)){var cc=[];if("MacRomanEncoding"===
+            c.baseEncodingName||"WinAnsiEncoding"===c.baseEncodingName)cc=ta[c.baseEncodingName];for(va=0;256>va;va++){var ad;if(ad=this.differences&&va in this.differences?this.differences[va]:va in cc&&""!==cc[va]?cc[va]:ta.StandardEncoding[va]){var Va;3===$c&&1===pb?Va=Hb[ad]:1===$c&&0===pb&&(Va=ta.MacRomanEncoding.indexOf(ad));for(var xb=!1,s=0;s<vb;++s)if(Vb[s].charCode===Va){Qb[va]=Vb[s].glyphId;xb=!0;break}!xb&&c.glyphNames&&(nb=c.glyphNames.indexOf(ad),0<nb&&(Qb[va]=nb))}}}else for(s=0;s<vb;++s)va=Vb[s].charCode&
+            255,Qb[va]=Vb[s].glyphId}0===Qb.length&&(Qb[0]=0);var Lb=yg(Qb,c);this.toFontChar=Lb.toFontChar;n.cmap={tag:"cmap",data:zg(Lb.charCodeToGlyphId)};if(!n["OS/2"]||!qi(n["OS/2"]))n["OS/2"]={tag:"OS/2",data:Aa(Ag(c,Lb.charCodeToGlyphId,{unitsPerEm:(n.head.data[18]<<8)+n.head.data[19],yMax:(n.head.data[42]<<8)+n.head.data[43],yMin:(n.head.data[38]<<8)+n.head.data[39]-65536,ascent:(n.hhea.data[4]<<8)+n.hhea.data[5],descent:(n.hhea.data[6]<<8)+n.hhea.data[7]-65536}))};n.post||(n.post={tag:"post",data:Aa(Bg(c))});
+        if(!F)try{m=new wa(n["CFF "].data);k=(new bd(m,c)).parse();var yb=new cd(k);n["CFF "].data=yb.compile()}catch(dc){L("Failed to compile font "+c.loadedName)}if(n.name){var Ib=n.name,Bb=(b.start?b.start:0)+Ib.offset;b.pos=Bb;var Wb=[[],[]],lb=Ib.length,Ob=Bb+lb;if(!(0!==b.getUint16()||6>lb)){var tb=b.getUint16(),Eb=b.getUint16(),zc=[],ib,Pb;for(ib=0;ib<tb&&b.pos+12<=Ob;ib++){var ec={platform:b.getUint16(),encoding:b.getUint16(),language:b.getUint16(),name:b.getUint16(),length:b.getUint16(),offset:b.getUint16()};
+            (1==ec.platform&&0===ec.encoding&&0===ec.language||3==ec.platform&&1==ec.encoding&&1033==ec.language)&&zc.push(ec)}ib=0;for(Pb=zc.length;ib<Pb;ib++){var lc=zc[ib],ob=Bb+Eb+lc.offset;if(!(ob+lc.length>Ob)){b.pos=ob;var mc=lc.name;if(lc.encoding){for(var qb="",Mb=0,ab=lc.length;Mb<ab;Mb+=2)qb+=String.fromCharCode(b.getUint16());Wb[1][mc]=qb}else Wb[0][mc]=La(b.getBytes(lc.length))}}}n.name.data=Aa($d(a,Wb))}else n.name={tag:"name",data:Aa($d(this.name))};for(s=0;s<l;s++){p=n[gb[s]];var rb=[];q=p.data;
+            for(var bb=0,zb=q.length;bb<zb;bb++)rb.push(q[bb]);xg(O,p.tag,rb)}for(s=0;s<l;s++){p=n[gb[s]];q=p.data;for(O.file+=La(new Uint8Array(q));O.file.length&3;)O.file+=String.fromCharCode(0)}return Aa(O.file)},convert:function(a,b,c){function d(a,b,c){for(var d in a)if(b===a[d])return d|0;return c?(g.charCodeToGlyphId[g.nextAvailableFontCharCode]=b,g.nextAvailableFontCharCode++):null}var e={file:"",virtualOffset:144};wg("OTTO",e,9);c.fixedPitch=!1;var f=b.getGlyphMapping(c),g=yg(f,c);this.toFontChar=g.toFontChar;
+        var h=b.numGlyphs,j=b.seacs;if(Zc&&j&&j.length){var l=c.fontMatrix||Db,k=b.getCharset(),m=Object.create(null),n;for(n in j){n|=0;var p=j[n],q=ta.StandardEncoding[p[3]],s=k.indexOf(ta.StandardEncoding[p[2]]),q=k.indexOf(q);if(!(0>s||0>q)){var p={x:p[0]*l[0]+p[1]*l[2]+l[4],y:p[0]*l[1]+p[1]*l[3]+l[5]},v=d(f,n);if(null!==v){var t=g.charCodeToGlyphId,s=d(t,s,!0),q=d(t,q,!0);m[v]={baseFontCharCode:s,accentFontCharCode:q,accentOffset:p}}}}c.seacMap=m}k=1/(c.fontMatrix||Db)[0];f=b.data;j=Aa(Ag(c,g.charCodeToGlyphId));
+        l=zg(g.charCodeToGlyphId);k=Aa("\x00\u0001\x00\x00\x00\x00\u0010\x00\x00\x00\x00\x00_\u000f<\u00f5\x00\x00"+Ib(k)+"\x00\x00\x00\x00\u009e\x0B~'\x00\x00\x00\x00\u009e\x0B~'\x00\x00"+Ib(c.descent)+"\u000f\u00ff"+Ib(c.ascent)+z(c.italicAngle?2:0)+"\x00\u0011\x00\x00\x00\x00\x00\x00");m=Aa("\x00\u0001\x00\x00"+Ib(c.ascent)+Ib(c.descent)+"\x00\x00\u00ff\u00ff\x00\x00\x00\x00\x00\x00"+Ib(c.capHeight)+Ib(Math.tan(c.italicAngle)*c.xHeight)+"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+z(h));b=b.charstrings;
+        n="\x00\x00\x00\x00";for(s=1;s<h;s++)q=b?b[s-1]:{},n+=z("width"in q?q.width:0)+z(0);b=Aa(n);a={"CFF ":f,"OS/2":j,cmap:l,head:k,hhea:m,hmtx:b,maxp:Aa("\x00\x00P\x00"+z(h)),name:Aa($d(a)),post:Aa(Bg(c))};for(var r in a)xg(e,r,a[r]);for(r in a)e.file+=La(new Uint8Array(a[r]));return Aa(e.file)},buildToUnicode:function(a){var b={isIdentity:!1,toUnicode:null};if(a.toUnicode&&0!==a.toUnicode.length)return b.toUnicode=a.toUnicode,b;var c,d;if(!a.composite){c=[];var e=a.defaultEncoding.slice();a=a.differences;
+        for(d in a)e[d]=a[d];for(d in e)if(a=e[d],""===a||!(a in Hb)){var f;if(3===a.length&&"G"===a[0]&&(f=parseInt(a.substr(1),16)))c[d]=String.fromCharCode(f);if(3<=a.length&&"C"===a[0]&&(f=+a.substr(1)))c[d]=String.fromCharCode(f)}else c[d]=String.fromCharCode(Hb[a]);b.toUnicode=c;return b}if(a.composite&&(a.cMap.builtInCMap&&!(a.cMap instanceof Xc)||"Adobe"===a.cidSystemInfo.registry&&("GB1"===a.cidSystemInfo.ordering||"CNS1"===a.cidSystemInfo.ordering||"Japan1"===a.cidSystemInfo.ordering||"Korea1"===
+        a.cidSystemInfo.ordering))){c=new pa(a.cidSystemInfo.registry+"-"+a.cidSystemInfo.ordering+"-UCS2");e=Tb.create(c,{url:PDFJS.cMapUrl,packed:PDFJS.cMapPacked},null);a=a.cMap;c=[];for(d in a.map)f=a.map[d],$(1===f.length,"Max size of CID is 65,535"),(f=e.map[f.charCodeAt(0)])&&(c[d]=String.fromCharCode((f.charCodeAt(0)<<8)+f.charCodeAt(1)));b.toUnicode=c;return b}c=[];d=a.lastChar;for(a=a.firstChar;a<=d;a++)c[a]=String.fromCharCode(a);b.isIdentity=!0;b.toUnicode=c;return b},get spaceWidth(){if("_shadowWidth"in
+        this)return this._shadowWidth;for(var a=["space","minus","one","i"],b,c=0,d=a.length;c<d;c++){b=a[c];if(b in this.widths){b=this.widths[b];break}b=Hb[b];var e=0;this.composite&&b in this.cMap.map&&(e=this.cMap.lookup(b).charCodeAt(0));!e&&"toUnicode"in this&&(e=this.toUnicode.indexOf(b));0>=e&&(e=b);if(b=this.widths[e])break}return this._shadowWidth=b=b||this.defaultWidth},charToGlyph:function(a){var b,c,d,e=a;this.cMap&&a in this.cMap.map&&(e=this.cMap.map[a].charCodeAt(0));c=this.widths[e];c=lb(c)?
+        c:this.defaultWidth;var e=this.vmetrics&&this.vmetrics[e],f=this.toUnicode[a]||a;"number"===typeof f&&(f=String.fromCharCode(f));b=this.toFontChar[a]||a;this.missingFile&&(b=Rh(b));"Type3"===this.type&&(d=this.charProcOperatorList[b]);var g=null;this.seacMap&&this.seacMap[a]&&(g=this.seacMap[a],b=g.baseFontCharCode,g={fontChar:String.fromCharCode(g.accentFontCharCode),offset:g.accentOffset});b=String.fromCharCode(b);var h=this.glyphCache[a];if(!h||!h.matchesForCache(b,f,g,c,e,d))h=new tg(b,f,g,c,
+        e,d),this.glyphCache[a]=h;return h},charsToGlyphs:function(a){var b=this.charsCache,c,d,e;if(b&&(c=b[a]))return c;b||(b=this.charsCache=Object.create(null));c=[];var f=0,g;if(this.cMap)for(;f<a.length;)d=this.cMap.readCharCode(a,f),e=d[0],g=d[1],f+=g,d=this.charToGlyph(e),c.push(d),1===g&&32===a.charCodeAt(f-1)&&c.push(null);else{f=0;for(g=a.length;f<g;++f)e=a.charCodeAt(f),d=this.charToGlyph(e),c.push(d),32==e&&c.push(null)}return b[a]=c}};Uc=Zd;var Ud,Dg=function(a){this.error=a};Dg.prototype={charsToGlyphs:function(){return[]},
+        exportData:function(){return{error:this.error}}};Ud=Dg;var Eg=function(){this.lsb=this.width=0;this.flexing=!1;this.output=[];this.stack=[]},si=[4],ti=[5],ui=[6],vi=[7],wi=[8],xi=[12,35],ae=[14],Fg=[21],Gg=[22],yi=[30],zi=[31];Eg.prototype={convert:function(a,b){for(var c=a.length,d=!1,e,f=0;f<c;f++)if(e=a[f],32>e){12===e&&(e=(e<<8)+a[++f]);switch(e){case 1:this.stack=[];break;case 3:this.stack=[];break;case 4:if(this.flexing){if(1>this.stack.length){d=!0;break}e=this.stack.pop();this.stack.push(0,
+        e);break}d=this.executeCommand(1,si);break;case 5:d=this.executeCommand(2,ti);break;case 6:d=this.executeCommand(1,ui);break;case 7:d=this.executeCommand(1,vi);break;case 8:d=this.executeCommand(6,wi);break;case 9:this.stack=[];break;case 10:if(1>this.stack.length){d=!0;break}e=this.stack.pop();d=this.convert(b[e],b);break;case 11:return d;case 13:if(2>this.stack.length){d=!0;break}d=this.stack.pop();this.lsb=e=this.stack.pop();this.width=d;this.stack.push(e);d=this.executeCommand(1,Gg);break;case 14:this.output.push(ae[0]);
+        break;case 21:if(this.flexing)break;d=this.executeCommand(2,Fg);break;case 22:if(this.flexing){this.stack.push(0);break}d=this.executeCommand(1,Gg);break;case 30:d=this.executeCommand(4,yi);break;case 31:d=this.executeCommand(4,zi);break;case 3072:this.stack=[];break;case 3073:this.stack=[];break;case 3074:this.stack=[];break;case 3078:Zc?(this.seac=this.stack.splice(-4,4),d=this.executeCommand(0,ae)):d=this.executeCommand(4,ae);break;case 3079:if(4>this.stack.length){d=!0;break}this.stack.pop();
+        var d=this.stack.pop(),g=this.stack.pop();this.lsb=e=this.stack.pop();this.width=d;this.stack.push(e,g);d=this.executeCommand(2,Fg);break;case 3084:if(2>this.stack.length){d=!0;break}e=this.stack.pop();g=this.stack.pop();this.stack.push(g/e);break;case 3088:if(2>this.stack.length){d=!0;break}e=this.stack.pop();g=this.stack.pop();0===e&&3===g?(e=this.stack.splice(this.stack.length-17,17),this.stack.push(e[2]+e[0],e[3]+e[1],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14]),d=this.executeCommand(13,
+        xi,!0),this.flexing=!1,this.stack.push(e[15],e[16])):1===e&&0===g&&(this.flexing=!0);break;case 3089:break;case 3105:this.stack=[];break;default:L('Unknown type 1 charstring command of "'+e+'"')}if(d)break}else e=246>=e?e-139:250>=e?256*(e-247)+a[++f]+108:254>=e?-(256*(e-251))-a[++f]-108:(a[++f]&255)<<24|(a[++f]&255)<<16|(a[++f]&255)<<8|(a[++f]&255)<<0,this.stack.push(e);return d},executeCommand:function(a,b,c){var d=this.stack.length;if(a>d)return!0;for(var e=d-a,f=e;f<d;f++){var g=this.stack[f];
+        g===(g|0)?this.output.push(28,g>>8&255,g&255):(g=65536*g|0,this.output.push(255,g>>24&255,g>>16&255,g>>8&255,g&255))}this.output.push.apply(this.output,b);c?this.stack.splice(e,a):this.stack.length=0;return!1}};var Mb=function(a){return 48<=a&&57>=a||65<=a&&70>=a||97<=a&&102>=a},be=function(a,b,c){b|=0;for(var d=a.length,e=new Uint8Array(d),f=0;f<d;f++){var g=a[f];e[f]=g^b>>8;b=52845*(g+b)+22719&65535}return Array.prototype.slice.call(e,c)},Hg=function(a){return 47===a||91===a||93===a||123===a||125===
+        a||40===a||41===a},ce=function(a,b){if(b){var c=a.getBytes(),d=!(Mb(c[0])&&Mb(c[1])&&Mb(c[2])&&Mb(c[3])),e=wa;if(d)c=be(c,Ig,4);else{var d=Ig|0,f=c.length,g=new Uint8Array(f>>>1),h,j;for(j=h=0;h<f;h++){var l=c[h];if(Mb(l)){h++;for(var k;h<f&&!Mb(k=c[h]);)h++;h<f&&(l=parseInt(String.fromCharCode(l,k),16),g[j++]=l^d>>8,d=52845*(l+d)+22719&65535)}}c=Array.prototype.slice.call(g,4,j)}a=new e(c)}this.stream=a;this.nextChar()},Ig=55665;ce.prototype={readNumberArray:function(){this.getToken();for(var a=
+        [];;){var b=this.getToken();if(null===b||"]"===b||"}"===b)break;a.push(parseFloat(b||0))}return a},readNumber:function(){var a=this.getToken();return parseFloat(a||0)},readInt:function(){var a=this.getToken();return parseInt(a||0,10)|0},readBoolean:function(){return"true"===this.getToken()?1:0},nextChar:function(){return this.currentChar=this.stream.getByte()},getToken:function(){for(var a=!1,b=this.currentChar;;){if(-1===b)return null;if(a){if(10===b||13===b)a=!1}else if(37===b)a=!0;else if(!ca.isSpace(b))break;
+        b=this.nextChar()}if(Hg(b))return this.nextChar(),String.fromCharCode(b);a="";do a+=String.fromCharCode(b),b=this.nextChar();while(0<=b&&!ca.isSpace(b)&&!Hg(b));return a},extractFontProgram:function(){for(var a=this.stream,b=[],c=[],d={subrs:[],charstrings:[],properties:{privateData:{lenIV:4}}},e,f,g;null!==(e=this.getToken());)if("/"===e)switch(e=this.getToken(),e){case "CharStrings":this.getToken();this.getToken();this.getToken();for(this.getToken();;){e=this.getToken();if(null===e||"end"===e)break;
+        if("/"===e){var h=this.getToken();e=this.readInt();this.getToken();f=a.makeSubStream(a.pos,e);g=d.properties.privateData.lenIV;f=be(f.getBytes(),4330,g);a.skip(e);this.nextChar();e=this.getToken();"noaccess"===e&&this.getToken();c.push({glyph:h,encoded:f})}}break;case "Subrs":this.readInt();for(this.getToken();"dup"===this.getToken();)h=this.readInt(),e=this.readInt(),this.getToken(),f=a.makeSubStream(a.pos,e),g=d.properties.privateData.lenIV,f=be(f.getBytes(),4330,g),a.skip(e),this.nextChar(),e=
+        this.getToken(),"noaccess"===e&&this.getToken(),b[h]=f;break;case "BlueValues":case "OtherBlues":case "FamilyBlues":case "FamilyOtherBlues":this.readNumberArray();break;case "StemSnapH":case "StemSnapV":d.properties.privateData[e]=this.readNumberArray();break;case "StdHW":case "StdVW":d.properties.privateData[e]=this.readNumberArray()[0];break;case "BlueShift":case "lenIV":case "BlueFuzz":case "BlueScale":case "LanguageGroup":case "ExpansionFactor":d.properties.privateData[e]=this.readNumber();break;
+        case "ForceBold":d.properties.privateData[e]=this.readBoolean()}for(a=0;a<c.length;a++)h=c[a].glyph,f=c[a].encoded,e=new Eg,f=e.convert(f,b),g=e.output,f&&(g=[14]),d.charstrings.push({glyphName:h,charstring:g,width:e.width,lsb:e.lsb,seac:e.seac});return d},extractFontHeader:function(a){for(var b;null!==(b=this.getToken());)if("/"===b)switch(b=this.getToken(),b){case "FontMatrix":var c=this.readNumberArray();a.fontMatrix=c;break;case "Encoding":var d=this.getToken();if(/^\d+$/.test(d)){c=[];d=parseInt(d,
+            10)|0;this.getToken();for(var e=0;e<d;e++){for(b=this.getToken();"dup"!==b&&"def"!==b;)if(b=this.getToken(),null===b)return;if("def"===b)break;b=this.readInt();this.getToken();var f=this.getToken();c[b]=f;this.getToken()}}else c=ta[d];a.builtInEncoding=c;break;case "FontBBox":c=this.readNumberArray(),a.ascent=c[3],a.descent=c[1],a.ascentScaled=!0}}};var de=".notdef space exclam quotedbl numbersign dollar percent ampersand quoteright parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde exclamdown cent sterling fraction yen florin section currency quotesingle quotedblleft guillemotleft guilsinglleft guilsinglright fi fl endash dagger daggerdbl periodcentered paragraph bullet quotesinglbase quotedblbase quotedblright guillemotright ellipsis perthousand questiondown grave acute circumflex tilde macron breve dotaccent dieresis ring cedilla hungarumlaut ogonek caron emdash AE ordfeminine Lslash Oslash OE ordmasculine ae dotlessi lslash oslash oe germandbls onesuperior logicalnot mu trademark Eth onehalf plusminus Thorn onequarter divide brokenbar degree thorn threequarters twosuperior registered minus eth multiply threesuperior copyright Aacute Acircumflex Adieresis Agrave Aring Atilde Ccedilla Eacute Ecircumflex Edieresis Egrave Iacute Icircumflex Idieresis Igrave Ntilde Oacute Ocircumflex Odieresis Ograve Otilde Scaron Uacute Ucircumflex Udieresis Ugrave Yacute Ydieresis Zcaron aacute acircumflex adieresis agrave aring atilde ccedilla eacute ecircumflex edieresis egrave iacute icircumflex idieresis igrave ntilde oacute ocircumflex odieresis ograve otilde scaron uacute ucircumflex udieresis ugrave yacute ydieresis zcaron exclamsmall Hungarumlautsmall dollaroldstyle dollarsuperior ampersandsmall Acutesmall parenleftsuperior parenrightsuperior twodotenleader onedotenleader zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyle commasuperior threequartersemdash periodsuperior questionsmall asuperior bsuperior centsuperior dsuperior esuperior isuperior lsuperior msuperior nsuperior osuperior rsuperior ssuperior tsuperior ff ffi ffl parenleftinferior parenrightinferior Circumflexsmall hyphensuperior Gravesmall Asmall Bsmall Csmall Dsmall Esmall Fsmall Gsmall Hsmall Ismall Jsmall Ksmall Lsmall Msmall Nsmall Osmall Psmall Qsmall Rsmall Ssmall Tsmall Usmall Vsmall Wsmall Xsmall Ysmall Zsmall colonmonetary onefitted rupiah Tildesmall exclamdownsmall centoldstyle Lslashsmall Scaronsmall Zcaronsmall Dieresissmall Brevesmall Caronsmall Dotaccentsmall Macronsmall figuredash hypheninferior Ogoneksmall Ringsmall Cedillasmall questiondownsmall oneeighth threeeighths fiveeighths seveneighths onethird twothirds zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperior zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferior centinferior dollarinferior periodinferior commainferior Agravesmall Aacutesmall Acircumflexsmall Atildesmall Adieresissmall Aringsmall AEsmall Ccedillasmall Egravesmall Eacutesmall Ecircumflexsmall Edieresissmall Igravesmall Iacutesmall Icircumflexsmall Idieresissmall Ethsmall Ntildesmall Ogravesmall Oacutesmall Ocircumflexsmall Otildesmall Odieresissmall OEsmall Oslashsmall Ugravesmall Uacutesmall Ucircumflexsmall Udieresissmall Yacutesmall Thornsmall Ydieresissmall 001.000 001.001 001.002 001.003 Black Bold Book Light Medium Regular Roman Semibold".split(" "),
+        ug=function(a,b,c){var d=c.length1,e=c.length2,f=b.peekBytes(6),g=128==f[0]&&1==f[1];g&&(b.skip(6),d=f[5]<<24|f[4]<<16|f[3]<<8|f[2]);d=new wa(b.getBytes(d));(new ce(d)).extractFontHeader(c);g&&(f=b.getBytes(6),e=f[5]<<24|f[4]<<16|f[3]<<8|f[2]);b=new wa(b.getBytes(e));b=(new ce(b,!0)).extractFontProgram();for(var h in b.properties)c[h]=b.properties[h];h=b.charstrings;e=this.getType2Charstrings(h);g=this.getType2Subrs(b.subrs);this.charstrings=h;this.data=this.wrap(a,e,this.charstrings,g,c);this.seacs=
+            this.getSeacs(b.charstrings)};ug.prototype={get numGlyphs(){return this.charstrings.length+1},getCharset:function(){for(var a=[".notdef"],b=this.charstrings,c=0;c<b.length;c++)a.push(b[c].glyphName);return a},getGlyphMapping:function(a){var b=this.charstrings,c=[".notdef"],d;for(d=0;d<b.length;d++)c.push(b[d].glyphName);if(b=a.builtInEncoding){var e={},f;for(f in b)d=c.indexOf(b[f]),0<=d&&(e[f]=d)}return Ce(a,e,c)},getSeacs:function(a){var b,c,d=[];b=0;for(c=a.length;b<c;b++){var e=a[b];e.seac&&(d[b+
+    1]=e.seac)}return d},getType2Charstrings:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c].charstring);return b},getType2Subrs:function(a){var b=0,c=a.length,b=1133>c?107:33769>c?1131:32768,d=[],e;for(e=0;e<b;e++)d.push([11]);for(e=0;e<c;e++)d.push(a[e]);return d},wrap:function(a,b,c,d,e){var f=new ee;f.header=new fe(1,0,4,4);f.names=[a];var g=new dd;g.setByName("version",391);g.setByName("Notice",392);g.setByName("FullName",393);g.setByName("FamilyName",394);g.setByName("Weight",395);g.setByName("Encoding",
+        null);g.setByName("FontMatrix",e.fontMatrix);g.setByName("FontBBox",e.bbox);g.setByName("charset",null);g.setByName("CharStrings",null);g.setByName("Private",null);f.topDict=g;g=new ed;g.add("Version 0.11");g.add("See original notice");g.add(a);g.add(a);g.add("Medium");f.strings=g;f.globalSubrIndex=new Ab;var g=b.length,h=[0];for(a=0;a<g;a++){var j=de.indexOf(c[a].glyphName);-1==j&&(j=0);h.push(j>>8&255,j&255)}f.charset=new fc(!1,0,[],h);c=new Ab;c.add([139,14]);for(a=0;a<g;a++)c.add(b[a]);f.charStrings=
+        c;c=new fd;c.setByName("Subrs",null);g="BlueValues OtherBlues FamilyBlues FamilyOtherBlues StemSnapH StemSnapV BlueShift BlueFuzz BlueScale LanguageGroup ExpansionFactor ForceBold StdHW StdVW".split(" ");a=0;for(b=g.length;a<b;a++)if(h=g[a],e.privateData.hasOwnProperty(h)){j=e.privateData[h];if(I(j))for(var l=j.length-1;0<l;l--)j[l]-=j[l-1];c.setByName(h,j)}f.topDict.privateDict=c;e=new Ab;a=0;for(b=d.length;a<b;a++)e.add(d[a]);c.subrsIndex=e;return(new cd(f)).compile()}};var Yd,Jg=function(a,b){this.properties=
+        b;this.cff=(new bd(a,b)).parse();var c=new cd(this.cff);this.seacs=this.cff.seacs;try{this.data=c.compile()}catch(d){L("Failed to compile font "+b.loadedName),this.data=a}};Jg.prototype={get numGlyphs(){return this.cff.charStrings.count},getCharset:function(){return this.cff.charset.charset},getGlyphMapping:function(){var a=this.cff,b=this.properties,c=a.charset.charset,d,e;if(b.composite){d=Object.create(null);if(a.isCIDFont)for(e=0;e<c.length;e++)a=String.fromCharCode(c[e]),a=b.cMap.map.indexOf(a),
+        d[a]=e;else for(e=0;e<a.charStrings.count;e++)d[e]=e;return d}return d=Ce(b,a.encoding?a.encoding.encoding:null,c)}};Yd=Jg;var bd,Kg=function(a,b){this.bytes=a.getBytes();this.properties=b},Ai=[null,{id:"hstem",min:2,resetStack:!0,stem:!0},null,{id:"vstem",min:2,resetStack:!0,stem:!0},{id:"vmoveto",min:1,resetStack:!0},{id:"rlineto",min:2,resetStack:!0},{id:"hlineto",min:1,resetStack:!0},{id:"vlineto",min:1,resetStack:!0},{id:"rrcurveto",min:6,resetStack:!0},null,{id:"callsubr",min:1,undefStack:!0},
+        {id:"return",min:0,undefStack:!0},null,null,null,null,null,null,{id:"hstemhm",min:2,resetStack:!0,stem:!0},null,null,{id:"rmoveto",min:2,resetStack:!0},{id:"hmoveto",min:1,resetStack:!0},{id:"vstemhm",min:2,resetStack:!0,stem:!0},{id:"rcurveline",min:8,resetStack:!0},{id:"rlinecurve",min:8,resetStack:!0},{id:"vvcurveto",min:4,resetStack:!0},{id:"hhcurveto",min:4,resetStack:!0},null,{id:"callgsubr",min:1,undefStack:!0},{id:"vhcurveto",min:4,resetStack:!0},{id:"hvcurveto",min:4,resetStack:!0}],Bi=[null,
+        null,null,{id:"and",min:2,stackDelta:-1},{id:"or",min:2,stackDelta:-1},{id:"not",min:1,stackDelta:0},null,null,null,{id:"abs",min:1,stackDelta:0},{id:"add",min:2,stackDelta:-1,stackFn:function(a,b){a[b-2]+=a[b-1]}},{id:"sub",min:2,stackDelta:-1,stackFn:function(a,b){a[b-2]-=a[b-1]}},{id:"div",min:2,stackDelta:-1,stackFn:function(a,b){a[b-2]/=a[b-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn:function(a,b){a[b-1]=-a[b-1]}},{id:"eq",min:2,stackDelta:-1},null,null,{id:"drop",min:1,stackDelta:-1},null,
+        {id:"put",min:2,stackDelta:-2},{id:"get",min:1,stackDelta:0},{id:"ifelse",min:4,stackDelta:-3},{id:"random",min:0,stackDelta:1},{id:"mul",min:2,stackDelta:-1,stackFn:function(a,b){a[b-2]*=a[b-1]}},null,{id:"sqrt",min:1,stackDelta:0},{id:"dup",min:1,stackDelta:1},{id:"exch",min:2,stackDelta:0},{id:"index",min:2,stackDelta:0},{id:"roll",min:3,stackDelta:-2},null,null,null,{id:"hflex",min:7,resetStack:!0},{id:"flex",min:13,resetStack:!0},{id:"hflex1",min:9,resetStack:!0},{id:"flex1",min:11,resetStack:!0}];
+    Kg.prototype={parse:function(){var a=this.properties,b=new ee;this.cff=b;var c=this.parseHeader(),d=this.parseIndex(c.endPos),e=this.parseIndex(d.endPos),f=this.parseIndex(e.endPos),g=this.parseIndex(f.endPos),e=this.parseDict(e.obj.get(0)),e=this.createDict(dd,e,b.strings);b.header=c.obj;b.names=this.parseNameIndex(d.obj);b.strings=this.parseStringIndex(f.obj);b.topDict=e;b.globalSubrIndex=g.obj;this.parsePrivateDict(b.topDict);b.isCIDFont=e.hasName("ROS");c=e.getByName("CharStrings");c=this.parseCharStrings(c);
+        b.charStrings=c.charStrings;b.seacs=c.seacs;if(c=e.getByName("FontMatrix"))a.fontMatrix=c;if(c=e.getByName("FontBBox"))a.ascent=c[3],a.descent=c[1],a.ascentScaled=!0;if(b.isCIDFont){a=this.parseIndex(e.getByName("FDArray")).obj;c=0;for(d=a.count;c<d;++c)f=a.get(c),f=this.createDict(dd,this.parseDict(f),b.strings),this.parsePrivateDict(f),b.fdArray.push(f);a=null;c=this.parseCharsets(e.getByName("charset"),b.charStrings.count,b.strings,!0);b.fdSelect=this.parseFDSelect(e.getByName("FDSelect"),b.charStrings.count)}else c=
+            this.parseCharsets(e.getByName("charset"),b.charStrings.count,b.strings,!1),a=this.parseEncoding(e.getByName("Encoding"),a,b.strings,c.charset);b.charset=c;b.encoding=a;return b},parseHeader:function(){for(var a=this.bytes,b=a.length,c=0;c<b&&1!==a[c];)++c;c>=b?u("Invalid CFF header"):0!==c&&(R("cff data is shifted"),this.bytes=a=a.subarray(c));b=a[2];return{obj:new fe(a[0],a[1],b,a[3]),endPos:b}},parseDict:function(a){function b(){var b=a[c++];if(30===b){for(var b="",d=["0","1","2","3","4","5","6",
+        "7","8","9",".","E","E-",null,"-"],e=a.length;c<e;){var f=a[c++],g=f>>4,f=f&15;if(15==g)break;b+=d[g];if(15==f)break;b+=d[f]}return parseFloat(b)}if(28===b)return b=a[c++],b=(b<<24|a[c++]<<16)>>16;if(29===b)return b=a[c++],b=b<<8|a[c++],b=b<<8|a[c++],b=b<<8|a[c++];if(32<=b&&246>=b)return b-139;if(247<=b&&250>=b)return 256*(b-247)+a[c++]+108;if(251<=b&&254>=b)return-(256*(b-251))-a[c++]-108;u("255 is not a valid DICT command");return-1}for(var c=0,d=[],e=[],c=0,f=a.length;c<f;){var g=a[c];21>=g?(12===
+    g&&(g=g<<8|a[++c]),e.push([g,d]),d=[],++c):d.push(b())}return e},parseIndex:function(a){var b=new Ab,c=this.bytes,d=c[a++]<<8|c[a++],e=[],f=a,g,h;if(0!==d){var f=c[a++],j=a+(d+1)*f-1;g=0;for(h=d+1;g<h;++g){for(var l=0,k=0;k<f;++k)l<<=8,l+=c[a++];e.push(j+l)}f=e[d]}g=0;for(h=e.length-1;g<h;++g)b.add(c.subarray(e[g],e[g+1]));return{obj:b,endPos:f}},parseNameIndex:function(a){for(var b=[],c=0,d=a.count;c<d;++c){for(var e=a.get(c),f=Math.min(e.length,127),g=[],h=0;h<f;++h){var j=e[h];g[h]=0===h&&0===
+    j?j:33>j||126<j||91===j||93===j||40===j||41===j||123===j||125===j||60===j||62===j||47===j||37===j||35===j?95:j}b.push(La(g))}return b},parseStringIndex:function(a){for(var b=new ed,c=0,d=a.count;c<d;++c){var e=a.get(c);b.add(La(e))}return b},createDict:function(a,b,c){a=new a(c);c=0;for(var d=b.length;c<d;++c){var e=b[c];a.setByKey(e[0],e[1])}return a},parseCharStrings:function(a){a=this.parseIndex(a).obj;for(var b=[],c=a.count,d=0;d<c;d++){for(var e=0,f=[],g=!0,h=0,j=!0,l=a.get(d),k=l.length,m=0;m<
+    k;){var n=l[m++],p=null;12==n?(n=l[m++],0===n?(l[m-2]=139,l[m-1]=22,e=0):p=Bi[n]):28===n?(f[e]=(l[m]<<24|l[m+1]<<16)>>16,m+=2,e++):14==n?4<=e&&(e-=4,Zc&&(b[d]=f.slice(e,e+4),j=!1)):32<=n&&246>=n?(f[e]=n-139,e++):247<=n&&254>=n?(f[e]=251>n?(n-247<<8)+l[m]+108:-(n-251<<8)-l[m]-108,m++,e++):255==n?(f[e]=(l[m]<<24|l[m+1]<<16|l[m+2]<<8|l[m+3])/65536,m+=4,e++):19==n||20==n?(h+=e>>1,m+=h+7>>3,e=0):p=Ai[n];if(p){p.stem&&(h+=e>>1);if("min"in p&&!g&&e<p.min){L("Not enough parameters for "+p.id+"; actual: "+
+        e+", expected: "+p.min);j=!1;break}"stackDelta"in p?("stackFn"in p&&p.stackFn(f,e),e+=p.stackDelta):p.resetStack?(e=0,g=!1):p.undefStack&&(e=0,g=!0)}}j||a.set(d,new Uint8Array([14]))}return{charStrings:a,seacs:b}},emptyPrivateDictionary:function(a){var b=this.createDict(fd,[],a.strings);a.setByKey(18,[0,0]);a.privateDict=b},parsePrivateDict:function(a){if(a.hasName("Private")){var b=a.getByName("Private");if(!I(b)||2!==b.length)a.removeByName("Private");else{var c=b[0],b=b[1];if(0===c||b>=this.bytes.length)this.emptyPrivateDictionary(a);
+    else if(c=this.bytes.subarray(b,b+c),c=this.parseDict(c),c=this.createDict(fd,c,a.strings),a.privateDict=c,c.getByName("Subrs")){var d=c.getByName("Subrs"),b=b+d;0===d||b>=this.bytes.length?this.emptyPrivateDictionary(a):(a=this.parseIndex(b),c.subrsIndex=a.obj)}}}else this.emptyPrivateDictionary(a)},parseCharsets:function(a,b,c,d){if(0===a)return new fc(!0,ge.ISO_ADOBE,Zh);if(1==a)return new fc(!0,ge.EXPERT,$h);if(2==a)return new fc(!0,ge.EXPERT_SUBSET,ai);var e=this.bytes,f=a,g=e[a++],h=[".notdef"],
+        j,l,k;b-=1;switch(g){case 0:for(k=0;k<b;k++)j=e[a++]<<8|e[a++],h.push(d?j:c.get(j));break;case 1:for(;h.length<=b;){j=e[a++]<<8|e[a++];l=e[a++];for(k=0;k<=l;k++)h.push(d?j++:c.get(j++))}break;case 2:for(;h.length<=b;){j=e[a++]<<8|e[a++];l=e[a++]<<8|e[a++];for(k=0;k<=l;k++)h.push(d?j++:c.get(j++))}break;default:u("Unknown charset format")}a=e.subarray(f,a);return new fc(!1,g,h,a)},parseEncoding:function(a,b,c,d){b={};var e=this.bytes,f=!1,g,h,j=null;if(0===a||1==a){f=!0;c=(g=a)?ta.ExpertEncoding:ta.StandardEncoding;
+        h=0;for(a=d.length;h<a;h++)e=c.indexOf(d[h]),-1!=e&&(b[e]=h)}else{j=a;g=e[a++];switch(g&127){case 0:var l=e[a++];for(h=1;h<=l;h++)b[e[a++]]=h;break;case 1:var l=e[a++],k=1;for(h=0;h<l;h++)for(var m=e[a++],n=e[a++],p=m;p<=m+n;p++)b[p]=k++;break;default:u("Unknow encoding format: "+g+" in CFF")}l=a;if(g&128){e[j]&=127;k=e[a++];for(h=0;h<k;h++)m=e[a++],n=(e[a++]<<8)+(e[a++]&255),b[m]=d.indexOf(c.get(n))}j=e.subarray(j,l)}return new Lg(f,g&127,b,j)},parseFDSelect:function(a,b){var c=a,d=this.bytes,e=
+        d[a++],f=[];switch(e){case 0:for(e=0;e<b;++e){var g=d[a++];f.push(g)}break;case 3:g=d[a++]<<8|d[a++];for(e=0;e<g;++e)for(var h=d[a++]<<8|d[a++],j=d[a++],l=d[a]<<8|d[a+1];h<l;++h)f.push(j);a+=2;break;default:u("Unknown fdselect format "+e)}return new Mg(f,d.subarray(c,a))}};bd=Kg;var ee;ee=function(){this.header=null;this.names=[];this.topDict=null;this.strings=new ed;this.charStrings=this.charset=this.encoding=this.globalSubrIndex=null;this.fdArray=[];this.fdSelect=null;this.isCIDFont=!1};var fe;
+    fe=function(a,b,c,d){this.major=a;this.minor=b;this.hdrSize=c;this.offSize=d};var ed,Ng=function(){this.strings=[]};Ng.prototype={get:function(a){return 0<=a&&390>=a?de[a]:a-391<=this.strings.length?this.strings[a-391]:de[0]},add:function(a){this.strings.push(a)},get count(){return this.strings.length}};ed=Ng;var Ab,Og=function(){this.objects=[];this.length=0};Og.prototype={add:function(a){this.length+=a.length;this.objects.push(a)},set:function(a,b){this.length+=b.length-this.objects[a].length;this.objects[a]=
+        b},get:function(a){return this.objects[a]},get count(){return this.objects.length}};Ab=Og;var Wa=function(a,b){this.keyToNameMap=a.keyToNameMap;this.nameToKeyMap=a.nameToKeyMap;this.defaults=a.defaults;this.types=a.types;this.opcodes=a.opcodes;this.order=a.order;this.strings=b;this.values={}};Wa.prototype={setByKey:function(a,b){if(!(a in this.keyToNameMap))return!1;if(0===b.length)return!0;var c=this.types[a];if("num"===c||"sid"===c||"offset"===c)b=b[0];this.values[a]=b;return!0},setByName:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 b){a in this.nameToKeyMap||u('Invalid dictionary name "'+a+'"');this.values[this.nameToKeyMap[a]]=b},hasName:function(a){return this.nameToKeyMap[a]in this.values},getByName:function(a){a in this.nameToKeyMap||u('Invalid dictionary name "'+a+'"');a=this.nameToKeyMap[a];return!(a in this.values)?this.defaults[a]:this.values[a]},removeByName:function(a){delete this.values[this.nameToKeyMap[a]]}};Wa.createTables=function(a){for(var b={keyToNameMap:{},nameToKeyMap:{},defaults:{},types:{},opcodes:{},order:[]},
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  c=0,d=a.length;c<d;++c){var e=a[c],f=I(e[0])?(e[0][0]<<8)+e[0][1]:e[0];b.keyToNameMap[f]=e[1];b.nameToKeyMap[e[1]]=f;b.types[f]=e[2];b.defaults[f]=e[3];b.opcodes[f]=I(e[0])?e[0]:[e[0]];b.order.push(f)}return b};var dd,Pg=function(a){null===he&&(he=Wa.createTables(Ci));Wa.call(this,he,a);this.privateDict=null},Ci=[[[12,30],"ROS",["sid","sid","num"],null],[[12,20],"SyntheticBase","num",null],[0,"version","sid",null],[1,"Notice","sid",null],[[12,0],"Copyright","sid",null],[2,"FullName","sid",null],[3,
+        "FamilyName","sid",null],[4,"Weight","sid",null],[[12,1],"isFixedPitch","num",0],[[12,2],"ItalicAngle","num",0],[[12,3],"UnderlinePosition","num",-100],[[12,4],"UnderlineThickness","num",50],[[12,5],"PaintType","num",0],[[12,6],"CharstringType","num",2],[[12,7],"FontMatrix","num num num num num num".split(" "),[0.001,0,0,0.001,0,0]],[13,"UniqueID","num",null],[5,"FontBBox",["num","num","num","num"],[0,0,0,0]],[[12,8],"StrokeWidth","num",0],[14,"XUID","array",null],[15,"charset","offset",0],[16,"Encoding",
+        "offset",0],[17,"CharStrings","offset",0],[18,"Private",["offset","offset"],null],[[12,21],"PostScript","sid",null],[[12,22],"BaseFontName","sid",null],[[12,23],"BaseFontBlend","delta",null],[[12,31],"CIDFontVersion","num",0],[[12,32],"CIDFontRevision","num",0],[[12,33],"CIDFontType","num",0],[[12,34],"CIDCount","num",8720],[[12,35],"UIDBase","num",null],[[12,37],"FDSelect","offset",null],[[12,36],"FDArray","offset",null],[[12,38],"FontName","sid",null]],he=null;Pg.prototype=Object.create(Wa.prototype);
+    dd=Pg;var fd,Qg=function(a){null===ie&&(ie=Wa.createTables(Di));Wa.call(this,ie,a);this.subrsIndex=null},Di=[[6,"BlueValues","delta",null],[7,"OtherBlues","delta",null],[8,"FamilyBlues","delta",null],[9,"FamilyOtherBlues","delta",null],[[12,9],"BlueScale","num",0.039625],[[12,10],"BlueShift","num",7],[[12,11],"BlueFuzz","num",1],[10,"StdHW","num",null],[11,"StdVW","num",null],[[12,12],"StemSnapH","delta",null],[[12,13],"StemSnapV","delta",null],[[12,14],"ForceBold","num",0],[[12,17],"LanguageGroup",
+        "num",0],[[12,18],"ExpansionFactor","num",0.06],[[12,19],"initialRandomSeed","num",0],[20,"defaultWidthX","num",0],[21,"nominalWidthX","num",0],[19,"Subrs","offset",null]],ie=null;Qg.prototype=Object.create(Wa.prototype);fd=Qg;var ge={ISO_ADOBE:0,EXPERT:1,EXPERT_SUBSET:2},fc;fc=function(a,b,c,d){this.predefined=a;this.format=b;this.charset=c;this.raw=d};var Lg;Lg=function(a,b,c,d){this.predefined=a;this.format=b;this.encoding=c;this.raw=d};var Mg;Mg=function(a,b){this.fdSelect=a;this.raw=b};var je=
+        function(){this.offsets={}};je.prototype={isTracking:function(a){return a in this.offsets},track:function(a,b){a in this.offsets&&u("Already tracking location of "+a);this.offsets[a]=b},offset:function(a){for(var b in this.offsets)this.offsets[b]+=a},setEntryLocation:function(a,b,c){a in this.offsets||u("Not tracking location of "+a);c=c.data;a=this.offsets[a];for(var d=0,e=b.length;d<e;++d){var f=5*d+a,g=f+1,h=f+2,j=f+3,l=f+4;(29!==c[f]||0!==c[g]||0!==c[h]||0!==c[j]||0!==c[l])&&u("writing to an offset that is not empty");
+        var k=b[d];c[f]=29;c[g]=k>>24&255;c[h]=k>>16&255;c[j]=k>>8&255;c[l]=k&255}}};var cd,Rg=function(a){this.cff=a};Rg.prototype={compile:function(){var a=this.cff,b={data:[],length:0,add:function(a){this.data=this.data.concat(a);this.length=this.data.length}},c=this.compileHeader(a.header);b.add(c);c=this.compileNameIndex(a.names);b.add(c);if(a.isCIDFont&&a.topDict.hasName("FontMatrix")){c=a.topDict.getByName("FontMatrix");a.topDict.removeByName("FontMatrix");for(var d=0,e=a.fdArray.length;d<e;d++){var f=
+        a.fdArray[d],g=c.slice(0);f.hasName("FontMatrix")&&(g=w.transform(g,f.getByName("FontMatrix")));f.setByName("FontMatrix",g)}}d=this.compileTopDicts([a.topDict],b.length,a.isCIDFont);b.add(d.output);c=d.trackers[0];d=this.compileStringIndex(a.strings.strings);b.add(d);d=this.compileIndex(a.globalSubrIndex);b.add(d);a.encoding&&a.topDict.hasName("Encoding")&&(a.encoding.predefined?c.setEntryLocation("Encoding",[a.encoding.format],b):(d=this.compileEncoding(a.encoding),c.setEntryLocation("Encoding",
+        [b.length],b),b.add(d)));a.charset&&a.topDict.hasName("charset")&&(a.charset.predefined?c.setEntryLocation("charset",[a.charset.format],b):(d=this.compileCharset(a.charset),c.setEntryLocation("charset",[b.length],b),b.add(d)));d=this.compileCharStrings(a.charStrings);c.setEntryLocation("CharStrings",[b.length],b);b.add(d);a.isCIDFont&&(c.setEntryLocation("FDSelect",[b.length],b),d=this.compileFDSelect(a.fdSelect.raw),b.add(d),d=this.compileTopDicts(a.fdArray,b.length,!0),c.setEntryLocation("FDArray",
+        [b.length],b),b.add(d.output),this.compilePrivateDicts(a.fdArray,d.trackers,b));this.compilePrivateDicts([a.topDict],[c],b);b.add([0]);return b.data},encodeNumber:function(a){return parseFloat(a)==parseInt(a,10)&&!isNaN(a)?this.encodeInteger(a):this.encodeFloat(a)},encodeFloat:function(a){var b=a.toString(),c=/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(b);c&&(b=parseFloat("1e"+((c[2]?+c[2]:0)+c[1].length)),b=(Math.round(a*b)/b).toString());a="";var d,c=0;for(d=b.length;c<d;++c){var e=b[c];
+        a="e"===e?a+("-"===b[++c]?"c":"b"):"."===e?a+"a":"-"===e?a+"e":a+e}a+=a.length&1?"f":"ff";b=[30];c=0;for(d=a.length;c<d;c+=2)b.push(parseInt(a.substr(c,2),16));return b},encodeInteger:function(a){-107<=a&&107>=a?a=[a+139]:108<=a&&1131>=a?(a=[a-108],a=[(a>>8)+247,a&255]):-1131<=a&&-108>=a?(a=-a-108,a=[(a>>8)+251,a&255]):a=-32768<=a&&32767>=a?[28,a>>8&255,a&255]:[29,a>>24&255,a>>16&255,a>>8&255,a&255];return a},compileHeader:function(a){return[a.major,a.minor,a.hdrSize,a.offSize]},compileNameIndex:function(a){for(var b=
+        new Ab,c=0,d=a.length;c<d;++c)b.add(Aa(a[c]));return this.compileIndex(b)},compileTopDicts:function(a,b,c){for(var d=[],e=new Ab,f=0,g=a.length;f<g;++f){var h=a[f];c&&(h.removeByName("CIDFontVersion"),h.removeByName("CIDFontRevision"),h.removeByName("CIDFontType"),h.removeByName("CIDCount"),h.removeByName("UIDBase"));var j=new je,h=this.compileDict(h,j);d.push(j);e.add(h);j.offset(b)}e=this.compileIndex(e,d);return{trackers:d,output:e}},compilePrivateDicts:function(a,b,c){for(var d=0,e=a.length;d<
+    e;++d){var f=a[d];$(f.privateDict&&f.hasName("Private"),"There must be an private dictionary.");var g=f.privateDict,f=new je,h=this.compileDict(g,f),j=c.length;f.offset(j);h.length||(j=0);b[d].setEntryLocation("Private",[h.length,j],c);c.add(h);g.subrsIndex&&g.hasName("Subrs")&&(g=this.compileIndex(g.subrsIndex),f.setEntryLocation("Subrs",[h.length],c),c.add(g))}},compileDict:function(a,b){for(var c=[],d=a.order,e=0;e<d.length;++e){var f=d[e];if(f in a.values){var g=a.values[f],h=a.types[f];I(h)||
+    (h=[h]);I(g)||(g=[g]);if(0!==g.length){for(var j=0,l=h.length;j<l;++j){var k=h[j],m=g[j];switch(k){case "num":case "sid":c=c.concat(this.encodeNumber(m));break;case "offset":k=a.keyToNameMap[f];b.isTracking(k)||b.track(k,c.length);c=c.concat([29,0,0,0,0]);break;case "array":case "delta":c=c.concat(this.encodeNumber(m));k=1;for(m=g.length;k<m;++k)c=c.concat(this.encodeNumber(g[k]));break;default:u("Unknown data type of "+k)}}c=c.concat(a.opcodes[f])}}}return c},compileStringIndex:function(a){for(var b=
+        new Ab,c=0,d=a.length;c<d;++c)b.add(Aa(a[c]));return this.compileIndex(b)},compileGlobalSubrIndex:function(){this.out.writeByteArray(this.compileIndex(this.cff.globalSubrIndex))},compileCharStrings:function(a){return this.compileIndex(a)},compileCharset:function(a){return this.compileTypedArray(a.raw)},compileEncoding:function(a){return this.compileTypedArray(a.raw)},compileFDSelect:function(a){return this.compileTypedArray(a)},compileTypedArray:function(a){for(var b=[],c=0,d=a.length;c<d;++c)b[c]=
+        a[c];return b},compileIndex:function(a,b){b=b||[];var c=a.objects,d=c.length;if(0===d)return[0,0,0];var e=[d>>8&255,d&255],f=1,g;for(g=0;g<d;++g)f+=c[g].length;f=256>f?1:65536>f?2:16777216>f?3:4;e.push(f);var h=1;for(g=0;g<d+1;g++)1===f?e.push(h&255):2===f?e.push(h>>8&255,h&255):3===f?e.push(h>>16&255,h>>8&255,h&255):e.push(h>>>24&255,h>>16&255,h>>8&255,h&255),c[g]&&(h+=c[g].length);for(g=0;g<d;g++){b[g]&&b[g].offset(e.length);f=0;for(h=c[g].length;f<h;f++)e.push(c[g][f])}return e}};cd=Rg;/Windows/.test(navigator.userAgent)&&
+    (Zc=!0);/Windows.*Chrome/.test(navigator.userAgent)&&(qg=!0);var Cg,cb=function(a,b){return a[b]<<24|a[b+1]<<16|a[b+2]<<8|a[b+3]},Ea=function(a,b){return a[b]<<8|a[b+1]},gd=function(a,b){for(var c=b.charCodeAt(0),d=0,e=a.length-1;d<e;){var f=d+e+1>>1;c<a[f].start?e=f-1:d=f}return a[d].start<=c&&c<=a[d].end?a[d].idDelta+(a[d].ids?a[d].ids[c-a[d].start]:c)&65535:0},Sg=function(a,b,c){function d(a,c,d,e){b.push("c.quadraticCurveTo("+a+","+c+","+d+","+e+");")}var e=0,f=(a[e]<<24|a[e+1]<<16)>>16,g,h=0,
+        j=0,e=e+10;if(0>f){do{g=a[e]<<8|a[e+1];f=a[e+2]<<8|a[e+3];e+=4;g&1?(h=(a[e]<<24|a[e+1]<<16)>>16,j=(a[e+2]<<24|a[e+3]<<16)>>16,e+=4):(h=a[e++],j=a[e++]);g&2||(j=h=0);var l=1,k=1,m=0,n=0;g&8?(l=k=(a[e]<<24|a[e+1]<<16)/1073741824,e+=2):g&64?(l=(a[e]<<24|a[e+1]<<16)/1073741824,k=(a[e+2]<<24|a[e+3]<<16)/1073741824,e+=4):g&128&&(l=(a[e]<<24|a[e+1]<<16)/1073741824,m=(a[e+2]<<24|a[e+3]<<16)/1073741824,n=(a[e+4]<<24|a[e+5]<<16)/1073741824,k=(a[e+6]<<24|a[e+7]<<16)/1073741824,e+=8);if(f=c.glyphs[f])b.push("c.save();"),
+        b.push("c.transform("+l+","+m+","+n+","+k+","+h+","+j+");"),Sg(f,b,c),b.push("c.restore();")}while(g&32)}else{c=[];for(g=0;g<f;g++)c.push(a[e]<<8|a[e+1]),e+=2;e+=2+(a[e]<<8|a[e+1]);k=c[c.length-1]+1;for(l=[];l.length<k;){g=a[e++];m=1;for(g&8&&(m+=a[e++]);0<m--;)l.push({flags:g})}for(g=0;g<k;g++){switch(l[g].flags&18){case 0:h+=(a[e]<<24|a[e+1]<<16)>>16;e+=2;break;case 2:h-=a[e++];break;case 18:h+=a[e++]}l[g].x=h}for(g=0;g<k;g++){switch(l[g].flags&36){case 0:j+=(a[e]<<24|a[e+1]<<16)>>16;e+=2;break;
+        case 4:j-=a[e++];break;case 36:j+=a[e++]}l[g].y=j}for(e=g=0;e<f;e++){a=c[e];h=l.slice(g,a+1);h[0].flags&1?h.push(h[0]):h[h.length-1].flags&1?h.unshift(h[h.length-1]):(g={flags:1,x:(h[0].x+h[h.length-1].x)/2,y:(h[0].y+h[h.length-1].y)/2},h.unshift(g),h.push(g));b.push("c.moveTo("+h[0].x+","+h[0].y+");");g=1;for(j=h.length;g<j;g++)h[g].flags&1?b.push("c.lineTo("+h[g].x+","+h[g].y+");"):h[g+1].flags&1?(d(h[g].x,h[g].y,h[g+1].x,h[g+1].y),g++):d(h[g].x,h[g].y,(h[g].x+h[g+1].x)/2,(h[g].y+h[g+1].y)/2);g=
+        a+1}}},ke=function(a,b,c){function d(a,c){b.push("c.moveTo("+a+","+c+");")}function e(a,c){b.push("c.lineTo("+a+","+c+");")}function f(a,c,d,e,f,g){b.push("c.bezierCurveTo("+a+","+c+","+d+","+e+","+f+","+g+");")}function g(a){for(var n=0;n<a.length;){var p=!1,q=a[n++],s,v,t;switch(q){case 1:k+=h.length>>1;p=!0;break;case 3:k+=h.length>>1;p=!0;break;case 4:l+=h.pop();d(j,l);p=!0;break;case 5:for(;0<h.length;)j+=h.shift(),l+=h.shift(),e(j,l);break;case 6:for(;0<h.length;){j+=h.shift();e(j,l);if(0===
+        h.length)break;l+=h.shift();e(j,l)}break;case 7:for(;0<h.length;){l+=h.shift();e(j,l);if(0===h.length)break;j+=h.shift();e(j,l)}break;case 8:for(;0<h.length;)q=j+h.shift(),v=l+h.shift(),s=q+h.shift(),t=v+h.shift(),j=s+h.shift(),l=t+h.shift(),f(q,v,s,t,j,l);break;case 10:q=h.pop()+c.subrsBias;(q=c.subrs[q])&&g(q);break;case 11:return;case 12:q=a[n++];switch(q){case 34:q=j+h.shift();s=q+h.shift();t=l+h.shift();j=s+h.shift();f(q,l,s,t,j,t);q=j+h.shift();s=q+h.shift();j=s+h.shift();f(q,t,s,l,j,l);break;
+        case 35:q=j+h.shift();v=l+h.shift();s=q+h.shift();t=v+h.shift();j=s+h.shift();l=t+h.shift();f(q,v,s,t,j,l);q=j+h.shift();v=l+h.shift();s=q+h.shift();t=v+h.shift();j=s+h.shift();l=t+h.shift();f(q,v,s,t,j,l);h.pop();break;case 36:q=j+h.shift();t=l+h.shift();s=q+h.shift();v=t+h.shift();j=s+h.shift();f(q,t,s,v,j,v);q=j+h.shift();s=q+h.shift();t=v+h.shift();j=s+h.shift();f(q,v,s,t,j,l);break;case 37:var r=j,aa=l,q=j+h.shift();v=l+h.shift();s=q+h.shift();t=v+h.shift();j=s+h.shift();l=t+h.shift();f(q,v,
+            s,t,j,l);q=j+h.shift();v=l+h.shift();s=q+h.shift();t=v+h.shift();j=s;l=t;Math.abs(j-r)>Math.abs(l-aa)?j+=h.shift():l+=h.shift();f(q,v,s,t,j,l);break;default:u("unknown operator: 12 "+q)}break;case 14:4<=h.length&&(n=h.pop(),a=h.pop(),l=h.pop(),j=h.pop(),b.push("c.save();"),b.push("c.translate("+j+","+l+");"),n=gd(c.cmap,String.fromCharCode(c.glyphNameMap[ta.StandardEncoding[n]])),ke(c.glyphs[n],b,c),b.push("c.restore();"),n=gd(c.cmap,String.fromCharCode(c.glyphNameMap[ta.StandardEncoding[a]])),ke(c.glyphs[n],
+        b,c));return;case 18:k+=h.length>>1;p=!0;break;case 19:k+=h.length>>1;n+=k+7>>3;p=!0;break;case 20:k+=h.length>>1;n+=k+7>>3;p=!0;break;case 21:l+=h.pop();j+=h.pop();d(j,l);p=!0;break;case 22:j+=h.pop();d(j,l);p=!0;break;case 23:k+=h.length>>1;p=!0;break;case 24:for(;2<h.length;)q=j+h.shift(),v=l+h.shift(),s=q+h.shift(),t=v+h.shift(),j=s+h.shift(),l=t+h.shift(),f(q,v,s,t,j,l);j+=h.shift();l+=h.shift();e(j,l);break;case 25:for(;6<h.length;)j+=h.shift(),l+=h.shift(),e(j,l);q=j+h.shift();v=l+h.shift();
+        s=q+h.shift();t=v+h.shift();j=s+h.shift();l=t+h.shift();f(q,v,s,t,j,l);break;case 26:for(h.length%2&&(j+=h.shift());0<h.length;)q=j,v=l+h.shift(),s=q+h.shift(),t=v+h.shift(),j=s,l=t+h.shift(),f(q,v,s,t,j,l);break;case 27:for(h.length%2&&(l+=h.shift());0<h.length;)q=j+h.shift(),v=l,s=q+h.shift(),t=v+h.shift(),j=s+h.shift(),l=t,f(q,v,s,t,j,l);break;case 28:h.push((a[n]<<24|a[n+1]<<16)>>16);n+=2;break;case 29:q=h.pop()+c.gsubrsBias;(q=c.gsubrs[q])&&g(q);break;case 30:for(;0<h.length;){q=j;v=l+h.shift();
+        s=q+h.shift();t=v+h.shift();j=s+h.shift();l=t+(1===h.length?h.shift():0);f(q,v,s,t,j,l);if(0===h.length)break;q=j+h.shift();v=l;s=q+h.shift();t=v+h.shift();l=t+h.shift();j=s+(1===h.length?h.shift():0);f(q,v,s,t,j,l)}break;case 31:for(;0<h.length;){q=j+h.shift();v=l;s=q+h.shift();t=v+h.shift();l=t+h.shift();j=s+(1===h.length?h.shift():0);f(q,v,s,t,j,l);if(0===h.length)break;q=j;v=l+h.shift();s=q+h.shift();t=v+h.shift();j=s+h.shift();l=t+(1===h.length?h.shift():0);f(q,v,s,t,j,l)}break;default:32>q&&
+    u("unknown operator: "+q),247>q?h.push(q-139):251>q?h.push(256*(q-247)+a[n++]+108):255>q?h.push(256*-(q-251)-a[n++]-108):(h.push((a[n]<<24|a[n+1]<<16|a[n+2]<<8|a[n+3])/65536),n+=4)}p&&(h.length=0)}}var h=[],j=0,l=0,k=0;g(a)},Xb=function(a){this.compiledGlyphs={};this.fontMatrix=a},Tg=function(a,b,c){c=c||[4.88E-4,0,0,4.88E-4,0,0];Xb.call(this,c);this.glyphs=a;this.cmap=b;this.compiledGlyphs=[]},Ug=function(a,b,c,d){c=c||[0.001,0,0,0.001,0,0];Xb.call(this,c);this.glyphs=a.glyphs;this.gsubrs=a.gsubrs||
+        [];this.subrs=a.subrs||[];this.cmap=b;this.glyphNameMap=d||Hb;this.compiledGlyphs=[];this.gsubrsBias=1240>this.gsubrs.length?107:33900>this.gsubrs.length?1131:32768;this.subrsBias=1240>this.subrs.length?107:33900>this.subrs.length?1131:32768};Xb.prototype={getPathJs:function(a){a=gd(this.cmap,a);var b=this.compiledGlyphs[a];b||(this.compiledGlyphs[a]=b=this.compileGlyph(this.glyphs[a]));return b},compileGlyph:function(a){if(!a||0===a.length||14===a[0])return"";var b=[];b.push("c.save();");b.push("c.transform("+
+        this.fontMatrix.join(",")+");");b.push("c.scale(size, -size);");this.compileGlyphImpl(a,b);b.push("c.restore();");return b.join("\n")},compileGlyphImpl:function(){u("Children classes should implement this.")},hasBuiltPath:function(a){return gd(this.cmap,a)in this.compiledGlyphs}};w.inherit(Tg,Xb,{compileGlyphImpl:function(a,b){Sg(a,b,this)}});w.inherit(Ug,Xb,{compileGlyphImpl:function(a,b){ke(a,b,this)}});Cg={create:function(a){for(var b=new Uint8Array(a.data),c,d,e,f,g,h,j=Ea(b,4),l=0,k=12;l<j;l++,
+        k+=16){var m=La(b.subarray(k,k+4)),n=cb(b,k+8),p=cb(b,k+12);switch(m){case "cmap":c=b;var q=n,s=1===Ea(c,q+2)?cb(c,q+8):cb(c,q+16),v=Ea(c,q+s),p=m=n=void 0;if(4===v){Ea(c,q+s+2);v=Ea(c,q+s+6)>>1;m=q+s+14;n=[];for(p=0;p<v;p++,m+=2)n[p]={end:Ea(c,m)};m+=2;for(p=0;p<v;p++,m+=2)n[p].start=Ea(c,m);for(p=0;p<v;p++,m+=2)n[p].idDelta=Ea(c,m);for(p=0;p<v;p++,m+=2)if(q=Ea(c,m),0!==q){n[p].ids=[];for(var s=0,t=n[p].end-n[p].start+1;s<t;s++)n[p].ids[s]=Ea(c,m+q),q+=2}c=n}else if(12===v){cb(c,q+s+4);v=cb(c,q+
+        s+12);m=q+s+16;n=[];for(p=0;p<v;p++)n.push({start:cb(c,m),end:cb(c,m+4),idDelta:cb(c,m+8)-cb(c,m)}),m+=12;c=n}else u("not supported cmap: "+v),c=void 0;break;case "glyf":d=b.subarray(n,n+p);break;case "loca":e=b.subarray(n,n+p);break;case "head":h=Ea(b,n+18);g=Ea(b,n+50);break;case "CFF ":f=(new bd(new wa(b,n,n+p-n),{})).parse(),f={glyphs:f.charStrings.objects,subrs:f.topDict.privateDict&&f.topDict.privateDict.subrsIndex&&f.topDict.privateDict.subrsIndex.objects,gsubrs:f.globalSubrIndex&&f.globalSubrIndex.objects}}}if(d){a=
+        !h?a.fontMatrix:[1/h,0,0,1/h,0,0];g?(g=4,b=function(a,b){return a[b]<<24|a[b+1]<<16|a[b+2]<<8|a[b+3]}):(g=2,b=function(a,b){return a[b]<<9|a[b+1]<<1});h=[];j=b(e,0);for(l=g;l<e.length;l+=g)k=b(e,l),h.push(d.subarray(j,k)),j=k;return new Tg(h,c,a)}return new Ug(f,c,a.fontMatrix,a.glyphNameMap)}};var Hb={A:65,AE:198,AEacute:508,AEmacron:482,AEsmall:63462,Aacute:193,Aacutesmall:63457,Abreve:258,Abreveacute:7854,Abrevecyrillic:1232,Abrevedotbelow:7862,Abrevegrave:7856,Abrevehookabove:7858,Abrevetilde:7860,
+        Acaron:461,Acircle:9398,Acircumflex:194,Acircumflexacute:7844,Acircumflexdotbelow:7852,Acircumflexgrave:7846,Acircumflexhookabove:7848,Acircumflexsmall:63458,Acircumflextilde:7850,Acute:63177,Acutesmall:63412,Acyrillic:1040,Adblgrave:512,Adieresis:196,Adieresiscyrillic:1234,Adieresismacron:478,Adieresissmall:63460,Adotbelow:7840,Adotmacron:480,Agrave:192,Agravesmall:63456,Ahookabove:7842,Aiecyrillic:1236,Ainvertedbreve:514,Alpha:913,Alphatonos:902,Amacron:256,Amonospace:65313,Aogonek:260,Aring:197,
+        Aringacute:506,Aringbelow:7680,Aringsmall:63461,Asmall:63329,Atilde:195,Atildesmall:63459,Aybarmenian:1329,B:66,Bcircle:9399,Bdotaccent:7682,Bdotbelow:7684,Becyrillic:1041,Benarmenian:1330,Beta:914,Bhook:385,Blinebelow:7686,Bmonospace:65314,Brevesmall:63220,Bsmall:63330,Btopbar:386,C:67,Caarmenian:1342,Cacute:262,Caron:63178,Caronsmall:63221,Ccaron:268,Ccedilla:199,Ccedillaacute:7688,Ccedillasmall:63463,Ccircle:9400,Ccircumflex:264,Cdot:266,Cdotaccent:266,Cedillasmall:63416,Chaarmenian:1353,Cheabkhasiancyrillic:1212,
+        Checyrillic:1063,Chedescenderabkhasiancyrillic:1214,Chedescendercyrillic:1206,Chedieresiscyrillic:1268,Cheharmenian:1347,Chekhakassiancyrillic:1227,Cheverticalstrokecyrillic:1208,Chi:935,Chook:391,Circumflexsmall:63222,Cmonospace:65315,Coarmenian:1361,Csmall:63331,D:68,DZ:497,DZcaron:452,Daarmenian:1332,Dafrican:393,Dcaron:270,Dcedilla:7696,Dcircle:9401,Dcircumflexbelow:7698,Dcroat:272,Ddotaccent:7690,Ddotbelow:7692,Decyrillic:1044,Deicoptic:1006,Delta:8710,Deltagreek:916,Dhook:394,Dieresis:63179,
+        DieresisAcute:63180,DieresisGrave:63181,Dieresissmall:63400,Digammagreek:988,Djecyrillic:1026,Dlinebelow:7694,Dmonospace:65316,Dotaccentsmall:63223,Dslash:272,Dsmall:63332,Dtopbar:395,Dz:498,Dzcaron:453,Dzeabkhasiancyrillic:1248,Dzecyrillic:1029,Dzhecyrillic:1039,E:69,Eacute:201,Eacutesmall:63465,Ebreve:276,Ecaron:282,Ecedillabreve:7708,Echarmenian:1333,Ecircle:9402,Ecircumflex:202,Ecircumflexacute:7870,Ecircumflexbelow:7704,Ecircumflexdotbelow:7878,Ecircumflexgrave:7872,Ecircumflexhookabove:7874,
+        Ecircumflexsmall:63466,Ecircumflextilde:7876,Ecyrillic:1028,Edblgrave:516,Edieresis:203,Edieresissmall:63467,Edot:278,Edotaccent:278,Edotbelow:7864,Efcyrillic:1060,Egrave:200,Egravesmall:63464,Eharmenian:1335,Ehookabove:7866,Eightroman:8551,Einvertedbreve:518,Eiotifiedcyrillic:1124,Elcyrillic:1051,Elevenroman:8554,Emacron:274,Emacronacute:7702,Emacrongrave:7700,Emcyrillic:1052,Emonospace:65317,Encyrillic:1053,Endescendercyrillic:1186,Eng:330,Enghecyrillic:1188,Enhookcyrillic:1223,Eogonek:280,Eopen:400,
+        Epsilon:917,Epsilontonos:904,Ercyrillic:1056,Ereversed:398,Ereversedcyrillic:1069,Escyrillic:1057,Esdescendercyrillic:1194,Esh:425,Esmall:63333,Eta:919,Etarmenian:1336,Etatonos:905,Eth:208,Ethsmall:63472,Etilde:7868,Etildebelow:7706,Euro:8364,Ezh:439,Ezhcaron:494,Ezhreversed:440,F:70,Fcircle:9403,Fdotaccent:7710,Feharmenian:1366,Feicoptic:996,Fhook:401,Fitacyrillic:1138,Fiveroman:8548,Fmonospace:65318,Fourroman:8547,Fsmall:63334,G:71,GBsquare:13191,Gacute:500,Gamma:915,Gammaafrican:404,Gangiacoptic:1002,
+        Gbreve:286,Gcaron:486,Gcedilla:290,Gcircle:9404,Gcircumflex:284,Gcommaaccent:290,Gdot:288,Gdotaccent:288,Gecyrillic:1043,Ghadarmenian:1346,Ghemiddlehookcyrillic:1172,Ghestrokecyrillic:1170,Gheupturncyrillic:1168,Ghook:403,Gimarmenian:1331,Gjecyrillic:1027,Gmacron:7712,Gmonospace:65319,Grave:63182,Gravesmall:63328,Gsmall:63335,Gsmallhook:667,Gstroke:484,H:72,H18533:9679,H18543:9642,H18551:9643,H22073:9633,HPsquare:13259,Haabkhasiancyrillic:1192,Hadescendercyrillic:1202,Hardsigncyrillic:1066,Hbar:294,
+        Hbrevebelow:7722,Hcedilla:7720,Hcircle:9405,Hcircumflex:292,Hdieresis:7718,Hdotaccent:7714,Hdotbelow:7716,Hmonospace:65320,Hoarmenian:1344,Horicoptic:1E3,Hsmall:63336,Hungarumlaut:63183,Hungarumlautsmall:63224,Hzsquare:13200,I:73,IAcyrillic:1071,IJ:306,IUcyrillic:1070,Iacute:205,Iacutesmall:63469,Ibreve:300,Icaron:463,Icircle:9406,Icircumflex:206,Icircumflexsmall:63470,Icyrillic:1030,Idblgrave:520,Idieresis:207,Idieresisacute:7726,Idieresiscyrillic:1252,Idieresissmall:63471,Idot:304,Idotaccent:304,
+        Idotbelow:7882,Iebrevecyrillic:1238,Iecyrillic:1045,Ifraktur:8465,Igrave:204,Igravesmall:63468,Ihookabove:7880,Iicyrillic:1048,Iinvertedbreve:522,Iishortcyrillic:1049,Imacron:298,Imacroncyrillic:1250,Imonospace:65321,Iniarmenian:1339,Iocyrillic:1025,Iogonek:302,Iota:921,Iotaafrican:406,Iotadieresis:938,Iotatonos:906,Ismall:63337,Istroke:407,Itilde:296,Itildebelow:7724,Izhitsacyrillic:1140,Izhitsadblgravecyrillic:1142,J:74,Jaarmenian:1345,Jcircle:9407,Jcircumflex:308,Jecyrillic:1032,Jheharmenian:1355,
+        Jmonospace:65322,Jsmall:63338,K:75,KBsquare:13189,KKsquare:13261,Kabashkircyrillic:1184,Kacute:7728,Kacyrillic:1050,Kadescendercyrillic:1178,Kahookcyrillic:1219,Kappa:922,Kastrokecyrillic:1182,Kaverticalstrokecyrillic:1180,Kcaron:488,Kcedilla:310,Kcircle:9408,Kcommaaccent:310,Kdotbelow:7730,Keharmenian:1364,Kenarmenian:1343,Khacyrillic:1061,Kheicoptic:998,Khook:408,Kjecyrillic:1036,Klinebelow:7732,Kmonospace:65323,Koppacyrillic:1152,Koppagreek:990,Ksicyrillic:1134,Ksmall:63339,L:76,LJ:455,LL:63167,
+        Lacute:313,Lambda:923,Lcaron:317,Lcedilla:315,Lcircle:9409,Lcircumflexbelow:7740,Lcommaaccent:315,Ldot:319,Ldotaccent:319,Ldotbelow:7734,Ldotbelowmacron:7736,Liwnarmenian:1340,Lj:456,Ljecyrillic:1033,Llinebelow:7738,Lmonospace:65324,Lslash:321,Lslashsmall:63225,Lsmall:63340,M:77,MBsquare:13190,Macron:63184,Macronsmall:63407,Macute:7742,Mcircle:9410,Mdotaccent:7744,Mdotbelow:7746,Menarmenian:1348,Mmonospace:65325,Msmall:63341,Mturned:412,Mu:924,N:78,NJ:458,Nacute:323,Ncaron:327,Ncedilla:325,Ncircle:9411,
+        Ncircumflexbelow:7754,Ncommaaccent:325,Ndotaccent:7748,Ndotbelow:7750,Nhookleft:413,Nineroman:8552,Nj:459,Njecyrillic:1034,Nlinebelow:7752,Nmonospace:65326,Nowarmenian:1350,Nsmall:63342,Ntilde:209,Ntildesmall:63473,Nu:925,O:79,OE:338,OEsmall:63226,Oacute:211,Oacutesmall:63475,Obarredcyrillic:1256,Obarreddieresiscyrillic:1258,Obreve:334,Ocaron:465,Ocenteredtilde:415,Ocircle:9412,Ocircumflex:212,Ocircumflexacute:7888,Ocircumflexdotbelow:7896,Ocircumflexgrave:7890,Ocircumflexhookabove:7892,Ocircumflexsmall:63476,
+        Ocircumflextilde:7894,Ocyrillic:1054,Odblacute:336,Odblgrave:524,Odieresis:214,Odieresiscyrillic:1254,Odieresissmall:63478,Odotbelow:7884,Ogoneksmall:63227,Ograve:210,Ogravesmall:63474,Oharmenian:1365,Ohm:8486,Ohookabove:7886,Ohorn:416,Ohornacute:7898,Ohorndotbelow:7906,Ohorngrave:7900,Ohornhookabove:7902,Ohorntilde:7904,Ohungarumlaut:336,Oi:418,Oinvertedbreve:526,Omacron:332,Omacronacute:7762,Omacrongrave:7760,Omega:8486,Omegacyrillic:1120,Omegagreek:937,Omegaroundcyrillic:1146,Omegatitlocyrillic:1148,
+        Omegatonos:911,Omicron:927,Omicrontonos:908,Omonospace:65327,Oneroman:8544,Oogonek:490,Oogonekmacron:492,Oopen:390,Oslash:216,Oslashacute:510,Oslashsmall:63480,Osmall:63343,Ostrokeacute:510,Otcyrillic:1150,Otilde:213,Otildeacute:7756,Otildedieresis:7758,Otildesmall:63477,P:80,Pacute:7764,Pcircle:9413,Pdotaccent:7766,Pecyrillic:1055,Peharmenian:1354,Pemiddlehookcyrillic:1190,Phi:934,Phook:420,Pi:928,Piwrarmenian:1363,Pmonospace:65328,Psi:936,Psicyrillic:1136,Psmall:63344,Q:81,Qcircle:9414,Qmonospace:65329,
+        Qsmall:63345,R:82,Raarmenian:1356,Racute:340,Rcaron:344,Rcedilla:342,Rcircle:9415,Rcommaaccent:342,Rdblgrave:528,Rdotaccent:7768,Rdotbelow:7770,Rdotbelowmacron:7772,Reharmenian:1360,Rfraktur:8476,Rho:929,Ringsmall:63228,Rinvertedbreve:530,Rlinebelow:7774,Rmonospace:65330,Rsmall:63346,Rsmallinverted:641,Rsmallinvertedsuperior:694,S:83,SF010000:9484,SF020000:9492,SF030000:9488,SF040000:9496,SF050000:9532,SF060000:9516,SF070000:9524,SF080000:9500,SF090000:9508,SF100000:9472,SF110000:9474,SF190000:9569,
+        SF200000:9570,SF210000:9558,SF220000:9557,SF230000:9571,SF240000:9553,SF250000:9559,SF260000:9565,SF270000:9564,SF280000:9563,SF360000:9566,SF370000:9567,SF380000:9562,SF390000:9556,SF400000:9577,SF410000:9574,SF420000:9568,SF430000:9552,SF440000:9580,SF450000:9575,SF460000:9576,SF470000:9572,SF480000:9573,SF490000:9561,SF500000:9560,SF510000:9554,SF520000:9555,SF530000:9579,SF540000:9578,Sacute:346,Sacutedotaccent:7780,Sampigreek:992,Scaron:352,Scarondotaccent:7782,Scaronsmall:63229,Scedilla:350,
+        Schwa:399,Schwacyrillic:1240,Schwadieresiscyrillic:1242,Scircle:9416,Scircumflex:348,Scommaaccent:536,Sdotaccent:7776,Sdotbelow:7778,Sdotbelowdotaccent:7784,Seharmenian:1357,Sevenroman:8550,Shaarmenian:1351,Shacyrillic:1064,Shchacyrillic:1065,Sheicoptic:994,Shhacyrillic:1210,Shimacoptic:1004,Sigma:931,Sixroman:8549,Smonospace:65331,Softsigncyrillic:1068,Ssmall:63347,Stigmagreek:986,T:84,Tau:932,Tbar:358,Tcaron:356,Tcedilla:354,Tcircle:9417,Tcircumflexbelow:7792,Tcommaaccent:354,Tdotaccent:7786,Tdotbelow:7788,
+        Tecyrillic:1058,Tedescendercyrillic:1196,Tenroman:8553,Tetsecyrillic:1204,Theta:920,Thook:428,Thorn:222,Thornsmall:63486,Threeroman:8546,Tildesmall:63230,Tiwnarmenian:1359,Tlinebelow:7790,Tmonospace:65332,Toarmenian:1337,Tonefive:444,Tonesix:388,Tonetwo:423,Tretroflexhook:430,Tsecyrillic:1062,Tshecyrillic:1035,Tsmall:63348,Twelveroman:8555,Tworoman:8545,U:85,Uacute:218,Uacutesmall:63482,Ubreve:364,Ucaron:467,Ucircle:9418,Ucircumflex:219,Ucircumflexbelow:7798,Ucircumflexsmall:63483,Ucyrillic:1059,
+        Udblacute:368,Udblgrave:532,Udieresis:220,Udieresisacute:471,Udieresisbelow:7794,Udieresiscaron:473,Udieresiscyrillic:1264,Udieresisgrave:475,Udieresismacron:469,Udieresissmall:63484,Udotbelow:7908,Ugrave:217,Ugravesmall:63481,Uhookabove:7910,Uhorn:431,Uhornacute:7912,Uhorndotbelow:7920,Uhorngrave:7914,Uhornhookabove:7916,Uhorntilde:7918,Uhungarumlaut:368,Uhungarumlautcyrillic:1266,Uinvertedbreve:534,Ukcyrillic:1144,Umacron:362,Umacroncyrillic:1262,Umacrondieresis:7802,Umonospace:65333,Uogonek:370,
+        Upsilon:933,Upsilon1:978,Upsilonacutehooksymbolgreek:979,Upsilonafrican:433,Upsilondieresis:939,Upsilondieresishooksymbolgreek:980,Upsilonhooksymbol:978,Upsilontonos:910,Uring:366,Ushortcyrillic:1038,Usmall:63349,Ustraightcyrillic:1198,Ustraightstrokecyrillic:1200,Utilde:360,Utildeacute:7800,Utildebelow:7796,V:86,Vcircle:9419,Vdotbelow:7806,Vecyrillic:1042,Vewarmenian:1358,Vhook:434,Vmonospace:65334,Voarmenian:1352,Vsmall:63350,Vtilde:7804,W:87,Wacute:7810,Wcircle:9420,Wcircumflex:372,Wdieresis:7812,
+        Wdotaccent:7814,Wdotbelow:7816,Wgrave:7808,Wmonospace:65335,Wsmall:63351,X:88,Xcircle:9421,Xdieresis:7820,Xdotaccent:7818,Xeharmenian:1341,Xi:926,Xmonospace:65336,Xsmall:63352,Y:89,Yacute:221,Yacutesmall:63485,Yatcyrillic:1122,Ycircle:9422,Ycircumflex:374,Ydieresis:376,Ydieresissmall:63487,Ydotaccent:7822,Ydotbelow:7924,Yericyrillic:1067,Yerudieresiscyrillic:1272,Ygrave:7922,Yhook:435,Yhookabove:7926,Yiarmenian:1349,Yicyrillic:1031,Yiwnarmenian:1362,Ymonospace:65337,Ysmall:63353,Ytilde:7928,Yusbigcyrillic:1130,
+        Yusbigiotifiedcyrillic:1132,Yuslittlecyrillic:1126,Yuslittleiotifiedcyrillic:1128,Z:90,Zaarmenian:1334,Zacute:377,Zcaron:381,Zcaronsmall:63231,Zcircle:9423,Zcircumflex:7824,Zdot:379,Zdotaccent:379,Zdotbelow:7826,Zecyrillic:1047,Zedescendercyrillic:1176,Zedieresiscyrillic:1246,Zeta:918,Zhearmenian:1338,Zhebrevecyrillic:1217,Zhecyrillic:1046,Zhedescendercyrillic:1174,Zhedieresiscyrillic:1244,Zlinebelow:7828,Zmonospace:65338,Zsmall:63354,Zstroke:437,a:97,aabengali:2438,aacute:225,aadeva:2310,aagujarati:2694,
+        aagurmukhi:2566,aamatragurmukhi:2622,aarusquare:13059,aavowelsignbengali:2494,aavowelsigndeva:2366,aavowelsigngujarati:2750,abbreviationmarkarmenian:1375,abbreviationsigndeva:2416,abengali:2437,abopomofo:12570,abreve:259,abreveacute:7855,abrevecyrillic:1233,abrevedotbelow:7863,abrevegrave:7857,abrevehookabove:7859,abrevetilde:7861,acaron:462,acircle:9424,acircumflex:226,acircumflexacute:7845,acircumflexdotbelow:7853,acircumflexgrave:7847,acircumflexhookabove:7849,acircumflextilde:7851,acute:180,acutebelowcmb:791,
+        acutecmb:769,acutecomb:769,acutedeva:2388,acutelowmod:719,acutetonecmb:833,acyrillic:1072,adblgrave:513,addakgurmukhi:2673,adeva:2309,adieresis:228,adieresiscyrillic:1235,adieresismacron:479,adotbelow:7841,adotmacron:481,ae:230,aeacute:509,aekorean:12624,aemacron:483,afii00208:8213,afii08941:8356,afii10017:1040,afii10018:1041,afii10019:1042,afii10020:1043,afii10021:1044,afii10022:1045,afii10023:1025,afii10024:1046,afii10025:1047,afii10026:1048,afii10027:1049,afii10028:1050,afii10029:1051,afii10030:1052,
+        afii10031:1053,afii10032:1054,afii10033:1055,afii10034:1056,afii10035:1057,afii10036:1058,afii10037:1059,afii10038:1060,afii10039:1061,afii10040:1062,afii10041:1063,afii10042:1064,afii10043:1065,afii10044:1066,afii10045:1067,afii10046:1068,afii10047:1069,afii10048:1070,afii10049:1071,afii10050:1168,afii10051:1026,afii10052:1027,afii10053:1028,afii10054:1029,afii10055:1030,afii10056:1031,afii10057:1032,afii10058:1033,afii10059:1034,afii10060:1035,afii10061:1036,afii10062:1038,afii10063:63172,afii10064:63173,
+        afii10065:1072,afii10066:1073,afii10067:1074,afii10068:1075,afii10069:1076,afii10070:1077,afii10071:1105,afii10072:1078,afii10073:1079,afii10074:1080,afii10075:1081,afii10076:1082,afii10077:1083,afii10078:1084,afii10079:1085,afii10080:1086,afii10081:1087,afii10082:1088,afii10083:1089,afii10084:1090,afii10085:1091,afii10086:1092,afii10087:1093,afii10088:1094,afii10089:1095,afii10090:1096,afii10091:1097,afii10092:1098,afii10093:1099,afii10094:1100,afii10095:1101,afii10096:1102,afii10097:1103,afii10098:1169,
+        afii10099:1106,afii10100:1107,afii10101:1108,afii10102:1109,afii10103:1110,afii10104:1111,afii10105:1112,afii10106:1113,afii10107:1114,afii10108:1115,afii10109:1116,afii10110:1118,afii10145:1039,afii10146:1122,afii10147:1138,afii10148:1140,afii10192:63174,afii10193:1119,afii10194:1123,afii10195:1139,afii10196:1141,afii10831:63175,afii10832:63176,afii10846:1241,afii299:8206,afii300:8207,afii301:8205,afii57381:1642,afii57388:1548,afii57392:1632,afii57393:1633,afii57394:1634,afii57395:1635,afii57396:1636,
+        afii57397:1637,afii57398:1638,afii57399:1639,afii57400:1640,afii57401:1641,afii57403:1563,afii57407:1567,afii57409:1569,afii57410:1570,afii57411:1571,afii57412:1572,afii57413:1573,afii57414:1574,afii57415:1575,afii57416:1576,afii57417:1577,afii57418:1578,afii57419:1579,afii57420:1580,afii57421:1581,afii57422:1582,afii57423:1583,afii57424:1584,afii57425:1585,afii57426:1586,afii57427:1587,afii57428:1588,afii57429:1589,afii57430:1590,afii57431:1591,afii57432:1592,afii57433:1593,afii57434:1594,afii57440:1600,
+        afii57441:1601,afii57442:1602,afii57443:1603,afii57444:1604,afii57445:1605,afii57446:1606,afii57448:1608,afii57449:1609,afii57450:1610,afii57451:1611,afii57452:1612,afii57453:1613,afii57454:1614,afii57455:1615,afii57456:1616,afii57457:1617,afii57458:1618,afii57470:1607,afii57505:1700,afii57506:1662,afii57507:1670,afii57508:1688,afii57509:1711,afii57511:1657,afii57512:1672,afii57513:1681,afii57514:1722,afii57519:1746,afii57534:1749,afii57636:8362,afii57645:1470,afii57658:1475,afii57664:1488,afii57665:1489,
+        afii57666:1490,afii57667:1491,afii57668:1492,afii57669:1493,afii57670:1494,afii57671:1495,afii57672:1496,afii57673:1497,afii57674:1498,afii57675:1499,afii57676:1500,afii57677:1501,afii57678:1502,afii57679:1503,afii57680:1504,afii57681:1505,afii57682:1506,afii57683:1507,afii57684:1508,afii57685:1509,afii57686:1510,afii57687:1511,afii57688:1512,afii57689:1513,afii57690:1514,afii57694:64298,afii57695:64299,afii57700:64331,afii57705:64287,afii57716:1520,afii57717:1521,afii57718:1522,afii57723:64309,afii57793:1460,
+        afii57794:1461,afii57795:1462,afii57796:1467,afii57797:1464,afii57798:1463,afii57799:1456,afii57800:1458,afii57801:1457,afii57802:1459,afii57803:1474,afii57804:1473,afii57806:1465,afii57807:1468,afii57839:1469,afii57841:1471,afii57842:1472,afii57929:700,afii61248:8453,afii61289:8467,afii61352:8470,afii61573:8236,afii61574:8237,afii61575:8238,afii61664:8204,afii63167:1645,afii64937:701,agrave:224,agujarati:2693,agurmukhi:2565,ahiragana:12354,ahookabove:7843,aibengali:2448,aibopomofo:12574,aideva:2320,
+        aiecyrillic:1237,aigujarati:2704,aigurmukhi:2576,aimatragurmukhi:2632,ainarabic:1593,ainfinalarabic:65226,aininitialarabic:65227,ainmedialarabic:65228,ainvertedbreve:515,aivowelsignbengali:2504,aivowelsigndeva:2376,aivowelsigngujarati:2760,akatakana:12450,akatakanahalfwidth:65393,akorean:12623,alef:1488,alefarabic:1575,alefdageshhebrew:64304,aleffinalarabic:65166,alefhamzaabovearabic:1571,alefhamzaabovefinalarabic:65156,alefhamzabelowarabic:1573,alefhamzabelowfinalarabic:65160,alefhebrew:1488,aleflamedhebrew:64335,
+        alefmaddaabovearabic:1570,alefmaddaabovefinalarabic:65154,alefmaksuraarabic:1609,alefmaksurafinalarabic:65264,alefmaksurainitialarabic:65267,alefmaksuramedialarabic:65268,alefpatahhebrew:64302,alefqamatshebrew:64303,aleph:8501,allequal:8780,alpha:945,alphatonos:940,amacron:257,amonospace:65345,ampersand:38,ampersandmonospace:65286,ampersandsmall:63270,amsquare:13250,anbopomofo:12578,angbopomofo:12580,angbracketleft:12296,angbracketright:12297,angkhankhuthai:3674,angle:8736,anglebracketleft:12296,
+        anglebracketleftvertical:65087,anglebracketright:12297,anglebracketrightvertical:65088,angleleft:9001,angleright:9002,angstrom:8491,anoteleia:903,anudattadeva:2386,anusvarabengali:2434,anusvaradeva:2306,anusvaragujarati:2690,aogonek:261,apaatosquare:13056,aparen:9372,apostrophearmenian:1370,apostrophemod:700,apple:63743,approaches:8784,approxequal:8776,approxequalorimage:8786,approximatelyequal:8773,araeaekorean:12686,araeakorean:12685,arc:8978,arighthalfring:7834,aring:229,aringacute:507,aringbelow:7681,
+        arrowboth:8596,arrowdashdown:8675,arrowdashleft:8672,arrowdashright:8674,arrowdashup:8673,arrowdblboth:8660,arrowdbldown:8659,arrowdblleft:8656,arrowdblright:8658,arrowdblup:8657,arrowdown:8595,arrowdownleft:8601,arrowdownright:8600,arrowdownwhite:8681,arrowheaddownmod:709,arrowheadleftmod:706,arrowheadrightmod:707,arrowheadupmod:708,arrowhorizex:63719,arrowleft:8592,arrowleftdbl:8656,arrowleftdblstroke:8653,arrowleftoverright:8646,arrowleftwhite:8678,arrowright:8594,arrowrightdblstroke:8655,arrowrightheavy:10142,
+        arrowrightoverleft:8644,arrowrightwhite:8680,arrowtableft:8676,arrowtabright:8677,arrowup:8593,arrowupdn:8597,arrowupdnbse:8616,arrowupdownbase:8616,arrowupleft:8598,arrowupleftofdown:8645,arrowupright:8599,arrowupwhite:8679,arrowvertex:63718,asciicircum:94,asciicircummonospace:65342,asciitilde:126,asciitildemonospace:65374,ascript:593,ascriptturned:594,asmallhiragana:12353,asmallkatakana:12449,asmallkatakanahalfwidth:65383,asterisk:42,asteriskaltonearabic:1645,asteriskarabic:1645,asteriskmath:8727,
+        asteriskmonospace:65290,asterisksmall:65121,asterism:8258,asuperior:63209,asymptoticallyequal:8771,at:64,atilde:227,atmonospace:65312,atsmall:65131,aturned:592,aubengali:2452,aubopomofo:12576,audeva:2324,augujarati:2708,augurmukhi:2580,aulengthmarkbengali:2519,aumatragurmukhi:2636,auvowelsignbengali:2508,auvowelsigndeva:2380,auvowelsigngujarati:2764,avagrahadeva:2365,aybarmenian:1377,ayin:1506,ayinaltonehebrew:64288,ayinhebrew:1506,b:98,babengali:2476,backslash:92,backslashmonospace:65340,badeva:2348,
+        bagujarati:2732,bagurmukhi:2604,bahiragana:12400,bahtthai:3647,bakatakana:12496,bar:124,barmonospace:65372,bbopomofo:12549,bcircle:9425,bdotaccent:7683,bdotbelow:7685,beamedsixteenthnotes:9836,because:8757,becyrillic:1073,beharabic:1576,behfinalarabic:65168,behinitialarabic:65169,behiragana:12409,behmedialarabic:65170,behmeeminitialarabic:64671,behmeemisolatedarabic:64520,behnoonfinalarabic:64621,bekatakana:12505,benarmenian:1378,bet:1489,beta:946,betasymbolgreek:976,betdagesh:64305,betdageshhebrew:64305,
+        bethebrew:1489,betrafehebrew:64332,bhabengali:2477,bhadeva:2349,bhagujarati:2733,bhagurmukhi:2605,bhook:595,bihiragana:12403,bikatakana:12499,bilabialclick:664,bindigurmukhi:2562,birusquare:13105,blackcircle:9679,blackdiamond:9670,blackdownpointingtriangle:9660,blackleftpointingpointer:9668,blackleftpointingtriangle:9664,blacklenticularbracketleft:12304,blacklenticularbracketleftvertical:65083,blacklenticularbracketright:12305,blacklenticularbracketrightvertical:65084,blacklowerlefttriangle:9699,
+        blacklowerrighttriangle:9698,blackrectangle:9644,blackrightpointingpointer:9658,blackrightpointingtriangle:9654,blacksmallsquare:9642,blacksmilingface:9787,blacksquare:9632,blackstar:9733,blackupperlefttriangle:9700,blackupperrighttriangle:9701,blackuppointingsmalltriangle:9652,blackuppointingtriangle:9650,blank:9251,blinebelow:7687,block:9608,bmonospace:65346,bobaimaithai:3610,bohiragana:12412,bokatakana:12508,bparen:9373,bqsquare:13251,braceex:63732,braceleft:123,braceleftbt:63731,braceleftmid:63730,
+        braceleftmonospace:65371,braceleftsmall:65115,bracelefttp:63729,braceleftvertical:65079,braceright:125,bracerightbt:63742,bracerightmid:63741,bracerightmonospace:65373,bracerightsmall:65116,bracerighttp:63740,bracerightvertical:65080,bracketleft:91,bracketleftbt:63728,bracketleftex:63727,bracketleftmonospace:65339,bracketlefttp:63726,bracketright:93,bracketrightbt:63739,bracketrightex:63738,bracketrightmonospace:65341,bracketrighttp:63737,breve:728,brevebelowcmb:814,brevecmb:774,breveinvertedbelowcmb:815,
+        breveinvertedcmb:785,breveinverteddoublecmb:865,bridgebelowcmb:810,bridgeinvertedbelowcmb:826,brokenbar:166,bstroke:384,bsuperior:63210,btopbar:387,buhiragana:12406,bukatakana:12502,bullet:8226,bulletinverse:9688,bulletoperator:8729,bullseye:9678,c:99,caarmenian:1390,cabengali:2458,cacute:263,cadeva:2330,cagujarati:2714,cagurmukhi:2586,calsquare:13192,candrabindubengali:2433,candrabinducmb:784,candrabindudeva:2305,candrabindugujarati:2689,capslock:8682,careof:8453,caron:711,caronbelowcmb:812,caroncmb:780,
+        carriagereturn:8629,cbopomofo:12568,ccaron:269,ccedilla:231,ccedillaacute:7689,ccircle:9426,ccircumflex:265,ccurl:597,cdot:267,cdotaccent:267,cdsquare:13253,cedilla:184,cedillacmb:807,cent:162,centigrade:8451,centinferior:63199,centmonospace:65504,centoldstyle:63394,centsuperior:63200,chaarmenian:1401,chabengali:2459,chadeva:2331,chagujarati:2715,chagurmukhi:2587,chbopomofo:12564,cheabkhasiancyrillic:1213,checkmark:10003,checyrillic:1095,chedescenderabkhasiancyrillic:1215,chedescendercyrillic:1207,
+        chedieresiscyrillic:1269,cheharmenian:1395,chekhakassiancyrillic:1228,cheverticalstrokecyrillic:1209,chi:967,chieuchacirclekorean:12919,chieuchaparenkorean:12823,chieuchcirclekorean:12905,chieuchkorean:12618,chieuchparenkorean:12809,chochangthai:3594,chochanthai:3592,chochingthai:3593,chochoethai:3596,chook:392,cieucacirclekorean:12918,cieucaparenkorean:12822,cieuccirclekorean:12904,cieuckorean:12616,cieucparenkorean:12808,cieucuparenkorean:12828,circle:9675,circlecopyrt:169,circlemultiply:8855,circleot:8857,
+        circleplus:8853,circlepostalmark:12342,circlewithlefthalfblack:9680,circlewithrighthalfblack:9681,circumflex:710,circumflexbelowcmb:813,circumflexcmb:770,clear:8999,clickalveolar:450,clickdental:448,clicklateral:449,clickretroflex:451,club:9827,clubsuitblack:9827,clubsuitwhite:9831,cmcubedsquare:13220,cmonospace:65347,cmsquaredsquare:13216,coarmenian:1409,colon:58,colonmonetary:8353,colonmonospace:65306,colonsign:8353,colonsmall:65109,colontriangularhalfmod:721,colontriangularmod:720,comma:44,commaabovecmb:787,
+        commaaboverightcmb:789,commaaccent:63171,commaarabic:1548,commaarmenian:1373,commainferior:63201,commamonospace:65292,commareversedabovecmb:788,commareversedmod:701,commasmall:65104,commasuperior:63202,commaturnedabovecmb:786,commaturnedmod:699,compass:9788,congruent:8773,contourintegral:8750,control:8963,controlACK:6,controlBEL:7,controlBS:8,controlCAN:24,controlCR:13,controlDC1:17,controlDC2:18,controlDC3:19,controlDC4:20,controlDEL:127,controlDLE:16,controlEM:25,controlENQ:5,controlEOT:4,controlESC:27,
+        controlETB:23,controlETX:3,controlFF:12,controlFS:28,controlGS:29,controlHT:9,controlLF:10,controlNAK:21,controlRS:30,controlSI:15,controlSO:14,controlSOT:2,controlSTX:1,controlSUB:26,controlSYN:22,controlUS:31,controlVT:11,copyright:169,copyrightsans:63721,copyrightserif:63193,cornerbracketleft:12300,cornerbracketlefthalfwidth:65378,cornerbracketleftvertical:65089,cornerbracketright:12301,cornerbracketrighthalfwidth:65379,cornerbracketrightvertical:65090,corporationsquare:13183,cosquare:13255,coverkgsquare:13254,
+        cparen:9374,cruzeiro:8354,cstretched:663,curlyand:8911,curlyor:8910,currency:164,cyrBreve:63185,cyrFlex:63186,cyrbreve:63188,cyrflex:63189,d:100,daarmenian:1380,dabengali:2470,dadarabic:1590,dadeva:2342,dadfinalarabic:65214,dadinitialarabic:65215,dadmedialarabic:65216,dagesh:1468,dageshhebrew:1468,dagger:8224,daggerdbl:8225,dagujarati:2726,dagurmukhi:2598,dahiragana:12384,dakatakana:12480,dalarabic:1583,dalet:1491,daletdagesh:64307,daletdageshhebrew:64307,dalethebrew:1491,dalfinalarabic:65194,dammaarabic:1615,
+        dammalowarabic:1615,dammatanaltonearabic:1612,dammatanarabic:1612,danda:2404,dargahebrew:1447,dargalefthebrew:1447,dasiapneumatacyrilliccmb:1157,dblGrave:63187,dblanglebracketleft:12298,dblanglebracketleftvertical:65085,dblanglebracketright:12299,dblanglebracketrightvertical:65086,dblarchinvertedbelowcmb:811,dblarrowleft:8660,dblarrowright:8658,dbldanda:2405,dblgrave:63190,dblgravecmb:783,dblintegral:8748,dbllowline:8215,dbllowlinecmb:819,dbloverlinecmb:831,dblprimemod:698,dblverticalbar:8214,dblverticallineabovecmb:782,
+        dbopomofo:12553,dbsquare:13256,dcaron:271,dcedilla:7697,dcircle:9427,dcircumflexbelow:7699,dcroat:273,ddabengali:2465,ddadeva:2337,ddagujarati:2721,ddagurmukhi:2593,ddalarabic:1672,ddalfinalarabic:64393,dddhadeva:2396,ddhabengali:2466,ddhadeva:2338,ddhagujarati:2722,ddhagurmukhi:2594,ddotaccent:7691,ddotbelow:7693,decimalseparatorarabic:1643,decimalseparatorpersian:1643,decyrillic:1076,degree:176,dehihebrew:1453,dehiragana:12391,deicoptic:1007,dekatakana:12487,deleteleft:9003,deleteright:8998,delta:948,
+        deltaturned:397,denominatorminusonenumeratorbengali:2552,dezh:676,dhabengali:2471,dhadeva:2343,dhagujarati:2727,dhagurmukhi:2599,dhook:599,dialytikatonos:901,dialytikatonoscmb:836,diamond:9830,diamondsuitwhite:9826,dieresis:168,dieresisacute:63191,dieresisbelowcmb:804,dieresiscmb:776,dieresisgrave:63192,dieresistonos:901,dihiragana:12386,dikatakana:12482,dittomark:12291,divide:247,divides:8739,divisionslash:8725,djecyrillic:1106,dkshade:9619,dlinebelow:7695,dlsquare:13207,dmacron:273,dmonospace:65348,
+        dnblock:9604,dochadathai:3598,dodekthai:3604,dohiragana:12393,dokatakana:12489,dollar:36,dollarinferior:63203,dollarmonospace:65284,dollaroldstyle:63268,dollarsmall:65129,dollarsuperior:63204,dong:8363,dorusquare:13094,dotaccent:729,dotaccentcmb:775,dotbelowcmb:803,dotbelowcomb:803,dotkatakana:12539,dotlessi:305,dotlessj:63166,dotlessjstrokehook:644,dotmath:8901,dottedcircle:9676,doubleyodpatah:64287,doubleyodpatahhebrew:64287,downtackbelowcmb:798,downtackmod:725,dparen:9375,dsuperior:63211,dtail:598,
+        dtopbar:396,duhiragana:12389,dukatakana:12485,dz:499,dzaltone:675,dzcaron:454,dzcurl:677,dzeabkhasiancyrillic:1249,dzecyrillic:1109,dzhecyrillic:1119,e:101,eacute:233,earth:9793,ebengali:2447,ebopomofo:12572,ebreve:277,ecandradeva:2317,ecandragujarati:2701,ecandravowelsigndeva:2373,ecandravowelsigngujarati:2757,ecaron:283,ecedillabreve:7709,echarmenian:1381,echyiwnarmenian:1415,ecircle:9428,ecircumflex:234,ecircumflexacute:7871,ecircumflexbelow:7705,ecircumflexdotbelow:7879,ecircumflexgrave:7873,
+        ecircumflexhookabove:7875,ecircumflextilde:7877,ecyrillic:1108,edblgrave:517,edeva:2319,edieresis:235,edot:279,edotaccent:279,edotbelow:7865,eegurmukhi:2575,eematragurmukhi:2631,efcyrillic:1092,egrave:232,egujarati:2703,eharmenian:1383,ehbopomofo:12573,ehiragana:12360,ehookabove:7867,eibopomofo:12575,eight:56,eightarabic:1640,eightbengali:2542,eightcircle:9319,eightcircleinversesansserif:10129,eightdeva:2414,eighteencircle:9329,eighteenparen:9349,eighteenperiod:9369,eightgujarati:2798,eightgurmukhi:2670,
+        eighthackarabic:1640,eighthangzhou:12328,eighthnotebeamed:9835,eightideographicparen:12839,eightinferior:8328,eightmonospace:65304,eightoldstyle:63288,eightparen:9339,eightperiod:9359,eightpersian:1784,eightroman:8567,eightsuperior:8312,eightthai:3672,einvertedbreve:519,eiotifiedcyrillic:1125,ekatakana:12456,ekatakanahalfwidth:65396,ekonkargurmukhi:2676,ekorean:12628,elcyrillic:1083,element:8712,elevencircle:9322,elevenparen:9342,elevenperiod:9362,elevenroman:8570,ellipsis:8230,ellipsisvertical:8942,
+        emacron:275,emacronacute:7703,emacrongrave:7701,emcyrillic:1084,emdash:8212,emdashvertical:65073,emonospace:65349,emphasismarkarmenian:1371,emptyset:8709,enbopomofo:12579,encyrillic:1085,endash:8211,endashvertical:65074,endescendercyrillic:1187,eng:331,engbopomofo:12581,enghecyrillic:1189,enhookcyrillic:1224,enspace:8194,eogonek:281,eokorean:12627,eopen:603,eopenclosed:666,eopenreversed:604,eopenreversedclosed:606,eopenreversedhook:605,eparen:9376,epsilon:949,epsilontonos:941,equal:61,equalmonospace:65309,
+        equalsmall:65126,equalsuperior:8316,equivalence:8801,erbopomofo:12582,ercyrillic:1088,ereversed:600,ereversedcyrillic:1101,escyrillic:1089,esdescendercyrillic:1195,esh:643,eshcurl:646,eshortdeva:2318,eshortvowelsigndeva:2374,eshreversedloop:426,eshsquatreversed:645,esmallhiragana:12359,esmallkatakana:12455,esmallkatakanahalfwidth:65386,estimated:8494,esuperior:63212,eta:951,etarmenian:1384,etatonos:942,eth:240,etilde:7869,etildebelow:7707,etnahtafoukhhebrew:1425,etnahtafoukhlefthebrew:1425,etnahtahebrew:1425,
+        etnahtalefthebrew:1425,eturned:477,eukorean:12641,euro:8364,evowelsignbengali:2503,evowelsigndeva:2375,evowelsigngujarati:2759,exclam:33,exclamarmenian:1372,exclamdbl:8252,exclamdown:161,exclamdownsmall:63393,exclammonospace:65281,exclamsmall:63265,existential:8707,ezh:658,ezhcaron:495,ezhcurl:659,ezhreversed:441,ezhtail:442,f:102,fadeva:2398,fagurmukhi:2654,fahrenheit:8457,fathaarabic:1614,fathalowarabic:1614,fathatanarabic:1611,fbopomofo:12552,fcircle:9429,fdotaccent:7711,feharabic:1601,feharmenian:1414,
+        fehfinalarabic:65234,fehinitialarabic:65235,fehmedialarabic:65236,feicoptic:997,female:9792,ff:64256,ffi:64259,ffl:64260,fi:64257,fifteencircle:9326,fifteenparen:9346,fifteenperiod:9366,figuredash:8210,filledbox:9632,filledrect:9644,finalkaf:1498,finalkafdagesh:64314,finalkafdageshhebrew:64314,finalkafhebrew:1498,finalmem:1501,finalmemhebrew:1501,finalnun:1503,finalnunhebrew:1503,finalpe:1507,finalpehebrew:1507,finaltsadi:1509,finaltsadihebrew:1509,firsttonechinese:713,fisheye:9673,fitacyrillic:1139,
+        five:53,fivearabic:1637,fivebengali:2539,fivecircle:9316,fivecircleinversesansserif:10126,fivedeva:2411,fiveeighths:8541,fivegujarati:2795,fivegurmukhi:2667,fivehackarabic:1637,fivehangzhou:12325,fiveideographicparen:12836,fiveinferior:8325,fivemonospace:65301,fiveoldstyle:63285,fiveparen:9336,fiveperiod:9356,fivepersian:1781,fiveroman:8564,fivesuperior:8309,fivethai:3669,fl:64258,florin:402,fmonospace:65350,fmsquare:13209,fofanthai:3615,fofathai:3613,fongmanthai:3663,forall:8704,four:52,fourarabic:1636,
+        fourbengali:2538,fourcircle:9315,fourcircleinversesansserif:10125,fourdeva:2410,fourgujarati:2794,fourgurmukhi:2666,fourhackarabic:1636,fourhangzhou:12324,fourideographicparen:12835,fourinferior:8324,fourmonospace:65300,fournumeratorbengali:2551,fouroldstyle:63284,fourparen:9335,fourperiod:9355,fourpersian:1780,fourroman:8563,foursuperior:8308,fourteencircle:9325,fourteenparen:9345,fourteenperiod:9365,fourthai:3668,fourthtonechinese:715,fparen:9377,fraction:8260,franc:8355,g:103,gabengali:2455,gacute:501,
+        gadeva:2327,gafarabic:1711,gaffinalarabic:64403,gafinitialarabic:64404,gafmedialarabic:64405,gagujarati:2711,gagurmukhi:2583,gahiragana:12364,gakatakana:12460,gamma:947,gammalatinsmall:611,gammasuperior:736,gangiacoptic:1003,gbopomofo:12557,gbreve:287,gcaron:487,gcedilla:291,gcircle:9430,gcircumflex:285,gcommaaccent:291,gdot:289,gdotaccent:289,gecyrillic:1075,gehiragana:12370,gekatakana:12466,geometricallyequal:8785,gereshaccenthebrew:1436,gereshhebrew:1523,gereshmuqdamhebrew:1437,germandbls:223,
+        gershayimaccenthebrew:1438,gershayimhebrew:1524,getamark:12307,ghabengali:2456,ghadarmenian:1394,ghadeva:2328,ghagujarati:2712,ghagurmukhi:2584,ghainarabic:1594,ghainfinalarabic:65230,ghaininitialarabic:65231,ghainmedialarabic:65232,ghemiddlehookcyrillic:1173,ghestrokecyrillic:1171,gheupturncyrillic:1169,ghhadeva:2394,ghhagurmukhi:2650,ghook:608,ghzsquare:13203,gihiragana:12366,gikatakana:12462,gimarmenian:1379,gimel:1490,gimeldagesh:64306,gimeldageshhebrew:64306,gimelhebrew:1490,gjecyrillic:1107,
+        glottalinvertedstroke:446,glottalstop:660,glottalstopinverted:662,glottalstopmod:704,glottalstopreversed:661,glottalstopreversedmod:705,glottalstopreversedsuperior:740,glottalstopstroke:673,glottalstopstrokereversed:674,gmacron:7713,gmonospace:65351,gohiragana:12372,gokatakana:12468,gparen:9378,gpasquare:13228,gradient:8711,grave:96,gravebelowcmb:790,gravecmb:768,gravecomb:768,gravedeva:2387,gravelowmod:718,gravemonospace:65344,gravetonecmb:832,greater:62,greaterequal:8805,greaterequalorless:8923,
+        greatermonospace:65310,greaterorequivalent:8819,greaterorless:8823,greateroverequal:8807,greatersmall:65125,gscript:609,gstroke:485,guhiragana:12368,guillemotleft:171,guillemotright:187,guilsinglleft:8249,guilsinglright:8250,gukatakana:12464,guramusquare:13080,gysquare:13257,h:104,haabkhasiancyrillic:1193,haaltonearabic:1729,habengali:2489,hadescendercyrillic:1203,hadeva:2361,hagujarati:2745,hagurmukhi:2617,haharabic:1581,hahfinalarabic:65186,hahinitialarabic:65187,hahiragana:12399,hahmedialarabic:65188,
+        haitusquare:13098,hakatakana:12495,hakatakanahalfwidth:65418,halantgurmukhi:2637,hamzaarabic:1569,hamzalowarabic:1569,hangulfiller:12644,hardsigncyrillic:1098,harpoonleftbarbup:8636,harpoonrightbarbup:8640,hasquare:13258,hatafpatah:1458,hatafpatah16:1458,hatafpatah23:1458,hatafpatah2f:1458,hatafpatahhebrew:1458,hatafpatahnarrowhebrew:1458,hatafpatahquarterhebrew:1458,hatafpatahwidehebrew:1458,hatafqamats:1459,hatafqamats1b:1459,hatafqamats28:1459,hatafqamats34:1459,hatafqamatshebrew:1459,hatafqamatsnarrowhebrew:1459,
+        hatafqamatsquarterhebrew:1459,hatafqamatswidehebrew:1459,hatafsegol:1457,hatafsegol17:1457,hatafsegol24:1457,hatafsegol30:1457,hatafsegolhebrew:1457,hatafsegolnarrowhebrew:1457,hatafsegolquarterhebrew:1457,hatafsegolwidehebrew:1457,hbar:295,hbopomofo:12559,hbrevebelow:7723,hcedilla:7721,hcircle:9431,hcircumflex:293,hdieresis:7719,hdotaccent:7715,hdotbelow:7717,he:1492,heart:9829,heartsuitblack:9829,heartsuitwhite:9825,hedagesh:64308,hedageshhebrew:64308,hehaltonearabic:1729,heharabic:1607,hehebrew:1492,
+        hehfinalaltonearabic:64423,hehfinalalttwoarabic:65258,hehfinalarabic:65258,hehhamzaabovefinalarabic:64421,hehhamzaaboveisolatedarabic:64420,hehinitialaltonearabic:64424,hehinitialarabic:65259,hehiragana:12408,hehmedialaltonearabic:64425,hehmedialarabic:65260,heiseierasquare:13179,hekatakana:12504,hekatakanahalfwidth:65421,hekutaarusquare:13110,henghook:615,herutusquare:13113,het:1495,hethebrew:1495,hhook:614,hhooksuperior:689,hieuhacirclekorean:12923,hieuhaparenkorean:12827,hieuhcirclekorean:12909,
+        hieuhkorean:12622,hieuhparenkorean:12813,hihiragana:12402,hikatakana:12498,hikatakanahalfwidth:65419,hiriq:1460,hiriq14:1460,hiriq21:1460,hiriq2d:1460,hiriqhebrew:1460,hiriqnarrowhebrew:1460,hiriqquarterhebrew:1460,hiriqwidehebrew:1460,hlinebelow:7830,hmonospace:65352,hoarmenian:1392,hohipthai:3627,hohiragana:12411,hokatakana:12507,hokatakanahalfwidth:65422,holam:1465,holam19:1465,holam26:1465,holam32:1465,holamhebrew:1465,holamnarrowhebrew:1465,holamquarterhebrew:1465,holamwidehebrew:1465,honokhukthai:3630,
+        hookabovecomb:777,hookcmb:777,hookpalatalizedbelowcmb:801,hookretroflexbelowcmb:802,hoonsquare:13122,horicoptic:1001,horizontalbar:8213,horncmb:795,hotsprings:9832,house:8962,hparen:9379,hsuperior:688,hturned:613,huhiragana:12405,huiitosquare:13107,hukatakana:12501,hukatakanahalfwidth:65420,hungarumlaut:733,hungarumlautcmb:779,hv:405,hyphen:45,hypheninferior:63205,hyphenmonospace:65293,hyphensmall:65123,hyphensuperior:63206,hyphentwo:8208,i:105,iacute:237,iacyrillic:1103,ibengali:2439,ibopomofo:12583,
+        ibreve:301,icaron:464,icircle:9432,icircumflex:238,icyrillic:1110,idblgrave:521,ideographearthcircle:12943,ideographfirecircle:12939,ideographicallianceparen:12863,ideographiccallparen:12858,ideographiccentrecircle:12965,ideographicclose:12294,ideographiccomma:12289,ideographiccommaleft:65380,ideographiccongratulationparen:12855,ideographiccorrectcircle:12963,ideographicearthparen:12847,ideographicenterpriseparen:12861,ideographicexcellentcircle:12957,ideographicfestivalparen:12864,ideographicfinancialcircle:12950,
+        ideographicfinancialparen:12854,ideographicfireparen:12843,ideographichaveparen:12850,ideographichighcircle:12964,ideographiciterationmark:12293,ideographiclaborcircle:12952,ideographiclaborparen:12856,ideographicleftcircle:12967,ideographiclowcircle:12966,ideographicmedicinecircle:12969,ideographicmetalparen:12846,ideographicmoonparen:12842,ideographicnameparen:12852,ideographicperiod:12290,ideographicprintcircle:12958,ideographicreachparen:12867,ideographicrepresentparen:12857,ideographicresourceparen:12862,
+        ideographicrightcircle:12968,ideographicsecretcircle:12953,ideographicselfparen:12866,ideographicsocietyparen:12851,ideographicspace:12288,ideographicspecialparen:12853,ideographicstockparen:12849,ideographicstudyparen:12859,ideographicsunparen:12848,ideographicsuperviseparen:12860,ideographicwaterparen:12844,ideographicwoodparen:12845,ideographiczero:12295,ideographmetalcircle:12942,ideographmooncircle:12938,ideographnamecircle:12948,ideographsuncircle:12944,ideographwatercircle:12940,ideographwoodcircle:12941,
+        ideva:2311,idieresis:239,idieresisacute:7727,idieresiscyrillic:1253,idotbelow:7883,iebrevecyrillic:1239,iecyrillic:1077,ieungacirclekorean:12917,ieungaparenkorean:12821,ieungcirclekorean:12903,ieungkorean:12615,ieungparenkorean:12807,igrave:236,igujarati:2695,igurmukhi:2567,ihiragana:12356,ihookabove:7881,iibengali:2440,iicyrillic:1080,iideva:2312,iigujarati:2696,iigurmukhi:2568,iimatragurmukhi:2624,iinvertedbreve:523,iishortcyrillic:1081,iivowelsignbengali:2496,iivowelsigndeva:2368,iivowelsigngujarati:2752,
+        ij:307,ikatakana:12452,ikatakanahalfwidth:65394,ikorean:12643,ilde:732,iluyhebrew:1452,imacron:299,imacroncyrillic:1251,imageorapproximatelyequal:8787,imatragurmukhi:2623,imonospace:65353,increment:8710,infinity:8734,iniarmenian:1387,integral:8747,integralbottom:8993,integralbt:8993,integralex:63733,integraltop:8992,integraltp:8992,intersection:8745,intisquare:13061,invbullet:9688,invcircle:9689,invsmileface:9787,iocyrillic:1105,iogonek:303,iota:953,iotadieresis:970,iotadieresistonos:912,iotalatin:617,
+        iotatonos:943,iparen:9380,irigurmukhi:2674,ismallhiragana:12355,ismallkatakana:12451,ismallkatakanahalfwidth:65384,issharbengali:2554,istroke:616,isuperior:63213,iterationhiragana:12445,iterationkatakana:12541,itilde:297,itildebelow:7725,iubopomofo:12585,iucyrillic:1102,ivowelsignbengali:2495,ivowelsigndeva:2367,ivowelsigngujarati:2751,izhitsacyrillic:1141,izhitsadblgravecyrillic:1143,j:106,jaarmenian:1393,jabengali:2460,jadeva:2332,jagujarati:2716,jagurmukhi:2588,jbopomofo:12560,jcaron:496,jcircle:9433,
+        jcircumflex:309,jcrossedtail:669,jdotlessstroke:607,jecyrillic:1112,jeemarabic:1580,jeemfinalarabic:65182,jeeminitialarabic:65183,jeemmedialarabic:65184,jeharabic:1688,jehfinalarabic:64395,jhabengali:2461,jhadeva:2333,jhagujarati:2717,jhagurmukhi:2589,jheharmenian:1403,jis:12292,jmonospace:65354,jparen:9381,jsuperior:690,k:107,kabashkircyrillic:1185,kabengali:2453,kacute:7729,kacyrillic:1082,kadescendercyrillic:1179,kadeva:2325,kaf:1499,kafarabic:1603,kafdagesh:64315,kafdageshhebrew:64315,kaffinalarabic:65242,
+        kafhebrew:1499,kafinitialarabic:65243,kafmedialarabic:65244,kafrafehebrew:64333,kagujarati:2709,kagurmukhi:2581,kahiragana:12363,kahookcyrillic:1220,kakatakana:12459,kakatakanahalfwidth:65398,kappa:954,kappasymbolgreek:1008,kapyeounmieumkorean:12657,kapyeounphieuphkorean:12676,kapyeounpieupkorean:12664,kapyeounssangpieupkorean:12665,karoriisquare:13069,kashidaautoarabic:1600,kashidaautonosidebearingarabic:1600,kasmallkatakana:12533,kasquare:13188,kasraarabic:1616,kasratanarabic:1613,kastrokecyrillic:1183,
+        katahiraprolongmarkhalfwidth:65392,kaverticalstrokecyrillic:1181,kbopomofo:12558,kcalsquare:13193,kcaron:489,kcedilla:311,kcircle:9434,kcommaaccent:311,kdotbelow:7731,keharmenian:1412,kehiragana:12369,kekatakana:12465,kekatakanahalfwidth:65401,kenarmenian:1391,kesmallkatakana:12534,kgreenlandic:312,khabengali:2454,khacyrillic:1093,khadeva:2326,khagujarati:2710,khagurmukhi:2582,khaharabic:1582,khahfinalarabic:65190,khahinitialarabic:65191,khahmedialarabic:65192,kheicoptic:999,khhadeva:2393,khhagurmukhi:2649,
+        khieukhacirclekorean:12920,khieukhaparenkorean:12824,khieukhcirclekorean:12906,khieukhkorean:12619,khieukhparenkorean:12810,khokhaithai:3586,khokhonthai:3589,khokhuatthai:3587,khokhwaithai:3588,khomutthai:3675,khook:409,khorakhangthai:3590,khzsquare:13201,kihiragana:12365,kikatakana:12461,kikatakanahalfwidth:65399,kiroguramusquare:13077,kiromeetorusquare:13078,kirosquare:13076,kiyeokacirclekorean:12910,kiyeokaparenkorean:12814,kiyeokcirclekorean:12896,kiyeokkorean:12593,kiyeokparenkorean:12800,kiyeoksioskorean:12595,
+        kjecyrillic:1116,klinebelow:7733,klsquare:13208,kmcubedsquare:13222,kmonospace:65355,kmsquaredsquare:13218,kohiragana:12371,kohmsquare:13248,kokaithai:3585,kokatakana:12467,kokatakanahalfwidth:65402,kooposquare:13086,koppacyrillic:1153,koreanstandardsymbol:12927,koroniscmb:835,kparen:9382,kpasquare:13226,ksicyrillic:1135,ktsquare:13263,kturned:670,kuhiragana:12367,kukatakana:12463,kukatakanahalfwidth:65400,kvsquare:13240,kwsquare:13246,l:108,labengali:2482,lacute:314,ladeva:2354,lagujarati:2738,lagurmukhi:2610,
+        lakkhangyaothai:3653,lamaleffinalarabic:65276,lamalefhamzaabovefinalarabic:65272,lamalefhamzaaboveisolatedarabic:65271,lamalefhamzabelowfinalarabic:65274,lamalefhamzabelowisolatedarabic:65273,lamalefisolatedarabic:65275,lamalefmaddaabovefinalarabic:65270,lamalefmaddaaboveisolatedarabic:65269,lamarabic:1604,lambda:955,lambdastroke:411,lamed:1500,lameddagesh:64316,lameddageshhebrew:64316,lamedhebrew:1500,lamfinalarabic:65246,lamhahinitialarabic:64714,laminitialarabic:65247,lamjeeminitialarabic:64713,
+        lamkhahinitialarabic:64715,lamlamhehisolatedarabic:65010,lammedialarabic:65248,lammeemhahinitialarabic:64904,lammeeminitialarabic:64716,largecircle:9711,lbar:410,lbelt:620,lbopomofo:12556,lcaron:318,lcedilla:316,lcircle:9435,lcircumflexbelow:7741,lcommaaccent:316,ldot:320,ldotaccent:320,ldotbelow:7735,ldotbelowmacron:7737,leftangleabovecmb:794,lefttackbelowcmb:792,less:60,lessequal:8804,lessequalorgreater:8922,lessmonospace:65308,lessorequivalent:8818,lessorgreater:8822,lessoverequal:8806,lesssmall:65124,
+        lezh:622,lfblock:9612,lhookretroflex:621,lira:8356,liwnarmenian:1388,lj:457,ljecyrillic:1113,ll:63168,lladeva:2355,llagujarati:2739,llinebelow:7739,llladeva:2356,llvocalicbengali:2529,llvocalicdeva:2401,llvocalicvowelsignbengali:2531,llvocalicvowelsigndeva:2403,lmiddletilde:619,lmonospace:65356,lmsquare:13264,lochulathai:3628,logicaland:8743,logicalnot:172,logicalnotreversed:8976,logicalor:8744,lolingthai:3621,longs:383,lowlinecenterline:65102,lowlinecmb:818,lowlinedashed:65101,lozenge:9674,lparen:9383,
+        lslash:322,lsquare:8467,lsuperior:63214,ltshade:9617,luthai:3622,lvocalicbengali:2444,lvocalicdeva:2316,lvocalicvowelsignbengali:2530,lvocalicvowelsigndeva:2402,lxsquare:13267,m:109,mabengali:2478,macron:175,macronbelowcmb:817,macroncmb:772,macronlowmod:717,macronmonospace:65507,macute:7743,madeva:2350,magujarati:2734,magurmukhi:2606,mahapakhhebrew:1444,mahapakhlefthebrew:1444,mahiragana:12414,maichattawalowleftthai:63637,maichattawalowrightthai:63636,maichattawathai:3659,maichattawaupperleftthai:63635,
+        maieklowleftthai:63628,maieklowrightthai:63627,maiekthai:3656,maiekupperleftthai:63626,maihanakatleftthai:63620,maihanakatthai:3633,maitaikhuleftthai:63625,maitaikhuthai:3655,maitholowleftthai:63631,maitholowrightthai:63630,maithothai:3657,maithoupperleftthai:63629,maitrilowleftthai:63634,maitrilowrightthai:63633,maitrithai:3658,maitriupperleftthai:63632,maiyamokthai:3654,makatakana:12510,makatakanahalfwidth:65423,male:9794,mansyonsquare:13127,maqafhebrew:1470,mars:9794,masoracirclehebrew:1455,masquare:13187,
+        mbopomofo:12551,mbsquare:13268,mcircle:9436,mcubedsquare:13221,mdotaccent:7745,mdotbelow:7747,meemarabic:1605,meemfinalarabic:65250,meeminitialarabic:65251,meemmedialarabic:65252,meemmeeminitialarabic:64721,meemmeemisolatedarabic:64584,meetorusquare:13133,mehiragana:12417,meizierasquare:13182,mekatakana:12513,mekatakanahalfwidth:65426,mem:1502,memdagesh:64318,memdageshhebrew:64318,memhebrew:1502,menarmenian:1396,merkhahebrew:1445,merkhakefulahebrew:1446,merkhakefulalefthebrew:1446,merkhalefthebrew:1445,
+        mhook:625,mhzsquare:13202,middledotkatakanahalfwidth:65381,middot:183,mieumacirclekorean:12914,mieumaparenkorean:12818,mieumcirclekorean:12900,mieumkorean:12609,mieumpansioskorean:12656,mieumparenkorean:12804,mieumpieupkorean:12654,mieumsioskorean:12655,mihiragana:12415,mikatakana:12511,mikatakanahalfwidth:65424,minus:8722,minusbelowcmb:800,minuscircle:8854,minusmod:727,minusplus:8723,minute:8242,miribaarusquare:13130,mirisquare:13129,mlonglegturned:624,mlsquare:13206,mmcubedsquare:13219,mmonospace:65357,
+        mmsquaredsquare:13215,mohiragana:12418,mohmsquare:13249,mokatakana:12514,mokatakanahalfwidth:65427,molsquare:13270,momathai:3617,moverssquare:13223,moverssquaredsquare:13224,mparen:9384,mpasquare:13227,mssquare:13235,msuperior:63215,mturned:623,mu:181,mu1:181,muasquare:13186,muchgreater:8811,muchless:8810,mufsquare:13196,mugreek:956,mugsquare:13197,muhiragana:12416,mukatakana:12512,mukatakanahalfwidth:65425,mulsquare:13205,multiply:215,mumsquare:13211,munahhebrew:1443,munahlefthebrew:1443,musicalnote:9834,
+        musicalnotedbl:9835,musicflatsign:9837,musicsharpsign:9839,mussquare:13234,muvsquare:13238,muwsquare:13244,mvmegasquare:13241,mvsquare:13239,mwmegasquare:13247,mwsquare:13245,n:110,nabengali:2472,nabla:8711,nacute:324,nadeva:2344,nagujarati:2728,nagurmukhi:2600,nahiragana:12394,nakatakana:12490,nakatakanahalfwidth:65413,napostrophe:329,nasquare:13185,nbopomofo:12555,nbspace:160,ncaron:328,ncedilla:326,ncircle:9437,ncircumflexbelow:7755,ncommaaccent:326,ndotaccent:7749,ndotbelow:7751,nehiragana:12397,
+        nekatakana:12493,nekatakanahalfwidth:65416,newsheqelsign:8362,nfsquare:13195,ngabengali:2457,ngadeva:2329,ngagujarati:2713,ngagurmukhi:2585,ngonguthai:3591,nhiragana:12435,nhookleft:626,nhookretroflex:627,nieunacirclekorean:12911,nieunaparenkorean:12815,nieuncieuckorean:12597,nieuncirclekorean:12897,nieunhieuhkorean:12598,nieunkorean:12596,nieunpansioskorean:12648,nieunparenkorean:12801,nieunsioskorean:12647,nieuntikeutkorean:12646,nihiragana:12395,nikatakana:12491,nikatakanahalfwidth:65414,nikhahitleftthai:63641,
+        nikhahitthai:3661,nine:57,ninearabic:1641,ninebengali:2543,ninecircle:9320,ninecircleinversesansserif:10130,ninedeva:2415,ninegujarati:2799,ninegurmukhi:2671,ninehackarabic:1641,ninehangzhou:12329,nineideographicparen:12840,nineinferior:8329,ninemonospace:65305,nineoldstyle:63289,nineparen:9340,nineperiod:9360,ninepersian:1785,nineroman:8568,ninesuperior:8313,nineteencircle:9330,nineteenparen:9350,nineteenperiod:9370,ninethai:3673,nj:460,njecyrillic:1114,nkatakana:12531,nkatakanahalfwidth:65437,nlegrightlong:414,
+        nlinebelow:7753,nmonospace:65358,nmsquare:13210,nnabengali:2467,nnadeva:2339,nnagujarati:2723,nnagurmukhi:2595,nnnadeva:2345,nohiragana:12398,nokatakana:12494,nokatakanahalfwidth:65417,nonbreakingspace:160,nonenthai:3603,nonuthai:3609,noonarabic:1606,noonfinalarabic:65254,noonghunnaarabic:1722,noonghunnafinalarabic:64415,nooninitialarabic:65255,noonjeeminitialarabic:64722,noonjeemisolatedarabic:64587,noonmedialarabic:65256,noonmeeminitialarabic:64725,noonmeemisolatedarabic:64590,noonnoonfinalarabic:64653,
+        notcontains:8716,notelement:8713,notelementof:8713,notequal:8800,notgreater:8815,notgreaternorequal:8817,notgreaternorless:8825,notidentical:8802,notless:8814,notlessnorequal:8816,notparallel:8742,notprecedes:8832,notsubset:8836,notsucceeds:8833,notsuperset:8837,nowarmenian:1398,nparen:9385,nssquare:13233,nsuperior:8319,ntilde:241,nu:957,nuhiragana:12396,nukatakana:12492,nukatakanahalfwidth:65415,nuktabengali:2492,nuktadeva:2364,nuktagujarati:2748,nuktagurmukhi:2620,numbersign:35,numbersignmonospace:65283,
+        numbersignsmall:65119,numeralsigngreek:884,numeralsignlowergreek:885,numero:8470,nun:1504,nundagesh:64320,nundageshhebrew:64320,nunhebrew:1504,nvsquare:13237,nwsquare:13243,nyabengali:2462,nyadeva:2334,nyagujarati:2718,nyagurmukhi:2590,o:111,oacute:243,oangthai:3629,obarred:629,obarredcyrillic:1257,obarreddieresiscyrillic:1259,obengali:2451,obopomofo:12571,obreve:335,ocandradeva:2321,ocandragujarati:2705,ocandravowelsigndeva:2377,ocandravowelsigngujarati:2761,ocaron:466,ocircle:9438,ocircumflex:244,
+        ocircumflexacute:7889,ocircumflexdotbelow:7897,ocircumflexgrave:7891,ocircumflexhookabove:7893,ocircumflextilde:7895,ocyrillic:1086,odblacute:337,odblgrave:525,odeva:2323,odieresis:246,odieresiscyrillic:1255,odotbelow:7885,oe:339,oekorean:12634,ogonek:731,ogonekcmb:808,ograve:242,ogujarati:2707,oharmenian:1413,ohiragana:12362,ohookabove:7887,ohorn:417,ohornacute:7899,ohorndotbelow:7907,ohorngrave:7901,ohornhookabove:7903,ohorntilde:7905,ohungarumlaut:337,oi:419,oinvertedbreve:527,okatakana:12458,
+        okatakanahalfwidth:65397,okorean:12631,olehebrew:1451,omacron:333,omacronacute:7763,omacrongrave:7761,omdeva:2384,omega:969,omega1:982,omegacyrillic:1121,omegalatinclosed:631,omegaroundcyrillic:1147,omegatitlocyrillic:1149,omegatonos:974,omgujarati:2768,omicron:959,omicrontonos:972,omonospace:65359,one:49,onearabic:1633,onebengali:2535,onecircle:9312,onecircleinversesansserif:10122,onedeva:2407,onedotenleader:8228,oneeighth:8539,onefitted:63196,onegujarati:2791,onegurmukhi:2663,onehackarabic:1633,
+        onehalf:189,onehangzhou:12321,oneideographicparen:12832,oneinferior:8321,onemonospace:65297,onenumeratorbengali:2548,oneoldstyle:63281,oneparen:9332,oneperiod:9352,onepersian:1777,onequarter:188,oneroman:8560,onesuperior:185,onethai:3665,onethird:8531,oogonek:491,oogonekmacron:493,oogurmukhi:2579,oomatragurmukhi:2635,oopen:596,oparen:9386,openbullet:9702,option:8997,ordfeminine:170,ordmasculine:186,orthogonal:8735,oshortdeva:2322,oshortvowelsigndeva:2378,oslash:248,oslashacute:511,osmallhiragana:12361,
+        osmallkatakana:12457,osmallkatakanahalfwidth:65387,ostrokeacute:511,osuperior:63216,otcyrillic:1151,otilde:245,otildeacute:7757,otildedieresis:7759,oubopomofo:12577,overline:8254,overlinecenterline:65098,overlinecmb:773,overlinedashed:65097,overlinedblwavy:65100,overlinewavy:65099,overscore:175,ovowelsignbengali:2507,ovowelsigndeva:2379,ovowelsigngujarati:2763,p:112,paampssquare:13184,paasentosquare:13099,pabengali:2474,pacute:7765,padeva:2346,pagedown:8671,pageup:8670,pagujarati:2730,pagurmukhi:2602,
+        pahiragana:12401,paiyannoithai:3631,pakatakana:12497,palatalizationcyrilliccmb:1156,palochkacyrillic:1216,pansioskorean:12671,paragraph:182,parallel:8741,parenleft:40,parenleftaltonearabic:64830,parenleftbt:63725,parenleftex:63724,parenleftinferior:8333,parenleftmonospace:65288,parenleftsmall:65113,parenleftsuperior:8317,parenlefttp:63723,parenleftvertical:65077,parenright:41,parenrightaltonearabic:64831,parenrightbt:63736,parenrightex:63735,parenrightinferior:8334,parenrightmonospace:65289,parenrightsmall:65114,
+        parenrightsuperior:8318,parenrighttp:63734,parenrightvertical:65078,partialdiff:8706,paseqhebrew:1472,pashtahebrew:1433,pasquare:13225,patah:1463,patah11:1463,patah1d:1463,patah2a:1463,patahhebrew:1463,patahnarrowhebrew:1463,patahquarterhebrew:1463,patahwidehebrew:1463,pazerhebrew:1441,pbopomofo:12550,pcircle:9439,pdotaccent:7767,pe:1508,pecyrillic:1087,pedagesh:64324,pedageshhebrew:64324,peezisquare:13115,pefinaldageshhebrew:64323,peharabic:1662,peharmenian:1402,pehebrew:1508,pehfinalarabic:64343,
+        pehinitialarabic:64344,pehiragana:12410,pehmedialarabic:64345,pekatakana:12506,pemiddlehookcyrillic:1191,perafehebrew:64334,percent:37,percentarabic:1642,percentmonospace:65285,percentsmall:65130,period:46,periodarmenian:1417,periodcentered:183,periodhalfwidth:65377,periodinferior:63207,periodmonospace:65294,periodsmall:65106,periodsuperior:63208,perispomenigreekcmb:834,perpendicular:8869,perthousand:8240,peseta:8359,pfsquare:13194,phabengali:2475,phadeva:2347,phagujarati:2731,phagurmukhi:2603,phi:966,
+        phi1:981,phieuphacirclekorean:12922,phieuphaparenkorean:12826,phieuphcirclekorean:12908,phieuphkorean:12621,phieuphparenkorean:12812,philatin:632,phinthuthai:3642,phisymbolgreek:981,phook:421,phophanthai:3614,phophungthai:3612,phosamphaothai:3616,pi:960,pieupacirclekorean:12915,pieupaparenkorean:12819,pieupcieuckorean:12662,pieupcirclekorean:12901,pieupkiyeokkorean:12658,pieupkorean:12610,pieupparenkorean:12805,pieupsioskiyeokkorean:12660,pieupsioskorean:12612,pieupsiostikeutkorean:12661,pieupthieuthkorean:12663,
+        pieuptikeutkorean:12659,pihiragana:12404,pikatakana:12500,pisymbolgreek:982,piwrarmenian:1411,plus:43,plusbelowcmb:799,pluscircle:8853,plusminus:177,plusmod:726,plusmonospace:65291,plussmall:65122,plussuperior:8314,pmonospace:65360,pmsquare:13272,pohiragana:12413,pointingindexdownwhite:9759,pointingindexleftwhite:9756,pointingindexrightwhite:9758,pointingindexupwhite:9757,pokatakana:12509,poplathai:3611,postalmark:12306,postalmarkface:12320,pparen:9387,precedes:8826,prescription:8478,primemod:697,
+        primereversed:8245,product:8719,projective:8965,prolongedkana:12540,propellor:8984,propersubset:8834,propersuperset:8835,proportion:8759,proportional:8733,psi:968,psicyrillic:1137,psilipneumatacyrilliccmb:1158,pssquare:13232,puhiragana:12407,pukatakana:12503,pvsquare:13236,pwsquare:13242,q:113,qadeva:2392,qadmahebrew:1448,qafarabic:1602,qaffinalarabic:65238,qafinitialarabic:65239,qafmedialarabic:65240,qamats:1464,qamats10:1464,qamats1a:1464,qamats1c:1464,qamats27:1464,qamats29:1464,qamats33:1464,
+        qamatsde:1464,qamatshebrew:1464,qamatsnarrowhebrew:1464,qamatsqatanhebrew:1464,qamatsqatannarrowhebrew:1464,qamatsqatanquarterhebrew:1464,qamatsqatanwidehebrew:1464,qamatsquarterhebrew:1464,qamatswidehebrew:1464,qarneyparahebrew:1439,qbopomofo:12561,qcircle:9440,qhook:672,qmonospace:65361,qof:1511,qofdagesh:64327,qofdageshhebrew:64327,qofhebrew:1511,qparen:9388,quarternote:9833,qubuts:1467,qubuts18:1467,qubuts25:1467,qubuts31:1467,qubutshebrew:1467,qubutsnarrowhebrew:1467,qubutsquarterhebrew:1467,
+        qubutswidehebrew:1467,question:63,questionarabic:1567,questionarmenian:1374,questiondown:191,questiondownsmall:63423,questiongreek:894,questionmonospace:65311,questionsmall:63295,quotedbl:34,quotedblbase:8222,quotedblleft:8220,quotedblmonospace:65282,quotedblprime:12318,quotedblprimereversed:12317,quotedblright:8221,quoteleft:8216,quoteleftreversed:8219,quotereversed:8219,quoteright:8217,quoterightn:329,quotesinglbase:8218,quotesingle:39,quotesinglemonospace:65287,r:114,raarmenian:1404,rabengali:2480,
+        racute:341,radeva:2352,radical:8730,radicalex:63717,radoverssquare:13230,radoverssquaredsquare:13231,radsquare:13229,rafe:1471,rafehebrew:1471,ragujarati:2736,ragurmukhi:2608,rahiragana:12425,rakatakana:12521,rakatakanahalfwidth:65431,ralowerdiagonalbengali:2545,ramiddlediagonalbengali:2544,ramshorn:612,ratio:8758,rbopomofo:12566,rcaron:345,rcedilla:343,rcircle:9441,rcommaaccent:343,rdblgrave:529,rdotaccent:7769,rdotbelow:7771,rdotbelowmacron:7773,referencemark:8251,reflexsubset:8838,reflexsuperset:8839,
+        registered:174,registersans:63720,registerserif:63194,reharabic:1585,reharmenian:1408,rehfinalarabic:65198,rehiragana:12428,rekatakana:12524,rekatakanahalfwidth:65434,resh:1512,reshdageshhebrew:64328,reshhebrew:1512,reversedtilde:8765,reviahebrew:1431,reviamugrashhebrew:1431,revlogicalnot:8976,rfishhook:638,rfishhookreversed:639,rhabengali:2525,rhadeva:2397,rho:961,rhook:637,rhookturned:635,rhookturnedsuperior:693,rhosymbolgreek:1009,rhotichookmod:734,rieulacirclekorean:12913,rieulaparenkorean:12817,
+        rieulcirclekorean:12899,rieulhieuhkorean:12608,rieulkiyeokkorean:12602,rieulkiyeoksioskorean:12649,rieulkorean:12601,rieulmieumkorean:12603,rieulpansioskorean:12652,rieulparenkorean:12803,rieulphieuphkorean:12607,rieulpieupkorean:12604,rieulpieupsioskorean:12651,rieulsioskorean:12605,rieulthieuthkorean:12606,rieultikeutkorean:12650,rieulyeorinhieuhkorean:12653,rightangle:8735,righttackbelowcmb:793,righttriangle:8895,rihiragana:12426,rikatakana:12522,rikatakanahalfwidth:65432,ring:730,ringbelowcmb:805,
+        ringcmb:778,ringhalfleft:703,ringhalfleftarmenian:1369,ringhalfleftbelowcmb:796,ringhalfleftcentered:723,ringhalfright:702,ringhalfrightbelowcmb:825,ringhalfrightcentered:722,rinvertedbreve:531,rittorusquare:13137,rlinebelow:7775,rlongleg:636,rlonglegturned:634,rmonospace:65362,rohiragana:12429,rokatakana:12525,rokatakanahalfwidth:65435,roruathai:3619,rparen:9389,rrabengali:2524,rradeva:2353,rragurmukhi:2652,rreharabic:1681,rrehfinalarabic:64397,rrvocalicbengali:2528,rrvocalicdeva:2400,rrvocalicgujarati:2784,
+        rrvocalicvowelsignbengali:2500,rrvocalicvowelsigndeva:2372,rrvocalicvowelsigngujarati:2756,rsuperior:63217,rtblock:9616,rturned:633,rturnedsuperior:692,ruhiragana:12427,rukatakana:12523,rukatakanahalfwidth:65433,rupeemarkbengali:2546,rupeesignbengali:2547,rupiah:63197,ruthai:3620,rvocalicbengali:2443,rvocalicdeva:2315,rvocalicgujarati:2699,rvocalicvowelsignbengali:2499,rvocalicvowelsigndeva:2371,rvocalicvowelsigngujarati:2755,s:115,sabengali:2488,sacute:347,sacutedotaccent:7781,sadarabic:1589,sadeva:2360,
+        sadfinalarabic:65210,sadinitialarabic:65211,sadmedialarabic:65212,sagujarati:2744,sagurmukhi:2616,sahiragana:12373,sakatakana:12469,sakatakanahalfwidth:65403,sallallahoualayhewasallamarabic:65018,samekh:1505,samekhdagesh:64321,samekhdageshhebrew:64321,samekhhebrew:1505,saraaathai:3634,saraaethai:3649,saraaimaimalaithai:3652,saraaimaimuanthai:3651,saraamthai:3635,saraathai:3632,saraethai:3648,saraiileftthai:63622,saraiithai:3637,saraileftthai:63621,saraithai:3636,saraothai:3650,saraueeleftthai:63624,
+        saraueethai:3639,saraueleftthai:63623,sarauethai:3638,sarauthai:3640,sarauuthai:3641,sbopomofo:12569,scaron:353,scarondotaccent:7783,scedilla:351,schwa:601,schwacyrillic:1241,schwadieresiscyrillic:1243,schwahook:602,scircle:9442,scircumflex:349,scommaaccent:537,sdotaccent:7777,sdotbelow:7779,sdotbelowdotaccent:7785,seagullbelowcmb:828,second:8243,secondtonechinese:714,section:167,seenarabic:1587,seenfinalarabic:65202,seeninitialarabic:65203,seenmedialarabic:65204,segol:1462,segol13:1462,segol1f:1462,
+        segol2c:1462,segolhebrew:1462,segolnarrowhebrew:1462,segolquarterhebrew:1462,segoltahebrew:1426,segolwidehebrew:1462,seharmenian:1405,sehiragana:12379,sekatakana:12475,sekatakanahalfwidth:65406,semicolon:59,semicolonarabic:1563,semicolonmonospace:65307,semicolonsmall:65108,semivoicedmarkkana:12444,semivoicedmarkkanahalfwidth:65439,sentisquare:13090,sentosquare:13091,seven:55,sevenarabic:1639,sevenbengali:2541,sevencircle:9318,sevencircleinversesansserif:10128,sevendeva:2413,seveneighths:8542,sevengujarati:2797,
+        sevengurmukhi:2669,sevenhackarabic:1639,sevenhangzhou:12327,sevenideographicparen:12838,seveninferior:8327,sevenmonospace:65303,sevenoldstyle:63287,sevenparen:9338,sevenperiod:9358,sevenpersian:1783,sevenroman:8566,sevensuperior:8311,seventeencircle:9328,seventeenparen:9348,seventeenperiod:9368,seventhai:3671,sfthyphen:173,shaarmenian:1399,shabengali:2486,shacyrillic:1096,shaddaarabic:1617,shaddadammaarabic:64609,shaddadammatanarabic:64606,shaddafathaarabic:64608,shaddakasraarabic:64610,shaddakasratanarabic:64607,
+        shade:9618,shadedark:9619,shadelight:9617,shademedium:9618,shadeva:2358,shagujarati:2742,shagurmukhi:2614,shalshelethebrew:1427,shbopomofo:12565,shchacyrillic:1097,sheenarabic:1588,sheenfinalarabic:65206,sheeninitialarabic:65207,sheenmedialarabic:65208,sheicoptic:995,sheqel:8362,sheqelhebrew:8362,sheva:1456,sheva115:1456,sheva15:1456,sheva22:1456,sheva2e:1456,shevahebrew:1456,shevanarrowhebrew:1456,shevaquarterhebrew:1456,shevawidehebrew:1456,shhacyrillic:1211,shimacoptic:1005,shin:1513,shindagesh:64329,
+        shindageshhebrew:64329,shindageshshindot:64300,shindageshshindothebrew:64300,shindageshsindot:64301,shindageshsindothebrew:64301,shindothebrew:1473,shinhebrew:1513,shinshindot:64298,shinshindothebrew:64298,shinsindot:64299,shinsindothebrew:64299,shook:642,sigma:963,sigma1:962,sigmafinal:962,sigmalunatesymbolgreek:1010,sihiragana:12375,sikatakana:12471,sikatakanahalfwidth:65404,siluqhebrew:1469,siluqlefthebrew:1469,similar:8764,sindothebrew:1474,siosacirclekorean:12916,siosaparenkorean:12820,sioscieuckorean:12670,
+        sioscirclekorean:12902,sioskiyeokkorean:12666,sioskorean:12613,siosnieunkorean:12667,siosparenkorean:12806,siospieupkorean:12669,siostikeutkorean:12668,six:54,sixarabic:1638,sixbengali:2540,sixcircle:9317,sixcircleinversesansserif:10127,sixdeva:2412,sixgujarati:2796,sixgurmukhi:2668,sixhackarabic:1638,sixhangzhou:12326,sixideographicparen:12837,sixinferior:8326,sixmonospace:65302,sixoldstyle:63286,sixparen:9337,sixperiod:9357,sixpersian:1782,sixroman:8565,sixsuperior:8310,sixteencircle:9327,sixteencurrencydenominatorbengali:2553,
+        sixteenparen:9347,sixteenperiod:9367,sixthai:3670,slash:47,slashmonospace:65295,slong:383,slongdotaccent:7835,smileface:9786,smonospace:65363,sofpasuqhebrew:1475,softhyphen:173,softsigncyrillic:1100,sohiragana:12381,sokatakana:12477,sokatakanahalfwidth:65407,soliduslongoverlaycmb:824,solidusshortoverlaycmb:823,sorusithai:3625,sosalathai:3624,sosothai:3595,sosuathai:3626,space:32,spacehackarabic:32,spade:9824,spadesuitblack:9824,spadesuitwhite:9828,sparen:9390,squarebelowcmb:827,squarecc:13252,squarecm:13213,
+        squarediagonalcrosshatchfill:9641,squarehorizontalfill:9636,squarekg:13199,squarekm:13214,squarekmcapital:13262,squareln:13265,squarelog:13266,squaremg:13198,squaremil:13269,squaremm:13212,squaremsquared:13217,squareorthogonalcrosshatchfill:9638,squareupperlefttolowerrightfill:9639,squareupperrighttolowerleftfill:9640,squareverticalfill:9637,squarewhitewithsmallblack:9635,srsquare:13275,ssabengali:2487,ssadeva:2359,ssagujarati:2743,ssangcieuckorean:12617,ssanghieuhkorean:12677,ssangieungkorean:12672,
+        ssangkiyeokkorean:12594,ssangnieunkorean:12645,ssangpieupkorean:12611,ssangsioskorean:12614,ssangtikeutkorean:12600,ssuperior:63218,sterling:163,sterlingmonospace:65505,strokelongoverlaycmb:822,strokeshortoverlaycmb:821,subset:8834,subsetnotequal:8842,subsetorequal:8838,succeeds:8827,suchthat:8715,suhiragana:12377,sukatakana:12473,sukatakanahalfwidth:65405,sukunarabic:1618,summation:8721,sun:9788,superset:8835,supersetnotequal:8843,supersetorequal:8839,svsquare:13276,syouwaerasquare:13180,t:116,tabengali:2468,
+        tackdown:8868,tackleft:8867,tadeva:2340,tagujarati:2724,tagurmukhi:2596,taharabic:1591,tahfinalarabic:65218,tahinitialarabic:65219,tahiragana:12383,tahmedialarabic:65220,taisyouerasquare:13181,takatakana:12479,takatakanahalfwidth:65408,tatweelarabic:1600,tau:964,tav:1514,tavdages:64330,tavdagesh:64330,tavdageshhebrew:64330,tavhebrew:1514,tbar:359,tbopomofo:12554,tcaron:357,tccurl:680,tcedilla:355,tcheharabic:1670,tchehfinalarabic:64379,tchehinitialarabic:64380,tchehmedialarabic:64381,tcircle:9443,
+        tcircumflexbelow:7793,tcommaaccent:355,tdieresis:7831,tdotaccent:7787,tdotbelow:7789,tecyrillic:1090,tedescendercyrillic:1197,teharabic:1578,tehfinalarabic:65174,tehhahinitialarabic:64674,tehhahisolatedarabic:64524,tehinitialarabic:65175,tehiragana:12390,tehjeeminitialarabic:64673,tehjeemisolatedarabic:64523,tehmarbutaarabic:1577,tehmarbutafinalarabic:65172,tehmedialarabic:65176,tehmeeminitialarabic:64676,tehmeemisolatedarabic:64526,tehnoonfinalarabic:64627,tekatakana:12486,tekatakanahalfwidth:65411,
+        telephone:8481,telephoneblack:9742,telishagedolahebrew:1440,telishaqetanahebrew:1449,tencircle:9321,tenideographicparen:12841,tenparen:9341,tenperiod:9361,tenroman:8569,tesh:679,tet:1496,tetdagesh:64312,tetdageshhebrew:64312,tethebrew:1496,tetsecyrillic:1205,tevirhebrew:1435,tevirlefthebrew:1435,thabengali:2469,thadeva:2341,thagujarati:2725,thagurmukhi:2597,thalarabic:1584,thalfinalarabic:65196,thanthakhatlowleftthai:63640,thanthakhatlowrightthai:63639,thanthakhatthai:3660,thanthakhatupperleftthai:63638,
+        theharabic:1579,thehfinalarabic:65178,thehinitialarabic:65179,thehmedialarabic:65180,thereexists:8707,therefore:8756,theta:952,theta1:977,thetasymbolgreek:977,thieuthacirclekorean:12921,thieuthaparenkorean:12825,thieuthcirclekorean:12907,thieuthkorean:12620,thieuthparenkorean:12811,thirteencircle:9324,thirteenparen:9344,thirteenperiod:9364,thonangmonthothai:3601,thook:429,thophuthaothai:3602,thorn:254,thothahanthai:3607,thothanthai:3600,thothongthai:3608,thothungthai:3606,thousandcyrillic:1154,thousandsseparatorarabic:1644,
+        thousandsseparatorpersian:1644,three:51,threearabic:1635,threebengali:2537,threecircle:9314,threecircleinversesansserif:10124,threedeva:2409,threeeighths:8540,threegujarati:2793,threegurmukhi:2665,threehackarabic:1635,threehangzhou:12323,threeideographicparen:12834,threeinferior:8323,threemonospace:65299,threenumeratorbengali:2550,threeoldstyle:63283,threeparen:9334,threeperiod:9354,threepersian:1779,threequarters:190,threequartersemdash:63198,threeroman:8562,threesuperior:179,threethai:3667,thzsquare:13204,
+        tihiragana:12385,tikatakana:12481,tikatakanahalfwidth:65409,tikeutacirclekorean:12912,tikeutaparenkorean:12816,tikeutcirclekorean:12898,tikeutkorean:12599,tikeutparenkorean:12802,tilde:732,tildebelowcmb:816,tildecmb:771,tildecomb:771,tildedoublecmb:864,tildeoperator:8764,tildeoverlaycmb:820,tildeverticalcmb:830,timescircle:8855,tipehahebrew:1430,tipehalefthebrew:1430,tippigurmukhi:2672,titlocyrilliccmb:1155,tiwnarmenian:1407,tlinebelow:7791,tmonospace:65364,toarmenian:1385,tohiragana:12392,tokatakana:12488,
+        tokatakanahalfwidth:65412,tonebarextrahighmod:741,tonebarextralowmod:745,tonebarhighmod:742,tonebarlowmod:744,tonebarmidmod:743,tonefive:445,tonesix:389,tonetwo:424,tonos:900,tonsquare:13095,topatakthai:3599,tortoiseshellbracketleft:12308,tortoiseshellbracketleftsmall:65117,tortoiseshellbracketleftvertical:65081,tortoiseshellbracketright:12309,tortoiseshellbracketrightsmall:65118,tortoiseshellbracketrightvertical:65082,totaothai:3605,tpalatalhook:427,tparen:9391,trademark:8482,trademarksans:63722,
+        trademarkserif:63195,tretroflexhook:648,triagdn:9660,triaglf:9668,triagrt:9658,triagup:9650,ts:678,tsadi:1510,tsadidagesh:64326,tsadidageshhebrew:64326,tsadihebrew:1510,tsecyrillic:1094,tsere:1461,tsere12:1461,tsere1e:1461,tsere2b:1461,tserehebrew:1461,tserenarrowhebrew:1461,tserequarterhebrew:1461,tserewidehebrew:1461,tshecyrillic:1115,tsuperior:63219,ttabengali:2463,ttadeva:2335,ttagujarati:2719,ttagurmukhi:2591,tteharabic:1657,ttehfinalarabic:64359,ttehinitialarabic:64360,ttehmedialarabic:64361,
+        tthabengali:2464,tthadeva:2336,tthagujarati:2720,tthagurmukhi:2592,tturned:647,tuhiragana:12388,tukatakana:12484,tukatakanahalfwidth:65410,tusmallhiragana:12387,tusmallkatakana:12483,tusmallkatakanahalfwidth:65391,twelvecircle:9323,twelveparen:9343,twelveperiod:9363,twelveroman:8571,twentycircle:9331,twentyhangzhou:21316,twentyparen:9351,twentyperiod:9371,two:50,twoarabic:1634,twobengali:2536,twocircle:9313,twocircleinversesansserif:10123,twodeva:2408,twodotenleader:8229,twodotleader:8229,twodotleadervertical:65072,
+        twogujarati:2792,twogurmukhi:2664,twohackarabic:1634,twohangzhou:12322,twoideographicparen:12833,twoinferior:8322,twomonospace:65298,twonumeratorbengali:2549,twooldstyle:63282,twoparen:9333,twoperiod:9353,twopersian:1778,tworoman:8561,twostroke:443,twosuperior:178,twothai:3666,twothirds:8532,u:117,uacute:250,ubar:649,ubengali:2441,ubopomofo:12584,ubreve:365,ucaron:468,ucircle:9444,ucircumflex:251,ucircumflexbelow:7799,ucyrillic:1091,udattadeva:2385,udblacute:369,udblgrave:533,udeva:2313,udieresis:252,
+        udieresisacute:472,udieresisbelow:7795,udieresiscaron:474,udieresiscyrillic:1265,udieresisgrave:476,udieresismacron:470,udotbelow:7909,ugrave:249,ugujarati:2697,ugurmukhi:2569,uhiragana:12358,uhookabove:7911,uhorn:432,uhornacute:7913,uhorndotbelow:7921,uhorngrave:7915,uhornhookabove:7917,uhorntilde:7919,uhungarumlaut:369,uhungarumlautcyrillic:1267,uinvertedbreve:535,ukatakana:12454,ukatakanahalfwidth:65395,ukcyrillic:1145,ukorean:12636,umacron:363,umacroncyrillic:1263,umacrondieresis:7803,umatragurmukhi:2625,
+        umonospace:65365,underscore:95,underscoredbl:8215,underscoremonospace:65343,underscorevertical:65075,underscorewavy:65103,union:8746,universal:8704,uogonek:371,uparen:9392,upblock:9600,upperdothebrew:1476,upsilon:965,upsilondieresis:971,upsilondieresistonos:944,upsilonlatin:650,upsilontonos:973,uptackbelowcmb:797,uptackmod:724,uragurmukhi:2675,uring:367,ushortcyrillic:1118,usmallhiragana:12357,usmallkatakana:12453,usmallkatakanahalfwidth:65385,ustraightcyrillic:1199,ustraightstrokecyrillic:1201,utilde:361,
+        utildeacute:7801,utildebelow:7797,uubengali:2442,uudeva:2314,uugujarati:2698,uugurmukhi:2570,uumatragurmukhi:2626,uuvowelsignbengali:2498,uuvowelsigndeva:2370,uuvowelsigngujarati:2754,uvowelsignbengali:2497,uvowelsigndeva:2369,uvowelsigngujarati:2753,v:118,vadeva:2357,vagujarati:2741,vagurmukhi:2613,vakatakana:12535,vav:1493,vavdagesh:64309,vavdagesh65:64309,vavdageshhebrew:64309,vavhebrew:1493,vavholam:64331,vavholamhebrew:64331,vavvavhebrew:1520,vavyodhebrew:1521,vcircle:9445,vdotbelow:7807,vecyrillic:1074,
+        veharabic:1700,vehfinalarabic:64363,vehinitialarabic:64364,vehmedialarabic:64365,vekatakana:12537,venus:9792,verticalbar:124,verticallineabovecmb:781,verticallinebelowcmb:809,verticallinelowmod:716,verticallinemod:712,vewarmenian:1406,vhook:651,vikatakana:12536,viramabengali:2509,viramadeva:2381,viramagujarati:2765,visargabengali:2435,visargadeva:2307,visargagujarati:2691,vmonospace:65366,voarmenian:1400,voicediterationhiragana:12446,voicediterationkatakana:12542,voicedmarkkana:12443,voicedmarkkanahalfwidth:65438,
+        vokatakana:12538,vparen:9393,vtilde:7805,vturned:652,vuhiragana:12436,vukatakana:12532,w:119,wacute:7811,waekorean:12633,wahiragana:12431,wakatakana:12527,wakatakanahalfwidth:65436,wakorean:12632,wasmallhiragana:12430,wasmallkatakana:12526,wattosquare:13143,wavedash:12316,wavyunderscorevertical:65076,wawarabic:1608,wawfinalarabic:65262,wawhamzaabovearabic:1572,wawhamzaabovefinalarabic:65158,wbsquare:13277,wcircle:9446,wcircumflex:373,wdieresis:7813,wdotaccent:7815,wdotbelow:7817,wehiragana:12433,
+        weierstrass:8472,wekatakana:12529,wekorean:12638,weokorean:12637,wgrave:7809,whitebullet:9702,whitecircle:9675,whitecircleinverse:9689,whitecornerbracketleft:12302,whitecornerbracketleftvertical:65091,whitecornerbracketright:12303,whitecornerbracketrightvertical:65092,whitediamond:9671,whitediamondcontainingblacksmalldiamond:9672,whitedownpointingsmalltriangle:9663,whitedownpointingtriangle:9661,whiteleftpointingsmalltriangle:9667,whiteleftpointingtriangle:9665,whitelenticularbracketleft:12310,whitelenticularbracketright:12311,
+        whiterightpointingsmalltriangle:9657,whiterightpointingtriangle:9655,whitesmallsquare:9643,whitesmilingface:9786,whitesquare:9633,whitestar:9734,whitetelephone:9743,whitetortoiseshellbracketleft:12312,whitetortoiseshellbracketright:12313,whiteuppointingsmalltriangle:9653,whiteuppointingtriangle:9651,wihiragana:12432,wikatakana:12528,wikorean:12639,wmonospace:65367,wohiragana:12434,wokatakana:12530,wokatakanahalfwidth:65382,won:8361,wonmonospace:65510,wowaenthai:3623,wparen:9394,wring:7832,wsuperior:695,
+        wturned:653,wynn:447,x:120,xabovecmb:829,xbopomofo:12562,xcircle:9447,xdieresis:7821,xdotaccent:7819,xeharmenian:1389,xi:958,xmonospace:65368,xparen:9395,xsuperior:739,y:121,yaadosquare:13134,yabengali:2479,yacute:253,yadeva:2351,yaekorean:12626,yagujarati:2735,yagurmukhi:2607,yahiragana:12420,yakatakana:12516,yakatakanahalfwidth:65428,yakorean:12625,yamakkanthai:3662,yasmallhiragana:12419,yasmallkatakana:12515,yasmallkatakanahalfwidth:65388,yatcyrillic:1123,ycircle:9448,ycircumflex:375,ydieresis:255,
+        ydotaccent:7823,ydotbelow:7925,yeharabic:1610,yehbarreearabic:1746,yehbarreefinalarabic:64431,yehfinalarabic:65266,yehhamzaabovearabic:1574,yehhamzaabovefinalarabic:65162,yehhamzaaboveinitialarabic:65163,yehhamzaabovemedialarabic:65164,yehinitialarabic:65267,yehmedialarabic:65268,yehmeeminitialarabic:64733,yehmeemisolatedarabic:64600,yehnoonfinalarabic:64660,yehthreedotsbelowarabic:1745,yekorean:12630,yen:165,yenmonospace:65509,yeokorean:12629,yeorinhieuhkorean:12678,yerahbenyomohebrew:1450,yerahbenyomolefthebrew:1450,
+        yericyrillic:1099,yerudieresiscyrillic:1273,yesieungkorean:12673,yesieungpansioskorean:12675,yesieungsioskorean:12674,yetivhebrew:1434,ygrave:7923,yhook:436,yhookabove:7927,yiarmenian:1397,yicyrillic:1111,yikorean:12642,yinyang:9775,yiwnarmenian:1410,ymonospace:65369,yod:1497,yoddagesh:64313,yoddageshhebrew:64313,yodhebrew:1497,yodyodhebrew:1522,yodyodpatahhebrew:64287,yohiragana:12424,yoikorean:12681,yokatakana:12520,yokatakanahalfwidth:65430,yokorean:12635,yosmallhiragana:12423,yosmallkatakana:12519,
+        yosmallkatakanahalfwidth:65390,yotgreek:1011,yoyaekorean:12680,yoyakorean:12679,yoyakthai:3618,yoyingthai:3597,yparen:9396,ypogegrammeni:890,ypogegrammenigreekcmb:837,yr:422,yring:7833,ysuperior:696,ytilde:7929,yturned:654,yuhiragana:12422,yuikorean:12684,yukatakana:12518,yukatakanahalfwidth:65429,yukorean:12640,yusbigcyrillic:1131,yusbigiotifiedcyrillic:1133,yuslittlecyrillic:1127,yuslittleiotifiedcyrillic:1129,yusmallhiragana:12421,yusmallkatakana:12517,yusmallkatakanahalfwidth:65389,yuyekorean:12683,
+        yuyeokorean:12682,yyabengali:2527,yyadeva:2399,z:122,zaarmenian:1382,zacute:378,zadeva:2395,zagurmukhi:2651,zaharabic:1592,zahfinalarabic:65222,zahinitialarabic:65223,zahiragana:12374,zahmedialarabic:65224,zainarabic:1586,zainfinalarabic:65200,zakatakana:12470,zaqefgadolhebrew:1429,zaqefqatanhebrew:1428,zarqahebrew:1432,zayin:1494,zayindagesh:64310,zayindageshhebrew:64310,zayinhebrew:1494,zbopomofo:12567,zcaron:382,zcircle:9449,zcircumflex:7825,zcurl:657,zdot:380,zdotaccent:380,zdotbelow:7827,zecyrillic:1079,
+        zedescendercyrillic:1177,zedieresiscyrillic:1247,zehiragana:12380,zekatakana:12476,zero:48,zeroarabic:1632,zerobengali:2534,zerodeva:2406,zerogujarati:2790,zerogurmukhi:2662,zerohackarabic:1632,zeroinferior:8320,zeromonospace:65296,zerooldstyle:63280,zeropersian:1776,zerosuperior:8304,zerothai:3664,zerowidthjoiner:65279,zerowidthnonjoiner:8204,zerowidthspace:8203,zeta:950,zhbopomofo:12563,zhearmenian:1386,zhebrevecyrillic:1218,zhecyrillic:1078,zhedescendercyrillic:1175,zhedieresiscyrillic:1245,zihiragana:12376,
+        zikatakana:12472,zinorhebrew:1454,zlinebelow:7829,zmonospace:65370,zohiragana:12382,zokatakana:12478,zparen:9397,zretroflexhook:656,zstroke:438,zuhiragana:12378,zukatakana:12474,".notdef":0},Zb,le=function(a,b,c,d){if(d instanceof yc&&d.isNativelyDecodable(b,c)){var e=d.dict.get("ColorSpace","CS"),e=U.parse(e,b,c);b=e.numComps;var f;a.send("JpegDecode",[d.getIR(),b],function(a){a=a.data;a=new wa(a,0,a.length,d.dict);f(a)});return new Promise(function(a){f=a})}return Promise.resolve(d)},Pa=function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               b,c,d,e,f,g){this.image=c;d=c.dict;if(d.has("Filter")){var h=d.get("Filter").name;"JPXDecode"===h?(h=new me,h.parseImageProperties(c.stream),c.stream.reset(),c.bitsPerComponent=h.bitsPerComponent,c.numComps=h.componentsCount):"JBIG2Decode"===h&&(c.bitsPerComponent=1,c.numComps=1)}this.width=d.get("Width","W");this.height=d.get("Height","H");(1>this.width||1>this.height)&&u("Invalid image width: "+this.width+" or height: "+this.height);this.interpolate=d.get("Interpolate","I")||!1;this.imageMask=d.get("ImageMask",
+            "IM")||!1;this.matte=d.get("Matte")||!1;h=c.bitsPerComponent;h||(h=d.get("BitsPerComponent","BPC"))||(this.imageMask?h=1:u("Bits per component missing in image: "+this.imageMask));this.bpc=h;if(!this.imageMask){var j=d.get("ColorSpace","CS");if(!j)switch(R("JPX images (which do not require color spaces)"),c.numComps){case 1:j=pa.get("DeviceGray");break;case 3:j=pa.get("DeviceRGB");break;case 4:j=pa.get("DeviceCMYK");break;default:u("JPX images with "+this.numComps+" color components not supported.")}this.colorSpace=
+        U.parse(j,a,b);this.numComps=this.colorSpace.numComps}this.decode=d.get("Decode","D");this.needsDecode=!1;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode)||g&&!U.isDefaultDecode(this.decode,1))){this.needsDecode=!0;c=(1<<h)-1;this.decodeCoefficients=[];this.decodeAddends=[];for(d=g=0;g<this.decode.length;g+=2,++d)h=this.decode[g],this.decodeCoefficients[d]=this.decode[g+1]-h,this.decodeAddends[d]=c*h}e?this.smask=new Pa(a,b,e,!1):f&&(this.mask=V(f)?new Pa(a,b,f,!1,null,
+        null,!0):f)};Pa.buildImage=function(a,b,c,d,e){var f=le(a,b,c,d),g;g=d.dict.get("SMask");d=d.dict.get("Mask");g?(g=le(a,b,c,g),a=Promise.resolve(null)):(g=Promise.resolve(null),d?V(d)?a=le(a,b,c,d):I(d)?a=Promise.resolve(d):(L("Unsupported mask format."),a=Promise.resolve(null)):a=Promise.resolve(null));return Promise.all([f,g,a]).then(function(a){return new Pa(b,c,a[0],e,a[1],a[2])})};Pa.resize=function(a,b,c,d,e,f,g,h,j){1!==c&&3!==c&&u("Unsupported component count for resizing.");var l=f*g*c;b=
+        h?h:8>=b?new Uint8Array(l):16>=b?new Uint16Array(l):new Uint32Array(l);var k=d/f;e/=g;h=0;var m,l=new Uint16Array(f),n=d*c;1!==j&&(j=0);for(d=0;d<f;d++)l[d]=Math.floor(d*k)*c;if(1===c)for(c=0;c<g;c++){k=Math.floor(c*e)*n;for(d=0;d<f;d++)m=k+l[d],b[h++]=a[m]}else if(3===c)for(c=0;c<g;c++){k=Math.floor(c*e)*n;for(d=0;d<f;d++)m=k+l[d],b[h++]=a[m++],b[h++]=a[m++],b[h++]=a[m++],h+=j}return b};Pa.createMask=function(a,b,c,d,e){var f=a.byteLength;d?d=a:(d=new Uint8Array(f),d.set(a));if(e)for(a=0;a<f;a++)d[a]=
+        ~d[a];return{data:d,width:b,height:c}};Pa.prototype={get drawWidth(){return Math.max(this.width,this.smask&&this.smask.width||0,this.mask&&this.mask.width||0)},get drawHeight(){return Math.max(this.height,this.smask&&this.smask.height||0,this.mask&&this.mask.height||0)},decodeBuffer:function(a){var b=this.bpc,c=this.numComps,d=this.decodeAddends,e=this.decodeCoefficients,f=(1<<b)-1,g;if(1===b){b=0;for(g=a.length;b<g;b++)a[b]=+!a[b]}else{var h=0,b=0;for(g=this.width*this.height;b<g;b++)for(var j=0;j<
+    c;j++){var l=a,k=h,m=a[h],m=d[j]+m*e[j];l[k]=0>m?0:m>f?f:m;h++}}},getComponents:function(a){var b=this.bpc;if(8===b)return a;var c=this.width,d=this.height,e=this.numComps,f=c*d*e,g=0,h=8>=b?new Uint8Array(f):16>=b?new Uint16Array(f):new Uint32Array(f),c=c*e,j=(1<<b)-1,e=0,l;if(1===b)for(f=0;f<d;f++){j=e+(c&-8);for(b=e+c;e<j;)l=a[g++],h[e]=l>>7&1,h[e+1]=l>>6&1,h[e+2]=l>>5&1,h[e+3]=l>>4&1,h[e+4]=l>>3&1,h[e+5]=l>>2&1,h[e+6]=l>>1&1,h[e+7]=l&1,e+=8;if(e<b){l=a[g++];for(j=128;e<b;)h[e++]=+!!(l&j),j>>=
+        1}}else for(e=l=d=0;e<f;++e){0===e%c&&(d=l=0);for(;d<b;)l=l<<8|a[g++],d+=8;var d=d-b,k=l>>d;h[e]=0>k?0:k>j?j:k;l&=(1<<d)-1}return h},fillOpacity:function(a,b,c,d,e){var f=this.smask,g=this.mask,h,j,l;if(f){if(e=f.width,j=f.height,h=new Uint8Array(e*j),f.fillGrayBuffer(h),e!=b||j!=c)h=Pa.resize(h,f.bpc,1,e,j,b,c)}else if(g)if(g instanceof Pa){e=g.width;j=g.height;h=new Uint8Array(e*j);g.numComps=1;g.fillGrayBuffer(h);f=0;for(l=e*j;f<l;++f)h[f]=255-h[f];if(e!=b||j!=c)h=Pa.resize(h,g.bpc,1,e,j,b,c)}else if(I(g)){h=
+        new Uint8Array(b*c);j=this.numComps;f=0;for(l=b*c;f<l;++f){var k=0,m=f*j;for(c=0;c<j;++c){var n=e[m+c],p=2*c;if(n<g[p]||n>g[p+1]){k=255;break}}h[f]=k}}else u("Unknown mask format.");if(h){f=0;c=3;for(l=b*d;f<l;++f,c+=4)a[c]=h[f]}else{f=0;c=3;for(l=b*d;f<l;++f,c+=4)a[c]=255}},undoPreblend:function(a,b,c){var d=this.smask&&this.smask.matte;if(d){d=this.colorSpace.getRgb(d,0);b=4*b*c;for(c=0;c<b;c+=4){var e=a[c+3];0===e?(a[c]=255,a[c+1]=255,a[c+2]=255):(e=255/e,a[c]=(0>(a[c]-d[0])*e+d[0]?0:255<(a[c]-
+        d[0])*e+d[0]?255:(a[c]-d[0])*e+d[0])|0,a[c+1]=(0>(a[c+1]-d[1])*e+d[1]?0:255<(a[c+1]-d[1])*e+d[1]?255:(a[c+1]-d[1])*e+d[1])|0,a[c+2]=(0>(a[c+2]-d[2])*e+d[2]?0:255<(a[c+2]-d[2])*e+d[2]?255:(a[c+2]-d[2])*e+d[2])|0)}}},createImageData:function(a){var b=this.drawWidth,c=this.drawHeight,d={width:b,height:c},e=this.width,f=this.height,g=this.bpc,h=e*this.numComps*g+7>>3,j=this.getImageBytes(f*h);if(!a){var l;"DeviceGray"===this.colorSpace.name&&1===g?l=1:"DeviceRGB"===this.colorSpace.name&&8===g&&(l=2);
+        if(l&&!this.smask&&!this.mask&&!this.needsDecode&&b===e&&c===f)return d.kind=l,this.image instanceof Z?d.data=j:(b=new Uint8Array(j.length),b.set(j),d.data=b),d}h=0|j.length/h*c/f;j=this.getComponents(j);!a&&!this.smask&&!this.mask?(d.kind=2,d.data=new Uint8Array(3*b*c),a=0,l=!1):(d.kind=3,d.data=new Uint8Array(4*b*c),a=1,l=!0,this.fillOpacity(d.data,b,c,h,j));this.needsDecode&&this.decodeBuffer(j);this.colorSpace.fillRgb(d.data,e,f,b,c,h,g,j,a);l&&this.undoPreblend(d.data,b,h);return d},fillGrayBuffer:function(a){var b=
+        this.numComps;1!=b&&u("Reading gray scale from a color image: "+b);var c=this.width,d=this.height,e=this.bpc,b=this.getImageBytes(d*(c*b*e+7>>3)),b=this.getComponents(b);if(1===e)if(c*=d,this.needsDecode)for(e=0;e<c;++e)a[e]=b[e]-1&255;else for(e=0;e<c;++e)a[e]=-b[e]&255;else{this.needsDecode&&this.decodeBuffer(b);c*=d;d=255/((1<<e)-1);for(e=0;e<c;++e)a[e]=d*b[e]|0}},getImageBytes:function(a){this.image.reset();return this.image.getBytes(a)}};Zb=Pa;var $f={Courier:600,"Courier-Bold":600,"Courier-BoldOblique":600,
+        "Courier-Oblique":600,Helvetica:{space:278,exclam:278,quotedbl:355,numbersign:556,dollar:556,percent:889,ampersand:667,quoteright:222,parenleft:333,parenright:333,asterisk:389,plus:584,comma:278,hyphen:333,period:278,slash:278,zero:556,one:556,two:556,three:556,four:556,five:556,six:556,seven:556,eight:556,nine:556,colon:278,semicolon:278,less:584,equal:584,greater:584,question:556,at:1015,A:667,B:667,C:722,D:722,E:667,F:611,G:778,H:722,I:278,J:500,K:667,L:556,M:833,N:722,O:778,P:667,Q:778,R:722,
+            S:667,T:611,U:722,V:667,W:944,X:667,Y:667,Z:611,bracketleft:278,backslash:278,bracketright:278,asciicircum:469,underscore:556,quoteleft:222,a:556,b:556,c:500,d:556,e:556,f:278,g:556,h:556,i:222,j:222,k:500,l:222,m:833,n:556,o:556,p:556,q:556,r:333,s:500,t:278,u:556,v:500,w:722,x:500,y:500,z:500,braceleft:334,bar:260,braceright:334,asciitilde:584,exclamdown:333,cent:556,sterling:556,fraction:167,yen:556,florin:556,section:556,currency:556,quotesingle:191,quotedblleft:333,guillemotleft:556,guilsinglleft:333,
+            guilsinglright:333,fi:500,fl:500,endash:556,dagger:556,daggerdbl:556,periodcentered:278,paragraph:537,bullet:350,quotesinglbase:222,quotedblbase:333,quotedblright:333,guillemotright:556,ellipsis:1E3,perthousand:1E3,questiondown:611,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:1E3,AE:1E3,ordfeminine:370,Lslash:556,Oslash:778,OE:1E3,ordmasculine:365,ae:889,dotlessi:278,lslash:222,oslash:611,
+            oe:944,germandbls:611,Idieresis:278,eacute:556,abreve:556,uhungarumlaut:556,ecaron:556,Ydieresis:667,divide:584,Yacute:667,Acircumflex:667,aacute:556,Ucircumflex:722,yacute:500,scommaaccent:500,ecircumflex:556,Uring:722,Udieresis:722,aogonek:556,Uacute:722,uogonek:556,Edieresis:667,Dcroat:722,commaaccent:250,copyright:737,Emacron:667,ccaron:500,aring:556,Ncommaaccent:722,lacute:222,agrave:556,Tcommaaccent:611,Cacute:722,atilde:556,Edotaccent:667,scaron:500,scedilla:500,iacute:278,lozenge:471,Rcaron:722,
+            Gcommaaccent:778,ucircumflex:556,acircumflex:556,Amacron:667,rcaron:333,ccedilla:500,Zdotaccent:611,Thorn:667,Omacron:778,Racute:722,Sacute:667,dcaron:643,Umacron:722,uring:556,threesuperior:333,Ograve:778,Agrave:667,Abreve:667,multiply:584,uacute:556,Tcaron:611,partialdiff:476,ydieresis:500,Nacute:722,icircumflex:278,Ecircumflex:667,adieresis:556,edieresis:556,cacute:500,nacute:556,umacron:556,Ncaron:722,Iacute:278,plusminus:584,brokenbar:260,registered:737,Gbreve:778,Idotaccent:278,summation:600,
+            Egrave:667,racute:333,omacron:556,Zacute:611,Zcaron:611,greaterequal:549,Eth:722,Ccedilla:722,lcommaaccent:222,tcaron:317,eogonek:556,Uogonek:722,Aacute:667,Adieresis:667,egrave:556,zacute:500,iogonek:222,Oacute:778,oacute:556,amacron:556,sacute:500,idieresis:278,Ocircumflex:778,Ugrave:722,Delta:612,thorn:556,twosuperior:333,Odieresis:778,mu:556,igrave:278,ohungarumlaut:556,Eogonek:667,dcroat:556,threequarters:834,Scedilla:667,lcaron:299,Kcommaaccent:667,Lacute:556,trademark:1E3,edotaccent:556,Igrave:278,
+            Imacron:278,Lcaron:556,onehalf:834,lessequal:549,ocircumflex:556,ntilde:556,Uhungarumlaut:722,Eacute:667,emacron:556,gbreve:556,onequarter:834,Scaron:667,Scommaaccent:667,Ohungarumlaut:778,degree:400,ograve:556,Ccaron:722,ugrave:556,radical:453,Dcaron:722,rcommaaccent:333,Ntilde:722,otilde:556,Rcommaaccent:722,Lcommaaccent:556,Atilde:667,Aogonek:667,Aring:667,Otilde:778,zdotaccent:500,Ecaron:667,Iogonek:278,kcommaaccent:500,minus:584,Icircumflex:278,ncaron:556,tcommaaccent:278,logicalnot:584,odieresis:556,
+            udieresis:556,notequal:549,gcommaaccent:556,eth:556,zcaron:500,ncommaaccent:556,onesuperior:333,imacron:278,Euro:556},"Helvetica-Bold":{space:278,exclam:333,quotedbl:474,numbersign:556,dollar:556,percent:889,ampersand:722,quoteright:278,parenleft:333,parenright:333,asterisk:389,plus:584,comma:278,hyphen:333,period:278,slash:278,zero:556,one:556,two:556,three:556,four:556,five:556,six:556,seven:556,eight:556,nine:556,colon:333,semicolon:333,less:584,equal:584,greater:584,question:611,at:975,A:722,
+            B:722,C:722,D:722,E:667,F:611,G:778,H:722,I:278,J:556,K:722,L:611,M:833,N:722,O:778,P:667,Q:778,R:722,S:667,T:611,U:722,V:667,W:944,X:667,Y:667,Z:611,bracketleft:333,backslash:278,bracketright:333,asciicircum:584,underscore:556,quoteleft:278,a:556,b:611,c:556,d:611,e:556,f:333,g:611,h:611,i:278,j:278,k:556,l:278,m:889,n:611,o:611,p:611,q:611,r:389,s:556,t:333,u:611,v:556,w:778,x:556,y:556,z:500,braceleft:389,bar:280,braceright:389,asciitilde:584,exclamdown:333,cent:556,sterling:556,fraction:167,yen:556,
+            florin:556,section:556,currency:556,quotesingle:238,quotedblleft:500,guillemotleft:556,guilsinglleft:333,guilsinglright:333,fi:611,fl:611,endash:556,dagger:556,daggerdbl:556,periodcentered:278,paragraph:556,bullet:350,quotesinglbase:278,quotedblbase:500,quotedblright:500,guillemotright:556,ellipsis:1E3,perthousand:1E3,questiondown:611,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:1E3,AE:1E3,
+            ordfeminine:370,Lslash:611,Oslash:778,OE:1E3,ordmasculine:365,ae:889,dotlessi:278,lslash:278,oslash:611,oe:944,germandbls:611,Idieresis:278,eacute:556,abreve:556,uhungarumlaut:611,ecaron:556,Ydieresis:667,divide:584,Yacute:667,Acircumflex:722,aacute:556,Ucircumflex:722,yacute:556,scommaaccent:556,ecircumflex:556,Uring:722,Udieresis:722,aogonek:556,Uacute:722,uogonek:611,Edieresis:667,Dcroat:722,commaaccent:250,copyright:737,Emacron:667,ccaron:556,aring:556,Ncommaaccent:722,lacute:278,agrave:556,Tcommaaccent:611,
+            Cacute:722,atilde:556,Edotaccent:667,scaron:556,scedilla:556,iacute:278,lozenge:494,Rcaron:722,Gcommaaccent:778,ucircumflex:611,acircumflex:556,Amacron:722,rcaron:389,ccedilla:556,Zdotaccent:611,Thorn:667,Omacron:778,Racute:722,Sacute:667,dcaron:743,Umacron:722,uring:611,threesuperior:333,Ograve:778,Agrave:722,Abreve:722,multiply:584,uacute:611,Tcaron:611,partialdiff:494,ydieresis:556,Nacute:722,icircumflex:278,Ecircumflex:667,adieresis:556,edieresis:556,cacute:556,nacute:611,umacron:611,Ncaron:722,
+            Iacute:278,plusminus:584,brokenbar:280,registered:737,Gbreve:778,Idotaccent:278,summation:600,Egrave:667,racute:389,omacron:611,Zacute:611,Zcaron:611,greaterequal:549,Eth:722,Ccedilla:722,lcommaaccent:278,tcaron:389,eogonek:556,Uogonek:722,Aacute:722,Adieresis:722,egrave:556,zacute:500,iogonek:278,Oacute:778,oacute:611,amacron:556,sacute:556,idieresis:278,Ocircumflex:778,Ugrave:722,Delta:612,thorn:611,twosuperior:333,Odieresis:778,mu:611,igrave:278,ohungarumlaut:611,Eogonek:667,dcroat:611,threequarters:834,
+            Scedilla:667,lcaron:400,Kcommaaccent:722,Lacute:611,trademark:1E3,edotaccent:556,Igrave:278,Imacron:278,Lcaron:611,onehalf:834,lessequal:549,ocircumflex:611,ntilde:611,Uhungarumlaut:722,Eacute:667,emacron:556,gbreve:611,onequarter:834,Scaron:667,Scommaaccent:667,Ohungarumlaut:778,degree:400,ograve:611,Ccaron:722,ugrave:611,radical:549,Dcaron:722,rcommaaccent:389,Ntilde:722,otilde:611,Rcommaaccent:722,Lcommaaccent:611,Atilde:722,Aogonek:722,Aring:722,Otilde:778,zdotaccent:500,Ecaron:667,Iogonek:278,
+            kcommaaccent:556,minus:584,Icircumflex:278,ncaron:611,tcommaaccent:333,logicalnot:584,odieresis:611,udieresis:611,notequal:549,gcommaaccent:611,eth:611,zcaron:500,ncommaaccent:611,onesuperior:333,imacron:278,Euro:556},"Helvetica-BoldOblique":{space:278,exclam:333,quotedbl:474,numbersign:556,dollar:556,percent:889,ampersand:722,quoteright:278,parenleft:333,parenright:333,asterisk:389,plus:584,comma:278,hyphen:333,period:278,slash:278,zero:556,one:556,two:556,three:556,four:556,five:556,six:556,seven:556,
+            eight:556,nine:556,colon:333,semicolon:333,less:584,equal:584,greater:584,question:611,at:975,A:722,B:722,C:722,D:722,E:667,F:611,G:778,H:722,I:278,J:556,K:722,L:611,M:833,N:722,O:778,P:667,Q:778,R:722,S:667,T:611,U:722,V:667,W:944,X:667,Y:667,Z:611,bracketleft:333,backslash:278,bracketright:333,asciicircum:584,underscore:556,quoteleft:278,a:556,b:611,c:556,d:611,e:556,f:333,g:611,h:611,i:278,j:278,k:556,l:278,m:889,n:611,o:611,p:611,q:611,r:389,s:556,t:333,u:611,v:556,w:778,x:556,y:556,z:500,braceleft:389,
+            bar:280,braceright:389,asciitilde:584,exclamdown:333,cent:556,sterling:556,fraction:167,yen:556,florin:556,section:556,currency:556,quotesingle:238,quotedblleft:500,guillemotleft:556,guilsinglleft:333,guilsinglright:333,fi:611,fl:611,endash:556,dagger:556,daggerdbl:556,periodcentered:278,paragraph:556,bullet:350,quotesinglbase:278,quotedblbase:500,quotedblright:500,guillemotright:556,ellipsis:1E3,perthousand:1E3,questiondown:611,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,
+            dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:1E3,AE:1E3,ordfeminine:370,Lslash:611,Oslash:778,OE:1E3,ordmasculine:365,ae:889,dotlessi:278,lslash:278,oslash:611,oe:944,germandbls:611,Idieresis:278,eacute:556,abreve:556,uhungarumlaut:611,ecaron:556,Ydieresis:667,divide:584,Yacute:667,Acircumflex:722,aacute:556,Ucircumflex:722,yacute:556,scommaaccent:556,ecircumflex:556,Uring:722,Udieresis:722,aogonek:556,Uacute:722,uogonek:611,Edieresis:667,Dcroat:722,commaaccent:250,
+            copyright:737,Emacron:667,ccaron:556,aring:556,Ncommaaccent:722,lacute:278,agrave:556,Tcommaaccent:611,Cacute:722,atilde:556,Edotaccent:667,scaron:556,scedilla:556,iacute:278,lozenge:494,Rcaron:722,Gcommaaccent:778,ucircumflex:611,acircumflex:556,Amacron:722,rcaron:389,ccedilla:556,Zdotaccent:611,Thorn:667,Omacron:778,Racute:722,Sacute:667,dcaron:743,Umacron:722,uring:611,threesuperior:333,Ograve:778,Agrave:722,Abreve:722,multiply:584,uacute:611,Tcaron:611,partialdiff:494,ydieresis:556,Nacute:722,
+            icircumflex:278,Ecircumflex:667,adieresis:556,edieresis:556,cacute:556,nacute:611,umacron:611,Ncaron:722,Iacute:278,plusminus:584,brokenbar:280,registered:737,Gbreve:778,Idotaccent:278,summation:600,Egrave:667,racute:389,omacron:611,Zacute:611,Zcaron:611,greaterequal:549,Eth:722,Ccedilla:722,lcommaaccent:278,tcaron:389,eogonek:556,Uogonek:722,Aacute:722,Adieresis:722,egrave:556,zacute:500,iogonek:278,Oacute:778,oacute:611,amacron:556,sacute:556,idieresis:278,Ocircumflex:778,Ugrave:722,Delta:612,thorn:611,
+            twosuperior:333,Odieresis:778,mu:611,igrave:278,ohungarumlaut:611,Eogonek:667,dcroat:611,threequarters:834,Scedilla:667,lcaron:400,Kcommaaccent:722,Lacute:611,trademark:1E3,edotaccent:556,Igrave:278,Imacron:278,Lcaron:611,onehalf:834,lessequal:549,ocircumflex:611,ntilde:611,Uhungarumlaut:722,Eacute:667,emacron:556,gbreve:611,onequarter:834,Scaron:667,Scommaaccent:667,Ohungarumlaut:778,degree:400,ograve:611,Ccaron:722,ugrave:611,radical:549,Dcaron:722,rcommaaccent:389,Ntilde:722,otilde:611,Rcommaaccent:722,
+            Lcommaaccent:611,Atilde:722,Aogonek:722,Aring:722,Otilde:778,zdotaccent:500,Ecaron:667,Iogonek:278,kcommaaccent:556,minus:584,Icircumflex:278,ncaron:611,tcommaaccent:333,logicalnot:584,odieresis:611,udieresis:611,notequal:549,gcommaaccent:611,eth:611,zcaron:500,ncommaaccent:611,onesuperior:333,imacron:278,Euro:556},"Helvetica-Oblique":{space:278,exclam:278,quotedbl:355,numbersign:556,dollar:556,percent:889,ampersand:667,quoteright:222,parenleft:333,parenright:333,asterisk:389,plus:584,comma:278,hyphen:333,
+            period:278,slash:278,zero:556,one:556,two:556,three:556,four:556,five:556,six:556,seven:556,eight:556,nine:556,colon:278,semicolon:278,less:584,equal:584,greater:584,question:556,at:1015,A:667,B:667,C:722,D:722,E:667,F:611,G:778,H:722,I:278,J:500,K:667,L:556,M:833,N:722,O:778,P:667,Q:778,R:722,S:667,T:611,U:722,V:667,W:944,X:667,Y:667,Z:611,bracketleft:278,backslash:278,bracketright:278,asciicircum:469,underscore:556,quoteleft:222,a:556,b:556,c:500,d:556,e:556,f:278,g:556,h:556,i:222,j:222,k:500,
+            l:222,m:833,n:556,o:556,p:556,q:556,r:333,s:500,t:278,u:556,v:500,w:722,x:500,y:500,z:500,braceleft:334,bar:260,braceright:334,asciitilde:584,exclamdown:333,cent:556,sterling:556,fraction:167,yen:556,florin:556,section:556,currency:556,quotesingle:191,quotedblleft:333,guillemotleft:556,guilsinglleft:333,guilsinglright:333,fi:500,fl:500,endash:556,dagger:556,daggerdbl:556,periodcentered:278,paragraph:537,bullet:350,quotesinglbase:222,quotedblbase:333,quotedblright:333,guillemotright:556,ellipsis:1E3,
+            perthousand:1E3,questiondown:611,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:1E3,AE:1E3,ordfeminine:370,Lslash:556,Oslash:778,OE:1E3,ordmasculine:365,ae:889,dotlessi:278,lslash:222,oslash:611,oe:944,germandbls:611,Idieresis:278,eacute:556,abreve:556,uhungarumlaut:556,ecaron:556,Ydieresis:667,divide:584,Yacute:667,Acircumflex:667,aacute:556,Ucircumflex:722,yacute:500,scommaaccent:500,
+            ecircumflex:556,Uring:722,Udieresis:722,aogonek:556,Uacute:722,uogonek:556,Edieresis:667,Dcroat:722,commaaccent:250,copyright:737,Emacron:667,ccaron:500,aring:556,Ncommaaccent:722,lacute:222,agrave:556,Tcommaaccent:611,Cacute:722,atilde:556,Edotaccent:667,scaron:500,scedilla:500,iacute:278,lozenge:471,Rcaron:722,Gcommaaccent:778,ucircumflex:556,acircumflex:556,Amacron:667,rcaron:333,ccedilla:500,Zdotaccent:611,Thorn:667,Omacron:778,Racute:722,Sacute:667,dcaron:643,Umacron:722,uring:556,threesuperior:333,
+            Ograve:778,Agrave:667,Abreve:667,multiply:584,uacute:556,Tcaron:611,partialdiff:476,ydieresis:500,Nacute:722,icircumflex:278,Ecircumflex:667,adieresis:556,edieresis:556,cacute:500,nacute:556,umacron:556,Ncaron:722,Iacute:278,plusminus:584,brokenbar:260,registered:737,Gbreve:778,Idotaccent:278,summation:600,Egrave:667,racute:333,omacron:556,Zacute:611,Zcaron:611,greaterequal:549,Eth:722,Ccedilla:722,lcommaaccent:222,tcaron:317,eogonek:556,Uogonek:722,Aacute:667,Adieresis:667,egrave:556,zacute:500,
+            iogonek:222,Oacute:778,oacute:556,amacron:556,sacute:500,idieresis:278,Ocircumflex:778,Ugrave:722,Delta:612,thorn:556,twosuperior:333,Odieresis:778,mu:556,igrave:278,ohungarumlaut:556,Eogonek:667,dcroat:556,threequarters:834,Scedilla:667,lcaron:299,Kcommaaccent:667,Lacute:556,trademark:1E3,edotaccent:556,Igrave:278,Imacron:278,Lcaron:556,onehalf:834,lessequal:549,ocircumflex:556,ntilde:556,Uhungarumlaut:722,Eacute:667,emacron:556,gbreve:556,onequarter:834,Scaron:667,Scommaaccent:667,Ohungarumlaut:778,
+            degree:400,ograve:556,Ccaron:722,ugrave:556,radical:453,Dcaron:722,rcommaaccent:333,Ntilde:722,otilde:556,Rcommaaccent:722,Lcommaaccent:556,Atilde:667,Aogonek:667,Aring:667,Otilde:778,zdotaccent:500,Ecaron:667,Iogonek:278,kcommaaccent:500,minus:584,Icircumflex:278,ncaron:556,tcommaaccent:278,logicalnot:584,odieresis:556,udieresis:556,notequal:549,gcommaaccent:556,eth:556,zcaron:500,ncommaaccent:556,onesuperior:333,imacron:278,Euro:556},Symbol:{space:250,exclam:333,universal:713,numbersign:500,existential:549,
+            percent:833,ampersand:778,suchthat:439,parenleft:333,parenright:333,asteriskmath:500,plus:549,comma:250,minus:549,period:250,slash:278,zero:500,one:500,two:500,three:500,four:500,five:500,six:500,seven:500,eight:500,nine:500,colon:278,semicolon:278,less:549,equal:549,greater:549,question:444,congruent:549,Alpha:722,Beta:667,Chi:722,Delta:612,Epsilon:611,Phi:763,Gamma:603,Eta:722,Iota:333,theta1:631,Kappa:722,Lambda:686,Mu:889,Nu:722,Omicron:722,Pi:768,Theta:741,Rho:556,Sigma:592,Tau:611,Upsilon:690,
+            sigma1:439,Omega:768,Xi:645,Psi:795,Zeta:611,bracketleft:333,therefore:863,bracketright:333,perpendicular:658,underscore:500,radicalex:500,alpha:631,beta:549,chi:549,delta:494,epsilon:439,phi:521,gamma:411,eta:603,iota:329,phi1:603,kappa:549,lambda:549,mu:576,nu:521,omicron:549,pi:549,theta:521,rho:549,sigma:603,tau:439,upsilon:576,omega1:713,omega:686,xi:493,psi:686,zeta:494,braceleft:480,bar:200,braceright:480,similar:549,Euro:750,Upsilon1:620,minute:247,lessequal:549,fraction:167,infinity:713,
+            florin:500,club:753,diamond:753,heart:753,spade:753,arrowboth:1042,arrowleft:987,arrowup:603,arrowright:987,arrowdown:603,degree:400,plusminus:549,second:411,greaterequal:549,multiply:549,proportional:713,partialdiff:494,bullet:460,divide:549,notequal:549,equivalence:549,approxequal:549,ellipsis:1E3,arrowvertex:603,arrowhorizex:1E3,carriagereturn:658,aleph:823,Ifraktur:686,Rfraktur:795,weierstrass:987,circlemultiply:768,circleplus:768,emptyset:823,intersection:768,union:768,propersuperset:713,reflexsuperset:713,
+            notsubset:713,propersubset:713,reflexsubset:713,element:713,notelement:713,angle:768,gradient:713,registerserif:790,copyrightserif:790,trademarkserif:890,product:823,radical:549,dotmath:250,logicalnot:713,logicaland:603,logicalor:603,arrowdblboth:1042,arrowdblleft:987,arrowdblup:603,arrowdblright:987,arrowdbldown:603,lozenge:494,angleleft:329,registersans:790,copyrightsans:790,trademarksans:786,summation:713,parenlefttp:384,parenleftex:384,parenleftbt:384,bracketlefttp:384,bracketleftex:384,bracketleftbt:384,
+            bracelefttp:494,braceleftmid:494,braceleftbt:494,braceex:494,angleright:329,integral:274,integraltp:686,integralex:686,integralbt:686,parenrighttp:384,parenrightex:384,parenrightbt:384,bracketrighttp:384,bracketrightex:384,bracketrightbt:384,bracerighttp:494,bracerightmid:494,bracerightbt:494,apple:790},"Times-Roman":{space:250,exclam:333,quotedbl:408,numbersign:500,dollar:500,percent:833,ampersand:778,quoteright:333,parenleft:333,parenright:333,asterisk:500,plus:564,comma:250,hyphen:333,period:250,
+            slash:278,zero:500,one:500,two:500,three:500,four:500,five:500,six:500,seven:500,eight:500,nine:500,colon:278,semicolon:278,less:564,equal:564,greater:564,question:444,at:921,A:722,B:667,C:667,D:722,E:611,F:556,G:722,H:722,I:333,J:389,K:722,L:611,M:889,N:722,O:722,P:556,Q:722,R:667,S:556,T:611,U:722,V:722,W:944,X:722,Y:722,Z:611,bracketleft:333,backslash:278,bracketright:333,asciicircum:469,underscore:500,quoteleft:333,a:444,b:500,c:444,d:500,e:444,f:333,g:500,h:500,i:278,j:278,k:500,l:278,m:778,
+            n:500,o:500,p:500,q:500,r:333,s:389,t:278,u:500,v:500,w:722,x:500,y:500,z:444,braceleft:480,bar:200,braceright:480,asciitilde:541,exclamdown:333,cent:500,sterling:500,fraction:167,yen:500,florin:500,section:500,currency:500,quotesingle:180,quotedblleft:444,guillemotleft:500,guilsinglleft:333,guilsinglright:333,fi:556,fl:556,endash:500,dagger:500,daggerdbl:500,periodcentered:250,paragraph:453,bullet:350,quotesinglbase:333,quotedblbase:444,quotedblright:444,guillemotright:500,ellipsis:1E3,perthousand:1E3,
+            questiondown:444,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:1E3,AE:889,ordfeminine:276,Lslash:611,Oslash:722,OE:889,ordmasculine:310,ae:667,dotlessi:278,lslash:278,oslash:500,oe:722,germandbls:500,Idieresis:333,eacute:444,abreve:444,uhungarumlaut:500,ecaron:444,Ydieresis:722,divide:564,Yacute:722,Acircumflex:722,aacute:444,Ucircumflex:722,yacute:500,scommaaccent:389,ecircumflex:444,
+            Uring:722,Udieresis:722,aogonek:444,Uacute:722,uogonek:500,Edieresis:611,Dcroat:722,commaaccent:250,copyright:760,Emacron:611,ccaron:444,aring:444,Ncommaaccent:722,lacute:278,agrave:444,Tcommaaccent:611,Cacute:667,atilde:444,Edotaccent:611,scaron:389,scedilla:389,iacute:278,lozenge:471,Rcaron:667,Gcommaaccent:722,ucircumflex:500,acircumflex:444,Amacron:722,rcaron:333,ccedilla:444,Zdotaccent:611,Thorn:556,Omacron:722,Racute:667,Sacute:556,dcaron:588,Umacron:722,uring:500,threesuperior:300,Ograve:722,
+            Agrave:722,Abreve:722,multiply:564,uacute:500,Tcaron:611,partialdiff:476,ydieresis:500,Nacute:722,icircumflex:278,Ecircumflex:611,adieresis:444,edieresis:444,cacute:444,nacute:500,umacron:500,Ncaron:722,Iacute:333,plusminus:564,brokenbar:200,registered:760,Gbreve:722,Idotaccent:333,summation:600,Egrave:611,racute:333,omacron:500,Zacute:611,Zcaron:611,greaterequal:549,Eth:722,Ccedilla:667,lcommaaccent:278,tcaron:326,eogonek:444,Uogonek:722,Aacute:722,Adieresis:722,egrave:444,zacute:444,iogonek:278,
+            Oacute:722,oacute:500,amacron:444,sacute:389,idieresis:278,Ocircumflex:722,Ugrave:722,Delta:612,thorn:500,twosuperior:300,Odieresis:722,mu:500,igrave:278,ohungarumlaut:500,Eogonek:611,dcroat:500,threequarters:750,Scedilla:556,lcaron:344,Kcommaaccent:722,Lacute:611,trademark:980,edotaccent:444,Igrave:333,Imacron:333,Lcaron:611,onehalf:750,lessequal:549,ocircumflex:500,ntilde:500,Uhungarumlaut:722,Eacute:611,emacron:444,gbreve:500,onequarter:750,Scaron:556,Scommaaccent:556,Ohungarumlaut:722,degree:400,
+            ograve:500,Ccaron:667,ugrave:500,radical:453,Dcaron:722,rcommaaccent:333,Ntilde:722,otilde:500,Rcommaaccent:667,Lcommaaccent:611,Atilde:722,Aogonek:722,Aring:722,Otilde:722,zdotaccent:444,Ecaron:611,Iogonek:333,kcommaaccent:500,minus:564,Icircumflex:333,ncaron:500,tcommaaccent:278,logicalnot:564,odieresis:500,udieresis:500,notequal:549,gcommaaccent:500,eth:500,zcaron:444,ncommaaccent:500,onesuperior:300,imacron:278,Euro:500},"Times-Bold":{space:250,exclam:333,quotedbl:555,numbersign:500,dollar:500,
+            percent:1E3,ampersand:833,quoteright:333,parenleft:333,parenright:333,asterisk:500,plus:570,comma:250,hyphen:333,period:250,slash:278,zero:500,one:500,two:500,three:500,four:500,five:500,six:500,seven:500,eight:500,nine:500,colon:333,semicolon:333,less:570,equal:570,greater:570,question:500,at:930,A:722,B:667,C:722,D:722,E:667,F:611,G:778,H:778,I:389,J:500,K:778,L:667,M:944,N:722,O:778,P:611,Q:778,R:722,S:556,T:667,U:722,V:722,W:1E3,X:722,Y:722,Z:667,bracketleft:333,backslash:278,bracketright:333,
+            asciicircum:581,underscore:500,quoteleft:333,a:500,b:556,c:444,d:556,e:444,f:333,g:500,h:556,i:278,j:333,k:556,l:278,m:833,n:556,o:500,p:556,q:556,r:444,s:389,t:333,u:556,v:500,w:722,x:500,y:500,z:444,braceleft:394,bar:220,braceright:394,asciitilde:520,exclamdown:333,cent:500,sterling:500,fraction:167,yen:500,florin:500,section:500,currency:500,quotesingle:278,quotedblleft:500,guillemotleft:500,guilsinglleft:333,guilsinglright:333,fi:556,fl:556,endash:500,dagger:500,daggerdbl:500,periodcentered:250,
+            paragraph:540,bullet:350,quotesinglbase:333,quotedblbase:500,quotedblright:500,guillemotright:500,ellipsis:1E3,perthousand:1E3,questiondown:500,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:1E3,AE:1E3,ordfeminine:300,Lslash:667,Oslash:778,OE:1E3,ordmasculine:330,ae:722,dotlessi:278,lslash:278,oslash:500,oe:722,germandbls:556,Idieresis:389,eacute:444,abreve:500,uhungarumlaut:556,ecaron:444,
+            Ydieresis:722,divide:570,Yacute:722,Acircumflex:722,aacute:500,Ucircumflex:722,yacute:500,scommaaccent:389,ecircumflex:444,Uring:722,Udieresis:722,aogonek:500,Uacute:722,uogonek:556,Edieresis:667,Dcroat:722,commaaccent:250,copyright:747,Emacron:667,ccaron:444,aring:500,Ncommaaccent:722,lacute:278,agrave:500,Tcommaaccent:667,Cacute:722,atilde:500,Edotaccent:667,scaron:389,scedilla:389,iacute:278,lozenge:494,Rcaron:722,Gcommaaccent:778,ucircumflex:556,acircumflex:500,Amacron:722,rcaron:444,ccedilla:444,
+            Zdotaccent:667,Thorn:611,Omacron:778,Racute:722,Sacute:556,dcaron:672,Umacron:722,uring:556,threesuperior:300,Ograve:778,Agrave:722,Abreve:722,multiply:570,uacute:556,Tcaron:667,partialdiff:494,ydieresis:500,Nacute:722,icircumflex:278,Ecircumflex:667,adieresis:500,edieresis:444,cacute:444,nacute:556,umacron:556,Ncaron:722,Iacute:389,plusminus:570,brokenbar:220,registered:747,Gbreve:778,Idotaccent:389,summation:600,Egrave:667,racute:444,omacron:500,Zacute:667,Zcaron:667,greaterequal:549,Eth:722,Ccedilla:722,
+            lcommaaccent:278,tcaron:416,eogonek:444,Uogonek:722,Aacute:722,Adieresis:722,egrave:444,zacute:444,iogonek:278,Oacute:778,oacute:500,amacron:500,sacute:389,idieresis:278,Ocircumflex:778,Ugrave:722,Delta:612,thorn:556,twosuperior:300,Odieresis:778,mu:556,igrave:278,ohungarumlaut:500,Eogonek:667,dcroat:556,threequarters:750,Scedilla:556,lcaron:394,Kcommaaccent:778,Lacute:667,trademark:1E3,edotaccent:444,Igrave:389,Imacron:389,Lcaron:667,onehalf:750,lessequal:549,ocircumflex:500,ntilde:556,Uhungarumlaut:722,
+            Eacute:667,emacron:444,gbreve:500,onequarter:750,Scaron:556,Scommaaccent:556,Ohungarumlaut:778,degree:400,ograve:500,Ccaron:722,ugrave:556,radical:549,Dcaron:722,rcommaaccent:444,Ntilde:722,otilde:500,Rcommaaccent:722,Lcommaaccent:667,Atilde:722,Aogonek:722,Aring:722,Otilde:778,zdotaccent:444,Ecaron:667,Iogonek:389,kcommaaccent:556,minus:570,Icircumflex:389,ncaron:556,tcommaaccent:333,logicalnot:570,odieresis:500,udieresis:556,notequal:549,gcommaaccent:500,eth:500,zcaron:444,ncommaaccent:556,onesuperior:300,
+            imacron:278,Euro:500},"Times-BoldItalic":{space:250,exclam:389,quotedbl:555,numbersign:500,dollar:500,percent:833,ampersand:778,quoteright:333,parenleft:333,parenright:333,asterisk:500,plus:570,comma:250,hyphen:333,period:250,slash:278,zero:500,one:500,two:500,three:500,four:500,five:500,six:500,seven:500,eight:500,nine:500,colon:333,semicolon:333,less:570,equal:570,greater:570,question:500,at:832,A:667,B:667,C:667,D:722,E:667,F:667,G:722,H:778,I:389,J:500,K:667,L:611,M:889,N:722,O:722,P:611,Q:722,
+            R:667,S:556,T:611,U:722,V:667,W:889,X:667,Y:611,Z:611,bracketleft:333,backslash:278,bracketright:333,asciicircum:570,underscore:500,quoteleft:333,a:500,b:500,c:444,d:500,e:444,f:333,g:500,h:556,i:278,j:278,k:500,l:278,m:778,n:556,o:500,p:500,q:500,r:389,s:389,t:278,u:556,v:444,w:667,x:500,y:444,z:389,braceleft:348,bar:220,braceright:348,asciitilde:570,exclamdown:389,cent:500,sterling:500,fraction:167,yen:500,florin:500,section:500,currency:500,quotesingle:278,quotedblleft:500,guillemotleft:500,guilsinglleft:333,
+            guilsinglright:333,fi:556,fl:556,endash:500,dagger:500,daggerdbl:500,periodcentered:250,paragraph:500,bullet:350,quotesinglbase:333,quotedblbase:500,quotedblright:500,guillemotright:500,ellipsis:1E3,perthousand:1E3,questiondown:500,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:1E3,AE:944,ordfeminine:266,Lslash:611,Oslash:722,OE:944,ordmasculine:300,ae:722,dotlessi:278,lslash:278,oslash:500,
+            oe:722,germandbls:500,Idieresis:389,eacute:444,abreve:500,uhungarumlaut:556,ecaron:444,Ydieresis:611,divide:570,Yacute:611,Acircumflex:667,aacute:500,Ucircumflex:722,yacute:444,scommaaccent:389,ecircumflex:444,Uring:722,Udieresis:722,aogonek:500,Uacute:722,uogonek:556,Edieresis:667,Dcroat:722,commaaccent:250,copyright:747,Emacron:667,ccaron:444,aring:500,Ncommaaccent:722,lacute:278,agrave:500,Tcommaaccent:611,Cacute:667,atilde:500,Edotaccent:667,scaron:389,scedilla:389,iacute:278,lozenge:494,Rcaron:667,
+            Gcommaaccent:722,ucircumflex:556,acircumflex:500,Amacron:667,rcaron:389,ccedilla:444,Zdotaccent:611,Thorn:611,Omacron:722,Racute:667,Sacute:556,dcaron:608,Umacron:722,uring:556,threesuperior:300,Ograve:722,Agrave:667,Abreve:667,multiply:570,uacute:556,Tcaron:611,partialdiff:494,ydieresis:444,Nacute:722,icircumflex:278,Ecircumflex:667,adieresis:500,edieresis:444,cacute:444,nacute:556,umacron:556,Ncaron:722,Iacute:389,plusminus:570,brokenbar:220,registered:747,Gbreve:722,Idotaccent:389,summation:600,
+            Egrave:667,racute:389,omacron:500,Zacute:611,Zcaron:611,greaterequal:549,Eth:722,Ccedilla:667,lcommaaccent:278,tcaron:366,eogonek:444,Uogonek:722,Aacute:667,Adieresis:667,egrave:444,zacute:389,iogonek:278,Oacute:722,oacute:500,amacron:500,sacute:389,idieresis:278,Ocircumflex:722,Ugrave:722,Delta:612,thorn:500,twosuperior:300,Odieresis:722,mu:576,igrave:278,ohungarumlaut:500,Eogonek:667,dcroat:500,threequarters:750,Scedilla:556,lcaron:382,Kcommaaccent:667,Lacute:611,trademark:1E3,edotaccent:444,Igrave:389,
+            Imacron:389,Lcaron:611,onehalf:750,lessequal:549,ocircumflex:500,ntilde:556,Uhungarumlaut:722,Eacute:667,emacron:444,gbreve:500,onequarter:750,Scaron:556,Scommaaccent:556,Ohungarumlaut:722,degree:400,ograve:500,Ccaron:667,ugrave:556,radical:549,Dcaron:722,rcommaaccent:389,Ntilde:722,otilde:500,Rcommaaccent:667,Lcommaaccent:611,Atilde:667,Aogonek:667,Aring:667,Otilde:722,zdotaccent:389,Ecaron:667,Iogonek:389,kcommaaccent:500,minus:606,Icircumflex:389,ncaron:556,tcommaaccent:278,logicalnot:606,odieresis:500,
+            udieresis:556,notequal:549,gcommaaccent:500,eth:500,zcaron:389,ncommaaccent:556,onesuperior:300,imacron:278,Euro:500},"Times-Italic":{space:250,exclam:333,quotedbl:420,numbersign:500,dollar:500,percent:833,ampersand:778,quoteright:333,parenleft:333,parenright:333,asterisk:500,plus:675,comma:250,hyphen:333,period:250,slash:278,zero:500,one:500,two:500,three:500,four:500,five:500,six:500,seven:500,eight:500,nine:500,colon:333,semicolon:333,less:675,equal:675,greater:675,question:500,at:920,A:611,B:611,
+            C:667,D:722,E:611,F:611,G:722,H:722,I:333,J:444,K:667,L:556,M:833,N:667,O:722,P:611,Q:722,R:611,S:500,T:556,U:722,V:611,W:833,X:611,Y:556,Z:556,bracketleft:389,backslash:278,bracketright:389,asciicircum:422,underscore:500,quoteleft:333,a:500,b:500,c:444,d:500,e:444,f:278,g:500,h:500,i:278,j:278,k:444,l:278,m:722,n:500,o:500,p:500,q:500,r:389,s:389,t:278,u:500,v:444,w:667,x:444,y:444,z:389,braceleft:400,bar:275,braceright:400,asciitilde:541,exclamdown:389,cent:500,sterling:500,fraction:167,yen:500,
+            florin:500,section:500,currency:500,quotesingle:214,quotedblleft:556,guillemotleft:500,guilsinglleft:333,guilsinglright:333,fi:500,fl:500,endash:500,dagger:500,daggerdbl:500,periodcentered:250,paragraph:523,bullet:350,quotesinglbase:333,quotedblbase:556,quotedblright:556,guillemotright:500,ellipsis:889,perthousand:1E3,questiondown:500,grave:333,acute:333,circumflex:333,tilde:333,macron:333,breve:333,dotaccent:333,dieresis:333,ring:333,cedilla:333,hungarumlaut:333,ogonek:333,caron:333,emdash:889,AE:889,
+            ordfeminine:276,Lslash:556,Oslash:722,OE:944,ordmasculine:310,ae:667,dotlessi:278,lslash:278,oslash:500,oe:667,germandbls:500,Idieresis:333,eacute:444,abreve:500,uhungarumlaut:500,ecaron:444,Ydieresis:556,divide:675,Yacute:556,Acircumflex:611,aacute:500,Ucircumflex:722,yacute:444,scommaaccent:389,ecircumflex:444,Uring:722,Udieresis:722,aogonek:500,Uacute:722,uogonek:500,Edieresis:611,Dcroat:722,commaaccent:250,copyright:760,Emacron:611,ccaron:444,aring:500,Ncommaaccent:667,lacute:278,agrave:500,Tcommaaccent:556,
+            Cacute:667,atilde:500,Edotaccent:611,scaron:389,scedilla:389,iacute:278,lozenge:471,Rcaron:611,Gcommaaccent:722,ucircumflex:500,acircumflex:500,Amacron:611,rcaron:389,ccedilla:444,Zdotaccent:556,Thorn:611,Omacron:722,Racute:611,Sacute:500,dcaron:544,Umacron:722,uring:500,threesuperior:300,Ograve:722,Agrave:611,Abreve:611,multiply:675,uacute:500,Tcaron:556,partialdiff:476,ydieresis:444,Nacute:667,icircumflex:278,Ecircumflex:611,adieresis:500,edieresis:444,cacute:444,nacute:500,umacron:500,Ncaron:667,
+            Iacute:333,plusminus:675,brokenbar:275,registered:760,Gbreve:722,Idotaccent:333,summation:600,Egrave:611,racute:389,omacron:500,Zacute:556,Zcaron:556,greaterequal:549,Eth:722,Ccedilla:667,lcommaaccent:278,tcaron:300,eogonek:444,Uogonek:722,Aacute:611,Adieresis:611,egrave:444,zacute:389,iogonek:278,Oacute:722,oacute:500,amacron:500,sacute:389,idieresis:278,Ocircumflex:722,Ugrave:722,Delta:612,thorn:500,twosuperior:300,Odieresis:722,mu:500,igrave:278,ohungarumlaut:500,Eogonek:611,dcroat:500,threequarters:750,
+            Scedilla:500,lcaron:300,Kcommaaccent:667,Lacute:556,trademark:980,edotaccent:444,Igrave:333,Imacron:333,Lcaron:611,onehalf:750,lessequal:549,ocircumflex:500,ntilde:500,Uhungarumlaut:722,Eacute:611,emacron:444,gbreve:500,onequarter:750,Scaron:500,Scommaaccent:500,Ohungarumlaut:722,degree:400,ograve:500,Ccaron:667,ugrave:500,radical:453,Dcaron:722,rcommaaccent:389,Ntilde:667,otilde:500,Rcommaaccent:611,Lcommaaccent:556,Atilde:611,Aogonek:611,Aring:611,Otilde:722,zdotaccent:389,Ecaron:611,Iogonek:333,
+            kcommaaccent:444,minus:675,Icircumflex:333,ncaron:500,tcommaaccent:278,logicalnot:675,odieresis:500,udieresis:500,notequal:549,gcommaaccent:500,eth:500,zcaron:389,ncommaaccent:500,onesuperior:300,imacron:278,Euro:500},ZapfDingbats:{space:278,a1:974,a2:961,a202:974,a3:980,a4:719,a5:789,a119:790,a118:791,a117:690,a11:960,a12:939,a13:549,a14:855,a15:911,a16:933,a105:911,a17:945,a18:974,a19:755,a20:846,a21:762,a22:761,a23:571,a24:677,a25:763,a26:760,a27:759,a28:754,a6:494,a7:552,a8:537,a9:577,a10:692,
+            a29:786,a30:788,a31:788,a32:790,a33:793,a34:794,a35:816,a36:823,a37:789,a38:841,a39:823,a40:833,a41:816,a42:831,a43:923,a44:744,a45:723,a46:749,a47:790,a48:792,a49:695,a50:776,a51:768,a52:792,a53:759,a54:707,a55:708,a56:682,a57:701,a58:826,a59:815,a60:789,a61:789,a62:707,a63:687,a64:696,a65:689,a66:786,a67:787,a68:713,a69:791,a70:785,a71:791,a72:873,a73:761,a74:762,a203:762,a75:759,a204:759,a76:892,a77:892,a78:788,a79:784,a81:438,a82:138,a83:277,a84:415,a97:392,a98:392,a99:668,a100:668,a89:390,a90:390,
+            a93:317,a94:317,a91:276,a92:276,a205:509,a85:509,a206:410,a86:410,a87:234,a88:234,a95:334,a96:334,a101:732,a102:544,a103:544,a104:910,a106:667,a107:760,a108:760,a112:776,a111:595,a110:694,a109:626,a120:788,a121:788,a122:788,a123:788,a124:788,a125:788,a126:788,a127:788,a128:788,a129:788,a130:788,a131:788,a132:788,a133:788,a134:788,a135:788,a136:788,a137:788,a138:788,a139:788,a140:788,a141:788,a142:788,a143:788,a144:788,a145:788,a146:788,a147:788,a148:788,a149:788,a150:788,a151:788,a152:788,a153:788,
+            a154:788,a155:788,a156:788,a157:788,a158:788,a159:788,a160:894,a161:838,a163:1016,a164:458,a196:748,a165:924,a192:748,a166:918,a167:927,a168:928,a169:928,a170:834,a171:873,a172:828,a173:924,a162:924,a174:917,a175:930,a176:931,a177:463,a178:883,a179:836,a193:836,a180:867,a199:867,a181:696,a200:696,a182:874,a201:874,a183:760,a184:946,a197:771,a185:865,a194:771,a198:888,a186:967,a195:888,a187:831,a188:873,a189:927,a190:970,a191:918}},M={},vb,Vg=function(a,b,c){this.lexer=a;this.allowStreams=b;this.xref=
+        c;this.imageCache={length:0,adler32:0,stream:null};this.refill()};Vg.prototype={refill:function(){this.buf1=this.lexer.getObj();this.buf2=this.lexer.getObj()},shift:function(){Y(this.buf2,"ID")?(this.buf1=this.buf2,this.buf2=null):(this.buf1=this.buf2,this.buf2=this.lexer.getObj())},getObj:function(a){if(Y(this.buf1,"BI"))return this.shift(),this.makeInlineImage(a);if(Y(this.buf1,"[")){this.shift();for(var b=[];!Y(this.buf1,"]")&&this.buf1!=M;)b.push(this.getObj(a));this.buf1==M&&u("End of file inside array");
+        this.shift();return b}if(Y(this.buf1,"<<")){this.shift();for(b=new ya(this.xref);!Y(this.buf1,">>")&&this.buf1!=M;)if(D(this.buf1)){var c=this.buf1.name;this.shift();if(this.buf1==M)break;b.set(c,this.getObj(a))}else R("Malformed dictionary: key must be a name object"),this.shift();this.buf1==M&&u("End of file inside dictionary");if(Y(this.buf2,"stream"))return this.allowStreams?this.makeStream(b,a):b;this.shift();return b}if(S(this.buf1))return a=this.buf1,this.shift(),S(this.buf1)&&Y(this.buf2,
+        "R")&&(a=new tc(a,this.buf1),this.shift(),this.shift()),a;if(oa(this.buf1))return b=this.buf1,this.shift(),a&&(b=a.decryptString(b)),b;a=this.buf1;this.shift();return a},makeInlineImage:function(a){for(var b=this.lexer.stream,c=new ya(null);!Y(this.buf1,"ID")&&this.buf1!=M;){D(this.buf1)||u("Dictionary key must be a name object");var d=this.buf1.name;this.shift();if(this.buf1==M)break;c.set(d,this.getObj(a))}for(var e=b.pos,f=0,g,h;4!=f&&-1!==(g=b.getByte());)switch(g|0){case 32:case 13:case 10:var j=
+        b.peekBytes(5),d=0;for(h=j.length;d<h;d++)if(g=j[d],10!==g&&13!==g&&(32>g||127<g)){f=0;break}f=3===f?4:0;break;case 69:f=2;break;case 73:f=2===f?3:0;break;default:f=0}g=b.pos-4-e;var b=b.makeSubStream(e,g,c),d=!1,l;if(1E3>g&&this.imageCache.length===g){l=b.getBytes();b.reset();e=1;d=f=0;for(h=l.length;d<h;++d)e=(e+(l[d]&255))%65521,f=(f+e)%65521;l=f<<16|e;if(this.imageCache.stream&&this.imageCache.adler32===l)return this.buf2=xa.get("EI"),this.shift(),this.imageCache.stream.reset(),this.imageCache.stream;
+        d=!0}!d&&!this.imageCache.stream&&(this.imageCache.length=g,this.imageCache.stream=null);a&&(b=a.createStream(b,g));b=this.filter(b,c,g);b.dict=c;d&&(b.cacheKey="inline_"+g+"_"+l,this.imageCache.adler32=l,this.imageCache.stream=b);this.buf2=xa.get("EI");this.shift();return b},fetchIfRef:function(a){return sa(a)?this.xref.fetch(a):a},makeStream:function(a,b){var c=this.lexer,d=c.stream;c.skipToNextLine();var e=d.pos-1,f=this.fetchIfRef(a.get("Length"));S(f)||(R("Bad "+f+" attribute in stream"),f=0);
+        d.pos=e+f;c.nextChar();this.shift();this.shift();if(!Y(this.buf1,"endstream")){d.pos=e;for(var f=[101,110,100,115,116,114,101,97,109],g=0,h=!1,j,l;d.pos<d.end;){var k=d.peekBytes(2048),m=k.length-9,h=!1;for(l=j=0;j<m;j++)if(k[j]!==f[l])j-=l,l=0;else if(l++,9<=l){j++;h=!0;break}if(h){g+=j-9;d.pos+=j-9;break}g+=m;d.pos+=m}h||u("Missing endstream");f=g;c.nextChar();this.shift();this.shift()}this.shift();d=d.makeSubStream(e,f,a);b&&(d=b.createStream(d,f));d=this.filter(d,a,f);d.dict=a;return d},filter:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        b,c){var d=this.fetchIfRef(b.get("Filter","F"));b=this.fetchIfRef(b.get("DecodeParms","DP"));if(D(d))return this.makeFilter(a,d.name,c,b);if(I(d))for(var e=d,f=b,g=0,h=e.length;g<h;++g)d=e[g],D(d)||u("Bad filter name: "+d),b=null,I(f)&&g in f&&(b=f[g]),a=this.makeFilter(a,d.name,c,b),c=null;return a},makeFilter:function(a,b,c,d){if(0===a.dict.get("Length"))return new Nd(a);if("FlateDecode"==b||"Fl"==b)return d?new ne(new oe(a,c),c,d):new oe(a,c);if("LZWDecode"==b||"LZW"==b)return b=1,d?(d.has("EarlyChange")&&
+    (b=d.get("EarlyChange")),new ne(new pe(a,c,b),c,d)):new pe(a,c,b);if("DCTDecode"==b||"DCT"==b)return new yc(a,c,a.dict,this.xref);if("JPXDecode"==b||"JPX"==b)return new Wg(a,c,a.dict);if("ASCII85Decode"==b||"A85"==b)return new Xg(a,c);if("ASCIIHexDecode"==b||"AHx"==b)return new Yg(a,c);if("CCITTFaxDecode"==b||"CCF"==b)return new Zg(a,c,d);if("RunLengthDecode"==b||"RL"==b)return new $g(a,c);if("JBIG2Decode"==b)return new ah(a,c,a.dict);L('filter "'+b+'" not supported yet');return a}};vb=Vg;var ca,
+        qe=function(a,b){this.stream=a;this.nextChar();this.strBuf=[];this.knownCommands=b},hd=function(a){return 48<=a&&57>=a?a&15:65<=a&&70>=a||97<=a&&102>=a?(a&15)+9:-1};qe.isSpace=function(a){return 32===a||9===a||13===a||10===a};var id=[1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];qe.prototype={nextChar:function(){return this.currentChar=this.stream.getByte()},peekChar:function(){return this.stream.peekBytes(1)[0]},getNumber:function(){var a=this.currentChar,b=!1,c=0,d=1;45===a?(d=-1,a=this.nextChar()):43===a&&(a=this.nextChar());46===
+    a&&(c=10,a=this.nextChar());if(48>a||57<a)return u("Invalid number: "+String.fromCharCode(a)),0;for(var e=a-48,f=0,g=1;0<=(a=this.nextChar());)if(48<=a&&57>=a)a-=48,b?f=10*f+a:(0!==c&&(c*=10),e=10*e+a);else if(46===a)if(0===c)c=1;else break;else if(45===a)L("Badly formated number");else if(69===a||101===a){a=this.peekChar();if(43===a||45===a)g=45===a?-1:1,this.nextChar();else if(48>a||57<a)break;b=!0}else break;0!==c&&(e/=c);b&&(e*=Math.pow(10,g*f));return d*e},getString:function(){var a=1,b=!1,c=
+        this.strBuf;c.length=0;for(var d=this.nextChar();;){var e=!1;switch(d|0){case -1:L("Unterminated string");b=!0;break;case 40:++a;c.push("(");break;case 41:0===--a?(this.nextChar(),b=!0):c.push(")");break;case 92:d=this.nextChar();switch(d){case -1:L("Unterminated string");b=!0;break;case 110:c.push("\n");break;case 114:c.push("\r");break;case 116:c.push("\t");break;case 98:c.push("\b");break;case 102:c.push("\f");break;case 92:case 40:case 41:c.push(String.fromCharCode(d));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:var f=
+        d&15,d=this.nextChar(),e=!0;48<=d&&55>=d&&(f=(f<<3)+(d&15),d=this.nextChar(),48<=d&&55>=d&&(e=!1,f=(f<<3)+(d&15)));c.push(String.fromCharCode(f));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:c.push(String.fromCharCode(d))}break;default:c.push(String.fromCharCode(d))}if(b)break;e||(d=this.nextChar())}return c.join("")},getName:function(){var a,b=this.strBuf;for(b.length=0;0<=(a=this.nextChar())&&!id[a];)if(35===a){a=this.nextChar();var c=hd(a);if(-1!=c){var d=hd(this.nextChar());
+        -1==d&&u("Illegal digit in hex char in name: "+d);b.push(String.fromCharCode(c<<4|d))}else b.push("#",String.fromCharCode(a))}else b.push(String.fromCharCode(a));128<b.length&&u("Warning: name token is longer than allowed by the spec: "+b.length);return pa.get(b.join(""))},getHexString:function(){var a=this.strBuf;a.length=0;for(var b=this.currentChar,c=!0,d,e;;)if(0>b){L("Unterminated hex string");break}else if(62===b){this.nextChar();break}else{if(1!==id[b]){if(c){if(d=hd(b),-1===d){L('Ignoring invalid character "'+
+        b+'" in hex string');b=this.nextChar();continue}}else{e=hd(b);if(-1===e){L('Ignoring invalid character "'+b+'" in hex string');b=this.nextChar();continue}a.push(String.fromCharCode(d<<4|e))}c=!c}b=this.nextChar()}return a.join("")},getObj:function(){for(var a=!1,b=this.currentChar;;){if(0>b)return M;if(a){if(10===b||13==b)a=!1}else if(37===b)a=!0;else if(1!==id[b])break;b=this.nextChar()}switch(b|0){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();
+        case 40:return this.getString();case 47:return this.getName();case 91:return this.nextChar(),xa.get("[");case 93:return this.nextChar(),xa.get("]");case 60:return b=this.nextChar(),60===b?(this.nextChar(),xa.get("<<")):this.getHexString();case 62:return b=this.nextChar(),62===b?(this.nextChar(),xa.get(">>")):xa.get(">");case 123:return this.nextChar(),xa.get("{");case 125:return this.nextChar(),xa.get("}");case 41:u("Illegal character: "+b)}var a=String.fromCharCode(b),c=this.knownCommands,d=c&&a in
+        c;for(;0<=(b=this.nextChar())&&!id[b];){var e=a+String.fromCharCode(b);if(d&&!(e in c))break;128==a.length&&u("Command token too long: "+a.length);a=e;d=c&&a in c}return"true"==a?!0:"false"==a?!1:"null"==a?null:xa.get(a)},skipToNextLine:function(){for(var a=this.currentChar;0<=a;){if(13===a){a=this.nextChar();10===a&&this.nextChar();break}else if(10===a){this.nextChar();break}a=this.nextChar()}}};ca=qe;var qf,bh=function(a){this.parser=new vb(new ca(a),!1,null);a=this.parser.getObj();var b=this.parser.getObj(),
+        c=this.parser.getObj();this.linDict=this.parser.getObj();S(a)&&(S(b)&&Y(c,"obj")&&G(this.linDict))&&(a=this.linDict.get("Linearized"),lb(a)&&0<a||(this.linDict=null))};bh.prototype={getInt:function(a){var b=this.linDict,c;if(G(b)&&S(c=b.get(a))&&0<c)return c;u('"'+a+'" field in linearization table is invalid')},getHint:function(a){var b=this.linDict,c,d;if(G(b)&&I(c=b.get("H"))&&2<=c.length&&S(d=c[a])&&0<d)return d;u("Hints table in linearization table is invalid: "+a)},get length(){return!G(this.linDict)?
+        0:this.getInt("L")},get hintsOffset(){return this.getHint(0)},get hintsLength(){return this.getHint(1)},get hintsOffset2(){return this.getHint(2)},get hintsLenth2(){return this.getHint(3)},get objectNumberFirst(){return this.getInt("O")},get endFirst(){return this.getInt("E")},get numPages(){return this.getInt("N")},get mainXRefEntriesOffset(){return this.getInt("T")},get pageFirst(){return this.getInt("P")}};qf=bh;var Xe,ch=function(a){this.lexer=a;this.operators=[];this.prev=this.token=null};ch.prototype=
+    {nextToken:function(){this.prev=this.token;this.token=this.lexer.getToken()},accept:function(a){return this.token.type==a?(this.nextToken(),!0):!1},expect:function(a){if(this.accept(a))return!0;u("Unexpected symbol: found "+this.token.type+" expected "+a+".")},parse:function(){this.nextToken();this.expect(ha.LBRACE);this.parseBlock();this.expect(ha.RBRACE);return this.operators},parseBlock:function(){for(;;)if(this.accept(ha.NUMBER))this.operators.push(this.prev.value);else if(this.accept(ha.OPERATOR))this.operators.push(this.prev.value);
+    else if(this.accept(ha.LBRACE))this.parseCondition();else break},parseCondition:function(){var a=this.operators.length;this.operators.push(null,null);this.parseBlock();this.expect(ha.RBRACE);if(this.accept(ha.IF))this.operators[a]=this.operators.length,this.operators[a+1]="jz";else if(this.accept(ha.LBRACE)){var b=this.operators.length;this.operators.push(null,null);var c=this.operators.length;this.parseBlock();this.expect(ha.RBRACE);this.expect(ha.IFELSE);this.operators[b]=this.operators.length;
+        this.operators[b+1]="j";this.operators[a]=c;this.operators[a+1]="jz"}else u("PS Function: error parsing conditional.")}};Xe=ch;var ha={LBRACE:0,RBRACE:1,NUMBER:2,OPERATOR:3,IF:4,IFELSE:5},ka=function(a,b){this.type=a;this.value=b},dh={};ka.getOperator=function(a){var b=dh[a];return b?b:dh[a]=new ka(ha.OPERATOR,a)};ka.LBRACE=new ka(ha.LBRACE,"{");ka.RBRACE=new ka(ha.RBRACE,"}");ka.IF=new ka(ha.IF,"IF");ka.IFELSE=new ka(ha.IFELSE,"IFELSE");var We,eh=function(a){this.stream=a;this.nextChar()};eh.prototype=
+    {nextChar:function(){return this.currentChar=this.stream.getByte()},getToken:function(){for(var a=!1,b=this.currentChar;;){if(0>b)return M;if(a){if(10===b||13===b)a=!1}else if(37==b)a=!0;else if(!ca.isSpace(b))break;b=this.nextChar()}switch(b|0){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return new ka(ha.NUMBER,this.getNumber());case 123:return this.nextChar(),ka.LBRACE;case 125:return this.nextChar(),ka.RBRACE}for(a=String.fromCharCode(b);0<=
+    (b=this.nextChar())&&(65<=b&&90>=b||97<=b&&122>=b);)a+=String.fromCharCode(b);switch(a.toLowerCase()){case "if":return ka.IF;case "ifelse":return ka.IFELSE;default:return ka.getOperator(a)}},getNumber:function(){for(var a=this.currentChar,b=String.fromCharCode(a);0<=(a=this.nextChar());)if(48<=a&&57>=a||45===a||46===a)b+=String.fromCharCode(a);else break;a=parseFloat(b);isNaN(a)&&u("Invalid floating point number: "+a);return a}};We=eh;var wa,re=function(a,b,c,d){this.bytes=a instanceof Uint8Array?
+        a:new Uint8Array(a);this.pos=this.start=b||0;this.end=b+c||this.bytes.length;this.dict=d};re.prototype={get length(){return this.end-this.start},getByte:function(){return this.pos>=this.end?-1:this.bytes[this.pos++]},getUint16:function(){var a=this.getByte(),b=this.getByte();return(a<<8)+b},getInt32:function(){var a=this.getByte(),b=this.getByte(),c=this.getByte(),d=this.getByte();return(a<<24)+(b<<16)+(c<<8)+d},getBytes:function(a){var b=this.bytes,c=this.pos,d=this.end;if(!a)return b.subarray(c,
+        d);a=c+a;a>d&&(a=d);this.pos=a;return b.subarray(c,a)},peekBytes:function(a){a=this.getBytes(a);this.pos-=a.length;return a},skip:function(a){a||(a=1);this.pos+=a},reset:function(){this.pos=this.start},moveStart:function(){this.start=this.pos},makeSubStream:function(a,b,c){return new re(this.bytes.buffer,a,b,c)},isStream:!0};wa=re;var pg,fh=function(a){for(var b=a.length,c=new Uint8Array(b),d=0;d<b;++d)c[d]=a.charCodeAt(d);wa.call(this,c)};fh.prototype=wa.prototype;pg=fh;var Z,gh=function(a){this.bufferLength=
+        this.pos=0;this.eof=!1;this.buffer=null;this.minBufferLength=512;if(a)for(;this.minBufferLength<a;)this.minBufferLength*=2};gh.prototype={ensureBuffer:function(a){var b=this.buffer,c;if(b){if(c=b.byteLength,a<=c)return b}else c=0;for(var d=this.minBufferLength;d<a;)d*=2;a=new Uint8Array(d);for(d=0;d<c;++d)a[d]=b[d];return this.buffer=a},getByte:function(){for(var a=this.pos;this.bufferLength<=a;){if(this.eof)return-1;this.readBlock()}return this.buffer[this.pos++]},getUint16:function(){var a=this.getByte(),
+        b=this.getByte();return(a<<8)+b},getInt32:function(){var a=this.getByte(),b=this.getByte(),c=this.getByte(),d=this.getByte();return(a<<24)+(b<<16)+(c<<8)+d},getBytes:function(a){var b=this.pos;if(a){this.ensureBuffer(b+a);for(a=b+a;!this.eof&&this.bufferLength<a;)this.readBlock();var c=this.bufferLength;a>c&&(a=c)}else{for(;!this.eof;)this.readBlock();a=this.bufferLength;a||(this.buffer=new Uint8Array(0))}this.pos=a;return this.buffer.subarray(b,a)},peekBytes:function(a){a=this.getBytes(a);this.pos-=
+        a.length;return a},makeSubStream:function(a,b,c){for(var d=a+b;this.bufferLength<=d&&!this.eof;)this.readBlock();return new wa(this.buffer,a,b,c)},skip:function(a){a||(a=1);this.pos+=a},reset:function(){this.pos=0},getBaseStreams:function(){return this.str&&this.str.getBaseStreams?this.str.getBaseStreams():[]}};Z=gh;var mf,jd=function(a){this.streams=a;Z.call(this,null)};jd.prototype=Object.create(Z.prototype);jd.prototype.readBlock=function(){var a=this.streams;if(0===a.length)this.eof=!0;else{var a=
+        a.shift().getBytes(),b=this.bufferLength,c=b+a.length;this.ensureBuffer(c).set(a,b);this.bufferLength=c}};jd.prototype.getBaseStreams=function(){for(var a=[],b=0,c=this.streams.length;b<c;b++){var d=this.streams[b];d.getBaseStreams&&w.concatenateToArray(a,d.getBaseStreams())}return a};mf=jd;var oe,gc=function(a,b){this.str=a;this.dict=a.dict;var c=a.getByte(),d=a.getByte();(-1==c||-1==d)&&u("Invalid header in flate stream: "+c+", "+d);8!=(c&15)&&u("Unknown compression method in flate stream: "+c+
+        ", "+d);0!==((c<<8)+d)%31&&u("Bad FCHECK in flate stream: "+c+", "+d);d&32&&u("FDICT bit set in flate stream: "+c+", "+d);this.codeBuf=this.codeSize=0;Z.call(this,b)},hh=new Uint32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ei=new Uint32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),Fi=new Uint32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,
+        327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),Gi=[new Uint32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,59E4,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,
+        589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,
+        590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,
+        524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,
+        589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,
+        589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,
+        590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,
+        524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],Hi=[new Uint32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5];gc.prototype=Object.create(Z.prototype);gc.prototype.getBits=
+        function(a){for(var b=this.str,c=this.codeSize,d=this.codeBuf,e;c<a;)-1===(e=b.getByte())&&u("Bad encoding in flate stream"),d|=e<<c,c+=8;this.codeBuf=d>>a;this.codeSize=c-a;return d&(1<<a)-1};gc.prototype.getCode=function(a){var b=this.str,c=a[0],d=a[1];a=this.codeSize;for(var e=this.codeBuf;a<d;){var f;-1===(f=b.getByte())&&u("Bad encoding in flate stream");e|=f<<a;a+=8}c=c[e&(1<<d)-1];b=c>>16;c&=65535;(0===a||a<b||0===b)&&u("Bad encoding in flate stream");this.codeBuf=e>>b;this.codeSize=a-b;return c};
+    gc.prototype.generateHuffmanTable=function(a){var b=a.length,c=0,d;for(d=0;d<b;++d)a[d]>c&&(c=a[d]);for(var e=1<<c,f=new Uint32Array(e),g=1,h=0,j=2;g<=c;++g,h<<=1,j<<=1)for(var l=0;l<b;++l)if(a[l]==g){var k=0,m=h;for(d=0;d<g;++d)k=k<<1|m&1,m>>=1;for(d=k;d<e;d+=j)f[d]=g<<16|l;++h}return[f,c]};gc.prototype.readBlock=function(){var a,b;b=this.str;a=this.getBits(3);a&1&&(this.eof=!0);a>>=1;if(0===a){var c;-1===(c=b.getByte())&&u("Bad block header in flate stream");var d=c;-1===(c=b.getByte())&&u("Bad block header in flate stream");
+        d|=c<<8;-1===(c=b.getByte())&&u("Bad block header in flate stream");a=c;-1===(c=b.getByte())&&u("Bad block header in flate stream");a|=c<<8;a!=(~d&65535)&&(0!==d||0!==a)&&u("Bad uncompressed block length in flate stream");this.codeSize=this.codeBuf=0;c=this.bufferLength;a=this.ensureBuffer(c+d);var e=c+d;this.bufferLength=e;if(0===d)0===b.peekBytes(1).length&&(this.eof=!0);else for(d=c;d<e;++d){if(-1===(c=b.getByte())){this.eof=!0;break}a[d]=c}}else{if(1==a)c=Gi,d=Hi;else if(2==a){a=this.getBits(5)+
+        257;e=this.getBits(5)+1;b=this.getBits(4)+4;d=new Uint8Array(hh.length);for(c=0;c<b;++c)d[hh[c]]=this.getBits(3);d=this.generateHuffmanTable(d);c=b=0;for(var e=a+e,f=new Uint8Array(e),g,h,j;c<e;){j=this.getCode(d);if(16==j)g=2,h=3,j=b;else if(17==j)h=g=3,j=b=0;else if(18==j)g=7,h=11,j=b=0;else{f[c++]=b=j;continue}for(g=this.getBits(g)+h;0<g--;)f[c++]=j}c=this.generateHuffmanTable(f.subarray(0,a));d=this.generateHuffmanTable(f.subarray(a,e))}else u("Unknown block type in flate stream");e=(a=this.buffer)?
+        a.length:0;for(f=this.bufferLength;;)if(j=this.getCode(c),256>j)f+1>=e&&(a=this.ensureBuffer(f+1),e=a.length),a[f++]=j;else{if(256==j){this.bufferLength=f;break}j-=257;j=Ei[j];g=j>>16;0<g&&(g=this.getBits(g));b=(j&65535)+g;j=this.getCode(d);j=Fi[j];g=j>>16;0<g&&(g=this.getBits(g));j=(j&65535)+g;f+b>=e&&(a=this.ensureBuffer(f+b),e=a.length);for(g=0;g<b;++g,++f)a[f]=a[f-j]}}};oe=gc;var ne,kd=function(a,b,c){var d=this.predictor=c.get("Predictor")||1;if(1>=d)return a;2!==d&&(10>d||15<d)&&u("Unsupported predictor: "+
+        d);this.readBlock=2===d?this.readBlockTiff:this.readBlockPng;this.str=a;this.dict=a.dict;a=this.colors=c.get("Colors")||1;d=this.bits=c.get("BitsPerComponent")||8;c=this.columns=c.get("Columns")||1;this.pixBytes=a*d+7>>3;this.rowBytes=c*a*d+7>>3;Z.call(this,b);return this};kd.prototype=Object.create(Z.prototype);kd.prototype.readBlockTiff=function(){var a=this.rowBytes,b=this.bufferLength,c=this.ensureBuffer(b+a),d=this.bits,e=this.colors,f=this.str.getBytes(a);this.eof=!f.length;if(!this.eof){var g=
+        0,h=0,j=0,l=0,k=b;if(1===d)for(b=0;b<a;++b)d=f[b],g=g<<8|d,c[k++]=(d^g>>e)&255,g&=65535;else if(8===d){for(b=0;b<e;++b)c[k++]=f[b];for(;b<a;++b)c[k]=c[k-e]+f[b],k++}else{for(var k=new Uint8Array(e+1),m=(1<<d)-1,n=0,p=b,q=this.columns,b=0;b<q;++b)for(var s=0;s<e;++s)j<d&&(g=g<<8|f[n++]&255,j+=8),k[s]=k[s]+(g>>j-d)&m,j-=d,h=h<<d|k[s],l+=d,8<=l&&(c[p++]=h>>l-8&255,l-=8);0<l&&(c[p++]=(h<<8-l)+(g&(1<<8-l)-1))}this.bufferLength+=a}};kd.prototype.readBlockPng=function(){var a=this.rowBytes,b=this.pixBytes,
+        c=this.str.getByte(),d=this.str.getBytes(a);this.eof=!d.length;if(!this.eof){var e=this.bufferLength,f=this.ensureBuffer(e+a),g=f.subarray(e-a,e);0===g.length&&(g=new Uint8Array(a));var h,j;switch(c){case 0:for(c=0;c<a;++c)f[e++]=d[c];break;case 1:for(c=0;c<b;++c)f[e++]=d[c];for(;c<a;++c)f[e]=f[e-b]+d[c]&255,e++;break;case 2:for(c=0;c<a;++c)f[e++]=g[c]+d[c]&255;break;case 3:for(c=0;c<b;++c)f[e++]=(g[c]>>1)+d[c];for(;c<a;++c)f[e]=(g[c]+f[e-b]>>1)+d[c]&255,e++;break;case 4:for(c=0;c<b;++c)h=g[c],j=
+        d[c],f[e++]=h+j;for(;c<a;++c){h=g[c];var l=g[c-b],k=f[e-b];j=k+h-l;var m=j-k;0>m&&(m=-m);var n=j-h;0>n&&(n=-n);var p=j-l;0>p&&(p=-p);j=d[c];m<=n&&m<=p?f[e++]=k+j:n<=p?f[e++]=h+j:f[e++]=l+j}break;default:u("Unsupported predictor: "+c)}this.bufferLength+=a}};ne=kd;var yc,Bb=function(a,b,c){this.stream=a;this.maybeLength=b;this.dict=c;Z.call(this,b)};Bb.prototype=Object.create(Z.prototype);Object.defineProperty(Bb.prototype,"bytes",{get:function(){return K(this,"bytes",this.stream.getBytes(this.maybeLength))},
+        configurable:!0});Bb.prototype.ensureBuffer=function(){if(!this.bufferLength)try{var a=new ih;-1!=this.colorTransform&&(a.colorTransform=this.colorTransform);a.parse(this.bytes);var b=a.getData(a.width,a.height);this.buffer=b;this.bufferLength=b.length;this.eof=!0}catch(c){u("JPEG error: "+c)}};Bb.prototype.getIR=function(){return PDFJS.createObjectURL(this.bytes,"image/jpeg")};Bb.prototype.isNativelySupported=function(a,b){var c=U.parse(this.dict.get("ColorSpace","CS"),a,b);return"DeviceGray"===
+        c.name||"DeviceRGB"===c.name};Bb.prototype.isNativelyDecodable=function(a,b){var c=U.parse(this.dict.get("ColorSpace","CS"),a,b).numComps;return 1==c||3==c};yc=Bb;var Wg,ld=function(a,b,c){this.stream=a;this.maybeLength=b;this.dict=c;Z.call(this,b)};ld.prototype=Object.create(Z.prototype);Object.defineProperty(ld.prototype,"bytes",{get:function(){return K(this,"bytes",this.stream.getBytes(this.maybeLength))},configurable:!0});ld.prototype.ensureBuffer=function(){if(!this.bufferLength){var a=new me;
+        a.parse(this.bytes);var b=a.width,c=a.height,d=a.componentsCount,e=a.tiles.length;if(1===e)this.buffer=a.tiles[0].items;else{for(var c=new Uint8Array(b*c*d),f=0;f<e;f++)for(var g=a.tiles[f],h=g.height,j=g.items,l=0,k=(b*g.top+g.left)*d,m=b*d,g=g.width*d,n=0;n<h;n++){var p=j.subarray(l,l+g);c.set(p,k);l+=g;k+=m}this.buffer=c}this.bufferLength=this.buffer.length;this.eof=!0}};Wg=ld;var ah,md=function(a,b,c){this.stream=a;this.maybeLength=b;this.dict=c;Z.call(this,b)};md.prototype=Object.create(Z.prototype);
+    Object.defineProperty(md.prototype,"bytes",{get:function(){return K(this,"bytes",this.stream.getBytes(this.maybeLength))},configurable:!0});md.prototype.ensureBuffer=function(){if(!this.bufferLength){var a=new jh,b=[],c=this.dict.get("DecodeParms");I(c)&&(1<c.length&&L("JBIG2 - 'DecodeParms' array with multiple elements not supported."),c=c[0]);c&&c.has("JBIG2Globals")&&(c=c.get("JBIG2Globals").getBytes(),b.push({data:c,start:0,end:c.length}));b.push({data:this.bytes,start:0,end:this.bytes.length});
+        a=a.parseChunks(b);b=a.length;for(c=0;c<b;c++)a[c]^=255;this.buffer=a;this.bufferLength=b;this.eof=!0}};ah=md;var Jf,se=function(a,b,c){this.str=a;this.dict=a.dict;this.decrypt=c;this.nextChunk=null;this.initialized=!1;Z.call(this,b)};se.prototype=Object.create(Z.prototype);se.prototype.readBlock=function(){var a;this.initialized?a=this.nextChunk:(a=this.str.getBytes(512),this.initialized=!0);if(!a||0===a.length)this.eof=!0;else{this.nextChunk=this.str.getBytes(512);var b=this.decrypt;a=b(a,!(this.nextChunk&&
+    0<this.nextChunk.length));var b=this.bufferLength,c,d=a.length,e=this.ensureBuffer(b+d);for(c=0;c<d;c++)e[b++]=a[c];this.bufferLength=b}};Jf=se;var Xg,te=function(a,b){this.str=a;this.dict=a.dict;this.input=new Uint8Array(5);b&&(b*=0.8);Z.call(this,b)};te.prototype=Object.create(Z.prototype);te.prototype.readBlock=function(){for(var a=this.str,b=a.getByte();ca.isSpace(b);)b=a.getByte();if(-1===b||126===b)this.eof=!0;else{var c=this.bufferLength,d;if(122==b){a=this.ensureBuffer(c+4);for(d=0;4>d;++d)a[c+
+    d]=0;this.bufferLength+=4}else{var e=this.input;e[0]=b;for(d=1;5>d;++d){for(b=a.getByte();ca.isSpace(b);)b=a.getByte();e[d]=b;if(-1===b||126==b)break}a=this.ensureBuffer(c+d-1);this.bufferLength+=d-1;if(5>d){for(;5>d;++d)e[d]=117;this.eof=!0}for(d=b=0;5>d;++d)b=85*b+(e[d]-33);for(d=3;0<=d;--d)a[c+d]=b&255,b>>=8}}};Xg=te;var Yg,ue=function(a,b){this.str=a;this.dict=a.dict;this.firstDigit=-1;b&&(b*=0.5);Z.call(this,b)};ue.prototype=Object.create(Z.prototype);ue.prototype.readBlock=function(){var a=
+        this.str.getBytes(8E3);if(a.length){for(var b=this.ensureBuffer(this.bufferLength+(a.length+1>>1)),c=this.bufferLength,d=this.firstDigit,e=0,f=a.length;e<f;e++){var g=a[e];if(48<=g&&57>=g)g&=15;else if(65<=g&&70>=g||97<=g&&102>=g)g=(g&15)+9;else if(62===g){this.eof=!0;break}else continue;0>d?d=g:(b[c++]=d<<4|g,d=-1)}0<=d&&this.eof&&(b[c++]=d<<4,d=-1);this.firstDigit=d;this.bufferLength=c}else this.eof=!0};Yg=ue;var $g,ve=function(a,b){this.str=a;this.dict=a.dict;Z.call(this,b)};ve.prototype=Object.create(Z.prototype);
+    ve.prototype.readBlock=function(){var a=this.str.getBytes(2);if(!a||2>a.length||128==a[0])this.eof=!0;else{var b,c=this.bufferLength,d=a[0];if(128>d)b=this.ensureBuffer(c+d+1),b[c++]=a[1],0<d&&(a=this.str.getBytes(d),b.set(a,c),c+=d);else{d=257-d;a=a[1];b=this.ensureBuffer(c+d+1);for(var e=0;e<d;e++)b[c++]=a}this.bufferLength=c}};$g=ve;var Zg,Ia=function(a,b,c){this.str=a;this.dict=a.dict;c=c||ya.empty;this.encoding=c.get("K")||0;this.eoline=c.get("EndOfLine")||!1;this.byteAlign=c.get("EncodedByteAlign")||
+        !1;this.columns=c.get("Columns")||1728;this.rows=c.get("Rows")||0;a=c.get("EndOfBlock");if(null===a||void 0===a)a=!0;this.eoblock=a;this.black=c.get("BlackIs1")||!1;this.codingLine=new Uint32Array(this.columns+1);this.refLine=new Uint32Array(this.columns+2);this.codingLine[0]=this.columns;this.row=this.codingPos=0;this.nextLine2D=0>this.encoding;for(this.outputBits=this.inputBuf=this.inputBits=0;0===(c=this.lookBits(12));)this.eatBits(1);1==c&&this.eatBits(12);0<this.encoding&&(this.nextLine2D=!this.lookBits(1),
+        this.eatBits(1));Z.call(this,b)},kh=[[-1,-1],[-1,-1],[7,8],[7,7],[6,6],[6,6],[6,5],[6,5],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],
+        [1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2]],lh=[[-1,-1],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[12,1984],[12,2048],[12,2112],[12,2176],[12,
+        2240],[12,2304],[11,1856],[11,1856],[11,1920],[11,1920],[12,2368],[12,2432],[12,2496],[12,2560]],mh=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[8,29],[8,29],[8,30],[8,30],[8,45],[8,45],[8,46],[8,46],[7,22],[7,22],[7,22],[7,22],[7,23],[7,23],[7,23],[7,23],[8,47],[8,47],[8,48],[8,48],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[7,20],[7,20],[7,20],[7,20],[8,33],[8,33],[8,34],[8,34],[8,35],[8,35],[8,36],[8,36],[8,37],[8,37],[8,38],[8,38],[7,19],[7,19],[7,19],[7,19],[8,31],[8,31],[8,32],[8,32],[6,1],
+        [6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[8,53],[8,53],[8,54],[8,54],[7,26],[7,26],[7,26],[7,26],[8,39],[8,39],[8,40],[8,40],[8,41],[8,41],[8,42],[8,42],[8,43],[8,43],[8,44],[8,44],[7,21],[7,21],[7,21],[7,21],[7,28],[7,28],[7,28],[7,28],[8,61],[8,61],[8,62],[8,62],[8,63],[8,63],[8,0],[8,0],[8,320],[8,320],[8,384],[8,384],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,11],[5,
+            11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[7,27],[7,27],[7,27],[7,27],[8,59],[8,59],[8,60],[8,60],[9,1472],[9,1536],[9,1600],[9,1728],[7,18],[7,18],[7,18],[7,18],[7,24],[7,24],[7,24],[7,24],[8,49],[8,49],[8,50],[8,50],[8,51],[8,51],[8,52],[8,52],[7,25],[7,25],[7,25],[7,25],[8,55],[8,55],[8,56],[8,56],[8,57],[8,57],[8,58],[8,58],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,
+            1664],[6,1664],[6,1664],[8,448],[8,448],[8,512],[8,512],[9,704],[9,768],[8,640],[8,640],[8,576],[8,576],[9,832],[9,896],[9,960],[9,1024],[9,1088],[9,1152],[9,1216],[9,1280],[9,1344],[9,1408],[7,256],[7,256],[7,256],[7,256],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,
+            3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,17],[6,17],[6,17],
+        [6,17],[6,17],[6,17],[6,17],[6,17],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,15],[6,15],[6,15],[6,15],
+        [6,15],[6,15],[6,15],[6,15],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,
+            7],[4,7],[4,7],[4,7]],nh=[[-1,-1],[-1,-1],[12,-2],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[11,1792],[11,1792],[12,1984],[12,1984],[12,2048],[12,2048],[12,2112],[12,2112],[12,2176],[12,2176],[12,2240],[12,2240],[12,2304],[12,2304],[11,1856],[11,1856],[11,1856],[11,1856],[11,1920],[11,1920],
+        [11,1920],[11,1920],[12,2368],[12,2368],[12,2432],[12,2432],[12,2496],[12,2496],[12,2560],[12,2560],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[12,52],[12,52],[13,640],[13,704],[13,768],[13,832],[12,55],[12,55],[12,56],[12,56],[13,1280],[13,1344],[13,1408],[13,1472],[12,59],[12,59],[12,60],[12,60],[13,1536],[13,1600],[11,24],[11,24],[11,24],[11,24],[11,25],[11,25],[11,25],[11,25],[13,1664],[13,1728],[12,320],[12,320],[12,384],[12,384],[12,448],[12,448],[13,512],[13,576],[12,53],
+        [12,53],[12,54],[12,54],[13,896],[13,960],[13,1024],[13,1088],[13,1152],[13,1216],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64]],oh=[[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[11,23],[11,23],[12,50],[12,51],[12,44],[12,45],[12,46],[12,47],[12,57],[12,58],[12,61],[12,256],[10,16],[10,16],[10,16],[10,16],[10,17],[10,17],[10,17],[10,17],[12,48],[12,49],[12,62],[12,63],[12,30],[12,31],[12,32],[12,33],[12,40],[12,41],
+        [11,22],[11,22],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,
+            11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[12,128],[12,192],[12,26],[12,27],[12,28],[12,29],[11,19],[11,19],[11,20],[11,20],[12,34],[12,35],[12,36],[12,37],[12,38],[12,39],[11,21],[11,21],[12,42],[12,43],[10,0],[10,0],[10,0],[10,0],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],
+        [7,12],[7,12],[7,12],[7,12],[7,12],[7,12]],ph=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[6,9],[6,8],[5,7],[5,7],[4,6],[4,6],[4,6],[4,6],[4,5],[4,5],[4,5],[4,5],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2]];Ia.prototype=Object.create(Z.prototype);Ia.prototype.readBlock=
+        function(){for(;!this.eof;){var a=this.lookChar();this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=a}};Ia.prototype.addPixels=function(a,b){var c=this.codingLine,d=this.codingPos;a>c[d]&&(a>this.columns&&(R("row is wrong length"),this.err=!0,a=this.columns),d&1^b&&++d,c[d]=a);this.codingPos=d};Ia.prototype.addPixelsNeg=function(a,b){var c=this.codingLine,d=this.codingPos;if(a>c[d])a>this.columns&&(R("row is wrong length"),this.err=!0,a=this.columns),d&1^b&&++d,c[d]=a;else if(a<
+        c[d]){0>a&&(R("invalid code"),this.err=!0,a=0);for(;0<d&&a<c[d-1];)--d;c[d]=a}this.codingPos=d};Ia.prototype.lookChar=function(){var a=this.refLine,b=this.codingLine,c=this.columns,d,e,f;if(0===this.outputBits){if(this.eof)return null;this.err=!1;var g,h;if(this.nextLine2D){for(d=0;b[d]<c;++d)a[d]=b[d];a[d++]=c;a[d]=c;for(e=d=this.codingPos=b[0]=0;b[this.codingPos]<c;)switch(f=this.getTwoDimCode(),f){case 0:this.addPixels(a[d+1],e);a[d+1]<c&&(d+=2);break;case 1:f=g=0;if(e){do f+=h=this.getBlackCode();
+    while(64<=h);do g+=h=this.getWhiteCode();while(64<=h)}else{do f+=h=this.getWhiteCode();while(64<=h);do g+=h=this.getBlackCode();while(64<=h)}this.addPixels(b[this.codingPos]+f,e);for(b[this.codingPos]<c&&this.addPixels(b[this.codingPos]+g,e^1);a[d]<=b[this.codingPos]&&a[d]<c;)d+=2;break;case 7:this.addPixels(a[d]+3,e);e^=1;if(b[this.codingPos]<c)for(++d;a[d]<=b[this.codingPos]&&a[d]<c;)d+=2;break;case 5:this.addPixels(a[d]+2,e);e^=1;if(b[this.codingPos]<c)for(++d;a[d]<=b[this.codingPos]&&a[d]<c;)d+=
+        2;break;case 3:this.addPixels(a[d]+1,e);e^=1;if(b[this.codingPos]<c)for(++d;a[d]<=b[this.codingPos]&&a[d]<c;)d+=2;break;case 2:this.addPixels(a[d],e);e^=1;if(b[this.codingPos]<c)for(++d;a[d]<=b[this.codingPos]&&a[d]<c;)d+=2;break;case 8:this.addPixelsNeg(a[d]-3,e);e^=1;if(b[this.codingPos]<c)for(0<d?--d:++d;a[d]<=b[this.codingPos]&&a[d]<c;)d+=2;break;case 6:this.addPixelsNeg(a[d]-2,e);e^=1;if(b[this.codingPos]<c)for(0<d?--d:++d;a[d]<=b[this.codingPos]&&a[d]<c;)d+=2;break;case 4:this.addPixelsNeg(a[d]-
+        1,e);e^=1;if(b[this.codingPos]<c)for(0<d?--d:++d;a[d]<=b[this.codingPos]&&a[d]<c;)d+=2;break;case M:this.addPixels(c,0);this.eof=!0;break;default:R("bad 2d code"),this.addPixels(c,0),this.err=!0}}else for(e=this.codingPos=b[0]=0;b[this.codingPos]<c;){f=0;if(e){do f+=h=this.getBlackCode();while(64<=h)}else{do f+=h=this.getWhiteCode();while(64<=h)}this.addPixels(b[this.codingPos]+f,e);e^=1}this.byteAlign&&(this.inputBits&=-8);a=!1;if(!this.eoblock&&this.row==this.rows-1)this.eof=!0;else{for(f=this.lookBits(12);0===
+    f;)this.eatBits(1),f=this.lookBits(12);1==f?(this.eatBits(12),a=!0):f==M&&(this.eof=!0)}!this.eof&&0<this.encoding&&(this.nextLine2D=!this.lookBits(1),this.eatBits(1));if(this.eoblock&&a){if(f=this.lookBits(12),1==f){this.eatBits(12);0<this.encoding&&(this.lookBits(1),this.eatBits(1));if(0<=this.encoding)for(d=0;4>d;++d)f=this.lookBits(12),1!=f&&R("bad rtc code: "+f),this.eatBits(12),0<this.encoding&&(this.lookBits(1),this.eatBits(1));this.eof=!0}}else if(this.err&&this.eoline){for(;;){f=this.lookBits(13);
+        if(f==M)return this.eof=!0,null;if(1==f>>1)break;this.eatBits(1)}this.eatBits(12);0<this.encoding&&(this.eatBits(1),this.nextLine2D=!(f&1))}this.outputBits=0<b[0]?b[this.codingPos=0]:b[this.codingPos=1];this.row++}if(8<=this.outputBits)a=this.codingPos&1?0:255,this.outputBits-=8,0===this.outputBits&&b[this.codingPos]<c&&(this.codingPos++,this.outputBits=b[this.codingPos]-b[this.codingPos-1]);else{f=8;a=0;do this.outputBits>f?(a<<=f,this.codingPos&1||(a|=255>>8-f),this.outputBits-=f,f=0):(a<<=this.outputBits,
+    this.codingPos&1||(a|=255>>8-this.outputBits),f-=this.outputBits,this.outputBits=0,b[this.codingPos]<c?(this.codingPos++,this.outputBits=b[this.codingPos]-b[this.codingPos-1]):0<f&&(a<<=f,f=0));while(f)}this.black&&(a^=255);return a};Ia.prototype.findTableCode=function(a,b,c,d){for(d=d||0;a<=b;++a){var e=this.lookBits(a);if(e==M)return[!0,1,!1];a<b&&(e<<=b-a);if(!d||e>=d)if(e=c[e-d],e[0]==a)return this.eatBits(a),[!0,e[1],!0]}return[!1,0,!1]};Ia.prototype.getTwoDimCode=function(){var a=0;if(this.eoblock){if(a=
+            this.lookBits(7),(a=kh[a])&&0<a[0])return this.eatBits(a[0]),a[1]}else if(a=this.findTableCode(1,7,kh),a[0]&&a[2])return a[1];R("Bad two dim code");return M};Ia.prototype.getWhiteCode=function(){var a=0;if(this.eoblock){a=this.lookBits(12);if(a==M)return 1;a=0===a>>5?lh[a]:mh[a>>3];if(0<a[0])return this.eatBits(a[0]),a[1]}else{a=this.findTableCode(1,9,mh);if(a[0])return a[1];a=this.findTableCode(11,12,lh);if(a[0])return a[1]}R("bad white code");this.eatBits(1);return 1};Ia.prototype.getBlackCode=
+        function(){var a;if(this.eoblock){a=this.lookBits(13);if(a==M)return 1;a=0===a>>7?nh[a]:0===a>>9&&0!==a>>7?oh[(a>>1)-64]:ph[a>>7];if(0<a[0])return this.eatBits(a[0]),a[1]}else{a=this.findTableCode(2,6,ph);if(a[0])return a[1];a=this.findTableCode(7,12,oh,64);if(a[0])return a[1];a=this.findTableCode(10,13,nh);if(a[0])return a[1]}R("bad black code");this.eatBits(1);return 1};Ia.prototype.lookBits=function(a){for(var b;this.inputBits<a;){if(-1===(b=this.str.getByte()))return 0===this.inputBits?M:this.inputBuf<<
+    a-this.inputBits&65535>>16-a;this.inputBuf=(this.inputBuf<<8)+b;this.inputBits+=8}return this.inputBuf>>this.inputBits-a&65535>>16-a};Ia.prototype.eatBits=function(a){if(0>(this.inputBits-=a))this.inputBits=0};Zg=Ia;var pe,nd=function(a,b,c){this.str=a;this.dict=a.dict;this.bitsCached=this.cachedData=0;a={earlyChange:c,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(4096),dictionaryLengths:new Uint16Array(4096),dictionaryPrevCodes:new Uint16Array(4096),currentSequence:new Uint8Array(4096),
+        currentSequenceLength:0};for(c=0;256>c;++c)a.dictionaryValues[c]=c,a.dictionaryLengths[c]=1;this.lzwState=a;Z.call(this,b)};nd.prototype=Object.create(Z.prototype);nd.prototype.readBits=function(a){for(var b=this.bitsCached,c=this.cachedData;b<a;){var d=this.str.getByte();if(-1===d)return this.eof=!0,null;c=c<<8|d;b+=8}this.bitsCached=b-=a;this.cachedData=c;this.lastCode=null;return c>>>b&(1<<a)-1};nd.prototype.readBlock=function(){var a=1024,b,c,d,e=this.lzwState;if(e){var f=e.earlyChange,g=e.nextCode,
+        h=e.dictionaryValues,j=e.dictionaryLengths,l=e.dictionaryPrevCodes,k=e.codeLength,m=e.prevCode,n=e.currentSequence,p=e.currentSequenceLength,q=0,s=this.bufferLength,v=this.ensureBuffer(this.bufferLength+a);for(b=0;512>b;b++){var t=this.readBits(k),r=0<p;if(256>t)n[0]=t,p=1;else if(258<=t)if(t<g){p=j[t];c=p-1;for(d=t;0<=c;c--)n[c]=h[d],d=l[d]}else n[p++]=n[0];else if(256==t){k=9;g=258;p=0;continue}else{this.eof=!0;delete this.lzwState;break}r&&(l[g]=m,j[g]=j[m]+1,h[g]=n[0],g++,k=g+f&g+f-1?k:Math.min(Math.log(g+
+            f)/0.6931471805599453+1,12)|0);m=t;q+=p;if(a<q){do a+=512;while(a<q);v=this.ensureBuffer(this.bufferLength+a)}for(c=0;c<p;c++)v[s++]=n[c]}e.nextCode=g;e.codeLength=k;e.prevCode=m;e.currentSequenceLength=p;this.bufferLength=s}};pe=nd;var Nd,qh=function(){wa.call(this,new Uint8Array(0))};qh.prototype=wa.prototype;Nd=qh;var Ii=PDFJS.WorkerMessageHandler={setup:function(a){function b(a){var b=new da,f=function(){var a=c.ensureDoc("numPages"),d=c.ensureDoc("fingerprint"),f=c.ensureCatalog("documentOutline"),
+        k=c.ensureDoc("documentInfo"),m=c.ensureCatalog("metadata"),n=c.ensureXRef("encrypt"),p=c.ensureCatalog("javaScript");Promise.all([a,d,f,k,m,n,p]).then(function(a){b.resolve({numPages:a[0],fingerprint:a[1],outline:a[2],info:a[3],metadata:a[4],encrypted:!!a[5],javaScript:a[6]})},g)},g=function(a){b.reject(a)};c.ensureDoc("checkHeader",[]).then(function(){c.ensureDoc("parseStartXRef",[]).then(function(){c.ensureDoc("parse",[a]).then(f,g)},g)},g);return b}var c;a.on("test",function(b){b instanceof Uint8Array?
+        (b=255===b[0],a.postMessageTransfers=b,"response"in new XMLHttpRequest?a.send("test",{supportTypedArray:!0,supportTransfers:b}):a.send("test",!1)):a.send("test",!1)});a.on("GetDocRequest",function(d){var e=function(b){a.send("GetDoc",{pdfInfo:b})},f=function(b){b instanceof Nb?b.code===Gc.NEED_PASSWORD?a.send("NeedPassword",{exception:b}):b.code===Gc.INCORRECT_PASSWORD&&a.send("IncorrectPassword",{exception:b}):b instanceof vc?a.send("InvalidPDF",{exception:b}):b instanceof Yb?a.send("MissingPDF",
+        {exception:b}):a.send("UnknownError",{exception:new Hc(b.message,b.toString())})};PDFJS.maxImageSize=void 0===d.maxImageSize?-1:d.maxImageSize;PDFJS.disableFontFace=d.disableFontFace;PDFJS.disableCreateObjectURL=d.disableCreateObjectURL;PDFJS.verbosity=d.verbosity;PDFJS.cMapUrl=void 0===d.cMapUrl?null:d.cMapUrl;PDFJS.cMapPacked=!0===d.cMapPacked;var g=new da,h=d.source,j=d.disableRange;if(h.data)try{c=new Xa(h.data,h.password),g.resolve()}catch(l){g.reject(l)}else if(h.chunkedViewerLoading)try{c=
+        new Ya(h,a),g.resolve()}catch(k){g.reject(k)}else var m=new Jd(h.url,{httpHeaders:h.httpHeaders,withCredentials:h.withCredentials}),n=m.requestFull({onHeadersReceived:function(){if(!j){var b=m.getRequestXhr(n);if("bytes"===b.getResponseHeader("Accept-Ranges")&&"identity"===(b.getResponseHeader("Content-Encoding")||"identity"))if(b=b.getResponseHeader("Content-Length"),b=parseInt(b,10),S(b)&&(h.length=b,!(131072>=b))){m.abortRequest(n);try{c=new Ya(h,a),g.resolve(c)}catch(d){g.reject(d)}}}},onDone:function(a){try{c=
+        new Xa(a.chunk,h.password),g.resolve()}catch(b){g.reject(b)}},onError:function(b){404==b?(b=new Yb('Missing PDF "'+h.url+'".'),a.send("MissingPDF",{exception:b})):a.send("DocError","Unexpected server response ("+b+') while retrieving PDF "'+h.url+'".')},onProgress:function(b){a.send("DocProgress",{loaded:b.loaded,total:b.lengthComputable?b.total:h.length})}});g.then(function(){c.onLoadedStream().then(function(b){a.send("DataLoaded",{length:b.bytes.byteLength})})}).then(function q(){b(!1).then(e,function(a){a instanceof
+    Ob?(c.requestLoadedStream(),c.onLoadedStream().then(function(){b(!0).then(e,f)})):(a instanceof Nb&&(c.passwordChangedPromise=new da,c.passwordChangedPromise.then(q)),f(a))},f)},f)});a.on("GetPageRequest",function(b){c.getPage(b.pageIndex).then(function(e){var f=c.ensure(e,"rotate"),g=c.ensure(e,"ref");e=c.ensure(e,"view");Promise.all([f,g,e]).then(function(c){a.send("GetPage",{pageInfo:{pageIndex:b.pageIndex,rotate:c[0],ref:c[1],view:c[2]}})})})});a.on("GetPageIndex",function(a,b){var f=new tc(a.ref.num,
+        a.ref.gen);c.pdfDocument.catalog.getPageIndex(f).then(function(a){b.resolve(a)},b.reject)});a.on("GetDestinations",function(a,b){c.ensureCatalog("destinations").then(function(a){b.resolve(a)})});a.on("GetAttachments",function(a,b){c.ensureCatalog("attachments").then(function(a){b.resolve(a)},b.reject)});a.on("GetData",function(a,b){c.requestLoadedStream();c.onLoadedStream().then(function(a){b.resolve(a.bytes)})});a.on("UpdatePassword",function(a){c.updatePassword(a)});a.on("GetAnnotationsRequest",
+        function(b){c.getPage(b.pageIndex).then(function(e){c.ensure(e,"getAnnotationsData",[]).then(function(c){a.send("GetAnnotations",{pageIndex:b.pageIndex,annotations:c})})})});a.on("RenderPageRequest",function(b){c.getPage(b.pageIndex).then(function(c){var f=b.pageIndex+1,g=Date.now();c.getOperatorList(a,b.intent).then(function(a){R("page="+f+" - getOperatorList: time="+(Date.now()-g)+"ms, len="+a.fnArray.length)},function(c){a.send("PageError",{pageNum:f,error:"string"===typeof c?{message:c,stack:"worker.js: while trying to getPage() and getOperatorList()"}:
+        "object"===typeof c?{message:c.message||c.toString(),stack:c.stack||"worker.js: while trying to getPage() and getOperatorList()"}:{message:"Unknown exception type: "+typeof c,stack:"worker.js: while trying to getPage() and getOperatorList()"},intent:b.intent})})})},this);a.on("GetTextContent",function(a,b){c.getPage(a.pageIndex).then(function(c){var g=a.pageIndex+1,h=Date.now();c.extractTextContent().then(function(a){b.resolve(a);R("text indexing: page="+g+" - time="+(Date.now()-h)+"ms")},function(a){b.reject(a)})})});
+        a.on("Cleanup",function(a,b){c.cleanup();b.resolve(!0)});a.on("Terminate",function(a,b){c.terminate();b.resolve()})}},rh={},Ji={log:function(){var a=Array.prototype.slice.call(arguments);qa.postMessage({action:"console_log",data:a})},error:function(){var a=Array.prototype.slice.call(arguments);qa.postMessage({action:"console_error",data:a});throw"pdf.js execution error";},time:function(a){rh[a]=Date.now()},timeEnd:function(a){var b=rh[a];b||u("Unknown timer name "+a);this.log("Timer:",a,Date.now()-
+        b)}};if("undefined"===typeof window){"console"in qa||(qa.console=Ji);PDFJS.UnsupportedManager.listen(function(a){qa.postMessage({action:"_unsupported_feature",data:a})});var Ki=new Be("worker_processor",this);Ii.setup(Ki)}var we=function(a,b,c){this.data=a;this.bp=b;this.dataEnd=c;this.chigh=a[b];this.clow=0;this.byteIn();this.chigh=this.chigh<<7&65535|this.clow>>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768},Li=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},
+        {qe:6145,nmps:3,nlps:9,switchFlag:0},{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},
+        {qe:21505,nmps:16,nlps:14,switchFlag:0},{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},
+        {qe:4609,nmps:29,nlps:26,switchFlag:0},{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,
+            nmps:42,nlps:39,switchFlag:0},{qe:21,nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];we.prototype={byteIn:function(){var a=this.data,b=this.bp;255==a[b]?143<a[b+1]?(this.clow+=65280,this.ct=8):(b++,this.clow+=a[b]<<9,this.ct=7,this.bp=b):(b++,this.clow+=b<this.dataEnd?a[b]<<8:65280,this.ct=8,this.bp=b);65535<this.clow&&(this.chigh+=this.clow>>16,this.clow&=65535)},readBit:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               b){var c=a[b]>>1,d=a[b]&1,c=Li[c],e=c.qe,f=this.a-e;if(this.chigh<e)f<e?(f=e,e=d,c=c.nmps):(f=e,e=1^d,1===c.switchFlag&&(d=e),c=c.nlps);else{this.chigh-=e;if(0!==(f&32768))return this.a=f,d;f<e?(e=1^d,1===c.switchFlag&&(d=e),c=c.nlps):(e=d,c=c.nmps)}do 0===this.ct&&this.byteIn(),f<<=1,this.chigh=this.chigh<<1&65535|this.clow>>15&1,this.clow=this.clow<<1&65535,this.ct--;while(0===(f&32768));this.a=f;a[b]=c<<1|d;return e}};var me,sh=function(){this.failOnCorruptedImage=!1},od=function(a,b,c){a=c.xcb_;
+        c=c.ycb_;var d=1<<a,e=1<<c,f=b.tbx0>>a,g=b.tbx1+d-1>>a,h=b.tby1+e-1>>c,j=b.resolution.precinctParameters,l=[],k=[],m,n,p,q;for(n=b.tby0>>c;n<h;n++)for(m=f;m<g;m++){p={cbx:m,cby:n,tbx0:d*m,tby0:e*n,tbx1:d*(m+1),tby1:e*(n+1)};q=Math.floor((p.tby0-j.precinctYOffset)/j.precinctHeight)+Math.floor((p.tbx0-j.precinctXOffset)/j.precinctWidth)*j.numprecinctswide;p.tbx0_=Math.max(b.tbx0,p.tbx0);p.tby0_=Math.max(b.tby0,p.tby0);p.tbx1_=Math.min(b.tbx1,p.tbx1);p.tby1_=Math.min(b.tby1,p.tby1);p.precinctNumber=
+            q;p.subbandType=b.type;p.Lblock=3;l.push(p);var s=k[q];void 0!==s?(m<s.cbxMin?s.cbxMin=m:m>s.cbxMax&&(s.cbxMax=m),n<s.cbyMin?s.cbxMin=n:n>s.cbyMax&&(s.cbyMax=n)):k[q]=s={cbxMin:m,cbyMin:n,cbxMax:m,cbyMax:n};p.precinct=s}b.codeblockParameters={codeblockWidth:a,codeblockHeight:c,numcodeblockwide:g-f+1,numcodeblockhigh:h-h+1};b.codeblocks=l;b.precincts=k},th=function(a,b,c){var d=[];a=a.subbands;for(var e=0,f=a.length;e<f;e++)for(var g=a[e].codeblocks,h=0,j=g.length;h<j;h++){var l=g[h];l.precinctNumber==
+    b&&d.push(l)}return{layerNumber:c,codeblocks:d}},Mi=function(a){var b=a.tiles[a.currentTile.index],c=b.codingStyleDefaultParameters.layersCount,d=a.SIZ.Csiz,e=0;for(a=0;a<d;a++)e=Math.max(e,b.components[a].codingStyleParameters.decompositionLevelsCount);var f=0,g=0,h=0,j=0;this.nextPacket=function(){for(;f<c;f++){for(;g<=e;g++){for(;h<d;h++){var a=b.components[h];if(!(g>a.codingStyleParameters.decompositionLevelsCount)){for(var a=a.resolutions[g],k=a.precinctParameters.numprecincts;j<k;)return a=
+        th(a,j,f),j++,a;j=0}}h=0}g=0}throw"Out of packets";}},Ni=function(a){var b=a.tiles[a.currentTile.index],c=b.codingStyleDefaultParameters.layersCount,d=a.SIZ.Csiz,e=0;for(a=0;a<d;a++)e=Math.max(e,b.components[a].codingStyleParameters.decompositionLevelsCount);var f=0,g=0,h=0,j=0;this.nextPacket=function(){for(;f<=e;f++){for(;g<c;g++){for(;h<d;h++){var a=b.components[h];if(!(f>a.codingStyleParameters.decompositionLevelsCount)){for(var a=a.resolutions[f],k=a.precinctParameters.numprecincts;j<k;)return a=
+        th(a,j,g),j++,a;j=0}}h=0}g=0}throw"Out of packets";}},Oi=function(a,b,c,d){function e(a){for(;j<a;){var d=b[c+g];g++;l?(h=h<<7|d,j+=7,l=!1):(h=h<<8|d,j+=8);255==d&&(l=!0)}j-=a;return h>>>j&(1<<a)-1}function f(){if(0===e(1))return 1;if(0===e(1))return 2;var a=e(2);if(3>a)return a+3;a=e(5);if(31>a)return a+6;a=e(7);return a+37}var g=0,h,j=0,l=!1;for(a=a.tiles[a.currentTile.index].packetsIterator;g<d;){var k=a.nextPacket();if(e(1)){for(var m=k.layerNumber,n=[],p,q=0,s=k.codeblocks.length;q<s;q++){p=
+        k.codeblocks[q];var v=p.precinct,t=p.cbx-v.cbxMin,r=p.cby-v.cbyMin,u=!1,N=!1,ea;if("included"in p)u=!!e(1);else{var v=p.precinct,B,F;"inclusionTree"in v?B=v.inclusionTree:(ea=v.cbxMax-v.cbxMin+1,F=v.cbyMax-v.cbyMin+1,B=new uh(ea,F,m),F=new vh(ea,F),v.inclusionTree=B,v.zeroBitPlanesTree=F);if(B.reset(t,r,m))for(;;)if(e(1)){if(ea=!B.nextLevel()){u=N=p.included=!0;break}}else{B.incrementValue(m);break}}if(u){if(N){F=v.zeroBitPlanesTree;for(F.reset(t,r);;)if(e(1)){if(ea=!F.nextLevel())break}else F.incrementValue();
+        p.zeroBitPlanes=F.value}for(v=f();e(1);)p.Lblock++;t=sc(v);t=e((v<1<<t?t-1:t)+p.Lblock);n.push({codeblock:p,codingpasses:v,dataLength:t})}}j=0;l&&(g++,l=!1);for(;0<n.length;)k=n.shift(),p=k.codeblock,"data"in p||(p.data=[]),p.data.push({data:b,start:c+g,end:c+g+k.dataLength,codingpasses:k.codingpasses}),g+=k.dataLength}else j=0,l&&(g++,l=!1)}return g},Pi={LL:0,LH:1,HL:1,HH:2};sh.prototype={load:function(a){var b=new XMLHttpRequest;b.open("GET",a,!0);b.responseType="arraybuffer";b.onload=function(){var a=
+        new Uint8Array(b.response||b.mozResponseArrayBuffer);this.parse(a);if(this.onload)this.onload()}.bind(this);b.send(null)},parse:function(a){if(65359===Fa(a,0))this.parseCodestream(a,0,a.length);else for(var b=0,c=a.length;b<c;){var d=8,e=ga(a,b),f=ga(a,b+4),b=b+d;1===e&&(e=4294967296*ga(a,b)+ga(a,b+4),b+=8,d+=8);0===e&&(e=c-b+d);e<d&&u("JPX error: Invalid box field size");d=e-d;e=!0;switch(f){case 1785737832:e=!1;break;case 1785737827:this.parseCodestream(a,b,b+d)}e&&(b+=d)}},parseImageProperties:function(a){try{for(var b=
+        a.getByte();0<=b;){var c=b,b=a.getByte();if(65361==(c<<8|b)){a.skip(4);var d=a.getInt32()>>>0,e=a.getInt32()>>>0,f=a.getInt32()>>>0,g=a.getInt32()>>>0;a.skip(16);var h=a.getUint16();this.width=d-f;this.height=e-g;this.componentsCount=h;this.bitsPerComponent=8;return}}throw"No size marker found in JPX stream";}catch(j){this.failOnCorruptedImage?u("JPX error: "+j):L("JPX error: "+j+". Trying to recover")}},parseCodestream:function(a,b,c){var d={};try{for(var e=b;e+1<c;){var f=Fa(a,e),e=e+2,g=0,h,j,
+        l,k,m,n;switch(f){case 65359:d.mainHeader=!0;break;case 65497:break;case 65361:var g=Fa(a,e),p={};p.Xsiz=ga(a,e+4);p.Ysiz=ga(a,e+8);p.XOsiz=ga(a,e+12);p.YOsiz=ga(a,e+16);p.XTsiz=ga(a,e+20);p.YTsiz=ga(a,e+24);p.XTOsiz=ga(a,e+28);p.YTOsiz=ga(a,e+32);var q=Fa(a,e+36);p.Csiz=q;var s=[];h=e+38;for(var v=0;v<q;v++){var t={precision:(a[h]&127)+1,isSigned:!!(a[h]&128),XRsiz:a[h+1],YRsiz:a[h+1]},r=t,aa=p;r.x0=Math.ceil(aa.XOsiz/r.XRsiz);r.x1=Math.ceil(aa.Xsiz/r.XRsiz);r.y0=Math.ceil(aa.YOsiz/r.YRsiz);r.y1=
+        Math.ceil(aa.Ysiz/r.YRsiz);r.width=r.x1-r.x0;r.height=r.y1-r.y0;s.push(t)}d.SIZ=p;d.components=s;for(var N=d,ea=s,B=N.SIZ,F=void 0,w=[],G=Math.ceil((B.Xsiz-B.XTOsiz)/B.XTsiz),I=Math.ceil((B.Ysiz-B.YTOsiz)/B.YTsiz),z=0;z<I;z++)for(var E=0;E<G;E++)F={},F.tx0=Math.max(B.XTOsiz+E*B.XTsiz,B.XOsiz),F.ty0=Math.max(B.YTOsiz+z*B.YTsiz,B.YOsiz),F.tx1=Math.min(B.XTOsiz+(E+1)*B.XTsiz,B.Xsiz),F.ty1=Math.min(B.YTOsiz+(z+1)*B.YTsiz,B.Ysiz),F.width=F.tx1-F.tx0,F.height=F.ty1-F.ty0,F.components=[],w.push(F);N.tiles=
+        w;for(var D=0,S=B.Csiz;D<S;D++)for(var A=ea[D],M=0,x=w.length;M<x;M++){var Q={},F=w[M];Q.tcx0=Math.ceil(F.tx0/A.XRsiz);Q.tcy0=Math.ceil(F.ty0/A.YRsiz);Q.tcx1=Math.ceil(F.tx1/A.XRsiz);Q.tcy1=Math.ceil(F.ty1/A.YRsiz);Q.width=Q.tcx1-Q.tcx0;Q.height=Q.tcy1-Q.tcy0;F.components[D]=Q}d.QCC=[];d.COC=[];break;case 65372:var g=Fa(a,e),mb={};h=e+2;j=a[h++];switch(j&31){case 0:k=8;m=!0;break;case 1:k=16;m=!1;break;case 2:k=16;m=!0;break;default:throw"Invalid SQcd value "+j;}mb.noQuantization=8==k;mb.scalarExpounded=
+        m;mb.guardBits=j>>5;for(l=[];h<g+e;){var Ha={};8==k?(Ha.epsilon=a[h++]>>3,Ha.mu=0):(Ha.epsilon=a[h]>>3,Ha.mu=(a[h]&7)<<8|a[h+1],h+=2);l.push(Ha)}mb.SPqcds=l;d.mainHeader?d.QCD=mb:(d.currentTile.QCD=mb,d.currentTile.QCC=[]);break;case 65373:var g=Fa(a,e),gb={};h=e+2;var O;257>d.SIZ.Csiz?O=a[h++]:(O=Fa(a,h),h+=2);j=a[h++];switch(j&31){case 0:k=8;m=!0;break;case 1:k=16;m=!1;break;case 2:k=16;m=!0;break;default:throw"Invalid SQcd value "+j;}gb.noQuantization=8==k;gb.scalarExpounded=m;gb.guardBits=j>>
+        5;for(l=[];h<g+e;)Ha={},8==k?(Ha.epsilon=a[h++]>>3,Ha.mu=0):(Ha.epsilon=a[h]>>3,Ha.mu=(a[h]&7)<<8|a[h+1],h+=2),l.push(Ha);gb.SPqcds=l;d.mainHeader?d.QCC[O]=gb:d.currentTile.QCC[O]=gb;break;case 65362:var g=Fa(a,e),P={};h=e+2;var R=a[h++];P.entropyCoderWithCustomPrecincts=!!(R&1);P.sopMarkerUsed=!!(R&2);P.ephMarkerUsed=!!(R&4);P.progressionOrder=a[h++];P.layersCount=Fa(a,h);h+=2;P.multipleComponentTransform=a[h++];P.decompositionLevelsCount=a[h++];P.xcb=(a[h++]&15)+2;P.ycb=(a[h++]&15)+2;var K=a[h++];
+        P.selectiveArithmeticCodingBypass=!!(K&1);P.resetContextProbabilities=!!(K&2);P.terminationOnEachCodingPass=!!(K&4);P.verticalyStripe=!!(K&8);P.predictableTermination=!!(K&16);P.segmentationSymbolUsed=!!(K&32);P.reversibleTransformation=a[h++];if(P.entropyCoderWithCustomPrecincts){for(var U=[];h<g+e;){var Y=a[h++];U.push({PPx:Y&15,PPy:Y>>4})}P.precinctsSizes=U}if(P.sopMarkerUsed||P.ephMarkerUsed||P.selectiveArithmeticCodingBypass||P.resetContextProbabilities||P.terminationOnEachCodingPass||P.verticalyStripe||
+            P.predictableTermination)throw"Unsupported COD options: "+qa.JSON.stringify(P);d.mainHeader?d.COD=P:(d.currentTile.COD=P,d.currentTile.COC=[]);break;case 65424:g=Fa(a,e);n={};n.index=Fa(a,e+2);n.length=ga(a,e+4);n.dataEnd=n.length+e-2;n.partIndex=a[e+8];n.partsCount=a[e+9];d.mainHeader=!1;0===n.partIndex&&(n.COD=d.COD,n.COC=d.COC.slice(0),n.QCD=d.QCD,n.QCC=d.QCC.slice(0));d.currentTile=n;break;case 65427:n=d.currentTile;if(0===n.partIndex){for(var T=d,ba=T.SIZ.Csiz,C=T.tiles[n.index],fa=0;fa<ba;fa++){var Z=
+        C.components[fa];Z.quantizationParameters=fa in T.currentTile.QCC?T.currentTile.QCC[fa]:T.currentTile.QCD;Z.codingStyleParameters=fa in T.currentTile.COC?T.currentTile.COC[fa]:T.currentTile.COD}C.codingStyleDefaultParameters=T.currentTile.COD;for(var V=d,$=V.tiles[V.currentTile.index],J=V.SIZ.Csiz,da=0;da<J;da++){for(var y=$.components[da],la=y.codingStyleParameters.decompositionLevelsCount,oa=[],ha=[],ka=0;ka<=la;ka++){var ma,pa=ka,na=y.codingStyleParameters,W={};na.entropyCoderWithCustomPrecincts?
+        (W.PPx=na.precinctsSizes[pa].PPx,W.PPy=na.precinctsSizes[pa].PPy):(W.PPx=15,W.PPy=15);W.xcb_=0<pa?Math.min(na.xcb,W.PPx-1):Math.min(na.xcb,W.PPx);W.ycb_=0<pa?Math.min(na.ycb,W.PPy-1):Math.min(na.ycb,W.PPy);ma=W;var ca={},ia=1<<la-ka;ca.trx0=Math.ceil(y.tcx0/ia);ca.try0=Math.ceil(y.tcy0/ia);ca.trx1=Math.ceil(y.tcx1/ia);ca.try1=Math.ceil(y.tcy1/ia);var ua=ca,ra=1<<ma.PPx,sa=1<<ma.PPy,wa=ua.trx1>ua.trx0?Math.ceil(ua.trx1/ra)-Math.floor(ua.trx0/ra):0,ya=ua.try1>ua.try0?Math.ceil(ua.try1/sa)-Math.floor(ua.try0/
+        sa):0;ua.precinctParameters={precinctXOffset:Math.floor(ua.trx0/ra)*ra,precinctYOffset:Math.floor(ua.try0/sa)*sa,precinctWidth:ra,precinctHeight:sa,numprecinctswide:wa,numprecinctshigh:ya,numprecincts:wa*ya};oa.push(ca);var H;if(0===ka)H={type:"LL"},H.tbx0=Math.ceil(y.tcx0/ia),H.tby0=Math.ceil(y.tcy0/ia),H.tbx1=Math.ceil(y.tcx1/ia),H.tby1=Math.ceil(y.tcy1/ia),H.resolution=ca,od(V,H,ma),ha.push(H),ca.subbands=[H];else{var X=1<<la-ka+1,ta=[];H={type:"HL"};H.tbx0=Math.ceil(y.tcx0/X-0.5);H.tby0=Math.ceil(y.tcy0/
+        X);H.tbx1=Math.ceil(y.tcx1/X-0.5);H.tby1=Math.ceil(y.tcy1/X);H.resolution=ca;od(V,H,ma);ha.push(H);ta.push(H);H={type:"LH"};H.tbx0=Math.ceil(y.tcx0/X);H.tby0=Math.ceil(y.tcy0/X-0.5);H.tbx1=Math.ceil(y.tcx1/X);H.tby1=Math.ceil(y.tcy1/X-0.5);H.resolution=ca;od(V,H,ma);ha.push(H);ta.push(H);H={type:"HH"};H.tbx0=Math.ceil(y.tcx0/X-0.5);H.tby0=Math.ceil(y.tcy0/X-0.5);H.tbx1=Math.ceil(y.tcx1/X-0.5);H.tby1=Math.ceil(y.tcy1/X-0.5);H.resolution=ca;od(V,H,ma);ha.push(H);ta.push(H);ca.subbands=ta}}y.resolutions=
+        oa;y.subbands=ha}var Aa=$.codingStyleDefaultParameters.progressionOrder;switch(Aa){case 0:$.packetsIterator=new Mi(V);break;case 1:$.packetsIterator=new Ni(V);break;default:throw"Unsupported progression order "+Aa;}}g=n.dataEnd-e;Oi(d,a,e,g);break;case 65380:g=Fa(a,e);break;case 65363:throw"Codestream code 0xFF53 (COC) is not implemented";default:throw"Unknown codestream code: "+f.toString(16);}e+=g}}catch(Ea){this.failOnCorruptedImage?u("JPX error: "+Ea):L("JPX error: "+Ea+". Trying to recover")}for(var Ga=
+        d.components,xa=d.SIZ.Csiz,Ia=[],La=0,Xa=d.tiles.length;La<Xa;La++){var Oa=d.tiles[La],Za=[],Ja;for(Ja=0;Ja<xa;Ja++){for(var cb=Za,za=Ja,Ba=Oa.components[Ja],Pa=Ba.codingStyleParameters,Qa=Ba.quantizationParameters,db=Pa.decompositionLevelsCount,Na=Qa.SPqcds,eb=Qa.scalarExpounded,fb=Qa.guardBits,va=Pa.segmentationSymbolUsed,Ra=d.components[Ja].precision,Wa=Pa.reversibleTransformation,Ca=Wa?new wh:new xh,nb=[],Ya=0,ja=0;ja<=db;ja++){for(var Ma=Ba.resolutions[ja],Sa=Ma.trx1-Ma.trx0,wb=Ma.try1-Ma.try0,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                    jb=new Float32Array(Sa*wb),hb=0,sb=Ma.subbands.length;hb<sb;hb++){var $a,Gb;eb?($a=Na[Ya].mu,Gb=Na[Ya].epsilon,Ya++):($a=Na[0].mu,Gb=Na[0].epsilon+(0<ja?1-ja:0));for(var kb=Ma.subbands[hb],Ab=Pi[kb.type],Bb=Wa?1:Math.pow(2,Ra+Ab-Gb)*(1+$a/2048),Cb=jb,vb=Sa,Ua=kb,Ka=Bb,Rb=fb+Gb-1,xb=Wa,Ib=va,Da=Ua.tbx0,Mb=Ua.tby0,lb=Ua.tbx1-Ua.tbx0,Db=Ua.codeblocks,Nb="H"===Ua.type.charAt(0)?1:0,Ob="H"===Ua.type.charAt(1)?vb:0,ub=0,Pb=Db.length;ub<Pb;++ub){var Kb=Db[ub],ob=Kb.tbx1_-Kb.tbx0_,yb=Kb.tby1_-Kb.tby0_;if(!(0===
+        ob||0===yb)&&"data"in Kb){var pb,Vb;pb=new yh(ob,yb,Kb.subbandType,Kb.zeroBitPlanes,Rb);Vb=2;var tb=Kb.data,cc=0,Eb=0,Va,Hb,Lb;Va=0;for(Hb=tb.length;Va<Hb;Va++)Lb=tb[Va],cc+=Lb.end-Lb.start,Eb+=Lb.codingpasses;var fc=new Uint8Array(cc),dc=0;Va=0;for(Hb=tb.length;Va<Hb;Va++){Lb=tb[Va];var gc=Lb.data.subarray(Lb.start,Lb.end);fc.set(gc,dc);dc+=gc.length}var oc=new we(fc,0,cc);pb.setDecoder(oc);for(Va=0;Va<Eb;Va++){switch(Vb){case 0:pb.runSignificancePropogationPass();break;case 1:pb.runMagnitudeRefinementPass();
+        break;case 2:pb.runCleanupPass(),Ib&&pb.checkSegmentationSymbol()}Vb=(Vb+1)%3}var Wb=Kb.tbx0_-Da+(Kb.tby0_-Mb)*lb,qc=pb.coefficentsSign,sc=pb.coefficentsMagnitude,tc=pb.bitsDecoded,vc=xb?0:0.5,zc,ib,Yb,dc=0,ec="LL"!==Ua.type;for(Va=0;Va<yb;Va++){var lc=2*(Wb/lb|0)*(vb-lb)+Nb+Ob;for(zc=0;zc<ob;zc++)ib=sc[dc],0!==ib&&(ib=(ib+vc)*Ka,0!==qc[dc]&&(ib=-ib),Yb=tc[dc],Cb[ec?lc+(Wb<<1):Wb]=xb&&Yb>=Rb?ib:ib*(1<<Rb-Yb)),Wb++,dc++;Wb+=lb-ob}}}}nb.push({width:Sa,height:wb,items:jb})}var Zb=Ca.calculate(nb,Ba.tcx0,
+        Ba.tcy0);cb[za]={left:Ba.tcx0,top:Ba.tcy0,width:Zb.width,height:Zb.height,items:Zb.items}}var mc=Za[0],qb=new Uint8Array(mc.items.length*xa),yc={left:mc.left,top:mc.top,width:mc.width,height:mc.height,items:qb},ab,rb,bb,zb,Jb=0,Ta,Bc,Cc,Dc,Ec,ic,Ub,jc,kc,Tb;if(Oa.codingStyleDefaultParameters.multipleComponentTransform){var bc=4===xa,Xb=Za[0].items,nc=Za[1].items,pc=Za[2].items,rc=bc?Za[3].items:null;ab=Ga[0].precision-8;rb=(128<<ab)+0.5;bb=127.5*(1<<ab);zb=-bb;if(Oa.components[0].codingStyleParameters.reversibleTransformation){Ta=
+        0;for(Bc=Xb.length;Ta<Bc;++Ta)Cc=Xb[Ta],Dc=nc[Ta],Ec=pc[Ta],Ub=Cc-(Ec+Dc>>2),ic=Ub+Ec,jc=Ub+Dc,qb[Jb++]=ic<=zb?0:ic>=bb?255:ic+rb>>ab,qb[Jb++]=Ub<=zb?0:Ub>=bb?255:Ub+rb>>ab,qb[Jb++]=jc<=zb?0:jc>=bb?255:jc+rb>>ab,bc&&(kc=rc[Ta],qb[Jb++]=kc<=zb?0:kc>=bb?255:kc+rb>>ab)}else{Ta=0;for(Bc=Xb.length;Ta<Bc;++Ta)Cc=Xb[Ta],Dc=nc[Ta],Ec=pc[Ta],ic=Cc+1.402*Ec,Ub=Cc-0.34413*Dc-0.71414*Ec,jc=Cc+1.772*Dc,qb[Jb++]=ic<=zb?0:ic>=bb?255:ic+rb>>ab,qb[Jb++]=Ub<=zb?0:Ub>=bb?255:Ub+rb>>ab,qb[Jb++]=jc<=zb?0:jc>=bb?255:jc+
+    rb>>ab,bc&&(kc=rc[Ta],qb[Jb++]=kc<=zb?0:kc>=bb?255:kc+rb>>ab)}}else for(Ja=0;Ja<xa;Ja++){var uc=Za[Ja].items;ab=Ga[Ja].precision-8;rb=(128<<ab)+0.5;bb=127.5*(1<<ab);zb=-bb;Jb=Ja;Ta=0;for(Bc=uc.length;Ta<Bc;Ta++)Tb=uc[Ta],qb[Jb]=Tb<=zb?0:Tb>=bb?255:Tb+rb>>ab,Jb+=xa}Ia.push(yc)}this.tiles=Ia;this.width=d.SIZ.Xsiz-d.SIZ.XOsiz;this.height=d.SIZ.Ysiz-d.SIZ.YOsiz;this.componentsCount=d.SIZ.Csiz}};var vh,zh=function(a,b){var c=sc(Math.max(a,b))+1;this.levels=[];for(var d=0;d<c;d++)this.levels.push({width:a,
+        height:b,items:[]}),a=Math.ceil(a/2),b=Math.ceil(b/2)};zh.prototype={reset:function(a,b){for(var c=0,d=0,e;c<this.levels.length;){e=this.levels[c];var f=a+b*e.width;if(f in e.items){d=e.items[f];break}e.index=f;a>>=1;b>>=1;c++}c--;e=this.levels[c];e.items[e.index]=d;this.currentLevel=c;delete this.value},incrementValue:function(){var a=this.levels[this.currentLevel];a.items[a.index]++},nextLevel:function(){var a=this.currentLevel,b=this.levels[a],c=b.items[b.index];a--;if(0>a)return this.value=c,
+        !1;this.currentLevel=a;b=this.levels[a];b.items[b.index]=c;return!0}};vh=zh;var uh,Ah=function(a,b,c){var d=sc(Math.max(a,b))+1;this.levels=[];for(var e=0;e<d;e++){for(var f=new Uint8Array(a*b),g=0,h=f.length;g<h;g++)f[g]=c;this.levels.push({width:a,height:b,items:f});a=Math.ceil(a/2);b=Math.ceil(b/2)}};Ah.prototype={reset:function(a,b,c){for(var d=0;d<this.levels.length;){var e=this.levels[d],f=a+b*e.width;e.index=f;e=e.items[f];if(255==e)break;if(e>c)return this.currentLevel=d,this.propagateValues(),
+        !1;a>>=1;b>>=1;d++}this.currentLevel=d-1;return!0},incrementValue:function(a){var b=this.levels[this.currentLevel];b.items[b.index]=a+1;this.propagateValues()},propagateValues:function(){for(var a=this.currentLevel,b=this.levels[a],c=b.items[b.index];0<=--a;)b=this.levels[a],b.items[b.index]=c},nextLevel:function(){var a=this.currentLevel,b=this.levels[a],c=b.items[b.index];b.items[b.index]=255;a--;if(0>a)return!1;this.currentLevel=a;b=this.levels[a];b.items[b.index]=c;return!0}};uh=Ah;var yh,Bh=
+        function(a,b,c,d,e){this.width=a;this.height=b;this.contextLabelTable="HH"==c?Qi:"HL"==c?Ri:Si;a*=b;this.neighborsSignificance=new Uint8Array(a);this.coefficentsSign=new Uint8Array(a);this.coefficentsMagnitude=14<e?new Uint32Array(a):6<e?new Uint16Array(a):new Uint8Array(a);this.processingFlags=new Uint8Array(a);e=new Uint8Array(a);if(0!==d)for(b=0;b<a;b++)e[b]=d;this.bitsDecoded=e;this.reset()},Si=new Uint8Array([0,5,8,0,3,7,8,0,4,7,8,0,0,0,0,0,1,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,
+        8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8]),Ri=new Uint8Array([0,3,4,0,5,7,7,0,8,8,8,0,0,0,0,0,1,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8]),Qi=new Uint8Array([0,1,2,0,1,2,2,0,2,2,2,0,0,0,0,0,3,4,5,0,4,5,5,0,5,5,5,0,0,0,0,0,6,7,7,0,7,7,7,0,7,7,7,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8]);Bh.prototype={setDecoder:function(a){this.decoder=a},reset:function(){this.contexts=new Int8Array(19);
+        this.contexts[0]=8;this.contexts[17]=92;this.contexts[18]=6},setNeighborsSignificance:function(a,b,c){var d=this.neighborsSignificance,e=this.width,f=this.height,g=0<b;b=b+1<e;var h;0<a&&(h=c-e,g&&(d[h-1]+=16),b&&(d[h+1]+=16),d[h]+=4);a+1<f&&(h=c+e,g&&(d[h-1]+=16),b&&(d[h+1]+=16),d[h]+=4);g&&(d[c-1]+=1);b&&(d[c+1]+=1);d[c]|=128},runSignificancePropogationPass:function(){for(var a=this.decoder,b=this.width,c=this.height,d=this.coefficentsMagnitude,e=this.coefficentsSign,f=this.neighborsSignificance,
+                                                                                                                                                                                                                                                                                                                                                                                                     g=this.processingFlags,h=this.contexts,j=this.contextLabelTable,l=this.bitsDecoded,k=0;k<c;k+=4)for(var m=0;m<b;m++)for(var n=k*b+m,p=0;4>p;p++,n+=b){var q=k+p;if(q>=c)break;g[n]&=-2;if(!d[n]&&f[n]){if(a.readBit(h,j[f[n]])){var s=this.decodeSignBit(q,m,n);e[n]=s;d[n]=1;this.setNeighborsSignificance(q,m,n);g[n]|=2}l[n]++;g[n]|=1}}},decodeSignBit:function(a,b,c){var d=this.width,e=this.height,f=this.coefficentsMagnitude,g=this.coefficentsSign,h;h=0<b&&0!==f[c-1];b+1<d&&0!==f[c+1]?(b=g[c+1],h?(h=g[c-
+    1],b=1-b-h):b=1-b-b):h?(h=g[c-1],b=1-h-h):b=0;var j=3*b;h=0<a&&0!==f[c-d];a+1<e&&0!==f[c+d]?(b=g[c+d],h?(h=g[c-d],b=1-b-h+j):b=1-b-b+j):h?(h=g[c-d],b=1-h-h+j):b=j;return a=0<=b?this.decoder.readBit(this.contexts,9+b):this.decoder.readBit(this.contexts,9-b)^1},runMagnitudeRefinementPass:function(){for(var a=this.decoder,b=this.width,c=this.coefficentsMagnitude,d=this.neighborsSignificance,e=this.contexts,f=this.bitsDecoded,g=this.processingFlags,h=b*this.height,j=4*b,l=0,k;l<h;l=k){k=Math.min(h,l+
+        j);for(var m=0;m<b;m++)for(var n=l+m;n<k;n+=b)if(c[n]&&0===(g[n]&1)){var p=16;0!==(g[n]&2)&&(g[n]^=2,p=0===(d[n]&127)?15:14);p=a.readBit(e,p);c[n]=c[n]<<1|p;f[n]++;g[n]|=1}}},runCleanupPass:function(){for(var a=this.decoder,b=this.width,c=this.height,d=this.neighborsSignificance,e=this.coefficentsMagnitude,f=this.coefficentsSign,g=this.contexts,h=this.contextLabelTable,j=this.bitsDecoded,l=this.processingFlags,k=2*b,m=3*b,n,p=0;p<c;p=n){n=Math.min(p+4,c);for(var q=p*b,s=p+3<c,v=0;v<b;v++){var t=q+
+        v,r=0,u=t,N=p,ea;if(s&&0===l[t]&&0===l[t+b]&&0===l[t+k]&&0===l[t+m]&&0===d[t]&&0===d[t+b]&&0===d[t+k]&&0===d[t+m]){if(!a.readBit(g,18)){j[t]++;j[t+b]++;j[t+k]++;j[t+m]++;continue}r=a.readBit(g,17)<<1|a.readBit(g,17);0!==r&&(N=p+r,u+=r*b);ea=this.decodeSignBit(N,v,u);f[u]=ea;e[u]=1;this.setNeighborsSignificance(N,v,u);l[u]|=2;u=t;for(t=p;t<=N;t++,u+=b)j[u]++;r++}for(N=p+r;N<n;N++,u+=b)e[u]||0!==(l[u]&1)||(1===a.readBit(g,h[d[u]])&&(ea=this.decodeSignBit(N,v,u),f[u]=ea,e[u]=1,this.setNeighborsSignificance(N,
+        v,u),l[u]|=2),j[u]++)}}},checkSegmentationSymbol:function(){var a=this.decoder,b=this.contexts;if(10!=(a.readBit(b,17)<<3|a.readBit(b,17)<<2|a.readBit(b,17)<<1|a.readBit(b,17)))throw"Invalid segmentation symbol";}};yh=Bh;var nc=function(){};nc.prototype.calculate=function(a,b,c){for(var d=a[0],e=1,f=a.length;e<f;e++)d=this.iterate(d,a[e],b,c);return d};nc.prototype.extend=function(a,b,c){var d=b-1,e=b+1,f=b+c-2;b+=c;a[d--]=a[e++];a[b++]=a[f--];a[d--]=a[e++];a[b++]=a[f--];a[d--]=a[e++];a[b++]=a[f--];
+        a[d]=a[e];a[b]=a[f]};nc.prototype.iterate=function(a,b,c,d){var e=a.width,f=a.height,g=a.items,h=b.width,j=b.height;b=b.items;var l,k,m,n;for(l=m=0;l<f;l++){n=2*l*h;for(k=0;k<e;k++,m++,n+=2)b[n]=g[m]}a.items=null;a=new Float32Array(h+8);if(1===h){if(0!==(c&1))for(m=n=0;n<j;n++,m+=h)b[m]*=0.5}else for(m=n=0;n<j;n++,m+=h)a.set(b.subarray(m,m+h),4),this.extend(a,4,h),this.filter(a,4,h),b.set(a.subarray(4,4+h),m);c=16;e=[];for(l=0;l<c;l++)e.push(new Float32Array(j+8));l=0;a=4+j;if(1===j){if(0!==(d&1))for(d=
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      0;d<h;d++)b[d]*=0.5}else for(d=0;d<h;d++){if(0===l){c=Math.min(h-d,c);m=d;for(n=4;n<a;m+=h,n++)for(f=0;f<c;f++)e[f][n]=b[m+f];l=c}l--;m=e[l];this.extend(m,4,j);this.filter(m,4,j);if(0===l){m=d-c+1;for(n=4;n<a;m+=h,n++)for(f=0;f<c;f++)b[m+f]=e[f][n]}}return{width:h,height:j,items:b}};var xh,xe=function(){};xe.prototype=Object.create(nc.prototype);xe.prototype.filter=function(a,b,c){c>>=1;b|=0;var d,e,f,g;d=b-3;for(e=c+4;e--;d+=2)a[d]*=0.8128930661159609;d=b-2;f=0.443506852043971*a[d-1];for(e=c+3;e--;d+=
+        2)if(g=0.443506852043971*a[d+1],a[d]=1.230174104914001*a[d]-f-g,e--)d+=2,f=0.443506852043971*a[d+1],a[d]=1.230174104914001*a[d]-f-g;else break;d=b-1;f=0.882911075530934*a[d-1];for(e=c+2;e--;d+=2)if(g=0.882911075530934*a[d+1],a[d]-=f+g,e--)d+=2,f=0.882911075530934*a[d+1],a[d]-=f+g;else break;d=b;f=-0.052980118572961*a[d-1];for(e=c+1;e--;d+=2)if(g=-0.052980118572961*a[d+1],a[d]-=f+g,e--)d+=2,f=-0.052980118572961*a[d+1],a[d]-=f+g;else break;if(0!==c){d=b+1;f=-1.586134342059924*a[d-1];for(e=c;e--;d+=
+        2)if(g=-1.586134342059924*a[d+1],a[d]-=f+g,e--)d+=2,f=-1.586134342059924*a[d+1],a[d]-=f+g;else break}};xh=xe;var wh,ye=function(){};ye.prototype=Object.create(nc.prototype);ye.prototype.filter=function(a,b,c){c>>=1;b|=0;var d,e;d=b;for(e=c+1;e--;d+=2)a[d]-=a[d-1]+a[d+1]+2>>2;d=b+1;for(e=c;e--;d+=2)a[d]+=a[d-1]+a[d+1]>>1};wh=ye;me=sh;var jh,Ch=function(){},pd=function(a,b,c){this.data=a;this.start=b;this.end=c},la=function(a,b,c){a=a.getContexts(b);for(var d=b=1,e=0,f,g=32,h=4436;d;){var j=c.readBit(a,
+        b);b=256>b?b<<1|j:(b<<1|j)&511|256;switch(d){case 1:f=!!j;break;case 2:if(j)break;d=7;g=2;h=0;break;case 3:if(j)break;d=7;h=g=4;break;case 4:if(j)break;d=7;g=6;h=20;break;case 5:if(j)break;d=7;g=8;h=84;break;case 6:if(j)break;d=7;g=12;h=340;break;default:e=(e<<1|j)>>>0;0===--g&&(d=0);continue}d++}e+=h;return!f?e:0<e?-e:null},Dh=function(a,b,c){a=a.getContexts("IAID");for(var d=1,e=0;e<c;e++)var f=b.readBit(a,d),d=d<<1|f;return 31>c?d&(1<<c)-1:d&2147483647},Eh=function(a,b,c,d,e,f,g,h){a&&u("JBIG2 error: MMR encoding is not supported");
+        a=!!f;var j=Ti[d].concat(g);j.sort(function(a,b){return a.y-b.y||a.x-b.x});g=j.length;var l=new Int8Array(g),k=new Int8Array(g),m=[],n=0,p=0,q=0,s=0,v,t;for(t=0;t<g;t++)l[t]=j[t].x,k[t]=j[t].y,p=Math.min(p,j[t].x),q=Math.max(q,j[t].x),s=Math.min(s,j[t].y),t<g-1&&j[t].y===j[t+1].y&&j[t].x===j[t+1].x-1?n|=1<<g-1-t:m.push(t);var r=m.length,aa=new Int8Array(r),N=new Int8Array(r),ea=new Uint16Array(r);for(v=0;v<r;v++)t=m[v],aa[v]=j[t].x,N[v]=j[t].y,ea[v]=1<<g-1-t;j=-p;s=-s;q=b-q;d=Ui[d];m=new Uint8Array(b);
+        p=[];v=h.decoder;h=h.contextCache.getContexts("GB");for(var B=0,F,w,y,z=0,E,D=0;D<c;D++){if(e&&(t=v.readBit(h,d),B^=t)){p.push(m);continue}m=new Uint8Array(m);p.push(m);for(F=0;F<b;F++)if(a&&f[D][F])m[F]=0;else{if(F>=j&&F<q&&D>=s){z=z<<1&n;for(t=0;t<r;t++)if(w=D+N[t],y=F+aa[t],w=p[w][y])w=ea[t],z|=w}else{z=0;E=g-1;for(t=0;t<g;t++,E--)y=F+l[t],0<=y&&y<b&&(w=D+k[t],0<=w&&(w=p[w][y])&&(z|=w<<E))}t=v.readBit(h,z);m[F]=t}}return p},Gh=function(a,b,c,d,e,f,g,h,j){var l=Fh[c].coding;0===c&&(l=l.concat([h[0]]));
+        var k=l.length,m=new Int32Array(k),n=new Int32Array(k),p;for(p=0;p<k;p++)m[p]=l[p].x,n[p]=l[p].y;var q=Fh[c].reference;0===c&&(q=q.concat([h[1]]));h=q.length;var l=new Int32Array(h),s=new Int32Array(h);for(p=0;p<h;p++)l[p]=q[p].x,s[p]=q[p].y;var q=d[0].length,v=d.length;c=Vi[c];var t=[],r=j.decoder;j=j.contextCache.getContexts("GR");for(var aa=0,N=0;N<b;N++){g&&(p=r.readBit(j,c),(aa^=p)&&u("JBIG2 error: prediction is not supported"));var ea=new Uint8Array(a);t.push(ea);for(var B=0;B<a;B++){var F,
+            w,y=0;for(p=0;p<k;p++)F=N+n[p],w=B+m[p],y=0>F||0>w||w>=a?y<<1:y<<1|t[F][w];for(p=0;p<h;p++)F=N+s[p]+f,w=B+l[p]+e,y=0>F||F>=v||0>w||w>=q?y<<1:y<<1|d[F][w];p=r.readBit(j,y);ea[B]=p}}return t},Hh=function(a,b,c,d,e,f,g,h,j,l,k,m,n,p,q,s,v){a&&u("JBIG2 error: huffman is not supported");a=[];var t;for(p=0;p<d;p++){t=new Uint8Array(c);if(e)for(var r=0;r<c;r++)t[r]=e;a.push(t)}d=v.decoder;e=v.contextCache;var r=-la(e,"IADT",d),aa=0;for(p=0;p<f;){var N=la(e,"IADT",d),r=r+N,N=la(e,"IAFS",d),N=aa+=N;do{var w=
+        1==g?0:la(e,"IAIT",d);t=g*r+w;var w=Dh(e,d,j),B=b&&la(e,"IARI",d),w=h[w],F=w[0].length,y=w.length;if(B)var B=la(e,"IARDW",d),z=la(e,"IARDH",d),D=la(e,"IARDX",d),E=la(e,"IARDY",d),F=F+B,y=y+z,w=Gh(F,y,q,w,(B>>1)+D,(z>>1)+E,!1,s,v);var B=t-(m&1?0:y),z=N-(m&2?F:0),G;if(l){for(D=0;D<y;D++)if(t=a[z+D]){G=w[D];var I=Math.min(c-B,F);switch(n){case 0:for(E=0;E<I;E++)t[B+E]|=G[E];break;case 2:for(E=0;E<I;E++)t[B+E]^=G[E];break;default:u("JBIG2 error: operator "+n+" is not supported")}}N+=y-1}else{for(E=0;E<
+    y;E++)if(t=a[B+E])switch(G=w[E],n){case 0:for(D=0;D<F;D++)t[z+D]|=G[D];break;case 2:for(D=0;D<F;D++)t[z+D]^=G[D];break;default:u("JBIG2 error: operator "+n+" is not supported")}N+=F-1}p++;w=la(e,"IADS",d);if(null===w)break;N+=w+k}while(1)}return a},ze=function(a,b){return{width:ga(a,b),height:ga(a,b+4),x:ga(a,b+8),y:ga(a,b+12),combinationOperator:a[b+16]&7}},Ih=function(){},Jh=function(){};Ch.prototype={getContexts:function(a){return a in this?this[a]:this[a]=new Int8Array(65536)}};pd.prototype={get decoder(){var a=
+        new we(this.data,this.start,this.end);return K(this,"decoder",a)},get contextCache(){var a=new Ch;return K(this,"contextCache",a)}};var Kh=["SymbolDictionary",null,null,null,"IntermediateTextRegion",null,"ImmediateTextRegion","ImmediateLosslessTextRegion",null,null,null,null,null,null,null,null,"patternDictionary",null,null,null,"IntermediateHalftoneRegion",null,"ImmediateHalftoneRegion","ImmediateLosslessHalftoneRegion",null,null,null,null,null,null,null,null,null,null,null,null,"IntermediateGenericRegion",
+        null,"ImmediateGenericRegion","ImmediateLosslessGenericRegion","IntermediateGenericRefinementRegion",null,"ImmediateGenericRefinementRegion","ImmediateLosslessGenericRefinementRegion",null,null,null,null,"PageInformation","EndOfPage","EndOfStripe","EndOfFile","Profiles","Tables",null,null,null,null,null,null,null,null,"Extension"],Ti=[[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:2,y:-1},{x:-4,y:0},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}],[{x:-1,y:-2},{x:0,y:-2},{x:1,
+        y:-2},{x:2,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:2,y:-1},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}],[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-2,y:0},{x:-1,y:0}],[{x:-3,y:-1},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-4,y:0},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}]],Fh=[{coding:[{x:0,y:-1},{x:1,y:-1},{x:-1,y:0}],reference:[{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:0,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}]},{coding:[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},
+        {x:-1,y:0}],reference:[{x:0,y:-1},{x:-1,y:0},{x:0,y:0},{x:1,y:0},{x:0,y:1},{x:1,y:1}]}],Ui=[7379,1946,227,395],Vi=[32,8];Ih.prototype={onPageInformation:function(a){this.currentPageInfo=a;var b=new Uint8Array((a.width+7>>3)*a.height);if(a.defaultPixelValue){a=0;for(var c=b.length;a<c;a++)b[a]=255}this.buffer=b},drawBitmap:function(a,b){var c=this.currentPageInfo,d=a.width,e=a.height,f=c.width+7>>3,g=c.combinationOperatorOverride?a.combinationOperator:c.combinationOperator,c=this.buffer,h=128>>(a.x&
+        7),j=a.y*f+(a.x>>3),l,k,m;switch(g){case 0:for(g=0;g<e;g++){k=h;m=j;for(l=0;l<d;l++)b[g][l]&&(c[m]|=k),k>>=1,k||(k=128,m++);j+=f}break;case 2:for(g=0;g<e;g++){k=h;m=j;for(l=0;l<d;l++)b[g][l]&&(c[m]^=k),k>>=1,k||(k=128,m++);j+=f}break;default:u("JBIG2 error: operator "+g+" is not supported")}},onImmediateGenericRegion:function(a,b,c,d){var e=a.info;b=new pd(b,c,d);a=Eh(a.mmr,e.width,e.height,a.template,a.prediction,null,a.at,b);this.drawBitmap(e,a)},onImmediateLosslessGenericRegion:function(){this.onImmediateGenericRegion.apply(this,
+        arguments)},onSymbolDictionary:function(a,b,c,d,e,f){a.huffman&&u("JBIG2 error: huffman is not supported");var g=this.symbols;g||(this.symbols=g={});for(var h=[],j=0,l=c.length;j<l;j++)h=h.concat(g[c[j]]);f=new pd(d,e,f);j=a.huffman;l=a.refinement;c=h;var h=a.numberOfNewSymbols,k=a.template,m=a.at,n=a.refinementTemplate,p=a.refinementAt;j&&u("JBIG2 error: huffman is not supported");a=[];var q=0,s=sc(c.length+h);d=f.decoder;for(e=f.contextCache;a.length<h;)for(var v=la(e,"IADH",d),q=q+v,v=0;;){var r=
+        la(e,"IADW",d);if(null===r)break;v+=r;if(l)if(r=la(e,"IAAI",d),1<r)r=Hh(j,l,v,q,0,r,1,c.concat(a),s,0,0,1,0,void 0,n,p,f);else var r=Dh(e,d,s),w=la(e,"IARDX",d),aa=la(e,"IARDY",d),r=Gh(v,q,n,r<c.length?c[r]:a[r-c.length],w,aa,!1,p,f);else r=Eh(!1,v,q,k,!1,null,m,f);a.push(r)}f=[];j=[];l=!1;for(k=c.length+h;j.length<k;){for(m=la(e,"IAEX",d);m--;)j.push(l);l=!l}d=0;for(e=c.length;d<e;d++)j[d]&&f.push(c[d]);for(c=0;c<h;d++,c++)j[d]&&f.push(a[c]);g[b]=f},onImmediateTextRegion:function(a,b,c,d,e){for(var f=
+        a.info,g=this.symbols,h=[],j=0,l=b.length;j<l;j++)h=h.concat(g[b[j]]);b=sc(h.length);c=new pd(c,d,e);a=Hh(a.huffman,a.refinement,f.width,f.height,a.defaultPixelValue,a.numberOfSymbolInstances,a.stripSize,h,b,a.transposed,a.dsOffset,a.referenceCorner,a.combinationOperator,void 0,a.refinementTemplate,a.refinementAt,c);this.drawBitmap(f,a)},onImmediateLosslessTextRegion:function(){this.onImmediateTextRegion.apply(this,arguments)}};Jh.prototype={parseChunks:function(a){for(var b=new Ih,c=0,d=a.length;c<
+    d;c++){for(var e=a[c],f={},g=e.data,h=e.end,j=[],l=e.start;l<h;){var e=g,k=l,l={};l.number=ga(e,k);var m=e[k+4],n=m&63;Kh[n]||u("JBIG2 error: invalid segment type: "+n);l.type=n;l.typeName=Kh[n];l.deferredNonRetain=!!(m&128);var m=!!(m&64),p=e[k+5],q=p>>5&7,s=[p&31],k=k+6;if(7==p){q=ga(e,k-1)&536870911;k+=3;p=q+7>>3;for(s[0]=e[k++];0<--p;)s.push(e[k++])}else(5==p||6==p)&&u("JBIG2 error: invalid referred-to flags");l.retainBits=s;for(var r=256>=l.number?1:65536>=l.number?2:4,t=[],p=s=void 0,s=0;s<
+    q;s++)p=1==r?e[k]:2==r?Fa(e,k):ga(e,k),t.push(p),k+=r;l.referredTo=t;m?(l.pageAssociation=ga(e,k),k+=4):l.pageAssociation=e[k++];l.length=ga(e,k);k+=4;if(4294967295==l.length)if(38===n){m=ze(e,k);q=!!(e[k+17]&1);n=new Uint8Array(6);q||(n[0]=255,n[1]=172);n[2]=m.height>>>24&255;n[3]=m.height>>16&255;n[4]=m.height>>8&255;n[5]=m.height&255;s=k;for(p=e.length;s<p;s++){for(m=0;6>m&&n[m]===e[s+m];)m++;if(6==m){l.length=s+6;break}}4294967295==l.length&&u("JBIG2 error: segment end was not found")}else u("JBIG2 error: invalid unknown segment length");
+        l.headerEnd=k;e=l;l=e.headerEnd;k={header:e,data:g};f.randomAccess||(k.start=l,l+=e.length,k.end=l);j.push(k);if(51==e.type)break}if(f.randomAccess){f=0;for(g=j.length;f<g;f++)j[f].start=l,l+=j[f].header.length,j[f].end=l}f=b;g=0;for(h=j.length;g<h;g++){m=j[g];e=f;l=m.header;k=m.data;n=m.start;m=m.end;p=s=q=r=void 0;switch(l.type){case 0:r={};q=Fa(k,n);r.huffman=!!(q&1);r.refinement=!!(q&2);r.huffmanDHSelector=q>>2&3;r.huffmanDWSelector=q>>4&3;r.bitmapSizeSelector=q>>6&1;r.aggregationInstancesSelector=
+        q>>7&1;r.bitmapCodingContextUsed=!!(q&256);r.bitmapCodingContextRetained=!!(q&512);r.template=q>>10&3;r.refinementTemplate=q>>12&1;n+=2;if(!r.huffman){p=0===r.template?4:1;q=[];for(s=0;s<p;s++)q.push({x:k[n]<<24>>24,y:k[n+1]<<24>>24}),n+=2;r.at=q}if(r.refinement&&!r.refinementTemplate){q=[];for(s=0;2>s;s++)q.push({x:k[n]<<24>>24,y:k[n+1]<<24>>24}),n+=2;r.refinementAt=q}r.numberOfExportedSymbols=ga(k,n);n+=4;r.numberOfNewSymbols=ga(k,n);n+=4;r=[r,l.number,l.referredTo,k,n,m];break;case 6:case 7:p=
+    {};p.info=ze(k,n);n+=17;q=Fa(k,n);n+=2;p.huffman=!!(q&1);p.refinement=!!(q&2);p.stripSize=1<<(q>>2&3);p.referenceCorner=q>>4&3;p.transposed=!!(q&64);p.combinationOperator=q>>7&3;p.defaultPixelValue=q>>9&1;p.dsOffset=q<<17>>27;p.refinementTemplate=q>>15&1;p.huffman&&(q=Fa(k,n),n+=2,p.huffmanFS=q&3,p.huffmanDS=q>>2&3,p.huffmanDT=q>>4&3,p.huffmanRefinementDW=q>>6&3,p.huffmanRefinementDH=q>>8&3,p.huffmanRefinementDX=q>>10&3,p.huffmanRefinementDY=q>>12&3,p.huffmanRefinementSizeSelector=!!(q&14));if(p.refinement&&
+        !p.refinementTemplate){q=[];for(s=0;2>s;s++)q.push({x:k[n]<<24>>24,y:k[n+1]<<24>>24}),n+=2;p.refinementAt=q}p.numberOfSymbolInstances=ga(k,n);n+=4;p.huffman&&u("JBIG2 error: huffman is not supported");r=[p,l.referredTo,k,n,m];break;case 38:case 39:r={};r.info=ze(k,n);n+=17;q=k[n++];r.mmr=!!(q&1);r.template=q>>1&3;r.prediction=!!(q&8);if(!r.mmr){p=0===r.template?4:1;q=[];for(s=0;s<p;s++)q.push({x:k[n]<<24>>24,y:k[n+1]<<24>>24}),n+=2;r.at=q}r=[r,k,n,m];break;case 48:m={width:ga(k,n),height:ga(k,n+4),
+        resolutionX:ga(k,n+8),resolutionY:ga(k,n+12)};4294967295==m.height&&delete m.height;q=k[n+16];Fa(k,n+17);m.lossless=!!(q&1);m.refinement=!!(q&2);m.defaultPixelValue=q>>2&1;m.combinationOperator=q>>3&3;m.requiresBuffer=!!(q&32);m.combinationOperatorOverride=!!(q&64);r=[m];break;case 49:break;case 50:break;case 51:break;case 62:break;default:u("JBIG2 error: segment type "+l.typeName+"("+l.type+") is not implemented")}l="on"+l.typeName;l in e&&e[l].apply(e,r)}}return b.buffer}};jh=Jh;var Lh=function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              b,c){for(c-=1;b<c;++b,--c){var d=a[b];a[b]=a[c];a[c]=d}},Ae=function(a,b,c){return{str:a,dir:c?"ttb":b?"ltr":"rtl"}},Wi="BN BN BN BN BN BN BN BN BN S B S WS B BN BN BN BN BN BN BN BN BN BN BN BN BN BN B B B S WS ON ON ET ET ET ON ON ON ON ON ON CS ON CS ON EN EN EN EN EN EN EN EN EN EN ON ON ON ON ON ON ON L L L L L L L L L L L L L L L L L L L L L L L L L L ON ON ON ON ON ON L L L L L L L L L L L L L L L L L L L L L L L L L L ON ON ON ON BN BN BN BN BN BN B BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN BN CS ON ET ET ET ET ON ON ON ON L ON ON ON ON ON ET ET EN EN ON L ON ON ON EN L ON ON ON ON ON L L L L L L L L L L L L L L L L L L L L L L L ON L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L ON L L L L L L L L".split(" "),
+        Xi="AL AL AL AL AL AL AL AL AL AL AL AL CS AL ON ON NSM NSM NSM NSM NSM NSM AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM AL AL AL AL AL AL AL AN AN AN AN AN AN AN AN AN AN ET AN AN AL AL AL NSM AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM NSM ON NSM NSM NSM NSM AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL AL".split(" "),
+        oc=[],E=[];PDFJS.bidi=function(a,b,c){var d=!0,e=a.length;if(0===e||c)return Ae(a,d,c);oc.length=0;var f=E.length=0;for(c=0;c<e;++c){oc[c]=a.charAt(c);var g=a.charCodeAt(c),h="L";255>=g?h=Wi[g]:1424<=g&&1524>=g?h="R":1536<=g&&1791>=g?h=Xi[g&255]:1792<=g&&2220>=g&&(h="AL");("R"==h||"AL"==h||"AN"==h)&&f++;E[c]=h}if(0===f)return Ae(a,!0);-1==b&&(0.3>e/f?(d=!0,b=0):(d=!1,b=1));a=[];for(c=0;c<e;++c)a[c]=b;f=b=0!==(b&1)?"R":"L";for(c=0;c<e;++c)"NSM"==E[c]?E[c]=f:f=E[c];f=b;for(c=0;c<e;++c)if(g=E[c],"EN"==
+        g)E[c]="AL"==f?"AN":"EN";else if("R"==g||"L"==g||"AL"==g)f=g;for(c=0;c<e;++c)g=E[c],"AL"==g&&(E[c]="R");for(c=1;c<e-1;++c)if("ES"==E[c]&&("EN"==E[c-1]&&"EN"==E[c+1])&&(E[c]="EN"),"CS"==E[c]&&("EN"==E[c-1]||"AN"==E[c-1])&&E[c+1]==E[c-1])E[c]=E[c-1];for(c=0;c<e;++c)if("EN"==E[c]){for(f=c-1;0<=f&&"ET"==E[f];--f)E[f]="EN";for(f=c+1;f<e&&"ET"==E[f];--f)E[f]="EN"}for(c=0;c<e;++c)if(g=E[c],"WS"==g||"ES"==g||"ET"==g||"CS"==g)E[c]="ON";f=b;for(c=0;c<e;++c)if(g=E[c],"EN"==g)E[c]="L"==f?"L":"EN";else if("R"==
+        g||"L"==g)f=g;for(c=0;c<e;++c)if("ON"==E[c]){f=c+1;for(g=E.length;f<g&&"ON"==E[f];++f);var j=b;0<c&&(j=E[c-1]);g=b;f+1<e&&(g=E[f+1]);"L"!=j&&(j="R");"L"!=g&&(g="R");if(j==g){g=E;for(h=f;c<h;++c)g[c]=j}c=f-1}for(c=0;c<e;++c)"ON"==E[c]&&(E[c]=b);for(c=0;c<e;++c)if(g=E[c],0===(a[c]&1))if("R"==g)a[c]+=1;else{if("AN"==g||"EN"==g)a[c]+=2}else if("L"==g||"AN"==g||"EN"==g)a[c]+=1;g=-1;b=99;c=0;for(e=a.length;c<e;++c)f=a[c],g<f&&(g=f),b>f&&0!==(f&1)&&(b=f);for(f=g;f>=b;--f){g=-1;c=0;for(e=a.length;c<e;++c)a[c]<
+    f?0<=g&&(Lh(oc,g,c),g=-1):0>g&&(g=c);0<=g&&Lh(oc,g,a.length)}a="";c=0;for(e=oc.length;c<e;++c)b=oc[c],"<"!=b&&">"!=b&&(a+=b);return Ae(a,d)};"use strict";var ag,Mh=function(a){this.h1=a?a&4294967295:3285377520;this.h2=a?a&4294967295:3285377520};Mh.prototype={update:function(a){var b=!1,c;if("string"==typeof a){var d=new Uint8Array(2*a.length),e=0;for(c=0;c<a.length;c++){var f=a.charCodeAt(c);255>=f?d[e++]=f:(d[e++]=f>>>8,d[e++]=f&255)}}else if(a instanceof Uint8Array)d=a,e=d.length;else if("object"===
+        typeof a&&"length"in a)d=a,e=d.length,b=!0;else throw Error("Wrong data format in MurmurHash3_64_update. Input must be a string or array.");a=e>>2;var e=e-4*a,b=b?new Cd(d,a):new Uint32Array(d.buffer,0,a),g=0,g=0,f=this.h1,h=this.h2;for(c=0;c<a;c++)c&1?(g=b[c],g=3432918353*g&4294901760|11601*g&65535,g=g<<15|g>>>17,g=461845907*g&4294901760|13715*g&65535,f^=g,f=f<<13|f>>>19,f=5*f+3864292196):(g=b[c],g=3432918353*g&4294901760|11601*g&65535,g=g<<15|g>>>17,g=461845907*g&4294901760|13715*g&65535,h^=g,h=
+        h<<13|h>>>19,h=5*h+3864292196);g=0;switch(e){case 3:g^=d[4*a+2]<<16;case 2:g^=d[4*a+1]<<8;case 1:g^=d[4*a],g=3432918353*g&4294901760|11601*g&65535,g=g<<15|g>>>17,g=461845907*g&4294901760|13715*g&65535,a&1?f^=g:h^=g}this.h1=f;this.h2=h;return this},hexdigest:function(){for(var a=this.h1,b=this.h2,a=a^b>>>1,a=3981806797*a&4294901760|36045*a&65535,b=4283543511*b&4294901760|(2950163797*(b<<16|a>>>16)&4294901760)>>>16,a=a^b>>>1,a=444984403*a&4294901760|60499*a&65535,b=3301882366*b&4294901760|(3120437893*
+        (b<<16|a>>>16)&4294901760)>>>16,c=0,a=[a^b>>>1,b],b="";c<a.length;c++){for(var d=(a[c]>>>0).toString(16);8>d.length;)d="0"+d;b+=d}return b}};ag=Mh;var ih,Nh=function(){},Yi=function(a,b,c,d,e,f,g,h,j){function l(){if(0<y)return y--,w>>y&1;w=a[b++];if(255==w){var c=a[b++];if(c)throw"unexpected marker: "+(w<<8|c).toString(16);}y=7;return w>>>7}function k(a){for(var b;null!==(b=l());){a=a[b];if("number"===typeof a)return a;if("object"!==typeof a)throw"invalid huffman sequence";}return null}function m(a){for(var b=
+        0;0<a;){var c=l();if(null===c)return;b=b<<1|c;a--}return b}function n(a){var b=m(a);return b>=1<<a-1?b:b+(-1<<a)+1}function p(a,b){var c=k(a.huffmanTableDC),c=0===c?0:n(c);a.blockData[b]=a.pred+=c;for(c=1;64>c;){var d=k(a.huffmanTableAC),e=d&15,d=d>>4;if(0===e){if(15>d)break;c+=16}else c+=d,a.blockData[b+pc[c]]=n(e),c++}}function q(a,b){var c=k(a.huffmanTableDC),c=0===c?0:n(c)<<j;a.blockData[b]=a.pred+=c}function r(a,b){a.blockData[b]|=l()<<j}function v(a,b){if(0<B)B--;else for(var c=f,d=g;c<=d;){var e=
+        k(a.huffmanTableAC),h=e&15,e=e>>4;if(0===h){if(15>e){B=m(e)+(1<<e)-1;break}c+=16}else c+=e,a.blockData[b+pc[c]]=n(h)*(1<<j),c++}}function t(a,b){for(var c=f,d=g,e=0;c<=d;){var h=pc[c];switch(F){case 0:e=k(a.huffmanTableAC);h=e&15;e>>=4;if(0===h)15>e?(B=m(e)+(1<<e),F=4):(e=16,F=1);else{if(1!==h)throw"invalid ACn encoding";D=n(h);F=e?2:3}continue;case 1:case 2:a.blockData[b+h]?a.blockData[b+h]+=l()<<j:(e--,0===e&&(F=2==F?3:0));break;case 3:a.blockData[b+h]?a.blockData[b+h]+=l()<<j:(a.blockData[b+h]=
+        D<<j,F=0);break;case 4:a.blockData[b+h]&&(a.blockData[b+h]+=l()<<j)}c++}4===F&&(B--,0===B&&(F=0))}var u=c.mcusPerLine,aa=b,w=0,y=0,B=0,F=0,D,E=d.length,z,G,I,L,K;h=c.progressive?0===f?0===h?q:r:0===h?v:t:p;var A=0;c=1==E?d[0].blocksPerLine*d[0].blocksPerColumn:u*c.mcusPerColumn;e||(e=c);for(var M,x;A<c;){for(G=0;G<E;G++)d[G].pred=0;B=0;if(1==E){z=d[0];for(K=0;K<e;K++)G=z,h(G,64*((G.blocksPerLine+1)*(A/G.blocksPerLine|0)+A%G.blocksPerLine)),A++}else for(K=0;K<e;K++){for(G=0;G<E;G++){z=d[G];M=z.h;x=
+        z.v;for(I=0;I<x;I++)for(L=0;L<M;L++){var Q=z;h(Q,64*((Q.blocksPerLine+1)*((A/u|0)*Q.v+I)+(A%u*Q.h+L)))}}A++}y=0;z=a[b]<<8|a[b+1];if(65280>=z)throw"marker was not found";if(65488<=z&&65495>=z)b+=2;else break}return b-aa},Zi=function(a,b){for(var c=b.blocksPerLine,d=b.blocksPerColumn,e=new Int32Array(64),f=0;f<d;f++)for(var g=0;g<c;g++){for(var h=b,j=64*((b.blocksPerLine+1)*f+g),l=e,k=h.quantizationTable,m=void 0,n=void 0,p=void 0,q=void 0,r=void 0,v=void 0,t=void 0,u=void 0,w=void 0,y=void 0,y=0;64>
+    y;y++)l[y]=h.blockData[j+y]*k[y];for(y=0;8>y;++y)k=8*y,0==l[1+k]&&0==l[2+k]&&0==l[3+k]&&0==l[4+k]&&0==l[5+k]&&0==l[6+k]&&0==l[7+k]?(w=qc*l[0+k]+512>>10,l[0+k]=w,l[1+k]=w,l[2+k]=w,l[3+k]=w,l[4+k]=w,l[5+k]=w,l[6+k]=w,l[7+k]=w):(m=qc*l[0+k]+128>>8,n=qc*l[4+k]+128>>8,p=l[2+k],q=l[6+k],r=qd*(l[1+k]-l[7+k])+128>>8,u=qd*(l[1+k]+l[7+k])+128>>8,v=l[3+k]<<4,t=l[5+k]<<4,w=m-n+1>>1,m=m+n+1>>1,n=w,w=p*rd+q*sd+128>>8,p=p*sd-q*rd+128>>8,q=w,w=r-t+1>>1,r=r+t+1>>1,t=w,w=u+v+1>>1,v=u-v+1>>1,u=w,w=m-q+1>>1,m=m+q+1>>
+        1,q=w,w=n-p+1>>1,n=n+p+1>>1,p=w,w=r*td+u*ud+2048>>12,r=r*ud-u*td+2048>>12,u=w,w=v*vd+t*wd+2048>>12,v=v*wd-t*vd+2048>>12,t=w,l[0+k]=m+u,l[7+k]=m-u,l[1+k]=n+t,l[6+k]=n-t,l[2+k]=p+v,l[5+k]=p-v,l[3+k]=q+r,l[4+k]=q-r);for(y=0;8>y;++y)k=y,0==l[8+k]&&0==l[16+k]&&0==l[24+k]&&0==l[32+k]&&0==l[40+k]&&0==l[48+k]&&0==l[56+k]?(w=qc*l[y+0]+8192>>14,l[0+k]=w,l[8+k]=w,l[16+k]=w,l[24+k]=w,l[32+k]=w,l[40+k]=w,l[48+k]=w,l[56+k]=w):(m=qc*l[0+k]+2048>>12,n=qc*l[32+k]+2048>>12,p=l[16+k],q=l[48+k],r=qd*(l[8+k]-l[56+k])+
+        2048>>12,u=qd*(l[8+k]+l[56+k])+2048>>12,v=l[24+k],t=l[40+k],w=m-n+1>>1,m=m+n+1>>1,n=w,w=p*rd+q*sd+2048>>12,p=p*sd-q*rd+2048>>12,q=w,w=r-t+1>>1,r=r+t+1>>1,t=w,w=u+v+1>>1,v=u-v+1>>1,u=w,w=m-q+1>>1,m=m+q+1>>1,q=w,w=n-p+1>>1,n=n+p+1>>1,p=w,w=r*td+u*ud+2048>>12,r=r*ud-u*td+2048>>12,u=w,w=v*vd+t*wd+2048>>12,v=v*wd-t*vd+2048>>12,t=w,l[0+k]=m+u,l[56+k]=m-u,l[8+k]=n+t,l[48+k]=n-t,l[16+k]=p+v,l[40+k]=p-v,l[24+k]=q+r,l[32+k]=q-r);for(y=0;64>y;++y)h.blockData[j+y]=0>=l[y]+2056>>4?0:255<=l[y]+2056>>4?255:l[y]+
+    2056>>4|0}return b.blockData},sb=function(a){return 0>=a?0:255<=a?255:a},pc=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),wd=4017,vd=799,ud=3406,td=2276,sd=1567,rd=3784,qc=5793,qd=2896;Nh.prototype={load:function(a){var b=new XMLHttpRequest;b.open("GET",a,!0);b.responseType="arraybuffer";b.onload=function(){var a=new Uint8Array(b.response||b.mozResponseArrayBuffer);
+        this.parse(a);if(this.onload)this.onload()}.bind(this);b.send(null)},parse:function(a){function b(){var b=a[c]<<8|a[c+1];c+=2;return b}var c=0,d=null,e=null,f,g,h=[],j=[],l=[],k=b();if(65496!=k)throw"SOI not found";for(k=b();65497!=k;){var m,n;switch(k){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var p;p=b();p=a.subarray(c,c+p-2);c+=p.length;65504===k&&74===
+    p[0]&&(70===p[1]&&73===p[2]&&70===p[3]&&0===p[4])&&(d={version:{major:p[5],minor:p[6]},densityUnits:p[7],xDensity:p[8]<<8|p[9],yDensity:p[10]<<8|p[11],thumbWidth:p[12],thumbHeight:p[13],thumbData:p.subarray(14,14+3*p[12]*p[13])});65518===k&&65===p[0]&&(100===p[1]&&111===p[2]&&98===p[3]&&101===p[4]&&0===p[5])&&(e={version:p[6],flags0:p[7]<<8|p[8],flags1:p[9]<<8|p[10],transformCode:p[11]});break;case 65499:for(k=b()+c-2;c<k;){p=a[c++];var q=new Int32Array(64);if(0===p>>4)for(m=0;64>m;m++){var r=pc[m];
+        q[r]=a[c++]}else if(1===p>>4)for(m=0;64>m;m++)r=pc[m],q[r]=b();else throw"DQT: invalid table spec";h[p&15]=q}break;case 65472:case 65473:case 65474:if(f)throw"Only single frame JPEGs supported";b();f={};f.extended=65473===k;f.progressive=65474===k;f.precision=a[c++];f.scanLines=b();f.samplesPerLine=b();f.components=[];f.componentIds={};p=a[c++];for(k=r=q=0;k<p;k++){m=a[c];n=a[c+1]>>4;var v=a[c+1]&15;q<n&&(q=n);r<v&&(r=v);n=f.components.push({h:n,v:v,quantizationTable:h[a[c+2]]});f.componentIds[m]=
+        n-1;c+=3}f.maxH=q;f.maxV=r;k=f;m=Math.ceil(k.samplesPerLine/8/k.maxH);q=Math.ceil(k.scanLines/8/k.maxV);for(r=0;r<k.components.length;r++)p=k.components[r],n=Math.ceil(Math.ceil(k.samplesPerLine/8)*p.h/k.maxH),v=Math.ceil(Math.ceil(k.scanLines/8)*p.v/k.maxV),p.blockData=new Int16Array(64*(q*p.v)*(m*p.h+1)),p.blocksPerLine=n,p.blocksPerColumn=v;k.mcusPerLine=m;k.mcusPerColumn=q;break;case 65476:p=b();for(k=2;k<p;){q=a[c++];r=new Uint8Array(16);for(m=v=0;16>m;m++,c++)v+=r[m]=a[c];n=new Uint8Array(v);
+        for(m=0;m<v;m++,c++)n[m]=a[c];k+=17+v;m=0===q>>4?l:j;for(var q=q&15,v=0,t=[],u=void 0,w=void 0,y=16;0<y&&!r[y-1];)y--;t.push({children:[],index:0});for(var z=t[0],B=void 0,u=0;u<y;u++){for(w=0;w<r[u];w++){z=t.pop();for(z.children[z.index]=n[v];0<z.index;)z=t.pop();z.index++;for(t.push(z);t.length<=u;)t.push(B={children:[],index:0}),z.children[z.index]=B.children,z=B;v++}u+1<y&&(t.push(B={children:[],index:0}),z.children[z.index]=B.children,z=B)}m[q]=t[0].children}break;case 65501:b();g=b();break;
+        case 65498:b();q=a[c++];m=[];for(k=0;k<q;k++)p=f.componentIds[a[c++]],p=f.components[p],r=a[c++],p.huffmanTableDC=l[r>>4],p.huffmanTableAC=j[r&15],m.push(p);k=a[c++];p=a[c++];q=a[c++];k=Yi(a,c,f,m,g,k,p,q>>4,q&15);c+=k;break;default:if(255==a[c-3]&&192<=a[c-2]&&254>=a[c-2]){c-=3;break}throw"unknown JPEG marker "+k.toString(16);}k=b()}this.width=f.samplesPerLine;this.height=f.scanLines;this.jfif=d;this.adobe=e;this.components=[];for(k=0;k<f.components.length;k++)p=f.components[k],this.components.push({output:Zi(f,
+        p),scaleX:p.h/f.maxH,scaleY:p.v/f.maxV,blocksPerLine:p.blocksPerLine,blocksPerColumn:p.blocksPerColumn})},getData:function(a,b){var c=this.width/a,d=this.height/b,e,f,g,h,j,l=0,k,m=this.components.length,n=a*b*m,p=new Uint8Array(n);k=new Uint8Array(8*(this.components[0].blocksPerLine<<3)*this.components[0].blocksPerColumn);for(j=0;j<m;j++){e=this.components[j];f=e.blocksPerLine;g=e.blocksPerColumn;for(var q=f<<3,r,u=0,t=0;t<g;t++)for(var w=t<<3,y=0;y<f;y++){var z=64*((e.blocksPerLine+1)*t+y),l=0,
+        D=y<<3;for(h=0;8>h;h++){u=(w+h)*q;for(r=0;8>r;r++)k[u+D+r]=e.output[z+l++]}}f=e.scaleX*c;e=e.scaleY*d;l=j;for(h=0;h<b;h++)for(g=0;g<a;g++)u=0|h*e,r=0|g*f,r=u*q+r,p[l]=k[r],l+=m}switch(m){case 1:case 2:break;case 3:j=!0;this.adobe&&this.adobe.transformCode?j=!0:"undefined"!==typeof this.colorTransform&&(j=!!this.colorTransform);if(j)for(j=0;j<n;j+=m)c=p[j],d=p[j+1],k=p[j+2],l=sb(c+1.402*(k-128)),k=sb(c-0.3441363*(d-128)-0.71413636*(k-128)),c=sb(c+1.772*(d-128)),p[j]=l,p[j+1]=k,p[j+2]=c;break;case 4:j=
+        !1;this.adobe&&this.adobe.transformCode?j=!0:"undefined"!==typeof this.colorTransform&&(j=!!this.colorTransform);if(j)for(j=0;j<n;j+=m)c=p[j],d=p[j+1],k=p[j+2],l=255-sb(c+1.402*(k-128)),k=255-sb(c-0.3441363*(d-128)-0.71413636*(k-128)),c=255-sb(c+1.772*(d-128)),p[j]=l,p[j+1]=k,p[j+2]=c;break;default:throw"Unsupported color mode";}return p},copyToImageData:function(a){var b=a.width,c=a.height,d=4*b*c;a=a.data;var b=this.getData(b,c),e=c=0,f,g,h,j;switch(this.components.length){case 1:for(;e<d;)f=b[c++],
+        a[e++]=f,a[e++]=f,a[e++]=f,a[e++]=255;break;case 3:for(;e<d;)h=b[c++],j=b[c++],f=b[c++],a[e++]=h,a[e++]=j,a[e++]=f,a[e++]=255;break;case 4:for(;e<d;)h=b[c++],j=b[c++],f=b[c++],g=b[c++],h=255-sb(h*(1-g/255)+g),j=255-sb(j*(1-g/255)+g),f=255-sb(f*(1-g/255)+g),a[e++]=h,a[e++]=j,a[e++]=f,a[e++]=255;break;default:throw"Unsupported color mode";}}};ih=Nh}).call("undefined"===typeof window?this:window);
+!PDFJS.workerSrc&&"undefined"!==typeof document&&(PDFJS.workerSrc=function(){var R=(document.body||document.getElementsByTagName("head")[0]).lastChild.src;return R&&R.replace(/\.js$/i,".worker.js")}());
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/pdf_combined.js b/public/opac/js/universalviewer-2.0.2/lib/pdf_combined.js
new file mode 100644
index 0000000000000000000000000000000000000000..1dead49d98f537514a8a0794a51c1512550378a0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/pdf_combined.js
@@ -0,0 +1,937 @@
+"undefined"===typeof PDFJS&&(("undefined"!==typeof window?window:this).PDFJS={});PDFJS.version="1.0.83";PDFJS.build="0045325";
+(function(){function G(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.infos&&console.log("Info: "+a)}function z(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.warnings&&console.log("Warning: "+a)}function v(a){if(1<arguments.length){var b=["Error:"];b.push.apply(b,arguments);console.log.apply(console,b);a=[].join.call(arguments," ")}else console.log("Error: "+a);console.log(Eb());wa.notify(Fb.unknown);throw Error(a);}function Eb(){try{throw Error();}catch(a){return a.stack?a.stack.split("\n").slice(2).join("\n"):
+    ""}}function Gb(a,b){if(!b)return a;if(/^[a-z][a-z0-9+\-.]*:/i.test(b))return b;var c;if("/"==b.charAt(0))return c=a.indexOf("://"),"/"===b.charAt(1)?++c:c=a.indexOf("/",c+3),a.substring(0,c)+b;var d=a.length;c=a.lastIndexOf("#");d=0<=c?c:d;c=a.lastIndexOf("?",d);c=a.lastIndexOf("/",0<=c?c:d);return a.substring(0,c+1)+b}function ea(a,b){if(!a)return!1;var c=/^[a-z][a-z0-9+\-.]*(?=:)/i.exec(a);if(!c)return b;c=c[0].toLowerCase();switch(c){case "http":case "https":case "ftp":case "mailto":return!0;
+    default:return!1}}function K(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!1});return c}function T(a){var b,c=a.length,d=[];if("\u00fe"===a[0]&&"\u00ff"===a[1])for(b=2;b<c;b+=2)d.push(String.fromCharCode(a.charCodeAt(b)<<8|a.charCodeAt(b+1)));else for(b=0;b<c;++b){var e=Hb[a.charCodeAt(b)];d.push(e?String.fromCharCode(e):a.charAt(b))}return d.join("")}function L(a){return"boolean"==typeof a}function I(a){return a instanceof Name}function U(a,b){if(!(a instanceof
+    Dict))return!1;if(!b)return!0;var c=a.get("Type");return I(c)&&c.name==b}function B(a){return a instanceof Array}function xa(a){return"object"==typeof a&&null!==a&&void 0!==a&&"getBytes"in a}function fa(a,b){this.name=a;this.comObj=b;this.callbackIndex=1;this.postMessageTransfers=!0;var c=this.callbacks={},d=this.actionHandler={};d.console_log=[function(a){console.log.apply(console,a)}];d.console_error=[function(a){console.error.apply(console,a)}];d._unsupported_feature=[function(a){wa.notify(a)}];
+    b.onmessage=function(a){var f=a.data;if(f.isReply)if(a=f.callbackId,f.callbackId in c){var g=c[a];delete c[a];g(f.data)}else v("Cannot resolve callback "+a);else if(f.action in d)if(a=d[f.action],f.callbackId){var h={},g=new Promise(function(a,b){h.resolve=a;h.reject=b});h.promise=g;g.then(function(a){b.postMessage({isReply:!0,callbackId:f.callbackId,data:a})});a[0].call(a[1],f.data,h)}else a[0].call(a[1],f.data);else v("Unkown action from worker: "+f.action)}}function ya(a,b){var c=document.createElement("canvas");
+    c.width=a;c.height=b;return c}function za(a){a.mozCurrentTransform||(a._scaleX=a._scaleX||1,a._scaleY=a._scaleY||1,a._originalSave=a.save,a._originalRestore=a.restore,a._originalRotate=a.rotate,a._originalScale=a.scale,a._originalTranslate=a.translate,a._originalTransform=a.transform,a._originalSetTransform=a.setTransform,a._transformMatrix=[a._scaleX,0,0,a._scaleY,0,0],a._transformStack=[],Object.defineProperty(a,"mozCurrentTransform",{get:function(){return this._transformMatrix}}),Object.defineProperty(a,
+    "mozCurrentTransformInverse",{get:function(){var a=this._transformMatrix,c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],a=a[5],h=c*f-d*e,j=d*e-c*f;return[f/h,d/j,e/j,c/h,(f*g-e*a)/j,(d*g-c*a)/h]}}),a.save=function(){var a=this._transformMatrix;this._transformStack.push(a);this._transformMatrix=a.slice(0,6);this._originalSave()},a.restore=function(){var a=this._transformStack.pop();a&&(this._transformMatrix=a,this._originalRestore())},a.translate=function(a,c){var d=this._transformMatrix;d[4]=d[0]*a+d[2]*c+d[4];
+    d[5]=d[1]*a+d[3]*c+d[5];this._originalTranslate(a,c)},a.scale=function(a,c){var d=this._transformMatrix;d[0]*=a;d[1]*=a;d[2]*=c;d[3]*=c;this._originalScale(a,c)},a.transform=function(b,c,d,e,f,g){var h=this._transformMatrix;this._transformMatrix=[h[0]*b+h[2]*c,h[1]*b+h[3]*c,h[0]*d+h[2]*e,h[1]*d+h[3]*e,h[0]*f+h[2]*g+h[4],h[1]*f+h[3]*g+h[5]];a._originalTransform(b,c,d,e,f,g)},a.setTransform=function(b,c,d,e,f,g){this._transformMatrix=[b,c,d,e,f,g];a._originalSetTransform(b,c,d,e,f,g)},a.rotate=function(a){var c=
+    Math.cos(a),d=Math.sin(a),e=this._transformMatrix;this._transformMatrix=[e[0]*c+e[2]*d,e[1]*c+e[3]*d,e[0]*-d+e[2]*c,e[1]*-d+e[3]*c,e[4],e[5]];this._originalRotate(a)})}function Aa(a){var b=ga[a[0]];b||v("Unknown IR type: "+a[0]);return b.fromIR(a)}var y="undefined"===typeof window?this:window,V="undefined"==typeof window,ha=[0.001,0,0,0.001,0,0];y.PDFJS||(y.PDFJS={});y.PDFJS.pdfBug=!1;PDFJS.VERBOSITY_LEVELS={errors:0,warnings:1,infos:5};var J=PDFJS.OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,
+    setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,
+    nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,
+    beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90},Fb=PDFJS.UNSUPPORTED_FEATURES={unknown:"unknown",
+    forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"},ia=[],wa=PDFJS.UnsupportedManager={listen:function(a){ia.push(a)},notify:function(a){z('Unsupported feature "'+a+'"');for(var b=0,c=ia.length;b<c;b++)ia[b](a)}};PDFJS.isValidUrl=ea;var Ba=PDFJS.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2},W=function(a){this.message=a};W.prototype=Error();W.prototype.name="NotImplementedException";W.constructor=W;Object.defineProperty(PDFJS,"isLittleEndian",
+    {configurable:!0,get:function(){var a=PDFJS,b=new Uint8Array(2);b[0]=1;b=new Uint16Array(b.buffer);return K(a,"isLittleEndian",1===b[0])}});Object.defineProperty(PDFJS,"hasCanvasTypedArrays",{configurable:!0,get:function(){var a=PDFJS,b=document.createElement("canvas");b.width=b.height=1;b=b.getContext("2d").createImageData(1,1);return K(a,"hasCanvasTypedArrays","undefined"!==typeof b.data.buffer)}});var ja=function(a,b){this.buffer=a;this.byteLength=a.length;for(var c=this.length=void 0===b?this.byteLength>>
+2:b;Y<c;)Object.defineProperty(ja.prototype,Y,Ib(Y)),Y++},Ib=function(a){return{get:function(){var b=this.buffer,c=a<<2;return(b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24)>>>0},set:function(b){var c=this.buffer,d=a<<2;c[d]=b&255;c[d+1]=b>>8&255;c[d+2]=b>>16&255;c[d+3]=b>>>24&255}}};ja.prototype=Object.create(null);var Y=0,Ca=[1,0,0,1,0,0],Jb=PDFJS,u=function(){};u.makeCssRgb=function(a){return"rgb("+a[0]+","+a[1]+","+a[2]+")"};u.makeCssCmyk=function(a){a=s.singletons.cmyk.getRgb(a,0);return u.makeCssRgb(a)};
+    u.transform=function(a,b){return[a[0]*b[0]+a[2]*b[1],a[1]*b[0]+a[3]*b[1],a[0]*b[2]+a[2]*b[3],a[1]*b[2]+a[3]*b[3],a[0]*b[4]+a[2]*b[5]+a[4],a[1]*b[4]+a[3]*b[5]+a[5]]};u.applyTransform=function(a,b){return[a[0]*b[0]+a[1]*b[2]+b[4],a[0]*b[1]+a[1]*b[3]+b[5]]};u.applyInverseTransform=function(a,b){var c=b[0]*b[3]-b[1]*b[2];return[(a[0]*b[3]-a[1]*b[2]+b[2]*b[5]-b[4]*b[3])/c,(-a[0]*b[1]+a[1]*b[0]+b[4]*b[1]-b[5]*b[0])/c]};u.getAxialAlignedBoundingBox=function(a,b){var c=u.applyTransform(a,b),d=u.applyTransform(a.slice(2,
+        4),b),e=u.applyTransform([a[0],a[3]],b),f=u.applyTransform([a[2],a[1]],b);return[Math.min(c[0],d[0],e[0],f[0]),Math.min(c[1],d[1],e[1],f[1]),Math.max(c[0],d[0],e[0],f[0]),Math.max(c[1],d[1],e[1],f[1])]};u.inverseTransform=function(a){var b=a[0]*a[3]-a[1]*a[2];return[a[3]/b,-a[1]/b,-a[2]/b,a[0]/b,(a[2]*a[5]-a[4]*a[3])/b,(a[4]*a[1]-a[5]*a[0])/b]};u.apply3dTransform=function(a,b){return[a[0]*b[0]+a[1]*b[1]+a[2]*b[2],a[3]*b[0]+a[4]*b[1]+a[5]*b[2],a[6]*b[0]+a[7]*b[1]+a[8]*b[2]]};u.singularValueDecompose2dScale=
+        function(a){var b=[a[0],a[2],a[1],a[3]],c=a[0]*b[0]+a[1]*b[2],d=a[2]*b[1]+a[3]*b[3],e=(c+d)/2;a=Math.sqrt((c+d)*(c+d)-4*(c*d-(a[2]*b[0]+a[3]*b[2])*(a[0]*b[1]+a[1]*b[3])))/2;b=e-a||1;return[Math.sqrt(e+a||1),Math.sqrt(b)]};u.normalizeRect=function(a){var b=a.slice(0);a[0]>a[2]&&(b[0]=a[2],b[2]=a[0]);a[1]>a[3]&&(b[1]=a[3],b[3]=a[1]);return b};u.intersect=function(a,b){function c(a,b){return a-b}var d=[a[0],a[2],b[0],b[2]].sort(c),e=[a[1],a[3],b[1],b[3]].sort(c),f=[];a=u.normalizeRect(a);b=u.normalizeRect(b);
+        if(d[0]===a[0]&&d[1]===b[0]||d[0]===b[0]&&d[1]===a[0])f[0]=d[1],f[2]=d[2];else return!1;if(e[0]===a[1]&&e[1]===b[1]||e[0]===b[1]&&e[1]===a[1])f[1]=e[1],f[3]=e[2];else return!1;return f};u.sign=function(a){return 0>a?-1:1};u.concatenateToArray=function(a,b){Array.prototype.push.apply(a,b)};u.prependToArray=function(a,b){Array.prototype.unshift.apply(a,b)};u.extendObj=function(a,b){for(var c in b)a[c]=b[c]};u.getInheritableProperty=function(a,b){for(;a&&!a.has(b);)a=a.get("Parent");return!a?null:a.get(b)};
+    u.inherit=function(a,b,c){a.prototype=Object.create(b.prototype);a.prototype.constructor=a;for(var d in c)a.prototype[d]=c[d]};u.loadScript=function(a,b){var c=document.createElement("script"),d=!1;c.setAttribute("src",a);b&&(c.onload=function(){d||b();d=!0});document.getElementsByTagName("head")[0].appendChild(c)};var t=Jb.Util=u,Kb=PDFJS,ka=function(a,b,c,d,e,f){this.viewBox=a;this.scale=b;this.rotation=c;this.offsetX=d;this.offsetY=e;var g=(a[2]+a[0])/2,h=(a[3]+a[1])/2,j,k,l;c%=360;switch(0>c?
+    c+360:c){case 180:c=-1;k=j=0;l=1;break;case 90:c=0;k=j=1;l=0;break;case 270:c=0;k=j=-1;l=0;break;default:c=1,k=j=0,l=-1}f&&(k=-k,l=-l);0===c?(d=Math.abs(h-a[1])*b+d,e=Math.abs(g-a[0])*b+e,f=Math.abs(a[3]-a[1])*b,a=Math.abs(a[2]-a[0])*b):(d=Math.abs(g-a[0])*b+d,e=Math.abs(h-a[1])*b+e,f=Math.abs(a[2]-a[0])*b,a=Math.abs(a[3]-a[1])*b);this.transform=[c*b,j*b,k*b,l*b,d-c*b*g-k*b*h,e-j*b*g-l*b*h];this.width=f;this.height=a;this.fontScale=b};ka.prototype={clone:function(a){a=a||{};var b="scale"in a?a.scale:
+        this.scale,c="rotation"in a?a.rotation:this.rotation;return new ka(this.viewBox.slice(),b,c,this.offsetX,this.offsetY,a.dontFlip)},convertToViewportPoint:function(a,b){return t.applyTransform([a,b],this.transform)},convertToViewportRectangle:function(a){var b=t.applyTransform([a[0],a[1]],this.transform);a=t.applyTransform([a[2],a[3]],this.transform);return[b[0],b[1],a[0],a[1]]},convertToPdfPoint:function(a,b){return t.applyInverseTransform([a,b],this.transform)}};Kb.PageViewport=ka;var Hb=[0,0,0,
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364],N=PDFJS.LegacyPromise=function(){var a,b,c=new Promise(function(c,e){a=c;b=e});c.resolve=
+        a;c.reject=b;return c};var H=function(a){this._status=Da;this._handlers=[];a.call(this,this._resolve.bind(this),this._reject.bind(this))};if(y.Promise)"function"!==typeof y.Promise.all&&(y.Promise.all=function(a){var b=0,c=[],d,e,f=new y.Promise(function(a,b){d=a;e=b});a.forEach(function(a,f){b++;a.then(function(a){c[f]=a;b--;0===b&&d(c)},e)});0===b&&d(c);return f}),"function"!==typeof y.Promise.resolve&&(y.Promise.resolve=function(a){return new y.Promise(function(b){b(a)})});else{var Da=0,O=2,la=
+    {handlers:[],running:!1,unhandledRejections:[],pendingRejectionCheck:!1,scheduleHandlers:function(a){a._status!=Da&&(this.handlers=this.handlers.concat(a._handlers),a._handlers=[],this.running||(this.running=!0,setTimeout(this.runHandlers.bind(this),0)))},runHandlers:function(){for(var a=Date.now()+1;0<this.handlers.length;){var b=this.handlers.shift(),c=b.thisPromise._status,d=b.thisPromise._value;try{1===c?"function"==typeof b.onResolve&&(d=b.onResolve(d)):"function"===typeof b.onReject&&(d=b.onReject(d),
+        c=1,b.thisPromise._unhandledRejection&&this.removeUnhandeledRejection(b.thisPromise))}catch(e){c=O,d=e}b.nextPromise._updateStatus(c,d);if(Date.now()>=a)break}0<this.handlers.length?setTimeout(this.runHandlers.bind(this),0):this.running=!1},addUnhandledRejection:function(a){this.unhandledRejections.push({promise:a,time:Date.now()});this.scheduleRejectionCheck()},removeUnhandeledRejection:function(a){a._unhandledRejection=!1;for(var b=0;b<this.unhandledRejections.length;b++)this.unhandledRejections[b].promise===
+    a&&(this.unhandledRejections.splice(b),b--)},scheduleRejectionCheck:function(){this.pendingRejectionCheck||(this.pendingRejectionCheck=!0,setTimeout(function(){this.pendingRejectionCheck=!1;for(var a=Date.now(),b=0;b<this.unhandledRejections.length;b++)if(500<a-this.unhandledRejections[b].time){var c=this.unhandledRejections[b].promise._value,d="Unhandled rejection: "+c;c.stack&&(d+="\n"+c.stack);z(d);this.unhandledRejections.splice(b);b--}this.unhandledRejections.length&&this.scheduleRejectionCheck()}.bind(this),
+        500))}};H.all=function(a){function b(a){e._status!==O&&(g=[],d(a))}var c,d,e=new H(function(a,b){c=a;d=b}),f=a.length,g=[];if(0===f)return c(g),e;for(var h=0,j=a.length;h<j;++h){var k=a[h],l=function(a){return function(b){e._status!==O&&(g[a]=b,f--,0===f&&c(g))}}(h);H.isPromise(k)?k.then(l,b):l(k)}return e};H.isPromise=function(a){return a&&"function"===typeof a.then};H.resolve=function(a){return new H(function(b){b(a)})};H.prototype={_status:null,_value:null,_handlers:null,_unhandledRejection:null,
+        _updateStatus:function(a,b){1===this._status||this._status===O||(1==a&&H.isPromise(b)?b.then(this._updateStatus.bind(this,1),this._updateStatus.bind(this,O)):(this._status=a,this._value=b,a===O&&0===this._handlers.length&&(this._unhandledRejection=!0,la.addUnhandledRejection(this)),la.scheduleHandlers(this)))},_resolve:function(a){this._updateStatus(1,a)},_reject:function(a){this._updateStatus(O,a)},then:function(a,b){var c=new H(function(a,b){this.reject=this.resolve=b});this._handlers.push({thisPromise:this,
+            onResolve:a,onReject:b,nextPromise:c});la.scheduleHandlers(this);return c}};y.Promise=H}var Ea=function(){this.started={};this.times=[];this.enabled=!0};Ea.prototype={time:function(a){this.enabled&&(a in this.started&&z("Timer is already running for "+a),this.started[a]=Date.now())},timeEnd:function(a){this.enabled&&(a in this.started||z("Timer has not been started for "+a),this.times.push({name:a,start:this.started[a],end:Date.now()}),delete this.started[a])},toString:function(){var a,b,c=this.times,
+        d="",e=0;a=0;for(b=c.length;a<b;++a){var f=c[a].name;f.length>e&&(e=f.length)}a=0;for(b=c.length;a<b;++a){for(var g=c[a],f=g.end-g.start,g=g.name;g.length<e;)g+=" ";d+=g+" "+f+"ms\n"}return d}};PDFJS.createBlob=function(a,b){if("undefined"!==typeof Blob)return new Blob([a],{type:b});var c=new MozBlobBuilder;c.append(a);return c.getBlob(b)};PDFJS.createObjectURL=function(a,b){if(!PDFJS.disableCreateObjectURL&&"undefined"!==typeof URL&&URL.createObjectURL){var c=PDFJS.createBlob(a,b);return URL.createObjectURL(c)}for(var c=
+        "data:"+b+";base64,",d=0,e=a.length;d<e;d+=3)var f=a[d]&255,g=a[d+1]&255,h=a[d+2]&255,c=c+("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[f>>2]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[(f&3)<<4|g>>4]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[d+1<e?(g&15)<<2|h>>6:64]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[d+2<e?h&63:64]);return c};fa.prototype={on:function(a,b,c){var d=this.actionHandler;d[a]&&v('There is already an actionName called "'+
+        a+'"');d[a]=[b,c]},send:function(a,b,c,d){a={action:a,data:b};c&&(b=this.callbackIndex++,this.callbacks[b]=c,a.callbackId=b);d&&this.postMessageTransfers?this.comObj.postMessage(a,d):this.comObj.postMessage(a)}};var s,E=function(){v("should not call ColorSpace constructor")};E.prototype={getRgb:function(a,b){var c=new Uint8Array(3);this.getRgbItem(a,b,c,0);return c},getRgbItem:function(){v("Should not call ColorSpace.getRgbItem")},getRgbBuffer:function(){v("Should not call ColorSpace.getRgbBuffer")},
+        getOutputLength:function(){v("Should not call ColorSpace.getOutputLength")},isPassthrough:function(){return!1},fillRgb:function(a,b,c,d,e,f,g,h,j){var k=b*c,l=null,p=1<<g,q=c!=e||b!=d,n;if(this.isPassthrough(g))l=h;else if(1===this.numComps&&k>p&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){var m=8>=g?new Uint8Array(p):new Uint16Array(p),r;for(n=0;n<p;n++)m[n]=n;var x=new Uint8Array(3*p);this.getRgbBuffer(m,0,p,x,0,g,0);if(q){l=new Uint8Array(3*k);for(n=m=0;n<k;++n)r=3*h[n],l[m++]=x[r],l[m++]=
+            x[r+1],l[m++]=x[r+2]}else for(n=p=0;n<k;++n)r=3*h[n],a[p++]=x[r],a[p++]=x[r+1],a[p++]=x[r+2],p+=j}else q?(l=new Uint8Array(3*k),this.getRgbBuffer(h,0,k,l,0,g,0)):this.getRgbBuffer(h,0,d*f,a,0,g,j);if(l)if(q)PDFImage.resize(l,g,3,b,c,d,e,a,j);else{n=p=m=0;for(b=d*f;n<b;n++)a[p++]=l[m++],a[p++]=l[m++],a[p++]=l[m++],p+=j}},usesZeroToOneRange:!0};E.parse=function(a,b,c){a=E.parseToIR(a,b,c);return a instanceof ma?a:E.fromIR(a)};E.fromIR=function(a){var b=B(a)?a[0]:a,c;switch(b){case "DeviceGrayCS":return this.singletons.gray;
+        case "DeviceRgbCS":return this.singletons.rgb;case "DeviceCmykCS":return this.singletons.cmyk;case "CalGrayCS":return b=a[1].WhitePoint,c=a[1].BlackPoint,new Fa(b,c,a[1].Gamma);case "PatternCS":return(a=a[1])&&(a=E.fromIR(a)),new Ga(a);case "IndexedCS":return b=a[2],c=a[3],new Ha(E.fromIR(a[1]),b,c);case "AlternateCS":return b=a[3],new ma(a[1],E.fromIR(a[2]),X.fromIR(b));case "LabCS":return b=a[1].WhitePoint,c=a[1].BlackPoint,new Ia(b,c,a[1].Range);default:v("Unkown name "+b)}return null};E.parseToIR=
+        function(a,b,c){if(I(a)){var d=c.get("ColorSpace");U(d)&&(d=d.get(a.name))&&(a=d)}a=b.fetchIfRef(a);if(I(a))switch(this.mode=d=a.name,d){case "DeviceGray":case "G":return"DeviceGrayCS";case "DeviceRGB":case "RGB":return"DeviceRgbCS";case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";case "Pattern":return["PatternCS",null];default:v("unrecognized colorspace "+d)}else if(B(a))switch(this.mode=d=a[0].name,d){case "DeviceGray":case "G":return"DeviceGrayCS";case "DeviceRGB":case "RGB":return"DeviceRgbCS";
+            case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";case "CalGray":return b=a[1].getAll(),["CalGrayCS",b];case "CalRGB":return"DeviceRgbCS";case "ICCBased":d=b.fetchIfRef(a[1]).dict.get("N");if(1==d)return"DeviceGrayCS";if(3==d)return"DeviceRgbCS";if(4==d)return"DeviceCmykCS";break;case "Pattern":return(a=a[1])&&(a=E.parseToIR(a,b,c)),["PatternCS",a];case "Indexed":case "I":return c=E.parseToIR(a[1],b,c),d=a[2]+1,b=b.fetchIfRef(a[3]),xa(b)&&(b=b.getBytes()),["IndexedCS",c,d,b];case "Separation":case "DeviceN":var e=
+                a[1],d=1;I(e)?d=1:B(e)&&(d=e.length);c=E.parseToIR(a[2],b,c);b=X.getIR(b,b.fetchIfRef(a[3]));return["AlternateCS",d,c,b];case "Lab":return b=a[1].getAll(),["LabCS",b];default:v('unimplemented color space object "'+d+'"')}else v('unrecognized color space object: "'+a+'"');return null};E.isDefaultDecode=function(a,b){if(!a)return!0;if(2*b!==a.length)return z("The decode map is not the correct length"),!0;for(var c=0,d=a.length;c<d;c+=2)if(0!==a[c]||1!=a[c+1])return!1;return!0};E.singletons={get gray(){return K(this,
+        "gray",new Ja)},get rgb(){return K(this,"rgb",new Ka)},get cmyk(){return K(this,"cmyk",new La)}};s=E;var ma,Ma=function(a,b,c){this.name="Alternate";this.numComps=a;this.defaultColor=new Float32Array(a);for(var d=0;d<a;++d)this.defaultColor[d]=1;this.base=b;this.tintFn=c};Ma.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){a="subarray"in a?a.subarray(b,b+this.numComps):Array.prototype.slice.call(a,b,b+this.numComps);a=this.tintFn(a);this.base.getRgbItem(a,0,c,d)},getRgbBuffer:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   b,c,d,e,f,g){var h=this.tintFn,j=this.base;f=1/((1<<f)-1);var k=j.numComps,l=j.usesZeroToOneRange,p=(j.isPassthrough(8)||!l)&&0===g,q=p?e:0,n=p?d:new Uint8Array(k*c),m=this.numComps,r=new Float32Array(m),x,w;for(x=0;x<c;x++){for(w=0;w<m;w++)r[w]=a[b++]*f;var D=h(r);if(l)for(w=0;w<k;w++)n[q++]=255*D[w];else j.getRgbItem(D,0,n,q),q+=k}p||j.getRgbBuffer(n,0,c,d,e,8,g)},getOutputLength:function(a,b){return this.base.getOutputLength(a*this.base.numComps/this.numComps,b)},isPassthrough:s.prototype.isPassthrough,
+        fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};ma=Ma;var Ga,Na=function(a){this.name="Pattern";this.base=a};Na.prototype={};Ga=Na;var Ha,Oa=function(a,b,c){this.name="Indexed";this.numComps=1;this.defaultColor=new Uint8Array([0]);this.base=a;this.highVal=b;a=a.numComps*b;var d;if(xa(c))d=new Uint8Array(a),c=c.getBytes(a),d.set(c);else if("string"==typeof c){d=new Uint8Array(a);for(b=0;b<a;++b)d[b]=c.charCodeAt(b)}else c instanceof
+    Uint8Array||c instanceof Array?d=c:v("Unrecognized lookup table: "+c);this.lookup=d};Oa.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){this.base.getRgbItem(this.lookup,a[b]*this.base.numComps,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=this.base;for(var h=f.numComps,j=f.getOutputLength(h,g),k=this.lookup,l=0;l<c;++l){var p=a[b++]*h;f.getRgbBuffer(k,p,1,d,e,8,g);e+=j}},getOutputLength:function(a,b){return this.base.getOutputLength(a*this.base.numComps,b)},isPassthrough:s.prototype.isPassthrough,
+        fillRgb:s.prototype.fillRgb,isDefaultDecode:function(){return!0},usesZeroToOneRange:!0};Ha=Oa;var Ja,Pa=function(){this.name="DeviceGray";this.numComps=1;this.defaultColor=new Float32Array([0])};Pa.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){a=255*a[b]|0;c[d]=c[d+1]=c[d+2]=0>a?0:255<a?255:a},getRgbBuffer:function(a,b,c,d,e,f,g){f=255/((1<<f)-1);for(var h=0;h<c;++h){var j=f*a[b++]|0;d[e++]=j;d[e++]=j;d[e++]=j;e+=g}},getOutputLength:function(a,b){return a*(3+b)},isPassthrough:s.prototype.isPassthrough,
+        fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Ja=Pa;var Ka,Qa=function(){this.name="DeviceRGB";this.numComps=3;this.defaultColor=new Float32Array([0,0,0])};Qa.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){var e=255*a[b]|0,f=255*a[b+1]|0;a=255*a[b+2]|0;c[d]=0>e?0:255<e?255:e;c[d+1]=0>f?0:255<f?255:f;c[d+2]=0>a?0:255<a?255:a},getRgbBuffer:function(a,b,c,d,e,f,g){if(8===f&&0===g)d.set(a.subarray(b,b+3*c),
+        e);else{f=255/((1<<f)-1);for(var h=0;h<c;++h)d[e++]=f*a[b++]|0,d[e++]=f*a[b++]|0,d[e++]=f*a[b++]|0,e+=g}},getOutputLength:function(a,b){return a*(3+b)/3|0},isPassthrough:function(a){return 8==a},fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Ka=Qa;var La,Ra=function(a,b,c,d,e){var f=a[b+0]*c,g=a[b+1]*c,h=a[b+2]*c;c*=a[b+3];a=f*(-4.387332384609988*f+54.48615194189176*g+18.82290502165302*h+212.25662451639585*c+-285.2331026137004)+
+        g*(1.7149763477362134*g-5.6096736904047315*h+-17.873870861415444*c-5.497006427196366)+h*(-2.5217340131683033*h-21.248923337353073*c+17.5119270841813)+c*(-21.86122147463605*c-189.48180835922747)+255|0;b=f*(8.841041422036149*f+60.118027045597366*g+6.871425592049007*h+31.159100130055922*c+-79.2970844816548)+g*(-15.310361306967817*g+17.575251261109482*h+131.35250912493976*c-190.9453302588951)+h*(4.444339102852739*h+9.8632861493405*c-24.86741582555878)+c*(-20.737325471181034*c-187.80453709719578)+255|
+        0;f=f*(0.8842522430003296*f+8.078677503112928*g+30.89978309703729*h-0.23883238689178934*c+-14.183576799673286)+g*(10.49593273432072*g+63.02378494754052*h+50.606957656360734*c-112.23884253719248)+h*(0.03296041114873217*h+115.60384449646641*c+-193.58209356861505)+c*(-22.33816807309886*c-180.12613974708367)+255|0;d[e]=255<a?255:0>a?0:a;d[e+1]=255<b?255:0>b?0:b;d[e+2]=255<f?255:0>f?0:f},Sa=function(){this.name="DeviceCMYK";this.numComps=4;this.defaultColor=new Float32Array([0,0,0,1])};Sa.prototype={getRgb:s.prototype.getRgb,
+        getRgbItem:function(a,b,c,d){Ra(a,b,1,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=1/((1<<f)-1);for(var h=0;h<c;h++)Ra(a,b,f,d,e),b+=4,e+=3+g},getOutputLength:function(a,b){return a/4*(3+b)|0},isPassthrough:s.prototype.isPassthrough,fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};La=Sa;var Fa,Ta=function(a,b,c){this.name="CalGray";this.numComps=1;this.defaultColor=new Float32Array([0]);a||v("WhitePoint missing - required for color space CalGray");
+        b=b||[0,0,0];this.XW=a[0];this.YW=a[1];this.ZW=a[2];this.XB=b[0];this.YB=b[1];this.ZB=b[2];this.G=c||1;(0>this.XW||0>this.ZW||1!==this.YW)&&v("Invalid WhitePoint components for "+this.name+", no fallback available");if(0>this.XB||0>this.YB||0>this.ZB)G("Invalid BlackPoint for "+this.name+", falling back to default"),this.XB=this.YB=this.ZB=0;(0!==this.XB||0!==this.YB||0!==this.ZB)&&z(this.name+", BlackPoint: XB: "+this.XB+", YB: "+this.YB+", ZB: "+this.ZB+", only default values are supported.");1>
+        this.G&&(G("Invalid Gamma: "+this.G+" for "+this.name+", falling back to default"),this.G=1)},Ua=function(a,b,c,d,e,f){b=Math.pow(b[c]*f,a.G);a=Math.max(116*Math.pow(a.YW*b,1/3)-16,0);d[e]=255*a/100;d[e+1]=255*a/100;d[e+2]=255*a/100};Ta.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,b,c,d){Ua(this,a,b,c,d,1)},getRgbBuffer:function(a,b,c,d,e,f,g){f=1/((1<<f)-1);for(var h=0;h<c;++h)Ua(this,a,b,d,e,f),b+=1,e+=3+g},getOutputLength:function(a,b){return a*(3+b)},isPassthrough:s.prototype.isPassthrough,
+        fillRgb:s.prototype.fillRgb,isDefaultDecode:function(a){return s.isDefaultDecode(a,this.numComps)},usesZeroToOneRange:!0};Fa=Ta;var Ia,Va=function(a,b,c){this.name="Lab";this.numComps=3;this.defaultColor=new Float32Array([0,0,0]);a||v("WhitePoint missing - required for color space Lab");b=b||[0,0,0];c=c||[-100,100,-100,100];this.XW=a[0];this.YW=a[1];this.ZW=a[2];this.amin=c[0];this.amax=c[1];this.bmin=c[2];this.bmax=c[3];this.XB=b[0];this.YB=b[1];this.ZB=b[2];(0>this.XW||0>this.ZW||1!==this.YW)&&
+    v("Invalid WhitePoint components, no fallback available");if(0>this.XB||0>this.YB||0>this.ZB)G("Invalid BlackPoint, falling back to default"),this.XB=this.YB=this.ZB=0;if(this.amin>this.amax||this.bmin>this.bmax)G("Invalid Range, falling back to defaults"),this.amin=-100,this.amax=100,this.bmin=-100,this.bmax=100},na=function(a){return a>=6/29?a*a*a:108/841*(a-4/29)},Wa=function(a,b,c,d,e,f){var g=b[c],h=b[c+1];b=b[c+2];!1!==d&&(g=0+100*g/d,h=a.amin+h*(a.amax-a.amin)/d,b=a.bmin+b*(a.bmax-a.bmin)/
+        d);h=h>a.amax?a.amax:h<a.amin?a.amin:h;b=b>a.bmax?a.bmax:b<a.bmin?a.bmin:b;d=(g+16)/116;g=d-b/200;h=a.XW*na(d+h/500);d=a.YW*na(d);g=a.ZW*na(g);1>a.ZW?(a=3.1339*h+-1.617*d+-0.4906*g,b=-0.9785*h+1.916*d+0.0333*g,h=0.072*h+-0.229*d+1.4057*g):(a=3.2406*h+-1.5372*d+-0.4986*g,b=-0.9689*h+1.8758*d+0.0415*g,h=0.0557*h+-0.204*d+1.057*g);e[f]=0>=a?0:1<=a?255:255*Math.sqrt(a)|0;e[f+1]=0>=b?0:1<=b?255:255*Math.sqrt(b)|0;e[f+2]=0>=h?0:1<=h?255:255*Math.sqrt(h)|0};Va.prototype={getRgb:s.prototype.getRgb,getRgbItem:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           b,c,d){Wa(this,a,b,!1,c,d)},getRgbBuffer:function(a,b,c,d,e,f,g){f=(1<<f)-1;for(var h=0;h<c;h++)Wa(this,a,b,f,d,e),b+=3,e+=3+g},getOutputLength:function(a,b){return a*(3+b)/3|0},isPassthrough:s.prototype.isPassthrough,isDefaultDecode:function(){return!0},usesZeroToOneRange:!1};Ia=Va;var X;X={getSampleArray:function(a,b,c,d){var e,f,g=1;e=0;for(f=a.length;e<f;e++)g*=a[e];g*=b;a=[];f=b=0;var h=1/(Math.pow(2,c)-1);d=d.getBytes((g*c+7)/8);var j=0;for(e=0;e<g;e++){for(;b<c;)f<<=8,f|=d[j++],b+=8;b-=c;a.push((f>>
+        b)*h);f&=(1<<b)-1}return a},getIR:function(a,b){var c=b.dict;c||(c=b);var d=[this.constructSampled,null,this.constructInterpolated,this.constructStiched,this.constructPostScript],e=c.get("FunctionType");(d=d[e])||v("Unknown type of function");return d.call(this,b,c,a)},fromIR:function(a){switch(a[0]){case 0:return this.constructSampledFromIR(a);case 2:return this.constructInterpolatedFromIR(a);case 3:return this.constructStichedFromIR(a);default:return this.constructPostScriptFromIR(a)}},parse:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    b){var c=this.getIR(a,b);return this.fromIR(c)},constructSampled:function(a,b){function c(a){for(var b=a.length,c=[],d=0,e=0;e<b;e+=2)c[d]=[a[e],a[e+1]],++d;return c}var d=b.get("Domain"),e=b.get("Range");(!d||!e)&&v("No domain or range");var f=d.length/2,g=e.length/2,d=c(d),e=c(e),h=b.get("Size"),j=b.get("BitsPerSample"),k=b.get("Order")||1;1!==k&&G("No support for cubic spline interpolation: "+k);k=b.get("Encode");if(!k)for(var k=[],l=0;l<f;++l)k.push(0),k.push(h[l]-1);var k=c(k),l=(l=b.get("Decode"))?
+        c(l):e,p=this.getSampleArray(h,g,j,a);return[0,f,d,k,l,p,h,g,Math.pow(2,j)-1,e]},constructSampledFromIR:function(a){return function(b){var c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],j=a[7],k=a[9];c!=b.length&&v("Incorrect number of arguments: "+c+" != "+b.length);var l=1<<c,p=new Float64Array(l),q=new Uint32Array(l),n,m;for(m=0;m<l;m++)p[m]=1;var r=j,x=1;for(n=0;n<c;++n){m=d[n][0];var w=d[n][1],D=Math.min(Math.max(b[n],m),w),t=e[n][0]+(D-m)*((e[n][1]-e[n][0])/(w-m)),w=h[n],t=Math.min(Math.max(t,0),
+        w-1);m=t<w-1?Math.floor(t):t-1;var D=m+1-t,t=t-m,s=m*r,P=s+r;for(m=0;m<l;m++)m&x?(p[m]*=t,q[m]+=P):(p[m]*=D,q[m]+=s);r*=w;x<<=1}b=new Float64Array(j);for(m=0;m<j;++m){for(n=c=0;n<l;n++)c+=g[q[n]+m]*p[n];c=f[m][0]+(c-0)*((f[m][1]-f[m][0])/1);b[m]=Math.min(Math.max(c,k[m][0]),k[m][1])}return b}},constructInterpolated:function(a,b){var c=b.get("C0")||[0],d=b.get("C1")||[1],e=b.get("N");(!B(c)||!B(d))&&v("Illegal dictionary for interpolated function");for(var f=c.length,g=[],h=0;h<f;++h)g.push(d[h]-c[h]);
+        return[2,c,g,e]},constructInterpolatedFromIR:function(a){var b=a[1],c=a[2],d=a[3],e=c.length;return function(a){a=1==d?a[0]:Math.pow(a[0],d);for(var g=[],h=0;h<e;++h)g.push(b[h]+a*c[h]);return g}},constructStiched:function(a,b,c){(a=b.get("Domain"))||v("No domain");1!=a.length/2&&v("Bad domain for stiched function");for(var d=b.get("Functions"),e=[],f=0,g=d.length;f<g;++f)e.push(X.getIR(c,c.fetchIfRef(d[f])));c=b.get("Bounds");b=b.get("Encode");return[3,a,c,b,e]},constructStichedFromIR:function(a){var b=
+        a[1],c=a[2],d=a[3];a=a[4];for(var e=[],f=0,g=a.length;f<g;f++)e.push(X.fromIR(a[f]));return function(a){a=a[0];var f=b[0],g=b[1];a>g?a=g:a<f&&(a=f);f=0;for(g=c.length;f<g&&!(a<c[f]);++f);g=b[0];0<f&&(g=c[f-1]);var l=b[1];f<c.length&&(l=c[f]);var p=d[2*f];return e[f]([p+(a-g)*(d[2*f+1]-p)/(l-g)])}},constructPostScript:function(a,b){var c=b.get("Domain"),d=b.get("Range");c||v("No domain.");d||v("No range.");var e=new PostScriptLexer(a),e=(new PostScriptParser(e)).parse();return[4,c,d,e]},constructPostScriptFromIR:function(a){var b=
+        a[1],c=a[2],d=c.length/2,e=new Xa(a[3]),f=new Ya;return function(a){for(var h=[],j=0,k=b.length/2;j<k;++j)h.push(a[j]);a=h.join("_");if(f.has(a))return f.get(a);h=e.execute(h);k=[];for(j=d-1;0<=j;--j){var l=h.pop(),p=2*j;l<c[p]?l=c[p]:l>c[p+1]&&(l=c[p+1]);k[j]=l}f.set(a,k);return k}}};var Ya,Za=function(){this.cache={};this.total=0};Za.prototype={has:function(a){return a in this.cache},get:function(a){return this.cache[a]},set:function(a,b){1024>this.total&&(this.cache[a]=b,this.total++)}};Ya=Za;
+    var $a=function(a){this.stack=a||[]};$a.prototype={push:function(a){100<=this.stack.length&&v("PostScript function stack overflow.");this.stack.push(a)},pop:function(){0>=this.stack.length&&v("PostScript function stack underflow.");return this.stack.pop()},copy:function(a){100<=this.stack.length+a&&v("PostScript function stack overflow.");var b=this.stack,c=b.length-a;for(a-=1;0<=a;a--,c++)b.push(b[c])},index:function(a){this.push(this.stack[this.stack.length-a-1])},roll:function(a,b){var c=this.stack,
+        d=c.length-a,e=c.length-1,f=d+(b-Math.floor(b/a)*a),g,h,j;g=d;for(h=e;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j;g=d;for(h=f-1;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j;g=f;for(h=e;g<h;g++,h--)j=c[g],c[g]=c[h],c[h]=j}};var Xa,ab=function(a){this.operators=a};ab.prototype={execute:function(a){a=new $a(a);for(var b=0,c=this.operators,d=c.length,e,f;b<d;)if(e=c[b++],"number"==typeof e)a.push(e);else switch(e){case "jz":f=a.pop();(e=a.pop())||(b=f);break;case "j":b=e=a.pop();break;case "abs":e=a.pop();a.push(Math.abs(e));
+        break;case "add":f=a.pop();e=a.pop();a.push(e+f);break;case "and":f=a.pop();e=a.pop();L(e)&&L(f)?a.push(e&&f):a.push(e&f);break;case "atan":e=a.pop();a.push(Math.atan(e));break;case "bitshift":f=a.pop();e=a.pop();0<e?a.push(e<<f):a.push(e>>f);break;case "ceiling":e=a.pop();a.push(Math.ceil(e));break;case "copy":e=a.pop();a.copy(e);break;case "cos":e=a.pop();a.push(Math.cos(e));break;case "cvi":e=a.pop()|0;a.push(e);break;case "cvr":break;case "div":f=a.pop();e=a.pop();a.push(e/f);break;case "dup":a.copy(1);
+        break;case "eq":f=a.pop();e=a.pop();a.push(e==f);break;case "exch":a.roll(2,1);break;case "exp":f=a.pop();e=a.pop();a.push(Math.pow(e,f));break;case "false":a.push(!1);break;case "floor":e=a.pop();a.push(Math.floor(e));break;case "ge":f=a.pop();e=a.pop();a.push(e>=f);break;case "gt":f=a.pop();e=a.pop();a.push(e>f);break;case "idiv":f=a.pop();e=a.pop();a.push(e/f|0);break;case "index":e=a.pop();a.index(e);break;case "le":f=a.pop();e=a.pop();a.push(e<=f);break;case "ln":e=a.pop();a.push(Math.log(e));
+        break;case "log":e=a.pop();a.push(Math.log(e)/Math.LN10);break;case "lt":f=a.pop();e=a.pop();a.push(e<f);break;case "mod":f=a.pop();e=a.pop();a.push(e%f);break;case "mul":f=a.pop();e=a.pop();a.push(e*f);break;case "ne":f=a.pop();e=a.pop();a.push(e!=f);break;case "neg":a.pop();a.push(-f);break;case "not":e=a.pop();L(e)&&L(f)?a.push(e&&f):a.push(e&f);break;case "or":f=a.pop();e=a.pop();L(e)&&L(f)?a.push(e||f):a.push(e|f);break;case "pop":a.pop();break;case "roll":f=a.pop();e=a.pop();a.roll(e,f);break;
+        case "round":e=a.pop();a.push(Math.round(e));break;case "sin":e=a.pop();a.push(Math.sin(e));break;case "sqrt":e=a.pop();a.push(Math.sqrt(e));break;case "sub":f=a.pop();e=a.pop();a.push(e-f);break;case "true":a.push(!0);break;case "truncate":e=a.pop();e=0>e?Math.ceil(e):Math.floor(e);a.push(e);break;case "xor":f=a.pop();e=a.pop();L(e)&&L(f)?a.push(e!=f):a.push(e^f);break;default:v("Unknown operator "+e)}return a.stack}};Xa=ab;var Lb=["Link","Text","Widget"],C=function(a){if(a.data)this.data=a.data;
+    else{var b=a.dict,c=this.data={};c.subtype=b.get("Subtype").name;var d=b.get("Rect")||[0,0,0,0];c.rect=t.normalizeRect(d);c.annotationFlags=b.get("F");d=b.get("C");c.color=B(d)&&3===d.length?d:[0,0,0];if(b.has("BS"))d=b.get("BS"),c.borderWidth=d.has("W")?d.get("W"):1;else if(d=b.get("Border")||[0,0,1],c.borderWidth=d[2]||0,d=d[3],0<c.borderWidth&&d&&B(d)){var e=d.length;if(0<e){for(var f=!1,g=0,h=0;h<e;h++)if(0<=+d[h])0<d[h]&&g++;else{f=!0;break}if(f||0===g)c.borderWidth=0}}var j;d=b.get("AP");U(d)?
+        (d=d.get("N"),U(d)?(b=b.get("AS"))&&d.has(b.name)&&(j=d.get(b.name)):j=d):j=void 0;this.appearance=j;c.hasAppearance=!!this.appearance;c.id=a.ref.num}};C.prototype={getData:function(){return this.data},hasHtml:function(){return!1},getHtmlElement:function(){throw new W("getHtmlElement() should be implemented in subclass");},getEmptyContainer:function(a,b,c){!V||v("getEmptyContainer() should be called from main thread");c=c||0;b=b||this.data.rect;a=document.createElement(a);a.style.borderWidth=c+"px";
+        var d=b[3]-b[1]-2*c;a.style.width=b[2]-b[0]-2*c+"px";a.style.height=d+"px";return a},isInvisible:function(){var a=this.data;return a&&-1!==Lb.indexOf(a.subtype)?!1:!(!a||!(a.annotationFlags&&a.annotationFlags&1))},isViewable:function(){var a=this.data;return!(this.isInvisible()||!a||a.annotationFlags&&a.annotationFlags&34||!a.rect)},isPrintable:function(){var a=this.data;return!(this.isInvisible()||!a||!a.annotationFlags||!(a.annotationFlags&4&&a.rect))},loadResources:function(a){var b=new N;this.appearance.dict.getAsync("Resources").then(function(c){c?
+        (new ObjectLoader(c.map,a,c.xref)).load().then(function(){b.resolve(c)}):b.resolve()}.bind(this));return b},getOperatorList:function(a){var b=new N;if(!this.appearance)return b.resolve(new OperatorList),b;var c=this.data,d=this.appearance.dict,e=this.loadResources("ExtGState ColorSpace Pattern Shading XObject Font".split(" ")),f=d.get("BBox")||[0,0,1,1],g=d.get("Matrix")||[1,0,0,1,0,0],h;var d=c.rect,j=t.getAxialAlignedBoundingBox(f,g),f=j[0],k=j[1],l=j[2],j=j[3];f===l||k===j?h=[1,0,0,1,d[0],d[1]]:
+        (l=(d[2]-d[0])/(l-f),j=(d[3]-d[1])/(j-k),h=[l,0,0,j,d[0]-f*l,d[1]-k*j]);e.then(function(d){var e=new OperatorList;e.addOp(J.beginAnnotation,[c.rect,h,g]);a.getOperatorList(this.appearance,d,e);e.addOp(J.endAnnotation,[]);b.resolve(e);this.appearance.reset()}.bind(this));return b}};C.getConstructor=function(a,b){if(a){if("Link"===a)return bb;if("Text"===a)return cb;if("Widget"===a){if(b)return"Tx"===b?db:Z}else return C}};C.fromData=function(a){var b=C.getConstructor(a.subtype,a.fieldType);if(b)return new b({data:a})};
+    C.fromRef=function(a,b){var c=a.fetchIfRef(b);if(U(c)){var d=c.get("Subtype");if(d=I(d)?d.name:""){var e=t.getInheritableProperty(c,"FT"),e=I(e)?e.name:"";if(e=C.getConstructor(d,e)){c=new e({dict:c,ref:b});if(c.isViewable()||c.isPrintable())return c;z("unimplemented annotation type: "+d)}}}};C.appendToOperatorList=function(a,b,c,d,e){var f=new N;c=[];for(var g=0,h=a.length;g<h;++g)("display"===e&&a[g].isViewable()||"print"===e&&a[g].isPrintable())&&c.push(a[g].getOperatorList(d));Promise.all(c).then(function(a){b.addOp(J.beginAnnotations,
+        []);for(var c=0,d=a.length;c<d;++c)b.addOpList(a[c]);b.addOp(J.endAnnotations,[]);f.resolve()},function(a){f.reject(a)});return f};PDFJS.Annotation=C;var Z,eb=function(a){C.call(this,a);if(!a.data){var b=a.dict,c=this.data;c.fieldValue=T(t.getInheritableProperty(b,"V")||"");c.alternativeText=T(b.get("TU")||"");c.defaultAppearance=t.getInheritableProperty(b,"DA")||"";var d=t.getInheritableProperty(b,"FT");c.fieldType=I(d)?d.name:"";c.fieldFlags=t.getInheritableProperty(b,"Ff")||0;this.fieldResources=
+        t.getInheritableProperty(b,"DR")||Dict.empty;var d=[],e=b;for(a=a.ref;e;){var b=e.get("Parent"),f=e.getRaw("Parent");if(e=e.get("T"))d.unshift(T(e));else{var e=b.get("Kids"),g,h;g=0;for(h=e.length;g<h;g++){var j=e[g];if(j.num==a.num&&j.gen==a.gen)break}d.unshift("`"+g)}e=b;a=f}c.fullName=d.join(".")}},Mb=C.prototype;t.inherit(eb,C,{isViewable:function(){return"Sig"===this.data.fieldType?(z("unimplemented annotation type: Widget signature"),!1):Mb.isViewable.call(this)}});Z=eb;var db,fb=function(a){Z.call(this,
+        a);a.data||(this.data.textAlignment=t.getInheritableProperty(a.dict,"Q"))};t.inherit(fb,Z,{hasHtml:function(){return!this.data.hasAppearance&&!!this.data.fieldValue},getHtmlElement:function(a){!V||v("getHtmlElement() shall be called from main thread");var b=this.data,c=this.getEmptyContainer("div");c.style.display="table";var d=document.createElement("div");d.textContent=b.fieldValue;d.style.textAlign=["left","center","right"][b.textAlignment];d.style.verticalAlign="middle";d.style.display="table-cell";
+        a=b.fontRefName?a.getData(b.fontRefName):null;var e=d.style;e.fontSize=b.fontSize+"px";e.direction=0>b.fontDirection?"rtl":"ltr";a&&(e.fontWeight=a.black?a.bold?"bolder":"bold":a.bold?"bold":"normal",e.fontStyle=a.italic?"italic":"normal",b=a.loadedName,e.fontFamily=(b?'"'+b+'", ':"")+(a.fallbackName||"Helvetica, sans-serif"));c.appendChild(d);return c},getOperatorList:function(a){if(this.appearance)return C.prototype.getOperatorList.call(this,a);var b=new N,c=new OperatorList,d=this.data,e=d.defaultAppearance;
+        if(!e)return b.resolve(c),b;for(var f=Stream,g=e.length,h=new Uint8Array(g),j=0;j<g;++j)h[j]=e.charCodeAt(j)&255;e=new f(h);a.getOperatorList(e,this.fieldResources,c);a=c.fnArray;e=c.argsArray;d.rgb=[0,0,0];for(f=0;0>f;++f)g=a[f],h=e[f],g===J.setFont?(d.fontRefName=h[0],g=h[1],0>g?(d.fontDirection=-1,d.fontSize=-g):(d.fontDirection=1,d.fontSize=g)):g===J.setFillRGBColor?d.rgb=h:g===J.setFillGray&&(g=255*h[0],d.rgb=[g,g,g]);b.resolve(c);return b}});db=fb;var oa=function(a){C.call(this,a)};t.inherit(oa,
+        C,{hasHtml:function(){return!0},highlight:function(){this.highlightElement&&this.highlightElement.hasAttribute("hidden")&&this.highlightElement.removeAttribute("hidden")},unhighlight:function(){this.highlightElement&&!this.highlightElement.hasAttribute("hidden")&&this.highlightElement.setAttribute("hidden",!0)},initContainer:function(){for(var a=this.data,b=this.getEmptyContainer("section",a.rect,a.borderWidth),c=b.style.backgroundColor=a.color,d=[],e=0;3>e;++e)d[e]=Math.round(255*c[e]);a.colorCssRgb=
+            t.makeCssRgb(d);a=document.createElement("div");a.className="annotationHighlight";a.style.left=a.style.top="-4px";a.style.right=a.style.bottom="-4px";a.setAttribute("hidden",!0);this.highlightElement=a;b.appendChild(this.highlightElement);return b}});var cb,gb=function(a){C.call(this,a);if(!a.data){a=a.dict;var b=this.data,c=a.get("Contents"),d=a.get("T");b.content=T(c||"");b.title=T(d||"");b.hasAppearance?b.name="NoIcon":(b.rect[1]=b.rect[3]-22,b.rect[2]=b.rect[0]+22,b.name=a.has("Name")?a.get("Name").name:
+        "Note");a.has("C")&&(b.hasBgColor=!0)}};t.inherit(gb,oa,{getHtmlElement:function(){!V||v("getHtmlElement() shall be called from main thread");var a=this.data,b=a.rect;10>b[3]-b[1]&&(b[3]=b[1]+10);10>b[2]-b[0]&&(b[2]=b[0]+(b[3]-b[1]));var c=this.initContainer();c.className="annotText";var d=document.createElement("img");d.style.height=c.style.height;d.style.width=c.style.width;var e=a.name;d.src=PDFJS.imageResourcesPath+"annotation-"+e.toLowerCase()+".svg";d.alt="[{{type}} Annotation]";d.dataset.l10nId=
+        "text_annotation_type";d.dataset.l10nArgs=JSON.stringify({type:e});e=document.createElement("div");e.className="annotTextContentWrapper";e.style.left=Math.floor(b[2]-b[0]+5)+"px";e.style.top="-10px";var f=document.createElement("div");f.className="annotTextContent";f.setAttribute("hidden",!0);if(a.hasBgColor){for(var g=a.color,h=[],b=0;3>b;++b){var j=Math.round(255*g[b]);h[b]=Math.round(0.7*(255-j))+j}f.style.backgroundColor=t.makeCssRgb(h)}g=document.createElement("h1");h=document.createElement("p");
+        g.textContent=a.title;if(!a.content&&!a.title)f.setAttribute("hidden",!0);else{for(var j=document.createElement("span"),k=a.content.split(/(?:\r\n?|\n)/),b=0,a=k.length;b<a;++b)j.appendChild(document.createTextNode(k[b])),b<a-1&&j.appendChild(document.createElement("br"));h.appendChild(j);var l=!1,p=function(a){a&&(l=!0);f.hasAttribute("hidden")&&(c.style.zIndex+=1,f.removeAttribute("hidden"))},q=function(a){a&&(l=!1);!f.hasAttribute("hidden")&&!l&&(c.style.zIndex-=1,f.setAttribute("hidden",!0))};
+            d.addEventListener("click",function(){l?q(!0):p(!0)},!1);d.addEventListener("mouseover",function(){p()},!1);d.addEventListener("mouseout",function(){q()},!1);f.addEventListener("click",function(){q(!0)},!1)}f.appendChild(g);f.appendChild(h);e.appendChild(f);c.appendChild(d);c.appendChild(e);return c}});cb=gb;var bb,hb=function(a){C.call(this,a);if(!a.data){var b=a.dict;a=this.data;var c=b.get("A");if(c)if(b=c.get("S").name,"URI"===b){var d=c.get("URI");I(d)?d="/"+d.name:d&&(d=d&&0===d.indexOf("www.")?
+    "http://"+d:d);ea(d,!1)||(d="");a.url=d}else"GoTo"===b?a.dest=c.get("D"):"GoToR"===b?(b=c.get("F"),U(b)&&(d=b.get("F")||""),ea(d,!1)||(d=""),a.url=d,a.dest=c.get("D")):"Named"===b?a.action=c.get("N").name:z("unrecognized link type: "+b);else b.has("Dest")&&(d=b.get("Dest"),a.dest=I(d)?d.name:d)}};t.inherit(hb,oa,{hasOperatorList:function(){return!1},getHtmlElement:function(){var a=this.initContainer();a.className="annotLink";a.style.borderColor=this.data.colorCssRgb;a.style.borderStyle="solid";var b=
+        document.createElement("a");b.href=b.title=this.data.url||"";a.appendChild(b);return a}});bb=hb;PDFJS.maxImageSize=void 0===PDFJS.maxImageSize?-1:PDFJS.maxImageSize;PDFJS.cMapUrl=void 0===PDFJS.cMapUrl?null:PDFJS.cMapUrl;PDFJS.cMapPacked=void 0===PDFJS.cMapPacked?!1:PDFJS.cMapPacked;PDFJS.disableFontFace=void 0===PDFJS.disableFontFace?!1:PDFJS.disableFontFace;PDFJS.imageResourcesPath=void 0===PDFJS.imageResourcesPath?"":PDFJS.imageResourcesPath;PDFJS.disableWorker=void 0===PDFJS.disableWorker?!1:
+        PDFJS.disableWorker;PDFJS.workerSrc=void 0===PDFJS.workerSrc?null:PDFJS.workerSrc;PDFJS.disableRange=void 0===PDFJS.disableRange?!1:PDFJS.disableRange;PDFJS.disableAutoFetch=void 0===PDFJS.disableAutoFetch?!1:PDFJS.disableAutoFetch;PDFJS.pdfBug=void 0===PDFJS.pdfBug?!1:PDFJS.pdfBug;PDFJS.postMessageTransfers=void 0===PDFJS.postMessageTransfers?!0:PDFJS.postMessageTransfers;PDFJS.disableCreateObjectURL=void 0===PDFJS.disableCreateObjectURL?!1:PDFJS.disableCreateObjectURL;PDFJS.disableWebGL=void 0===
+    PDFJS.disableWebGL?!0:PDFJS.disableWebGL;PDFJS.verbosity=void 0===PDFJS.verbosity?PDFJS.VERBOSITY_LEVELS.warnings:PDFJS.verbosity;PDFJS.getDocument=function(a,b,c,d){var e,f;"string"===typeof a?a={url:a}:"object"==typeof a&&null!==a&&void 0!==a&&"byteLength"in a?a={data:a}:"object"!==typeof a&&v("Invalid parameter in getDocument, need either Uint8Array, string or a parameter object");!a.url&&!a.data&&v("Invalid parameter array, need either .data or .url");var g={};for(e in a)g[e]="url"===e&&"undefined"!==
+    typeof window?Gb(window.location.href,a[e]):a[e];a=new PDFJS.LegacyPromise;e=new PDFJS.LegacyPromise;f=new ib(a,e,b,d);a.then(function(){f.passwordCallback=c;f.fetchDocument(g)});return e};var jb=function(a,b){this.pdfInfo=a;this.transport=b};jb.prototype={get numPages(){return this.pdfInfo.numPages},get fingerprint(){return this.pdfInfo.fingerprint},getPage:function(a){return this.transport.getPage(a)},getPageIndex:function(a){return this.transport.getPageIndex(a)},getDestinations:function(){return this.transport.getDestinations()},
+        getAttachments:function(){return this.transport.getAttachments()},getJavaScript:function(){var a=new PDFJS.LegacyPromise;a.resolve(this.pdfInfo.javaScript);return a},getOutline:function(){var a=new PDFJS.LegacyPromise;a.resolve(this.pdfInfo.outline);return a},getMetadata:function(){var a=new PDFJS.LegacyPromise,b=this.pdfInfo.metadata;a.resolve({info:this.pdfInfo.info,metadata:b?new PDFJS.Metadata(b):null});return a},getData:function(){var a=new PDFJS.LegacyPromise;this.transport.getData(a);return a},
+        getDownloadInfo:function(){return this.transport.downloadInfoPromise},cleanup:function(){this.transport.startCleanup()},destroy:function(){this.transport.destroy()}};var kb=function(a,b){this.pageInfo=a;this.transport=b;this.stats=new Ea;this.stats.enabled=!!y.PDFJS.enableStats;this.commonObjs=b.commonObjs;this.objs=new pa;this.pendingDestroy=this.cleanupAfterRender=!1;this.intentStates={}};kb.prototype={get pageNumber(){return this.pageInfo.pageIndex+1},get rotate(){return this.pageInfo.rotate},
+        get ref(){return this.pageInfo.ref},get view(){return this.pageInfo.view},getViewport:function(a,b){2>arguments.length&&(b=this.rotate);return new PDFJS.PageViewport(this.view,a,b,0,0)},getAnnotations:function(){if(this.annotationsPromise)return this.annotationsPromise;var a=new PDFJS.LegacyPromise;this.annotationsPromise=a;this.transport.getAnnotations(this.pageInfo.pageIndex);return a},render:function(a){function b(a){var b=e.renderTasks.indexOf(f);0<=b&&e.renderTasks.splice(b,1);h.cleanupAfterRender&&
+        (h.pendingDestroy=!0);h._tryDestroy();a?g.promise.reject(a):g.promise.resolve();c.timeEnd("Rendering");c.timeEnd("Overall")}var c=this.stats;c.time("Overall");this.pendingDestroy=!1;var d="intent"in a?"print"==a.intent?"print":"display":"display";this.intentStates[d]||(this.intentStates[d]={});var e=this.intentStates[d];e.displayReadyPromise||(e.receivingOperatorList=!0,e.displayReadyPromise=new N,e.operatorList={fnArray:[],argsArray:[],lastChunk:!1},this.stats.time("Page Request"),this.transport.messageHandler.send("RenderPageRequest",
+            {pageIndex:this.pageNumber-1,intent:d}));var f=new lb(b,a,this.objs,this.commonObjs,e.operatorList,this.pageNumber);e.renderTasks||(e.renderTasks=[]);e.renderTasks.push(f);var g=new mb(f),h=this;e.displayReadyPromise.then(function(a){h.pendingDestroy?b():(c.time("Rendering"),f.initalizeGraphics(a),f.operatorListChanged())},function(a){b(a)});return g},getTextContent:function(){var a=new PDFJS.LegacyPromise;this.transport.messageHandler.send("GetTextContent",{pageIndex:this.pageNumber-1},function(b){a.resolve(b)});
+            return a},destroy:function(){this.pendingDestroy=!0;this._tryDestroy()},_tryDestroy:function(){this.pendingDestroy&&!Object.keys(this.intentStates).some(function(a){a=this.intentStates[a];return 0!==a.renderTasks.length||a.receivingOperatorList},this)&&(Object.keys(this.intentStates).forEach(function(a){delete this.intentStates[a]},this),this.objs.clear(),this.pendingDestroy=!1)},_startRenderPage:function(a,b){this.intentStates[b].displayReadyPromise.resolve(a)},_renderPageChunk:function(a,b){var c=
+            this.intentStates[b],d,e;d=0;for(e=a.length;d<e;d++)c.operatorList.fnArray.push(a.fnArray[d]),c.operatorList.argsArray.push(a.argsArray[d]);c.operatorList.lastChunk=a.lastChunk;for(d=0;d<c.renderTasks.length;d++)c.renderTasks[d].operatorListChanged();a.lastChunk&&(c.receivingOperatorList=!1,this._tryDestroy())}};var ib,nb=function(a,b,c,d){this.pdfDataRangeTransport=c;this.workerReadyPromise=b;this.progressCallback=d;this.commonObjs=new pa;this.pageCache=[];this.pagePromises=[];this.downloadInfoPromise=
+        new PDFJS.LegacyPromise;this.passwordCallback=null;if(!y.PDFJS.disableWorker&&"undefined"!==typeof Worker){(b=PDFJS.workerSrc)||v("No PDFJS.workerSrc specified");try{var e=new Worker(b),f=new fa("main",e);this.messageHandler=f;f.on("test",function(b){b&&b.supportTypedArray?(this.worker=e,b.supportTransfers||(PDFJS.postMessageTransfers=!1),this.setupMessageHandler(f),a.resolve()):(y.PDFJS.disableWorker=!0,this.loadFakeWorkerFiles().then(function(){this.setupFakeWorker();a.resolve()}.bind(this)))}.bind(this));
+        var g=new Uint8Array([PDFJS.postMessageTransfers?255:0]);try{f.send("test",g,null,[g.buffer])}catch(h){G("Cannot use postMessage transfers"),g[0]=0,f.send("test",g)}return}catch(j){G("The worker has been disabled.")}}y.PDFJS.disableWorker=!0;this.loadFakeWorkerFiles().then(function(){this.setupFakeWorker();a.resolve()}.bind(this))};nb.prototype={destroy:function(){this.pageCache=[];this.pagePromises=[];var a=this;this.messageHandler.send("Terminate",null,function(){M.clear();a.worker&&a.worker.terminate()})},
+        loadFakeWorkerFiles:function(){PDFJS.fakeWorkerFilesLoadedPromise||(PDFJS.fakeWorkerFilesLoadedPromise=new N,t.loadScript(PDFJS.workerSrc,function(){PDFJS.fakeWorkerFilesLoadedPromise.resolve()}));return PDFJS.fakeWorkerFilesLoadedPromise},setupFakeWorker:function(){z("Setting up fake worker.");var a={postMessage:function(b){a.onmessage({data:b})},terminate:function(){}},b=new fa("main",a);this.setupMessageHandler(b);PDFJS.WorkerMessageHandler.setup(b)},setupMessageHandler:function(a){function b(b){a.send("UpdatePassword",
+            b)}this.messageHandler=a;var c=this.pdfDataRangeTransport;c&&(c.addRangeListener(function(b,c){a.send("OnDataRange",{begin:b,chunk:c})}),c.addProgressListener(function(b){a.send("OnDataProgress",{loaded:b})}),a.on("RequestDataRange",function(a){c.requestDataRange(a.begin,a.end)},this));a.on("GetDoc",function(a){var b=a.pdfInfo;this.numPages=a.pdfInfo.numPages;this.pdfDocument=a=new jb(b,this);this.workerReadyPromise.resolve(a)},this);a.on("NeedPassword",function(a){if(this.passwordCallback)return this.passwordCallback(b,
+            Ba.NEED_PASSWORD);this.workerReadyPromise.reject(a.exception.message,a.exception)},this);a.on("IncorrectPassword",function(a){if(this.passwordCallback)return this.passwordCallback(b,Ba.INCORRECT_PASSWORD);this.workerReadyPromise.reject(a.exception.message,a.exception)},this);a.on("InvalidPDF",function(a){this.workerReadyPromise.reject(a.exception.name,a.exception)},this);a.on("MissingPDF",function(a){this.workerReadyPromise.reject(a.exception.message,a.exception)},this);a.on("UnknownError",function(a){this.workerReadyPromise.reject(a.exception.message,
+            a.exception)},this);a.on("DataLoaded",function(a){this.downloadInfoPromise.resolve(a)},this);a.on("GetPage",function(a){a=a.pageInfo;var b=new kb(a,this);this.pageCache[a.pageIndex]=b;this.pagePromises[a.pageIndex].resolve(b)},this);a.on("GetAnnotations",function(a){this.pageCache[a.pageIndex].annotationsPromise.resolve(a.annotations)},this);a.on("StartRenderPage",function(a){var b=this.pageCache[a.pageIndex];b.stats.timeEnd("Page Request");b._startRenderPage(a.transparency,a.intent)},this);a.on("RenderPageChunk",
+            function(a){this.pageCache[a.pageIndex]._renderPageChunk(a.operatorList,a.intent)},this);a.on("commonobj",function(a){var b=a[0],c=a[1];if(!this.commonObjs.hasData(b))switch(c){case "Font":a=a[2];var g;if("error"in a){var h=a.error;z("Error during font loading: "+h);this.commonObjs.resolve(b,h);break}else g=new ob(a);M.bind([g],function(){this.commonObjs.resolve(b,g)}.bind(this));break;case "FontPath":this.commonObjs.resolve(b,a[2]);break;default:h("Got unknown common object type "+c)}},this);a.on("obj",
+            function(a){var b=a[0],c=a[2],g=this.pageCache[a[1]];if(!g.objs.hasData(b))switch(c){case "JpegStream":a=a[3];var h=g.objs,j=new Image;j.onload=function(){h.resolve(b,j)};j.src=a;break;case "Image":a=a[3];g.objs.resolve(b,a);a&&("data"in a&&8E6<a.data.length)&&(g.cleanupAfterRender=!0);break;default:v("Got unknown object type "+c)}},this);a.on("DocProgress",function(a){this.progressCallback&&this.progressCallback({loaded:a.loaded,total:a.total})},this);a.on("DocError",function(a){this.workerReadyPromise.reject(a)},
+            this);a.on("PageError",function(a,b){var c=this.pageCache[a.pageNum-1].intentStates[b];c.displayReadyPromise?c.displayReadyPromise.reject(a.error):v(a.error)},this);a.on("JpegDecode",function(a,b){var c=a[0],g=a[1];3!=g&&1!=g&&v("Only 3 component or 1 component can be returned");var h=new Image;h.onload=function(){var a=h.width,c=h.height,d=a*c,f=4*d,d=new Uint8Array(d*g),q=ya(a,c).getContext("2d");q.drawImage(h,0,0);var q=q.getImageData(0,0,a,c).data,n,m;if(3==g)for(m=n=0;n<f;n+=4,m+=3)d[m]=q[n],
+            d[m+1]=q[n+1],d[m+2]=q[n+2];else if(1==g)for(m=n=0;n<f;n+=4,m++)d[m]=q[n];b.resolve({data:d,width:a,height:c})}.bind(this);h.src=c})},fetchDocument:function(a){a.disableAutoFetch=PDFJS.disableAutoFetch;a.chunkedViewerLoading=!!this.pdfDataRangeTransport;this.messageHandler.send("GetDocRequest",{source:a,disableRange:PDFJS.disableRange,maxImageSize:PDFJS.maxImageSize,cMapUrl:PDFJS.cMapUrl,cMapPacked:PDFJS.cMapPacked,disableFontFace:PDFJS.disableFontFace,disableCreateObjectURL:PDFJS.disableCreateObjectURL,
+            verbosity:PDFJS.verbosity})},getData:function(a){this.messageHandler.send("GetData",null,function(b){a.resolve(b)})},getPage:function(a,b){if(0>=a||a>this.numPages||(a|0)!==a){var c=new PDFJS.LegacyPromise;c.reject(Error("Invalid page request"));return c}c=a-1;if(c in this.pagePromises)return this.pagePromises[c];b=new PDFJS.LegacyPromise;this.pagePromises[c]=b;this.messageHandler.send("GetPageRequest",{pageIndex:c});return b},getPageIndex:function(a){var b=new PDFJS.LegacyPromise;this.messageHandler.send("GetPageIndex",
+            {ref:a},function(a){b.resolve(a)});return b},getAnnotations:function(a){this.messageHandler.send("GetAnnotationsRequest",{pageIndex:a})},getDestinations:function(){var a=new PDFJS.LegacyPromise;this.messageHandler.send("GetDestinations",null,function(b){a.resolve(b)});return a},getAttachments:function(){var a=new PDFJS.LegacyPromise;this.messageHandler.send("GetAttachments",null,function(b){a.resolve(b)});return a},startCleanup:function(){this.messageHandler.send("Cleanup",null,function(){for(var a=
+            0,b=this.pageCache.length;a<b;a++){var c=this.pageCache[a];c&&c.destroy()}this.commonObjs.clear();M.clear()}.bind(this))}};ib=nb;var pa,pb=function(){this.objs={}};pb.prototype={ensureObj:function(a){if(this.objs[a])return this.objs[a];var b={promise:new N,data:null,resolved:!1};return this.objs[a]=b},get:function(a,b){if(b)return this.ensureObj(a).promise.then(b),null;var c=this.objs[a];(!c||!c.resolved)&&v("Requesting object that isn't resolved yet "+a);return c.data},resolve:function(a,b){var c=
+        this.ensureObj(a);c.resolved=!0;c.data=b;c.promise.resolve(b)},isResolved:function(a){var b=this.objs;return b[a]?b[a].resolved:!1},hasData:function(a){return this.isResolved(a)},getData:function(a){var b=this.objs;return!b[a]||!b[a].resolved?null:b[a].data},clear:function(){this.objs={}}};pa=pb;var mb,qb=function(a){this.internalRenderTask=a;this.promise=new PDFJS.LegacyPromise};qb.prototype={cancel:function(){this.internalRenderTask.cancel();this.promise.reject(Error("Rendering is cancelled"))},
+        then:function(a,b){return this.promise.then(a,b)}};mb=qb;var lb,rb=function(a,b,c,d,e,f){this.callback=a;this.params=b;this.objs=c;this.commonObjs=d;this.operatorListIdx=null;this.operatorList=e;this.pageNumber=f;this.running=!1;this.graphicsReadyCallback=null;this.cancelled=this.graphicsReady=!1};rb.prototype={initalizeGraphics:function(a){if(!this.cancelled){PDFJS.pdfBug&&("StepperManager"in y&&y.StepperManager.enabled)&&(this.stepper=y.StepperManager.create(this.pageNumber-1),this.stepper.init(this.operatorList),
+        this.stepper.nextBreakPoint=this.stepper.getNextBreakPoint());var b=this.params;this.gfx=new qa(b.canvasContext,this.commonObjs,this.objs,b.imageLayer);this.gfx.beginDrawing(b.viewport,a);this.operatorListIdx=0;this.graphicsReady=!0;this.graphicsReadyCallback&&this.graphicsReadyCallback()}},cancel:function(){this.running=!1;this.cancelled=!0;this.callback("cancelled")},operatorListChanged:function(){this.graphicsReady?(this.stepper&&this.stepper.updateOperatorList(this.operatorList),this.running||
+    this._continue()):this.graphicsReadyCallback||(this.graphicsReadyCallback=this._continue.bind(this))},_continue:function(){this.running=!0;this.cancelled||(this.params.continueCallback?this.params.continueCallback(this._next.bind(this)):this._next())},_next:function(){this.cancelled||(this.operatorListIdx=this.gfx.executeOperatorList(this.operatorList,this.operatorListIdx,this._continue.bind(this),this.stepper),this.operatorListIdx===this.operatorList.argsArray.length&&(this.running=!1,this.operatorList.lastChunk&&
+    (this.gfx.endDrawing(),this.callback())))}};lb=rb;var Nb=PDFJS,sb=function(a){"string"===typeof a?(a=a.replace(/>\\376\\377([^<]+)/g,function(a,c){for(var d=c.replace(/\\([0-3])([0-7])([0-7])/g,function(a,b,c,d){return String.fromCharCode(64*b+8*c+1*d)}),e="",f=0;f<d.length;f+=2)var g=256*d.charCodeAt(f)+d.charCodeAt(f+1),e=e+("&#x"+(65536+g).toString(16).substring(1)+";");return">"+e}),a=(new DOMParser).parseFromString(a,"application/xml")):a instanceof Document||v("Metadata: Invalid metadata object");
+        this.metaDocument=a;this.metadata={};this.parse()};sb.prototype={parse:function(){var a=this.metaDocument.documentElement;if("rdf:rdf"!==a.nodeName.toLowerCase())for(a=a.firstChild;a&&"rdf:rdf"!==a.nodeName.toLowerCase();)a=a.nextSibling;var b=a?a.nodeName.toLowerCase():null;if(a&&"rdf:rdf"===b&&a.hasChildNodes()){var a=a.childNodes,c,d,e,f,g,h;e=0;for(g=a.length;e<g;e++)if(b=a[e],"rdf:description"===b.nodeName.toLowerCase()){f=0;for(h=b.childNodes.length;f<h;f++)"#text"!==b.childNodes[f].nodeName.toLowerCase()&&
+    (c=b.childNodes[f],d=c.nodeName.toLowerCase(),this.metadata[d]=c.textContent.trim())}}},get:function(a){return this.metadata[a]||null},has:function(a){return"undefined"!==typeof this.metadata[a]}};Nb.Metadata=sb;var F,$={};F={getCanvas:function(a,b,c,d){a in $?(a=$[a],a.canvas.width=b,a.canvas.height=c,a.context.setTransform(1,0,0,1,0,0)):(b=ya(b,c),c=b.getContext("2d"),d&&za(c),$[a]=a={canvas:b,context:c});return a},clear:function(){$={}}};var ra=function(a){this.alphaIsShape=!1;this.fontSize=0;
+        this.fontSizeScale=1;this.textMatrix=Ca;this.fontMatrix=ha;this.wordSpacing=this.charSpacing=this.lineY=this.lineX=this.y=this.x=this.leading=0;this.textHScale=1;this.textRise=this.textRenderingMode=0;this.fillColorSpace=s.singletons.gray;this.fillColorSpaceObj=null;this.strokeColorSpace=s.singletons.gray;this.strokeColorObj=this.fillColorObj=this.strokeColorSpaceObj=null;this.strokeColor=this.fillColor="#000000";this.lineWidth=this.strokeAlpha=this.fillAlpha=1;this.activeSMask=null;this.old=a};ra.prototype=
+    {clone:function(){return Object.create(this)},setCurrentPoint:function(a,b){this.x=a;this.y=b}};var qa,aa=function(a,b,c,d){this.ctx=a;this.current=new ra;this.stateStack=[];this.pendingClip=null;this.pendingEOFill=!1;this.xobjs=this.res=null;this.commonObjs=b;this.objs=c;this.imageLayer=d;this.groupStack=[];this.baseTransform=this.processingType3=null;this.baseTransformStack=[];this.groupLevel=0;this.smaskStack=[];this.smaskCounter=0;this.tempSMask=null;a&&za(a)},tb=function(a,b){if("undefined"!==
+        typeof ImageData&&b instanceof ImageData)a.putImageData(b,0,0);else{var c=b.height,d=b.width,e=c/16,f=Math.floor(e),e=Math.ceil(e),c=c-16*f,g=a.createImageData(d,16),h=0,j,k=b.data,l=g.data,p,q,n;if(1===b.kind){var m=k.byteLength,l=PDFJS.hasCanvasTypedArrays?new Uint32Array(l.buffer):new ja(l),r=l.length,x=d+7>>3,w=PDFJS.isLittleEndian||!PDFJS.hasCanvasTypedArrays?4278190080:255;for(p=0;p<e;p++){n=p<f?16:c;for(q=j=0;q<n;q++){for(var D=m-h,t=0,D=D>x?d:8*D-7,s=D&-8,P=0,u=0;t<s;t+=8)u=k[h++],l[j++]=
+        u&128?4294967295:w,l[j++]=u&64?4294967295:w,l[j++]=u&32?4294967295:w,l[j++]=u&16?4294967295:w,l[j++]=u&8?4294967295:w,l[j++]=u&4?4294967295:w,l[j++]=u&2?4294967295:w,l[j++]=u&1?4294967295:w;for(;t<D;t++)0===P&&(u=k[h++],P=128),l[j++]=u&P?4294967295:w,P>>=1}for(;j<r;)l[j++]=0;a.putImageData(g,0,16*p)}}else if(3===b.kind)for(p=0;p<e;p++)n=p<f?16:c,d=4*b.width*n,l.set(k.subarray(h,h+d)),h+=d,a.putImageData(g,0,16*p);else if(2===b.kind)for(p=0;p<e;p++){n=p<f?16:c;d=3*b.width*n;for(q=j=0;q<d;q+=3)l[j++]=
+        k[h++],l[j++]=k[h++],l[j++]=k[h++],l[j++]=255;a.putImageData(g,0,16*p)}else v("bad image kind: "+b.kind)}},sa=function(a,b){for(var c=b.height,d=b.width,e=c/16,f=Math.floor(e),e=Math.ceil(e),c=c-16*f,g=a.createImageData(d,16),h=0,j=b.data,k=g.data,l=0;l<e;l++){for(var p=l<f?16:c,q=3,n=0;n<p;n++)for(var m=0,r=0;r<d;r++){if(!m)var x=j[h++],m=128;k[q]=x&m?0:255;q+=4;m>>=1}a.putImageData(g,0,16*l)}},ub=function(a,b){for(var c="strokeStyle fillStyle fillRule globalAlpha lineWidth lineCap lineJoin miterLimit globalCompositeOperation font".split(" "),
+                                                                                                                                                                                                                                                                                                                                                                                                                                                d=0,e=c.length;d<e;d++){var f=c[d];f in a&&(b[f]=a[f])}"setLineDash"in a?(b.setLineDash(a.getLineDash()),b.lineDashOffset=a.lineDashOffset):"mozDash"in a&&(b.mozDash=a.mozDash,b.mozDashOffset=a.mozDashOffset)},Ob=["butt","round","square"],Pb=["miter","round","bevel"],Qb={},vb={};aa.prototype={beginDrawing:function(a,b){var c=this.ctx.canvas.width,d=this.ctx.canvas.height;b?this.ctx.clearRect(0,0,c,d):(this.ctx.mozOpaque=!0,this.ctx.save(),this.ctx.fillStyle="rgb(255, 255, 255)",this.ctx.fillRect(0,
+        0,c,d),this.ctx.restore());c=a.transform;this.ctx.save();this.ctx.transform.apply(this.ctx,c);this.baseTransform=this.ctx.mozCurrentTransform.slice();this.imageLayer&&this.imageLayer.beginLayout()},executeOperatorList:function(a,b,c,d){var e=a.argsArray;a=a.fnArray;b=b||0;var f=e.length;if(f==b)return b;for(var g=Date.now()+15,h=this.commonObjs,j=this.objs,k,l=Promise.resolve();;){if(d&&b===d.nextBreakPoint)return d.breakIt(b,c),b;k=a[b];if(k!==J.dependency)this[k].apply(this,e[b]);else{k=e[b];for(var p=
+        0,q=k.length;p<q;p++){var n=k[p],m="g_"==n.substring(0,2);if(!m&&!j.isResolved(n))return j.get(n,c),b;if(m&&!h.isResolved(n))return h.get(n,c),b}}b++;if(b==f)return b;if(c&&Date.now()>g)return l.then(c),b}},endDrawing:function(){this.ctx.restore();F.clear();R.clear();this.imageLayer&&this.imageLayer.endLayout()},setLineWidth:function(a){this.current.lineWidth=a;this.ctx.lineWidth=a},setLineCap:function(a){this.ctx.lineCap=Ob[a]},setLineJoin:function(a){this.ctx.lineJoin=Pb[a]},setMiterLimit:function(a){this.ctx.miterLimit=
+        a},setDash:function(a,b){var c=this.ctx;"setLineDash"in c?(c.setLineDash(a),c.lineDashOffset=b):(c.mozDash=a,c.mozDashOffset=b)},setRenderingIntent:function(){},setFlatness:function(){},setGState:function(a){for(var b=0,c=a.length;b<c;b++){var d=a[b],e=d[1];switch(d[0]){case "LW":this.setLineWidth(e);break;case "LC":this.setLineCap(e);break;case "LJ":this.setLineJoin(e);break;case "ML":this.setMiterLimit(e);break;case "D":this.setDash(e[0],e[1]);break;case "RI":this.setRenderingIntent(e);break;case "FL":this.setFlatness(e);
+        break;case "Font":this.setFont(e[0],e[1]);break;case "CA":this.current.strokeAlpha=d[1];break;case "ca":this.current.fillAlpha=d[1];this.ctx.globalAlpha=d[1];break;case "BM":e&&e.name&&"Normal"!==e.name?(d=e.name.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()}).substring(1),this.ctx.globalCompositeOperation=d,this.ctx.globalCompositeOperation!==d&&z('globalCompositeOperation "'+d+'" is not supported')):this.ctx.globalCompositeOperation="source-over";break;case "SMask":this.current.activeSMask&&
+    this.endSMaskGroup(),this.current.activeSMask=e?this.tempSMask:null,this.current.activeSMask&&this.beginSMaskGroup(),this.tempSMask=null}}},beginSMaskGroup:function(){var a=this.current.activeSMask,b=F.getCanvas("smaskGroupAt"+this.groupLevel,a.canvas.width,a.canvas.height,!0),c=this.ctx,d=c.mozCurrentTransform;this.ctx.save();b=b.context;b.scale(1/a.scaleX,1/a.scaleY);b.translate(-a.offsetX,-a.offsetY);b.transform.apply(b,d);ub(c,b);this.ctx=b;this.setGState([["BM","Normal"],["ca",1],["CA",1]]);
+        this.groupStack.push(c);this.groupLevel++},endSMaskGroup:function(){var a=this.ctx;this.groupLevel--;var b=this.ctx=this.groupStack.pop(),c=this.current.activeSMask,d=c.canvas,e=c.context;b.setTransform(c.scaleX,0,0,c.scaleY,c.offsetX,c.offsetY);var f;c.backdrop&&(f=(c.colorSpace||s.singletons.rgb).getRgb(c.backdrop,0));if(R.isEnabled)a=R.composeSMask(a.canvas,d,{subtype:c.subtype,backdrop:f}),b.setTransform(1,0,0,1,0,0),b.drawImage(a,c.offsetX,c.offsetY);else{var g=d.width,h=d.height,j=c.subtype,
+        c=(c=f)?function(a,b,c,d){for(var e=d.length,f=3;f<e;f+=4){var g=d[f]/255;if(0===g)d[f-3]=a,d[f-2]=b,d[f-1]=c;else if(1>g){var h=1-g;d[f-3]=d[f-3]*g+a*h|0;d[f-2]=d[f-2]*g+b*h|0;d[f-1]=d[f-1]*g+c*h|0}}}.bind(null,c[0],c[1],c[2]):function(){},j="Luminosity"===j?function(a,b){for(var c=a.length,d=3;d<c;d+=4)b[d]=b[d]*(77*a[d-3]+152*a[d-2]+28*a[d-1]|0)>>16}:function(a,b){for(var c=a.length,d=3;d<c;d+=4)b[d]=b[d]*a[d]/255|0};f=Math.min(h,Math.ceil(65536/g));for(var k=0;k<h;k+=f){var l=Math.min(f,h-k),
+        p=e.getImageData(0,k,g,l),l=a.getImageData(0,k,g,l);c(p.data);j(p.data,l.data);e.putImageData(l,0,k)}b.drawImage(d,0,0)}this.ctx.restore()},save:function(){this.ctx.save();var a=this.current;this.stateStack.push(a);this.current=a.clone();this.current.activeSMask&&(this.current.activeSMask=null)},restore:function(){var a=this.stateStack.pop();a&&(this.current.activeSMask&&this.endSMaskGroup(),this.current=a,this.ctx.restore())},transform:function(a,b,c,d,e,f){this.ctx.transform(a,b,c,d,e,f)},moveTo:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        b){this.ctx.moveTo(a,b);this.current.setCurrentPoint(a,b)},lineTo:function(a,b){this.ctx.lineTo(a,b);this.current.setCurrentPoint(a,b)},curveTo:function(a,b,c,d,e,f){this.ctx.bezierCurveTo(a,b,c,d,e,f);this.current.setCurrentPoint(e,f)},curveTo2:function(a,b,c,d){var e=this.current;this.ctx.bezierCurveTo(e.x,e.y,a,b,c,d);e.setCurrentPoint(c,d)},curveTo3:function(a,b,c,d){this.curveTo(a,b,c,d,c,d);this.current.setCurrentPoint(c,d)},closePath:function(){this.ctx.closePath()},rectangle:function(a,b,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         c,d){0===c&&(c=this.getSinglePixelWidth());0===d&&(d=this.getSinglePixelWidth());this.ctx.rect(a,b,c,d)},stroke:function(a){a="undefined"!==typeof a?a:!0;var b=this.ctx,c=this.current.strokeColor;0===this.current.lineWidth&&(b.lineWidth=this.getSinglePixelWidth());b.globalAlpha=this.current.strokeAlpha;c&&c.hasOwnProperty("type")&&"Pattern"===c.type?(b.save(),b.strokeStyle=c.getPattern(b,this),b.stroke(),b.restore()):b.stroke();a&&this.consumePath();b.globalAlpha=this.current.fillAlpha},closeStroke:function(){this.closePath();
+        this.stroke()},fill:function(a){a="undefined"!==typeof a?a:!0;var b=this.ctx,c=this.current.fillColor,d=!1;c&&(c.hasOwnProperty("type")&&"Pattern"===c.type)&&(b.save(),b.fillStyle=c.getPattern(b,this),d=!0);if(this.pendingEOFill){if("mozFillRule"in this.ctx)this.ctx.mozFillRule="evenodd",this.ctx.fill(),this.ctx.mozFillRule="nonzero";else try{this.ctx.fill("evenodd")}catch(e){this.ctx.fill()}this.pendingEOFill=!1}else this.ctx.fill();d&&b.restore();a&&this.consumePath()},eoFill:function(){this.pendingEOFill=
+        !0;this.fill()},fillStroke:function(){this.fill(!1);this.stroke(!1);this.consumePath()},eoFillStroke:function(){this.pendingEOFill=!0;this.fillStroke()},closeFillStroke:function(){this.closePath();this.fillStroke()},closeEOFillStroke:function(){this.pendingEOFill=!0;this.closePath();this.fillStroke()},endPath:function(){this.consumePath()},clip:function(){this.pendingClip=Qb},eoClip:function(){this.pendingClip=vb},beginText:function(){this.current.textMatrix=Ca;this.current.x=this.current.lineX=0;
+        this.current.y=this.current.lineY=0},endText:function(){if("pendingTextPaths"in this){var a=this.pendingTextPaths,b=this.ctx;b.save();b.beginPath();for(var c=0;c<a.length;c++){var d=a[c];b.setTransform.apply(b,d.transform);b.translate(d.x,d.y);d.addToPath(b,d.fontSize)}b.restore();b.clip();b.beginPath();delete this.pendingTextPaths}else this.ctx.beginPath()},setCharSpacing:function(a){this.current.charSpacing=a},setWordSpacing:function(a){this.current.wordSpacing=a},setHScale:function(a){this.current.textHScale=
+        a/100},setLeading:function(a){this.current.leading=-a},setFont:function(a,b){var c=this.commonObjs.get(a),d=this.current;c||v("Can't find font for "+a);d.fontMatrix=c.fontMatrix?c.fontMatrix:ha;(0===d.fontMatrix[0]||0===d.fontMatrix[3])&&z("Invalid font matrix for font "+a);0>b?(b=-b,d.fontDirection=-1):d.fontDirection=1;this.current.font=c;this.current.fontSize=b;if(!c.coded){var d=c.black?c.bold?"bolder":"bold":c.bold?"bold":"normal",e=c.italic?"italic":"normal",c='"'+(c.loadedName||"sans-serif")+
+        '", '+c.fallbackName,f=16<=b?b:16;this.current.fontSizeScale=16!=f?1:b/16;this.ctx.font=e+" "+d+" "+f+"px "+c}},setTextRenderingMode:function(a){this.current.textRenderingMode=a},setTextRise:function(a){this.current.textRise=a},moveText:function(a,b){this.current.x=this.current.lineX+=a;this.current.y=this.current.lineY+=b},setLeadingMoveText:function(a,b){this.setLeading(-b);this.moveText(a,b)},setTextMatrix:function(a,b,c,d,e,f){this.current.textMatrix=[a,b,c,d,e,f];this.current.x=this.current.lineX=
+        0;this.current.y=this.current.lineY=0},nextLine:function(){this.moveText(0,this.current.leading)},applyTextTransforms:function(){var a=this.ctx,b=this.current;a.transform.apply(a,b.textMatrix);a.translate(b.x,b.y+b.textRise);0<b.fontDirection?a.scale(b.textHScale,-1):a.scale(-b.textHScale,1)},paintChar:function(a,b,c){var d=this.ctx,e=this.current,f=e.font,g=e.fontSize/e.fontSizeScale,h=e.textRenderingMode,e=h&3,h=!!(h&4),j;if(f.disableFontFace||h)j=f.getPathGenerator(this.commonObjs,a);f.disableFontFace?
+        (d.save(),d.translate(b,c),d.beginPath(),j(d,g),(0===e||2===e)&&d.fill(),(1===e||2===e)&&d.stroke(),d.restore()):((0===e||2===e)&&d.fillText(a,b,c),(1===e||2===e)&&d.strokeText(a,b,c));h&&(this.pendingTextPaths||(this.pendingTextPaths=[])).push({transform:d.mozCurrentTransform,x:b,y:c,fontSize:g,addToPath:j})},get isFontSubpixelAAEnabled(){var a=document.createElement("canvas").getContext("2d");a.scale(1.5,1);a.fillText("I",0,10);for(var a=a.getImageData(0,0,10,10).data,b=!1,c=3;c<a.length;c+=4)if(0<
+        a[c]&&255>a[c]){b=!0;break}return K(this,"isFontSubpixelAAEnabled",b)},showText:function(a){var b=this.ctx,c=this.current,d=c.font,e=c.fontSize,f=c.fontSizeScale,g=c.charSpacing,h=c.wordSpacing,j=c.textHScale*c.fontDirection,k=c.fontMatrix||ha,l=a.length,p=d.vertical,q=d.defaultVMetrics,n,m,r;if(0!==e)if(d.coded){b.save();b.transform.apply(b,c.textMatrix);b.translate(c.x,c.y);b.scale(j,1);for(n=0;n<l;++n)m=a[n],null===m?(this.ctx.translate(h,0),c.x+=h*j):(this.processingType3=m,this.save(),b.scale(e,
+        e),b.transform.apply(b,k),this.executeOperatorList(m.operatorList),this.restore(),r=(t.applyTransform([m.width,0],k)[0]*e+g)*c.fontDirection,b.translate(r,0),c.x+=r*j);b.restore();this.processingType3=null}else{b.save();this.applyTextTransforms();n=c.lineWidth;var k=c.textMatrix[0],x=c.textMatrix[1],k=Math.sqrt(k*k+x*x);n=0===k||0===n?this.getSinglePixelWidth():n/k;1!=f&&(b.scale(f,f),n/=f);b.lineWidth=n;for(n=k=0;n<l;++n)if(m=a[n],null===m)k+=c.fontDirection*h;else{var x=!1,w=m.fontChar,D=m.vmetric||
+        q;if(p)var v=m.vmetric?D[1]:0.5*m.width,v=-v*e*c.fontMatrix[0],s=D[2]*e*c.fontMatrix[0];r=D?-D[0]:m.width;D=r*e*c.fontMatrix[0]+g*c.fontDirection;m=m.accent;var u,y,z;p?(u=v/f,y=(k+s)/f):(u=k/f,y=0);d.remeasure&&(0<r&&this.isFontSubpixelAAEnabled)&&(x=1E3*b.measureText(w).width/c.fontSize*c.fontSizeScale,r/=x,x=!0,b.save(),b.scale(r,1),u/=r,m&&(z/=r));this.paintChar(w,u,y);m&&(z=u+m.offset.x/f,w=y-m.offset.y/f,this.paintChar(m.fontChar,z,w));k+=D;x&&b.restore()}p?c.y-=k*j:c.x+=k*j;b.restore()}},showSpacedText:function(a){for(var b=
+        this.current,c=b.fontSize,d=0.001*b.textHScale*b.fontDirection,e=a.length,f=b.font.vertical,g=0;g<e;++g){var h=a[g];"number"==typeof h?(h=-h*c*d,f?b.y+=h:b.x+=h):this.showText(h)}},nextLineShowText:function(a){this.nextLine();this.showText(a)},nextLineSetSpacingShowText:function(a,b,c){this.setWordSpacing(a);this.setCharSpacing(b);this.nextLineShowText(c)},setCharWidth:function(){},setCharWidthAndBounds:function(a,b,c,d,e,f){this.rectangle(c,d,e-c,f-d);this.clip();this.endPath()},setStrokeColorSpace:function(a){this.current.strokeColorSpace=
+        s.fromIR(a)},setFillColorSpace:function(a){this.current.fillColorSpace=s.fromIR(a)},setStrokeColor:function(){var a=this.current.strokeColorSpace.getRgb(arguments,0),a=t.makeCssRgb(a);this.ctx.strokeStyle=a;this.current.strokeColor=a},getColorN_Pattern:function(a,b){var c;if("TilingPattern"==a[0]){c=a[1];var d=b.base,e;d&&(e=d.getRgb(c,0));c=new wb(a,e,this.ctx,this.objs,this.commonObjs,this.baseTransform)}else c=Aa(a);return c},setStrokeColorN:function(){var a=this.current.strokeColorSpace;"Pattern"==
+    a.name?this.current.strokeColor=this.getColorN_Pattern(arguments,a):this.setStrokeColor.apply(this,arguments)},setFillColor:function(){var a=this.current.fillColorSpace.getRgb(arguments,0),a=t.makeCssRgb(a);this.ctx.fillStyle=a;this.current.fillColor=a},setFillColorN:function(){var a=this.current.fillColorSpace;"Pattern"==a.name?this.current.fillColor=this.getColorN_Pattern(arguments,a):this.setFillColor.apply(this,arguments)},setStrokeGray:function(a){this.current.strokeColorSpace=s.singletons.gray;
+        var b=this.current.strokeColorSpace.getRgb(arguments,0),b=t.makeCssRgb(b);this.ctx.strokeStyle=b;this.current.strokeColor=b},setFillGray:function(a){this.current.fillColorSpace=s.singletons.gray;var b=this.current.fillColorSpace.getRgb(arguments,0),b=t.makeCssRgb(b);this.ctx.fillStyle=b;this.current.fillColor=b},setStrokeRGBColor:function(a,b,c){this.current.strokeColorSpace=s.singletons.rgb;var d=this.current.strokeColorSpace.getRgb(arguments,0),d=t.makeCssRgb(d);this.ctx.strokeStyle=d;this.current.strokeColor=
+        d},setFillRGBColor:function(a,b,c){this.current.fillColorSpace=s.singletons.rgb;var d=this.current.fillColorSpace.getRgb(arguments,0),d=t.makeCssRgb(d);this.ctx.fillStyle=d;this.current.fillColor=d},setStrokeCMYKColor:function(a,b,c,d){this.current.strokeColorSpace=s.singletons.cmyk;var e=t.makeCssCmyk(arguments);this.ctx.strokeStyle=e;this.current.strokeColor=e},setFillCMYKColor:function(a,b,c,d){this.current.fillColorSpace=s.singletons.cmyk;var e=t.makeCssCmyk(arguments);this.ctx.fillStyle=e;this.current.fillColor=
+        e},shadingFill:function(a){var b=this.ctx;this.save();a=Aa(a);b.fillStyle=a.getPattern(b,this,!0);var c=b.mozCurrentTransformInverse;if(c){var b=b.canvas,d=b.width,e=b.height,b=t.applyTransform([0,0],c);a=t.applyTransform([0,e],c);var f=t.applyTransform([d,0],c),g=t.applyTransform([d,e],c),c=Math.min(b[0],a[0],f[0],g[0]),d=Math.min(b[1],a[1],f[1],g[1]),e=Math.max(b[0],a[0],f[0],g[0]),b=Math.max(b[1],a[1],f[1],g[1]);this.ctx.fillRect(c,d,e-c,b-d)}else this.ctx.fillRect(-1E10,-1E10,2E10,2E10);this.restore()},
+        beginInlineImage:function(){v("Should not call beginInlineImage")},beginImageData:function(){v("Should not call beginImageData")},paintFormXObjectBegin:function(a,b){this.save();this.baseTransformStack.push(this.baseTransform);a&&(B(a)&&6==a.length)&&this.transform.apply(this,a);this.baseTransform=this.ctx.mozCurrentTransform;b&&(B(b)&&4==b.length)&&(this.rectangle(b[0],b[1],b[2]-b[0],b[3]-b[1]),this.clip(),this.endPath())},paintFormXObjectEnd:function(){this.restore();this.baseTransform=this.baseTransformStack.pop()},
+        beginGroup:function(a){this.save();var b=this.ctx;a.isolated||G("TODO: Support non-isolated groups.");a.knockout&&z("Knockout groups not supported.");var c=b.mozCurrentTransform;a.matrix&&b.transform.apply(b,a.matrix);a.bbox||v("Bounding box is required.");var d=t.getAxialAlignedBoundingBox(a.bbox,b.mozCurrentTransform),d=t.intersect(d,[0,0,b.canvas.width,b.canvas.height])||[0,0,0,0],e=Math.floor(d[0]),f=Math.floor(d[1]),g=Math.max(Math.ceil(d[2])-e,1),h=Math.max(Math.ceil(d[3])-f,1),j=d=1;4096<g&&
+        (d=g/4096,g=4096);4096<h&&(j=h/4096,h=4096);var k="groupAt"+this.groupLevel;a.smask&&(k+="_smask_"+this.smaskCounter++%2);g=F.getCanvas(k,g,h,!0);h=g.context;h.scale(1/d,1/j);h.translate(-e,-f);h.transform.apply(h,c);a.smask?this.smaskStack.push({canvas:g.canvas,context:h,offsetX:e,offsetY:f,scaleX:d,scaleY:j,subtype:a.smask.subtype,backdrop:a.smask.backdrop,colorSpace:a.colorSpace&&s.fromIR(a.colorSpace)}):(b.setTransform(1,0,0,1,0,0),b.translate(e,f),b.scale(d,j));ub(b,h);this.ctx=h;this.setGState([["BM",
+            "Normal"],["ca",1],["CA",1]]);this.groupStack.push(b);this.groupLevel++},endGroup:function(a){this.groupLevel--;var b=this.ctx;this.ctx=this.groupStack.pop();"imageSmoothingEnabled"in this.ctx?this.ctx.imageSmoothingEnabled=!1:this.ctx.mozImageSmoothingEnabled=!1;a.smask?this.tempSMask=this.smaskStack.pop():this.ctx.drawImage(b.canvas,0,0);this.restore()},beginAnnotations:function(){this.save();this.current=new ra},endAnnotations:function(){this.restore()},beginAnnotation:function(a,b,c){this.save();
+            a&&(B(a)&&4==a.length)&&(this.rectangle(a[0],a[1],a[2]-a[0],a[3]-a[1]),this.clip(),this.endPath());this.transform.apply(this,b);this.transform.apply(this,c)},endAnnotation:function(){this.restore()},paintJpegXObject:function(a,b,c){var d=this.objs.get(a);if(d){this.save();var e=this.ctx;e.scale(1/b,-1/c);e.drawImage(d,0,0,d.width,d.height,0,-c,b,c);this.imageLayer&&(d=e.mozCurrentTransformInverse,e=this.getCanvasPosition(0,0),this.imageLayer.appendImage({objId:a,left:e[0],top:e[1],width:b/d[0],height:c/
+        d[3]}));this.restore()}else z("Dependent image isn't ready yet")},paintImageMaskXObject:function(a){var b=this.ctx,c=a.width,d=a.height,e=this.processingType3;if(e&&!("compiled"in e)){var f;if(1E3>=c&&1E3>=d)a:{var g=a.data,h,j,k=c+1,l=new Uint8Array(k*(d+1)),p=new Uint8Array([0,2,4,0,1,0,5,4,8,10,0,8,0,2,1,0]),q=c+7&-8,n=new Uint8Array(q*d),m=0;f=0;for(h=g.length;f<h;f++){j=128;for(var r=g[f];0<j;)n[m++]=r&j?0:255,j>>=1}m=g=0;0!==n[m]&&(l[0]=1,++g);for(h=1;h<c;h++)n[m]!==n[m+1]&&(l[h]=n[m]?2:1,++g),
+            m++;0!==n[m]&&(l[h]=2,++g);for(f=1;f<d;f++){m=f*q;j=f*k;n[m-q]!==n[m]&&(l[j]=n[m]?1:8,++g);r=(n[m]?4:0)+(n[m-q]?8:0);for(h=1;h<c;h++)r=(r>>2)+(n[m+1]?4:0)+(n[m-q+1]?8:0),p[r]&&(l[j+h]=p[r],++g),m++;n[m-q]!==n[m]&&(l[j+h]=n[m]?2:4,++g);if(1E3<g){f=null;break a}}m=q*(d-1);j=f*k;0!==n[m]&&(l[j]=8,++g);for(h=1;h<c;h++)n[m]!==n[m+1]&&(l[j+h]=n[m]?4:8,++g),m++;0!==n[m]&&(l[j+h]=4,++g);if(1E3<g)f=null;else{var p=new Int32Array([0,k,-1,0,-k,0,0,0,1]),x=[];for(f=0;g&&f<=d;f++){q=f*k;for(n=q+c;q<n&&!l[q];)q++;
+            if(q!==n){n=[q%k,f];m=l[q];h=q;do{j=p[m];do q+=j;while(!l[q]);j=l[q];5!==j&&10!==j?(m=j,l[q]=0):(m=j&51*m>>4,l[q]&=m>>2|m<<2);n.push(q%k);n.push(q/k|0);--g}while(h!==q);x.push(n);--f}}f=function(a){a.save();a.scale(1/c,-1/d);a.translate(0,-d);a.beginPath();for(var b=0,e=x.length;b<e;b++){var f=x[b];a.moveTo(f[0],f[1]);for(var g=2,h=f.length;g<h;g+=2)a.lineTo(f[g],f[g+1])}a.fill();a.beginPath();a.restore()}}}else f=null;e.compiled=f}e&&e.compiled?e.compiled(b):(b=F.getCanvas("maskCanvas",c,d),e=b.context,
+            e.save(),sa(e,a),e.globalCompositeOperation="source-in",a=this.current.fillColor,e.fillStyle=a&&a.hasOwnProperty("type")&&"Pattern"===a.type?a.getPattern(e,this):a,e.fillRect(0,0,c,d),e.restore(),this.paintInlineImageXObject(b.canvas))},paintImageMaskXObjectRepeat:function(a,b,c,d){var e=a.width,f=a.height,g=this.ctx,h=F.getCanvas("maskCanvas",e,f),j=h.context;j.save();sa(j,a);j.globalCompositeOperation="source-in";a=this.current.fillColor;j.fillStyle=a&&a.hasOwnProperty("type")&&"Pattern"===a.type?
+            a.getPattern(j,this):a;j.fillRect(0,0,e,f);j.restore();j=0;for(a=d.length;j<a;j+=2)g.save(),g.transform(b,0,0,c,d[j],d[j+1]),g.scale(1,-1),g.drawImage(h.canvas,0,0,e,f,0,-1,1,1),g.restore()},paintImageMaskXObjectGroup:function(a){for(var b=this.ctx,c=0,d=a.length;c<d;c++){var e=a[c],f=e.width,g=e.height,h=F.getCanvas("maskCanvas",f,g),j=h.context;j.save();sa(j,e);j.globalCompositeOperation="source-in";var k=this.current.fillColor;j.fillStyle=k&&k.hasOwnProperty("type")&&"Pattern"===k.type?k.getPattern(j,
+            this):k;j.fillRect(0,0,f,g);j.restore();b.save();b.transform.apply(b,e.transform);b.scale(1,-1);b.drawImage(h.canvas,0,0,f,g,0,-1,1,1);b.restore()}},paintImageXObject:function(a){(a=this.objs.get(a))?this.paintInlineImageXObject(a):z("Dependent image isn't ready yet")},paintImageXObjectRepeat:function(a,b,c,d){if(a=this.objs.get(a)){for(var e=a.width,f=a.height,g=[],h=0,j=d.length;h<j;h+=2)g.push({transform:[b,0,0,c,d[h],d[h+1]],x:0,y:0,w:e,h:f});this.paintInlineImageXObjectGroup(a,g)}else z("Dependent image isn't ready yet")},
+        paintInlineImageXObject:function(a){var b=a.width,c=a.height,d=this.ctx;this.save();d.scale(1/b,-1/c);var e=d.mozCurrentTransformInverse,f=e[0],g=e[1],f=Math.max(Math.sqrt(f*f+g*g),1),g=e[2],h=e[3],g=Math.max(Math.sqrt(g*g+h*h),1),j;if(a instanceof HTMLElement||!a.data)h=a;else{j=F.getCanvas("inlineImage",b,c);var k=j.context;tb(k,a);h=j.canvas}for(var l=b,p=c,q="prescale1";2<f&&1<l||2<g&&1<p;){var n=l,m=p;2<f&&1<l&&(n=Math.ceil(l/2),f/=l/n);2<g&&1<p&&(m=Math.ceil(p/2),g/=p/m);j=F.getCanvas(q,n,m);
+            k=j.context;k.clearRect(0,0,n,m);k.drawImage(h,0,0,l,p,0,0,n,m);h=j.canvas;l=n;p=m;q="prescale1"===q?"prescale2":"prescale1"}d.drawImage(h,0,0,l,p,0,-c,b,c);this.imageLayer&&(d=this.getCanvasPosition(0,-c),this.imageLayer.appendImage({imgData:a,left:d[0],top:d[1],width:b/e[0],height:c/e[3]}));this.restore()},paintInlineImageXObjectGroup:function(a,b){var c=this.ctx,d=a.width,e=a.height,f=F.getCanvas("inlineImage",d,e);tb(f.context,a);for(var g=0,h=b.length;g<h;g++){var j=b[g];c.save();c.transform.apply(c,
+            j.transform);c.scale(1,-1);c.drawImage(f.canvas,j.x,j.y,j.w,j.h,0,-1,1,1);this.imageLayer&&(j=this.getCanvasPosition(j.x,j.y),this.imageLayer.appendImage({imgData:a,left:j[0],top:j[1],width:d,height:e}));c.restore()}},paintSolidColorImageMask:function(){this.ctx.fillRect(0,0,1,1)},markPoint:function(){},markPointProps:function(){},beginMarkedContent:function(){},beginMarkedContentProps:function(){},endMarkedContent:function(){},beginCompat:function(){},endCompat:function(){},consumePath:function(){if(this.pendingClip){if(this.pendingClip==
+            vb)if("mozFillRule"in this.ctx)this.ctx.mozFillRule="evenodd",this.ctx.clip(),this.ctx.mozFillRule="nonzero";else try{this.ctx.clip("evenodd")}catch(a){this.ctx.clip()}else this.ctx.clip();this.pendingClip=null}this.ctx.beginPath()},getSinglePixelWidth:function(){var a=this.ctx.mozCurrentTransformInverse;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1],a[2]*a[2]+a[3]*a[3]))},getCanvasPosition:function(a,b){var c=this.ctx.mozCurrentTransform;return[c[0]*a+c[2]*b+c[4],c[1]*a+c[3]*b+c[5]]}};for(var xb in J)aa.prototype[J[xb]]=
+        aa.prototype[xb];qa=aa;var R,ba=function(a,b,c){c=a.createShader(c);a.shaderSource(c,b);a.compileShader(c);if(!a.getShaderParameter(c,a.COMPILE_STATUS))throw a=a.getShaderInfoLog(c),Error("Error during shader compilation: "+a);return c},yb=function(a,b){for(var c=a.createProgram(),d=0,e=b.length;d<e;++d)a.attachShader(c,b[d]);a.linkProgram(c);if(!a.getProgramParameter(c,a.LINK_STATUS))throw c=a.getProgramInfoLog(c),Error("Error during program linking: "+c);return c},zb=function(a,b,c){a.activeTexture(c);
+        c=a.createTexture();a.bindTexture(a.TEXTURE_2D,c);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST);a.texImage2D(a.TEXTURE_2D,0,a.RGBA,a.RGBA,a.UNSIGNED_BYTE,b);return c},ta=function(){Q||(S=document.createElement("canvas"),Q=S.getContext("webgl",{premultipliedalpha:!1}))},Q,S,ca=null,da=null;R={get isEnabled(){if(PDFJS.disableWebGL)return!1;
+        var a=!1;try{ta(),a=!!Q}catch(b){}return K(this,"isEnabled",a)},composeSMask:function(a,b,c){var d=a.width,e=a.height;if(!ca){var f,g;ta();f=S;S=null;g=Q;Q=null;var h=ba(g,"  attribute vec2 a_position;                                      attribute vec2 a_texCoord;                                                                                                      uniform vec2 u_resolution;                                                                                                      varying vec2 v_texCoord;                                                                                                        void main() {                                                     vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;       gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);                                                                              v_texCoord = a_texCoord;                                      }                                                             ",
+        g.VERTEX_SHADER),j=ba(g,"  precision mediump float;                                                                                                        uniform vec4 u_backdrop;                                        uniform int u_subtype;                                          uniform sampler2D u_image;                                      uniform sampler2D u_mask;                                                                                                       varying vec2 v_texCoord;                                                                                                        void main() {                                                     vec4 imageColor = texture2D(u_image, v_texCoord);               vec4 maskColor = texture2D(u_mask, v_texCoord);                 if (u_backdrop.a > 0.0) {                                         maskColor.rgb = maskColor.rgb * maskColor.a +                                   u_backdrop.rgb * (1.0 - maskColor.a);         }                                                               float lum;                                                      if (u_subtype == 0) {                                             lum = maskColor.a;                                            } else {                                                          lum = maskColor.r * 0.3 + maskColor.g * 0.59 +                        maskColor.b * 0.11;                                     }                                                               imageColor.a *= lum;                                            imageColor.rgb *= imageColor.a;                                 gl_FragColor = imageColor;                                    }                                                             ",
+        g.FRAGMENT_SHADER),k=yb(g,[h,j]);g.useProgram(k);h={};h.gl=g;h.canvas=f;h.resolutionLocation=g.getUniformLocation(k,"u_resolution");h.positionLocation=g.getAttribLocation(k,"a_position");h.backdropLocation=g.getUniformLocation(k,"u_backdrop");h.subtypeLocation=g.getUniformLocation(k,"u_subtype");f=g.getAttribLocation(k,"a_texCoord");var j=g.getUniformLocation(k,"u_image"),k=g.getUniformLocation(k,"u_mask"),l=g.createBuffer();g.bindBuffer(g.ARRAY_BUFFER,l);g.bufferData(g.ARRAY_BUFFER,new Float32Array([0,
+        0,1,0,0,1,0,1,1,0,1,1]),g.STATIC_DRAW);g.enableVertexAttribArray(f);g.vertexAttribPointer(f,2,g.FLOAT,!1,0,0);g.uniform1i(j,0);g.uniform1i(k,1);ca=h}g=ca;h=g.canvas;f=g.gl;h.width=d;h.height=e;f.viewport(0,0,f.drawingBufferWidth,f.drawingBufferHeight);f.uniform2f(g.resolutionLocation,d,e);c.backdrop?f.uniform4f(g.resolutionLocation,c.backdrop[0],c.backdrop[1],c.backdrop[2],1):f.uniform4f(g.resolutionLocation,0,0,0,0);f.uniform1i(g.subtypeLocation,"Luminosity"===c.subtype?1:0);a=zb(f,a,f.TEXTURE0);
+        b=zb(f,b,f.TEXTURE1);c=f.createBuffer();f.bindBuffer(f.ARRAY_BUFFER,c);f.bufferData(f.ARRAY_BUFFER,new Float32Array([0,0,d,0,0,e,0,e,d,0,d,e]),f.STATIC_DRAW);f.enableVertexAttribArray(g.positionLocation);f.vertexAttribPointer(g.positionLocation,2,f.FLOAT,!1,0,0);f.clearColor(0,0,0,0);f.enable(f.BLEND);f.blendFunc(f.ONE,f.ONE_MINUS_SRC_ALPHA);f.clear(f.COLOR_BUFFER_BIT);f.drawArrays(f.TRIANGLES,0,6);f.flush();f.deleteTexture(a);f.deleteTexture(b);f.deleteBuffer(c);return h},drawFigures:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           b,c,d,e){if(!da){var f,g;ta();f=S;S=null;g=Q;Q=null;var h=ba(g,"  attribute vec2 a_position;                                      attribute vec3 a_color;                                                                                                         uniform vec2 u_resolution;                                      uniform vec2 u_scale;                                           uniform vec2 u_offset;                                                                                                          varying vec4 v_color;                                                                                                           void main() {                                                     vec2 position = (a_position + u_offset) * u_scale;              vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;         gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);                                                                              v_color = vec4(a_color / 255.0, 1.0);                         }                                                             ",
+        g.VERTEX_SHADER),j=ba(g,"  precision mediump float;                                                                                                        varying vec4 v_color;                                                                                                           void main() {                                                     gl_FragColor = v_color;                                       }                                                             ",g.FRAGMENT_SHADER),h=yb(g,
+        [h,j]);g.useProgram(h);j={};j.gl=g;j.canvas=f;j.resolutionLocation=g.getUniformLocation(h,"u_resolution");j.scaleLocation=g.getUniformLocation(h,"u_scale");j.offsetLocation=g.getUniformLocation(h,"u_offset");j.positionLocation=g.getAttribLocation(h,"a_position");j.colorLocation=g.getAttribLocation(h,"a_color");da=j}f=da;g=f.canvas;h=f.gl;g.width=a;g.height=b;h.viewport(0,0,h.drawingBufferWidth,h.drawingBufferHeight);h.uniform2f(f.resolutionLocation,a,b);a=0;var k,l,p;k=0;for(l=d.length;k<l;k++)switch(d[k].type){case "lattice":p=
+        d[k].coords.length/d[k].verticesPerRow|0;a+=6*(p-1)*(d[k].verticesPerRow-1);break;case "triangles":a+=d[k].coords.length}j=new Float32Array(2*a);b=new Uint8Array(3*a);var q=e.coords,n=e.colors,m=0,r=0;k=0;for(l=d.length;k<l;k++){p=d[k];var x=p.coords,w=p.colors;switch(p.type){case "lattice":var t=p.verticesPerRow;p=x.length/t|0;for(var v=1;v<p;v++)for(var s=v*t+1,u=1;u<t;u++,s++)j[m]=q[x[s-t-1]],j[m+1]=q[x[s-t-1]+1],j[m+2]=q[x[s-t]],j[m+3]=q[x[s-t]+1],j[m+4]=q[x[s-1]],j[m+5]=q[x[s-1]+1],b[r]=n[w[s-
+    t-1]],b[r+1]=n[w[s-t-1]+1],b[r+2]=n[w[s-t-1]+2],b[r+3]=n[w[s-t]],b[r+4]=n[w[s-t]+1],b[r+5]=n[w[s-t]+2],b[r+6]=n[w[s-1]],b[r+7]=n[w[s-1]+1],b[r+8]=n[w[s-1]+2],j[m+6]=j[m+2],j[m+7]=j[m+3],j[m+8]=j[m+4],j[m+9]=j[m+5],j[m+10]=q[x[s]],j[m+11]=q[x[s]+1],b[r+9]=b[r+3],b[r+10]=b[r+4],b[r+11]=b[r+5],b[r+12]=b[r+6],b[r+13]=b[r+7],b[r+14]=b[r+8],b[r+15]=n[w[s]],b[r+16]=n[w[s]+1],b[r+17]=n[w[s]+2],m+=12,r+=18;break;case "triangles":p=0;for(t=x.length;p<t;p++)j[m]=q[x[p]],j[m+1]=q[x[p]+1],b[r]=n[w[k]],b[r+1]=
+        n[w[p]+1],b[r+2]=n[w[p]+2],m+=2,r+=3}}c?h.clearColor(c[0]/255,c[1]/255,c[2]/255,1):h.clearColor(0,0,0,0);h.clear(h.COLOR_BUFFER_BIT);c=h.createBuffer();h.bindBuffer(h.ARRAY_BUFFER,c);h.bufferData(h.ARRAY_BUFFER,j,h.STATIC_DRAW);h.enableVertexAttribArray(f.positionLocation);h.vertexAttribPointer(f.positionLocation,2,h.FLOAT,!1,0,0);d=h.createBuffer();h.bindBuffer(h.ARRAY_BUFFER,d);h.bufferData(h.ARRAY_BUFFER,b,h.STATIC_DRAW);h.enableVertexAttribArray(f.colorLocation);h.vertexAttribPointer(f.colorLocation,
+        3,h.UNSIGNED_BYTE,!1,0,0);h.uniform2f(f.scaleLocation,e.scaleX,e.scaleY);h.uniform2f(f.offsetLocation,e.offsetX,e.offsetY);h.drawArrays(h.TRIANGLES,0,a);h.flush();h.deleteBuffer(c);h.deleteBuffer(d);return g},clear:function(){da=ca=null}};var ga={RadialAxial:{fromIR:function(a){var b=a[1],c=a[2],d=a[3],e=a[4],f=a[5],g=a[6];return{type:"Pattern",getPattern:function(a){var j;"axial"===b?j=a.createLinearGradient(d[0],d[1],e[0],e[1]):"radial"===b&&(j=a.createRadialGradient(d[0],d[1],f,e[0],e[1],g));a=
+        0;for(var k=c.length;a<k;++a){var l=c[a];j.addColorStop(l[0],l[1])}return j}}}}},Ab,ua=function(a,b,c,d,e,f,g,h){var j=b.coords,k=b.colors,l=a.data;a=4*a.width;var p;j[c+1]>j[d+1]&&(p=c,c=d,d=p,p=f,f=g,g=p);j[d+1]>j[e+1]&&(p=d,d=e,e=p,p=g,g=h,h=p);j[c+1]>j[d+1]&&(p=c,c=d,d=p,p=f,f=g,g=p);p=(j[c]+b.offsetX)*b.scaleX;c=(j[c+1]+b.offsetY)*b.scaleY;var q=(j[d]+b.offsetX)*b.scaleX;d=(j[d+1]+b.offsetY)*b.scaleY;var n=(j[e]+b.offsetX)*b.scaleX;b=(j[e+1]+b.offsetY)*b.scaleY;if(!(c>=b)){e=k[f];j=k[f+1];f=
+        k[f+2];var m=k[g],r=k[g+1];g=k[g+2];var t=k[h],s=k[h+1];h=k[h+2];for(var v=Math.round(c),k=Math.round(b),u,y,z,C,E,F,G,A,B=v;B<=k;B++){B<d?(A=B<c?0:c===d?1:(c-B)/(c-d),v=p-(p-q)*A,u=e-(e-m)*A,y=j-(j-r)*A,z=f-(f-g)*A):(A=B>b?1:d===b?0:(d-B)/(d-b),v=q-(q-n)*A,u=m-(m-t)*A,y=r-(r-s)*A,z=g-(g-h)*A);A=B<c?0:B>b?1:(c-B)/(c-b);C=p-(p-n)*A;E=e-(e-t)*A;F=j-(j-s)*A;G=f-(f-h)*A;A=Math.round(Math.min(v,C));for(var J=Math.round(Math.max(v,C)),H=a*B+4*A,I=A;I<=J;I++)A=(v-I)/(v-C),A=0>A?0:1<A?1:A,l[H++]=u-(u-E)*
+        A|0,l[H++]=y-(y-F)*A|0,l[H++]=z-(z-G)*A|0,l[H++]=255}}};Ab=function(a,b,c,d,e,f){var g=Math.floor(a[0]),h=Math.floor(a[1]),j=Math.ceil(a[2])-g;a=Math.ceil(a[3])-h;var k=Math.min(Math.ceil(Math.abs(1.1*j*b[0])),3E3),l=Math.min(Math.ceil(Math.abs(1.1*a*b[1])),3E3),j=j/k;a/=l;d={coords:c,colors:d,offsetX:-g,offsetY:-h,scaleX:1/j,scaleY:1/a};var p;if(R.isEnabled)e=R.drawFigures(k,l,f,e,d),c=F.getCanvas("mesh",k,l,!1),c.context.drawImage(e,0,0);else{c=F.getCanvas("mesh",k,l,!1);b=c.context;l=b.createImageData(k,
+        l);if(f){var q=l.data,k=0;for(p=q.length;k<p;k+=4)q[k]=f[0],q[k+1]=f[1],q[k+2]=f[2],q[k+3]=255}for(k=0;k<e.length;k++){f=l;var n=e[k];p=d;var q=n.coords,m=n.colors,r=void 0,t=void 0;switch(n.type){case "lattice":for(var n=n.verticesPerRow,t=Math.floor(q.length/n)-1,s=n-1,r=0;r<t;r++)for(var u=r*n,y=0;y<s;y++,u++)ua(f,p,q[u],q[u+1],q[u+n],m[u],m[u+1],m[u+n]),ua(f,p,q[u+n+1],q[u+1],q[u+n],m[u+n+1],m[u+1],m[u+n]);break;case "triangles":r=0;for(t=q.length;r<t;r+=3)ua(f,p,q[r],q[r+1],q[r+2],m[r],m[r+1],
+        m[r+2]);break;default:v("illigal figure")}}b.putImageData(l,0,0)}e=c.canvas;return{canvas:e,offsetX:g,offsetY:h,scaleX:j,scaleY:a}};ga.Mesh={fromIR:function(a){var b=a[2],c=a[3],d=a[4],e=a[5],f=a[6],g=a[8];return{type:"Pattern",getPattern:function(a,j,k){var l;if(k)l=t.singularValueDecompose2dScale(a.mozCurrentTransform);else{l=t.singularValueDecompose2dScale(f);var p=t.singularValueDecompose2dScale(j.baseTransform);l=[l[0]*p[0],l[1]*p[1]]}l=Ab(e,l,b,c,d,k?null:g);k||(a.setTransform.apply(a,j.baseTransform),
+    f&&a.transform.apply(a,f));a.translate(l.offsetX,l.offsetY);a.scale(l.scaleX,l.scaleY);return a.createPattern(l.canvas,"no-repeat")}}}};ga.Dummy={fromIR:function(){return{type:"Pattern",getPattern:function(){return"hotpink"}}}};var wb,Bb=function(a,b,c,d,e,f){this.name=a[1][0].name;this.operatorList=a[2];this.matrix=a[3]||[1,0,0,1,0,0];this.bbox=a[4];this.xstep=a[5];this.ystep=a[6];this.paintType=a[7];this.tilingType=a[8];this.color=b;this.objs=d;this.commonObjs=e;this.baseTransform=f;this.type="Pattern";
+        this.ctx=c};Bb.prototype={createPatternCanvas:function(a){var b=this.operatorList,c=this.bbox,d=this.xstep,e=this.ystep,f=this.paintType,g=this.color,h=this.objs,j=this.commonObjs;G("TilingType: "+this.tilingType);var k=c[0],l=c[1],p=c[2],q=c[3],n=[k,l],m=[k+d,l+e],r=m[0]-n[0],m=m[1]-n[1],s=t.singularValueDecompose2dScale(this.matrix),u=t.singularValueDecompose2dScale(this.baseTransform),s=[s[0]*u[0],s[1]*u[1]],r=Math.min(Math.ceil(Math.abs(r*s[0])),3E3),m=Math.min(Math.ceil(Math.abs(m*s[1])),3E3),
+        s=F.getCanvas("pattern",r,m,!0),u=s.context,h=new qa(u,j,h);h.groupLevel=a.groupLevel;this.setFillAndStrokeStyleToContext(u,f,g);this.setScale(r,m,d,e);this.transformToScale(h);h.transform.apply(h,[1,0,0,1,-n[0],-n[1]]);this.clipBbox(h,c,k,l,p,q);h.executeOperatorList(b);return s.canvas},setScale:function(a,b,c,d){this.scale=[a/c,b/d]},transformToScale:function(a){var b=this.scale;a.transform.apply(a,[b[0],0,0,b[1],0,0])},scaleToContext:function(){var a=this.scale;this.ctx.scale(1/a[0],1/a[1])},clipBbox:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              b,c,d,e,f){b&&(B(b)&&4==b.length)&&(a.rectangle(c,d,e-c,f-d),a.clip(),a.endPath())},setFillAndStrokeStyleToContext:function(a,b,c){switch(b){case 1:b=this.ctx;a.fillStyle=b.fillStyle;a.strokeStyle=b.strokeStyle;break;case 2:b=s.singletons.rgb.getRgb(c,0);b=t.makeCssRgb(b);a.fillStyle=b;a.strokeStyle=b;break;default:v("Unsupported paint type: "+b)}},getPattern:function(a,b){var c=this.createPatternCanvas(b);a=this.ctx;a.setTransform.apply(a,this.baseTransform);a.transform.apply(a,this.matrix);this.scaleToContext();
+        return a.createPattern(c,"repeat")}};wb=Bb;PDFJS.disableFontFace=!1;var va;if(V)va=!1;else{var Cb=/Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(window.navigator.userAgent);va=Cb&&14<=Cb[1]?!0:!1}var M={insertRule:function(a){var b=document.getElementById("PDFJS_FONT_STYLE_TAG");b||(b=document.createElement("style"),b.id="PDFJS_FONT_STYLE_TAG",document.documentElement.getElementsByTagName("head")[0].appendChild(b));b=b.sheet;b.insertRule(a,b.cssRules.length)},clear:function(){var a=document.getElementById("PDFJS_FONT_STYLE_TAG");
+        a&&a.parentNode.removeChild(a)},get loadTestFont(){return K(this,"loadTestFont",atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="))},
+        loadTestFontId:0,loadingContext:{requests:[],nextRequestId:0},isSyncFontLoadingSupported:va,bind:function(a,b){!V||v("bind() shall be called from main thread");for(var c=[],d=[],e=0,f=a.length;e<f;e++){var g=a[e];if(!(g.attached||!1===g.loading)){g.attached=!0;var h=g.bindDOM();h&&(c.push(h),d.push(g))}}e=M.queueLoadingCallback(b);0<c.length&&!this.isSyncFontLoadingSupported?M.prepareFontLoadEvent(c,d,e):e.complete()},queueLoadingCallback:function(a){var b=M.loadingContext,c={id:"pdfjs-font-loading-"+
+        b.nextRequestId++,complete:function(){!c.end||v("completeRequest() cannot be called twice");for(c.end=Date.now();0<b.requests.length&&b.requests[0].end;){var a=b.requests.shift();setTimeout(a.callback,0)}},callback:a,started:Date.now()};b.requests.push(c);return c},prepareFontLoadEvent:function(a,b,c){function d(a,b){return a.charCodeAt(b)<<24|a.charCodeAt(b+1)<<16|a.charCodeAt(b+2)<<8|a.charCodeAt(b+3)&255}function e(a,b,c,d){var e=a.substr(0,b);a=a.substr(b+c);return e+d+a}function f(a,b){k++;30<
+        k?(z("Load test font never loaded."),b()):(j.font="30px "+a,j.fillText(".",0,20),0<j.getImageData(0,0,1,1).data[3]?b():setTimeout(f.bind(null,a,b)))}var g,h;a=document.createElement("canvas");a.width=1;a.height=1;var j=a.getContext("2d"),k=0;a="lt"+Date.now()+this.loadTestFontId++;var l=this.loadTestFont,l=e(l,976,a.length,a),p=d(l,16);g=0;for(h=a.length-3;g<h;g+=4)p=p-1482184792+d(a,g)|0;g<a.length&&(p=p-1482184792+d(a+"XXX",g)|0);l=e(l,16,4,String.fromCharCode(p>>24&255,p>>16&255,p>>8&255,p&255));
+            g="url(data:font/opentype;base64,"+btoa(l)+");";M.insertRule('@font-face { font-family:"'+a+'";src:'+g+"}");l=[];g=0;for(h=b.length;g<h;g++)l.push(b[g].loadedName);l.push(a);var q=document.createElement("div");q.setAttribute("style","visibility: hidden;width: 10px; height: 10px;position: absolute; top: 0px; left: 0px;");g=0;for(h=l.length;g<h;++g)b=document.createElement("span"),b.textContent="Hi",b.style.fontFamily=l[g],q.appendChild(b);document.body.appendChild(q);f(a,function(){document.body.removeChild(q);
+                c.complete()})}},ob,Db=function(a,b,c){this.compiledGlyphs={};if(1===arguments.length){var d=arguments[0],e;for(e in d)this[e]=d[e]}};Db.prototype={bindDOM:function(){if(!this.data)return null;if(PDFJS.disableFontFace)return this.disableFontFace=!0,null;var a;var b=new Uint8Array(this.data);a=b.length;if(8192>a)a=String.fromCharCode.apply(null,b);else{for(var c=[],d=0;d<a;d+=8192){var e=Math.min(d+8192,a),e=b.subarray(d,e);c.push(String.fromCharCode.apply(null,e))}a=c.join("")}b=this.loadedName;a=
+        "url(data:"+this.mimetype+";base64,"+window.btoa(a)+");";b='@font-face { font-family:"'+b+'";src:'+a+"}";M.insertRule(b);PDFJS.pdfBug&&("FontInspector"in y&&y.FontInspector.enabled)&&y.FontInspector.fontAdded(this,a);return b},getPathGenerator:function(a,b){if(!(b in this.compiledGlyphs)){var c=a.get(this.loadedName+"_path_"+b);this.compiledGlyphs[b]=new Function("c","size",c)}return this.compiledGlyphs[b]}};ob=Db}).call("undefined"===typeof window?this:window);
+!PDFJS.workerSrc&&"undefined"!==typeof document&&(PDFJS.workerSrc=function(){var G=(document.body||document.getElementsByTagName("head")[0]).lastChild.src;return G&&G.replace(/\.js$/i,".worker.js")}());
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals VBArray, PDFJS */
+
+'use strict';
+
+// Initializing PDFJS global object here, it case if we need to change/disable
+// some PDF.js features, e.g. range requests
+if (typeof PDFJS === 'undefined') {
+    (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+// Checking if the typed arrays are supported
+(function checkTypedArrayCompatibility() {
+    if (typeof Uint8Array !== 'undefined') {
+        // some mobile versions do not support subarray (e.g. safari 5 / iOS)
+        if (typeof Uint8Array.prototype.subarray === 'undefined') {
+            Uint8Array.prototype.subarray = function subarray(start, end) {
+                return new Uint8Array(this.slice(start, end));
+            };
+            Float32Array.prototype.subarray = function subarray(start, end) {
+                return new Float32Array(this.slice(start, end));
+            };
+        }
+
+        // some mobile version might not support Float64Array
+        if (typeof Float64Array === 'undefined') {
+            window.Float64Array = Float32Array;
+        }
+        return;
+    }
+
+    function subarray(start, end) {
+        return new TypedArray(this.slice(start, end));
+    }
+
+    function setArrayOffset(array, offset) {
+        if (arguments.length < 2) {
+            offset = 0;
+        }
+        for (var i = 0, n = array.length; i < n; ++i, ++offset) {
+            this[offset] = array[i] & 0xFF;
+        }
+    }
+
+    function TypedArray(arg1) {
+        var result, i, n;
+        if (typeof arg1 === 'number') {
+            result = [];
+            for (i = 0; i < arg1; ++i) {
+                result[i] = 0;
+            }
+        } else if ('slice' in arg1) {
+            result = arg1.slice(0);
+        } else {
+            result = [];
+            for (i = 0, n = arg1.length; i < n; ++i) {
+                result[i] = arg1[i];
+            }
+        }
+
+        result.subarray = subarray;
+        result.buffer = result;
+        result.byteLength = result.length;
+        result.set = setArrayOffset;
+
+        if (typeof arg1 === 'object' && arg1.buffer) {
+            result.buffer = arg1.buffer;
+        }
+        return result;
+    }
+
+    window.Uint8Array = TypedArray;
+    window.Int8Array = TypedArray;
+
+    // we don't need support for set, byteLength for 32-bit array
+    // so we can use the TypedArray as well
+    window.Uint32Array = TypedArray;
+    window.Int32Array = TypedArray;
+    window.Uint16Array = TypedArray;
+    window.Float32Array = TypedArray;
+    window.Float64Array = TypedArray;
+})();
+
+// URL = URL || webkitURL
+(function normalizeURLObject() {
+    if (!window.URL) {
+        window.URL = window.webkitURL;
+    }
+})();
+
+// Object.create() ?
+(function checkObjectCreateCompatibility() {
+    if (typeof Object.create !== 'undefined') {
+        return;
+    }
+
+    Object.create = function objectCreate(proto) {
+        function Constructor() {}
+        Constructor.prototype = proto;
+        return new Constructor();
+    };
+})();
+
+// Object.defineProperty() ?
+(function checkObjectDefinePropertyCompatibility() {
+    if (typeof Object.defineProperty !== 'undefined') {
+        var definePropertyPossible = true;
+        try {
+            // some browsers (e.g. safari) cannot use defineProperty() on DOM objects
+            // and thus the native version is not sufficient
+            Object.defineProperty(new Image(), 'id', { value: 'test' });
+            // ... another test for android gb browser for non-DOM objects
+            var Test = function Test() {};
+            Test.prototype = { get id() { } };
+            Object.defineProperty(new Test(), 'id',
+                { value: '', configurable: true, enumerable: true, writable: false });
+        } catch (e) {
+            definePropertyPossible = false;
+        }
+        if (definePropertyPossible) {
+            return;
+        }
+    }
+
+    Object.defineProperty = function objectDefineProperty(obj, name, def) {
+        delete obj[name];
+        if ('get' in def) {
+            obj.__defineGetter__(name, def['get']);
+        }
+        if ('set' in def) {
+            obj.__defineSetter__(name, def['set']);
+        }
+        if ('value' in def) {
+            obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
+                this.__defineGetter__(name, function objectDefinePropertyGetter() {
+                    return value;
+                });
+                return value;
+            });
+            obj[name] = def.value;
+        }
+    };
+})();
+
+// Object.keys() ?
+(function checkObjectKeysCompatibility() {
+    if (typeof Object.keys !== 'undefined') {
+        return;
+    }
+
+    Object.keys = function objectKeys(obj) {
+        var result = [];
+        for (var i in obj) {
+            if (obj.hasOwnProperty(i)) {
+                result.push(i);
+            }
+        }
+        return result;
+    };
+})();
+
+// No readAsArrayBuffer ?
+(function checkFileReaderReadAsArrayBuffer() {
+    if (typeof FileReader === 'undefined') {
+        return; // FileReader is not implemented
+    }
+    var frPrototype = FileReader.prototype;
+    // Older versions of Firefox might not have readAsArrayBuffer
+    if ('readAsArrayBuffer' in frPrototype) {
+        return; // readAsArrayBuffer is implemented
+    }
+    Object.defineProperty(frPrototype, 'readAsArrayBuffer', {
+        value: function fileReaderReadAsArrayBuffer(blob) {
+            var fileReader = new FileReader();
+            var originalReader = this;
+            fileReader.onload = function fileReaderOnload(evt) {
+                var data = evt.target.result;
+                var buffer = new ArrayBuffer(data.length);
+                var uint8Array = new Uint8Array(buffer);
+
+                for (var i = 0, ii = data.length; i < ii; i++) {
+                    uint8Array[i] = data.charCodeAt(i);
+                }
+
+                Object.defineProperty(originalReader, 'result', {
+                    value: buffer,
+                    enumerable: true,
+                    writable: false,
+                    configurable: true
+                });
+
+                var event = document.createEvent('HTMLEvents');
+                event.initEvent('load', false, false);
+                originalReader.dispatchEvent(event);
+            };
+            fileReader.readAsBinaryString(blob);
+        }
+    });
+})();
+
+// No XMLHttpRequest.response ?
+(function checkXMLHttpRequestResponseCompatibility() {
+    var xhrPrototype = XMLHttpRequest.prototype;
+    if (!('overrideMimeType' in xhrPrototype)) {
+        // IE10 might have response, but not overrideMimeType
+        Object.defineProperty(xhrPrototype, 'overrideMimeType', {
+            value: function xmlHttpRequestOverrideMimeType(mimeType) {}
+        });
+    }
+    if ('response' in xhrPrototype ||
+        'mozResponseArrayBuffer' in xhrPrototype ||
+        'mozResponse' in xhrPrototype ||
+        'responseArrayBuffer' in xhrPrototype) {
+        return;
+    }
+    // IE9 ?
+    if (typeof VBArray !== 'undefined') {
+        Object.defineProperty(xhrPrototype, 'response', {
+            get: function xmlHttpRequestResponseGet() {
+                return new Uint8Array(new VBArray(this.responseBody).toArray());
+            }
+        });
+        return;
+    }
+
+    // other browsers
+    function responseTypeSetter() {
+        // will be only called to set "arraybuffer"
+        this.overrideMimeType('text/plain; charset=x-user-defined');
+    }
+    if (typeof xhrPrototype.overrideMimeType === 'function') {
+        Object.defineProperty(xhrPrototype, 'responseType',
+            { set: responseTypeSetter });
+    }
+    function responseGetter() {
+        var text = this.responseText;
+        var i, n = text.length;
+        var result = new Uint8Array(n);
+        for (i = 0; i < n; ++i) {
+            result[i] = text.charCodeAt(i) & 0xFF;
+        }
+        return result;
+    }
+    Object.defineProperty(xhrPrototype, 'response', { get: responseGetter });
+})();
+
+// window.btoa (base64 encode function) ?
+(function checkWindowBtoaCompatibility() {
+    if ('btoa' in window) {
+        return;
+    }
+
+    var digits =
+        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+    window.btoa = function windowBtoa(chars) {
+        var buffer = '';
+        var i, n;
+        for (i = 0, n = chars.length; i < n; i += 3) {
+            var b1 = chars.charCodeAt(i) & 0xFF;
+            var b2 = chars.charCodeAt(i + 1) & 0xFF;
+            var b3 = chars.charCodeAt(i + 2) & 0xFF;
+            var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+            var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+            var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
+            buffer += (digits.charAt(d1) + digits.charAt(d2) +
+            digits.charAt(d3) + digits.charAt(d4));
+        }
+        return buffer;
+    };
+})();
+
+// window.atob (base64 encode function) ?
+(function checkWindowAtobCompatibility() {
+    if ('atob' in window) {
+        return;
+    }
+
+    // https://github.com/davidchambers/Base64.js
+    var digits =
+        'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+    window.atob = function (input) {
+        input = input.replace(/=+$/, '');
+        if (input.length % 4 == 1) {
+            throw new Error('bad atob input');
+        }
+        for (
+            // initialize result and counters
+            var bc = 0, bs, buffer, idx = 0, output = '';
+            // get next character
+            buffer = input.charAt(idx++);
+            // character found in table?
+            // initialize bit storage and add its ascii value
+            ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
+                // and if not first of each 4 characters,
+                // convert the first 8 bits to one ascii character
+            bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
+        ) {
+            // try to find character in table (0-63, not found => -1)
+            buffer = digits.indexOf(buffer);
+        }
+        return output;
+    };
+})();
+
+// Function.prototype.bind ?
+(function checkFunctionPrototypeBindCompatibility() {
+    if (typeof Function.prototype.bind !== 'undefined') {
+        return;
+    }
+
+    Function.prototype.bind = function functionPrototypeBind(obj) {
+        var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);
+        var bound = function functionPrototypeBindBound() {
+            var args = headArgs.concat(Array.prototype.slice.call(arguments));
+            return fn.apply(obj, args);
+        };
+        return bound;
+    };
+})();
+
+// HTMLElement dataset property
+(function checkDatasetProperty() {
+    var div = document.createElement('div');
+    if ('dataset' in div) {
+        return; // dataset property exists
+    }
+
+    Object.defineProperty(HTMLElement.prototype, 'dataset', {
+        get: function() {
+            if (this._dataset) {
+                return this._dataset;
+            }
+
+            var dataset = {};
+            for (var j = 0, jj = this.attributes.length; j < jj; j++) {
+                var attribute = this.attributes[j];
+                if (attribute.name.substring(0, 5) != 'data-') {
+                    continue;
+                }
+                var key = attribute.name.substring(5).replace(/\-([a-z])/g,
+                    function(all, ch) {
+                        return ch.toUpperCase();
+                    });
+                dataset[key] = attribute.value;
+            }
+
+            Object.defineProperty(this, '_dataset', {
+                value: dataset,
+                writable: false,
+                enumerable: false
+            });
+            return dataset;
+        },
+        enumerable: true
+    });
+})();
+
+// HTMLElement classList property
+(function checkClassListProperty() {
+    var div = document.createElement('div');
+    if ('classList' in div) {
+        return; // classList property exists
+    }
+
+    function changeList(element, itemName, add, remove) {
+        var s = element.className || '';
+        var list = s.split(/\s+/g);
+        if (list[0] === '') {
+            list.shift();
+        }
+        var index = list.indexOf(itemName);
+        if (index < 0 && add) {
+            list.push(itemName);
+        }
+        if (index >= 0 && remove) {
+            list.splice(index, 1);
+        }
+        element.className = list.join(' ');
+        return (index >= 0);
+    }
+
+    var classListPrototype = {
+        add: function(name) {
+            changeList(this.element, name, true, false);
+        },
+        contains: function(name) {
+            return changeList(this.element, name, false, false);
+        },
+        remove: function(name) {
+            changeList(this.element, name, false, true);
+        },
+        toggle: function(name) {
+            changeList(this.element, name, true, true);
+        }
+    };
+
+    Object.defineProperty(HTMLElement.prototype, 'classList', {
+        get: function() {
+            if (this._classList) {
+                return this._classList;
+            }
+
+            var classList = Object.create(classListPrototype, {
+                element: {
+                    value: this,
+                    writable: false,
+                    enumerable: true
+                }
+            });
+            Object.defineProperty(this, '_classList', {
+                value: classList,
+                writable: false,
+                enumerable: false
+            });
+            return classList;
+        },
+        enumerable: true
+    });
+})();
+
+// Check console compatibility
+(function checkConsoleCompatibility() {
+    if (!('console' in window)) {
+        window.console = {
+            log: function() {},
+            error: function() {},
+            warn: function() {}
+        };
+    } else if (!('bind' in console.log)) {
+        // native functions in IE9 might not have bind
+        console.log = (function(fn) {
+            return function(msg) { return fn(msg); };
+        })(console.log);
+        console.error = (function(fn) {
+            return function(msg) { return fn(msg); };
+        })(console.error);
+        console.warn = (function(fn) {
+            return function(msg) { return fn(msg); };
+        })(console.warn);
+    }
+})();
+
+// Check onclick compatibility in Opera
+(function checkOnClickCompatibility() {
+    // workaround for reported Opera bug DSK-354448:
+    // onclick fires on disabled buttons with opaque content
+    function ignoreIfTargetDisabled(event) {
+        if (isDisabled(event.target)) {
+            event.stopPropagation();
+        }
+    }
+    function isDisabled(node) {
+        return node.disabled || (node.parentNode && isDisabled(node.parentNode));
+    }
+    if (navigator.userAgent.indexOf('Opera') != -1) {
+        // use browser detection since we cannot feature-check this bug
+        document.addEventListener('click', ignoreIfTargetDisabled, true);
+    }
+})();
+
+// Checks if possible to use URL.createObjectURL()
+(function checkOnBlobSupport() {
+    // sometimes IE loosing the data created with createObjectURL(), see #3977
+    if (navigator.userAgent.indexOf('Trident') >= 0) {
+        PDFJS.disableCreateObjectURL = true;
+    }
+})();
+
+// Checks if navigator.language is supported
+(function checkNavigatorLanguage() {
+    if ('language' in navigator &&
+        /^[a-z]+(-[A-Z]+)?$/.test(navigator.language)) {
+        return;
+    }
+    function formatLocale(locale) {
+        var split = locale.split(/[-_]/);
+        split[0] = split[0].toLowerCase();
+        if (split.length > 1) {
+            split[1] = split[1].toUpperCase();
+        }
+        return split.join('-');
+    }
+    var language = navigator.language || navigator.userLanguage || 'en-US';
+    PDFJS.locale = formatLocale(language);
+})();
+
+(function checkRangeRequests() {
+    // Safari has issues with cached range requests see:
+    // https://github.com/mozilla/pdf.js/issues/3260
+    // Last tested with version 6.0.4.
+    var isSafari = Object.prototype.toString.call(
+            window.HTMLElement).indexOf('Constructor') > 0;
+
+    // Older versions of Android (pre 3.0) has issues with range requests, see:
+    // https://github.com/mozilla/pdf.js/issues/3381.
+    // Make sure that we only match webkit-based Android browsers,
+    // since Firefox/Fennec works as expected.
+    var regex = /Android\s[0-2][^\d]/;
+    var isOldAndroid = regex.test(navigator.userAgent);
+
+    if (isSafari || isOldAndroid) {
+        PDFJS.disableRange = true;
+    }
+})();
+
+// Check if the browser supports manipulation of the history.
+(function checkHistoryManipulation() {
+    if (!window.history.pushState) {
+        PDFJS.disableHistory = true;
+    }
+})();
+
+(function checkSetPresenceInImageData() {
+    if (window.CanvasPixelArray) {
+        if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
+            window.CanvasPixelArray.prototype.set = function(arr) {
+                for (var i = 0, ii = this.length; i < ii; i++) {
+                    this[i] = arr[i];
+                }
+            };
+        }
+    }
+})();
+
+(function checkStorages() {
+    // Feature test as per http://diveintohtml5.info/storage.html
+    // The additional localStorage call is to get around a FF quirk, see
+    // bug #495747 in bugzilla
+    try {
+        if ('localStorage' in window && window['localStorage'] !== null) {
+            return;
+        }
+    } catch (e) { }
+    window.localStorage = {
+        data: Object.create(null),
+        getItem: function (key) {
+            return this.data[key];
+        },
+        setItem: function (key, value) {
+            this.data[key] = value;
+        }
+    };
+})();
+
+var DEFAULT_SCALE="auto",DEFAULT_SCALE_DELTA=1.1,UNKNOWN_SCALE=0,CACHE_SIZE=20,CSS_UNITS=96/72,SCROLLBAR_PADDING=40,VERTICAL_PADDING=5,MAX_AUTO_SCALE=1.25,MIN_SCALE=0.25,MAX_SCALE=4,VIEW_HISTORY_MEMORY=20,SCALE_SELECT_CONTAINER_PADDING=8,SCALE_SELECT_PADDING=22,THUMBNAIL_SCROLL_MARGIN=-19,USE_ONLY_CSS_ZOOM=!1,CLEANUP_TIMEOUT=3E4,IGNORE_CURRENT_POSITION_ON_ZOOM=!1,RenderingStates={INITIAL:0,RUNNING:1,PAUSED:2,FINISHED:3},FindStates={FIND_FOUND:0,FIND_NOTFOUND:1,FIND_WRAPPED:2,FIND_PENDING:3},mozL10n=
+    document.mozL10n||document.webL10n,CustomStyle=function(){function a(){}var b=["ms","Moz","Webkit","O"],c={};a.getProp=function(a,d){if(1==arguments.length&&"string"==typeof c[a])return c[a];d=d||document.documentElement;var f=d.style,g,h;if("string"==typeof f[a])return c[a]=a;h=a.charAt(0).toUpperCase()+a.slice(1);for(var j=0,l=b.length;j<l;j++)if(g=b[j]+h,"string"==typeof f[g])return c[a]=g;return c[a]="undefined"};a.setProp=function(a,b,c){a=this.getProp(a);"undefined"!=a&&(b.style[a]=c)};return a}();
+function getFileName(a){var b=a.indexOf("#"),c=a.indexOf("?"),b=Math.min(0<b?b:a.length,0<c?c:a.length);return a.substring(a.lastIndexOf("/",b)+1,b)}function getOutputScale(a){a=(window.devicePixelRatio||1)/(a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||a.backingStorePixelRatio||1);return{sx:a,sy:a,scaled:1!=a}}
+function scrollIntoView(a,b){var c=a.offsetParent,e=a.offsetTop+a.clientTop,d=a.offsetLeft+a.clientLeft;if(c){for(;c.clientHeight===c.scrollHeight;)if(c.dataset._scaleY&&(e/=c.dataset._scaleY,d/=c.dataset._scaleX),e+=c.offsetTop,d+=c.offsetLeft,c=c.offsetParent,!c)return;b&&(void 0!==b.top&&(e+=b.top),void 0!==b.left&&(d+=b.left,c.scrollLeft=d));c.scrollTop=e}else console.error("offsetParent is not set -- cannot scroll")}function noContextMenuHandler(a){a.preventDefault()}
+function getPDFFileNameFromURL(a){var b=/[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;a=/^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/.exec(a);if(a=b.exec(a[1])||b.exec(a[2])||b.exec(a[3]))if(a=a[0],-1!=a.indexOf("%"))try{a=b.exec(decodeURIComponent(a))[0]}catch(c){}return a||"document.pdf"}
+var ProgressBar=function(){function a(a,c){this.div=document.querySelector(a+" .progress");this.bar=this.div.parentNode;this.height=c.height||100;this.width=c.width||100;this.units=c.units||"%";this.div.style.height=this.height+this.units;this.percent=0}a.prototype={updateBar:function(){this._indeterminate?(this.div.classList.add("indeterminate"),this.div.style.width=this.width+this.units):(this.div.classList.remove("indeterminate"),this.div.style.width=this.width*this._percent/100+this.units)},get percent(){return this._percent},
+    set percent(a){this._indeterminate=isNaN(a);this._percent=Math.min(Math.max(a,0),100);this.updateBar()},setWidth:function(a){a&&(a=a.parentNode.offsetWidth-a.offsetWidth,0<a&&this.bar.setAttribute("style","width: calc(100% - "+a+"px);"))},hide:function(){this.bar.classList.add("hidden");this.bar.removeAttribute("style")}};return a}(),Cache=function(a){var b=[];this.push=function(c){var e=b.indexOf(c);0<=e&&b.splice(e);b.push(c);b.length>a&&b.shift().destroy()}},DEFAULT_PREFERENCES={showPreviousViewOnLoad:!0,
+    defaultZoomValue:"",ifAvailableShowOutlineOnLoad:!1,enableHandToolOnLoad:!1,enableWebGL:!1},Preferences={prefs:Object.create(DEFAULT_PREFERENCES),isInitializedPromiseResolved:!1,initializedPromise:null,initialize:function(){return this.initializedPromise=this._readFromStorage(DEFAULT_PREFERENCES).then(function(a){this.isInitializedPromiseResolved=!0;a&&(this.prefs=a)}.bind(this))},_writeToStorage:function(){return Promise.resolve()},_readFromStorage:function(){return Promise.resolve()},reset:function(){return this.initializedPromise.then(function(){this.prefs=
+    Object.create(DEFAULT_PREFERENCES);return this._writeToStorage(DEFAULT_PREFERENCES)}.bind(this))},reload:function(){return this.initializedPromise.then(function(){this._readFromStorage(DEFAULT_PREFERENCES).then(function(a){a&&(this.prefs=a)}.bind(this))}.bind(this))},set:function(a,b){return this.initializedPromise.then(function(){if(void 0===DEFAULT_PREFERENCES[a])throw Error("preferencesSet: '"+a+"' is undefined.");if(void 0===b)throw Error("preferencesSet: no value is specified.");var c=typeof b,
+    e=typeof DEFAULT_PREFERENCES[a];if(c!==e)if("number"===c&&"string"===e)b=b.toString();else throw Error("Preferences_set: '"+b+"' is a \""+c+'", expected "'+e+'".');else if("number"===c&&(b|0)!==b)throw Error("Preferences_set: '"+b+'\' must be an "integer".');this.prefs[a]=b;return this._writeToStorage(this.prefs)}.bind(this))},get:function(a){return this.initializedPromise.then(function(){var b=DEFAULT_PREFERENCES[a];if(void 0===b)throw Error("preferencesGet: '"+a+"' is undefined.");var c=this.prefs[a];
+    return void 0!==c?c:b}.bind(this))},_writeToStorage:function(a){return new Promise(function(b){localStorage.setItem("pdfjs.preferences",JSON.stringify(a));b()})},_readFromStorage:function(){return new Promise(function(a){var b=JSON.parse(localStorage.getItem("pdfjs.preferences"));a(b)})}};
+(function(){function a(a){var b=document.createEvent("CustomEvent");b.initCustomEvent(a,!1,!1,"custom");window.dispatchEvent(b)}function b(){if(d)if(e(),++f<d.length){var a=d[f];"function"===typeof a.mozPrintCallback?a.mozPrintCallback({context:a.getContext("2d"),abort:c,done:b}):b()}else e(),g.call(window),setTimeout(c,20)}function c(){d&&(d=null,e(),a("afterprint"))}function e(){var a=document.getElementById("mozPrintCallback-shim");if(d){var b=Math.round(100*f/d.length),e=a.querySelector("progress"),
+    g=a.querySelector(".relative-progress");e.value=b;g.textContent=b+"%";a.removeAttribute("hidden");a.onclick=c}else a.setAttribute("hidden","")}if(!("mozPrintCallback"in document.createElement("canvas"))){HTMLCanvasElement.prototype.mozPrintCallback=void 0;var d,f,g=window.print;window.print=function(){if(d)console.warn("Ignored window.print() because of a pending print job.");else try{a("beforeprint")}finally{d=document.querySelectorAll("canvas"),f=-1,b()}};var h=!!document.attachEvent;window.addEventListener("keydown",
+    function(a){80===a.keyCode&&(a.ctrlKey||a.metaKey)&&!a.altKey&&(!a.shiftKey||window.chrome||window.opera)?(window.print(),h||(a.preventDefault(),a.stopImmediatePropagation?a.stopImmediatePropagation():a.stopPropagation())):27===a.keyCode&&d&&c()},!0);h&&document.attachEvent("onkeydown",function(a){a=a||window.event;if(80===a.keyCode&&a.ctrlKey)return a.keyCode=0,!1});if("onbeforeprint"in window){var j=function(a){"custom"!==a.detail&&a.stopImmediatePropagation&&a.stopImmediatePropagation()};window.addEventListener("beforeprint",
+    j,!1);window.addEventListener("afterprint",j,!1)}}})();
+var DownloadManager=function(){function a(a,b){var d=document.createElement("a");d.click?(d.href=a,d.target="_parent","download"in d&&(d.download=b),(document.body||document.documentElement).appendChild(d),d.click(),d.parentNode.removeChild(d)):(window.top===window&&a.split("#")[0]===window.location.href.split("#")[0]&&(d=-1===a.indexOf("?")?"?":"&",a=a.replace(/#|$/,d+"$&")),window.open(a,"_parent"))}function b(){}b.prototype={downloadUrl:function(b,e){PDFJS.isValidUrl(b,!0)&&a(b+"#pdfjs.action=download",
+    e)},downloadData:function(b,e,d){b=PDFJS.createObjectURL(b,d);a(b,e)},download:function(b,e,d){URL?navigator.msSaveBlob?navigator.msSaveBlob(b,d)||this.downloadUrl(e,d):(b=URL.createObjectURL(b),a(b,d)):this.downloadUrl(e,d)}};return b}(),cache=new Cache(CACHE_SIZE),currentPageNumber=1,ViewHistory=function(){function a(a){this.fingerprint=a;var c;this.isInitializedPromiseResolved=!1;this.initializedPromise=new Promise(function(a){c=a});a=localStorage.getItem("database");this.isInitializedPromiseResolved=
+    !0;this.initialize(a||"{}");c()}a.prototype={initialize:function(a){a=JSON.parse(a);"files"in a||(a.files=[]);a.files.length>=VIEW_HISTORY_MEMORY&&a.files.shift();for(var c,e=0,d=a.files.length;e<d;e++)if(a.files[e].fingerprint===this.fingerprint){c=e;break}"number"!==typeof c&&(c=a.files.push({fingerprint:this.fingerprint})-1);this.file=a.files[c];this.database=a},set:function(a,c){if(this.isInitializedPromiseResolved){this.file[a]=c;var e=JSON.stringify(this.database);localStorage.setItem("database",
+    e)}},get:function(a,c){return!this.isInitializedPromiseResolved?c:this.file[a]||c}};return a}(),PDFFindBar={opened:!1,bar:null,toggleButton:null,findField:null,highlightAll:null,caseSensitive:null,findMsg:null,findStatusIcon:null,findPreviousButton:null,findNextButton:null,initialize:function(a){if("undefined"===typeof PDFFindController||null===PDFFindController)throw"PDFFindBar cannot be initialized without a PDFFindController instance.";this.bar=a.bar;this.toggleButton=a.toggleButton;this.findField=
+    a.findField;this.highlightAll=a.highlightAllCheckbox;this.caseSensitive=a.caseSensitiveCheckbox;this.findMsg=a.findMsg;this.findStatusIcon=a.findStatusIcon;this.findPreviousButton=a.findPreviousButton;this.findNextButton=a.findNextButton;var b=this;this.toggleButton.addEventListener("click",function(){b.toggle()});this.findField.addEventListener("input",function(){b.dispatchEvent("")});this.bar.addEventListener("keydown",function(a){switch(a.keyCode){case 13:a.target===b.findField&&b.dispatchEvent("again",
+    a.shiftKey);break;case 27:b.close()}});this.findPreviousButton.addEventListener("click",function(){b.dispatchEvent("again",!0)});this.findNextButton.addEventListener("click",function(){b.dispatchEvent("again",!1)});this.highlightAll.addEventListener("click",function(){b.dispatchEvent("highlightallchange")});this.caseSensitive.addEventListener("click",function(){b.dispatchEvent("casesensitivitychange")})},dispatchEvent:function(a,b){var c=document.createEvent("CustomEvent");c.initCustomEvent("find"+
+    a,!0,!0,{query:this.findField.value,caseSensitive:this.caseSensitive.checked,highlightAll:this.highlightAll.checked,findPrevious:b});return window.dispatchEvent(c)},updateUIState:function(a,b){var c=!1,e="",d="";switch(a){case FindStates.FIND_PENDING:d="pending";break;case FindStates.FIND_NOTFOUND:e=mozL10n.get("find_not_found",null,"Phrase not found");c=!0;break;case FindStates.FIND_WRAPPED:e=b?mozL10n.get("find_reached_top",null,"Reached top of document, continued from bottom"):mozL10n.get("find_reached_bottom",
+    null,"Reached end of document, continued from top")}c?this.findField.classList.add("notFound"):this.findField.classList.remove("notFound");this.findField.setAttribute("data-status",d);this.findMsg.textContent=e},open:function(){this.opened||(this.opened=!0,this.toggleButton.classList.add("toggled"),this.bar.classList.remove("hidden"));this.findField.select();this.findField.focus()},close:function(){this.opened&&(this.opened=!1,this.toggleButton.classList.remove("toggled"),this.bar.classList.add("hidden"),
+    PDFFindController.active=!1)},toggle:function(){this.opened?this.close():this.open()}},PDFFindController={startedTextExtraction:!1,extractTextPromises:[],pendingFindMatches:{},active:!1,pageContents:[],pageMatches:[],selected:{pageIdx:-1,matchIdx:-1},offset:{pageIdx:null,matchIdx:null},resumePageIdx:null,state:null,dirtyMatch:!1,findTimeout:null,pdfPageSource:null,integratedFind:!1,initialize:function(a){if("undefined"===typeof PDFFindBar||null===PDFFindBar)throw"PDFFindController cannot be initialized without a PDFFindBar instance";
+    this.pdfPageSource=a.pdfPageSource;this.integratedFind=a.integratedFind;a=["find","findagain","findhighlightallchange","findcasesensitivitychange"];this.firstPagePromise=new Promise(function(a){this.resolveFirstPage=a}.bind(this));this.handleEvent=this.handleEvent.bind(this);for(var b=0;b<a.length;b++)window.addEventListener(a[b],this.handleEvent)},reset:function(){this.startedTextExtraction=!1;this.extractTextPromises=[];this.active=!1},calcFindMatch:function(a){var b=this.pageContents[a],c=this.state.query,
+    e=this.state.caseSensitive,d=c.length;if(0!==d){e||(b=b.toLowerCase(),c=c.toLowerCase());for(var e=[],f=-d;;){f=b.indexOf(c,f+d);if(-1===f)break;e.push(f)}this.pageMatches[a]=e;this.updatePage(a);this.resumePageIdx===a&&(this.resumePageIdx=null,this.nextPageMatch())}},extractText:function(){function a(c){d.pdfPageSource.pages[c].getTextContent().then(function(e){e=e.items;for(var h="",j=0;j<e.length;j++)h+=e[j].str;d.pageContents.push(h);b[c](c);c+1<d.pdfPageSource.pages.length&&a(c+1)})}if(!this.startedTextExtraction){this.startedTextExtraction=
+    !0;this.pageContents=[];for(var b=[],c=0,e=this.pdfPageSource.pdfDocument.numPages;c<e;c++)this.extractTextPromises.push(new Promise(function(a){b.push(a)}));var d=this;a(0)}},handleEvent:function(a){if(null===this.state||"findagain"!==a.type)this.dirtyMatch=!0;this.state=a.detail;this.updateUIState(FindStates.FIND_PENDING);this.firstPagePromise.then(function(){this.extractText();clearTimeout(this.findTimeout);"find"===a.type?this.findTimeout=setTimeout(this.nextMatch.bind(this),250):this.nextMatch()}.bind(this))},
+    updatePage:function(a){var b=this.pdfPageSource.pages[a];this.selected.pageIdx===a&&b.scrollIntoView();b.textLayer&&b.textLayer.updateMatches()},nextMatch:function(){var a=this.state.findPrevious,b=this.pdfPageSource.page-1,c=this.pdfPageSource.pages.length;this.active=!0;if(this.dirtyMatch){this.dirtyMatch=!1;this.selected.pageIdx=this.selected.matchIdx=-1;this.offset.pageIdx=b;this.offset.matchIdx=null;this.hadMatch=!1;this.resumePageIdx=null;this.pageMatches=[];for(var e=this,b=0;b<c;b++)this.updatePage(b),
+    b in this.pendingFindMatches||(this.pendingFindMatches[b]=!0,this.extractTextPromises[b].then(function(a){delete e.pendingFindMatches[a];e.calcFindMatch(a)}))}if(""===this.state.query)this.updateUIState(FindStates.FIND_FOUND);else if(!this.resumePageIdx){c=this.offset;if(null!==c.matchIdx){b=this.pageMatches[c.pageIdx].length;if(!a&&c.matchIdx+1<b||a&&0<c.matchIdx){this.hadMatch=!0;c.matchIdx=a?c.matchIdx-1:c.matchIdx+1;this.updateMatch(!0);return}this.advanceOffsetPage(a)}this.nextPageMatch()}},
+    matchesReady:function(a){var b=this.offset;a=a.length;var c=this.state.findPrevious;if(a)return this.hadMatch=!0,b.matchIdx=c?a-1:0,this.updateMatch(!0),!0;this.advanceOffsetPage(c);return b.wrapped&&(b.matchIdx=null,!this.hadMatch)?(this.updateMatch(!1),!0):!1},nextPageMatch:function(){null!==this.resumePageIdx&&console.error("There can only be one pending page.");do{var a=this.offset.pageIdx,b=this.pageMatches[a];if(!b){this.resumePageIdx=a;break}}while(!this.matchesReady(b))},advanceOffsetPage:function(a){var b=
+        this.offset,c=this.extractTextPromises.length;b.pageIdx=a?b.pageIdx-1:b.pageIdx+1;b.matchIdx=null;if(b.pageIdx>=c||0>b.pageIdx)b.pageIdx=a?c-1:0,b.wrapped=!0},updateMatch:function(a){var b=FindStates.FIND_NOTFOUND,c=this.offset.wrapped;this.offset.wrapped=!1;a&&(a=this.selected.pageIdx,this.selected.pageIdx=this.offset.pageIdx,this.selected.matchIdx=this.offset.matchIdx,b=c?FindStates.FIND_WRAPPED:FindStates.FIND_FOUND,-1!==a&&a!==this.selected.pageIdx&&this.updatePage(a));this.updateUIState(b,this.state.findPrevious);
+        -1!==this.selected.pageIdx&&this.updatePage(this.selected.pageIdx,!0)},updateUIState:function(a,b){this.integratedFind?FirefoxCom.request("updateFindControlState",{result:a,findPrevious:b}):PDFFindBar.updateUIState(a,b)}},PDFHistory={initialized:!1,initialDestination:null,initialize:function(a){function b(){var a=c._getPreviousParams(null,!0);a&&(c._pushToHistory(a,!1,!c.current.dest&&c.current.hash!==c.previousHash),c._updatePreviousBookmark());window.removeEventListener("beforeunload",b,!1)}if(!PDFJS.disableHistory&&
+    !PDFView.isViewerEmbedded){this.initialized=!0;this.reInitialized=!1;this.historyUnlocked=this.allowHashChange=!0;this.previousHash=window.location.hash.substring(1);this.currentBookmark="";this.currentPage=0;this.updatePreviousBookmark=!1;this.previousBookmark="";this.previousPage=0;this.nextHashParam="";this.fingerprint=a;this.currentUid=this.uid=0;this.current={};a=window.history.state;this._isStateObjectDefined(a)?(a.target.dest?this.initialDestination=a.target.dest:PDFView.initialBookmark=a.target.hash,
+    this.currentUid=a.uid,this.uid=a.uid+1,this.current=a.target):(a&&(a.fingerprint&&this.fingerprint!==a.fingerprint)&&(this.reInitialized=!0),this._pushOrReplaceState({fingerprint:this.fingerprint},!0));var c=this;window.addEventListener("popstate",function(a){a.preventDefault();a.stopPropagation();c.historyUnlocked&&(a.state?c._goTo(a.state):(c.previousHash=window.location.hash.substring(1),0===c.uid&&(a=c.previousHash&&c.currentBookmark&&c.previousHash!==c.currentBookmark?{hash:c.currentBookmark,
+    page:c.currentPage}:{page:1},c.historyUnlocked=!1,c.allowHashChange=!1,window.history.back(),c._pushToHistory(a,!1,!0),window.history.forward(),c.historyUnlocked=!0),c._pushToHistory({hash:c.previousHash},!1,!0),c._updatePreviousBookmark()))},!1);window.addEventListener("beforeunload",b,!1);window.addEventListener("pageshow",function(){window.addEventListener("beforeunload",b,!1)},!1)}},_isStateObjectDefined:function(a){return a&&0<=a.uid&&a.fingerprint&&this.fingerprint===a.fingerprint&&a.target&&
+a.target.hash?!0:!1},_pushOrReplaceState:function(a,b){b?window.history.replaceState(a,"",document.URL):window.history.pushState(a,"",document.URL)},get isHashChangeUnlocked(){if(!this.initialized)return!0;var a=this.allowHashChange;this.allowHashChange=!0;return a},_updatePreviousBookmark:function(){this.updatePreviousBookmark&&(this.currentBookmark&&this.currentPage)&&(this.previousBookmark=this.currentBookmark,this.previousPage=this.currentPage,this.updatePreviousBookmark=!1)},updateCurrentBookmark:function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    b){this.initialized&&(this.currentBookmark=a.substring(1),this.currentPage=b|0,this._updatePreviousBookmark())},updateNextHashParam:function(a){this.initialized&&(this.nextHashParam=a)},push:function(a,b){if(this.initialized&&this.historyUnlocked)if(a.dest&&!a.hash&&(a.hash=this.current.hash&&this.current.dest&&this.current.dest===a.dest?this.current.hash:PDFView.getDestinationHash(a.dest).split("#")[1]),a.page&&(a.page|=0),b){var c=window.history.state.target;c||(this._pushToHistory(a,!1),this.previousHash=
+    window.location.hash.substring(1));this.updatePreviousBookmark=this.nextHashParam?!1:!0;c&&this._updatePreviousBookmark()}else{if(this.nextHashParam){if(this.nextHashParam===a.hash){this.nextHashParam=null;this.updatePreviousBookmark=!0;return}this.nextHashParam=null}a.hash?this.current.hash?this.current.hash!==a.hash?this._pushToHistory(a,!0):(!this.current.page&&a.page&&this._pushToHistory(a,!1,!0),this.updatePreviousBookmark=!0):this._pushToHistory(a,!0):this.current.page&&(a.page&&this.current.page!==
+a.page)&&this._pushToHistory(a,!0)}},_getPreviousParams:function(a,b){if(!this.currentBookmark||!this.currentPage)return null;this.updatePreviousBookmark&&(this.updatePreviousBookmark=!1);if(0<this.uid&&(!this.previousBookmark||!this.previousPage))return null;if(!this.current.dest&&!a||b){if(this.previousBookmark===this.currentBookmark)return null}else if(this.current.page||a){if(this.previousPage===this.currentPage)return null}else return null;var c={hash:this.currentBookmark,page:this.currentPage};
+    PresentationMode.active&&(c.hash=null);return c},_stateObj:function(a){return{fingerprint:this.fingerprint,uid:this.uid,target:a}},_pushToHistory:function(a,b,c){this.initialized&&(!a.hash&&a.page&&(a.hash="page="+a.page),b&&!c&&(b=this._getPreviousParams())&&this._pushToHistory(b,!1,!this.current.dest&&this.current.hash!==this.previousHash),this._pushOrReplaceState(this._stateObj(a),c||0===this.uid),this.currentUid=this.uid++,this.current=a,this.updatePreviousBookmark=!0)},_goTo:function(a){if(this.initialized&&
+    this.historyUnlocked&&this._isStateObjectDefined(a)){if(!this.reInitialized&&a.uid<this.currentUid){var b=this._getPreviousParams(!0);if(b){this._pushToHistory(this.current,!1);this._pushToHistory(b,!1);this.currentUid=a.uid;window.history.back();return}}this.historyUnlocked=!1;a.target.dest?PDFView.navigateTo(a.target.dest):PDFView.setHash(a.target.hash);this.currentUid=a.uid;a.uid>this.uid&&(this.uid=a.uid);this.current=a.target;this.updatePreviousBookmark=!0;a=window.location.hash.substring(1);
+    this.previousHash!==a&&(this.allowHashChange=!1);this.previousHash=a;this.historyUnlocked=!0}},back:function(){this.go(-1)},forward:function(){this.go(1)},go:function(a){if(this.initialized&&this.historyUnlocked){var b=window.history.state;-1===a&&b&&0<b.uid?window.history.back():1===a&&(b&&b.uid<this.uid-1)&&window.history.forward()}}},SecondaryToolbar={opened:!1,previousContainerHeight:null,newContainerHeight:null,initialize:function(a){this.toolbar=a.toolbar;this.presentationMode=a.presentationMode;
+    this.documentProperties=a.documentProperties;this.buttonContainer=this.toolbar.firstElementChild;this.toggleButton=a.toggleButton;this.presentationModeButton=a.presentationModeButton;this.openFile=a.openFile;this.print=a.print;this.download=a.download;this.viewBookmark=a.viewBookmark;this.firstPage=a.firstPage;this.lastPage=a.lastPage;this.pageRotateCw=a.pageRotateCw;this.pageRotateCcw=a.pageRotateCcw;this.documentPropertiesButton=a.documentPropertiesButton;a=[{element:this.toggleButton,handler:this.toggle},
+        {element:this.presentationModeButton,handler:this.presentationModeClick},{element:this.openFile,handler:this.openFileClick},{element:this.print,handler:this.printClick},{element:this.download,handler:this.downloadClick},{element:this.viewBookmark,handler:this.viewBookmarkClick},{element:this.firstPage,handler:this.firstPageClick},{element:this.lastPage,handler:this.lastPageClick},{element:this.pageRotateCw,handler:this.pageRotateCwClick},{element:this.pageRotateCcw,handler:this.pageRotateCcwClick},
+        {element:this.documentPropertiesButton,handler:this.documentPropertiesClick}];for(var b in a){var c=a[b].element;c&&c.addEventListener("click",a[b].handler.bind(this))}},presentationModeClick:function(){this.presentationMode.request();this.close()},openFileClick:function(){document.getElementById("fileInput").click();this.close()},printClick:function(){window.print();this.close()},downloadClick:function(){PDFView.download();this.close()},viewBookmarkClick:function(){this.close()},firstPageClick:function(){PDFView.page=
+    1;this.close()},lastPageClick:function(){PDFView.page=PDFView.pdfDocument.numPages;this.close()},pageRotateCwClick:function(){PDFView.rotatePages(90)},pageRotateCcwClick:function(){PDFView.rotatePages(-90)},documentPropertiesClick:function(){this.documentProperties.show();this.close()},setMaxHeight:function(a){a&&this.buttonContainer&&(this.newContainerHeight=a.clientHeight,this.previousContainerHeight!==this.newContainerHeight&&(this.buttonContainer.setAttribute("style","max-height: "+(this.newContainerHeight-
+    SCROLLBAR_PADDING)+"px;"),this.previousContainerHeight=this.newContainerHeight))},open:function(){this.opened||(this.opened=!0,this.toggleButton.classList.add("toggled"),this.toolbar.classList.remove("hidden"))},close:function(a){if(this.opened&&(!a||this.toolbar.contains(a)))this.opened=!1,this.toolbar.classList.add("hidden"),this.toggleButton.classList.remove("toggled")},toggle:function(){this.opened?this.close():this.open()}},PasswordPrompt={visible:!1,updatePassword:null,reason:null,overlayContainer:null,
+    passwordField:null,passwordText:null,passwordSubmit:null,passwordCancel:null,initialize:function(a){this.overlayContainer=a.overlayContainer;this.passwordField=a.passwordField;this.passwordText=a.passwordText;this.passwordSubmit=a.passwordSubmit;this.passwordCancel=a.passwordCancel;this.passwordSubmit.addEventListener("click",this.verifyPassword.bind(this));this.passwordCancel.addEventListener("click",this.hide.bind(this));this.passwordField.addEventListener("keydown",function(a){13===a.keyCode&&
+    this.verifyPassword()}.bind(this));window.addEventListener("keydown",function(a){27===a.keyCode&&this.hide()}.bind(this))},show:function(){if(!this.visible){this.visible=!0;this.overlayContainer.classList.remove("hidden");this.overlayContainer.firstElementChild.classList.remove("hidden");this.passwordField.focus();var a=mozL10n.get("password_label",null,"Enter the password to open this PDF file.");this.reason===PDFJS.PasswordResponses.INCORRECT_PASSWORD&&(a=mozL10n.get("password_invalid",null,"Invalid password. Please try again."));
+        this.passwordText.textContent=a}},hide:function(){this.visible&&(this.visible=!1,this.passwordField.value="",this.overlayContainer.classList.add("hidden"),this.overlayContainer.firstElementChild.classList.add("hidden"))},verifyPassword:function(){var a=this.passwordField.value;if(a&&0<a.length)return this.hide(),this.updatePassword(a)}},DELAY_BEFORE_HIDING_CONTROLS=3E3,SELECTOR="presentationControls",DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS=1E3,PresentationMode={active:!1,args:null,contextMenuOpen:!1,
+    prevCoords:{x:null,y:null},initialize:function(a){this.container=a.container;this.secondaryToolbar=a.secondaryToolbar;this.viewer=this.container.firstElementChild;this.firstPage=a.firstPage;this.lastPage=a.lastPage;this.pageRotateCw=a.pageRotateCw;this.pageRotateCcw=a.pageRotateCcw;this.firstPage.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.firstPageClick()}.bind(this));this.lastPage.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.lastPageClick()}.bind(this));
+        this.pageRotateCw.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.pageRotateCwClick()}.bind(this));this.pageRotateCcw.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.pageRotateCcwClick()}.bind(this))},get isFullscreen(){return document.fullscreenElement||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement},_setSwitchInProgress:function(){this.switchInProgress&&clearTimeout(this.switchInProgress);this.switchInProgress=
+        setTimeout(function(){delete this.switchInProgress}.bind(this),DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);PDFView.currentPosition=null},_resetSwitchInProgress:function(){this.switchInProgress&&(clearTimeout(this.switchInProgress),delete this.switchInProgress)},request:function(){if(!PDFView.supportsFullscreen||this.isFullscreen||!this.viewer.hasChildNodes())return!1;this._setSwitchInProgress();if(this.container.requestFullscreen)this.container.requestFullscreen();else if(this.container.mozRequestFullScreen)this.container.mozRequestFullScreen();
+    else if(this.container.webkitRequestFullScreen)this.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);else if(this.container.msRequestFullscreen)this.container.msRequestFullscreen();else return!1;this.args={page:PDFView.page,previousScale:PDFView.currentScaleValue};return!0},enter:function(){this.active=!0;this._resetSwitchInProgress();setTimeout(function(){PDFView.page=this.args.page;PDFView.setScale("page-fit",!0)}.bind(this),0);window.addEventListener("mousemove",this.mouseMove,!1);
+        window.addEventListener("mousedown",this.mouseDown,!1);window.addEventListener("contextmenu",this.contextMenu,!1);this.showControls();HandTool.enterPresentationMode();this.contextMenuOpen=!1;this.container.setAttribute("contextmenu","viewerContextMenu")},exit:function(){var a=PDFView.page;setTimeout(function(){this.active=!1;PDFView.setScale(this.args.previousScale);PDFView.page=a;this.args=null}.bind(this),0);window.removeEventListener("mousemove",this.mouseMove,!1);window.removeEventListener("mousedown",
+        this.mouseDown,!1);window.removeEventListener("contextmenu",this.contextMenu,!1);this.hideControls();PDFView.clearMouseScrollState();HandTool.exitPresentationMode();this.container.removeAttribute("contextmenu");this.contextMenuOpen=!1;scrollIntoView(document.getElementById("thumbnailContainer"+a))},showControls:function(){this.controlsTimeout?clearTimeout(this.controlsTimeout):this.container.classList.add(SELECTOR);this.controlsTimeout=setTimeout(function(){this.container.classList.remove(SELECTOR);
+        delete this.controlsTimeout}.bind(this),DELAY_BEFORE_HIDING_CONTROLS)},hideControls:function(){this.controlsTimeout&&(this.container.classList.remove(SELECTOR),clearTimeout(this.controlsTimeout),delete this.controlsTimeout)},mouseMove:function(a){a={x:a.clientX,y:a.clientY};var b=PresentationMode.prevCoords;PresentationMode.prevCoords=a;a.x===b.x&&a.y===b.y||PresentationMode.showControls()},mouseDown:function(a){var b=PresentationMode;if(b.contextMenuOpen)b.contextMenuOpen=!1,a.preventDefault();else if(0===
+        a.button&&(!a.target.href||!a.target.classList.contains("internalLink")))a.preventDefault(),PDFView.page+=a.shiftKey?-1:1},contextMenu:function(){PresentationMode.contextMenuOpen=!0}};(function(){function a(){PresentationMode.isFullscreen?PresentationMode.enter():PresentationMode.exit()}window.addEventListener("fullscreenchange",a,!1);window.addEventListener("mozfullscreenchange",a,!1);window.addEventListener("webkitfullscreenchange",a,!1);window.addEventListener("MSFullscreenChange",a,!1)})();"use strict";
+var GrabToPan=function(){function a(a){this.element=a.element;this.document=a.element.ownerDocument;"function"===typeof a.ignoreTarget&&(this.ignoreTarget=a.ignoreTarget);this.onActiveChanged=a.onActiveChanged;this.activate=this.activate.bind(this);this.deactivate=this.deactivate.bind(this);this.toggle=this.toggle.bind(this);this._onmousedown=this._onmousedown.bind(this);this._onmousemove=this._onmousemove.bind(this);this._endPan=this._endPan.bind(this);(this.overlay=document.createElement("div")).className=
+        "grab-to-pan-grabbing"}a.prototype={CSS_CLASS_GRAB:"grab-to-pan-grab",activate:function(){if(!this.active&&(this.active=!0,this.element.addEventListener("mousedown",this._onmousedown,!0),this.element.classList.add(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!0)},deactivate:function(){if(this.active&&(this.active=!1,this.element.removeEventListener("mousedown",this._onmousedown,!0),this._endPan(),this.element.classList.remove(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!1)},
+        toggle:function(){this.active?this.deactivate():this.activate()},ignoreTarget:function(a){return a[b]("a[href], a[href] *, input, textarea, button, button *, select, option")},_onmousedown:function(a){if(!(0!==a.button||this.ignoreTarget(a.target))){if(a.originalTarget)try{a.originalTarget.tagName}catch(b){return}this.scrollLeftStart=this.element.scrollLeft;this.scrollTopStart=this.element.scrollTop;this.clientXStart=a.clientX;this.clientYStart=a.clientY;this.document.addEventListener("mousemove",
+        this._onmousemove,!0);this.document.addEventListener("mouseup",this._endPan,!0);this.element.addEventListener("scroll",this._endPan,!0);a.preventDefault();a.stopPropagation();this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING)}},_onmousemove:function(a){this.element.removeEventListener("scroll",this._endPan,!0);var b;b="buttons"in a&&c?!(a.buttons|1):d||f?0===a.which:void 0;b?this._endPan():(b=a.clientX-this.clientXStart,this.element.scrollTop=this.scrollTopStart-(a.clientY-this.clientYStart),
+            this.element.scrollLeft=this.scrollLeftStart-b,this.overlay.parentNode||document.body.appendChild(this.overlay))},_endPan:function(){this.element.removeEventListener("scroll",this._endPan,!0);this.document.removeEventListener("mousemove",this._onmousemove,!0);this.document.removeEventListener("mouseup",this._endPan,!0);this.overlay.parentNode&&this.overlay.parentNode.removeChild(this.overlay)}};var b;["webkitM","mozM","msM","oM","m"].some(function(a){a+="atches";a in document.documentElement&&(b=
+        a);a+="Selector";a in document.documentElement&&(b=a);return b});var c=!document.documentMode||9<document.documentMode,e=window.chrome,d=e&&(e.webstore||e.app),f=/Apple/.test(navigator.vendor)&&/Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);return a}(),HandTool={initialize:function(a){var b=a.toggleHandTool;this.handTool=new GrabToPan({element:a.container,onActiveChanged:function(a){b&&(a?(b.title=mozL10n.get("hand_tool_disable.title",null,"Disable hand tool"),b.firstElementChild.textContent=
+        mozL10n.get("hand_tool_disable_label",null,"Disable hand tool")):(b.title=mozL10n.get("hand_tool_enable.title",null,"Enable hand tool"),b.firstElementChild.textContent=mozL10n.get("hand_tool_enable_label",null,"Enable hand tool")))}});b&&(b.addEventListener("click",this.toggle.bind(this),!1),window.addEventListener("localized",function(){Preferences.get("enableHandToolOnLoad").then(function(a){a&&this.handTool.activate()}.bind(this))}.bind(this)))},toggle:function(){this.handTool.toggle();SecondaryToolbar.close()},
+        enterPresentationMode:function(){this.handTool.active&&(this.wasActive=!0,this.handTool.deactivate())},exitPresentationMode:function(){this.wasActive&&(this.wasActive=null,this.handTool.activate())}},DocumentProperties={overlayContainer:null,fileName:"",fileSize:"",visible:!1,fileNameField:null,fileSizeField:null,titleField:null,authorField:null,subjectField:null,keywordsField:null,creationDateField:null,modificationDateField:null,creatorField:null,producerField:null,versionField:null,pageCountField:null,
+        initialize:function(a){this.overlayContainer=a.overlayContainer;this.fileNameField=a.fileNameField;this.fileSizeField=a.fileSizeField;this.titleField=a.titleField;this.authorField=a.authorField;this.subjectField=a.subjectField;this.keywordsField=a.keywordsField;this.creationDateField=a.creationDateField;this.modificationDateField=a.modificationDateField;this.creatorField=a.creatorField;this.producerField=a.producerField;this.versionField=a.versionField;this.pageCountField=a.pageCountField;a.closeButton&&
+        a.closeButton.addEventListener("click",this.hide.bind(this));this.dataAvailablePromise=new Promise(function(a){this.resolveDataAvailable=a}.bind(this));window.addEventListener("keydown",function(a){27===a.keyCode&&this.hide()}.bind(this))},getProperties:function(){this.visible&&(this.fileName=getPDFFileNameFromURL(PDFView.url),PDFView.pdfDocument.getDownloadInfo().then(function(a){this.setFileSize(a.length);this.updateUI(this.fileSizeField,this.fileSize)}.bind(this)),PDFView.pdfDocument.getMetadata().then(function(a){a=
+            [{field:this.fileNameField,content:this.fileName},{field:this.titleField,content:a.info.Title},{field:this.authorField,content:a.info.Author},{field:this.subjectField,content:a.info.Subject},{field:this.keywordsField,content:a.info.Keywords},{field:this.creationDateField,content:this.parseDate(a.info.CreationDate)},{field:this.modificationDateField,content:this.parseDate(a.info.ModDate)},{field:this.creatorField,content:a.info.Creator},{field:this.producerField,content:a.info.Producer},{field:this.versionField,
+                content:a.info.PDFFormatVersion},{field:this.pageCountField,content:PDFView.pdfDocument.numPages}];for(var b in a){var c=a[b];this.updateUI(c.field,c.content)}}.bind(this)))},updateUI:function(a,b){a&&(void 0!==b&&""!==b)&&(a.textContent=b)},setFileSize:function(a){var b=a/1024;this.fileSize=1024>b?mozL10n.get("document_properties_kb",{size_kb:(+b.toPrecision(3)).toLocaleString(),size_b:a.toLocaleString()},"{{size_kb}} KB ({{size_b}} bytes)"):mozL10n.get("document_properties_mb",{size_mb:(+(b/1024).toPrecision(3)).toLocaleString(),
+            size_b:a.toLocaleString()},"{{size_mb}} MB ({{size_b}} bytes)")},show:function(){this.visible||(this.visible=!0,this.overlayContainer.classList.remove("hidden"),this.overlayContainer.lastElementChild.classList.remove("hidden"),this.dataAvailablePromise.then(function(){this.getProperties()}.bind(this)))},hide:function(){this.visible&&(this.visible=!1,this.overlayContainer.classList.add("hidden"),this.overlayContainer.lastElementChild.classList.add("hidden"))},parseDate:function(a){var b=a;if(void 0===
+            b)return"";"D:"===b.substring(0,2)&&(b=b.substring(2));a=parseInt(b.substring(0,4),10);var c=parseInt(b.substring(4,6),10)-1,e=parseInt(b.substring(6,8),10),d=parseInt(b.substring(8,10),10),f=parseInt(b.substring(10,12),10),g=parseInt(b.substring(12,14),10),h=b.substring(14,15),j=parseInt(b.substring(15,17),10),b=parseInt(b.substring(18,20),10);"-"==h?(d+=j,f+=b):"+"==h&&(d-=j,f+=b);c=new Date(Date.UTC(a,c,e,d,f,g));a=c.toLocaleDateString();c=c.toLocaleTimeString();return mozL10n.get("document_properties_date_string",
+        {date:a,time:c},"{{date}}, {{time}}")}},PDFView={pages:[],thumbnails:[],currentScale:UNKNOWN_SCALE,currentScaleValue:null,initialBookmark:document.location.hash.substring(1),container:null,thumbnailContainer:null,initialized:!1,fellback:!1,pdfDocument:null,sidebarOpen:!1,pageViewScroll:null,thumbnailViewScroll:null,pageRotation:0,mouseScrollTimeStamp:0,mouseScrollDelta:0,lastScroll:0,previousPageNumber:1,isViewerEmbedded:window.parent!==window,idleTimeout:null,currentPosition:null,initialize:function(){var a=
+        this,b=this.container=document.getElementById("viewerContainer");this.pageViewScroll={};this.watchScroll(b,this.pageViewScroll,updateViewarea);var c=this.thumbnailContainer=document.getElementById("thumbnailView");this.thumbnailViewScroll={};this.watchScroll(c,this.thumbnailViewScroll,this.renderHighestPriority.bind(this));Preferences.initialize();PDFFindBar.initialize({bar:document.getElementById("findbar"),toggleButton:document.getElementById("viewFind"),findField:document.getElementById("findInput"),
+        highlightAllCheckbox:document.getElementById("findHighlightAll"),caseSensitiveCheckbox:document.getElementById("findMatchCase"),findMsg:document.getElementById("findMsg"),findStatusIcon:document.getElementById("findStatusIcon"),findPreviousButton:document.getElementById("findPrevious"),findNextButton:document.getElementById("findNext")});PDFFindController.initialize({pdfPageSource:this,integratedFind:this.supportsIntegratedFind});HandTool.initialize({container:b,toggleHandTool:document.getElementById("toggleHandTool")});
+        SecondaryToolbar.initialize({toolbar:document.getElementById("secondaryToolbar"),presentationMode:PresentationMode,toggleButton:document.getElementById("secondaryToolbarToggle"),presentationModeButton:document.getElementById("secondaryPresentationMode"),openFile:document.getElementById("secondaryOpenFile"),print:document.getElementById("secondaryPrint"),download:document.getElementById("secondaryDownload"),viewBookmark:document.getElementById("secondaryViewBookmark"),firstPage:document.getElementById("firstPage"),
+            lastPage:document.getElementById("lastPage"),pageRotateCw:document.getElementById("pageRotateCw"),pageRotateCcw:document.getElementById("pageRotateCcw"),documentProperties:DocumentProperties,documentPropertiesButton:document.getElementById("documentProperties")});PasswordPrompt.initialize({overlayContainer:document.getElementById("overlayContainer"),passwordField:document.getElementById("password"),passwordText:document.getElementById("passwordText"),passwordSubmit:document.getElementById("passwordSubmit"),
+            passwordCancel:document.getElementById("passwordCancel")});PresentationMode.initialize({container:b,secondaryToolbar:SecondaryToolbar,firstPage:document.getElementById("contextFirstPage"),lastPage:document.getElementById("contextLastPage"),pageRotateCw:document.getElementById("contextPageRotateCw"),pageRotateCcw:document.getElementById("contextPageRotateCcw")});DocumentProperties.initialize({overlayContainer:document.getElementById("overlayContainer"),closeButton:document.getElementById("documentPropertiesClose"),
+            fileNameField:document.getElementById("fileNameField"),fileSizeField:document.getElementById("fileSizeField"),titleField:document.getElementById("titleField"),authorField:document.getElementById("authorField"),subjectField:document.getElementById("subjectField"),keywordsField:document.getElementById("keywordsField"),creationDateField:document.getElementById("creationDateField"),modificationDateField:document.getElementById("modificationDateField"),creatorField:document.getElementById("creatorField"),
+            producerField:document.getElementById("producerField"),versionField:document.getElementById("versionField"),pageCountField:document.getElementById("pageCountField")});b.addEventListener("scroll",function(){a.lastScroll=Date.now()},!1);return Promise.all([Preferences.get("enableWebGL").then(function(a){PDFJS.disableWebGL=!a})]).then(function(){PDFView.initialized=!0})},getPage:function(a){return this.pdfDocument.getPage(a)},watchScroll:function(a,b,c){b.down=!0;b.lastY=a.scrollTop;a.addEventListener("scroll",
+    function(){var e=a.scrollTop,d=b.lastY;e>d?b.down=!0:e<d&&(b.down=!1);b.lastY=e;c()},!0)},_setScaleUpdatePages:function(a,b,c,e){this.currentScaleValue=b;if(a!==this.currentScale){b=0;for(var d=this.pages.length;b<d;b++)this.pages[b].update(a);this.currentScale=a;if(!e){e=this.page;var f;this.currentPosition&&!IGNORE_CURRENT_POSITION_ON_ZOOM&&(e=this.currentPosition.page,f=[null,{name:"XYZ"},this.currentPosition.left,this.currentPosition.top,null]);this.pages[e-1].scrollIntoView(f)}f=document.createEvent("UIEvents");
+        f.initUIEvent("scalechange",!1,!1,window,0);f.scale=a;f.resetAutoSettings=c;window.dispatchEvent(f)}},setScale:function(a,b,c){if("custom"!==a){var e=parseFloat(a);if(0<e)this._setScaleUpdatePages(e,a,!0,c);else{var d=this.pages[this.page-1];if(d){e=(this.container.clientWidth-(PresentationMode.active?0:SCROLLBAR_PADDING))/d.width*d.scale;d=(this.container.clientHeight-(PresentationMode.active?0:VERTICAL_PADDING))/d.height*d.scale;switch(a){case "page-actual":e=1;break;case "page-width":break;case "page-height":e=
+        d;break;case "page-fit":e=Math.min(e,d);break;case "auto":e=Math.min(MAX_AUTO_SCALE,e);break;default:console.error("pdfViewSetScale: '"+a+"' is an unknown zoom value.");return}this._setScaleUpdatePages(e,a,b,c);selectScaleOption(a)}}}},zoomIn:function(a){var b=this.currentScale;do b=(b*DEFAULT_SCALE_DELTA).toFixed(2),b=Math.ceil(10*b)/10,b=Math.min(MAX_SCALE,b);while(--a&&b<MAX_SCALE);this.setScale(b,!0)},zoomOut:function(a){var b=this.currentScale;do b=(b/DEFAULT_SCALE_DELTA).toFixed(2),b=Math.floor(10*
+            b)/10,b=Math.max(MIN_SCALE,b);while(--a&&b>MIN_SCALE);this.setScale(b,!0)},set page(a){var b=this.pages,c=document.createEvent("UIEvents");c.initUIEvent("pagechange",!1,!1,window,0);0<a&&a<=b.length?(b[a-1].updateStats(),this.previousPageNumber=currentPageNumber,currentPageNumber=a,c.pageNumber=a,window.dispatchEvent(c),updateViewarea.inProgress||this.loading&&1===a||b[a-1].scrollIntoView()):(this.previousPageNumber=a,c.pageNumber=this.page,window.dispatchEvent(c))},get page(){return currentPageNumber},
+        get supportsPrinting(){var a="mozPrintCallback"in document.createElement("canvas");Object.defineProperty(this,"supportsPrinting",{value:a,enumerable:!0,configurable:!0,writable:!1});return a},get supportsFullscreen(){var a=document.documentElement,a=a.requestFullscreen||a.mozRequestFullScreen||a.webkitRequestFullScreen||a.msRequestFullscreen;if(!1===document.fullscreenEnabled||!1===document.mozFullScreenEnabled||!1===document.webkitFullscreenEnabled||!1===document.msFullscreenEnabled)a=!1;Object.defineProperty(this,
+        "supportsFullscreen",{value:a,enumerable:!0,configurable:!0,writable:!1});return a},get supportsIntegratedFind(){Object.defineProperty(this,"supportsIntegratedFind",{value:!1,enumerable:!0,configurable:!0,writable:!1});return!1},get supportsDocumentFonts(){Object.defineProperty(this,"supportsDocumentFonts",{value:!0,enumerable:!0,configurable:!0,writable:!1});return!0},get supportsDocumentColors(){Object.defineProperty(this,"supportsDocumentColors",{value:!0,enumerable:!0,configurable:!0,writable:!1});
+            return!0},get loadingBar(){var a=new ProgressBar("#loadingBar",{});Object.defineProperty(this,"loadingBar",{value:a,enumerable:!0,configurable:!0,writable:!1});return a},get isHorizontalScrollbarEnabled(){return PresentationMode.active?!1:this.container.scrollWidth>this.container.clientWidth},setTitleUsingUrl:function(a){this.url=a;try{this.setTitle(decodeURIComponent(getFileName(a))||a)}catch(b){this.setTitle(a)}},setTitle:function(a){document.title=a},close:function(){document.getElementById("errorWrapper").setAttribute("hidden",
+        "true");if(this.pdfDocument){this.pdfDocument.destroy();this.pdfDocument=null;for(var a=document.getElementById("thumbnailView");a.hasChildNodes();)a.removeChild(a.lastChild);"_loadingInterval"in a&&clearInterval(a._loadingInterval);for(a=document.getElementById("viewer");a.hasChildNodes();)a.removeChild(a.lastChild);"undefined"!==typeof PDFBug&&PDFBug.cleanup()}},open:function(a,b,c,e,d){this.pdfDocument&&Preferences.reload();this.close();c={password:c};"string"===typeof a?(this.setTitleUsingUrl(a),
+            c.url=a):a&&"byteLength"in a&&(c.data=a);if(d)for(var f in d)c[f]=d[f];var g=this;g.loading=!0;g.downloadComplete=!1;PDFJS.getDocument(c,e,function(a,b){PasswordPrompt.updatePassword=a;PasswordPrompt.reason=b;PasswordPrompt.show()},function(a){g.progress(a.loaded/a.total)}).then(function(a){g.load(a,b);g.loading=!1},function(a,b){var c=mozL10n.get("loading_error",null,"An error occurred while loading the PDF.");b&&"InvalidPDFException"===b.name&&(c=mozL10n.get("invalid_file_error",null,"Invalid or corrupted PDF file."));
+            b&&"MissingPDFException"===b.name&&(c=mozL10n.get("missing_file_error",null,"Missing PDF file."));g.error(c,{message:a});g.loading=!1})},download:function(){function a(){e.downloadUrl(b,c)}var b=this.url.split("#")[0],c=getPDFFileNameFromURL(b),e=new DownloadManager;e.onerror=function(){PDFView.error("PDF failed to download.")};this.pdfDocument?this.downloadComplete?this.pdfDocument.getData().then(function(a){a=PDFJS.createBlob(a,"application/pdf");e.download(a,b,c)},a).then(null,a):a():a()},fallback:function(){},
+        navigateTo:function(a){var b="",c=this,e=function(d){c.pendingRefStr=null;var f=d instanceof Object?c.pagesRefMap[d.num+" "+d.gen+" R"]:d+1;f?(f>c.pages.length&&(f=c.pages.length),c.pages[f-1].scrollIntoView(a),PDFHistory.push({dest:a,hash:b,page:f})):c.pdfDocument.getPageIndex(d).then(function(a){c.pagesRefMap[d.num+" "+d.gen+" R"]=a+1;e(d)})};this.destinationsPromise.then(function(){"string"===typeof a&&(b=a,a=c.destinations[a]);a instanceof Array&&e(a[0])})},getDestinationHash:function(a){if("string"===
+            typeof a)return PDFView.getAnchorUrl("#"+escape(a));if(a instanceof Array){var b=a[0];if(b=b instanceof Object?this.pagesRefMap[b.num+" "+b.gen+" R"]:b+1){var b=PDFView.getAnchorUrl("#page="+b),c=a[1];if("object"===typeof c&&"name"in c&&"XYZ"==c.name){var c=a[4]||this.currentScaleValue,e=parseFloat(c);e&&(c=100*e);b+="&zoom="+c;if(a[2]||a[3])b+=","+(a[2]||0)+","+(a[3]||0)}return b}}return""},getAnchorUrl:function(a){return a},error:function(a,b){var c=mozL10n.get("error_version_info",{version:PDFJS.version||
+            "?",build:PDFJS.build||"?"},"PDF.js v{{version}} (build: {{build}})")+"\n";b&&(c+=mozL10n.get("error_message",{message:b.message},"Message: {{message}}"),b.stack?c+="\n"+mozL10n.get("error_stack",{stack:b.stack},"Stack: {{stack}}"):(b.filename&&(c+="\n"+mozL10n.get("error_file",{file:b.filename},"File: {{file}}")),b.lineNumber&&(c+="\n"+mozL10n.get("error_line",{line:b.lineNumber},"Line: {{line}}"))));var e=document.getElementById("errorWrapper");e.removeAttribute("hidden");document.getElementById("errorMessage").textContent=
+            a;var d=document.getElementById("errorClose");d.onclick=function(){e.setAttribute("hidden","true")};var f=document.getElementById("errorMoreInfo"),g=document.getElementById("errorShowMore"),h=document.getElementById("errorShowLess");g.onclick=function(){f.removeAttribute("hidden");g.setAttribute("hidden","true");h.removeAttribute("hidden");f.style.height=f.scrollHeight+"px"};h.onclick=function(){f.setAttribute("hidden","true");g.removeAttribute("hidden");h.setAttribute("hidden","true")};g.oncontextmenu=
+            noContextMenuHandler;h.oncontextmenu=noContextMenuHandler;d.oncontextmenu=noContextMenuHandler;g.removeAttribute("hidden");h.setAttribute("hidden","true");f.value=c},progress:function(a){a=Math.round(100*a);a>PDFView.loadingBar.percent&&(PDFView.loadingBar.percent=a)},load:function(a,b){function c(a,b){a.onAfterDraw=function(){d||(d=!0,f());b.setImage(a.canvas)}}var e=this,d=!1,f=null,g=new Promise(function(a){f=a});PDFFindController.reset();this.pdfDocument=a;DocumentProperties.resolveDataAvailable();
+            var h=a.getDownloadInfo().then(function(){e.downloadComplete=!0;PDFView.loadingBar.hide();document.getElementById("outerContainer").classList.remove("loadingInProgress")}),j=a.numPages,l=a.fingerprint;document.getElementById("numPages").textContent=mozL10n.get("page_of",{pageCount:j},"of {{pageCount}}");document.getElementById("pageNumber").max=j;PDFView.documentFingerprint=l;var n=PDFView.store=new ViewHistory(l);this.pageRotation=0;var s=this.pages=[],t=this.pagesRefMap={},w=this.thumbnails=[],
+            p;this.pagesPromise=l=new Promise(function(a){p=a});var k=a.getPage(1),q=document.getElementById("viewer"),m=document.getElementById("thumbnailView");k.then(function(d){d=d.getViewport((b||1)*CSS_UNITS);for(var f=1;f<=j;++f){var l=d.clone(),n=new PageView(q,f,b,e.navigateTo.bind(e),l),l=new ThumbnailView(m,f,l);c(n,l);s.push(n);w.push(l)}g.then(function(){if(PDFJS.disableAutoFetch)p();else for(var b=j,c=1;c<=j;++c)a.getPage(c).then(function(a,c){var e=s[a-1];e.pdfPage||e.setPdfPage(c);t[c.ref.num+
+            " "+c.ref.gen+" R"]=a;b--;b||p()}.bind(null,c))});h.then(function(){var a=document.createEvent("CustomEvent");a.initCustomEvent("documentload",!0,!0,{});window.dispatchEvent(a)});PDFView.loadingBar.setWidth(q);PDFFindController.resolveFirstPage();PDFHistory.initialize(e.documentFingerprint)});var u,r=Preferences.get("showPreviousViewOnLoad").then(function(a){u=a}),v,x=Preferences.get("defaultZoomValue").then(function(a){v=a});Promise.all([k,n.initializedPromise,r,x]).then(function(){var a=null;if(u&&
+                n.get("exists",!1))var a=n.get("page","1"),c=v||n.get("zoom",PDFView.currentScale),d=n.get("scrollLeft","0"),g=n.get("scrollTop","0"),a="page="+a+"&zoom="+c+","+d+","+g;else v&&(a="page=1&zoom="+v);e.setInitialView(a,b);e.isViewerEmbedded||e.container.focus()},function(a){console.error(a);k.then(function(){e.setInitialView(null,b)})});l.then(function(){PDFView.supportsPrinting&&a.getJavaScript().then(function(a){a.length&&(console.warn("Warning: JavaScript is not supported"),PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript));
+                for(var b=/\bprint\s*\(/g,c=0,e=a.length;c<e;c++){var d=a[c];if(d&&b.test(d)){setTimeout(function(){window.print()});break}}})});r=this.destinationsPromise=a.getDestinations();r.then(function(a){e.destinations=a});Promise.all([l,r,PDFView.animationStartedPromise]).then(function(){a.getOutline().then(function(a){e.outline=new DocumentOutlineView(a);document.getElementById("viewOutline").disabled=!a;a&&Preferences.get("ifAvailableShowOutlineOnLoad").then(function(a){a&&(e.sidebarOpen||document.getElementById("sidebarToggle").click(),
+                e.switchSidebarView("outline"))})});a.getAttachments().then(function(a){e.attachments=new DocumentAttachmentsView(a);document.getElementById("viewAttachments").disabled=!a})});a.getMetadata().then(function(b){var c=b.info;b=b.metadata;e.documentInfo=c;e.metadata=b;console.log("PDF "+a.fingerprint+" ["+c.PDFFormatVersion+" "+(c.Producer||"-").trim()+" / "+(c.Creator||"-").trim()+"] (PDF.js: "+(PDFJS.version||"-")+(!PDFJS.disableWebGL?" [WebGL]":"")+")");var d;b&&b.has("dc:title")&&(d=b.get("dc:title"));
+                !d&&(c&&c.Title)&&(d=c.Title);d&&e.setTitle(d+" - "+document.title);c.IsAcroFormPresent&&(console.warn("Warning: AcroForm/XFA is not supported"),PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.forms))})},setInitialView:function(a,b){this.currentScale=0;this.currentScaleValue=null;document.getElementById("pageNumber").value=currentPageNumber=1;this.currentPosition=null;PDFHistory.initialDestination?(this.navigateTo(PDFHistory.initialDestination),PDFHistory.initialDestination=null):this.initialBookmark?
+            (this.setHash(this.initialBookmark),PDFHistory.push({hash:this.initialBookmark},!!this.initialBookmark),this.initialBookmark=null):a?this.setHash(a):b&&(this.setScale(b,!0),this.page=1);PDFView.currentScale===UNKNOWN_SCALE&&this.setScale(DEFAULT_SCALE,!0)},renderHighestPriority:function(){PDFView.idleTimeout&&(clearTimeout(PDFView.idleTimeout),PDFView.idleTimeout=null);var a=this.getVisiblePages();if(a=this.getHighestPriority(a,this.pages,this.pageViewScroll.down))this.renderView(a,"page");else{if(this.sidebarOpen&&
+            (a=this.getVisibleThumbs(),a=this.getHighestPriority(a,this.thumbnails,this.thumbnailViewScroll.down))){this.renderView(a,"thumbnail");return}PDFView.idleTimeout=setTimeout(function(){PDFView.cleanup()},CLEANUP_TIMEOUT)}},cleanup:function(){for(var a=0,b=this.pages.length;a<b;a++)this.pages[a]&&this.pages[a].renderingState!==RenderingStates.FINISHED&&this.pages[a].reset();this.pdfDocument.cleanup()},getHighestPriority:function(a,b,c){var e=a.views,d=e.length;if(0===d)return!1;for(var f=0;f<d;++f){var g=
+            e[f].view;if(!this.isViewFinished(g))return g}a=c?a.last.id:a.first.id-2;return b[a]&&!this.isViewFinished(b[a])?b[a]:!1},isViewFinished:function(a){return a.renderingState===RenderingStates.FINISHED},renderView:function(a,b){switch(a.renderingState){case RenderingStates.FINISHED:return!1;case RenderingStates.PAUSED:PDFView.highestPriorityPage=b+a.id;a.resume();break;case RenderingStates.RUNNING:PDFView.highestPriorityPage=b+a.id;break;case RenderingStates.INITIAL:PDFView.highestPriorityPage=b+a.id,
+            a.draw(this.renderHighestPriority.bind(this))}return!0},setHash:function(a){if(a)if(0<=a.indexOf("="))if(a=PDFView.parseQueryString(a),"nameddest"in a)PDFHistory.updateNextHashParam(a.nameddest),PDFView.navigateTo(a.nameddest);else{var b,c;"page"in a&&(b=a.page|0||1);if("zoom"in a){c=a.zoom.split(",");var e=c[0],d=parseFloat(e);d&&(e=d/100);c=[null,{name:"XYZ"},1<c.length?c[1]|0:null,2<c.length?c[2]|0:null,e]}c?this.pages[(b||this.page)-1].scrollIntoView(c):b&&(this.page=b);"pagemode"in a&&(b=document.getElementById("sidebarToggle"),
+            "thumbs"===a.pagemode||"bookmarks"===a.pagemode||"attachments"===a.pagemode?(this.sidebarOpen||b.click(),this.switchSidebarView("bookmarks"===a.pagemode?"outline":a.pagemode)):"none"===a.pagemode&&this.sidebarOpen&&b.click())}else/^\d+$/.test(a)?this.page=a:(PDFHistory.updateNextHashParam(unescape(a)),PDFView.navigateTo(unescape(a)))},switchSidebarView:function(a){var b=document.getElementById("thumbnailView"),c=document.getElementById("outlineView"),e=document.getElementById("attachmentsView"),d=
+            document.getElementById("viewThumbnail"),f=document.getElementById("viewOutline"),g=document.getElementById("viewAttachments");switch(a){case "thumbs":a=b.classList.contains("hidden");d.classList.add("toggled");f.classList.remove("toggled");g.classList.remove("toggled");b.classList.remove("hidden");c.classList.add("hidden");e.classList.add("hidden");PDFView.renderHighestPriority();a&&scrollIntoView(document.getElementById("thumbnailContainer"+this.page));break;case "outline":d.classList.remove("toggled");
+            f.classList.add("toggled");g.classList.remove("toggled");b.classList.add("hidden");c.classList.remove("hidden");e.classList.add("hidden");if(f.getAttribute("disabled"))break;break;case "attachments":d.classList.remove("toggled"),f.classList.remove("toggled"),g.classList.add("toggled"),b.classList.add("hidden"),c.classList.add("hidden"),e.classList.remove("hidden"),g.getAttribute("disabled")}},getVisiblePages:function(){if(PresentationMode.active){var a=[],b=this.pages[this.page-1];a.push({id:b.id,
+            view:b});return{first:b,last:b,views:a}}return this.getVisibleElements(this.container,this.pages,!0)},getVisibleThumbs:function(){return this.getVisibleElements(this.thumbnailContainer,this.thumbnails)},getVisibleElements:function(a,b,c){var e=a.scrollTop,d=e+a.clientHeight,f=a.scrollLeft,g=f+a.clientWidth;a=[];for(var h,j,l,n,s,t=0,w=b.length;t<w;++t)if(h=b[t],j=h.el.offsetTop+h.el.clientTop,l=h.el.clientHeight,!(j+l<e)){if(j>d)break;s=h.el.offsetLeft+h.el.clientLeft;n=h.el.clientWidth;s+n<f||s>
+        g||(n=Math.max(0,e-j)+Math.max(0,j+l-d),l=100*(l-n)/l|0,a.push({id:h.id,x:s,y:j,view:h,percent:l}))}b=a[0];e=a[a.length-1];c&&a.sort(function(a,b){var c=a.percent-b.percent;return 0.001<Math.abs(c)?-c:a.id-b.id});return{first:b,last:e,views:a}},parseQueryString:function(a){a=a.split("&");for(var b={},c=0,e=a.length;c<e;++c){var d=a[c].split("="),f=1<d.length?d[1]:null;b[decodeURIComponent(d[0])]=decodeURIComponent(f)}return b},beforePrint:function(){if(this.supportsPrinting){var a=!1,b,c;if(this.pages.length){b=
+            0;for(c=this.pages.length;b<c;++b)if(!this.pages[b].pdfPage){a=!0;break}}else a=!0;if(a)a=mozL10n.get("printing_not_ready",null,"Warning: The PDF is not fully loaded for printing."),window.alert(a);else{document.querySelector("body").setAttribute("data-mozPrintCallback",!0);b=0;for(c=this.pages.length;b<c;++b)this.pages[b].beforePrint()}}else a=mozL10n.get("printing_not_supported",null,"Warning: Printing is not fully supported by this browser."),this.error(a)},afterPrint:function(){for(var a=document.getElementById("printContainer");a.hasChildNodes();)a.removeChild(a.lastChild)},
+        rotatePages:function(a){var b=this.pages[this.page-1],c;this.pageRotation=(this.pageRotation+360+a)%360;a=0;for(c=this.pages.length;a<c;a++){var e=this.pages[a];e.update(e.scale,this.pageRotation)}a=0;for(c=this.thumbnails.length;a<c;a++)this.thumbnails[a].update(this.pageRotation);this.setScale(this.currentScaleValue,!0,!0);this.renderHighestPriority();b&&b.scrollIntoView()},mouseScroll:function(a){var b=(new Date).getTime(),c=this.mouseScrollTimeStamp;b>c&&50>b-c||((0<this.mouseScrollDelta&&0>a||
+        0>this.mouseScrollDelta&&0<a)&&this.clearMouseScrollState(),this.mouseScrollDelta+=a,120<=Math.abs(this.mouseScrollDelta)&&(a=0<this.mouseScrollDelta?-1:1,this.clearMouseScrollState(),c=this.page,1==c&&-1==a||c==this.pages.length&&1==a||(this.page+=a,this.mouseScrollTimeStamp=b)))},clearMouseScrollState:function(){this.mouseScrollDelta=this.mouseScrollTimeStamp=0}},PageView=function(a,b,c,e,d){function f(a,b,c){function e(a,b){a.href=PDFView.getDestinationHash(b);a.onclick=function(){b&&PDFView.navigateTo(b);
+        return!1};b&&(a.className="internalLink")}function d(a,b){a.href=PDFView.getAnchorUrl("");a.onclick=function(){switch(b){case "GoToPage":document.getElementById("pageNumber").focus();break;case "GoBack":PDFHistory.back();break;case "GoForward":PDFHistory.forward();break;case "Find":PDFView.supportsIntegratedFind||PDFFindBar.toggle();break;case "NextPage":PDFView.page++;break;case "PrevPage":PDFView.page--;break;case "LastPage":PDFView.page=PDFView.pages.length;break;case "FirstPage":PDFView.page=
+        1}return!1};a.className="internalLink"}b.getAnnotations().then(function(g){c=c.clone({dontFlip:!0});var f="matrix("+c.transform.join(",")+")",k,q,m,u;if(h.annotationLayer){m=0;for(u=g.length;m<u;m++)k=g[m],(q=h.annotationLayer.querySelector('[data-annotation-id="'+k.id+'"]'))&&CustomStyle.setProp("transform",q,f);h.annotationLayer.removeAttribute("hidden")}else{m=0;for(u=g.length;m<u;m++){k=g[m];var r=PDFJS.Annotation.fromData(k);if(r&&r.hasHtml()){q=r.getHtmlElement(b.commonObjs);q.setAttribute("data-annotation-id",
+    k.id);mozL10n.translate(q);k=r.getData();var r=k.rect,v=b.view,r=PDFJS.Util.normalizeRect([r[0],v[3]-r[1]+v[1],r[2],v[3]-r[3]+v[1]]);q.style.left=r[0]+"px";q.style.top=r[1]+"px";q.style.position="absolute";CustomStyle.setProp("transform",q,f);CustomStyle.setProp("transformOrigin",q,-r[0]+"px "+-r[1]+"px");"Link"===k.subtype&&!k.url&&(r=q.getElementsByTagName("a")[0])&&(k.action?d(r,k.action):e(r,"dest"in k?k.dest:null));h.annotationLayer||(k=document.createElement("div"),k.className="annotationLayer",
+        a.appendChild(k),h.annotationLayer=k);h.annotationLayer.appendChild(q)}}}})}this.id=b;this.rotation=0;this.scale=c||1;this.viewport=d;this.pdfPageRotate=d.rotation;this.renderingState=RenderingStates.INITIAL;this.annotationLayer=this.zoomLayer=this.textLayer=this.resume=null;b=document.createElement("a");b.name=""+this.id;var g=this.el=document.createElement("div");g.id="pageContainer"+this.id;g.className="page";g.style.width=Math.floor(this.viewport.width)+"px";g.style.height=Math.floor(this.viewport.height)+
+        "px";a.appendChild(b);a.appendChild(g);this.setPdfPage=function(a){this.pdfPage=a;this.pdfPageRotate=a.rotate;this.viewport=a.getViewport(this.scale*CSS_UNITS,(this.rotation+this.pdfPageRotate)%360);this.stats=a.stats;this.reset()};this.destroy=function(){this.zoomLayer=null;this.reset();this.pdfPage&&this.pdfPage.destroy()};this.reset=function(a){this.renderTask&&this.renderTask.cancel();this.resume=null;this.renderingState=RenderingStates.INITIAL;g.style.width=Math.floor(this.viewport.width)+"px";
+        g.style.height=Math.floor(this.viewport.height)+"px";for(var b=g.childNodes,c=g.childNodes.length-1;0<=c;c--){var e=b[c];this.zoomLayer&&this.zoomLayer===e||a&&this.annotationLayer===e||g.removeChild(e)}g.removeAttribute("data-loaded");a?this.annotationLayer&&this.annotationLayer.setAttribute("hidden","true"):this.annotationLayer=null;delete this.canvas;this.loadingIconDiv=document.createElement("div");this.loadingIconDiv.className="loadingIcon";g.appendChild(this.loadingIconDiv)};this.update=function(a,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   b){this.scale=a||this.scale;"undefined"!==typeof b&&(this.rotation=b);this.viewport=this.viewport.clone({scale:this.scale*CSS_UNITS,rotation:(this.rotation+this.pdfPageRotate)%360});USE_ONLY_CSS_ZOOM&&this.canvas?this.cssTransform(this.canvas):(this.canvas&&!this.zoomLayer&&(this.zoomLayer=this.canvas.parentNode,this.zoomLayer.style.position="absolute"),this.zoomLayer&&this.cssTransform(this.zoomLayer.firstChild),this.reset(!0))};this.cssTransform=function(a){var b=this.viewport.width,c=this.viewport.height;
+        a.style.width=a.parentNode.style.width=g.style.width=Math.floor(b)+"px";a.style.height=a.parentNode.style.height=g.style.height=Math.floor(c)+"px";var e=this.viewport.rotation-a._viewport.rotation,d=Math.abs(e),h=1,p=1;if(90===d||270===d)h=c/b,p=b/c;CustomStyle.setProp("transform",a,"rotate("+e+"deg) scale("+h+","+p+")");if(this.textLayer){c=Math.abs(this.viewport.rotation-this.textLayer.viewport.rotation);e=b/a.width;if(90===c||270===c)e=b/a.height;a=this.textLayer.textLayerDiv;var k,q;switch(c){case 0:k=
+            q=0;break;case 90:k=0;q="-"+a.style.height;break;case 180:k="-"+a.style.width;q="-"+a.style.height;break;case 270:k="-"+a.style.width;q=0;break;default:console.error("Bad rotation value.")}CustomStyle.setProp("transform",a,"rotate("+c+"deg) scale("+e+", "+e+") translate("+k+", "+q+")");CustomStyle.setProp("transformOrigin",a,"0% 0%")}USE_ONLY_CSS_ZOOM&&this.annotationLayer&&f(g,this.pdfPage,this.viewport)};Object.defineProperty(this,"width",{get:function(){return this.viewport.width},enumerable:!0});
+        Object.defineProperty(this,"height",{get:function(){return this.viewport.height},enumerable:!0});var h=this;this.getPagePoint=function(a,b){return this.viewport.convertToPdfPoint(a,b)};this.scrollIntoView=function(a){if(PresentationMode.active){if(PDFView.page!==this.id){PDFView.page=this.id;return}a=null;PDFView.setScale(PDFView.currentScaleValue,!0,!0)}if(a){var b=0,c=0,e=0,d=0,f,h;h=0===this.rotation%180?!1:!0;f=(h?this.height:this.width)/this.scale/CSS_UNITS;h=(h?this.width:this.height)/this.scale/
+            CSS_UNITS;var k=0;switch(a[1].name){case "XYZ":b=a[2];c=a[3];k=a[4];b=null!==b?b:0;c=null!==c?c:h;break;case "Fit":case "FitB":k="page-fit";break;case "FitH":case "FitBH":c=a[2];k="page-width";break;case "FitV":case "FitBV":b=a[2];e=f;d=h;k="page-height";break;case "FitR":b=a[2];c=a[3];e=a[4]-b;d=a[5]-c;f=(PDFView.container.clientWidth-SCROLLBAR_PADDING)/e/CSS_UNITS;h=(PDFView.container.clientHeight-SCROLLBAR_PADDING)/d/CSS_UNITS;k=Math.min(Math.abs(f),Math.abs(h));break;default:return}k&&k!==PDFView.currentScale?
+            PDFView.setScale(k,!0,!0):PDFView.currentScale===UNKNOWN_SCALE&&PDFView.setScale(DEFAULT_SCALE,!0,!0);"page-fit"===k&&!a[4]?scrollIntoView(g):(b=[this.viewport.convertToViewportPoint(b,c),this.viewport.convertToViewportPoint(b+e,c+d)],a=Math.min(b[0][0],b[1][0]),b=Math.min(b[0][1],b[1][1]),scrollIntoView(g,{left:a,top:b}))}else scrollIntoView(g)};this.getTextContent=function(){return PDFView.getPage(this.id).then(function(a){return a.getTextContent()})};this.draw=function(a){function b(e){u===m.renderTask&&
+        (m.renderTask=null);if("cancelled"!==e){m.renderingState=RenderingStates.FINISHED;m.loadingIconDiv&&(g.removeChild(m.loadingIconDiv),delete m.loadingIconDiv);m.zoomLayer&&(g.removeChild(m.zoomLayer),m.zoomLayer=null);e&&PDFView.error(mozL10n.get("rendering_error",null,"An error occurred while rendering the page."),e);m.stats=c.stats;m.updateStats();if(m.onAfterDraw)m.onAfterDraw();cache.push(m);e=document.createEvent("CustomEvent");e.initCustomEvent("pagerender",!0,!0,{pageNumber:c.pageNumber});g.dispatchEvent(e);
+            a()}}var c=this.pdfPage;if(!this.pagePdfPromise)if(c){this.renderingState!==RenderingStates.INITIAL&&console.error("Must be in new state before drawing");this.renderingState=RenderingStates.RUNNING;var e=this.viewport,d=document.createElement("div");d.style.width=g.style.width;d.style.height=g.style.height;d.classList.add("canvasWrapper");var h=document.createElement("canvas");h.id="page"+this.id;d.appendChild(h);this.annotationLayer?g.insertBefore(d,this.annotationLayer):g.appendChild(d);this.canvas=
+            h;var d=h.getContext("2d"),p=getOutputScale(d);if(USE_ONLY_CSS_ZOOM){var k=e.clone({scale:CSS_UNITS});p.sx*=k.width/e.width;p.sy*=k.height/e.height;p.scaled=!0}h.width=Math.floor(e.width)*p.sx|0;h.height=Math.floor(e.height)*p.sy|0;h.style.width=Math.floor(e.width)+"px";h.style.height=Math.floor(e.height)+"px";h._viewport=e;e=null;PDFJS.disableTextLayer||(e=document.createElement("div"),e.className="textLayer",e.style.width=h.style.width,e.style.height=h.style.height,this.annotationLayer?g.insertBefore(e,
+        this.annotationLayer):g.appendChild(e));var q=this.textLayer=e?new TextLayerBuilder({textLayerDiv:e,pageIndex:this.id-1,lastScrollSource:PDFView,viewport:this.viewport,isViewerInPresentationMode:PresentationMode.active}):null;d._scaleX=p.sx;d._scaleY=p.sy;p.scaled&&d.scale(p.sx,p.sy);var m=this,u=this.renderTask=this.pdfPage.render({canvasContext:d,viewport:this.viewport,textLayer:q,continueCallback:function(a){PDFView.highestPriorityPage!=="page"+m.id?(m.renderingState=RenderingStates.PAUSED,m.resume=
+            function(){m.renderingState=RenderingStates.RUNNING;a()}):a()}});this.renderTask.promise.then(function(){b(null);q&&m.getTextContent().then(function(a){q.setTextContent(a)})},function(a){b(a)});f(g,c,this.viewport);g.setAttribute("data-loaded",!0)}else h=PDFView.getPage(this.id),h.then(function(b){delete this.pagePdfPromise;this.setPdfPage(b);this.draw(a)}.bind(this)),this.pagePdfPromise=h};this.beforePrint=function(){var a=this.pdfPage,b=a.getViewport(1),c=document.createElement("canvas");c.width=
+            2*Math.floor(b.width);c.height=2*Math.floor(b.height);c.style.width=2*b.width+"pt";c.style.height=2*b.height+"pt";CustomStyle.setProp("transform",c,"scale(0.5, 0.5)");CustomStyle.setProp("transformOrigin",c,"0% 0%");var e=document.getElementById("printContainer"),d=document.createElement("div");d.style.width=b.width+"pt";d.style.height=b.height+"pt";d.appendChild(c);e.appendChild(d);c.mozPrintCallback=function(e){var d=e.context;d.save();d.fillStyle="rgb(255, 255, 255)";d.fillRect(0,0,c.width,c.height);
+            d.restore();d.scale(2,2);a.render({canvasContext:d,viewport:b,intent:"print"}).promise.then(function(){e.done()},function(a){console.error(a);"abort"in e?e.abort():e.done()})}};this.updateStats=function(){this.stats&&PDFJS.pdfBug&&Stats.enabled&&Stats.add(this.id,this.stats)}},ThumbnailView=function(a,b,c){var e=document.createElement("a");e.href=PDFView.getAnchorUrl("#page="+b);e.title=mozL10n.get("thumb_page_title",{page:b},"Page {{page}}");e.onclick=function(){PDFView.page=b;return!1};this.pdfPage=
+        void 0;this.viewport=c;this.pdfPageRotate=c.rotation;this.rotation=0;this.pageWidth=this.viewport.width;this.pageHeight=this.viewport.height;this.pageRatio=this.pageWidth/this.pageHeight;this.id=b;this.canvasWidth=98;this.canvasHeight=this.canvasWidth/this.pageWidth*this.pageHeight;this.scale=this.canvasWidth/this.pageWidth;var d=this.el=document.createElement("div");d.id="thumbnailContainer"+b;d.className="thumbnail";1===b&&d.classList.add("selected");var f=document.createElement("div");f.className=
+        "thumbnailSelectionRing";f.style.width=this.canvasWidth+"px";f.style.height=this.canvasHeight+"px";d.appendChild(f);e.appendChild(d);a.appendChild(e);this.hasImage=!1;this.renderingState=RenderingStates.INITIAL;this.setPdfPage=function(a){this.pdfPage=a;this.pdfPageRotate=a.rotate;this.viewport=a.getViewport(1,(this.rotation+this.pdfPageRotate)%360);this.update()};this.update=function(a){void 0!==a&&(this.rotation=a);this.viewport=this.viewport.clone({scale:1,rotation:(this.rotation+this.pdfPageRotate)%
+    360});this.pageWidth=this.viewport.width;this.pageHeight=this.viewport.height;this.pageRatio=this.pageWidth/this.pageHeight;this.canvasHeight=this.canvasWidth/this.pageWidth*this.pageHeight;this.scale=this.canvasWidth/this.pageWidth;d.removeAttribute("data-loaded");f.textContent="";f.style.width=this.canvasWidth+"px";f.style.height=this.canvasHeight+"px";this.hasImage=!1;this.renderingState=RenderingStates.INITIAL;this.resume=null};this.getPageDrawContext=function(){var a=document.createElement("canvas");
+        a.id="thumbnail"+b;a.width=this.canvasWidth;a.height=this.canvasHeight;a.className="thumbnailImage";a.setAttribute("aria-label",mozL10n.get("thumb_page_canvas",{page:b},"Thumbnail of Page {{page}}"));d.setAttribute("data-loaded",!0);f.appendChild(a);a=a.getContext("2d");a.save();a.fillStyle="rgb(255, 255, 255)";a.fillRect(0,0,this.canvasWidth,this.canvasHeight);a.restore();return a};this.drawingRequired=function(){return!this.hasImage};this.draw=function(a){if(this.pdfPage)if(this.renderingState!==
+        RenderingStates.INITIAL&&console.error("Must be in new state before drawing"),this.renderingState=RenderingStates.RUNNING,this.hasImage)a();else{var b=this,c=this.getPageDrawContext(),e=this.viewport.clone({scale:this.scale});this.pdfPage.render({canvasContext:c,viewport:e,continueCallback:function(a){PDFView.highestPriorityPage!=="thumbnail"+b.id?(b.renderingState=RenderingStates.PAUSED,b.resume=function(){b.renderingState=RenderingStates.RUNNING;a()}):a()}}).promise.then(function(){b.renderingState=
+        RenderingStates.FINISHED;a()},function(){b.renderingState=RenderingStates.FINISHED;a()});this.hasImage=!0}else PDFView.getPage(this.id).then(function(b){this.setPdfPage(b);this.draw(a)}.bind(this))};this.setImage=function(a){if(this.pdfPage){if(!this.hasImage&&a){this.renderingState=RenderingStates.FINISHED;var b=this.getPageDrawContext();b.drawImage(a,0,0,a.width,a.height,0,0,b.canvas.width,b.canvas.height);this.hasImage=!0}}else PDFView.getPage(this.id).then(function(b){this.setPdfPage(b);this.setImage(a)}.bind(this))}},
+    FIND_SCROLL_OFFSET_TOP=-50,FIND_SCROLL_OFFSET_LEFT=-400,TextLayerBuilder=function(a){var b=document.createDocumentFragment();this.textLayerDiv=a.textLayerDiv;this.divContentDone=this.layoutDone=!1;this.pageIdx=a.pageIndex;this.matches=[];this.lastScrollSource=a.lastScrollSource;this.viewport=a.viewport;this.isViewerInPresentationMode=a.isViewerInPresentationMode;this.textDivs=[];"undefined"===typeof PDFFindController&&(window.PDFFindController=null);"undefined"===typeof this.lastScrollSource&&(this.lastScrollSource=
+        null);this.renderLayer=function(){var a=this.textDivs,e=document.createElement("canvas").getContext("2d");if(!(1E5<a.length)){for(var d=0,f=a.length;d<f;d++){var g=a[d];if(!("isWhitespace"in g.dataset)){e.font=g.style.fontSize+" "+g.style.fontFamily;var h=e.measureText(g.textContent).width;0<h&&(b.appendChild(g),h="scale("+g.dataset.canvasWidth/h+", 1)",h="rotate("+g.dataset.angle+"deg) "+h,CustomStyle.setProp("transform",g,h),CustomStyle.setProp("transformOrigin",g,"0% 0%"))}}this.textLayerDiv.appendChild(b);
+        this.renderingDone=!0;this.updateMatches()}};this.setupRenderLayoutTimer=function(){var a=this,b=null===this.lastScrollSource?0:this.lastScrollSource.lastScroll;200<Date.now()-b?this.renderLayer():(this.renderTimer&&clearTimeout(this.renderTimer),this.renderTimer=setTimeout(function(){a.setupRenderLayoutTimer()},200))};this.appendText=function(a,b){var d=b[a.fontName],f=document.createElement("div");this.textDivs.push(f);if(/\S/.test(a.str)){var g=PDFJS.Util.transform(this.viewport.transform,a.transform),
+    h=Math.atan2(g[1],g[0]);d.vertical&&(h+=Math.PI/2);var j=Math.sqrt(g[2]*g[2]+g[3]*g[3]),l=d.ascent?d.ascent*j:d.descent?(1+d.descent)*j:j;f.style.position="absolute";f.style.left=g[4]+l*Math.sin(h)+"px";f.style.top=g[5]-l*Math.cos(h)+"px";f.style.fontSize=j+"px";f.style.fontFamily=d.fontFamily;f.textContent=a.str;f.dataset.fontName=a.fontName;f.dataset.angle=h*(180/Math.PI);f.dataset.canvasWidth=d.vertical?a.height*this.viewport.scale:a.width*this.viewport.scale}else f.dataset.isWhitespace=!0};this.setTextContent=
+        function(a){this.textContent=a;for(var b=a.items,d=0;d<b.length;d++)this.appendText(b[d],a.styles);this.divContentDone=!0;this.setupRenderLayoutTimer()};this.convertMatches=function(a){for(var b=0,d=0,f=this.textContent.items,g=f.length-1,h=null===PDFFindController?0:PDFFindController.state.query.length,j=[],l=0;l<a.length;l++){for(var n=a[l];b!==g&&n>=d+f[b].str.length;)d+=f[b].str.length,b++;b==f.length&&console.error("Could not find matching mapping");for(var s={begin:{divIdx:b,offset:n-d}},n=
+        n+h;b!==g&&n>d+f[b].str.length;)d+=f[b].str.length,b++;s.end={divIdx:b,offset:n-d};j.push(s)}return j};this.renderMatches=function(a){function b(a,c){var d=a.divIdx;h[d].textContent="";f(d,0,a.offset,c)}function d(a,b,c){f(a.divIdx,a.offset,b.offset,c)}function f(a,b,c,d){var e=h[a];a=g[a].str.substring(b,c);a=document.createTextNode(a);d?(b=document.createElement("span"),b.className=d,b.appendChild(a),e.appendChild(b)):e.appendChild(a)}if(0!==a.length){var g=this.textContent.items,h=this.textDivs,
+    j=null,l=null===PDFFindController?!1:this.pageIdx===PDFFindController.selected.pageIdx,n=null===PDFFindController?-1:PDFFindController.selected.matchIdx,s={divIdx:-1,offset:void 0},t=n,w=t+1;if(null===PDFFindController?0:PDFFindController.state.highlightAll)t=0,w=a.length;else if(!l)return;for(;t<w;t++){var p=a[t],k=p.begin,p=p.end,q=l&&t===n,m=q?" selected":"";q&&!this.isViewerInPresentationMode&&scrollIntoView(h[k.divIdx],{top:FIND_SCROLL_OFFSET_TOP,left:FIND_SCROLL_OFFSET_LEFT});!j||k.divIdx!==
+    j.divIdx?(null!==j&&d(j,s),b(k)):d(j,k);if(k.divIdx===p.divIdx)d(k,p,"highlight"+m);else{d(k,s,"highlight begin"+m);for(j=k.divIdx+1;j<p.divIdx;j++)h[j].className="highlight middle"+m;b(p,"highlight end"+m)}j=p}j&&d(j,s)}};this.updateMatches=function(){if(this.renderingDone){for(var a=this.matches,b=this.textDivs,d=this.textContent.items,f=-1,g=0;g<a.length;g++){for(var h=a[g],f=Math.max(f,h.begin.divIdx);f<=h.end.divIdx;f++){var j=b[f];j.textContent=d[f].str;j.className=""}f=h.end.divIdx+1}null!==
+    PDFFindController&&PDFFindController.active&&(this.matches=this.convertMatches(null===PDFFindController?[]:PDFFindController.pageMatches[this.pageIdx]||[]),this.renderMatches(this.matches))}}},DocumentOutlineView=function(a){function b(a,b){a.href=PDFView.getDestinationHash(b.dest);a.onclick=function(){PDFView.navigateTo(b.dest);return!1}}for(var c=document.getElementById("outlineView");c.firstChild;)c.removeChild(c.firstChild);if(a)for(a=[{parent:c,items:a}];0<a.length;){var c=a.shift(),e,d=c.items.length;
+        for(e=0;e<d;e++){var f=c.items[e],g=document.createElement("div");g.className="outlineItem";var h=document.createElement("a");b(h,f);h.textContent=f.title;g.appendChild(h);0<f.items.length&&(h=document.createElement("div"),h.className="outlineItems",g.appendChild(h),a.push({parent:h,items:f.items}));c.parent.appendChild(g)}}else c.classList.contains("hidden")||PDFView.switchSidebarView("thumbs")},DocumentAttachmentsView=function(a){function b(a,b){a.href="#";a.onclick=function(){(new DownloadManager).downloadData(b.content,
+    getFileName(b.filename),"");return!1}}for(var c=document.getElementById("attachmentsView");c.firstChild;)c.removeChild(c.firstChild);if(a)for(var e=Object.keys(a).sort(function(a,b){return a.toLowerCase().localeCompare(b.toLowerCase())}),d=0,f=e.length;d<f;d++){var g=a[e[d]],h=document.createElement("div");h.className="attachmentsItem";var j=document.createElement("a");b(j,g);j.textContent=getFileName(g.filename);h.appendChild(j);c.appendChild(h)}else c.classList.contains("hidden")||PDFView.switchSidebarView("thumbs")};
+function webViewerLoad(){PDFView.initialize().then(webViewerInitialized)}
+function webViewerInitialized(){var a=PDFView.parseQueryString(document.location.search.substring(1)),a="file"in a?a.file:PDFJS.DEFAULT_URL,b=document.createElement("input");b.id="fileInput";b.className="fileInput";b.setAttribute("type","file");b.oncontextmenu=noContextMenuHandler;document.body.appendChild(b);!window.File||!window.FileReader||!window.FileList||!window.Blob?(document.getElementById("openFile").setAttribute("hidden","true"),document.getElementById("secondaryOpenFile").setAttribute("hidden",
+    "true")):document.getElementById("fileInput").value=null;b=document.location.hash.substring(1);b=PDFView.parseQueryString(b);"disableWorker"in b&&(PDFJS.disableWorker="true"===b.disableWorker);"disableRange"in b&&(PDFJS.disableRange="true"===b.disableRange);"disableAutoFetch"in b&&(PDFJS.disableAutoFetch="true"===b.disableAutoFetch);"disableFontFace"in b&&(PDFJS.disableFontFace="true"===b.disableFontFace);"disableHistory"in b&&(PDFJS.disableHistory="true"===b.disableHistory);"webgl"in b&&(PDFJS.disableWebGL=
+    "true"!==b.webgl);"useOnlyCssZoom"in b&&(USE_ONLY_CSS_ZOOM="true"===b.useOnlyCssZoom);"verbosity"in b&&(PDFJS.verbosity=b.verbosity|0);"ignoreCurrentPositionOnZoom"in b&&(IGNORE_CURRENT_POSITION_ON_ZOOM="true"===b.ignoreCurrentPositionOnZoom);var c=PDFJS.locale||navigator.language;"locale"in b&&(c=b.locale);mozL10n.setLanguage(c);if("textLayer"in b)switch(b.textLayer){case "off":PDFJS.disableTextLayer=!0;break;case "visible":case "shadow":case "hover":document.getElementById("viewer").classList.add("textLayer-"+
+    b.textLayer)}"pdfBug"in b&&(PDFJS.pdfBug=!0,b=b.pdfBug.split(","),PDFBug.enable(b),PDFBug.init());PDFView.supportsPrinting||(document.getElementById("print").classList.add("hidden"),document.getElementById("secondaryPrint").classList.add("hidden"));PDFView.supportsFullscreen||(document.getElementById("presentationMode").classList.add("hidden"),document.getElementById("secondaryPresentationMode").classList.add("hidden"));PDFView.supportsIntegratedFind&&document.getElementById("viewFind").classList.add("hidden");
+    PDFJS.UnsupportedManager.listen(PDFView.fallback.bind(PDFView));document.getElementById("scaleSelect").oncontextmenu=noContextMenuHandler;var e=document.getElementById("mainContainer"),d=document.getElementById("outerContainer");e.addEventListener("transitionend",function(a){a.target==e&&(a=document.createEvent("UIEvents"),a.initUIEvent("resize",!1,!1,window,0),window.dispatchEvent(a),d.classList.remove("sidebarMoving"))},!0);document.getElementById("sidebarToggle").addEventListener("click",function(){this.classList.toggle("toggled");
+        d.classList.add("sidebarMoving");d.classList.toggle("sidebarOpen");PDFView.sidebarOpen=d.classList.contains("sidebarOpen");PDFView.renderHighestPriority()});document.getElementById("viewThumbnail").addEventListener("click",function(){PDFView.switchSidebarView("thumbs")});document.getElementById("viewOutline").addEventListener("click",function(){PDFView.switchSidebarView("outline")});document.getElementById("viewAttachments").addEventListener("click",function(){PDFView.switchSidebarView("attachments")});
+    document.getElementById("previous").addEventListener("click",function(){PDFView.page--});document.getElementById("next").addEventListener("click",function(){PDFView.page++});document.getElementById("zoomIn").addEventListener("click",function(){PDFView.zoomIn()});document.getElementById("zoomOut").addEventListener("click",function(){PDFView.zoomOut()});document.getElementById("pageNumber").addEventListener("click",function(){this.select()});document.getElementById("pageNumber").addEventListener("change",
+        function(){PDFView.page=this.value|0;this.value!==(this.value|0).toString()&&(this.value=PDFView.page)});document.getElementById("scaleSelect").addEventListener("change",function(){PDFView.setScale(this.value)});document.getElementById("presentationMode").addEventListener("click",SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));document.getElementById("openFile").addEventListener("click",SecondaryToolbar.openFileClick.bind(SecondaryToolbar));document.getElementById("print").addEventListener("click",
+        SecondaryToolbar.printClick.bind(SecondaryToolbar));document.getElementById("download").addEventListener("click",SecondaryToolbar.downloadClick.bind(SecondaryToolbar));a&&PDFView.open(a,0)}document.addEventListener("DOMContentLoaded",webViewerLoad,!0);
+function updateViewarea(){if(PDFView.initialized){var a=PDFView.getVisiblePages(),b=a.views;if(0!==b.length){PDFView.renderHighestPriority();for(var c=PDFView.page,a=a.first,e=0,d=b.length,f=!1;e<d;++e){var g=b[e];if(100>g.percent)break;if(g.id===PDFView.page){f=!0;break}}f||(c=b[0].id);PresentationMode.active||(updateViewarea.inProgress=!0,PDFView.page=c,updateViewarea.inProgress=!1);var b=PDFView.currentScale,c=PDFView.currentScaleValue,h=parseFloat(c)===b?Math.round(1E4*b)/100:c,j=a.id,b="#page="+
+    j+("&zoom="+h),c=PDFView.container,a=PDFView.pages[j-1].getPagePoint(c.scrollLeft-a.x,c.scrollTop-a.y),l=Math.round(a[0]),n=Math.round(a[1]),b=b+(","+l+","+n);PDFView.currentPosition=PresentationMode.active||PresentationMode.switchInProgress?null:{page:j,left:l,top:n};var s=PDFView.store;s.initializedPromise.then(function(){s.set("exists",!0);s.set("page",j);s.set("zoom",h);s.set("scrollLeft",l);s.set("scrollTop",n)});a=PDFView.getAnchorUrl(b);document.getElementById("viewBookmark").href=a;document.getElementById("secondaryViewBookmark").href=
+    a;PDFHistory.updateCurrentBookmark(b,j)}}}window.addEventListener("resize",function(){PDFView.initialized&&(document.getElementById("pageWidthOption").selected||document.getElementById("pageFitOption").selected||document.getElementById("pageAutoOption").selected)&&PDFView.setScale(document.getElementById("scaleSelect").value);updateViewarea();SecondaryToolbar.setMaxHeight(PDFView.container)});window.addEventListener("hashchange",function(){PDFHistory.isHashChangeUnlocked&&PDFView.setHash(document.location.hash.substring(1))});
+window.addEventListener("change",function(a){if((a=a.target.files)&&0!==a.length){a=a[0];if(!PDFJS.disableCreateObjectURL&&"undefined"!==typeof URL&&URL.createObjectURL)PDFView.open(URL.createObjectURL(a),0);else{var b=new FileReader;b.onload=function(a){a=new Uint8Array(a.target.result);PDFView.open(a,0)};b.readAsArrayBuffer(a)}PDFView.setTitleUsingUrl(a.name);document.getElementById("viewBookmark").setAttribute("hidden","true");document.getElementById("secondaryViewBookmark").setAttribute("hidden",
+    "true");document.getElementById("download").setAttribute("hidden","true");document.getElementById("secondaryDownload").setAttribute("hidden","true")}},!0);function selectScaleOption(a){for(var b=document.getElementById("scaleSelect").options,c=!1,e=0;e<b.length;e++){var d=b[e];d.value!=a?d.selected=!1:c=d.selected=!0}return c}
+window.addEventListener("localized",function(){document.getElementsByTagName("html")[0].dir=mozL10n.getDirection();PDFView.animationStartedPromise.then(function(){var a=document.getElementById("scaleSelectContainer");if(0<a.clientWidth){var b=document.getElementById("scaleSelect");b.setAttribute("style","min-width: inherit;");var c=b.clientWidth+SCALE_SELECT_CONTAINER_PADDING;b.setAttribute("style","min-width: "+(c+SCALE_SELECT_PADDING)+"px;");a.setAttribute("style","min-width: "+c+"px; max-width: "+
+    c+"px;")}SecondaryToolbar.setMaxHeight(PDFView.container)})},!0);
+window.addEventListener("scalechange",function(a){document.getElementById("zoomOut").disabled=a.scale===MIN_SCALE;document.getElementById("zoomIn").disabled=a.scale===MAX_SCALE;var b=document.getElementById("customScaleOption");b.selected=!1;if((a.resetAutoSettings||!document.getElementById("pageWidthOption").selected&&!document.getElementById("pageFitOption").selected&&!document.getElementById("pageAutoOption").selected)&&!selectScaleOption(""+a.scale))b.textContent=Math.round(1E4*a.scale)/100+"%",
+    b.selected=!0;updateViewarea()},!0);
+window.addEventListener("pagechange",function(a){a=a.pageNumber;if(PDFView.previousPageNumber!==a){document.getElementById("pageNumber").value=a;var b=document.querySelector(".thumbnail.selected");b&&b.classList.remove("selected");b=document.getElementById("thumbnailContainer"+a);b.classList.add("selected");var c=PDFView.getVisibleThumbs(),e=c.views.length;if(0<e){var d=c.first.id,c=1<e?c.last.id:d;(a<=d||a>=c)&&scrollIntoView(b,{top:THUMBNAIL_SCROLL_MARGIN})}}document.getElementById("previous").disabled=1>=
+    a;document.getElementById("next").disabled=a>=PDFView.pages.length},!0);function handleMouseWheel(a){var b="DOMMouseScroll"===a.type?-a.detail:a.wheelDelta/40,c=0>b?"zoomOut":"zoomIn";a.ctrlKey?(a.preventDefault(),PDFView[c](Math.abs(b))):PresentationMode.active&&PDFView.mouseScroll(40*b)}window.addEventListener("DOMMouseScroll",handleMouseWheel);window.addEventListener("mousewheel",handleMouseWheel);
+window.addEventListener("click",function(a){PresentationMode.active?0===a.button&&a.preventDefault():SecondaryToolbar.opened&&PDFView.container.contains(a.target)&&SecondaryToolbar.close()},!1);
+window.addEventListener("keydown",function(a){if(!PasswordPrompt.visible){var b=!1,c=(a.ctrlKey?1:0)|(a.altKey?2:0)|(a.shiftKey?4:0)|(a.metaKey?8:0);if(1===c||8===c||5===c||12===c)switch(a.keyCode){case 70:PDFView.supportsIntegratedFind||(PDFFindBar.open(),b=!0);break;case 71:PDFView.supportsIntegratedFind||(PDFFindBar.dispatchEvent("again",5===c||12===c),b=!0);break;case 61:case 107:case 187:case 171:PDFView.zoomIn();b=!0;break;case 173:case 109:case 189:PDFView.zoomOut();b=!0;break;case 48:case 96:setTimeout(function(){PDFView.setScale(DEFAULT_SCALE,
+    !0)}),b=!1}if(1===c||8===c)switch(a.keyCode){case 83:PDFView.download(),b=!0}if(3===c||10===c)switch(a.keyCode){case 80:SecondaryToolbar.presentationModeClick();b=!0;break;case 71:document.getElementById("pageNumber").select(),b=!0}if(b)a.preventDefault();else{var e=document.activeElement||document.querySelector(":focus"),d=e&&e.tagName.toUpperCase();if(!(("INPUT"===d||"TEXTAREA"===d||"SELECT"===d)&&27!==a.keyCode)){if(0===c)switch(a.keyCode){case 38:case 33:case 8:if(!PresentationMode.active&&"page-fit"!==
+    PDFView.currentScaleValue)break;case 37:if(PDFView.isHorizontalScrollbarEnabled)break;case 75:case 80:PDFView.page--;b=!0;break;case 27:SecondaryToolbar.opened&&(SecondaryToolbar.close(),b=!0);!PDFView.supportsIntegratedFind&&PDFFindBar.opened&&(PDFFindBar.close(),b=!0);break;case 40:case 34:case 32:if(!PresentationMode.active&&"page-fit"!==PDFView.currentScaleValue)break;case 39:if(PDFView.isHorizontalScrollbarEnabled)break;case 74:case 78:PDFView.page++;b=!0;break;case 36:PresentationMode.active&&
+(PDFView.page=1,b=!0);break;case 35:PresentationMode.active&&(PDFView.page=PDFView.pdfDocument.numPages,b=!0);break;case 72:PresentationMode.active||HandTool.toggle();break;case 82:PDFView.rotatePages(90)}if(4===c)switch(a.keyCode){case 32:if(!PresentationMode.active&&"page-fit"!==PDFView.currentScaleValue)break;PDFView.page--;b=!0;break;case 82:PDFView.rotatePages(-90)}!b&&!PresentationMode.active&&(33<=a.keyCode&&(40>=a.keyCode&&!PDFView.container.contains(e))&&PDFView.container.focus(),32===a.keyCode&&
+"BUTTON"!==d&&(PDFView.container.contains(e)||PDFView.container.focus()));if(2===c)switch(a.keyCode){case 37:PresentationMode.active&&(PDFHistory.back(),b=!0);break;case 39:PresentationMode.active&&(PDFHistory.forward(),b=!0)}b&&(a.preventDefault(),PDFView.clearMouseScrollState())}}}});window.addEventListener("beforeprint",function(){PDFView.beforePrint()});window.addEventListener("afterprint",function(){PDFView.afterPrint()});
+(function(){var a=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){a()};PDFView.animationStartedPromise=new Promise(function(b){a(function(){b()})})})();
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/pdfobject.js b/public/opac/js/universalviewer-2.0.2/lib/pdfobject.js
new file mode 100644
index 0000000000000000000000000000000000000000..ebadb11102fbb194618c7d59a87f586cda3f1245
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/pdfobject.js
@@ -0,0 +1,250 @@
+/*
+    PDFObject v1.2.20111123
+    https://github.com/pipwerks/PDFObject
+    Copyright (c) Philip Hutchison
+    MIT-style license: http://pipwerks.mit-license.org/
+*/
+
+/*jslint browser: true, sloppy: true, white: true, plusplus: true */
+/*global ActiveXObject, window */
+
+var PDFObject = function (obj){
+
+    if(!obj || !obj.url){ return false; }
+
+    var pdfobjectversion = "1.2",
+        //Set reasonable defaults
+        id = obj.id || false,
+        width = obj.width || "100%",
+        height = obj.height || "100%",
+        pdfOpenParams = obj.pdfOpenParams,
+        url,
+        pluginTypeFound,
+
+        //declare functions
+        createAXO,
+        hasReaderActiveX,
+        hasReader,
+        hasGeneric,
+        pluginFound,
+        setCssForFullWindowPdf,
+        buildQueryString,
+        get,
+        embed;
+
+
+    /* ----------------------------------------------------
+       Supporting functions
+       ---------------------------------------------------- */
+
+    createAXO = function (type){
+        var ax;
+        try {
+            ax = new ActiveXObject(type);
+        } catch (e) {
+            //ensure ax remains null
+            ax = null;
+        }
+        return ax;
+    };
+
+    //Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer
+    hasReaderActiveX = function (){
+
+        var axObj = null;
+        
+         try {
+            axObj = new ActiveXObject("AcroPDF.PDF");
+        } catch (e) {
+            // Adobe installed
+        }
+
+        if (axObj != null || window.ActiveXObject) {
+
+            axObj = createAXO("AcroPDF.PDF");
+
+            //If "AcroPDF.PDF" didn't work, try "PDF.PdfCtrl"
+            if(!axObj){ axObj = createAXO("PDF.PdfCtrl"); }
+
+            //If either "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true
+            if (axObj !== null) { return true; }
+
+        }
+
+        //If you got to this point, there's no ActiveXObject for PDFs
+        return false;
+
+    };
+
+
+
+    //Tests specifically for Adobe Reader (aka Adobe Acrobat) in non-IE browsers
+    hasReader = function (){
+
+        var i,
+            n = navigator.plugins,
+            count = n.length,
+            regx = /Adobe Reader|Adobe PDF|Acrobat/gi;
+
+        for(i=0; i<count; i++){
+            if(regx.test(n[i].name)){
+                return true;
+            }
+        }
+
+        return false;
+
+    };
+
+
+    //Detects unbranded PDF support
+    hasGeneric = function (){
+        var plugin = navigator.mimeTypes["application/pdf"];
+        return (plugin && plugin.enabledPlugin);
+    };
+
+
+    //Determines what kind of PDF support is available: Adobe or generic
+    pluginFound = function (){
+
+        var type = null;
+
+        if(hasReader() || hasReaderActiveX()){
+
+            type = "Adobe";
+
+        } else if(hasGeneric()) {
+
+            type = "generic";
+
+        }
+
+        return type;
+
+    };
+
+
+    //If setting PDF to fill page, need to handle some CSS first
+    setCssForFullWindowPdf = function (){
+
+        var html = document.getElementsByTagName("html"),
+            html_style,
+            body_style;
+
+        if(!html){ return false; }
+
+        html_style = html[0].style;
+        body_style = document.body.style;
+
+        html_style.height = "100%";
+        html_style.overflow = "hidden";
+        body_style.margin = "0";
+        body_style.padding = "0";
+        body_style.height = "100%";
+        body_style.overflow = "hidden";
+
+    };
+
+
+    //Creating a querystring for using PDF Open parameters when embedding PDF
+    buildQueryString = function(pdfParams){
+
+        var string = "",
+            prop;
+
+        if(!pdfParams){ return string; }
+
+        for (prop in pdfParams) {
+
+            if (pdfParams.hasOwnProperty(prop)) {
+
+                string += prop + "=";
+
+                if(prop === "search") {
+
+                    string += encodeURI(pdfParams[prop]);
+
+                } else {
+
+                    string += pdfParams[prop];
+
+                }
+
+                string += "&";
+
+            }
+
+        }
+
+        //Remove last ampersand
+        return string.slice(0, string.length - 1);
+
+    };
+
+
+    //Simple function for returning values from PDFObject
+    get = function(prop){
+
+        var value = null;
+
+        switch(prop){
+            case "url" : value = url; break;
+            case "id" : value = id; break;
+            case "width" : value = width; break;
+            case "height" : value = height; break;
+            case "pdfOpenParams" : value = pdfOpenParams; break;
+            case "pluginTypeFound" : value = pluginTypeFound; break;
+            case "pdfobjectversion" : value = pdfobjectversion; break;
+        }
+
+        return value;
+
+    };
+
+
+    /* ----------------------------------------------------
+       PDF Embedding functions
+       ---------------------------------------------------- */
+
+
+    embed = function(targetID){
+
+        if(!pluginTypeFound){ return false; }
+
+        var targetNode = null;
+
+        if(targetID){
+
+            //Allow users to pass an element OR an element's ID
+            targetNode = (targetID.nodeType && targetID.nodeType === 1) ? targetID : document.getElementById(targetID);
+
+            //Ensure target element is found in document before continuing
+            if(!targetNode){ return false; }
+
+        } else {
+
+            targetNode = document.body;
+            setCssForFullWindowPdf();
+            width = "100%";
+            height = "100%";
+
+        }
+
+        targetNode.innerHTML = '<object    data="' +url +'" type="application/pdf" width="' +width +'" height="' +height +'"></object>';
+
+        return targetNode.getElementsByTagName("object")[0];
+
+    };
+
+    //The hash (#) prevents odd behavior in Windows
+    //Append optional Adobe params for opening document
+    url = encodeURI(obj.url) + "#" + buildQueryString(pdfOpenParams);
+    pluginTypeFound = pluginFound();
+
+    this.get = function(prop){ return get(prop); };
+    this.embed = function(id){ return embed(id); };
+    this.pdfobjectversion = pdfobjectversion;
+
+    return this;
+
+};
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/stats.min.js b/public/opac/js/universalviewer-2.0.2/lib/stats.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..39162a531ce5d0b4ae2bd027f7b874dc72e506e1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/stats.min.js
@@ -0,0 +1,7 @@
+
+// stats.js - http://github.com/mrdoob/stats.js
+var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";
+i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div");
+k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=
+"block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:11,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=
+a+"px",m=b,r=0);return b},update:function(){l=this.end()}}};
diff --git a/public/opac/js/universalviewer-2.0.2/lib/three.min.js b/public/opac/js/universalviewer-2.0.2/lib/three.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..bd820fe87c97fe389b224e2655f8e3c6718c7d17
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/three.min.js
@@ -0,0 +1,870 @@
+// threejs.org/license
+'use strict';var THREE={REVISION:"73"};"function"===typeof define&&define.amd?define("three",THREE):"undefined"!==typeof exports&&"undefined"!==typeof module&&(module.exports=THREE);
+void 0!==self.requestAnimationFrame&&void 0!==self.cancelAnimationFrame||function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!self.requestAnimationFrame;++c)self.requestAnimationFrame=self[b[c]+"RequestAnimationFrame"],self.cancelAnimationFrame=self[b[c]+"CancelAnimationFrame"]||self[b[c]+"CancelRequestAnimationFrame"];void 0===self.requestAnimationFrame&&void 0!==self.setTimeout&&(self.requestAnimationFrame=function(b){var c=Date.now(),g=Math.max(0,16-(c-a)),f=self.setTimeout(function(){b(c+
+g)},g);a=c+g;return f});void 0===self.cancelAnimationFrame&&void 0!==self.clearTimeout&&(self.cancelAnimationFrame=function(a){self.clearTimeout(a)})}();void 0===self.performance&&(self.performance={});void 0===self.performance.now&&function(){var a=Date.now();self.performance.now=function(){return Date.now()-a}}();void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});
+void 0===Function.prototype.name&&void 0!==Object.defineProperty&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1]}});THREE.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};THREE.CullFaceNone=0;THREE.CullFaceBack=1;THREE.CullFaceFront=2;THREE.CullFaceFrontBack=3;THREE.FrontFaceDirectionCW=0;THREE.FrontFaceDirectionCCW=1;THREE.BasicShadowMap=0;THREE.PCFShadowMap=1;THREE.PCFSoftShadowMap=2;THREE.FrontSide=0;THREE.BackSide=1;
+THREE.DoubleSide=2;THREE.FlatShading=1;THREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.CustomBlending=5;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.MinEquation=103;THREE.MaxEquation=104;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;
+THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;THREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;THREE.NeverDepth=0;THREE.AlwaysDepth=1;THREE.LessDepth=2;THREE.LessEqualDepth=3;THREE.EqualDepth=4;THREE.GreaterEqualDepth=5;THREE.GreaterDepth=6;THREE.NotEqualDepth=7;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.AddOperation=2;THREE.UVMapping=300;THREE.CubeReflectionMapping=301;
+THREE.CubeRefractionMapping=302;THREE.EquirectangularReflectionMapping=303;THREE.EquirectangularRefractionMapping=304;THREE.SphericalReflectionMapping=305;THREE.RepeatWrapping=1E3;THREE.ClampToEdgeWrapping=1001;THREE.MirroredRepeatWrapping=1002;THREE.NearestFilter=1003;THREE.NearestMipMapNearestFilter=1004;THREE.NearestMipMapLinearFilter=1005;THREE.LinearFilter=1006;THREE.LinearMipMapNearestFilter=1007;THREE.LinearMipMapLinearFilter=1008;THREE.UnsignedByteType=1009;THREE.ByteType=1010;
+THREE.ShortType=1011;THREE.UnsignedShortType=1012;THREE.IntType=1013;THREE.UnsignedIntType=1014;THREE.FloatType=1015;THREE.HalfFloatType=1025;THREE.UnsignedShort4444Type=1016;THREE.UnsignedShort5551Type=1017;THREE.UnsignedShort565Type=1018;THREE.AlphaFormat=1019;THREE.RGBFormat=1020;THREE.RGBAFormat=1021;THREE.LuminanceFormat=1022;THREE.LuminanceAlphaFormat=1023;THREE.RGBEFormat=THREE.RGBAFormat;THREE.RGB_S3TC_DXT1_Format=2001;THREE.RGBA_S3TC_DXT1_Format=2002;THREE.RGBA_S3TC_DXT3_Format=2003;
+THREE.RGBA_S3TC_DXT5_Format=2004;THREE.RGB_PVRTC_4BPPV1_Format=2100;THREE.RGB_PVRTC_2BPPV1_Format=2101;THREE.RGBA_PVRTC_4BPPV1_Format=2102;THREE.RGBA_PVRTC_2BPPV1_Format=2103;THREE.LoopOnce=2200;THREE.LoopRepeat=2201;THREE.LoopPingPong=2202;
+THREE.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(a,b){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};
+THREE.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");this.domElement=document.createElement("canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};THREE.Color=function(a){return 3===arguments.length?this.fromArray(arguments):this.set(a)};
+THREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,set:function(a){a instanceof THREE.Color?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&(d-=1);return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,
+c,d){b=THREE.Math.euclideanModulo(b,1);c=THREE.Math.clamp(c,0,1);d=THREE.Math.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=
+Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/
+360,e=parseInt(c[2],10)/100,g=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,g)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=THREE.ColorKeywords[a],
+void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);return this},convertGammaToLinear:function(){var a=
+this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),g=Math.min(b,c,d),f,h=(g+e)/2;if(g===e)g=f=0;else{var l=e-g,g=.5>=h?l/(e+g):
+l/(2-e-g);switch(e){case b:f=(c-d)/l+(c<d?6:0);break;case c:f=(d-b)/l+2;break;case d:f=(b-c)/l+4}f/=6}a.h=f;a.s=g;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=
+a;this.g+=a;this.b+=a;return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=
+this.r;a[b+1]=this.g;a[b+2]=this.b;return a}};
+THREE.ColorKeywords={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,
+darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,
+grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,
+lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,
+palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,
+tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};THREE.Quaternion=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1};
+THREE.Quaternion.prototype={constructor:THREE.Quaternion,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get w(){return this._w},set w(a){this._w=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},
+copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!1===a instanceof THREE.Euler)throw Error("THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var c=Math.cos(a._x/2),d=Math.cos(a._y/2),e=Math.cos(a._z/2),g=Math.sin(a._x/2),f=Math.sin(a._y/2),h=Math.sin(a._z/2),l=a.order;"XYZ"===l?(this._x=g*d*e+c*f*h,this._y=c*f*e-g*d*h,this._z=c*d*h+g*f*e,this._w=c*d*e-g*f*h):"YXZ"===
+l?(this._x=g*d*e+c*f*h,this._y=c*f*e-g*d*h,this._z=c*d*h-g*f*e,this._w=c*d*e+g*f*h):"ZXY"===l?(this._x=g*d*e-c*f*h,this._y=c*f*e+g*d*h,this._z=c*d*h+g*f*e,this._w=c*d*e-g*f*h):"ZYX"===l?(this._x=g*d*e-c*f*h,this._y=c*f*e+g*d*h,this._z=c*d*h-g*f*e,this._w=c*d*e+g*f*h):"YZX"===l?(this._x=g*d*e+c*f*h,this._y=c*f*e+g*d*h,this._z=c*d*h-g*f*e,this._w=c*d*e-g*f*h):"XZY"===l&&(this._x=g*d*e-c*f*h,this._y=c*f*e-g*d*h,this._z=c*d*h+g*f*e,this._w=c*d*e+g*f*h);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,
+b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],g=b[5],f=b[9],h=b[2],l=b[6],b=b[10],k=c+g+b;0<k?(c=.5/Math.sqrt(k+1),this._w=.25/c,this._x=(l-f)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>g&&c>b?(c=2*Math.sqrt(1+c-g-b),this._w=(l-f)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):g>b?(c=2*Math.sqrt(1+g-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=
+.25*c,this._z=(f+l)/c):(c=2*Math.sqrt(1+b-c-g),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(f+l)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector3);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;this.normalize();return this}}(),inverse:function(){this.conjugate().normalize();return this},conjugate:function(){this._x*=
+-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},
+multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,g=a._w,f=b._x,h=b._y,l=b._z,k=b._w;this._x=c*k+g*f+d*l-e*h;this._y=d*k+g*h+e*f-c*l;this._z=e*k+g*l+c*h-d*f;this._w=g*k-c*f-d*h-e*l;this.onChangeCallback();return this},multiplyVector3:function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");
+return a.applyQuaternion(this)},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,g=this._w,f=g*a._w+c*a._x+d*a._y+e*a._z;0>f?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,f=-f):this.copy(a);if(1<=f)return this._w=g,this._x=c,this._y=d,this._z=e,this;var h=Math.acos(f),l=Math.sqrt(1-f*f);if(.001>Math.abs(l))return this._w=.5*(g+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;f=Math.sin((1-b)*h)/l;h=
+Math.sin(b*h)/l;this._w=g*f+this._w*h;this._x=c*f+this._x*h;this._y=d*f+this._y*h;this._z=e*f+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=
+a;return this},onChangeCallback:function(){}};THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0};
+THREE.Vector2.prototype={constructor:THREE.Vector2,get width(){return this.x},set width(a){this.x=a},get height(){return this.y},set height(a){this.y=a},set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+
+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},
+sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a):this.y=this.x=0;return this},divide:function(a){this.x/=a.x;
+this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector2,b=new THREE.Vector2);a.set(c,c);b.set(d,d);return this.clamp(a,
+b)}}(),clampLength:function(a,b){var c=this.length();this.multiplyScalar(Math.max(a,Math.min(b,c))/c);return this},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=
+-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.multiplyScalar(a/
+this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){this.subVectors(b,a).multiplyScalar(c).add(a);return this},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=
+a.array[b+1];return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,g=this.y-a.y;this.x=e*c-g*d+a.x;this.y=e*d+g*c+a.y;return this}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0};
+THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+
+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,
+b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),
+this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a;return function(b){!1===b instanceof THREE.Euler&&console.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.");void 0===a&&(a=new THREE.Quaternion);this.applyQuaternion(a.setFromEuler(b));
+return this}}(),applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new THREE.Quaternion);this.applyQuaternion(a.setFromAxisAngle(b,c));return this}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14];
+return this},applyProjection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,g=a.y,f=a.z;a=a.w;var h=a*b+g*d-f*c,l=a*c+f*b-e*d,k=a*d+e*c-g*b,b=-e*b-g*c-f*d;this.x=h*a+b*-e+l*-f-k*-g;this.y=l*a+b*-g+k*-e-h*-f;this.z=k*a+b*-f+h*-g-l*-e;return this},project:function(){var a;
+return function(b){void 0===a&&(a=new THREE.Matrix4);a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyProjection(a)}}(),unproject:function(){var a;return function(b){void 0===a&&(a=new THREE.Matrix4);a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyProjection(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;this.normalize();
+return this},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,
+this.z));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector3,b=new THREE.Vector3);a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();this.multiplyScalar(Math.max(a,Math.min(b,c))/c);return this},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},
+round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},
+length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){this.subVectors(b,a).multiplyScalar(c).add(a);return this},cross:function(a,b){if(void 0!==
+b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,g=b.x,f=b.y,h=b.z;this.x=d*h-e*f;this.y=e*g-c*h;this.z=c*f-d*g;return this},projectOnVector:function(){var a,b;return function(c){void 0===a&&(a=new THREE.Vector3);a.copy(c).normalize();b=this.dot(a);return this.copy(a).multiplyScalar(b)}}(),
+projectOnPlane:function(){var a;return function(b){void 0===a&&(a=new THREE.Vector3);a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a;return function(b){void 0===a&&(a=new THREE.Vector3);return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/(this.length()*a.length());return Math.acos(THREE.Math.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=
+this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},setEulerFromRotationMatrix:function(a,b){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(a,b){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},
+getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(a,b)},setFromMatrixPosition:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},setFromMatrixScale:function(a){var b=this.set(a.elements[0],
+a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length();a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){var c=4*a,d=b.elements;this.x=d[c];this.y=d[c+1];this.z=d[c+2];return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===
+a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];return this}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1};
+THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;
+case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},
+addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=
+a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a,this.w*=a):this.w=this.z=this.y=this.x=0;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},
+divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var g=a[8],f=a[1],h=a[5],l=a[9];c=a[2];b=a[6];var k=a[10];if(.01>Math.abs(d-f)&&.01>Math.abs(g-c)&&.01>Math.abs(l-b)){if(.1>Math.abs(d+f)&&.1>Math.abs(g+c)&&.1>Math.abs(l+b)&&.1>Math.abs(e+
+h+k-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;k=(k+1)/2;d=(d+f)/4;g=(g+c)/4;l=(l+b)/4;e>h&&e>k?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=g/b):h>k?.01>h?(b=.707106781,c=0,d=.707106781):(c=Math.sqrt(h),b=d/c,d=l/c):.01>k?(c=b=.707106781,d=0):(d=Math.sqrt(k),b=g/d,c=l/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-l)*(b-l)+(g-c)*(g-c)+(f-d)*(f-d));.001>Math.abs(a)&&(a=1);this.x=(b-l)/a;this.y=(g-c)/a;this.z=(f-d)/a;this.w=Math.acos((e+h+k-1)/2);return this},min:function(a){this.x=
+Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,
+d){void 0===a&&(a=new THREE.Vector4,b=new THREE.Vector4);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},
+roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*
+this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){this.subVectors(b,a).multiplyScalar(c).add(a);return this},equals:function(a){return a.x===
+this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];this.w=a.array[b+3];return this}};
+THREE.Euler=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||THREE.Euler.DefaultOrder};THREE.Euler.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");THREE.Euler.DefaultOrder="XYZ";
+THREE.Euler.prototype={constructor:THREE.Euler,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get order(){return this._order},set order(a){this._order=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,
+this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=THREE.Math.clamp,e=a.elements;a=e[0];var g=e[4],f=e[8],h=e[1],l=e[5],k=e[9],m=e[2],p=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(-k,e),this._z=Math.atan2(-g,a)):(this._x=Math.atan2(p,l),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(k,-1,1)),.99999>Math.abs(k)?
+(this._y=Math.atan2(f,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-m,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(p,-1,1)),.99999>Math.abs(p)?(this._y=Math.atan2(-m,e),this._z=Math.atan2(-g,l)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._x=Math.atan2(p,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-g,l))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-k,l),this._y=Math.atan2(-m,a)):(this._x=
+0,this._y=Math.atan2(f,e))):"XZY"===b?(this._z=Math.asin(-d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(p,l),this._y=Math.atan2(f,a)):(this._x=Math.atan2(-k,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Matrix4);a.makeRotationFromQuaternion(b);this.setFromRotationMatrix(a,c,d);return this}}(),setFromVector3:function(a,
+b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new THREE.Quaternion;return function(b){a.setFromEuler(this);this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+
+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new THREE.Vector3(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};THREE.Line3=function(a,b){this.start=void 0!==a?a:new THREE.Vector3;this.end=void 0!==b?b:new THREE.Vector3};
+THREE.Line3.prototype={constructor:THREE.Line3,set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},center:function(a){return(a||new THREE.Vector3).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new THREE.Vector3).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},
+at:function(a,b){var c=b||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=THREE.Math.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);
+this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}};THREE.Box2=function(a,b){this.min=void 0!==a?a:new THREE.Vector2(Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector2(-Infinity,-Infinity)};
+THREE.Box2.prototype={constructor:THREE.Box2,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new THREE.Vector2;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);
+return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},center:function(a){return(a||new THREE.Vector2).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(a){return(a||new THREE.Vector2).subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);
+this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y?!0:!1},getParameter:function(a,b){return(b||new THREE.Vector2).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>
+this.max.y?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector2).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector2;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&
+a.max.equals(this.max)}};THREE.Box3=function(a,b){this.min=void 0!==a?a:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector3(-Infinity,-Infinity,-Infinity)};
+THREE.Box3.prototype={constructor:THREE.Box3,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new THREE.Vector3;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(){var a=new THREE.Vector3;return function(b){var c=this;b.updateMatrixWorld(!0);
+this.makeEmpty();b.traverse(function(b){var e=b.geometry;if(void 0!==e)if(e instanceof THREE.Geometry)for(var g=e.vertices,e=0,f=g.length;e<f;e++)a.copy(g[e]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a);else if(e instanceof THREE.BufferGeometry&&void 0!==e.attributes.position)for(g=e.attributes.position.array,e=0,f=g.length;e<f;e+=3)a.set(g[e],g[e+1],g[e+2]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)});return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);
+this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},center:function(a){return(a||new THREE.Vector3).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(a){return(a||new THREE.Vector3).subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);
+this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z?!0:!1},getParameter:function(a,b){return(b||new THREE.Vector3).set((a.x-this.min.x)/(this.max.x-
+this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector3).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=
+new THREE.Vector3;return function(b){b=b||new THREE.Sphere;b.center=this.center();b.radius=.5*this.size(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(b){a[0].set(this.min.x,this.min.y,
+this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.makeEmpty();this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);
+this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}};THREE.Matrix3=function(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")};
+THREE.Matrix3.prototype={constructor:THREE.Matrix3,set:function(a,b,c,d,e,g,f,h,l){var k=this.elements;k[0]=a;k[3]=b;k[6]=c;k[1]=d;k[4]=e;k[7]=g;k[2]=f;k[5]=h;k[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);return this},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");
+return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");return this.applyToVector3Array(a)},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Vector3);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix3(this),a.toArray(b,c);return b}}(),applyToBuffer:function(){var a;return function(b,c,d){void 0===
+a&&(a=new THREE.Vector3);void 0===c&&(c=0);void 0===d&&(d=b.length/b.itemSize);for(var e=0;e<d;e++,c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(a.x,a.y,a.z);return b}}(),multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],g=a[4],f=a[5],h=a[6],l=a[7],a=a[8];return b*g*a-b*f*l-c*e*a+c*f*h+d*e*l-d*g*h},getInverse:function(a,
+b){var c=a.elements,d=this.elements;d[0]=c[10]*c[5]-c[6]*c[9];d[1]=-c[10]*c[1]+c[2]*c[9];d[2]=c[6]*c[1]-c[2]*c[5];d[3]=-c[10]*c[4]+c[6]*c[8];d[4]=c[10]*c[0]-c[2]*c[8];d[5]=-c[6]*c[0]+c[2]*c[4];d[6]=c[9]*c[4]-c[5]*c[8];d[7]=-c[9]*c[0]+c[1]*c[8];d[8]=c[5]*c[0]-c[1]*c[4];c=c[0]*d[0]+c[1]*d[3]+c[2]*d[6];if(0===c){if(b)throw Error("Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("Matrix3.getInverse(): can't invert matrix, determinant is 0");this.identity();return this}this.multiplyScalar(1/
+c);return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a},getNormalMatrix:function(a){this.getInverse(a).transpose();return this},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=
+b[2];a[7]=b[5];a[8]=b[8];return this},fromArray:function(a){this.elements.set(a);return this},toArray:function(){var a=this.elements;return[a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]]}};THREE.Matrix4=function(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")};
+THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,g,f,h,l,k,m,p,n,q,s,t){var v=this.elements;v[0]=a;v[4]=b;v[8]=c;v[12]=d;v[1]=e;v[5]=g;v[9]=f;v[13]=h;v[2]=l;v[6]=k;v[10]=m;v[14]=p;v[3]=n;v[7]=q;v[11]=s;v[15]=t;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new THREE.Matrix4).fromArray(this.elements)},copy:function(a){this.elements.set(a.elements);return this},extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");
+return this.copyPosition(a)},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){var d=this.elements;a.set(d[0],d[1],d[2]);b.set(d[4],d[5],d[6]);c.set(d[8],d[9],d[10]);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a;return function(b){void 0===a&&(a=new THREE.Vector3);var c=this.elements;b=b.elements;var d=1/a.set(b[0],
+b[1],b[2]).length(),e=1/a.set(b[4],b[5],b[6]).length(),g=1/a.set(b[8],b[9],b[10]).length();c[0]=b[0]*d;c[1]=b[1]*d;c[2]=b[2]*d;c[4]=b[4]*e;c[5]=b[5]*e;c[6]=b[6]*e;c[8]=b[8]*g;c[9]=b[9]*g;c[10]=b[10]*g;return this}}(),makeRotationFromEuler:function(a){!1===a instanceof THREE.Euler&&console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,g=Math.cos(c),c=Math.sin(c),f=Math.cos(d),d=Math.sin(d),h=Math.cos(e),
+e=Math.sin(e);if("XYZ"===a.order){a=g*h;var l=g*e,k=c*h,m=c*e;b[0]=f*h;b[4]=-f*e;b[8]=d;b[1]=l+k*d;b[5]=a-m*d;b[9]=-c*f;b[2]=m-a*d;b[6]=k+l*d;b[10]=g*f}else"YXZ"===a.order?(a=f*h,l=f*e,k=d*h,m=d*e,b[0]=a+m*c,b[4]=k*c-l,b[8]=g*d,b[1]=g*e,b[5]=g*h,b[9]=-c,b[2]=l*c-k,b[6]=m+a*c,b[10]=g*f):"ZXY"===a.order?(a=f*h,l=f*e,k=d*h,m=d*e,b[0]=a-m*c,b[4]=-g*e,b[8]=k+l*c,b[1]=l+k*c,b[5]=g*h,b[9]=m-a*c,b[2]=-g*d,b[6]=c,b[10]=g*f):"ZYX"===a.order?(a=g*h,l=g*e,k=c*h,m=c*e,b[0]=f*h,b[4]=k*d-l,b[8]=a*d+m,b[1]=f*e,b[5]=
+m*d+a,b[9]=l*d-k,b[2]=-d,b[6]=c*f,b[10]=g*f):"YZX"===a.order?(a=g*f,l=g*d,k=c*f,m=c*d,b[0]=f*h,b[4]=m-a*e,b[8]=k*e+l,b[1]=e,b[5]=g*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+k,b[10]=a-m*e):"XZY"===a.order&&(a=g*f,l=g*d,k=c*f,m=c*d,b[0]=f*h,b[4]=-e,b[8]=d*h,b[1]=a*e+m,b[5]=g*h,b[9]=l*e-k,b[2]=k*e-l,b[6]=c*h,b[10]=m*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");
+return this.makeRotationFromQuaternion(a)},makeRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,g=a.w,f=c+c,h=d+d,l=e+e;a=c*f;var k=c*h,c=c*l,m=d*h,d=d*l,e=e*l,f=g*f,h=g*h,g=g*l;b[0]=1-(m+e);b[4]=k-g;b[8]=c+h;b[1]=k+g;b[5]=1-(a+e);b[9]=d-f;b[2]=c-h;b[6]=d+f;b[10]=1-(a+m);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a,b,c;return function(d,e,g){void 0===a&&(a=new THREE.Vector3);void 0===b&&(b=new THREE.Vector3);void 0===c&&(c=new THREE.Vector3);
+var f=this.elements;c.subVectors(d,e).normalize();0===c.lengthSq()&&(c.z=1);a.crossVectors(g,c).normalize();0===a.lengthSq()&&(c.x+=1E-4,a.crossVectors(g,c).normalize());b.crossVectors(c,a);f[0]=a.x;f[4]=b.x;f[8]=c.x;f[1]=a.y;f[5]=b.y;f[9]=c.y;f[2]=a.z;f[6]=b.z;f[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},
+multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,g=c[0],f=c[4],h=c[8],l=c[12],k=c[1],m=c[5],p=c[9],n=c[13],q=c[2],s=c[6],t=c[10],v=c[14],u=c[3],w=c[7],D=c[11],c=c[15],x=d[0],B=d[4],y=d[8],z=d[12],A=d[1],J=d[5],F=d[9],C=d[13],N=d[2],L=d[6],Q=d[10],M=d[14],K=d[3],E=d[7],O=d[11],d=d[15];e[0]=g*x+f*A+h*N+l*K;e[4]=g*B+f*J+h*L+l*E;e[8]=g*y+f*F+h*Q+l*O;e[12]=g*z+f*C+h*M+l*d;e[1]=k*x+m*A+p*N+n*K;e[5]=k*B+m*J+p*L+n*E;e[9]=k*y+m*F+p*Q+n*O;e[13]=k*z+m*C+p*M+n*d;e[2]=q*x+s*A+t*N+v*
+K;e[6]=q*B+s*J+t*L+v*E;e[10]=q*y+s*F+t*Q+v*O;e[14]=q*z+s*C+t*M+v*d;e[3]=u*x+w*A+D*N+c*K;e[7]=u*B+w*J+D*L+c*E;e[11]=u*y+w*F+D*Q+c*O;e[15]=u*z+w*C+D*M+c*d;return this},multiplyToArray:function(a,b,c){var d=this.elements;this.multiplyMatrices(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;
+b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");return a.applyProjection(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");
+return this.applyToVector3Array(a)},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Vector3);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix4(this),a.toArray(b,c);return b}}(),applyToBuffer:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Vector3);void 0===c&&(c=0);void 0===d&&(d=b.length/b.itemSize);for(var e=0;e<d;e++,c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(a.x,
+a.y,a.z);return b}}(),rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],g=a[1],f=a[5],h=a[9],l=a[13],k=a[2],m=a[6],p=a[10],n=a[14];return a[3]*(+e*h*m-d*l*
+m-e*f*p+c*l*p+d*f*n-c*h*n)+a[7]*(+b*h*n-b*l*p+e*g*p-d*g*n+d*l*k-e*h*k)+a[11]*(+b*l*m-b*f*n-e*g*m+c*g*n+e*f*k-c*l*k)+a[15]*(-d*f*k-b*h*m+b*f*p+d*g*m-c*g*p+c*h*k)},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=
+c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a;return function(){void 0===a&&(a=new THREE.Vector3);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");var b=this.elements;return a.set(b[12],b[13],b[14])}}(),setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=
+this.elements,d=a.elements,e=d[0],g=d[4],f=d[8],h=d[12],l=d[1],k=d[5],m=d[9],p=d[13],n=d[2],q=d[6],s=d[10],t=d[14],v=d[3],u=d[7],w=d[11],d=d[15];c[0]=m*t*u-p*s*u+p*q*w-k*t*w-m*q*d+k*s*d;c[4]=h*s*u-f*t*u-h*q*w+g*t*w+f*q*d-g*s*d;c[8]=f*p*u-h*m*u+h*k*w-g*p*w-f*k*d+g*m*d;c[12]=h*m*q-f*p*q-h*k*s+g*p*s+f*k*t-g*m*t;c[1]=p*s*v-m*t*v-p*n*w+l*t*w+m*n*d-l*s*d;c[5]=f*t*v-h*s*v+h*n*w-e*t*w-f*n*d+e*s*d;c[9]=h*m*v-f*p*v-h*l*w+e*p*w+f*l*d-e*m*d;c[13]=f*p*n-h*m*n+h*l*s-e*p*s-f*l*t+e*m*t;c[2]=k*t*v-p*q*v+p*n*u-l*t*
+u-k*n*d+l*q*d;c[6]=h*q*v-g*t*v-h*n*u+e*t*u+g*n*d-e*q*d;c[10]=g*p*v-h*k*v+h*l*u-e*p*u-g*l*d+e*k*d;c[14]=h*k*n-g*p*n-h*l*q+e*p*q+g*l*t-e*k*t;c[3]=m*q*v-k*s*v-m*n*u+l*s*u+k*n*w-l*q*w;c[7]=g*s*v-f*q*v+f*n*u-e*s*u-g*n*w+e*q*w;c[11]=f*k*v-g*m*v-f*l*u+e*m*u+g*l*w-e*k*w;c[15]=g*m*n-f*k*n+f*l*q-e*m*q-g*l*s+e*k*s;c=e*c[0]+l*c[4]+n*c[8]+v*c[12];if(0===c){if(b)throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");
+this.identity();return this}this.multiplyScalar(1/c);return this},translate:function(a){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(a){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(a){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(a){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(a,b){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},scale:function(a){var b=
+this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);
+return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,g=a.x,f=a.y,h=a.z,l=e*g,k=e*f;this.set(l*g+c,l*f-d*h,l*h+d*f,0,l*f+d*h,k*f+c,k*h-d*g,0,l*h-d*f,k*h+d*g,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,
+0,0,0,0,1);return this},compose:function(a,b,c){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a,b;return function(c,d,e){void 0===a&&(a=new THREE.Vector3);void 0===b&&(b=new THREE.Matrix4);var g=this.elements,f=a.set(g[0],g[1],g[2]).length(),h=a.set(g[4],g[5],g[6]).length(),l=a.set(g[8],g[9],g[10]).length();0>this.determinant()&&(f=-f);c.x=g[12];c.y=g[13];c.z=g[14];b.elements.set(this.elements);c=1/f;var g=1/h,k=1/l;b.elements[0]*=c;b.elements[1]*=
+c;b.elements[2]*=c;b.elements[4]*=g;b.elements[5]*=g;b.elements[6]*=g;b.elements[8]*=k;b.elements[9]*=k;b.elements[10]*=k;d.setFromRotationMatrix(b);e.x=f;e.y=h;e.z=l;return this}}(),makeFrustum:function(a,b,c,d,e,g){var f=this.elements;f[0]=2*e/(b-a);f[4]=0;f[8]=(b+a)/(b-a);f[12]=0;f[1]=0;f[5]=2*e/(d-c);f[9]=(d+c)/(d-c);f[13]=0;f[2]=0;f[6]=0;f[10]=-(g+e)/(g-e);f[14]=-2*g*e/(g-e);f[3]=0;f[7]=0;f[11]=-1;f[15]=0;return this},makePerspective:function(a,b,c,d){a=c*Math.tan(THREE.Math.degToRad(.5*a));
+var e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,b,c,d,e,g){var f=this.elements,h=b-a,l=c-d,k=g-e;f[0]=2/h;f[4]=0;f[8]=0;f[12]=-((b+a)/h);f[1]=0;f[5]=2/l;f[9]=0;f[13]=-((c+d)/l);f[2]=0;f[6]=0;f[10]=-2/k;f[14]=-((g+e)/k);f[3]=0;f[7]=0;f[11]=0;f[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a){this.elements.set(a);return this},toArray:function(){var a=this.elements;return[a[0],
+a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]]}};THREE.Ray=function(a,b){this.origin=void 0!==a?a:new THREE.Vector3;this.direction=void 0!==b?b:new THREE.Vector3};
+THREE.Ray.prototype={constructor:THREE.Ray,set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){return(b||new THREE.Vector3).copy(this.direction).multiplyScalar(a).add(this.origin)},recast:function(){var a=new THREE.Vector3;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,
+b){var c=b||new THREE.Vector3;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new THREE.Vector3;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),
+distanceSqToSegment:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(d,e,g,f){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),l=-this.direction.dot(b),k=c.dot(this.direction),m=-c.dot(b),p=c.lengthSq(),n=Math.abs(1-l*l),q;0<n?(d=l*m-k,e=l*k-m,q=h*n,0<=d?e>=-q?e<=q?(h=1/n,d*=h,e*=h,l=d*(d+l*e+2*k)+e*(l*d+e+2*m)+p):(e=h,d=Math.max(0,-(l*e+k)),l=-d*d+e*(e+2*m)+p):(e=-h,d=Math.max(0,-(l*e+k)),
+l=-d*d+e*(e+2*m)+p):e<=-q?(d=Math.max(0,-(-l*h+k)),e=0<d?-h:Math.min(Math.max(-h,-m),h),l=-d*d+e*(e+2*m)+p):e<=q?(d=0,e=Math.min(Math.max(-h,-m),h),l=e*(e+2*m)+p):(d=Math.max(0,-(l*h+k)),e=0<d?h:Math.min(Math.max(-h,-m),h),l=-d*d+e*(e+2*m)+p)):(e=0<l?-h:h,d=Math.max(0,-(l*e+k)),l=-d*d+e*(e+2*m)+p);g&&g.copy(this.direction).multiplyScalar(d).add(this.origin);f&&f.copy(b).multiplyScalar(e).add(a);return l}}(),isIntersectionSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},intersectSphere:function(){var a=
+new THREE.Vector3;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d,g=b.radius*b.radius;if(e>g)return null;g=Math.sqrt(g-e);e=d-g;d+=g;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),isIntersectionPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+
+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},isIntersectionBox:function(){var a=new THREE.Vector3;return function(b){return null!==this.intersectBox(b,a)}}(),intersectBox:function(a,b){var c,d,e,g,f;d=1/this.direction.x;g=1/this.direction.y;f=1/this.direction.z;var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=g?(e=(a.min.y-h.y)*g,g*=a.max.y-h.y):(e=(a.max.y-h.y)*g,g*=a.min.y-
+h.y);if(c>g||e>d)return null;if(e>c||c!==c)c=e;if(g<d||d!==d)d=g;0<=f?(e=(a.min.z-h.z)*f,f*=a.max.z-h.z):(e=(a.max.z-h.z)*f,f*=a.min.z-h.z);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(f<d||d!==d)d=f;return 0>d?null:this.at(0<=c?c:d,b)},intersectTriangle:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3,d=new THREE.Vector3;return function(e,g,f,h,l){b.subVectors(g,e);c.subVectors(f,e);d.crossVectors(b,c);g=this.direction.dot(d);if(0<g){if(h)return null;h=1}else if(0>g)h=-1,
+g=-g;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;f=h*this.direction.dot(b.cross(a));if(0>f||e+f>g)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/g,l)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a);this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}};
+THREE.Sphere=function(a,b){this.center=void 0!==a?a:new THREE.Vector3;this.radius=void 0!==b?b:0};
+THREE.Sphere.prototype={constructor:THREE.Sphere,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new THREE.Box3;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).center(d);for(var e=0,g=0,f=b.length;g<f;g++)e=Math.max(e,d.distanceToSquared(b[g]));this.radius=Math.sqrt(e);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},
+empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new THREE.Vector3;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));
+return d},getBoundingBox:function(a){a=a||new THREE.Box3;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}};
+THREE.Frustum=function(a,b,c,d,e,g){this.planes=[void 0!==a?a:new THREE.Plane,void 0!==b?b:new THREE.Plane,void 0!==c?c:new THREE.Plane,void 0!==d?d:new THREE.Plane,void 0!==e?e:new THREE.Plane,void 0!==g?g:new THREE.Plane]};
+THREE.Frustum.prototype={constructor:THREE.Frustum,set:function(a,b,c,d,e,g){var f=this.planes;f[0].copy(a);f[1].copy(b);f[2].copy(c);f[3].copy(d);f[4].copy(e);f[5].copy(g);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],g=c[3],f=c[4],h=c[5],l=c[6],k=c[7],m=c[8],p=c[9],n=c[10],q=c[11],s=c[12],t=c[13],v=c[14],
+c=c[15];b[0].setComponents(g-a,k-f,q-m,c-s).normalize();b[1].setComponents(g+a,k+f,q+m,c+s).normalize();b[2].setComponents(g+d,k+h,q+p,c+t).normalize();b[3].setComponents(g-d,k-h,q-p,c-t).normalize();b[4].setComponents(g-e,k-l,q-n,c-v).normalize();b[5].setComponents(g+e,k+l,q+n,c+v).normalize();return this},intersectsObject:function(){var a=new THREE.Sphere;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere);a.applyMatrix4(b.matrixWorld);
+return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c){for(var d=this.planes,e=0;6>e;e++){var g=d[e];a.x=0<g.normal.x?c.min.x:c.max.x;b.x=0<g.normal.x?c.max.x:c.min.x;a.y=0<g.normal.y?c.min.y:c.max.y;b.y=0<g.normal.y?c.max.y:c.min.y;a.z=0<g.normal.z?c.min.z:c.max.z;b.z=0<g.normal.z?c.max.z:c.min.z;
+var f=g.distanceToPoint(a),g=g.distanceToPoint(b);if(0>f&&0>g)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}};THREE.Plane=function(a,b){this.normal=void 0!==a?a:new THREE.Vector3(1,0,0);this.constant=void 0!==b?b:0};
+THREE.Plane.prototype={constructor:THREE.Plane,set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,
+c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,
+b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a,b){var c=this.distanceToPoint(a);return(b||new THREE.Vector3).copy(this.normal).multiplyScalar(c)},isIntersectionLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectLine:function(){var a=new THREE.Vector3;return function(b,c){var d=c||new THREE.Vector3,e=b.delta(a),g=this.normal.dot(e);if(0===g){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return g=
+-(b.start.dot(this.normal)+this.constant)/g,0>g||1<g?void 0:d.copy(e).multiplyScalar(g).add(b.start)}}(),coplanarPoint:function(a){return(a||new THREE.Vector3).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Matrix3;return function(d,e){var g=e||c.getNormalMatrix(d),g=a.copy(this.normal).applyMatrix3(g),f=this.coplanarPoint(b);f.applyMatrix4(d);this.setFromNormalAndCoplanarPoint(g,f);return this}}(),translate:function(a){this.constant-=
+a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}};
+THREE.Math={generateUUID:function(){var a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},smoothstep:function(a,
+b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(){var a=Math.PI/180;return function(b){return b*a}}(),
+radToDeg:function(){var a=180/Math.PI;return function(b){return b*a}}(),isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};
+THREE.Spline=function(a){function b(a,b,c,d,e,g,f){a=.5*(c-a);d=.5*(d-b);return(2*(b-c)+a+d)*f+(-3*(b-c)-2*a-d)*g+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,g,f,h,l,k,m,p,n;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;g=Math.floor(e);f=e-g;c[0]=0===g?g:g-1;c[1]=g;c[2]=g>this.points.length-2?this.points.length-1:g+1;c[3]=g>this.points.length-3?this.points.length-1:g+
+2;k=this.points[c[0]];m=this.points[c[1]];p=this.points[c[2]];n=this.points[c[3]];h=f*f;l=f*h;d.x=b(k.x,m.x,p.x,n.x,f,h,l);d.y=b(k.y,m.y,p.y,n.y,f,h,l);d.z=b(k.z,m.z,p.z,n.z,f,h,l);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++)b=this.points[a],d[a]=[b.x,b.y,b.z];return d};this.getLength=function(a){var b,c,d,e=b=b=0,g=new THREE.Vector3,f=new THREE.Vector3,h=[],l=0;h[0]=0;a||(a=100);c=this.points.length*a;g.copy(this.points[0]);for(a=1;a<c;a++)b=
+a/c,d=this.getPoint(b),f.copy(d),l+=f.distanceTo(g),g.copy(d),b*=this.points.length-1,b=Math.floor(b),b!==e&&(h[b]=l,e=b);h[h.length]=l;return{chunks:h,total:l}};this.reparametrizeByArcLength=function(a){var b,c,d,e,g,f,h=[],l=new THREE.Vector3,k=this.getLength();h.push(l.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=k.chunks[b]-k.chunks[b-1];f=Math.ceil(a*c/k.total);e=(b-1)/(this.points.length-1);g=b/(this.points.length-1);for(c=1;c<f-1;c++)d=e+1/f*c*(g-e),d=this.getPoint(d),
+h.push(l.copy(d).clone());h.push(l.copy(this.points[b]).clone())}this.points=h}};THREE.Triangle=function(a,b,c){this.a=void 0!==a?a:new THREE.Vector3;this.b=void 0!==b?b:new THREE.Vector3;this.c=void 0!==c?c:new THREE.Vector3};THREE.Triangle.normal=function(){var a=new THREE.Vector3;return function(b,c,d,e){e=e||new THREE.Vector3;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}();
+THREE.Triangle.barycoordFromPoint=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(d,e,g,f,h){a.subVectors(f,e);b.subVectors(g,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);g=a.dot(c);var l=b.dot(b);f=b.dot(c);var k=d*l-e*e;h=h||new THREE.Vector3;if(0===k)return h.set(-2,-1,-1);k=1/k;l=(l*g-e*f)*k;d=(d*f-e*g)*k;return h.set(1-l-d,d,l)}}();
+THREE.Triangle.containsPoint=function(){var a=new THREE.Vector3;return function(b,c,d,e){b=THREE.Triangle.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}();
+THREE.Triangle.prototype={constructor:THREE.Triangle,set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,
+this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new THREE.Vector3).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return THREE.Triangle.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new THREE.Plane).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return THREE.Triangle.barycoordFromPoint(a,this.a,this.b,this.c,b)},containsPoint:function(a){return THREE.Triangle.containsPoint(a,this.a,this.b,this.c)},
+equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}};THREE.Channels=function(){this.mask=1};THREE.Channels.prototype={constructor:THREE.Channels,set:function(a){this.mask=1<<a},enable:function(a){this.mask|=1<<a},toggle:function(a){this.mask^=1<<a},disable:function(a){this.mask&=~(1<<a)}};THREE.Clock=function(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1};
+THREE.Clock.prototype={constructor:THREE.Clock,start:function(){this.oldTime=this.startTime=self.performance.now();this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=self.performance.now(),a=.001*(b-this.oldTime);this.oldTime=b;this.elapsedTime+=a}return a}};THREE.EventDispatcher=function(){};
+THREE.EventDispatcher.prototype={constructor:THREE.EventDispatcher,apply:function(a){a.addEventListener=THREE.EventDispatcher.prototype.addEventListener;a.hasEventListener=THREE.EventDispatcher.prototype.hasEventListener;a.removeEventListener=THREE.EventDispatcher.prototype.removeEventListener;a.dispatchEvent=THREE.EventDispatcher.prototype.dispatchEvent},addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&
+c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)?!0:!1},removeEventListener:function(a,b){if(void 0!==this._listeners){var c=this._listeners[a];if(void 0!==c){var d=c.indexOf(b);-1!==d&&c.splice(d,1)}}},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;for(var c=[],d=b.length,e=0;e<d;e++)c[e]=b[e];for(e=0;e<d;e++)c[e].call(this,a)}}}};
+(function(a){function b(a,b){return a.distance-b.distance}function c(a,b,g,f){if(!1!==a.visible&&(a.raycast(b,g),!0===f)){a=a.children;f=0;for(var h=a.length;f<h;f++)c(a[f],b,g,!0)}}a.Raycaster=function(b,c,g,f){this.ray=new a.Ray(b,c);this.near=g||0;this.far=f||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})};
+a.Raycaster.prototype={constructor:a.Raycaster,linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(b,c){c instanceof a.PerspectiveCamera?(this.ray.origin.setFromMatrixPosition(c.matrixWorld),this.ray.direction.set(b.x,b.y,.5).unproject(c).sub(this.ray.origin).normalize()):c instanceof a.OrthographicCamera?(this.ray.origin.set(b.x,b.y,-1).unproject(c),this.ray.direction.set(0,0,-1).transformDirection(c.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},
+intersectObject:function(a,e){var g=[];c(a,this,g,e);g.sort(b);return g},intersectObjects:function(a,e){var g=[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),g;for(var f=0,h=a.length;f<h;f++)c(a[f],this,g,e);g.sort(b);return g}}})(THREE);
+THREE.Object3D=function(){Object.defineProperty(this,"id",{value:THREE.Object3DIdCount++});this.uuid=THREE.Math.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.channels=new THREE.Channels;this.children=[];this.up=THREE.Object3D.DefaultUp.clone();var a=new THREE.Vector3,b=new THREE.Euler,c=new THREE.Quaternion,d=new THREE.Vector3(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{enumerable:!0,
+value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new THREE.Matrix4},normalMatrix:{value:new THREE.Matrix3}});this.rotationAutoUpdate=!0;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixAutoUpdate=THREE.Object3D.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}};
+THREE.Object3D.DefaultUp=new THREE.Vector3(0,1,0);THREE.Object3D.DefaultMatrixAutoUpdate=!0;
+THREE.Object3D.prototype={constructor:THREE.Object3D,get eulerOrder(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set eulerOrder(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a},get useQuaternion(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set useQuaternion(a){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set renderDepth(a){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},
+applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new THREE.Quaternion;return function(b,c){a.setFromAxisAngle(b,
+c);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new THREE.Vector3(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=new THREE.Vector3(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new THREE.Vector3(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new THREE.Vector3;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));
+return this}}(),translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)},translateX:function(){var a=new THREE.Vector3(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new THREE.Vector3(0,1,0);return function(b){return this.translateOnAxis(a,b)}}(),translateZ:function(){var a=new THREE.Vector3(0,0,1);return function(b){return this.translateOnAxis(a,
+b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new THREE.Matrix4;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new THREE.Matrix4;return function(b){a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",
+a),this;a instanceof THREE.Object3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:"added"}),this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length)for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);b=this.children.indexOf(a);-1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1))},getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");
+return this.getObjectByName(a)},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){a=a||new THREE.Vector3;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=
+new THREE.Vector3,b=new THREE.Vector3;return function(c){c=c||new THREE.Quaternion;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new THREE.Quaternion;return function(b){b=b||new THREE.Euler;this.getWorldQuaternion(a);return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new THREE.Vector3,b=new THREE.Quaternion;return function(c){c=c||new THREE.Vector3;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,
+b,c);return c}}(),getWorldDirection:function(){var a=new THREE.Quaternion;return function(b){b=b||new THREE.Vector3;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},
+updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){!0===this.matrixAutoUpdate&&this.updateMatrix();if(!0===this.matrixWorldNeedsUpdate||!0===a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=0,c=this.children.length;b<c;b++)this.children[b].updateMatrixWorld(a)},toJSON:function(a){function b(a){var b=
+[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a,d={};c&&(a={geometries:{},materials:{},textures:{},images:{}},d.metadata={version:4.4,type:"Object",generator:"Object3D.toJSON"});var e={};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);"{}"!==JSON.stringify(this.userData)&&(e.userData=this.userData);!0===this.castShadow&&(e.castShadow=!0);!0===this.receiveShadow&&(e.receiveShadow=!0);!1===this.visible&&(e.visible=!1);e.matrix=this.matrix.toArray();
+void 0!==this.geometry&&(void 0===a.geometries[this.geometry.uuid]&&(a.geometries[this.geometry.uuid]=this.geometry.toJSON(a)),e.geometry=this.geometry.uuid);void 0!==this.material&&(void 0===a.materials[this.material.uuid]&&(a.materials[this.material.uuid]=this.material.toJSON(a)),e.material=this.material.uuid);if(0<this.children.length){e.children=[];for(var g=0;g<this.children.length;g++)e.children.push(this.children[g].toJSON(a).object)}if(c){var c=b(a.geometries),g=b(a.materials),f=b(a.textures);
+a=b(a.images);0<c.length&&(d.geometries=c);0<g.length&&(d.materials=g);0<f.length&&(d.textures=f);0<a.length&&(d.images=a)}d.object=e;return d},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.rotationAutoUpdate=a.rotationAutoUpdate;this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=
+a.matrixAutoUpdate;this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(var c=0;c<a.children.length;c++)this.add(a.children[c].clone());return this}};THREE.EventDispatcher.prototype.apply(THREE.Object3D.prototype);THREE.Object3DIdCount=0;
+THREE.Face3=function(a,b,c,d,e,g){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=Array.isArray(d)?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==g?g:0};
+THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}};
+THREE.Face4=function(a,b,c,d,e,g,f){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new THREE.Face3(a,b,c,e,g,f)};THREE.BufferAttribute=function(a,b){this.uuid=THREE.Math.generateUUID();this.array=a;this.itemSize=b;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0};
+THREE.BufferAttribute.prototype={constructor:THREE.BufferAttribute,get length(){console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count.");return this.array.length},get count(){return this.array.length/this.itemSize},set needsUpdate(a){!0===a&&this.version++},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;
+c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var g=a[d];void 0===g&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),g=new THREE.Color);b[c++]=g.r;b[c++]=g.g;b[c++]=g.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var g=a[d];b[c++]=g.a;b[c++]=g.b;b[c++]=
+g.c}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var g=a[d];void 0===g&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),g=new THREE.Vector2);b[c++]=g.x;b[c++]=g.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var g=a[d];void 0===g&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),g=new THREE.Vector3);b[c++]=g.x;b[c++]=g.y;b[c++]=g.z}return this},
+copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var g=a[d];void 0===g&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),g=new THREE.Vector4);b[c++]=g.x;b[c++]=g.y;b[c++]=g.z;b[c++]=g.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},
+setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,
+b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},clone:function(){return(new this.constructor).copy(this)}};THREE.Int8Attribute=function(a,b){return new THREE.BufferAttribute(new Int8Array(a),b)};THREE.Uint8Attribute=function(a,b){return new THREE.BufferAttribute(new Uint8Array(a),b)};THREE.Uint8ClampedAttribute=function(a,b){return new THREE.BufferAttribute(new Uint8ClampedArray(a),b)};
+THREE.Int16Attribute=function(a,b){return new THREE.BufferAttribute(new Int16Array(a),b)};THREE.Uint16Attribute=function(a,b){return new THREE.BufferAttribute(new Uint16Array(a),b)};THREE.Int32Attribute=function(a,b){return new THREE.BufferAttribute(new Int32Array(a),b)};THREE.Uint32Attribute=function(a,b){return new THREE.BufferAttribute(new Uint32Array(a),b)};THREE.Float32Attribute=function(a,b){return new THREE.BufferAttribute(new Float32Array(a),b)};
+THREE.Float64Attribute=function(a,b){return new THREE.BufferAttribute(new Float64Array(a),b)};THREE.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");return(new THREE.BufferAttribute(a,b)).setDynamic(!0)};THREE.InstancedBufferAttribute=function(a,b,c){THREE.BufferAttribute.call(this,a,b);this.meshPerAttribute=c||1};THREE.InstancedBufferAttribute.prototype=Object.create(THREE.BufferAttribute.prototype);
+THREE.InstancedBufferAttribute.prototype.constructor=THREE.InstancedBufferAttribute;THREE.InstancedBufferAttribute.prototype.copy=function(a){THREE.BufferAttribute.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this};THREE.InterleavedBuffer=function(a,b){this.uuid=THREE.Math.generateUUID();this.array=a;this.stride=b;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0};
+THREE.InterleavedBuffer.prototype={constructor:THREE.InterleavedBuffer,get length(){return this.array.length},get count(){return this.array.length/this.stride},set needsUpdate(a){!0===a&&this.version++},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.stride=a.stride;this.dynamic=a.dynamic},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,
+b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)}};THREE.InstancedInterleavedBuffer=function(a,b,c){THREE.InterleavedBuffer.call(this,a,b);this.meshPerAttribute=c||1};THREE.InstancedInterleavedBuffer.prototype=Object.create(THREE.InterleavedBuffer.prototype);THREE.InstancedInterleavedBuffer.prototype.constructor=THREE.InstancedInterleavedBuffer;
+THREE.InstancedInterleavedBuffer.prototype.copy=function(a){THREE.InterleavedBuffer.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this};THREE.InterleavedBufferAttribute=function(a,b,c){this.uuid=THREE.Math.generateUUID();this.data=a;this.itemSize=b;this.offset=c};
+THREE.InterleavedBufferAttribute.prototype={constructor:THREE.InterleavedBufferAttribute,get length(){console.warn("THREE.BufferAttribute: .length has been deprecated. Please use .count.");return this.array.length},get count(){return this.data.array.length/this.data.stride},setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+
+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;
+return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}};
+THREE.Geometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++});this.uuid=THREE.Math.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.elementsNeedUpdate=
+this.verticesNeedUpdate=!1};
+THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(a){for(var b=(new THREE.Matrix3).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,g=a.vertexNormals.length;e<g;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=
+this.verticesNeedUpdate=!0},rotateX:function(){var a;return function(b){void 0===a&&(a=new THREE.Matrix4);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;return function(b){void 0===a&&(a=new THREE.Matrix4);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===a&&(a=new THREE.Matrix4);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Matrix4);
+a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Matrix4);a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a=new THREE.Object3D);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d){var e=void 0!==f?[m[a].clone(),m[b].clone(),m[d].clone()]:[],g=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:
+[],e=new THREE.Face3(a,b,d,e,g);c.faces.push(e);void 0!==l&&c.faceVertexUvs[0].push([p[a].clone(),p[b].clone(),p[d].clone()]);void 0!==k&&c.faceVertexUvs[1].push([n[a].clone(),n[b].clone(),n[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,g=e.position.array,f=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,l=void 0!==e.uv?e.uv.array:void 0,k=void 0!==e.uv2?e.uv2.array:void 0;void 0!==k&&(this.faceVertexUvs[1]=[]);for(var m=[],p=[],n=[],
+q=e=0;e<g.length;e+=3,q+=2)c.vertices.push(new THREE.Vector3(g[e],g[e+1],g[e+2])),void 0!==f&&m.push(new THREE.Vector3(f[e],f[e+1],f[e+2])),void 0!==h&&c.colors.push(new THREE.Color(h[e],h[e+1],h[e+2])),void 0!==l&&p.push(new THREE.Vector2(l[q],l[q+1])),void 0!==k&&n.push(new THREE.Vector2(k[q],k[q+1]));if(void 0!==d)if(g=a.groups,0<g.length)for(e=0;e<g.length;e++)for(var q=g[e],s=q.start,t=q.count,q=s,s=s+t;q<s;q+=3)b(d[q],d[q+1],d[q+2]);else for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=
+0;e<g.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){this.computeBoundingBox();var a=this.boundingBox.center().negate();this.translate(a.x,a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new THREE.Matrix4;c.set(b,0,0,-b*a.x,0,b,0,
+-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new THREE.Vector3,b=new THREE.Vector3,c=0,d=this.faces.length;c<d;c++){var e=this.faces[c],g=this.vertices[e.a],f=this.vertices[e.b];a.subVectors(this.vertices[e.c],f);b.subVectors(g,f);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){var b,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new THREE.Vector3;if(a){var e,g,f,h=new THREE.Vector3,
+l=new THREE.Vector3;a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=this.vertices[c.a],g=this.vertices[c.b],f=this.vertices[c.c],h.subVectors(f,g),l.subVectors(e,g),h.cross(l),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(a=0,b=this.faces.length;a<b;a++)c=this.faces[a],d[c.a].add(c.normal),d[c.b].add(c.normal),d[c.c].add(c.normal);b=0;for(c=this.vertices.length;b<c;b++)d[b].normalize();a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=c.vertexNormals,3===e.length?(e[0].copy(d[c.a]),
+e[1].copy(d[c.b]),e[2].copy(d[c.c])):(e[0]=d[c.a].clone(),e[1]=d[c.b].clone(),e[2]=d[c.c].clone())},computeMorphNormals:function(){var a,b,c,d,e;c=0;for(d=this.faces.length;c<d;c++)for(e=this.faces[c],e.__originalFaceNormal?e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone(),e.__originalVertexNormals||(e.__originalVertexNormals=[]),a=0,b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=
+e.vertexNormals[a].clone();var g=new THREE.Geometry;g.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=[];e=this.morphNormals[a].faceNormals;var f=this.morphNormals[a].vertexNormals,h,l;c=0;for(d=this.faces.length;c<d;c++)h=new THREE.Vector3,l={a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3},e.push(h),f.push(l)}f=this.morphNormals[a];g.vertices=this.morphTargets[a].vertices;
+g.computeFaceNormals();g.computeVertexNormals();c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],h=f.faceNormals[c],l=f.vertexNormals[c],h.copy(e.normal),l.a.copy(e.vertexNormals[0]),l.b.copy(e.vertexNormals[1]),l.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=e.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeTangents:function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){for(var a=
+0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(!1===a instanceof THREE.Geometry)console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",
+a);else{var d,e=this.vertices.length,g=this.vertices,f=a.vertices,h=this.faces,l=a.faces,k=this.faceVertexUvs[0];a=a.faceVertexUvs[0];void 0===c&&(c=0);void 0!==b&&(d=(new THREE.Matrix3).getNormalMatrix(b));for(var m=0,p=f.length;m<p;m++){var n=f[m].clone();void 0!==b&&n.applyMatrix4(b);g.push(n)}m=0;for(p=l.length;m<p;m++){var f=l[m],q,s=f.vertexNormals,t=f.vertexColors,n=new THREE.Face3(f.a+e,f.b+e,f.c+e);n.normal.copy(f.normal);void 0!==d&&n.normal.applyMatrix3(d).normalize();b=0;for(g=s.length;b<
+g;b++)q=s[b].clone(),void 0!==d&&q.applyMatrix3(d).normalize(),n.vertexNormals.push(q);n.color.copy(f.color);b=0;for(g=t.length;b<g;b++)q=t[b],n.vertexColors.push(q.clone());n.materialIndex=f.materialIndex+c;h.push(n)}m=0;for(p=a.length;m<p;m++)if(c=a[m],d=[],void 0!==c){b=0;for(g=c.length;b<g;b++)d.push(c[b].clone());k.push(d)}}},mergeMesh:function(a){!1===a instanceof THREE.Mesh?console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a):(a.matrixAutoUpdate&&a.updateMatrix(),
+this.merge(a.geometry,a.matrix))},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),g,f;g=0;for(f=this.vertices.length;g<f;g++)d=this.vertices[g],d=Math.round(d.x*e)+"_"+Math.round(d.y*e)+"_"+Math.round(d.z*e),void 0===a[d]?(a[d]=g,b.push(this.vertices[g]),c[g]=b.length-1):c[g]=c[a[d]];a=[];g=0;for(f=this.faces.length;g<f;g++)for(e=this.faces[g],e.a=c[e.a],e.b=c[e.b],e.c=c[e.c],e=[e.a,e.b,e.c],d=0;3>d;d++)if(e[d]===e[(d+1)%3]){a.push(g);break}for(g=a.length-1;0<=g;g--)for(e=a[g],this.faces.splice(e,
+1),c=0,f=this.faceVertexUvs.length;c<f;c++)this.faceVertexUvs[c].splice(e,1);g=this.vertices.length-b.length;this.vertices=b;return g},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],g,f;d&&d.length===b&&(g=[]);e&&e.length===b&&(f=[]);for(c=0;c<b;c++){var h=a[c]._id;g&&g.push(d[h]);f&&f.push(e[h])}g&&(this.faceVertexUvs[0]=g);f&&(this.faceVertexUvs[1]=
+f)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==k[b])return k[b];k[b]=l.length/3;l.push(a.x,a.y,a.z);return k[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==p[b])return p[b];p[b]=m.length;m.push(a.getHex());return p[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==q[b])return q[b];q[b]=n.length/2;n.push(a.x,a.y);return q[b]}var e={metadata:{version:4.4,type:"Geometry",
+generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var g=this.parameters,f;for(f in g)void 0!==g[f]&&(e[f]=g[f]);return e}g=[];for(f=0;f<this.vertices.length;f++){var h=this.vertices[f];g.push(h.x,h.y,h.z)}var h=[],l=[],k={},m=[],p={},n=[],q={};for(f=0;f<this.faces.length;f++){var s=this.faces[f],t=void 0!==this.faceVertexUvs[0][f],v=0<s.normal.length(),u=0<s.vertexNormals.length,w=1!==s.color.r||1!==s.color.g||1!==s.color.b,
+D=0<s.vertexColors.length,x=0,x=a(x,0,0),x=a(x,1,!1),x=a(x,2,!1),x=a(x,3,t),x=a(x,4,v),x=a(x,5,u),x=a(x,6,w),x=a(x,7,D);h.push(x);h.push(s.a,s.b,s.c);t&&(t=this.faceVertexUvs[0][f],h.push(d(t[0]),d(t[1]),d(t[2])));v&&h.push(b(s.normal));u&&(v=s.vertexNormals,h.push(b(v[0]),b(v[1]),b(v[2])));w&&h.push(c(s.color));D&&(s=s.vertexColors,h.push(c(s[0]),c(s[1]),c(s[2])))}e.data={};e.data.vertices=g;e.data.normals=l;0<m.length&&(e.data.colors=m);0<n.length&&(e.data.uvs=[n]);e.data.faces=h;return e},clone:function(){return(new this.constructor).copy(this)},
+copy:function(a){this.vertices=[];this.faces=[];this.faceVertexUvs=[[]];for(var b=a.vertices,c=0,d=b.length;c<d;c++)this.vertices.push(b[c].clone());b=a.faces;c=0;for(d=b.length;c<d;c++)this.faces.push(b[c].clone());c=0;for(d=a.faceVertexUvs.length;c<d;c++){b=a.faceVertexUvs[c];void 0===this.faceVertexUvs[c]&&(this.faceVertexUvs[c]=[]);for(var e=0,g=b.length;e<g;e++){for(var f=b[e],h=[],l=0,k=f.length;l<k;l++)h.push(f[l].clone());this.faceVertexUvs[c].push(h)}}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}};
+THREE.EventDispatcher.prototype.apply(THREE.Geometry.prototype);THREE.GeometryIdCount=0;
+THREE.DirectGeometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++});this.uuid=THREE.Math.generateUUID();this.name="";this.type="DirectGeometry";this.indices=[];this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1};
+THREE.DirectGeometry.prototype={constructor:THREE.DirectGeometry,computeBoundingBox:THREE.Geometry.prototype.computeBoundingBox,computeBoundingSphere:THREE.Geometry.prototype.computeBoundingSphere,computeFaceNormals:function(){console.warn("THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.")},computeVertexNormals:function(){console.warn("THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.")},computeGroups:function(a){var b,c=[],
+d;a=a.faces;for(var e=0;e<a.length;e++){var g=a[e];g.materialIndex!==d&&(d=g.materialIndex,void 0!==b&&(b.count=3*e-b.start,c.push(b)),b={start:3*e,materialIndex:d})}void 0!==b&&(b.count=3*e-b.start,c.push(b));this.groups=c},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,g=d[1]&&0<d[1].length,f=a.morphTargets,h=f.length;if(0<h){for(var l=[],k=0;k<h;k++)l[k]=[];this.morphTargets.position=l}var m=a.morphNormals,p=m.length;if(0<p){for(var n=[],k=0;k<p;k++)n[k]=
+[];this.morphTargets.normal=n}for(var q=a.skinIndices,s=a.skinWeights,t=q.length===c.length,v=s.length===c.length,k=0;k<b.length;k++){var u=b[k];this.vertices.push(c[u.a],c[u.b],c[u.c]);var w=u.vertexNormals;3===w.length?this.normals.push(w[0],w[1],w[2]):(w=u.normal,this.normals.push(w,w,w));w=u.vertexColors;3===w.length?this.colors.push(w[0],w[1],w[2]):(w=u.color,this.colors.push(w,w,w));!0===e&&(w=d[0][k],void 0!==w?this.uvs.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",
+k),this.uvs.push(new THREE.Vector2,new THREE.Vector2,new THREE.Vector2)));!0===g&&(w=d[1][k],void 0!==w?this.uvs2.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",k),this.uvs2.push(new THREE.Vector2,new THREE.Vector2,new THREE.Vector2)));for(w=0;w<h;w++){var D=f[w].vertices;l[w].push(D[u.a],D[u.b],D[u.c])}for(w=0;w<p;w++)D=m[w].vertexNormals[k],n[w].push(D.a,D.b,D.c);t&&this.skinIndices.push(q[u.a],q[u.b],q[u.c]);v&&this.skinWeights.push(s[u.a],s[u.b],
+s[u.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.EventDispatcher.prototype.apply(THREE.DirectGeometry.prototype);
+THREE.BufferGeometry=function(){Object.defineProperty(this,"id",{value:THREE.GeometryIdCount++});this.uuid=THREE.Math.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}};
+THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},getIndex:function(){return this.index},setIndex:function(a){this.index=a},addAttribute:function(a,b,c){!1===b instanceof THREE.BufferAttribute&&!1===b instanceof THREE.InterleavedBufferAttribute?(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new THREE.BufferAttribute(b,
+c))):"index"===a?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b)):this.attributes[a]=b},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a]},get drawcalls(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups},get offsets(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups},addDrawCall:function(a,
+b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");this.clearGroups()},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=
+b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToVector3Array(b.array),b.needsUpdate=!0);b=this.attributes.normal;void 0!==b&&((new THREE.Matrix3).getNormalMatrix(a).applyToVector3Array(b.array),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere()},rotateX:function(){var a;return function(b){void 0===a&&(a=new THREE.Matrix4);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;
+return function(b){void 0===a&&(a=new THREE.Matrix4);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===a&&(a=new THREE.Matrix4);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Matrix4);a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Matrix4);a.makeScale(b,c,d);this.applyMatrix(a);
+return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a=new THREE.Object3D);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.center().negate();this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a instanceof THREE.Points||a instanceof THREE.Line){a=new THREE.Float32Attribute(3*b.vertices.length,3);var c=new THREE.Float32Attribute(3*b.colors.length,3);this.addAttribute("position",
+a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new THREE.Float32Attribute(b.lineDistances.length,1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a instanceof THREE.Mesh&&b instanceof THREE.Geometry&&this.fromGeometry(b);return this},updateFromObject:function(a){var b=
+a.geometry;if(a instanceof THREE.Mesh){var c=b.__directGeometry;if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),
+c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&
+(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},fromGeometry:function(a){a.__directGeometry=(new THREE.DirectGeometry).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new THREE.BufferAttribute(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&
+(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new THREE.BufferAttribute(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute("color",(new THREE.BufferAttribute(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new THREE.BufferAttribute(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new THREE.BufferAttribute(b,
+2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<a.vertices.length?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new THREE.BufferAttribute(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=[],d=a.morphTargets[c],e=0,g=d.length;e<g;e++){var f=d[e],h=new THREE.Float32Attribute(3*f.length,3);b.push(h.copyVector3sArray(f))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new THREE.Float32Attribute(4*a.skinIndices.length,
+4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new THREE.Float32Attribute(4*a.skinWeights.length,4),this.addAttribute("skinWeight",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){var a=new THREE.Vector3;return function(){null===this.boundingBox&&(this.boundingBox=new THREE.Box3);var b=
+this.attributes.position.array;if(b){var c=this.boundingBox;c.makeEmpty();for(var d=0,e=b.length;d<e;d+=3)a.fromArray(b,d),c.expandByPoint(a)}if(void 0===b||0===b.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0);(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)}}(),computeBoundingSphere:function(){var a=
+new THREE.Box3,b=new THREE.Vector3;return function(){null===this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var c=this.attributes.position.array;if(c){a.makeEmpty();for(var d=this.boundingSphere.center,e=0,g=c.length;e<g;e+=3)b.fromArray(c,e),a.expandByPoint(b);a.center(d);for(var f=0,e=0,g=c.length;e<g;e+=3)b.fromArray(c,e),f=Math.max(f,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(f);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',
+this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute("normal",new THREE.BufferAttribute(new Float32Array(d.length),3));else for(var e=b.normal.array,g=0,f=e.length;g<f;g++)e[g]=0;var e=b.normal.array,h,l,k,m=new THREE.Vector3,p=new THREE.Vector3,n=new THREE.Vector3,q=new THREE.Vector3,s=new THREE.Vector3;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);
+for(var t=0,v=c.length;t<v;++t)for(g=c[t],f=g.start,h=g.count,g=f,f+=h;g<f;g+=3)h=3*a[g+0],l=3*a[g+1],k=3*a[g+2],m.fromArray(d,h),p.fromArray(d,l),n.fromArray(d,k),q.subVectors(n,p),s.subVectors(m,p),q.cross(s),e[h]+=q.x,e[h+1]+=q.y,e[h+2]+=q.z,e[l]+=q.x,e[l+1]+=q.y,e[l+2]+=q.z,e[k]+=q.x,e[k+1]+=q.y,e[k+2]+=q.z}else for(g=0,f=d.length;g<f;g+=9)m.fromArray(d,g),p.fromArray(d,g+3),n.fromArray(d,g+6),q.subVectors(n,p),s.subVectors(m,p),q.cross(s),e[g]=q.x,e[g+1]=q.y,e[g+2]=q.z,e[g+3]=q.x,e[g+4]=q.y,
+e[g+5]=q.z,e[g+6]=q.x,e[g+7]=q.y,e[g+8]=q.z;this.normalizeNormals();b.normal.needsUpdate=!0}},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(a){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},merge:function(a,b){if(!1===a instanceof THREE.BufferGeometry)console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a);else{void 0===b&&(b=0);var c=this.attributes,
+d;for(d in c)if(void 0!==a.attributes[d])for(var e=c[d].array,g=a.attributes[d],f=g.array,h=0,g=g.itemSize*b;h<f.length;h++,g++)e[g]=f[h];return this}},normalizeNormals:function(){for(var a=this.attributes.normal.array,b,c,d,e=0,g=a.length;e<g;e+=3)b=a[e],c=a[e+1],d=a[e+2],b=1/Math.sqrt(b*b+c*c+d*d),a[e]*=b,a[e+1]*=b,a[e+2]*=b},toJSON:function(){var a={metadata:{version:4.4,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);
+if(void 0!==this.parameters){var b=this.parameters,c;for(c in b)void 0!==b[c]&&(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c],b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b}}c=this.groups;0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));c=this.boundingSphere;null!==
+c&&(a.data.boundingSphere={center:c.center.toArray(),radius:c.radius});return a},clone:function(){return(new this.constructor).copy(this)},copy:function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count)}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.EventDispatcher.prototype.apply(THREE.BufferGeometry.prototype);
+THREE.BufferGeometry.MaxIndex=65535;THREE.InstancedBufferGeometry=function(){THREE.BufferGeometry.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0};THREE.InstancedBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype);THREE.InstancedBufferGeometry.prototype.constructor=THREE.InstancedBufferGeometry;THREE.InstancedBufferGeometry.prototype.addGroup=function(a,b,c){this.groups.push({start:a,count:b,instances:c})};
+THREE.InstancedBufferGeometry.prototype.copy=function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.instances)}return this};THREE.EventDispatcher.prototype.apply(THREE.InstancedBufferGeometry.prototype);
+THREE.AnimationAction=function(a,b,c,d,e){if(void 0===a)throw Error("clip is null");this.clip=a;this.localRoot=null;this.startTime=b||0;this.timeScale=c||1;this.weight=d||1;this.loop=e||THREE.LoopRepeat;this.loopCount=0;this.enabled=!0;this.actionTime=-this.startTime;this.clipTime=0;this.propertyBindings=[]};
+THREE.AnimationAction.prototype={constructor:THREE.AnimationAction,setLocalRoot:function(a){this.localRoot=a;return this},updateTime:function(a){var b=this.clipTime,c=this.loopCount,d=this.clip.duration;this.actionTime+=a;if(this.loop===THREE.LoopOnce)return this.loopCount=0,this.clipTime=Math.min(Math.max(this.actionTime,0),d),this.clipTime!==b&&(this.clipTime===d?this.mixer.dispatchEvent({type:"finished",action:this,direction:1}):0===this.clipTime&&this.mixer.dispatchEvent({type:"finished",action:this,
+direction:-1})),this.clipTime;this.loopCount=Math.floor(this.actionTime/d);a=this.actionTime-this.loopCount*d;a%=d;this.loop==THREE.LoopPingPong&&1===Math.abs(this.loopCount%2)&&(a=d-a);this.clipTime=a;this.loopCount!==c&&this.mixer.dispatchEvent({type:"loop",action:this,loopDelta:this.loopCount-this.loopCount});return this.clipTime},syncWith:function(a){this.actionTime=a.actionTime;this.timeScale=a.timeScale;return this},warpToDuration:function(a){this.timeScale=this.clip.duration/a;return this},
+init:function(a){this.clipTime=a-this.startTime;return this},update:function(a){this.updateTime(a);return this.clip.getAt(this.clipTime)},getTimeScaleAt:function(a){return this.timeScale.getAt?this.timeScale.getAt(a):this.timeScale},getWeightAt:function(a){return this.weight.getAt?this.weight.getAt(a):this.weight}};
+THREE.AnimationClip=function(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;if(0>this.duration)for(a=0;a<this.tracks.length;a++)b=this.tracks[a],this.duration=Math.max(b.keys[b.keys.length-1].time);this.trim();this.optimize();this.results=[]};
+THREE.AnimationClip.prototype={constructor:THREE.AnimationClip,getAt:function(a){a=Math.max(0,Math.min(a,this.duration));for(var b=0;b<this.tracks.length;b++)this.results[b]=this.tracks[b].getAt(a);return this.results},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}};
+THREE.AnimationClip.CreateFromMorphTargetSequence=function(a,b,c){for(var d=b.length,e=[],g=0;g<d;g++){var f=[];f.push({time:(g+d-1)%d,value:0});f.push({time:g,value:1});f.push({time:(g+1)%d,value:0});f.sort(THREE.KeyframeTrack.keyComparer);0===f[0].time&&f.push({time:d,value:f[0].value});e.push((new THREE.NumberKeyframeTrack(".morphTargetInfluences["+b[g].name+"]",f)).scale(1/c))}return new THREE.AnimationClip(a,-1,e)};
+THREE.AnimationClip.findByName=function(a,b){for(var c=0;c<a.length;c++)if(a[c].name===b)return a[c];return null};THREE.AnimationClip.CreateClipsFromMorphTargetSequences=function(a,b){for(var c={},d=/^([\w-]*?)([\d]+)$/,e=0,g=a.length;e<g;e++){var f=a[e],h=f.name.match(d);if(h&&1<h.length){var l=h[1];(h=c[l])||(c[l]=h=[]);h.push(f)}}d=[];for(l in c)d.push(THREE.AnimationClip.CreateFromMorphTargetSequence(l,c[l],b));return d};
+THREE.AnimationClip.parse=function(a){for(var b=[],c=0;c<a.tracks.length;c++)b.push(THREE.KeyframeTrack.parse(a.tracks[c]).scale(1/a.fps));return new THREE.AnimationClip(a.name,a.duration,b)};
+THREE.AnimationClip.parseAnimation=function(a,b,c){if(!a)return console.error("  no animation in JSONLoader data"),null;var d=function(a,b,c,d,e){for(var g=[],f=0;f<b.length;f++){var h=b[f];void 0!==h[c]&&g.push({time:h.time,value:e(h)})}return 0<g.length?new d(a,g):null},e=[],g=a.name||"default",f=a.length||-1,h=a.fps||30;a=a.hierarchy||[];for(var l=0;l<a.length;l++){var k=a[l].keys;if(k&&0!=k.length)if(k[0].morphTargets){for(var f={},m=0;m<k.length;m++)if(k[m].morphTargets)for(var p=0;p<k[m].morphTargets.length;p++)f[k[m].morphTargets[p]]=
+-1;for(var n in f){for(var q=[],p=0;p<k[m].morphTargets.length;p++){var s=k[m];q.push({time:s.time,value:s.morphTarget===n?1:0})}e.push(new THREE.NumberKeyframeTrack(c+".morphTargetInfluence["+n+"]",q))}f=f.length*(h||1)}else m=c+".bones["+b[l].name+"]",(p=d(m+".position",k,"pos",THREE.VectorKeyframeTrack,function(a){return(new THREE.Vector3).fromArray(a.pos)}))&&e.push(p),(p=d(m+".quaternion",k,"rot",THREE.QuaternionKeyframeTrack,function(a){return a.rot.slerp?a.rot.clone():(new THREE.Quaternion).fromArray(a.rot)}))&&
+e.push(p),(k=d(m+".scale",k,"scl",THREE.VectorKeyframeTrack,function(a){return(new THREE.Vector3).fromArray(a.scl)}))&&e.push(k)}return 0===e.length?null:new THREE.AnimationClip(g,f,e)};THREE.AnimationMixer=function(a){this.root=a;this.time=0;this.timeScale=1;this.actions=[];this.propertyBindingMap={}};
+THREE.AnimationMixer.prototype={constructor:THREE.AnimationMixer,addAction:function(a){this.actions.push(a);a.init(this.time);a.mixer=this;for(var b=a.clip.tracks,c=a.localRoot||this.root,d=0;d<b.length;d++){var e=b[d],g=c.uuid+"-"+e.name,f=this.propertyBindingMap[g];void 0===f&&(f=new THREE.PropertyBinding(c,e.name),this.propertyBindingMap[g]=f);a.propertyBindings.push(f);f.referenceCount+=1}},removeAllActions:function(){for(var a=0;a<this.actions.length;a++)this.actions[a].mixer=null;for(var b in this.propertyBindingMap)this.propertyBindingMap[b].unbind();
+this.actions=[];this.propertyBindingMap={};return this},removeAction:function(a){var b=this.actions.indexOf(a);-1!==b&&(this.actions.splice(b,1),a.mixer=null);b=a.localRoot||this.root;a=a.clip.tracks;for(var c=0;c<a.length;c++){var d=b.uuid+"-"+a[c].name,e=this.propertyBindingMap[d];e.referenceCount-=1;0>=e.referenceCount&&(e.unbind(),delete this.propertyBindingMap[d])}return this},findActionByName:function(a){for(var b=0;b<this.actions.length;b++)if(this.actions[b].name===a)return this.actions[b];
+return null},play:function(a,b){a.startTime=this.time;this.addAction(a);return this},fadeOut:function(a,b){var c=[];c.push({time:this.time,value:1});c.push({time:this.time+b,value:0});a.weight=new THREE.NumberKeyframeTrack("weight",c);return this},fadeIn:function(a,b){var c=[];c.push({time:this.time,value:0});c.push({time:this.time+b,value:1});a.weight=new THREE.NumberKeyframeTrack("weight",c);return this},warp:function(a,b,c,d){var e=[];e.push({time:this.time,value:b});e.push({time:this.time+d,value:c});
+a.timeScale=new THREE.NumberKeyframeTrack("timeScale",e);return this},crossFade:function(a,b,c,d){this.fadeOut(a,c);this.fadeIn(b,c);if(d){d=a.clip.duration/b.clip.duration;var e=1/d;this.warp(a,1,d,c);this.warp(b,e,1,c)}return this},update:function(a){a*=this.timeScale;this.time+=a;for(var b=0;b<this.actions.length;b++){var c=this.actions[b],d=c.getWeightAt(this.time),e=c.getTimeScaleAt(this.time),e=c.update(a*e);if(!(0>=c.weight)&&c.enabled)for(var g=0;g<e.length;g++)c.propertyBindings[g].accumulate(e[g],
+d)}for(var f in this.propertyBindingMap)this.propertyBindingMap[f].apply();return this}};THREE.EventDispatcher.prototype.apply(THREE.AnimationMixer.prototype);
+THREE.AnimationUtils={getEqualsFunc:function(a){return a.equals?function(a,c){return a.equals(c)}:function(a,c){return a===c}},clone:function(a){if("object"===typeof a){if(a.clone)return a.clone();console.error("can not figure out how to copy exemplarValue",a)}return a},lerp:function(a,b,c,d){return THREE.AnimationUtils.getLerpFunc(a,d)(a,b,c)},lerp_object:function(a,b,c){return a.lerp(b,c)},slerp_object:function(a,b,c){return a.slerp(b,c)},lerp_number:function(a,b,c){return a*(1-c)+b*c},lerp_boolean:function(a,
+b,c){return.5>c?a:b},lerp_boolean_immediate:function(a,b,c){return a},lerp_string:function(a,b,c){return.5>c?a:b},lerp_string_immediate:function(a,b,c){return a},getLerpFunc:function(a,b){if(void 0===a||null===a)throw Error("examplarValue is null");switch(typeof a){case "object":if(a.lerp)return THREE.AnimationUtils.lerp_object;if(a.slerp)return THREE.AnimationUtils.slerp_object;break;case "number":return THREE.AnimationUtils.lerp_number;case "boolean":return b?THREE.AnimationUtils.lerp_boolean:THREE.AnimationUtils.lerp_boolean_immediate;
+case "string":return b?THREE.AnimationUtils.lerp_string:THREE.AnimationUtils.lerp_string_immediate}}};THREE.KeyframeTrack=function(a,b){if(void 0===a)throw Error("track name is undefined");if(void 0===b||0===b.length)throw Error("no keys in track named "+a);this.name=a;this.keys=b;this.lastIndex=0;this.validate();this.optimize()};
+THREE.KeyframeTrack.prototype={constructor:THREE.KeyframeTrack,getAt:function(a){for(;this.lastIndex<this.keys.length&&a>=this.keys[this.lastIndex].time;)this.lastIndex++;for(;0<this.lastIndex&&a<this.keys[this.lastIndex-1].time;)this.lastIndex--;if(this.lastIndex>=this.keys.length)return this.setResult(this.keys[this.keys.length-1].value),this.result;if(0===this.lastIndex)return this.setResult(this.keys[0].value),this.result;var b=this.keys[this.lastIndex-1];this.setResult(b.value);if(b.constantToNext)return this.result;
+var c=this.keys[this.lastIndex];return this.result=this.lerpValues(this.result,c.value,(a-b.time)/(c.time-b.time))},shift:function(a){if(0!==a)for(var b=0;b<this.keys.length;b++)this.keys[b].time+=a;return this},scale:function(a){if(1!==a)for(var b=0;b<this.keys.length;b++)this.keys[b].time*=a;return this},trim:function(a,b){for(var c=0,d=1;d<this.keys.length;d++)this.keys[d]<=a&&c++;for(var e=0,d=this.keys.length-2;0<d;d++)if(this.keys[d]>=b)e++;else break;0<c+e&&(this.keys=this.keys.splice(c,this.keys.length-
+e-c));return this},validate:function(){var a=null;if(0===this.keys.length)console.error("  track is empty, no keys",this);else{for(var b=0;b<this.keys.length;b++){var c=this.keys[b];if(!c){console.error("  key is null in track",this,b);return}if("number"!==typeof c.time||isNaN(c.time)){console.error("  key.time is not a valid number",this,b,c);return}if(void 0===c.value||null===c.value){console.error("  key.value is null in track",this,b,c);return}if(a&&a.time>c.time){console.error("  key.time is less than previous key time, out of order keys",
+this,b,c,a);return}a=c}return this}},optimize:function(){var a=[],b=this.keys[0];a.push(b);THREE.AnimationUtils.getEqualsFunc(b.value);for(var c=1;c<this.keys.length-1;c++){var d=this.keys[c],e=this.keys[c+1];b.time===d.time||this.compareValues(b.value,d.value)&&this.compareValues(d.value,e.value)||(b.constantToNext=this.compareValues(b.value,d.value),a.push(d),b=d)}a.push(this.keys[this.keys.length-1]);this.keys=a;return this}};THREE.KeyframeTrack.keyComparer=function(a,b){return a.time-b.time};
+THREE.KeyframeTrack.parse=function(a){if(void 0===a.type)throw Error("track type undefined, can not parse");return THREE.KeyframeTrack.GetTrackTypeForTypeName(a.type).parse(a)};
+THREE.KeyframeTrack.GetTrackTypeForTypeName=function(a){switch(a.toLowerCase()){case "vector":case "vector2":case "vector3":case "vector4":return THREE.VectorKeyframeTrack;case "quaternion":return THREE.QuaternionKeyframeTrack;case "integer":case "scalar":case "double":case "float":case "number":return THREE.NumberKeyframeTrack;case "bool":case "boolean":return THREE.BooleanKeyframeTrack;case "string":return THREE.StringKeyframeTrack}throw Error("Unsupported typeName: "+a);};
+THREE.PropertyBinding=function(a,b){this.rootNode=a;this.trackName=b;this.referenceCount=0;this.originalValue=null;var c=THREE.PropertyBinding.parseTrackName(b);this.directoryName=c.directoryName;this.nodeName=c.nodeName;this.objectName=c.objectName;this.objectIndex=c.objectIndex;this.propertyName=c.propertyName;this.propertyIndex=c.propertyIndex;this.node=THREE.PropertyBinding.findNode(a,this.nodeName)||a;this.cumulativeValue=null;this.cumulativeWeight=0};
+THREE.PropertyBinding.prototype={constructor:THREE.PropertyBinding,reset:function(){this.cumulativeValue=null;this.cumulativeWeight=0},accumulate:function(a,b){this.isBound||this.bind();0===this.cumulativeWeight?0<b&&(null===this.cumulativeValue&&(this.cumulativeValue=THREE.AnimationUtils.clone(a)),this.cumulativeWeight=b):(this.cumulativeValue=this.lerpValue(this.cumulativeValue,a,b/(this.cumulativeWeight+b)),this.cumulativeWeight+=b)},unbind:function(){this.isBound&&(this.setValue(this.originalValue),
+this.triggerDirty=this.equalsValue=this.lerpValue=this.getValue=this.setValue=null,this.isBound=!1)},bind:function(){if(!this.isBound){var a=this.node;if(a){if(this.objectName){if("materials"===this.objectName){if(!a.material){console.error("  can not bind to material as node does not have a material",this);return}if(!a.material.materials){console.error("  can not bind to material.materials as node.material does not have a materials array",this);return}a=a.material.materials}else if("bones"===this.objectName){if(!a.skeleton){console.error("  can not bind to bones as node does not have a skeleton",
+this);return}for(var a=a.skeleton.bones,b=0;b<a.length;b++)if(a[b].name===this.objectIndex){this.objectIndex=b;break}}else{if(void 0===a[this.objectName]){console.error("  can not bind to objectName of node, undefined",this);return}a=a[this.objectName]}if(void 0!==this.objectIndex){if(void 0===a[this.objectIndex]){console.error("  trying to bind to objectIndex of objectName, but is undefined:",this,a);return}a=a[this.objectIndex]}}var c=a[this.propertyName];if(c){if(void 0!==this.propertyIndex){if("morphTargetInfluences"===
+this.propertyName)for(a.geometry||console.error("  can not bind to morphTargetInfluences becasuse node does not have a geometry",this),a.geometry.morphTargets||console.error("  can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets",this),b=0;b<this.node.geometry.morphTargets.length;b++)if(a.geometry.morphTargets[b].name===this.propertyIndex){this.propertyIndex=b;break}this.setValue=function(a){return this.equalsValue(c[this.propertyIndex],a)?!1:(c[this.propertyIndex]=
+a,!0)};this.getValue=function(){return c[this.propertyIndex]}}else c.copy?(this.setValue=function(a){return this.equalsValue(c,a)?!1:(c.copy(a),!0)},this.getValue=function(){return c}):(this.setValue=function(b){return this.equalsValue(a[this.propertyName],b)?!1:(a[this.propertyName]=b,!0)},this.getValue=function(){return a[this.propertyName]});void 0!==a.needsUpdate?this.triggerDirty=function(){this.node.needsUpdate=!0}:void 0!==a.matrixWorldNeedsUpdate&&(this.triggerDirty=function(){a.matrixWorldNeedsUpdate=
+!0});this.originalValue=this.getValue();this.equalsValue=THREE.AnimationUtils.getEqualsFunc(this.originalValue);this.lerpValue=THREE.AnimationUtils.getLerpFunc(this.originalValue,!0);this.isBound=!0}else console.error("  trying to update property for track: "+this.nodeName+"."+this.propertyName+" but it wasn't found.",a)}else console.error("  trying to update node for track: "+this.trackName+" but it wasn't found.")}},apply:function(){this.isBound||this.bind();if(0<this.cumulativeWeight){if(1>this.cumulativeWeight){var a=
+1-this.cumulativeWeight;this.cumulativeValue=this.lerpValue(this.cumulativeValue,this.originalValue,a/(this.cumulativeWeight+a))}this.setValue(this.cumulativeValue)&&this.triggerDirty&&this.triggerDirty();this.cumulativeValue=null;this.cumulativeWeight=0}}};
+THREE.PropertyBinding.parseTrackName=function(a){var b=/^(([\w]+\/)*)([\w-\d]+)?(\.([\w]+)(\[([\w\d\[\]\_. ]+)\])?)?(\.([\w.]+)(\[([\w\d\[\]\_. ]+)\])?)$/,c=b.exec(a);if(!c)throw Error("cannot parse trackName at all: "+a);c.index===b.lastIndex&&b.lastIndex++;b={directoryName:c[1],nodeName:c[3],objectName:c[5],objectIndex:c[7],propertyName:c[9],propertyIndex:c[11]};if(null===b.propertyName||0===b.propertyName.length)throw Error("can not parse propertyName from trackName: "+a);return b};
+THREE.PropertyBinding.findNode=function(a,b){function c(a){for(var c=0;c<a.bones.length;c++){var d=a.bones[c];if(d.name===b)return d}return null}function d(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null}if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var e=c(a.skeleton);if(e)return e}return a.children&&(e=d(a.children))?e:null};
+THREE.VectorKeyframeTrack=function(a,b){THREE.KeyframeTrack.call(this,a,b);this.result=this.keys[0].value.clone()};THREE.VectorKeyframeTrack.prototype=Object.create(THREE.KeyframeTrack.prototype);THREE.VectorKeyframeTrack.prototype.constructor=THREE.VectorKeyframeTrack;THREE.VectorKeyframeTrack.prototype.setResult=function(a){this.result.copy(a)};THREE.VectorKeyframeTrack.prototype.lerpValues=function(a,b,c){return a.lerp(b,c)};THREE.VectorKeyframeTrack.prototype.compareValues=function(a,b){return a.equals(b)};
+THREE.VectorKeyframeTrack.prototype.clone=function(){for(var a=[],b=0;b<this.keys.length;b++){var c=this.keys[b];a.push({time:c.time,value:c.value.clone()})}return new THREE.VectorKeyframeTrack(this.name,a)};THREE.VectorKeyframeTrack.parse=function(a){for(var b=THREE["Vector"+a.keys[0].value.length],c=[],d=0;d<a.keys.length;d++){var e=a.keys[d];c.push({value:(new b).fromArray(e.value),time:e.time})}return new THREE.VectorKeyframeTrack(a.name,c)};
+THREE.QuaternionKeyframeTrack=function(a,b){THREE.KeyframeTrack.call(this,a,b);this.result=this.keys[0].value.clone()};THREE.QuaternionKeyframeTrack.prototype=Object.create(THREE.KeyframeTrack.prototype);THREE.QuaternionKeyframeTrack.prototype.constructor=THREE.QuaternionKeyframeTrack;THREE.QuaternionKeyframeTrack.prototype.setResult=function(a){this.result.copy(a)};THREE.QuaternionKeyframeTrack.prototype.lerpValues=function(a,b,c){return a.slerp(b,c)};
+THREE.QuaternionKeyframeTrack.prototype.compareValues=function(a,b){return a.equals(b)};THREE.QuaternionKeyframeTrack.prototype.multiply=function(a){for(var b=0;b<this.keys.length;b++)this.keys[b].value.multiply(a);return this};THREE.QuaternionKeyframeTrack.prototype.clone=function(){for(var a=[],b=0;b<this.keys.length;b++){var c=this.keys[b];a.push({time:c.time,value:c.value.clone()})}return new THREE.QuaternionKeyframeTrack(this.name,a)};
+THREE.QuaternionKeyframeTrack.parse=function(a){for(var b=[],c=0;c<a.keys.length;c++){var d=a.keys[c];b.push({value:(new THREE.Quaternion).fromArray(d.value),time:d.time})}return new THREE.QuaternionKeyframeTrack(a.name,b)};THREE.StringKeyframeTrack=function(a,b){THREE.KeyframeTrack.call(this,a,b);this.result=this.keys[0].value};THREE.StringKeyframeTrack.prototype=Object.create(THREE.KeyframeTrack.prototype);THREE.StringKeyframeTrack.prototype.constructor=THREE.StringKeyframeTrack;
+THREE.StringKeyframeTrack.prototype.setResult=function(a){this.result=a};THREE.StringKeyframeTrack.prototype.lerpValues=function(a,b,c){return 1>c?a:b};THREE.StringKeyframeTrack.prototype.compareValues=function(a,b){return a===b};THREE.StringKeyframeTrack.prototype.clone=function(){for(var a=[],b=0;b<this.keys.length;b++){var c=this.keys[b];a.push({time:c.time,value:c.value})}return new THREE.StringKeyframeTrack(this.name,a)};
+THREE.StringKeyframeTrack.parse=function(a){return new THREE.StringKeyframeTrack(a.name,a.keys)};THREE.BooleanKeyframeTrack=function(a,b){THREE.KeyframeTrack.call(this,a,b);this.result=this.keys[0].value};THREE.BooleanKeyframeTrack.prototype=Object.create(THREE.KeyframeTrack.prototype);THREE.BooleanKeyframeTrack.prototype.constructor=THREE.BooleanKeyframeTrack;THREE.BooleanKeyframeTrack.prototype.setResult=function(a){this.result=a};
+THREE.BooleanKeyframeTrack.prototype.lerpValues=function(a,b,c){return 1>c?a:b};THREE.BooleanKeyframeTrack.prototype.compareValues=function(a,b){return a===b};THREE.BooleanKeyframeTrack.prototype.clone=function(){for(var a=[],b=0;b<this.keys.length;b++){var c=this.keys[b];a.push({time:c.time,value:c.value})}return new THREE.BooleanKeyframeTrack(this.name,a)};THREE.BooleanKeyframeTrack.parse=function(a){return new THREE.BooleanKeyframeTrack(a.name,a.keys)};
+THREE.NumberKeyframeTrack=function(a,b){THREE.KeyframeTrack.call(this,a,b);this.result=this.keys[0].value};THREE.NumberKeyframeTrack.prototype=Object.create(THREE.KeyframeTrack.prototype);THREE.NumberKeyframeTrack.prototype.constructor=THREE.NumberKeyframeTrack;THREE.NumberKeyframeTrack.prototype.setResult=function(a){this.result=a};THREE.NumberKeyframeTrack.prototype.lerpValues=function(a,b,c){return a*(1-c)+b*c};THREE.NumberKeyframeTrack.prototype.compareValues=function(a,b){return a===b};
+THREE.NumberKeyframeTrack.prototype.clone=function(){for(var a=[],b=0;b<this.keys.length;b++){var c=this.keys[b];a.push({time:c.time,value:c.value})}return new THREE.NumberKeyframeTrack(this.name,a)};THREE.NumberKeyframeTrack.parse=function(a){return new THREE.NumberKeyframeTrack(a.name,a.keys)};THREE.Camera=function(){THREE.Object3D.call(this);this.type="Camera";this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4};THREE.Camera.prototype=Object.create(THREE.Object3D.prototype);
+THREE.Camera.prototype.constructor=THREE.Camera;THREE.Camera.prototype.getWorldDirection=function(){var a=new THREE.Quaternion;return function(b){b=b||new THREE.Vector3;this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}();THREE.Camera.prototype.lookAt=function(){var a=new THREE.Matrix4;return function(b){a.lookAt(this.position,b,this.up);this.quaternion.setFromRotationMatrix(a)}}();THREE.Camera.prototype.clone=function(){return(new this.constructor).copy(this)};
+THREE.Camera.prototype.copy=function(a){THREE.Object3D.prototype.copy.call(this,a);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);return this};
+THREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);this.type="CubeCamera";var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,1);g.lookAt(new THREE.Vector3(0,1,0));this.add(g);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,-1);f.lookAt(new THREE.Vector3(0,-1,0));
+this.add(f);var h=new THREE.PerspectiveCamera(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var l=new THREE.PerspectiveCamera(90,1,a,b);l.up.set(0,-1,0);l.lookAt(new THREE.Vector3(0,0,-1));this.add(l);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,n=c.texture.generateMipmaps;c.texture.generateMipmaps=
+!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,g,c);c.activeCubeFace=3;a.render(b,f,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=n;c.activeCubeFace=5;a.render(b,l,c);a.setRenderTarget(null)}};THREE.CubeCamera.prototype=Object.create(THREE.Object3D.prototype);THREE.CubeCamera.prototype.constructor=THREE.CubeCamera;
+THREE.OrthographicCamera=function(a,b,c,d,e,g){THREE.Camera.call(this);this.type="OrthographicCamera";this.zoom=1;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==g?g:2E3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=Object.create(THREE.Camera.prototype);THREE.OrthographicCamera.prototype.constructor=THREE.OrthographicCamera;
+THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/2;this.projectionMatrix.makeOrthographic(c-a,c+a,d+b,d-b,this.near,this.far)};THREE.OrthographicCamera.prototype.copy=function(a){THREE.Camera.prototype.copy.call(this,a);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;return this};
+THREE.OrthographicCamera.prototype.toJSON=function(a){a=THREE.Object3D.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;return a};THREE.PerspectiveCamera=function(a,b,c,d){THREE.Camera.call(this);this.type="PerspectiveCamera";this.zoom=1;this.fov=void 0!==a?a:50;this.aspect=void 0!==b?b:1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.updateProjectionMatrix()};
+THREE.PerspectiveCamera.prototype=Object.create(THREE.Camera.prototype);THREE.PerspectiveCamera.prototype.constructor=THREE.PerspectiveCamera;THREE.PerspectiveCamera.prototype.setLens=function(a,b){void 0===b&&(b=24);this.fov=2*THREE.Math.radToDeg(Math.atan(b/(2*a)));this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype.setViewOffset=function(a,b,c,d,e,g){this.fullWidth=a;this.fullHeight=b;this.x=c;this.y=d;this.width=e;this.height=g;this.updateProjectionMatrix()};
+THREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){var a=THREE.Math.radToDeg(2*Math.atan(Math.tan(.5*THREE.Math.degToRad(this.fov))/this.zoom));if(this.fullWidth){var b=this.fullWidth/this.fullHeight,a=Math.tan(THREE.Math.degToRad(.5*a))*this.near,c=-a,d=b*c,b=Math.abs(b*a-d),c=Math.abs(a-c);this.projectionMatrix.makeFrustum(d+this.x*b/this.fullWidth,d+(this.x+this.width)*b/this.fullWidth,a-(this.y+this.height)*c/this.fullHeight,a-this.y*c/this.fullHeight,this.near,this.far)}else this.projectionMatrix.makePerspective(a,
+this.aspect,this.near,this.far)};THREE.PerspectiveCamera.prototype.copy=function(a){THREE.Camera.prototype.copy.call(this,a);this.fov=a.fov;this.aspect=a.aspect;this.near=a.near;this.far=a.far;this.zoom=a.zoom;return this};THREE.PerspectiveCamera.prototype.toJSON=function(a){a=THREE.Object3D.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.fov=this.fov;a.object.aspect=this.aspect;a.object.near=this.near;a.object.far=this.far;return a};
+THREE.Light=function(a){THREE.Object3D.call(this);this.type="Light";this.color=new THREE.Color(a);this.receiveShadow=void 0};THREE.Light.prototype=Object.create(THREE.Object3D.prototype);THREE.Light.prototype.constructor=THREE.Light;
+Object.defineProperties(THREE.Light.prototype,{onlyShadow:{set:function(a){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){this.shadow.camera.near=
+a}},shadowCameraFar:{set:function(a){this.shadow.camera.far=a}},shadowCameraVisible:{set:function(a){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow ) instead.")}},shadowBias:{set:function(a){this.shadow.bias=a}},shadowDarkness:{set:function(a){this.shadow.darkness=a}},shadowMapWidth:{set:function(a){this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){this.shadow.mapSize.height=a}}});
+THREE.Light.prototype.copy=function(a){THREE.Object3D.prototype.copy.call(this,a);this.color.copy(a.color);return this};
+THREE.Light.prototype.toJSON=function(a){a=THREE.Object3D.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.intensity&&(a.object.intensity=this.intensity);void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.exponent&&(a.object.exponent=this.exponent);return a};
+THREE.LightShadow=function(a){this.camera=a;this.bias=0;this.darkness=1;this.mapSize=new THREE.Vector2(512,512);this.matrix=this.map=null};THREE.LightShadow.prototype={constructor:THREE.LightShadow,copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.darkness=a.darkness;this.mapSize.copy(a.mapSize)},clone:function(){return(new this.constructor).copy(this)}};THREE.AmbientLight=function(a){THREE.Light.call(this,a);this.type="AmbientLight";this.castShadow=void 0};
+THREE.AmbientLight.prototype=Object.create(THREE.Light.prototype);THREE.AmbientLight.prototype.constructor=THREE.AmbientLight;THREE.DirectionalLight=function(a,b){THREE.Light.call(this,a);this.type="DirectionalLight";this.position.set(0,1,0);this.updateMatrix();this.target=new THREE.Object3D;this.intensity=void 0!==b?b:1;this.shadow=new THREE.LightShadow(new THREE.OrthographicCamera(-500,500,500,-500,50,5E3))};THREE.DirectionalLight.prototype=Object.create(THREE.Light.prototype);
+THREE.DirectionalLight.prototype.constructor=THREE.DirectionalLight;THREE.DirectionalLight.prototype.copy=function(a){THREE.Light.prototype.copy.call(this,a);this.intensity=a.intensity;this.target=a.target.clone();this.shadow=a.shadow.clone();return this};THREE.HemisphereLight=function(a,b,c){THREE.Light.call(this,a);this.type="HemisphereLight";this.castShadow=void 0;this.position.set(0,1,0);this.updateMatrix();this.groundColor=new THREE.Color(b);this.intensity=void 0!==c?c:1};
+THREE.HemisphereLight.prototype=Object.create(THREE.Light.prototype);THREE.HemisphereLight.prototype.constructor=THREE.HemisphereLight;THREE.HemisphereLight.prototype.copy=function(a){THREE.Light.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);this.intensity=a.intensity;return this};
+THREE.PointLight=function(a,b,c,d){THREE.Light.call(this,a);this.type="PointLight";this.intensity=void 0!==b?b:1;this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new THREE.LightShadow(new THREE.PerspectiveCamera(90,1,1,500))};THREE.PointLight.prototype=Object.create(THREE.Light.prototype);THREE.PointLight.prototype.constructor=THREE.PointLight;
+THREE.PointLight.prototype.copy=function(a){THREE.Light.prototype.copy.call(this,a);this.intensity=a.intensity;this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this};
+THREE.SpotLight=function(a,b,c,d,e,g){THREE.Light.call(this,a);this.type="SpotLight";this.position.set(0,1,0);this.updateMatrix();this.target=new THREE.Object3D;this.intensity=void 0!==b?b:1;this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.exponent=void 0!==e?e:10;this.decay=void 0!==g?g:1;this.shadow=new THREE.LightShadow(new THREE.PerspectiveCamera(50,1,50,5E3))};THREE.SpotLight.prototype=Object.create(THREE.Light.prototype);THREE.SpotLight.prototype.constructor=THREE.SpotLight;
+THREE.SpotLight.prototype.copy=function(a){THREE.Light.prototype.copy.call(this,a);this.intensity=a.intensity;this.distance=a.distance;this.angle=a.angle;this.exponent=a.exponent;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this};THREE.Cache={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}};
+THREE.Loader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};
+THREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:void 0,extractUrlBase:function(a){a=a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a,b,c;return function(d,e,g){function f(a,c,d,f,l){a=e+a;var k=THREE.Loader.Handlers.get(a);null!==k?a=k.load(a):(b.setCrossOrigin(g),a=b.load(a));void 0!==c&&(a.repeat.fromArray(c),1!==c[0]&&(a.wrapS=
+THREE.RepeatWrapping),1!==c[1]&&(a.wrapT=THREE.RepeatWrapping));void 0!==d&&a.offset.fromArray(d);void 0!==f&&("repeat"===f[0]&&(a.wrapS=THREE.RepeatWrapping),"mirror"===f[0]&&(a.wrapS=THREE.MirroredRepeatWrapping),"repeat"===f[1]&&(a.wrapT=THREE.RepeatWrapping),"mirror"===f[1]&&(a.wrapT=THREE.MirroredRepeatWrapping));void 0!==l&&(a.anisotropy=l);c=THREE.Math.generateUUID();h[c]=a;return c}void 0===a&&(a=new THREE.Color);void 0===b&&(b=new THREE.TextureLoader);void 0===c&&(c=new THREE.MaterialLoader);
+var h={},l={uuid:THREE.Math.generateUUID(),type:"MeshLambertMaterial"},k;for(k in d){var m=d[k];switch(k){case "DbgColor":l.color=m;break;case "DbgIndex":case "opticalDensity":case "illumination":break;case "DbgName":l.name=m;break;case "blending":l.blending=THREE[m];break;case "colorDiffuse":l.color=a.fromArray(m).getHex();break;case "colorSpecular":l.specular=a.fromArray(m).getHex();break;case "colorEmissive":l.emissive=a.fromArray(m).getHex();break;case "specularCoef":l.shininess=m;break;case "shading":"basic"===
+m.toLowerCase()&&(l.type="MeshBasicMaterial");"phong"===m.toLowerCase()&&(l.type="MeshPhongMaterial");break;case "mapDiffuse":l.map=f(m,d.mapDiffuseRepeat,d.mapDiffuseOffset,d.mapDiffuseWrap,d.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;case "mapLight":l.lightMap=f(m,d.mapLightRepeat,d.mapLightOffset,d.mapLightWrap,d.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;
+case "mapAO":l.aoMap=f(m,d.mapAORepeat,d.mapAOOffset,d.mapAOWrap,d.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":l.bumpMap=f(m,d.mapBumpRepeat,d.mapBumpOffset,d.mapBumpWrap,d.mapBumpAnisotropy);break;case "mapBumpScale":l.bumpScale=m;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":l.normalMap=f(m,d.mapNormalRepeat,d.mapNormalOffset,d.mapNormalWrap,d.mapNormalAnisotropy);
+break;case "mapNormalFactor":l.normalScale=[m,m];break;case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":l.specularMap=f(m,d.mapSpecularRepeat,d.mapSpecularOffset,d.mapSpecularWrap,d.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break;case "mapAlpha":l.alphaMap=f(m,d.mapAlphaRepeat,d.mapAlphaOffset,d.mapAlphaWrap,d.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;
+case "flipSided":l.side=THREE.BackSide;break;case "doubleSided":l.side=THREE.DoubleSide;break;case "transparency":console.warn("THREE.Loader: transparency has been renamed to opacity");l.opacity=m;break;case "opacity":case "transparent":case "depthTest":case "depthWrite":case "transparent":case "visible":case "wireframe":l[k]=m;break;case "vertexColors":!0===m&&(l.vertexColors=THREE.VertexColors);"face"===m&&(l.vertexColors=THREE.FaceColors);break;default:console.error("Loader.createMaterial: Unsupported",
+k,m)}}"MeshPhongMaterial"!==l.type&&delete l.specular;1>l.opacity&&(l.transparent=!0);c.setTextures(h);return c.parse(l)}}()};THREE.Loader.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}};THREE.XHRLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};
+THREE.XHRLoader.prototype={constructor:THREE.XHRLoader,load:function(a,b,c,d){var e=this,g=THREE.Cache.get(a);if(void 0!==g)return b&&setTimeout(function(){b(g)},0),g;var f=new XMLHttpRequest;f.open("GET",a,!0);f.addEventListener("load",function(c){c=c.target.response;THREE.Cache.add(a,c);b&&b(c);e.manager.itemEnd(a)},!1);void 0!==c&&f.addEventListener("progress",function(a){c(a)},!1);f.addEventListener("error",function(b){d&&d(b);e.manager.itemError(a)},!1);void 0!==this.crossOrigin&&(f.crossOrigin=
+this.crossOrigin);void 0!==this.responseType&&(f.responseType=this.responseType);void 0!==this.withCredentials&&(f.withCredentials=this.withCredentials);f.send(null);e.manager.itemStart(a);return f},setResponseType:function(a){this.responseType=a},setCrossOrigin:function(a){this.crossOrigin=a},setWithCredentials:function(a){this.withCredentials=a}};THREE.ImageLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};
+THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b,c,d){var e=this,g=THREE.Cache.get(a);if(void 0!==g)return e.manager.itemStart(a),b?setTimeout(function(){b(g);e.manager.itemEnd(a)},0):e.manager.itemEnd(a),g;var f=document.createElement("img");f.addEventListener("load",function(c){THREE.Cache.add(a,this);b&&b(this);e.manager.itemEnd(a)},!1);void 0!==c&&f.addEventListener("progress",function(a){c(a)},!1);f.addEventListener("error",function(b){d&&d(b);e.manager.itemError(a)},
+!1);void 0!==this.crossOrigin&&(f.crossOrigin=this.crossOrigin);e.manager.itemStart(a);f.src=a;return f},setCrossOrigin:function(a){this.crossOrigin=a}};THREE.JSONLoader=function(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:THREE.DefaultLoadingManager;this.withCredentials=!1};
+THREE.JSONLoader.prototype={constructor:THREE.JSONLoader,get statusDomElement(){void 0===this._statusDomElement&&(this._statusDomElement=document.createElement("div"));console.warn("THREE.JSONLoader: .statusDomElement has been removed.");return this._statusDomElement},load:function(a,b,c,d){var e=this,g=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:THREE.Loader.prototype.extractUrlBase(a);c=new THREE.XHRLoader(this.manager);c.setCrossOrigin(this.crossOrigin);c.setWithCredentials(this.withCredentials);
+c.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d){if("object"===d.type){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.type){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,g);b(c.geometry,c.materials)})},setCrossOrigin:function(a){this.crossOrigin=a},setTexturePath:function(a){this.texturePath=a},parse:function(a,b){var c=new THREE.Geometry,d=void 0!==
+a.scale?1/a.scale:1;(function(b){var d,f,h,l,k,m,p,n,q,s,t,v,u,w=a.faces;m=a.vertices;var D=a.normals,x=a.colors,B=0;if(void 0!==a.uvs){for(d=0;d<a.uvs.length;d++)a.uvs[d].length&&B++;for(d=0;d<B;d++)c.faceVertexUvs[d]=[]}l=0;for(k=m.length;l<k;)d=new THREE.Vector3,d.x=m[l++]*b,d.y=m[l++]*b,d.z=m[l++]*b,c.vertices.push(d);l=0;for(k=w.length;l<k;)if(b=w[l++],q=b&1,h=b&2,d=b&8,p=b&16,s=b&32,m=b&64,b&=128,q){q=new THREE.Face3;q.a=w[l];q.b=w[l+1];q.c=w[l+3];t=new THREE.Face3;t.a=w[l+1];t.b=w[l+2];t.c=
+w[l+3];l+=4;h&&(h=w[l++],q.materialIndex=h,t.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<B;d++)for(v=a.uvs[d],c.faceVertexUvs[d][h]=[],c.faceVertexUvs[d][h+1]=[],f=0;4>f;f++)n=w[l++],u=v[2*n],n=v[2*n+1],u=new THREE.Vector2(u,n),2!==f&&c.faceVertexUvs[d][h].push(u),0!==f&&c.faceVertexUvs[d][h+1].push(u);p&&(p=3*w[l++],q.normal.set(D[p++],D[p++],D[p]),t.normal.copy(q.normal));if(s)for(d=0;4>d;d++)p=3*w[l++],s=new THREE.Vector3(D[p++],D[p++],D[p]),2!==d&&q.vertexNormals.push(s),0!==d&&t.vertexNormals.push(s);
+m&&(m=w[l++],m=x[m],q.color.setHex(m),t.color.setHex(m));if(b)for(d=0;4>d;d++)m=w[l++],m=x[m],2!==d&&q.vertexColors.push(new THREE.Color(m)),0!==d&&t.vertexColors.push(new THREE.Color(m));c.faces.push(q);c.faces.push(t)}else{q=new THREE.Face3;q.a=w[l++];q.b=w[l++];q.c=w[l++];h&&(h=w[l++],q.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<B;d++)for(v=a.uvs[d],c.faceVertexUvs[d][h]=[],f=0;3>f;f++)n=w[l++],u=v[2*n],n=v[2*n+1],u=new THREE.Vector2(u,n),c.faceVertexUvs[d][h].push(u);p&&(p=3*w[l++],q.normal.set(D[p++],
+D[p++],D[p]));if(s)for(d=0;3>d;d++)p=3*w[l++],s=new THREE.Vector3(D[p++],D[p++],D[p]),q.vertexNormals.push(s);m&&(m=w[l++],q.color.setHex(x[m]));if(b)for(d=0;3>d;d++)m=w[l++],q.vertexColors.push(new THREE.Color(x[m]));c.faces.push(q)}})(d);(function(){var b=void 0!==a.influencesPerVertex?a.influencesPerVertex:2;if(a.skinWeights)for(var d=0,f=a.skinWeights.length;d<f;d+=b)c.skinWeights.push(new THREE.Vector4(a.skinWeights[d],1<b?a.skinWeights[d+1]:0,2<b?a.skinWeights[d+2]:0,3<b?a.skinWeights[d+3]:
+0));if(a.skinIndices)for(d=0,f=a.skinIndices.length;d<f;d+=b)c.skinIndices.push(new THREE.Vector4(a.skinIndices[d],1<b?a.skinIndices[d+1]:0,2<b?a.skinIndices[d+2]:0,3<b?a.skinIndices[d+3]:0));c.bones=a.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+c.skinWeights.length+") should match.")})();(function(b){if(void 0!==
+a.morphTargets)for(var d=0,f=a.morphTargets.length;d<f;d++){c.morphTargets[d]={};c.morphTargets[d].name=a.morphTargets[d].name;c.morphTargets[d].vertices=[];for(var h=c.morphTargets[d].vertices,l=a.morphTargets[d].vertices,k=0,m=l.length;k<m;k+=3){var p=new THREE.Vector3;p.x=l[k]*b;p.y=l[k+1]*b;p.z=l[k+2]*b;h.push(p)}}if(void 0!==a.morphColors&&0<a.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),b=c.faces,h=a.morphColors[0].colors,
+d=0,f=b.length;d<f;d++)b[d].color.fromArray(h,3*d)})(d);(function(){var b=[],d=[];void 0!==a.animation&&d.push(a.animation);void 0!==a.animations&&(a.animations.length?d=d.concat(a.animations):d.push(a.animations));for(var f=0;f<d.length;f++){var h=THREE.AnimationClip.parseAnimation(d[f],c.bones);h&&b.push(h)}c.morphTargets&&(d=THREE.AnimationClip.CreateClipsFromMorphTargetSequences(c.morphTargets,10),b=b.concat(d));0<b.length&&(c.animations=b)})();c.computeFaceNormals();c.computeBoundingSphere();
+if(void 0===a.materials||0===a.materials.length)return{geometry:c};d=THREE.Loader.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:d}}};
+THREE.LoadingManager=function(a,b,c){var d=this,e=!1,g=0,f=0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){f++;if(!1===e&&void 0!==d.onStart)d.onStart(a,g,f);e=!0};this.itemEnd=function(a){g++;if(void 0!==d.onProgress)d.onProgress(a,g,f);if(g===f&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)}};THREE.DefaultLoadingManager=new THREE.LoadingManager;
+THREE.BufferGeometryLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};
+THREE.BufferGeometryLoader.prototype={constructor:THREE.BufferGeometryLoader,load:function(a,b,c,d){var e=this,g=new THREE.XHRLoader(e.manager);g.setCrossOrigin(this.crossOrigin);g.load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a){var b=new THREE.BufferGeometry,c=a.data.index;void 0!==c&&(c=new self[c.type](c.array),b.setIndex(new THREE.BufferAttribute(c,1)));var d=a.data.attributes,e;for(e in d){var g=d[e],c=new self[g.type](g.array);
+b.addAttribute(e,new THREE.BufferAttribute(c,g.itemSize))}e=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==e)for(c=0,d=e.length;c!==d;++c)g=e[c],b.addGroup(g.start,g.count);a=a.data.boundingSphere;void 0!==a&&(e=new THREE.Vector3,void 0!==a.center&&e.fromArray(a.center),b.boundingSphere=new THREE.Sphere(e,a.radius));return b}};THREE.MaterialLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager;this.textures={}};
+THREE.MaterialLoader.prototype={constructor:THREE.MaterialLoader,load:function(a,b,c,d){var e=this,g=new THREE.XHRLoader(e.manager);g.setCrossOrigin(this.crossOrigin);g.load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setCrossOrigin:function(a){this.crossOrigin=a},setTextures:function(a){this.textures=a},getTexture:function(a){var b=this.textures;void 0===b[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return b[a]},parse:function(a){var b=new THREE[a.type];b.uuid=a.uuid;void 0!==
+a.name&&(b.name=a.name);void 0!==a.color&&b.color.setHex(a.color);void 0!==a.emissive&&b.emissive.setHex(a.emissive);void 0!==a.specular&&b.specular.setHex(a.specular);void 0!==a.shininess&&(b.shininess=a.shininess);void 0!==a.uniforms&&(b.uniforms=a.uniforms);void 0!==a.vertexShader&&(b.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(b.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(b.vertexColors=a.vertexColors);void 0!==a.shading&&(b.shading=a.shading);void 0!==a.blending&&
+(b.blending=a.blending);void 0!==a.side&&(b.side=a.side);void 0!==a.opacity&&(b.opacity=a.opacity);void 0!==a.transparent&&(b.transparent=a.transparent);void 0!==a.alphaTest&&(b.alphaTest=a.alphaTest);void 0!==a.depthTest&&(b.depthTest=a.depthTest);void 0!==a.depthWrite&&(b.depthWrite=a.depthWrite);void 0!==a.wireframe&&(b.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(b.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.size&&(b.size=a.size);void 0!==a.sizeAttenuation&&(b.sizeAttenuation=
+a.sizeAttenuation);void 0!==a.map&&(b.map=this.getTexture(a.map));void 0!==a.alphaMap&&(b.alphaMap=this.getTexture(a.alphaMap),b.transparent=!0);void 0!==a.bumpMap&&(b.bumpMap=this.getTexture(a.bumpMap));void 0!==a.bumpScale&&(b.bumpScale=a.bumpScale);void 0!==a.normalMap&&(b.normalMap=this.getTexture(a.normalMap));a.normalScale&&(b.normalScale=new THREE.Vector2(a.normalScale,a.normalScale));void 0!==a.displacementMap&&(b.displacementMap=this.getTexture(a.displacementMap));void 0!==a.displacementScale&&
+(b.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(b.displacementBias=a.displacementBias);void 0!==a.specularMap&&(b.specularMap=this.getTexture(a.specularMap));void 0!==a.envMap&&(b.envMap=this.getTexture(a.envMap),b.combine=THREE.MultiplyOperation);a.reflectivity&&(b.reflectivity=a.reflectivity);void 0!==a.lightMap&&(b.lightMap=this.getTexture(a.lightMap));void 0!==a.lightMapIntensity&&(b.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(b.aoMap=this.getTexture(a.aoMap));
+void 0!==a.aoMapIntensity&&(b.aoMapIntensity=a.aoMapIntensity);if(void 0!==a.materials)for(var c=0,d=a.materials.length;c<d;c++)b.materials.push(this.parse(a.materials[c]));return b}};THREE.ObjectLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager;this.texturePath=""};
+THREE.ObjectLoader.prototype={constructor:THREE.ObjectLoader,load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this,g=new THREE.XHRLoader(e.manager);g.setCrossOrigin(this.crossOrigin);g.load(a,function(a){e.parse(JSON.parse(a),b)},c,d)},setTexturePath:function(a){this.texturePath=a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),
+d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new THREE.JSONLoader,d=new THREE.BufferGeometryLoader,e=0,g=a.length;e<g;e++){var f,h=a[e];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":f=new THREE[h.type](h.width,h.height,h.widthSegments,
+h.heightSegments);break;case "BoxGeometry":case "CubeGeometry":f=new THREE.BoxGeometry(h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case "CircleBufferGeometry":f=new THREE.CircleBufferGeometry(h.radius,h.segments,h.thetaStart,h.thetaLength);break;case "CircleGeometry":f=new THREE.CircleGeometry(h.radius,h.segments,h.thetaStart,h.thetaLength);break;case "CylinderGeometry":f=new THREE.CylinderGeometry(h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,
+h.openEnded,h.thetaStart,h.thetaLength);break;case "SphereGeometry":f=new THREE.SphereGeometry(h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case "SphereBufferGeometry":f=new THREE.SphereBufferGeometry(h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":f=new THREE.DodecahedronGeometry(h.radius,h.detail);break;case "IcosahedronGeometry":f=new THREE.IcosahedronGeometry(h.radius,
+h.detail);break;case "OctahedronGeometry":f=new THREE.OctahedronGeometry(h.radius,h.detail);break;case "TetrahedronGeometry":f=new THREE.TetrahedronGeometry(h.radius,h.detail);break;case "RingGeometry":f=new THREE.RingGeometry(h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":f=new THREE.TorusGeometry(h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":f=new THREE.TorusKnotGeometry(h.radius,h.tube,
+h.radialSegments,h.tubularSegments,h.p,h.q,h.heightScale);break;case "BufferGeometry":f=d.parse(h);break;case "Geometry":f=c.parse(h.data,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+h.type+'"');continue}f.uuid=h.uuid;void 0!==h.name&&(f.name=h.name);b[h.uuid]=f}return b},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new THREE.MaterialLoader;d.setTextures(b);for(var e=0,g=a.length;e<g;e++){var f=d.parse(a[e]);c[f.uuid]=f}}return c},
+parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=THREE.AnimationClip.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)})}var d=this,e={};if(void 0!==a&&0<a.length){var g=new THREE.LoadingManager(b),f=new THREE.ImageLoader(g);f.setCrossOrigin(this.crossOrigin);for(var g=0,h=a.length;g<h;g++){var l=a[g],k=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(l.url)?l.url:d.texturePath+l.url;e[l.uuid]=c(k)}}return e},
+parseTextures:function(a,b){function c(a){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return THREE[a]}var d={};if(void 0!==a)for(var e=0,g=a.length;e<g;e++){var f=a[e];void 0===f.image&&console.warn('THREE.ObjectLoader: No "image" specified for',f.uuid);void 0===b[f.image]&&console.warn("THREE.ObjectLoader: Undefined image",f.image);var h=new THREE.Texture(b[f.image]);h.needsUpdate=!0;h.uuid=f.uuid;void 0!==f.name&&(h.name=
+f.name);void 0!==f.mapping&&(h.mapping=c(f.mapping));void 0!==f.offset&&(h.offset=new THREE.Vector2(f.offset[0],f.offset[1]));void 0!==f.repeat&&(h.repeat=new THREE.Vector2(f.repeat[0],f.repeat[1]));void 0!==f.minFilter&&(h.minFilter=c(f.minFilter));void 0!==f.magFilter&&(h.magFilter=c(f.magFilter));void 0!==f.anisotropy&&(h.anisotropy=f.anisotropy);Array.isArray(f.wrap)&&(h.wrapS=c(f.wrap[0]),h.wrapT=c(f.wrap[1]));d[f.uuid]=h}return d},parseObject:function(){var a=new THREE.Matrix4;return function(b,
+c,d){function e(a){void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return c[a]}function g(a){if(void 0!==a)return void 0===d[a]&&console.warn("THREE.ObjectLoader: Undefined material",a),d[a]}var f;switch(b.type){case "Scene":f=new THREE.Scene;break;case "PerspectiveCamera":f=new THREE.PerspectiveCamera(b.fov,b.aspect,b.near,b.far);break;case "OrthographicCamera":f=new THREE.OrthographicCamera(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case "AmbientLight":f=new THREE.AmbientLight(b.color);
+break;case "DirectionalLight":f=new THREE.DirectionalLight(b.color,b.intensity);break;case "PointLight":f=new THREE.PointLight(b.color,b.intensity,b.distance,b.decay);break;case "SpotLight":f=new THREE.SpotLight(b.color,b.intensity,b.distance,b.angle,b.exponent,b.decay);break;case "HemisphereLight":f=new THREE.HemisphereLight(b.color,b.groundColor,b.intensity);break;case "Mesh":f=new THREE.Mesh(e(b.geometry),g(b.material));break;case "LOD":f=new THREE.LOD;break;case "Line":f=new THREE.Line(e(b.geometry),
+g(b.material),b.mode);break;case "PointCloud":case "Points":f=new THREE.Points(e(b.geometry),g(b.material));break;case "Sprite":f=new THREE.Sprite(g(b.material));break;case "Group":f=new THREE.Group;break;default:f=new THREE.Object3D}f.uuid=b.uuid;void 0!==b.name&&(f.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(f.position,f.quaternion,f.scale)):(void 0!==b.position&&f.position.fromArray(b.position),void 0!==b.rotation&&f.rotation.fromArray(b.rotation),void 0!==b.scale&&f.scale.fromArray(b.scale));
+void 0!==b.castShadow&&(f.castShadow=b.castShadow);void 0!==b.receiveShadow&&(f.receiveShadow=b.receiveShadow);void 0!==b.visible&&(f.visible=b.visible);void 0!==b.userData&&(f.userData=b.userData);if(void 0!==b.children)for(var h in b.children)f.add(this.parseObject(b.children[h],c,d));if("LOD"===b.type){b=b.levels;for(var l=0;l<b.length;l++){var k=b[l];h=f.getObjectByProperty("uuid",k.object);void 0!==h&&f.addLevel(h,k.distance)}}return f}}()};
+THREE.TextureLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};THREE.TextureLoader.prototype={constructor:THREE.TextureLoader,load:function(a,b,c,d){var e=new THREE.Texture,g=new THREE.ImageLoader(this.manager);g.setCrossOrigin(this.crossOrigin);g.load(a,function(a){e.image=a;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e},setCrossOrigin:function(a){this.crossOrigin=a}};THREE.CubeTextureLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager};
+THREE.CubeTextureLoader.prototype={constructor:THREE.CubeTextureLoader,load:function(a,b,c,d){function e(c){f.load(a[c],function(a){g.images[c]=a;h++;6===h&&(g.needsUpdate=!0,b&&b(g))},void 0,d)}var g=new THREE.CubeTexture([]),f=new THREE.ImageLoader;f.setCrossOrigin(this.crossOrigin);var h=0;for(c=0;c<a.length;++c)e(c);return g},setCrossOrigin:function(a){this.crossOrigin=a}};
+THREE.DataTextureLoader=THREE.BinaryTextureLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager;this._parser=null};
+THREE.BinaryTextureLoader.prototype={constructor:THREE.BinaryTextureLoader,load:function(a,b,c,d){var e=this,g=new THREE.DataTexture,f=new THREE.XHRLoader(this.manager);f.setCrossOrigin(this.crossOrigin);f.setResponseType("arraybuffer");f.load(a,function(a){if(a=e._parser(a))void 0!==a.image?g.image=a.image:void 0!==a.data&&(g.image.width=a.width,g.image.height=a.height,g.image.data=a.data),g.wrapS=void 0!==a.wrapS?a.wrapS:THREE.ClampToEdgeWrapping,g.wrapT=void 0!==a.wrapT?a.wrapT:THREE.ClampToEdgeWrapping,
+g.magFilter=void 0!==a.magFilter?a.magFilter:THREE.LinearFilter,g.minFilter=void 0!==a.minFilter?a.minFilter:THREE.LinearMipMapLinearFilter,g.anisotropy=void 0!==a.anisotropy?a.anisotropy:1,void 0!==a.format&&(g.format=a.format),void 0!==a.type&&(g.type=a.type),void 0!==a.mipmaps&&(g.mipmaps=a.mipmaps),1===a.mipmapCount&&(g.minFilter=THREE.LinearFilter),g.needsUpdate=!0,b&&b(g,a)},c,d);return g},setCrossOrigin:function(a){this.crossOrigin=a}};
+THREE.CompressedTextureLoader=function(a){this.manager=void 0!==a?a:THREE.DefaultLoadingManager;this._parser=null};
+THREE.CompressedTextureLoader.prototype={constructor:THREE.CompressedTextureLoader,load:function(a,b,c,d){var e=this,g=[],f=new THREE.CompressedTexture;f.image=g;var h=new THREE.XHRLoader(this.manager);h.setCrossOrigin(this.crossOrigin);h.setResponseType("arraybuffer");if(Array.isArray(a))for(var l=0,k=function(k){h.load(a[k],function(a){a=e._parser(a,!0);g[k]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};l+=1;6===l&&(1===a.mipmapCount&&(f.minFilter=THREE.LinearFilter),f.format=
+a.format,f.needsUpdate=!0,b&&b(f))},c,d)},m=0,p=a.length;m<p;++m)k(m);else h.load(a,function(a){a=e._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var h=0;h<a.mipmapCount;h++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+h]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else f.image.width=a.width,f.image.height=a.height,f.mipmaps=a.mipmaps;1===a.mipmapCount&&(f.minFilter=THREE.LinearFilter);f.format=a.format;f.needsUpdate=!0;b&&
+b(f)},c,d);return f},setCrossOrigin:function(a){this.crossOrigin=a}};
+THREE.Material=function(){Object.defineProperty(this,"id",{value:THREE.MaterialIdCount++});this.uuid=THREE.Math.generateUUID();this.name="";this.type="Material";this.side=THREE.FrontSide;this.opacity=1;this.transparent=!1;this.blending=THREE.NormalBlending;this.blendSrc=THREE.SrcAlphaFactor;this.blendDst=THREE.OneMinusSrcAlphaFactor;this.blendEquation=THREE.AddEquation;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=THREE.LessEqualDepth;this.colorWrite=this.depthWrite=
+this.depthTest=!0;this.precision=null;this.polygonOffset=!1;this.overdraw=this.alphaTest=this.polygonOffsetUnits=this.polygonOffsetFactor=0;this._needsUpdate=this.visible=!0};
+THREE.Material.prototype={constructor:THREE.Material,get needsUpdate(){return this._needsUpdate},set needsUpdate(a){!0===a&&this.update();this._needsUpdate=a},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d instanceof THREE.Color?d.set(c):d instanceof THREE.Vector3&&c instanceof THREE.Vector3?d.copy(c):
+this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){var b={metadata:{version:4.4,type:"Material",generator:"Material.toJSON"}};b.uuid=this.uuid;b.type=this.type;""!==this.name&&(b.name=this.name);this.color instanceof THREE.Color&&(b.color=this.color.getHex());this.emissive instanceof THREE.Color&&(b.emissive=this.emissive.getHex());this.specular instanceof THREE.Color&&(b.specular=this.specular.getHex());void 0!==this.shininess&&(b.shininess=this.shininess);this.map instanceof THREE.Texture&&
+(b.map=this.map.toJSON(a).uuid);this.alphaMap instanceof THREE.Texture&&(b.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap instanceof THREE.Texture&&(b.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap instanceof THREE.Texture&&(b.bumpMap=this.bumpMap.toJSON(a).uuid,b.bumpScale=this.bumpScale);this.normalMap instanceof THREE.Texture&&(b.normalMap=this.normalMap.toJSON(a).uuid,b.normalScale=this.normalScale);this.displacementMap instanceof THREE.Texture&&(b.displacementMap=this.displacementMap.toJSON(a).uuid,
+b.displacementScale=this.displacementScale,b.displacementBias=this.displacementBias);this.specularMap instanceof THREE.Texture&&(b.specularMap=this.specularMap.toJSON(a).uuid);this.envMap instanceof THREE.Texture&&(b.envMap=this.envMap.toJSON(a).uuid,b.reflectivity=this.reflectivity);void 0!==this.size&&(b.size=this.size);void 0!==this.sizeAttenuation&&(b.sizeAttenuation=this.sizeAttenuation);void 0!==this.vertexColors&&this.vertexColors!==THREE.NoColors&&(b.vertexColors=this.vertexColors);void 0!==
+this.shading&&this.shading!==THREE.SmoothShading&&(b.shading=this.shading);void 0!==this.blending&&this.blending!==THREE.NormalBlending&&(b.blending=this.blending);void 0!==this.side&&this.side!==THREE.FrontSide&&(b.side=this.side);1>this.opacity&&(b.opacity=this.opacity);!0===this.transparent&&(b.transparent=this.transparent);0<this.alphaTest&&(b.alphaTest=this.alphaTest);!0===this.wireframe&&(b.wireframe=this.wireframe);1<this.wireframeLinewidth&&(b.wireframeLinewidth=this.wireframeLinewidth);return b},
+clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.side=a.side;this.opacity=a.opacity;this.transparent=a.transparent;this.blending=a.blending;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.precision=a.precision;this.polygonOffset=
+a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.alphaTest=a.alphaTest;this.overdraw=a.overdraw;this.visible=a.visible;return this},update:function(){this.dispatchEvent({type:"update"})},dispose:function(){this.dispatchEvent({type:"dispose"})},get wrapAround(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set wrapAround(a){console.warn("THREE."+this.type+": .wrapAround has been removed.")},get wrapRGB(){console.warn("THREE."+
+this.type+": .wrapRGB has been removed.");return new THREE.Color}};THREE.EventDispatcher.prototype.apply(THREE.Material.prototype);THREE.MaterialIdCount=0;THREE.LineBasicMaterial=function(a){THREE.Material.call(this);this.type="LineBasicMaterial";this.color=new THREE.Color(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.vertexColors=THREE.NoColors;this.fog=!0;this.setValues(a)};THREE.LineBasicMaterial.prototype=Object.create(THREE.Material.prototype);
+THREE.LineBasicMaterial.prototype.constructor=THREE.LineBasicMaterial;THREE.LineBasicMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;this.vertexColors=a.vertexColors;this.fog=a.fog;return this};
+THREE.LineDashedMaterial=function(a){THREE.Material.call(this);this.type="LineDashedMaterial";this.color=new THREE.Color(16777215);this.scale=this.linewidth=1;this.dashSize=3;this.gapSize=1;this.vertexColors=!1;this.fog=!0;this.setValues(a)};THREE.LineDashedMaterial.prototype=Object.create(THREE.Material.prototype);THREE.LineDashedMaterial.prototype.constructor=THREE.LineDashedMaterial;
+THREE.LineDashedMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;this.vertexColors=a.vertexColors;this.fog=a.fog;return this};
+THREE.MeshBasicMaterial=function(a){THREE.Material.call(this);this.type="MeshBasicMaterial";this.color=new THREE.Color(16777215);this.aoMap=this.map=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.vertexColors=THREE.NoColors;this.morphTargets=this.skinning=
+!1;this.setValues(a)};THREE.MeshBasicMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshBasicMaterial.prototype.constructor=THREE.MeshBasicMaterial;
+THREE.MeshBasicMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.fog=a.fog;this.shading=a.shading;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;
+this.wireframeLinejoin=a.wireframeLinejoin;this.vertexColors=a.vertexColors;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};
+THREE.MeshLambertMaterial=function(a){THREE.Material.call(this);this.type="MeshLambertMaterial";this.color=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.envMap=this.alphaMap=this.specularMap=this.map=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)};
+THREE.MeshLambertMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshLambertMaterial.prototype.constructor=THREE.MeshLambertMaterial;
+THREE.MeshLambertMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.color.copy(a.color);this.emissive.copy(a.emissive);this.map=a.map;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.fog=a.fog;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;
+this.vertexColors=a.vertexColors;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};
+THREE.MeshPhongMaterial=function(a){THREE.Material.call(this);this.type="MeshPhongMaterial";this.color=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.specular=new THREE.Color(1118481);this.shininess=30;this.metal=!1;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new THREE.Vector2(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=
+0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=!0;this.shading=THREE.SmoothShading;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.vertexColors=THREE.NoColors;this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)};THREE.MeshPhongMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshPhongMaterial.prototype.constructor=THREE.MeshPhongMaterial;
+THREE.MeshPhongMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.color.copy(a.color);this.emissive.copy(a.emissive);this.specular.copy(a.specular);this.shininess=a.shininess;this.metal=a.metal;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissiveMap=a.emissiveMap;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);
+this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.fog=a.fog;this.shading=a.shading;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.vertexColors=
+a.vertexColors;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};THREE.MeshDepthMaterial=function(a){THREE.Material.call(this);this.type="MeshDepthMaterial";this.wireframe=this.morphTargets=!1;this.wireframeLinewidth=1;this.setValues(a)};THREE.MeshDepthMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshDepthMaterial.prototype.constructor=THREE.MeshDepthMaterial;
+THREE.MeshDepthMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};THREE.MeshNormalMaterial=function(a){THREE.Material.call(this,a);this.type="MeshNormalMaterial";this.wireframe=!1;this.wireframeLinewidth=1;this.morphTargets=!1;this.setValues(a)};THREE.MeshNormalMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshNormalMaterial.prototype.constructor=THREE.MeshNormalMaterial;
+THREE.MeshNormalMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};THREE.MultiMaterial=function(a){this.uuid=THREE.Math.generateUUID();this.type="MultiMaterial";this.materials=a instanceof Array?a:[];this.visible=!0};
+THREE.MultiMaterial.prototype={constructor:THREE.MultiMaterial,toJSON:function(){for(var a={metadata:{version:4.2,type:"material",generator:"MaterialExporter"},uuid:this.uuid,type:this.type,materials:[]},b=0,c=this.materials.length;b<c;b++)a.materials.push(this.materials[b].toJSON());a.visible=this.visible;return a},clone:function(){for(var a=new this.constructor,b=0;b<this.materials.length;b++)a.materials.push(this.materials[b].clone());a.visible=this.visible;return a}};THREE.MeshFaceMaterial=THREE.MultiMaterial;
+THREE.PointsMaterial=function(a){THREE.Material.call(this);this.type="PointsMaterial";this.color=new THREE.Color(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.vertexColors=THREE.NoColors;this.fog=!0;this.setValues(a)};THREE.PointsMaterial.prototype=Object.create(THREE.Material.prototype);THREE.PointsMaterial.prototype.constructor=THREE.PointsMaterial;
+THREE.PointsMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;this.vertexColors=a.vertexColors;this.fog=a.fog;return this};THREE.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new THREE.PointsMaterial(a)};
+THREE.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new THREE.PointsMaterial(a)};THREE.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new THREE.PointsMaterial(a)};
+THREE.ShaderMaterial=function(a){THREE.Material.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.shading=THREE.SmoothShading;this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.vertexColors=THREE.NoColors;this.derivatives=this.morphNormals=
+this.morphTargets=this.skinning=!1;this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))};THREE.ShaderMaterial.prototype=Object.create(THREE.Material.prototype);THREE.ShaderMaterial.prototype.constructor=THREE.ShaderMaterial;
+THREE.ShaderMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=THREE.UniformsUtils.clone(a.uniforms);this.attributes=a.attributes;this.defines=a.defines;this.shading=a.shading;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.fog=a.fog;this.lights=a.lights;this.vertexColors=a.vertexColors;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=
+a.morphNormals;this.derivatives=a.derivatives;return this};THREE.ShaderMaterial.prototype.toJSON=function(a){a=THREE.Material.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.attributes=this.attributes;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};THREE.RawShaderMaterial=function(a){THREE.ShaderMaterial.call(this,a);this.type="RawShaderMaterial"};THREE.RawShaderMaterial.prototype=Object.create(THREE.ShaderMaterial.prototype);
+THREE.RawShaderMaterial.prototype.constructor=THREE.RawShaderMaterial;THREE.SpriteMaterial=function(a){THREE.Material.call(this);this.type="SpriteMaterial";this.color=new THREE.Color(16777215);this.map=null;this.rotation=0;this.fog=!1;this.setValues(a)};THREE.SpriteMaterial.prototype=Object.create(THREE.Material.prototype);THREE.SpriteMaterial.prototype.constructor=THREE.SpriteMaterial;
+THREE.SpriteMaterial.prototype.copy=function(a){THREE.Material.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;this.fog=a.fog;return this};
+THREE.Texture=function(a,b,c,d,e,g,f,h,l){Object.defineProperty(this,"id",{value:THREE.TextureIdCount++});this.uuid=THREE.Math.generateUUID();this.sourceFile=this.name="";this.image=void 0!==a?a:THREE.Texture.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:THREE.Texture.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==d?d:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==e?e:THREE.LinearFilter;this.minFilter=void 0!==g?g:THREE.LinearMipMapLinearFilter;
+this.anisotropy=void 0!==l?l:1;this.format=void 0!==f?f:THREE.RGBAFormat;this.type=void 0!==h?h:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.version=0;this.onUpdate=null};THREE.Texture.DEFAULT_IMAGE=void 0;THREE.Texture.DEFAULT_MAPPING=THREE.UVMapping;
+THREE.Texture.prototype={constructor:THREE.Texture,set needsUpdate(a){!0===a&&this.version++},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=
+a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.4,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy};if(void 0!==this.image){var c=
+this.image;void 0===c.uuid&&(c.uuid=THREE.Math.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,g=c.uuid,f;void 0!==c.toDataURL?f=c:(f=document.createElement("canvas"),f.width=c.width,f.height=c.height,f.getContext("2d").drawImage(c,0,0,c.width,c.height));f=2048<f.width||2048<f.height?f.toDataURL("image/jpeg",.6):f.toDataURL("image/png");d[e]={uuid:g,url:f}}b.image=c.uuid}return a.textures[this.uuid]=b},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(this.mapping===
+THREE.UVMapping){a.multiply(this.repeat);a.add(this.offset);if(0>a.x||1<a.x)switch(this.wrapS){case THREE.RepeatWrapping:a.x-=Math.floor(a.x);break;case THREE.ClampToEdgeWrapping:a.x=0>a.x?0:1;break;case THREE.MirroredRepeatWrapping:1===Math.abs(Math.floor(a.x)%2)?a.x=Math.ceil(a.x)-a.x:a.x-=Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case THREE.RepeatWrapping:a.y-=Math.floor(a.y);break;case THREE.ClampToEdgeWrapping:a.y=0>a.y?0:1;break;case THREE.MirroredRepeatWrapping:1===Math.abs(Math.floor(a.y)%
+2)?a.y=Math.ceil(a.y)-a.y:a.y-=Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}};THREE.EventDispatcher.prototype.apply(THREE.Texture.prototype);THREE.TextureIdCount=0;THREE.CanvasTexture=function(a,b,c,d,e,g,f,h,l){THREE.Texture.call(this,a,b,c,d,e,g,f,h,l);this.needsUpdate=!0};THREE.CanvasTexture.prototype=Object.create(THREE.Texture.prototype);THREE.CanvasTexture.prototype.constructor=THREE.CanvasTexture;
+THREE.CubeTexture=function(a,b,c,d,e,g,f,h,l){b=void 0!==b?b:THREE.CubeReflectionMapping;THREE.Texture.call(this,a,b,c,d,e,g,f,h,l);this.images=a;this.flipY=!1};THREE.CubeTexture.prototype=Object.create(THREE.Texture.prototype);THREE.CubeTexture.prototype.constructor=THREE.CubeTexture;THREE.CubeTexture.prototype.copy=function(a){THREE.Texture.prototype.copy.call(this,a);this.images=a.images;return this};
+THREE.CompressedTexture=function(a,b,c,d,e,g,f,h,l,k,m){THREE.Texture.call(this,null,g,f,h,l,k,d,e,m);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1};THREE.CompressedTexture.prototype=Object.create(THREE.Texture.prototype);THREE.CompressedTexture.prototype.constructor=THREE.CompressedTexture;
+THREE.DataTexture=function(a,b,c,d,e,g,f,h,l,k,m){THREE.Texture.call(this,null,g,f,h,l,k,d,e,m);this.image={data:a,width:b,height:c};this.magFilter=void 0!==l?l:THREE.NearestFilter;this.minFilter=void 0!==k?k:THREE.NearestFilter;this.generateMipmaps=this.flipY=!1};THREE.DataTexture.prototype=Object.create(THREE.Texture.prototype);THREE.DataTexture.prototype.constructor=THREE.DataTexture;
+THREE.VideoTexture=function(a,b,c,d,e,g,f,h,l){function k(){requestAnimationFrame(k);a.readyState===a.HAVE_ENOUGH_DATA&&(m.needsUpdate=!0)}THREE.Texture.call(this,a,b,c,d,e,g,f,h,l);this.generateMipmaps=!1;var m=this;k()};THREE.VideoTexture.prototype=Object.create(THREE.Texture.prototype);THREE.VideoTexture.prototype.constructor=THREE.VideoTexture;THREE.Group=function(){THREE.Object3D.call(this);this.type="Group"};THREE.Group.prototype=Object.create(THREE.Object3D.prototype);
+THREE.Group.prototype.constructor=THREE.Group;THREE.Points=function(a,b){THREE.Object3D.call(this);this.type="Points";this.geometry=void 0!==a?a:new THREE.Geometry;this.material=void 0!==b?b:new THREE.PointsMaterial({color:16777215*Math.random()})};THREE.Points.prototype=Object.create(THREE.Object3D.prototype);THREE.Points.prototype.constructor=THREE.Points;
+THREE.Points.prototype.raycast=function(){var a=new THREE.Matrix4,b=new THREE.Ray;return function(c,d){function e(a,e){var f=b.distanceSqToPoint(a);if(f<l){var h=b.closestPointToPoint(a);h.applyMatrix4(g.matrixWorld);var k=c.ray.origin.distanceTo(h);k<c.near||k>c.far||d.push({distance:k,distanceToRay:Math.sqrt(f),point:h.clone(),index:e,face:null,object:g})}}var g=this,f=g.geometry,h=c.params.Points.threshold;a.getInverse(this.matrixWorld);b.copy(c.ray).applyMatrix4(a);if(null===f.boundingBox||!1!==
+b.isIntersectionBox(f.boundingBox)){var h=h/((this.scale.x+this.scale.y+this.scale.z)/3),l=h*h,h=new THREE.Vector3;if(f instanceof THREE.BufferGeometry){var k=f.index,f=f.attributes.position.array;if(null!==k)for(var m=k.array,k=0,p=m.length;k<p;k++){var n=m[k];h.fromArray(f,3*n);e(h,n)}else for(k=0,m=f.length/3;k<m;k++)h.fromArray(f,3*k),e(h,k)}else for(h=f.vertices,k=0,m=h.length;k<m;k++)e(h[k],k)}}}();THREE.Points.prototype.clone=function(){return(new this.constructor(this.geometry,this.material)).copy(this)};
+THREE.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new THREE.Points(a,b)};THREE.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new THREE.Points(a,b)};
+THREE.Line=function(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new THREE.LineSegments(a,b);THREE.Object3D.call(this);this.type="Line";this.geometry=void 0!==a?a:new THREE.Geometry;this.material=void 0!==b?b:new THREE.LineBasicMaterial({color:16777215*Math.random()})};THREE.Line.prototype=Object.create(THREE.Object3D.prototype);THREE.Line.prototype.constructor=THREE.Line;
+THREE.Line.prototype.raycast=function(){var a=new THREE.Matrix4,b=new THREE.Ray,c=new THREE.Sphere;return function(d,e){var g=d.linePrecision,g=g*g,f=this.geometry;null===f.boundingSphere&&f.computeBoundingSphere();c.copy(f.boundingSphere);c.applyMatrix4(this.matrixWorld);if(!1!==d.ray.isIntersectionSphere(c)){a.getInverse(this.matrixWorld);b.copy(d.ray).applyMatrix4(a);var h=new THREE.Vector3,l=new THREE.Vector3,k=new THREE.Vector3,m=new THREE.Vector3,p=this instanceof THREE.LineSegments?2:1;if(f instanceof
+THREE.BufferGeometry){var n=f.index,q=f.attributes;if(null!==n)for(var f=n.array,q=q.position.array,n=0,s=f.length-1;n<s;n+=p){var t=f[n+1];h.fromArray(q,3*f[n]);l.fromArray(q,3*t);t=b.distanceSqToSegment(h,l,m,k);t>g||(m.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(m),t<d.near||t>d.far||e.push({distance:t,point:k.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this}))}else for(q=q.position.array,n=0,s=q.length/3-1;n<s;n+=p)h.fromArray(q,3*n),l.fromArray(q,
+3*n+3),t=b.distanceSqToSegment(h,l,m,k),t>g||(m.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(m),t<d.near||t>d.far||e.push({distance:t,point:k.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this}))}else if(f instanceof THREE.Geometry)for(h=f.vertices,l=h.length,n=0;n<l-1;n+=p)t=b.distanceSqToSegment(h[n],h[n+1],m,k),t>g||(m.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(m),t<d.near||t>d.far||e.push({distance:t,point:k.clone().applyMatrix4(this.matrixWorld),
+index:n,face:null,faceIndex:null,object:this}))}}}();THREE.Line.prototype.clone=function(){return(new this.constructor(this.geometry,this.material)).copy(this)};THREE.LineStrip=0;THREE.LinePieces=1;THREE.LineSegments=function(a,b){THREE.Line.call(this,a,b);this.type="LineSegments"};THREE.LineSegments.prototype=Object.create(THREE.Line.prototype);THREE.LineSegments.prototype.constructor=THREE.LineSegments;
+THREE.Mesh=function(a,b){THREE.Object3D.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new THREE.Geometry;this.material=void 0!==b?b:new THREE.MeshBasicMaterial({color:16777215*Math.random()});this.updateMorphTargets()};THREE.Mesh.prototype=Object.create(THREE.Object3D.prototype);THREE.Mesh.prototype.constructor=THREE.Mesh;
+THREE.Mesh.prototype.updateMorphTargets=function(){if(void 0!==this.geometry.morphTargets&&0<this.geometry.morphTargets.length){this.morphTargetBase=-1;this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var a=0,b=this.geometry.morphTargets.length;a<b;a++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[this.geometry.morphTargets[a].name]=a}};
+THREE.Mesh.prototype.getMorphTargetIndexByName=function(a){if(void 0!==this.morphTargetDictionary[a])return this.morphTargetDictionary[a];console.warn("THREE.Mesh.getMorphTargetIndexByName: morph target "+a+" does not exist. Returning 0.");return 0};
+THREE.Mesh.prototype.raycast=function(){function a(a,b,c,d,e,f,g){THREE.Triangle.barycoordFromPoint(a,b,c,d,t);e.multiplyScalar(t.x);f.multiplyScalar(t.y);g.multiplyScalar(t.z);e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g){var h=a.material;if(null===(h.side===THREE.BackSide?c.intersectTriangle(f,e,d,!0,g):c.intersectTriangle(d,e,f,h.side!==THREE.DoubleSide,g)))return null;u.copy(g);u.applyMatrix4(a.matrixWorld);c=b.ray.origin.distanceTo(u);return c<b.near||c>b.far?null:{distance:c,point:u.clone(),
+object:a}}function c(c,d,e,g,k,m,p,u){f.fromArray(g,3*m);h.fromArray(g,3*p);l.fromArray(g,3*u);if(c=b(c,d,e,f,h,l,v))k&&(n.fromArray(k,2*m),q.fromArray(k,2*p),s.fromArray(k,2*u),c.uv=a(v,f,h,l,n,q,s)),c.face=new THREE.Face3(m,p,u,THREE.Triangle.normal(f,h,l)),c.faceIndex=m;return c}var d=new THREE.Matrix4,e=new THREE.Ray,g=new THREE.Sphere,f=new THREE.Vector3,h=new THREE.Vector3,l=new THREE.Vector3,k=new THREE.Vector3,m=new THREE.Vector3,p=new THREE.Vector3,n=new THREE.Vector2,q=new THREE.Vector2,
+s=new THREE.Vector2,t=new THREE.Vector3,v=new THREE.Vector3,u=new THREE.Vector3;return function(u,t){var x=this.geometry,B=this.material;if(void 0!==B){null===x.boundingSphere&&x.computeBoundingSphere();var y=this.matrixWorld;g.copy(x.boundingSphere);g.applyMatrix4(y);if(!1!==u.ray.isIntersectionSphere(g)&&(d.getInverse(y),e.copy(u.ray).applyMatrix4(d),null===x.boundingBox||!1!==e.isIntersectionBox(x.boundingBox))){var z,A;if(x instanceof THREE.BufferGeometry){var J,F,B=x.index,y=x.attributes,x=y.position.array;
+void 0!==y.uv&&(z=y.uv.array);if(null!==B)for(var y=B.array,C=0,N=y.length;C<N;C+=3){if(B=y[C],J=y[C+1],F=y[C+2],A=c(this,u,e,x,z,B,J,F))A.faceIndex=Math.floor(C/3),t.push(A)}else for(C=0,N=x.length;C<N;C+=9)if(B=C/3,J=B+1,F=B+2,A=c(this,u,e,x,z,B,J,F))A.index=B,t.push(A)}else if(x instanceof THREE.Geometry){var L,Q,y=B instanceof THREE.MeshFaceMaterial,C=!0===y?B.materials:null,N=x.vertices;J=x.faces;F=x.faceVertexUvs[0];0<F.length&&(z=F);for(var M=0,K=J.length;M<K;M++){var E=J[M];A=!0===y?C[E.materialIndex]:
+B;if(void 0!==A){F=N[E.a];L=N[E.b];Q=N[E.c];if(!0===A.morphTargets){A=x.morphTargets;var O=this.morphTargetInfluences;f.set(0,0,0);h.set(0,0,0);l.set(0,0,0);for(var T=0,H=A.length;T<H;T++){var R=O[T];if(0!==R){var G=A[T].vertices;f.addScaledVector(k.subVectors(G[E.a],F),R);h.addScaledVector(m.subVectors(G[E.b],L),R);l.addScaledVector(p.subVectors(G[E.c],Q),R)}}f.add(F);h.add(L);l.add(Q);F=f;L=h;Q=l}if(A=b(this,u,e,F,L,Q,v))z&&(O=z[M],n.copy(O[0]),q.copy(O[1]),s.copy(O[2]),A.uv=a(v,F,L,Q,n,q,s)),A.face=
+E,A.faceIndex=M,t.push(A)}}}}}}}();THREE.Mesh.prototype.clone=function(){return(new this.constructor(this.geometry,this.material)).copy(this)};THREE.Bone=function(a){THREE.Object3D.call(this);this.type="Bone";this.skin=a};THREE.Bone.prototype=Object.create(THREE.Object3D.prototype);THREE.Bone.prototype.constructor=THREE.Bone;THREE.Bone.prototype.copy=function(a){THREE.Object3D.prototype.copy.call(this,a);this.skin=a.skin;return this};
+THREE.Skeleton=function(a,b,c){this.useVertexTexture=void 0!==c?c:!0;this.identityMatrix=new THREE.Matrix4;a=a||[];this.bones=a.slice(0);this.useVertexTexture?(a=Math.sqrt(4*this.bones.length),a=THREE.Math.nextPowerOfTwo(Math.ceil(a)),this.boneTextureHeight=this.boneTextureWidth=a=Math.max(a,4),this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4),this.boneTexture=new THREE.DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,THREE.RGBAFormat,THREE.FloatType)):
+this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton bonInverses is the wrong length."),this.boneInverses=[],b=0,a=this.bones.length;b<a;b++)this.boneInverses.push(new THREE.Matrix4)};
+THREE.Skeleton.prototype.calculateInverses=function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new THREE.Matrix4;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}};
+THREE.Skeleton.prototype.pose=function(){for(var a,b=0,c=this.bones.length;b<c;b++)(a=this.bones[b])&&a.matrixWorld.getInverse(this.boneInverses[b]);b=0;for(c=this.bones.length;b<c;b++)if(a=this.bones[b])a.parent?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)};
+THREE.Skeleton.prototype.update=function(){var a=new THREE.Matrix4;return function(){for(var b=0,c=this.bones.length;b<c;b++)a.multiplyMatrices(this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix,this.boneInverses[b]),a.flattenToArrayOffset(this.boneMatrices,16*b);this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)}}();THREE.Skeleton.prototype.clone=function(){return new THREE.Skeleton(this.bones,this.boneInverses,this.useVertexTexture)};
+THREE.SkinnedMesh=function(a,b,c){THREE.Mesh.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new THREE.Matrix4;this.bindMatrixInverse=new THREE.Matrix4;a=[];if(this.geometry&&void 0!==this.geometry.bones){for(var d,e=0,g=this.geometry.bones.length;e<g;++e)d=this.geometry.bones[e],b=new THREE.Bone(this),a.push(b),b.name=d.name,b.position.fromArray(d.pos),b.quaternion.fromArray(d.rotq),void 0!==d.scl&&b.scale.fromArray(d.scl);e=0;for(g=this.geometry.bones.length;e<g;++e)d=
+this.geometry.bones[e],-1!==d.parent&&null!==d.parent?a[d.parent].add(a[e]):this.add(a[e])}this.normalizeSkinWeights();this.updateMatrixWorld(!0);this.bind(new THREE.Skeleton(a,void 0,c),this.matrixWorld)};THREE.SkinnedMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.SkinnedMesh.prototype.constructor=THREE.SkinnedMesh;
+THREE.SkinnedMesh.prototype.bind=function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)};THREE.SkinnedMesh.prototype.pose=function(){this.skeleton.pose()};
+THREE.SkinnedMesh.prototype.normalizeSkinWeights=function(){if(this.geometry instanceof THREE.Geometry)for(var a=0;a<this.geometry.skinIndices.length;a++){var b=this.geometry.skinWeights[a],c=1/b.lengthManhattan();Infinity!==c?b.multiplyScalar(c):b.set(1)}};
+THREE.SkinnedMesh.prototype.updateMatrixWorld=function(a){THREE.Mesh.prototype.updateMatrixWorld.call(this,!0);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh unrecognized bindMode: "+this.bindMode)};THREE.SkinnedMesh.prototype.clone=function(){return(new this.constructor(this.geometry,this.material,this.useVertexTexture)).copy(this)};
+THREE.LOD=function(){THREE.Object3D.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]},objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}})};THREE.LOD.prototype=Object.create(THREE.Object3D.prototype);THREE.LOD.prototype.constructor=THREE.LOD;
+THREE.LOD.prototype.addLevel=function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)};THREE.LOD.prototype.getObjectForDistance=function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object};
+THREE.LOD.prototype.raycast=function(){var a=new THREE.Vector3;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}();
+THREE.LOD.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,g=d.length;e<g;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;e<g;e++)d[e].object.visible=!1}}}();
+THREE.LOD.prototype.copy=function(a){THREE.Object3D.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this};THREE.LOD.prototype.toJSON=function(a){a=THREE.Object3D.prototype.toJSON.call(this,a);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a};
+THREE.Sprite=function(){var a=new Uint16Array([0,1,2,0,2,3]),b=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),c=new Float32Array([0,0,1,0,1,1,0,1]),d=new THREE.BufferGeometry;d.setIndex(new THREE.BufferAttribute(a,1));d.addAttribute("position",new THREE.BufferAttribute(b,3));d.addAttribute("uv",new THREE.BufferAttribute(c,2));return function(a){THREE.Object3D.call(this);this.type="Sprite";this.geometry=d;this.material=void 0!==a?a:new THREE.SpriteMaterial}}();THREE.Sprite.prototype=Object.create(THREE.Object3D.prototype);
+THREE.Sprite.prototype.constructor=THREE.Sprite;THREE.Sprite.prototype.raycast=function(){var a=new THREE.Vector3;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.distanceSqToPoint(a);d>this.scale.x*this.scale.y||c.push({distance:Math.sqrt(d),point:this.position,face:null,object:this})}}();THREE.Sprite.prototype.clone=function(){return(new this.constructor(this.material)).copy(this)};THREE.Particle=THREE.Sprite;
+THREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare.prototype.constructor=THREE.LensFlare;
+THREE.LensFlare.prototype.add=function(a,b,c,d,e,g){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===g&&(g=1);void 0===e&&(e=new THREE.Color(16777215));void 0===d&&(d=THREE.NormalBlending);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:0,opacity:g,color:e,blending:d})};
+THREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;a<b;a++)c=this.lensFlares[a],c.x=this.positionScreen.x+d*c.distance,c.y=this.positionScreen.y+e*c.distance,c.wantedRotation=c.x*Math.PI*.25,c.rotation+=.25*(c.wantedRotation-c.rotation)};
+THREE.LensFlare.prototype.copy=function(a){THREE.Object3D.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=a.customUpdateCallback;for(var b=0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this};THREE.Scene=function(){THREE.Object3D.call(this);this.type="Scene";this.overrideMaterial=this.fog=null;this.autoUpdate=!0};THREE.Scene.prototype=Object.create(THREE.Object3D.prototype);THREE.Scene.prototype.constructor=THREE.Scene;
+THREE.Scene.prototype.copy=function(a){THREE.Object3D.prototype.copy.call(this,a);null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this};THREE.Fog=function(a,b,c){this.name="";this.color=new THREE.Color(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3};THREE.Fog.prototype.clone=function(){return new THREE.Fog(this.color.getHex(),this.near,this.far)};
+THREE.FogExp2=function(a,b){this.name="";this.color=new THREE.Color(a);this.density=void 0!==b?b:2.5E-4};THREE.FogExp2.prototype.clone=function(){return new THREE.FogExp2(this.color.getHex(),this.density)};THREE.ShaderChunk={};THREE.ShaderChunk.alphamap_fragment="#ifdef USE_ALPHAMAP\n\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n\n#endif\n";THREE.ShaderChunk.alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\n\tuniform sampler2D alphaMap;\n\n#endif\n";THREE.ShaderChunk.alphatest_fragment="#ifdef ALPHATEST\n\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n\n#endif\n";
+THREE.ShaderChunk.aomap_fragment="#ifdef USE_AOMAP\n\n\ttotalAmbientLight *= ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\n#endif\n";THREE.ShaderChunk.aomap_pars_fragment="#ifdef USE_AOMAP\n\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\n#endif";THREE.ShaderChunk.begin_vertex="\nvec3 transformed = vec3( position );\n";THREE.ShaderChunk.beginnormal_vertex="\nvec3 objectNormal = vec3( normal );\n";THREE.ShaderChunk.bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\n\n\n\tvec2 dHdxy_fwd() {\n\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\n\t\treturn vec2( dBx, dBy );\n\n\t}\n\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\n\t}\n\n#endif\n";
+THREE.ShaderChunk.color_fragment="#ifdef USE_COLOR\n\n\tdiffuseColor.rgb *= vColor;\n\n#endif";THREE.ShaderChunk.color_pars_fragment="#ifdef USE_COLOR\n\n\tvarying vec3 vColor;\n\n#endif\n";THREE.ShaderChunk.color_pars_vertex="#ifdef USE_COLOR\n\n\tvarying vec3 vColor;\n\n#endif";THREE.ShaderChunk.color_vertex="#ifdef USE_COLOR\n\n\tvColor.xyz = color.xyz;\n\n#endif";THREE.ShaderChunk.common="#define PI 3.14159\n#define PI2 6.28318\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\n\nvec3 transformDirection( in vec3 normal, in mat4 matrix ) {\n\n\treturn normalize( ( matrix * vec4( normal, 0.0 ) ).xyz );\n\n}\n\nvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n\n\treturn normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n\n}\n\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\n\treturn - distance * planeNormal + point;\n\n}\n\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n\n}\n\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n\n}\n\nfloat calcLightAttenuation( float lightDistance, float cutoffDistance, float decayExponent ) {\n\n\tif ( decayExponent > 0.0 ) {\n\n\t  return pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\n\t}\n\n\treturn 1.0;\n\n}\n\nvec3 F_Schlick( in vec3 specularColor, in float dotLH ) {\n\n\n\tfloat fresnel = exp2( ( -5.55437 * dotLH - 6.98316 ) * dotLH );\n\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n\n}\n\nfloat G_BlinnPhong_Implicit( /* in float dotNL, in float dotNV */ ) {\n\n\n\treturn 0.25;\n\n}\n\nfloat D_BlinnPhong( in float shininess, in float dotNH ) {\n\n\n\treturn ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n\n}\n\nvec3 BRDF_BlinnPhong( in vec3 specularColor, in float shininess, in vec3 normal, in vec3 lightDir, in vec3 viewDir ) {\n\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( lightDir, halfDir ) );\n\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\n\tfloat G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );\n\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\n\treturn F * G * D;\n\n}\n\nvec3 inputToLinear( in vec3 a ) {\n\n\t#ifdef GAMMA_INPUT\n\n\t\treturn pow( a, vec3( float( GAMMA_FACTOR ) ) );\n\n\t#else\n\n\t\treturn a;\n\n\t#endif\n\n}\n\nvec3 linearToOutput( in vec3 a ) {\n\n\t#ifdef GAMMA_OUTPUT\n\n\t\treturn pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );\n\n\t#else\n\n\t\treturn a;\n\n\t#endif\n\n}\n";
+THREE.ShaderChunk.defaultnormal_vertex="#ifdef FLIP_SIDED\n\n\tobjectNormal = -objectNormal;\n\n#endif\n\nvec3 transformedNormal = normalMatrix * objectNormal;\n";THREE.ShaderChunk.displacementmap_vertex="#ifdef USE_DISPLACEMENTMAP\n\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n\n#endif\n";THREE.ShaderChunk.displacementmap_pars_vertex="#ifdef USE_DISPLACEMENTMAP\n\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n\n#endif\n";
+THREE.ShaderChunk.emissivemap_fragment="#ifdef USE_EMISSIVEMAP\n\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\n\temissiveColor.rgb = inputToLinear( emissiveColor.rgb );\n\n\ttotalEmissiveLight *= emissiveColor.rgb;\n\n#endif\n";THREE.ShaderChunk.emissivemap_pars_fragment="#ifdef USE_EMISSIVEMAP\n\n\tuniform sampler2D emissiveMap;\n\n#endif\n";THREE.ShaderChunk.envmap_fragment="#ifdef USE_ENVMAP\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\n\t\t#else\n\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t\t#endif\n\n\t#else\n\n\t\tvec3 reflectVec = vReflect;\n\n\t#endif\n\n\t#ifdef DOUBLE_SIDED\n\t\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#else\n\t\tfloat flipNormal = 1.0;\n\t#endif\n\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize((viewMatrix * vec4( reflectVec, 0.0 )).xyz + vec3(0.0,0.0,1.0));\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#endif\n\n\tenvColor.xyz = inputToLinear( envColor.xyz );\n\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\n\t#endif\n\n#endif\n";
+THREE.ShaderChunk.envmap_pars_fragment="#ifdef USE_ENVMAP\n\n\tuniform float reflectivity;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\n\t\tuniform float refractionRatio;\n\n\t#else\n\n\t\tvarying vec3 vReflect;\n\n\t#endif\n\n#endif\n";THREE.ShaderChunk.envmap_pars_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n\tvarying vec3 vReflect;\n\n\tuniform float refractionRatio;\n\n#endif\n";
+THREE.ShaderChunk.envmap_vertex="#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP ) && ! defined( PHONG )\n\n\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\n\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\n\t#ifdef ENVMAP_MODE_REFLECTION\n\n\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\n\t#else\n\n\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\n\t#endif\n\n#endif\n";
+THREE.ShaderChunk.fog_fragment="#ifdef USE_FOG\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\n\t#else\n\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\n\t#endif\n\n\t#ifdef FOG_EXP2\n\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\n\t#else\n\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\n\t#endif\n\t\n\toutgoingLight = mix( outgoingLight, fogColor, fogFactor );\n\n#endif";
+THREE.ShaderChunk.fog_pars_fragment="#ifdef USE_FOG\n\n\tuniform vec3 fogColor;\n\n\t#ifdef FOG_EXP2\n\n\t\tuniform float fogDensity;\n\n\t#else\n\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n\n#endif";THREE.ShaderChunk.hemilight_fragment="#if MAX_HEMI_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n\t\tvec3 lightDir = hemisphereLightDirection[ i ];\n\n\t\tfloat dotProduct = dot( normal, lightDir );\n\n\t\tfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n\t\tvec3 lightColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n\t\ttotalAmbientLight += lightColor;\n\n\t}\n\n#endif\n\n";
+THREE.ShaderChunk.lightmap_fragment="#ifdef USE_LIGHTMAP\n\n\ttotalAmbientLight += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\n#endif\n";THREE.ShaderChunk.lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n\n#endif";THREE.ShaderChunk.lights_lambert_pars_vertex="#if MAX_DIR_LIGHTS > 0\n\n\tuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n\tuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n\tuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n\tuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n";
+THREE.ShaderChunk.lights_lambert_vertex="vLightFront = vec3( 0.0 );\n\n#ifdef DOUBLE_SIDED\n\n\tvLightBack = vec3( 0.0 );\n\n#endif\n\nvec3 normal = normalize( transformedNormal );\n\n#if MAX_POINT_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n\t\tvec3 lightColor = pointLightColor[ i ];\n\n\t\tvec3 lVector = pointLightPosition[ i ] - mvPosition.xyz;\n\t\tvec3 lightDir = normalize( lVector );\n\n\n\t\tfloat attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n\t\tfloat dotProduct = dot( normal, lightDir );\n\n\t\tvLightFront += lightColor * attenuation * saturate( dotProduct );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n\t\t#endif\n\n\t}\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n\t\tvec3 lightColor = spotLightColor[ i ];\n\n\t\tvec3 lightPosition = spotLightPosition[ i ];\n\t\tvec3 lVector = lightPosition - mvPosition.xyz;\n\t\tvec3 lightDir = normalize( lVector );\n\n\t\tfloat spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n\t\tif ( spotEffect > spotLightAngleCos[ i ] ) {\n\n\t\t\tspotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n\t\t\tfloat attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n\t\t\tattenuation *= spotEffect;\n\n\n\t\t\tfloat dotProduct = dot( normal, lightDir );\n\n\t\t\tvLightFront += lightColor * attenuation * saturate( dotProduct );\n\n\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\tvLightBack += lightColor * attenuation * saturate( - dotProduct );\n\n\t\t\t#endif\n\n\t\t}\n\n\t}\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n\t\tvec3 lightColor = directionalLightColor[ i ];\n\n\t\tvec3 lightDir = directionalLightDirection[ i ];\n\n\n\t\tfloat dotProduct = dot( normal, lightDir );\n\n\t\tvLightFront += lightColor * saturate( dotProduct );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tvLightBack += lightColor * saturate( - dotProduct );\n\n\t\t#endif\n\n\t}\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\n\n\t\tvec3 lightDir = hemisphereLightDirection[ i ];\n\n\n\t\tfloat dotProduct = dot( normal, lightDir );\n\n\t\tfloat hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\n\n\t\tvLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\n\n\t\t#ifdef DOUBLE_SIDED\n\n\t\t\tfloat hemiDiffuseWeightBack = - 0.5 * dotProduct + 0.5;\n\n\t\t\tvLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\n\n\t\t#endif\n\n\t}\n\n#endif\n";
+THREE.ShaderChunk.lights_phong_fragment="vec3 viewDir = normalize( vViewPosition );\n\nvec3 totalDiffuseLight = vec3( 0.0 );\nvec3 totalSpecularLight = vec3( 0.0 );\n\n#if MAX_POINT_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n\n\t\tvec3 lightColor = pointLightColor[ i ];\n\n\t\tvec3 lightPosition = pointLightPosition[ i ];\n\t\tvec3 lVector = lightPosition + vViewPosition.xyz;\n\t\tvec3 lightDir = normalize( lVector );\n\n\n\t\tfloat attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecay[ i ] );\n\n\n\t\tfloat cosineTerm = saturate( dot( normal, lightDir ) );\n\n\t\ttotalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n\t\tvec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n\t\ttotalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n\n\t}\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n\n\t\tvec3 lightColor = spotLightColor[ i ];\n\n\t\tvec3 lightPosition = spotLightPosition[ i ];\n\t\tvec3 lVector = lightPosition + vViewPosition.xyz;\n\t\tvec3 lightDir = normalize( lVector );\n\n\t\tfloat spotEffect = dot( spotLightDirection[ i ], lightDir );\n\n\t\tif ( spotEffect > spotLightAngleCos[ i ] ) {\n\n\t\t\tspotEffect = saturate( pow( saturate( spotEffect ), spotLightExponent[ i ] ) );\n\n\n\t\t\tfloat attenuation = calcLightAttenuation( length( lVector ), spotLightDistance[ i ], spotLightDecay[ i ] );\n\n\t\t\tattenuation *= spotEffect;\n\n\n\t\t\tfloat cosineTerm = saturate( dot( normal, lightDir ) );\n\n\t\t\ttotalDiffuseLight += lightColor * attenuation * cosineTerm;\n\n\n\t\t\tvec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n\t\t\ttotalSpecularLight += brdf * specularStrength * lightColor * attenuation * cosineTerm;\n\n\t\t}\n\n\t}\n\n#endif\n\n#if MAX_DIR_LIGHTS > 0\n\n\tfor ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\n\n\t\tvec3 lightColor = directionalLightColor[ i ];\n\n\t\tvec3 lightDir = directionalLightDirection[ i ];\n\n\n\t\tfloat cosineTerm = saturate( dot( normal, lightDir ) );\n\n\t\ttotalDiffuseLight += lightColor * cosineTerm;\n\n\n\t\tvec3 brdf = BRDF_BlinnPhong( specular, shininess, normal, lightDir, viewDir );\n\n\t\ttotalSpecularLight += brdf * specularStrength * lightColor * cosineTerm;\n\n\t}\n\n#endif\n";
+THREE.ShaderChunk.lights_phong_pars_fragment="uniform vec3 ambientLightColor;\n\n#if MAX_DIR_LIGHTS > 0\n\n\tuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\n\tuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n\n#endif\n\n#if MAX_HEMI_LIGHTS > 0\n\n\tuniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\n\tuniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n\tuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n\n\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n\tuniform float pointLightDecay[ MAX_POINT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0\n\n\tuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\n\tuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n\tuniform float spotLightDecay[ MAX_SPOT_LIGHTS ];\n\n#endif\n\n#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n\nvarying vec3 vViewPosition;\n\n#ifndef FLAT_SHADED\n\n\tvarying vec3 vNormal;\n\n#endif\n";
+THREE.ShaderChunk.lights_phong_pars_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n\tvarying vec3 vWorldPosition;\n\n#endif\n\n#if MAX_POINT_LIGHTS > 0\n\n\tuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\n\n#endif\n";THREE.ShaderChunk.lights_phong_vertex="#if MAX_SPOT_LIGHTS > 0 || defined( USE_ENVMAP )\n\n\tvWorldPosition = worldPosition.xyz;\n\n#endif\n";THREE.ShaderChunk.linear_to_gamma_fragment="\n\toutgoingLight = linearToOutput( outgoingLight );\n";
+THREE.ShaderChunk.logdepthbuf_fragment="#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n\n#endif";THREE.ShaderChunk.logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\n\tuniform float logDepthBufFC;\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvarying float vFragDepth;\n\n\t#endif\n\n#endif\n";THREE.ShaderChunk.logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvarying float vFragDepth;\n\n\t#endif\n\n\tuniform float logDepthBufFC;\n\n#endif";
+THREE.ShaderChunk.logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\n#else\n\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\n\t#endif\n\n#endif";THREE.ShaderChunk.map_fragment="#ifdef USE_MAP\n\n\tvec4 texelColor = texture2D( map, vUv );\n\n\ttexelColor.xyz = inputToLinear( texelColor.xyz );\n\n\tdiffuseColor *= texelColor;\n\n#endif\n";
+THREE.ShaderChunk.map_pars_fragment="#ifdef USE_MAP\n\n\tuniform sampler2D map;\n\n#endif";THREE.ShaderChunk.map_particle_fragment="#ifdef USE_MAP\n\n\tdiffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\n#endif\n";THREE.ShaderChunk.map_particle_pars_fragment="#ifdef USE_MAP\n\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n\n#endif\n";THREE.ShaderChunk.morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n\n#endif\n";
+THREE.ShaderChunk.morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\n\t#ifndef USE_MORPHNORMALS\n\n\tuniform float morphTargetInfluences[ 8 ];\n\n\t#else\n\n\tuniform float morphTargetInfluences[ 4 ];\n\n\t#endif\n\n#endif";THREE.ShaderChunk.morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\n\t#ifndef USE_MORPHNORMALS\n\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\n\t#endif\n\n#endif\n";
+THREE.ShaderChunk.normal_phong_fragment="#ifndef FLAT_SHADED\n\n\tvec3 normal = normalize( vNormal );\n\n\t#ifdef DOUBLE_SIDED\n\n\t\tnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n\n\t#endif\n\n#else\n\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n\n#endif\n\n#ifdef USE_NORMALMAP\n\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\n#elif defined( USE_BUMPMAP )\n\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n\n#endif\n\n";
+THREE.ShaderChunk.normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\n\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\n\t}\n\n#endif\n";
+THREE.ShaderChunk.project_vertex="#ifdef USE_SKINNING\n\n\tvec4 mvPosition = modelViewMatrix * skinned;\n\n#else\n\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\n#endif\n\ngl_Position = projectionMatrix * mvPosition;\n";THREE.ShaderChunk.shadowmap_fragment="#ifdef USE_SHADOWMAP\n\n\tfor ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n\t\tfloat texelSizeY =  1.0 / shadowMapSize[ i ].y;\n\n\t\tfloat shadow = 0.0;\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n\t\tbool isPointLight = shadowDarkness[ i ] < 0.0;\n\n\t\tif ( isPointLight ) {\n\n\t\t\tfloat realShadowDarkness = abs( shadowDarkness[ i ] );\n\n\t\t\tvec3 lightToPosition = vShadowCoord[ i ].xyz;\n\n\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat dp = length( lightToPosition );\n\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tconst float Dr = 1.25;\n\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tconst float Dr = 2.25;\n\t#endif\n\n\t\t\tfloat os = Dr *  2.0 * texelSizeY;\n\n\t\t\tconst vec3 Gsd = vec3( - 1, 0, 1 );\n\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xxy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xzy * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.zyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.xyx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxz * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yxx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D + Gsd.yzx * os, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\t\t\tshadow *= realShadowDarkness * ( 1.0 / 21.0 );\n\n\t#else \n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat dp = length( lightToPosition );\n\n\t\t\tadjustShadowValue1K( dp, texture2D( shadowMap[ i ], cubeToUV( bd3D, texelSizeY ) ), shadowBias[ i ], shadow );\n\n\t\t\tshadow *= realShadowDarkness;\n\n\t#endif\n\n\t\t} else {\n\n#endif \n\t\t\tfloat texelSizeX =  1.0 / shadowMapSize[ i ].x;\n\n\t\t\tvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\n\n\n\t\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\t\tbool inFrustum = all( inFrustumVec );\n\n\t\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\n\t\t\tbool frustumTest = all( frustumTestVec );\n\n\t\t\tif ( frustumTest ) {\n\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\n\n\t\t\t\t/*\n\t\t\t\t\tfor ( float y = -1.25; y <= 1.25; y += 1.25 )\n\t\t\t\t\t\tfor ( float x = -1.25; x <= 1.25; x += 1.25 ) {\n\t\t\t\t\t\t\tvec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\n\t\t\t\t\t\t\tfloat fDepth = unpackDepth( rgbaDepth );\n\t\t\t\t\t\t\tif ( fDepth < shadowCoord.z )\n\t\t\t\t\t\t\t\tshadow += 1.0;\n\t\t\t\t\t}\n\t\t\t\t\tshadow /= 9.0;\n\t\t\t\t*/\n\n\t\t\t\tshadowCoord.z += shadowBias[ i ];\n\n\t\t\t\tconst float ShadowDelta = 1.0 / 9.0;\n\n\t\t\t\tfloat xPixelOffset = texelSizeX;\n\t\t\t\tfloat yPixelOffset = texelSizeY;\n\n\t\t\t\tfloat dx0 = - 1.25 * xPixelOffset;\n\t\t\t\tfloat dy0 = - 1.25 * yPixelOffset;\n\t\t\t\tfloat dx1 = 1.25 * xPixelOffset;\n\t\t\t\tfloat dy1 = 1.25 * yPixelOffset;\n\n\t\t\t\tfloat fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\t\t\t\tif ( fDepth < shadowCoord.z ) shadow += ShadowDelta;\n\n\t\t\t\tshadow *= shadowDarkness[ i ];\n\n\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\n\n\t\t\t\tshadowCoord.z += shadowBias[ i ];\n\n\t\t\t\tfloat xPixelOffset = texelSizeX;\n\t\t\t\tfloat yPixelOffset = texelSizeY;\n\n\t\t\t\tfloat dx0 = - 1.0 * xPixelOffset;\n\t\t\t\tfloat dy0 = - 1.0 * yPixelOffset;\n\t\t\t\tfloat dx1 = 1.0 * xPixelOffset;\n\t\t\t\tfloat dy1 = 1.0 * yPixelOffset;\n\n\t\t\t\tmat3 shadowKernel;\n\t\t\t\tmat3 depthKernel;\n\n\t\t\t\tdepthKernel[ 0 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\n\t\t\t\tdepthKernel[ 0 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\n\t\t\t\tdepthKernel[ 0 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\n\t\t\t\tdepthKernel[ 1 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\n\t\t\t\tdepthKernel[ 1 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\n\t\t\t\tdepthKernel[ 1 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\n\t\t\t\tdepthKernel[ 2 ][ 0 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\n\t\t\t\tdepthKernel[ 2 ][ 1 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\n\t\t\t\tdepthKernel[ 2 ][ 2 ] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\n\n\t\t\t\tvec3 shadowZ = vec3( shadowCoord.z );\n\t\t\t\tshadowKernel[ 0 ] = vec3( lessThan( depthKernel[ 0 ], shadowZ ) );\n\t\t\t\tshadowKernel[ 0 ] *= vec3( 0.25 );\n\n\t\t\t\tshadowKernel[ 1 ] = vec3( lessThan( depthKernel[ 1 ], shadowZ ) );\n\t\t\t\tshadowKernel[ 1 ] *= vec3( 0.25 );\n\n\t\t\t\tshadowKernel[ 2 ] = vec3( lessThan( depthKernel[ 2 ], shadowZ ) );\n\t\t\t\tshadowKernel[ 2 ] *= vec3( 0.25 );\n\n\t\t\t\tvec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[ i ].xy );\n\n\t\t\t\tshadowKernel[ 0 ] = mix( shadowKernel[ 1 ], shadowKernel[ 0 ], fractionalCoord.x );\n\t\t\t\tshadowKernel[ 1 ] = mix( shadowKernel[ 2 ], shadowKernel[ 1 ], fractionalCoord.x );\n\n\t\t\t\tvec4 shadowValues;\n\t\t\t\tshadowValues.x = mix( shadowKernel[ 0 ][ 1 ], shadowKernel[ 0 ][ 0 ], fractionalCoord.y );\n\t\t\t\tshadowValues.y = mix( shadowKernel[ 0 ][ 2 ], shadowKernel[ 0 ][ 1 ], fractionalCoord.y );\n\t\t\t\tshadowValues.z = mix( shadowKernel[ 1 ][ 1 ], shadowKernel[ 1 ][ 0 ], fractionalCoord.y );\n\t\t\t\tshadowValues.w = mix( shadowKernel[ 1 ][ 2 ], shadowKernel[ 1 ][ 1 ], fractionalCoord.y );\n\n\t\t\t\tshadow = dot( shadowValues, vec4( 1.0 ) ) * shadowDarkness[ i ];\n\n\t#else \n\t\t\t\tshadowCoord.z += shadowBias[ i ];\n\n\t\t\t\tvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\n\t\t\t\tfloat fDepth = unpackDepth( rgbaDepth );\n\n\t\t\t\tif ( fDepth < shadowCoord.z )\n\t\t\t\t\tshadow = shadowDarkness[ i ];\n\n\t#endif\n\n\t\t\t}\n\n#ifdef SHADOWMAP_DEBUG\n\n\t\t\tif ( inFrustum ) {\n\n\t\t\t\tif ( i == 0 ) {\n\n\t\t\t\t\toutgoingLight *= vec3( 1.0, 0.5, 0.0 );\n\n\t\t\t\t} else if ( i == 1 ) {\n\n\t\t\t\t\toutgoingLight *= vec3( 0.0, 1.0, 0.8 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\toutgoingLight *= vec3( 0.0, 0.5, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n#endif\n\n#if defined( POINT_LIGHT_SHADOWS )\n\n\t\t}\n\n#endif\n\n\t\tshadowMask = shadowMask * vec3( 1.0 - shadow );\n\n\t}\n\n#endif\n";
+THREE.ShaderChunk.shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\n\tuniform sampler2D shadowMap[ MAX_SHADOWS ];\n\tuniform vec2 shadowMapSize[ MAX_SHADOWS ];\n\n\tuniform float shadowDarkness[ MAX_SHADOWS ];\n\tuniform float shadowBias[ MAX_SHADOWS ];\n\n\tvarying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n\tfloat unpackDepth( const in vec4 rgba_depth ) {\n\n\t\tconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n\t\tfloat depth = dot( rgba_depth, bit_shift );\n\t\treturn depth;\n\n\t}\n\n\t#if defined(POINT_LIGHT_SHADOWS)\n\n\n\t\tvoid adjustShadowValue1K( const float testDepth, const vec4 textureData, const float bias, inout float shadowValue ) {\n\n\t\t\tconst vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n\t\t\tif ( testDepth >= dot( textureData, bitSh ) * 1000.0 + bias )\n\t\t\t\tshadowValue += 1.0;\n\n\t\t}\n\n\n\t\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\n\n\t\t\tvec3 absV = abs( v );\n\n\n\t\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\t\tabsV *= scaleToCube;\n\n\n\t\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\n\n\n\t\t\tvec2 planar = v.xy;\n\n\t\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\t\tfloat almostOne = 1.0 - almostATexel;\n\n\t\t\tif ( absV.z >= almostOne ) {\n\n\t\t\t\tif ( v.z > 0.0 )\n\t\t\t\t\tplanar.x = 4.0 - v.x;\n\n\t\t\t} else if ( absV.x >= almostOne ) {\n\n\t\t\t\tfloat signX = sign( v.x );\n\t\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\n\t\t\t} else if ( absV.y >= almostOne ) {\n\n\t\t\t\tfloat signY = sign( v.y );\n\t\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\t\tplanar.y = v.z * signY - 2.0;\n\n\t\t\t}\n\n\n\t\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\n\t\t}\n\n\t#endif\n\n#endif\n";
+THREE.ShaderChunk.shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\n\tuniform float shadowDarkness[ MAX_SHADOWS ];\n\tuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n\tvarying vec4 vShadowCoord[ MAX_SHADOWS ];\n\n#endif";THREE.ShaderChunk.shadowmap_vertex="#ifdef USE_SHADOWMAP\n\n\tfor ( int i = 0; i < MAX_SHADOWS; i ++ ) {\n\n\t\t\tvShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\n\n\t}\n\n#endif";THREE.ShaderChunk.skinbase_vertex="#ifdef USE_SKINNING\n\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n\n#endif";
+THREE.ShaderChunk.skinning_pars_vertex="#ifdef USE_SKINNING\n\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\n\t#ifdef BONE_TEXTURE\n\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\n\t\t\ty = dy * ( y + 0.5 );\n\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\n\t\t\treturn bone;\n\n\t\t}\n\n\t#else\n\n\t\tuniform mat4 boneGlobalMatrices[ MAX_BONES ];\n\n\t\tmat4 getBoneMatrix( const in float i ) {\n\n\t\t\tmat4 bone = boneGlobalMatrices[ int(i) ];\n\t\t\treturn bone;\n\n\t\t}\n\n\t#endif\n\n#endif\n";
+THREE.ShaderChunk.skinning_vertex="#ifdef USE_SKINNING\n\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned  = bindMatrixInverse * skinned;\n\n#endif\n";THREE.ShaderChunk.skinnormal_vertex="#ifdef USE_SKINNING\n\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\n#endif\n";
+THREE.ShaderChunk.specularmap_fragment="float specularStrength;\n\n#ifdef USE_SPECULARMAP\n\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n\n#else\n\n\tspecularStrength = 1.0;\n\n#endif";THREE.ShaderChunk.specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\n\tuniform sampler2D specularMap;\n\n#endif";THREE.ShaderChunk.uv2_pars_fragment="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvarying vec2 vUv2;\n\n#endif";
+THREE.ShaderChunk.uv2_pars_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\n#endif";THREE.ShaderChunk.uv2_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\n\tvUv2 = uv2;\n\n#endif";THREE.ShaderChunk.uv_pars_fragment="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n\tvarying vec2 vUv;\n\n#endif";
+THREE.ShaderChunk.uv_pars_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n\n#endif\n";THREE.ShaderChunk.uv_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP )\n\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n\n#endif";
+THREE.ShaderChunk.worldpos_vertex="#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\n\t#ifdef USE_SKINNING\n\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\n\t#else\n\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\n\t#endif\n\n#endif\n";
+THREE.UniformsUtils={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e instanceof THREE.Color||e instanceof THREE.Vector2||e instanceof THREE.Vector3||e instanceof THREE.Vector4||e instanceof THREE.Matrix3||e instanceof THREE.Matrix4||e instanceof THREE.Texture?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}};
+THREE.UniformsLib={common:{diffuse:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},map:{type:"t",value:null},offsetRepeat:{type:"v4",value:new THREE.Vector4(0,0,1,1)},specularMap:{type:"t",value:null},alphaMap:{type:"t",value:null},envMap:{type:"t",value:null},flipEnvMap:{type:"f",value:-1},reflectivity:{type:"f",value:1},refractionRatio:{type:"f",value:.98}},aomap:{aoMap:{type:"t",value:null},aoMapIntensity:{type:"f",value:1}},lightmap:{lightMap:{type:"t",value:null},lightMapIntensity:{type:"f",
+value:1}},emissivemap:{emissiveMap:{type:"t",value:null}},bumpmap:{bumpMap:{type:"t",value:null},bumpScale:{type:"f",value:1}},normalmap:{normalMap:{type:"t",value:null},normalScale:{type:"v2",value:new THREE.Vector2(1,1)}},displacementmap:{displacementMap:{type:"t",value:null},displacementScale:{type:"f",value:1},displacementBias:{type:"f",value:0}},fog:{fogDensity:{type:"f",value:2.5E-4},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},fogColor:{type:"c",value:new THREE.Color(16777215)}},
+lights:{ambientLightColor:{type:"fv",value:[]},directionalLightDirection:{type:"fv",value:[]},directionalLightColor:{type:"fv",value:[]},hemisphereLightDirection:{type:"fv",value:[]},hemisphereLightSkyColor:{type:"fv",value:[]},hemisphereLightGroundColor:{type:"fv",value:[]},pointLightColor:{type:"fv",value:[]},pointLightPosition:{type:"fv",value:[]},pointLightDistance:{type:"fv1",value:[]},pointLightDecay:{type:"fv1",value:[]},spotLightColor:{type:"fv",value:[]},spotLightPosition:{type:"fv",value:[]},
+spotLightDirection:{type:"fv",value:[]},spotLightDistance:{type:"fv1",value:[]},spotLightAngleCos:{type:"fv1",value:[]},spotLightExponent:{type:"fv1",value:[]},spotLightDecay:{type:"fv1",value:[]}},points:{psColor:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},size:{type:"f",value:1},scale:{type:"f",value:1},map:{type:"t",value:null},offsetRepeat:{type:"v4",value:new THREE.Vector4(0,0,1,1)},fogDensity:{type:"f",value:2.5E-4},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2E3},
+fogColor:{type:"c",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:"tv",value:[]},shadowMapSize:{type:"v2v",value:[]},shadowBias:{type:"fv1",value:[]},shadowDarkness:{type:"fv1",value:[]},shadowMatrix:{type:"m4v",value:[]}}};
+THREE.ShaderLib={basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.aomap,THREE.UniformsLib.fog,THREE.UniformsLib.shadowmap]),vertexShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.uv_pars_vertex,THREE.ShaderChunk.uv2_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,
+"void main() {",THREE.ShaderChunk.uv_vertex,THREE.ShaderChunk.uv2_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.skinbase_vertex,"\t#ifdef USE_ENVMAP",THREE.ShaderChunk.beginnormal_vertex,THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,"\t#endif",THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,THREE.ShaderChunk.worldpos_vertex,
+THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.shadowmap_vertex,"}"].join("\n"),fragmentShader:["uniform vec3 diffuse;\nuniform float opacity;",THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.uv_pars_fragment,THREE.ShaderChunk.uv2_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.alphamap_pars_fragment,THREE.ShaderChunk.aomap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,
+THREE.ShaderChunk.specularmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tvec3 totalAmbientLight = vec3( 1.0 );\n\tvec3 shadowMask = vec3( 1.0 );",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.alphamap_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,THREE.ShaderChunk.aomap_fragment,
+THREE.ShaderChunk.shadowmap_fragment,"\toutgoingLight = diffuseColor.rgb * totalAmbientLight * shadowMask;",THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,"\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{emissive:{type:"c",value:new THREE.Color(0)}}]),vertexShader:["#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif",
+THREE.ShaderChunk.common,THREE.ShaderChunk.uv_pars_vertex,THREE.ShaderChunk.uv2_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_lambert_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.uv_vertex,THREE.ShaderChunk.uv2_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.beginnormal_vertex,
+THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.lights_lambert_vertex,THREE.ShaderChunk.shadowmap_vertex,"}"].join("\n"),fragmentShader:["uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nuniform vec3 ambientLightColor;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif",
+THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.uv_pars_fragment,THREE.ShaderChunk.uv2_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.alphamap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tvec3 totalAmbientLight = ambientLightColor;\n\tvec3 shadowMask = vec3( 1.0 );",
+THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.alphamap_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.specularmap_fragment,THREE.ShaderChunk.shadowmap_fragment,"\t#ifdef DOUBLE_SIDED\n\t\tif ( gl_FrontFacing )\n\t\t\toutgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;\n\t\telse\n\t\t\toutgoingLight += diffuseColor.rgb * ( vLightBack * shadowMask + totalAmbientLight ) + emissive;\n\t#else\n\t\toutgoingLight += diffuseColor.rgb * ( vLightFront * shadowMask + totalAmbientLight ) + emissive;\n\t#endif",
+THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,"\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.aomap,THREE.UniformsLib.lightmap,THREE.UniformsLib.emissivemap,THREE.UniformsLib.bumpmap,THREE.UniformsLib.normalmap,THREE.UniformsLib.displacementmap,THREE.UniformsLib.fog,THREE.UniformsLib.lights,THREE.UniformsLib.shadowmap,{emissive:{type:"c",
+value:new THREE.Color(0)},specular:{type:"c",value:new THREE.Color(1118481)},shininess:{type:"f",value:30}}]),vertexShader:["#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif",THREE.ShaderChunk.common,THREE.ShaderChunk.uv_pars_vertex,THREE.ShaderChunk.uv2_pars_vertex,THREE.ShaderChunk.displacementmap_pars_vertex,THREE.ShaderChunk.envmap_pars_vertex,THREE.ShaderChunk.lights_phong_pars_vertex,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.morphtarget_pars_vertex,
+THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.uv_vertex,THREE.ShaderChunk.uv2_vertex,THREE.ShaderChunk.color_vertex,THREE.ShaderChunk.beginnormal_vertex,THREE.ShaderChunk.morphnormal_vertex,THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.skinnormal_vertex,THREE.ShaderChunk.defaultnormal_vertex,"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif",THREE.ShaderChunk.begin_vertex,
+THREE.ShaderChunk.displacementmap_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"\tvViewPosition = - mvPosition.xyz;",THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.envmap_vertex,THREE.ShaderChunk.lights_phong_vertex,THREE.ShaderChunk.shadowmap_vertex,"}"].join("\n"),fragmentShader:["#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;",
+THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.uv_pars_fragment,THREE.ShaderChunk.uv2_pars_fragment,THREE.ShaderChunk.map_pars_fragment,THREE.ShaderChunk.alphamap_pars_fragment,THREE.ShaderChunk.aomap_pars_fragment,THREE.ShaderChunk.lightmap_pars_fragment,THREE.ShaderChunk.emissivemap_pars_fragment,THREE.ShaderChunk.envmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.lights_phong_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.bumpmap_pars_fragment,
+THREE.ShaderChunk.normalmap_pars_fragment,THREE.ShaderChunk.specularmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tvec3 totalAmbientLight = ambientLightColor;\n\tvec3 totalEmissiveLight = emissive;\n\tvec3 shadowMask = vec3( 1.0 );",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.alphamap_fragment,THREE.ShaderChunk.alphatest_fragment,
+THREE.ShaderChunk.specularmap_fragment,THREE.ShaderChunk.normal_phong_fragment,THREE.ShaderChunk.lightmap_fragment,THREE.ShaderChunk.hemilight_fragment,THREE.ShaderChunk.aomap_fragment,THREE.ShaderChunk.emissivemap_fragment,THREE.ShaderChunk.lights_phong_fragment,THREE.ShaderChunk.shadowmap_fragment,"totalDiffuseLight *= shadowMask;\ntotalSpecularLight *= shadowMask;\n#ifdef METAL\n\toutgoingLight += diffuseColor.rgb * ( totalDiffuseLight + totalAmbientLight ) * specular + totalSpecularLight + totalEmissiveLight;\n#else\n\toutgoingLight += diffuseColor.rgb * ( totalDiffuseLight + totalAmbientLight ) + totalSpecularLight + totalEmissiveLight;\n#endif",
+THREE.ShaderChunk.envmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,"\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n")},points:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.points,THREE.UniformsLib.shadowmap]),vertexShader:["uniform float size;\nuniform float scale;",THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.shadowmap_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.color_vertex,
+"\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / length( mvPosition.xyz ) );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\tgl_Position = projectionMatrix * mvPosition;",THREE.ShaderChunk.logdepthbuf_vertex,THREE.ShaderChunk.worldpos_vertex,THREE.ShaderChunk.shadowmap_vertex,"}"].join("\n"),fragmentShader:["uniform vec3 psColor;\nuniform float opacity;",THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.map_particle_pars_fragment,
+THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( psColor, opacity );\n\tvec3 shadowMask = vec3( 1.0 );",THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.map_particle_fragment,THREE.ShaderChunk.color_fragment,THREE.ShaderChunk.alphatest_fragment,THREE.ShaderChunk.shadowmap_fragment,"\toutgoingLight = diffuseColor.rgb * shadowMask;",THREE.ShaderChunk.fog_fragment,
+"\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n")},dashed:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib.common,THREE.UniformsLib.fog,{scale:{type:"f",value:1},dashSize:{type:"f",value:1},totalSize:{type:"f",value:2}}]),vertexShader:["uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;",THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.color_vertex,"\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;",
+THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;",THREE.ShaderChunk.common,THREE.ShaderChunk.color_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );",
+THREE.ShaderChunk.logdepthbuf_fragment,THREE.ShaderChunk.color_fragment,"\toutgoingLight = diffuseColor.rgb;",THREE.ShaderChunk.fog_fragment,"\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2E3},opacity:{type:"f",value:1}},vertexShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,
+THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float mNear;\nuniform float mFar;\nuniform float opacity;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {",THREE.ShaderChunk.logdepthbuf_fragment,"\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\tfloat color = 1.0 - smoothstep( mNear, mFar, depth );\n\tgl_FragColor = vec4( vec3( color ), opacity );\n}"].join("\n")},
+normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:["varying vec3 vNormal;",THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {\n\tvNormal = normalize( normalMatrix * normal );",THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform float opacity;\nvarying vec3 vNormal;",THREE.ShaderChunk.common,
+THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\n\tgl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},equirect:{uniforms:{tEquirect:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;",
+THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.logdepthbuf_pars_fragment,"void main() {\nvec3 direction = normalize( vWorldPosition );\nvec2 sampleUV;\nsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\nsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\ngl_FragColor = texture2D( tEquirect, sampleUV );",
+THREE.ShaderChunk.logdepthbuf_fragment,"}"].join("\n")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,THREE.ShaderChunk.logdepthbuf_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:[THREE.ShaderChunk.common,
+THREE.ShaderChunk.logdepthbuf_pars_fragment,"vec4 pack_depth( const in float depth ) {\n\tconst vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\n\tconst vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\n\tvec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );\n\tres -= res.xxyz * bit_mask;\n\treturn res;\n}\nvoid main() {",THREE.ShaderChunk.logdepthbuf_fragment,"\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tgl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );\n\t#else\n\t\tgl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n\t#endif\n}"].join("\n")},
+distanceRGBA:{uniforms:{lightPos:{type:"v3",value:new THREE.Vector3(0,0,0)}},vertexShader:["varying vec4 vWorldPosition;",THREE.ShaderChunk.common,THREE.ShaderChunk.morphtarget_pars_vertex,THREE.ShaderChunk.skinning_pars_vertex,"void main() {",THREE.ShaderChunk.skinbase_vertex,THREE.ShaderChunk.begin_vertex,THREE.ShaderChunk.morphtarget_vertex,THREE.ShaderChunk.skinning_vertex,THREE.ShaderChunk.project_vertex,THREE.ShaderChunk.worldpos_vertex,"vWorldPosition = worldPosition;\n}"].join("\n"),fragmentShader:["uniform vec3 lightPos;\nvarying vec4 vWorldPosition;",
+THREE.ShaderChunk.common,"vec4 pack1K ( float depth ) {\n   depth /= 1000.0;\n   const vec4 bitSh = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\n\tconst vec4 bitMsk = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\n\tvec4 res = fract( depth * bitSh );\n\tres -= res.xxyz * bitMsk;\n\treturn res; \n}\nfloat unpack1K ( vec4 color ) {\n\tconst vec4 bitSh = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\n\treturn dot( color, bitSh ) * 1000.0;\n}\nvoid main () {\n\tgl_FragColor = pack1K( length( vWorldPosition.xyz - lightPos.xyz ) );\n}"].join("\n")}};
+THREE.WebGLRenderer=function(a){function b(a,b,c,d){!0===G&&(a*=d,b*=d,c*=d);r.clearColor(a,b,c,d)}function c(){I.init();r.viewport(na,oa,pa,qa);b(U.r,U.g,U.b,X)}function d(){ra=Aa=null;sa="";ta=-1;wa=!0;I.reset()}function e(a){a.preventDefault();d();c();W.clear()}function g(a){a=a.target;a.removeEventListener("dispose",g);a:{var b=W.get(a);if(a.image&&b.__image__webglTextureCube)r.deleteTexture(b.__image__webglTextureCube);else{if(void 0===b.__webglInit)break a;r.deleteTexture(b.__webglTexture)}W.delete(a)}la.textures--}
+function f(a){a=a.target;a.removeEventListener("dispose",f);var b=W.get(a),c=W.get(a.texture);if(a&&void 0!==c.__webglTexture){r.deleteTexture(c.__webglTexture);if(a instanceof THREE.WebGLRenderTargetCube)for(c=0;6>c;c++)r.deleteFramebuffer(b.__webglFramebuffer[c]),r.deleteRenderbuffer(b.__webglRenderbuffer[c]);else r.deleteFramebuffer(b.__webglFramebuffer),r.deleteRenderbuffer(b.__webglRenderbuffer);W.delete(a.texture);W.delete(a)}la.textures--}function h(a){a=a.target;a.removeEventListener("dispose",
+h);l(a);W.delete(a)}function l(a){var b=W.get(a).program;a.program=void 0;void 0!==b&&ua.releaseProgram(b)}function k(a,b){return b[0]-a[0]}function m(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function p(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function n(a,b,c,d,e){var f;c.transparent?
+(d=Z,f=++fa):(d=ca,f=++ga);f=d[f];void 0!==f?(f.id=a.id,f.object=a,f.geometry=b,f.material=c,f.z=V.z,f.group=e):(f={id:a.id,object:a,geometry:b,material:c,z:V.z,group:e},d.push(f))}function q(a,b){if(!1!==a.visible){if(0!==(a.channels.mask&b.channels.mask))if(a instanceof THREE.Light)da.push(a);else if(a instanceof THREE.Sprite)ea.push(a);else if(a instanceof THREE.LensFlare)ja.push(a);else if(a instanceof THREE.ImmediateRenderObject)!0===aa.sortObjects&&(V.setFromMatrixPosition(a.matrixWorld),V.applyProjection(xa)),
+n(a,null,a.material,V.z,null);else if(a instanceof THREE.Mesh||a instanceof THREE.Line||a instanceof THREE.Points)if(a instanceof THREE.SkinnedMesh&&a.skeleton.update(),!1===a.frustumCulled||!0===Ba.intersectsObject(a)){var c=a.material;if(!0===c.visible){!0===aa.sortObjects&&(V.setFromMatrixPosition(a.matrixWorld),V.applyProjection(xa));var d=va.update(a);if(c instanceof THREE.MeshFaceMaterial)for(var e=d.groups,f=c.materials,c=0,g=e.length;c<g;c++){var h=e[c],l=f[h.materialIndex];!0===l.visible&&
+n(a,d,l,V.z,h)}else n(a,d,c,V.z,null)}}d=a.children;c=0;for(g=d.length;c<g;c++)q(d[c],b)}}function s(a,b,c,d,e){for(var f=0,g=a.length;f<g;f++){var h=a[f],l=h.object,k=h.geometry,n=void 0===e?h.material:e,h=h.group;l.modelViewMatrix.multiplyMatrices(b.matrixWorldInverse,l.matrixWorld);l.normalMatrix.getNormalMatrix(l.modelViewMatrix);if(l instanceof THREE.ImmediateRenderObject){t(n);var m=v(b,c,d,n,l);sa="";l.render(function(a){aa.renderBufferImmediate(a,m,n)})}else aa.renderBufferDirect(b,c,d,k,
+n,l,h)}}function t(a){a.side!==THREE.DoubleSide?I.enable(r.CULL_FACE):I.disable(r.CULL_FACE);I.setFlipSided(a.side===THREE.BackSide);!0===a.transparent?I.setBlending(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha):I.setBlending(THREE.NoBlending);I.setDepthFunc(a.depthFunc);I.setDepthTest(a.depthTest);I.setDepthWrite(a.depthWrite);I.setColorWrite(a.colorWrite);I.setPolygonOffset(a.polygonOffset,a.polygonOffsetFactor,a.polygonOffsetUnits)}function v(a,
+b,c,d,e){ya=0;var f=W.get(d);if(d.needsUpdate||!f.program){a:{var g=W.get(d),k=ua.getParameters(d,b,c,e),n=ua.getProgramCode(d,k),m=g.program,q=!0;if(void 0===m)d.addEventListener("dispose",h);else if(m.code!==n)l(d);else if(void 0!==k.shaderID)break a;else q=!1;q&&(k.shaderID?(m=THREE.ShaderLib[k.shaderID],g.__webglShader={name:d.type,uniforms:THREE.UniformsUtils.clone(m.uniforms),vertexShader:m.vertexShader,fragmentShader:m.fragmentShader}):g.__webglShader={name:d.type,uniforms:d.uniforms,vertexShader:d.vertexShader,
+fragmentShader:d.fragmentShader},d.__webglShader=g.__webglShader,m=ua.acquireProgram(d,k,n),g.program=m,d.program=m);k=m.getAttributes();if(d.morphTargets)for(n=d.numSupportedMorphTargets=0;n<aa.maxMorphTargets;n++)0<=k["morphTarget"+n]&&d.numSupportedMorphTargets++;if(d.morphNormals)for(n=d.numSupportedMorphNormals=0;n<aa.maxMorphNormals;n++)0<=k["morphNormal"+n]&&d.numSupportedMorphNormals++;g.uniformsList=[];var k=g.program.getUniforms(),p;for(p in g.__webglShader.uniforms)(n=k[p])&&g.uniformsList.push([g.__webglShader.uniforms[p],
+n])}d.needsUpdate=!1}n=m=q=!1;g=f.program;p=g.getUniforms();k=f.__webglShader.uniforms;g.id!==Aa&&(r.useProgram(g.program),Aa=g.id,n=m=q=!0);d.id!==ta&&(-1===ta&&(n=!0),ta=d.id,m=!0);if(q||a!==ra)r.uniformMatrix4fv(p.projectionMatrix,!1,a.projectionMatrix.elements),ha.logarithmicDepthBuffer&&r.uniform1f(p.logDepthBufFC,2/(Math.log(a.far+1)/Math.LN2)),a!==ra&&(ra=a),(d instanceof THREE.ShaderMaterial||d instanceof THREE.MeshPhongMaterial||d.envMap)&&void 0!==p.cameraPosition&&(V.setFromMatrixPosition(a.matrixWorld),
+r.uniform3f(p.cameraPosition,V.x,V.y,V.z)),(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d instanceof THREE.MeshBasicMaterial||d instanceof THREE.ShaderMaterial||d.skinning)&&void 0!==p.viewMatrix&&r.uniformMatrix4fv(p.viewMatrix,!1,a.matrixWorldInverse.elements);d.skinning&&(e.bindMatrix&&void 0!==p.bindMatrix&&r.uniformMatrix4fv(p.bindMatrix,!1,e.bindMatrix.elements),e.bindMatrixInverse&&void 0!==p.bindMatrixInverse&&r.uniformMatrix4fv(p.bindMatrixInverse,!1,e.bindMatrixInverse.elements),
+ha.floatVertexTextures&&e.skeleton&&e.skeleton.useVertexTexture?(void 0!==p.boneTexture&&(q=w(),r.uniform1i(p.boneTexture,q),aa.setTexture(e.skeleton.boneTexture,q)),void 0!==p.boneTextureWidth&&r.uniform1i(p.boneTextureWidth,e.skeleton.boneTextureWidth),void 0!==p.boneTextureHeight&&r.uniform1i(p.boneTextureHeight,e.skeleton.boneTextureHeight)):e.skeleton&&e.skeleton.boneMatrices&&void 0!==p.boneGlobalMatrices&&r.uniformMatrix4fv(p.boneGlobalMatrices,!1,e.skeleton.boneMatrices));if(m){c&&d.fog&&
+(k.fogColor.value=c.color,c instanceof THREE.Fog?(k.fogNear.value=c.near,k.fogFar.value=c.far):c instanceof THREE.FogExp2&&(k.fogDensity.value=c.density));if(d instanceof THREE.MeshPhongMaterial||d instanceof THREE.MeshLambertMaterial||d.lights){if(wa){var n=!0,s,t=q=0,x=0,v,F,C,y=Ca,E=a.matrixWorldInverse,B=y.directional.colors,K=y.directional.positions,O=y.point.colors,N=y.point.positions,M=y.point.distances,G=y.point.decays,J=y.spot.colors,H=y.spot.positions,Q=y.spot.distances,I=y.spot.directions,
+da=y.spot.anglesCos,T=y.spot.exponents,R=y.spot.decays,Z=y.hemi.skyColors,ga=y.hemi.groundColors,S=y.hemi.positions,ca=0,U=0,ea=0,fa=0,ja=0,ma=0,X=0,$=0,ba=s=0;c=C=ba=0;for(m=b.length;c<m;c++)s=b[c],v=s.color,F=s.intensity,C=s.distance,s instanceof THREE.AmbientLight?s.visible&&(q+=v.r,t+=v.g,x+=v.b):s instanceof THREE.DirectionalLight?(ja+=1,s.visible&&(Y.setFromMatrixPosition(s.matrixWorld),V.setFromMatrixPosition(s.target.matrixWorld),Y.sub(V),Y.transformDirection(E),s=3*ca,K[s+0]=Y.x,K[s+1]=Y.y,
+K[s+2]=Y.z,D(B,s,v,F),ca+=1)):s instanceof THREE.PointLight?(ma+=1,s.visible&&(ba=3*U,D(O,ba,v,F),V.setFromMatrixPosition(s.matrixWorld),V.applyMatrix4(E),N[ba+0]=V.x,N[ba+1]=V.y,N[ba+2]=V.z,M[U]=C,G[U]=0===s.distance?0:s.decay,U+=1)):s instanceof THREE.SpotLight?(X+=1,s.visible&&(ba=3*ea,D(J,ba,v,F),Y.setFromMatrixPosition(s.matrixWorld),V.copy(Y).applyMatrix4(E),H[ba+0]=V.x,H[ba+1]=V.y,H[ba+2]=V.z,Q[ea]=C,V.setFromMatrixPosition(s.target.matrixWorld),Y.sub(V),Y.transformDirection(E),I[ba+0]=Y.x,
+I[ba+1]=Y.y,I[ba+2]=Y.z,da[ea]=Math.cos(s.angle),T[ea]=s.exponent,R[ea]=0===s.distance?0:s.decay,ea+=1)):s instanceof THREE.HemisphereLight&&($+=1,s.visible&&(Y.setFromMatrixPosition(s.matrixWorld),Y.transformDirection(E),C=3*fa,S[C+0]=Y.x,S[C+1]=Y.y,S[C+2]=Y.z,v=s.color,s=s.groundColor,D(Z,C,v,F),D(ga,C,s,F),fa+=1));c=3*ca;for(m=Math.max(B.length,3*ja);c<m;c++)B[c]=0;c=3*U;for(m=Math.max(O.length,3*ma);c<m;c++)O[c]=0;c=3*ea;for(m=Math.max(J.length,3*X);c<m;c++)J[c]=0;c=3*fa;for(m=Math.max(Z.length,
+3*$);c<m;c++)Z[c]=0;c=3*fa;for(m=Math.max(ga.length,3*$);c<m;c++)ga[c]=0;y.directional.length=ca;y.point.length=U;y.spot.length=ea;y.hemi.length=fa;y.ambient[0]=q;y.ambient[1]=t;y.ambient[2]=x;wa=!1}n?(n=Ca,k.ambientLightColor.value=n.ambient,k.directionalLightColor.value=n.directional.colors,k.directionalLightDirection.value=n.directional.positions,k.pointLightColor.value=n.point.colors,k.pointLightPosition.value=n.point.positions,k.pointLightDistance.value=n.point.distances,k.pointLightDecay.value=
+n.point.decays,k.spotLightColor.value=n.spot.colors,k.spotLightPosition.value=n.spot.positions,k.spotLightDistance.value=n.spot.distances,k.spotLightDirection.value=n.spot.directions,k.spotLightAngleCos.value=n.spot.anglesCos,k.spotLightExponent.value=n.spot.exponents,k.spotLightDecay.value=n.spot.decays,k.hemisphereLightSkyColor.value=n.hemi.skyColors,k.hemisphereLightGroundColor.value=n.hemi.groundColors,k.hemisphereLightDirection.value=n.hemi.positions,u(k,!0)):u(k,!1)}if(d instanceof THREE.MeshBasicMaterial||
+d instanceof THREE.MeshLambertMaterial||d instanceof THREE.MeshPhongMaterial){k.opacity.value=d.opacity;k.diffuse.value=d.color;d.emissive&&(k.emissive.value=d.emissive);k.map.value=d.map;k.specularMap.value=d.specularMap;k.alphaMap.value=d.alphaMap;d.aoMap&&(k.aoMap.value=d.aoMap,k.aoMapIntensity.value=d.aoMapIntensity);var P;d.map?P=d.map:d.specularMap?P=d.specularMap:d.displacementMap?P=d.displacementMap:d.normalMap?P=d.normalMap:d.bumpMap?P=d.bumpMap:d.alphaMap?P=d.alphaMap:d.emissiveMap&&(P=
+d.emissiveMap);void 0!==P&&(P instanceof THREE.WebGLRenderTarget&&(P=P.texture),n=P.offset,P=P.repeat,k.offsetRepeat.value.set(n.x,n.y,P.x,P.y));k.envMap.value=d.envMap;k.flipEnvMap.value=d.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;k.reflectivity.value=d.reflectivity;k.refractionRatio.value=d.refractionRatio}d instanceof THREE.LineBasicMaterial?(k.diffuse.value=d.color,k.opacity.value=d.opacity):d instanceof THREE.LineDashedMaterial?(k.diffuse.value=d.color,k.opacity.value=d.opacity,k.dashSize.value=
+d.dashSize,k.totalSize.value=d.dashSize+d.gapSize,k.scale.value=d.scale):d instanceof THREE.PointsMaterial?(k.psColor.value=d.color,k.opacity.value=d.opacity,k.size.value=d.size,k.scale.value=L.height/2,k.map.value=d.map,null!==d.map&&(a=d.map.offset,P=d.map.repeat,k.offsetRepeat.value.set(a.x,a.y,P.x,P.y))):d instanceof THREE.MeshPhongMaterial?(k.specular.value=d.specular,k.shininess.value=Math.max(d.shininess,1E-4),d.lightMap&&(k.lightMap.value=d.lightMap,k.lightMapIntensity.value=d.lightMapIntensity),
+d.emissiveMap&&(k.emissiveMap.value=d.emissiveMap),d.bumpMap&&(k.bumpMap.value=d.bumpMap,k.bumpScale.value=d.bumpScale),d.normalMap&&(k.normalMap.value=d.normalMap,k.normalScale.value.copy(d.normalScale)),d.displacementMap&&(k.displacementMap.value=d.displacementMap,k.displacementScale.value=d.displacementScale,k.displacementBias.value=d.displacementBias)):d instanceof THREE.MeshDepthMaterial?(k.mNear.value=a.near,k.mFar.value=a.far,k.opacity.value=d.opacity):d instanceof THREE.MeshNormalMaterial&&
+(k.opacity.value=d.opacity);if(e.receiveShadow&&!d._shadowPass&&k.shadowMatrix)for(a=d=0,P=b.length;a<P;a++)n=b[a],!0===n.castShadow&&(n instanceof THREE.PointLight||n instanceof THREE.SpotLight||n instanceof THREE.DirectionalLight)&&(c=n.shadow,n instanceof THREE.PointLight?(V.setFromMatrixPosition(n.matrixWorld).negate(),c.matrix.identity().setPosition(V),k.shadowDarkness.value[d]=-c.darkness):k.shadowDarkness.value[d]=c.darkness,k.shadowMatrix.value[d]=c.matrix,k.shadowMap.value[d]=c.map,k.shadowMapSize.value[d]=
+c.mapSize,k.shadowBias.value[d]=c.bias,d++);b=f.uniformsList;f=0;for(d=b.length;f<d;f++)if(a=b[f][0],!1!==a.needsUpdate)switch(k=a.type,c=a.value,P=b[f][1],k){case "1i":r.uniform1i(P,c);break;case "1f":r.uniform1f(P,c);break;case "2f":r.uniform2f(P,c[0],c[1]);break;case "3f":r.uniform3f(P,c[0],c[1],c[2]);break;case "4f":r.uniform4f(P,c[0],c[1],c[2],c[3]);break;case "1iv":r.uniform1iv(P,c);break;case "3iv":r.uniform3iv(P,c);break;case "1fv":r.uniform1fv(P,c);break;case "2fv":r.uniform2fv(P,c);break;
+case "3fv":r.uniform3fv(P,c);break;case "4fv":r.uniform4fv(P,c);break;case "Matrix3fv":r.uniformMatrix3fv(P,!1,c);break;case "Matrix4fv":r.uniformMatrix4fv(P,!1,c);break;case "i":r.uniform1i(P,c);break;case "f":r.uniform1f(P,c);break;case "v2":r.uniform2f(P,c.x,c.y);break;case "v3":r.uniform3f(P,c.x,c.y,c.z);break;case "v4":r.uniform4f(P,c.x,c.y,c.z,c.w);break;case "c":r.uniform3f(P,c.r,c.g,c.b);break;case "iv1":r.uniform1iv(P,c);break;case "iv":r.uniform3iv(P,c);break;case "fv1":r.uniform1fv(P,c);
+break;case "fv":r.uniform3fv(P,c);break;case "v2v":void 0===a._array&&(a._array=new Float32Array(2*c.length));m=k=0;for(n=c.length;k<n;k++,m+=2)a._array[m+0]=c[k].x,a._array[m+1]=c[k].y;r.uniform2fv(P,a._array);break;case "v3v":void 0===a._array&&(a._array=new Float32Array(3*c.length));m=k=0;for(n=c.length;k<n;k++,m+=3)a._array[m+0]=c[k].x,a._array[m+1]=c[k].y,a._array[m+2]=c[k].z;r.uniform3fv(P,a._array);break;case "v4v":void 0===a._array&&(a._array=new Float32Array(4*c.length));m=k=0;for(n=c.length;k<
+n;k++,m+=4)a._array[m+0]=c[k].x,a._array[m+1]=c[k].y,a._array[m+2]=c[k].z,a._array[m+3]=c[k].w;r.uniform4fv(P,a._array);break;case "m3":r.uniformMatrix3fv(P,!1,c.elements);break;case "m3v":void 0===a._array&&(a._array=new Float32Array(9*c.length));k=0;for(n=c.length;k<n;k++)c[k].flattenToArrayOffset(a._array,9*k);r.uniformMatrix3fv(P,!1,a._array);break;case "m4":r.uniformMatrix4fv(P,!1,c.elements);break;case "m4v":void 0===a._array&&(a._array=new Float32Array(16*c.length));k=0;for(n=c.length;k<n;k++)c[k].flattenToArrayOffset(a._array,
+16*k);r.uniformMatrix4fv(P,!1,a._array);break;case "t":m=w();r.uniform1i(P,m);if(!c)continue;c instanceof THREE.CubeTexture||Array.isArray(c.image)&&6===c.image.length?z(c,m):c instanceof THREE.WebGLRenderTargetCube?A(c.texture,m):c instanceof THREE.WebGLRenderTarget?aa.setTexture(c.texture,m):aa.setTexture(c,m);break;case "tv":void 0===a._array&&(a._array=[]);k=0;for(n=a.value.length;k<n;k++)a._array[k]=w();r.uniform1iv(P,a._array);k=0;for(n=a.value.length;k<n;k++)c=a.value[k],m=a._array[k],c&&(c instanceof
+THREE.CubeTexture||c.image instanceof Array&&6===c.image.length?z(c,m):c instanceof THREE.WebGLRenderTarget?aa.setTexture(c.texture,m):c instanceof THREE.WebGLRenderTargetCube?A(c.texture,m):aa.setTexture(c,m));break;default:console.warn("THREE.WebGLRenderer: Unknown uniform type: "+k)}}r.uniformMatrix4fv(p.modelViewMatrix,!1,e.modelViewMatrix.elements);p.normalMatrix&&r.uniformMatrix3fv(p.normalMatrix,!1,e.normalMatrix.elements);void 0!==p.modelMatrix&&r.uniformMatrix4fv(p.modelMatrix,!1,e.matrixWorld.elements);
+return g}function u(a,b){a.ambientLightColor.needsUpdate=b;a.directionalLightColor.needsUpdate=b;a.directionalLightDirection.needsUpdate=b;a.pointLightColor.needsUpdate=b;a.pointLightPosition.needsUpdate=b;a.pointLightDistance.needsUpdate=b;a.pointLightDecay.needsUpdate=b;a.spotLightColor.needsUpdate=b;a.spotLightPosition.needsUpdate=b;a.spotLightDistance.needsUpdate=b;a.spotLightDirection.needsUpdate=b;a.spotLightAngleCos.needsUpdate=b;a.spotLightExponent.needsUpdate=b;a.spotLightDecay.needsUpdate=
+b;a.hemisphereLightSkyColor.needsUpdate=b;a.hemisphereLightGroundColor.needsUpdate=b;a.hemisphereLightDirection.needsUpdate=b}function w(){var a=ya;a>=ha.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+ha.maxTextures);ya+=1;return a}function D(a,b,c,d){a[b+0]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function x(a,b,c){c?(r.texParameteri(a,r.TEXTURE_WRAP_S,N(b.wrapS)),r.texParameteri(a,r.TEXTURE_WRAP_T,N(b.wrapT)),r.texParameteri(a,r.TEXTURE_MAG_FILTER,
+N(b.magFilter)),r.texParameteri(a,r.TEXTURE_MIN_FILTER,N(b.minFilter))):(r.texParameteri(a,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(a,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),b.wrapS===THREE.ClampToEdgeWrapping&&b.wrapT===THREE.ClampToEdgeWrapping||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",b),r.texParameteri(a,r.TEXTURE_MAG_FILTER,C(b.magFilter)),r.texParameteri(a,r.TEXTURE_MIN_FILTER,C(b.minFilter)),
+b.minFilter!==THREE.NearestFilter&&b.minFilter!==THREE.LinearFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",b));!(c=S.get("EXT_texture_filter_anisotropic"))||b.type===THREE.FloatType&&null===S.get("OES_texture_float_linear")||b.type===THREE.HalfFloatType&&null===S.get("OES_texture_half_float_linear")||!(1<b.anisotropy||W.get(b).__currentAnisotropy)||(r.texParameterf(a,c.TEXTURE_MAX_ANISOTROPY_EXT,
+Math.min(b.anisotropy,aa.getMaxAnisotropy())),W.get(b).__currentAnisotropy=b.anisotropy)}function B(a,b){if(a.width>b||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElement("canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function y(a){return THREE.Math.isPowerOfTwo(a.width)&&
+THREE.Math.isPowerOfTwo(a.height)}function z(a,b){var c=W.get(a);if(6===a.image.length)if(0<a.version&&c.__version!==a.version){c.__image__webglTextureCube||(a.addEventListener("dispose",g),c.__image__webglTextureCube=r.createTexture(),la.textures++);I.activeTexture(r.TEXTURE0+b);I.bindTexture(r.TEXTURE_CUBE_MAP,c.__image__webglTextureCube);r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,a.flipY);for(var d=a instanceof THREE.CompressedTexture,e=a.image[0]instanceof THREE.DataTexture,f=[],h=0;6>h;h++)f[h]=!aa.autoScaleCubemaps||
+d||e?e?a.image[h].image:a.image[h]:B(a.image[h],ha.maxCubemapSize);var k=y(f[0]),l=N(a.format),n=N(a.type);x(r.TEXTURE_CUBE_MAP,a,k);for(h=0;6>h;h++)if(d)for(var m,q=f[h].mipmaps,p=0,s=q.length;p<s;p++)m=q[p],a.format!==THREE.RGBAFormat&&a.format!==THREE.RGBFormat?-1<I.getCompressedTextureFormats().indexOf(l)?I.compressedTexImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X+h,p,l,m.width,m.height,0,m.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setCubeTexture()"):
+I.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X+h,p,l,m.width,m.height,0,l,n,m.data);else e?I.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X+h,0,l,f[h].width,f[h].height,0,l,n,f[h].data):I.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X+h,0,l,l,n,f[h]);a.generateMipmaps&&k&&r.generateMipmap(r.TEXTURE_CUBE_MAP);c.__version=a.version;if(a.onUpdate)a.onUpdate(a)}else I.activeTexture(r.TEXTURE0+b),I.bindTexture(r.TEXTURE_CUBE_MAP,c.__image__webglTextureCube)}function A(a,b){I.activeTexture(r.TEXTURE0+b);I.bindTexture(r.TEXTURE_CUBE_MAP,
+W.get(a).__webglTexture)}function J(a,b,c){r.bindFramebuffer(r.FRAMEBUFFER,a);r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,c,W.get(b.texture).__webglTexture,0)}function F(a,b){r.bindRenderbuffer(r.RENDERBUFFER,a);b.depthBuffer&&!b.stencilBuffer?(r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_COMPONENT16,b.width,b.height),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,a)):b.depthBuffer&&b.stencilBuffer?(r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,b.width,
+b.height),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,a)):r.renderbufferStorage(r.RENDERBUFFER,r.RGBA4,b.width,b.height)}function C(a){return a===THREE.NearestFilter||a===THREE.NearestMipMapNearestFilter||a===THREE.NearestMipMapLinearFilter?r.NEAREST:r.LINEAR}function N(a){var b;if(a===THREE.RepeatWrapping)return r.REPEAT;if(a===THREE.ClampToEdgeWrapping)return r.CLAMP_TO_EDGE;if(a===THREE.MirroredRepeatWrapping)return r.MIRRORED_REPEAT;if(a===THREE.NearestFilter)return r.NEAREST;
+if(a===THREE.NearestMipMapNearestFilter)return r.NEAREST_MIPMAP_NEAREST;if(a===THREE.NearestMipMapLinearFilter)return r.NEAREST_MIPMAP_LINEAR;if(a===THREE.LinearFilter)return r.LINEAR;if(a===THREE.LinearMipMapNearestFilter)return r.LINEAR_MIPMAP_NEAREST;if(a===THREE.LinearMipMapLinearFilter)return r.LINEAR_MIPMAP_LINEAR;if(a===THREE.UnsignedByteType)return r.UNSIGNED_BYTE;if(a===THREE.UnsignedShort4444Type)return r.UNSIGNED_SHORT_4_4_4_4;if(a===THREE.UnsignedShort5551Type)return r.UNSIGNED_SHORT_5_5_5_1;
+if(a===THREE.UnsignedShort565Type)return r.UNSIGNED_SHORT_5_6_5;if(a===THREE.ByteType)return r.BYTE;if(a===THREE.ShortType)return r.SHORT;if(a===THREE.UnsignedShortType)return r.UNSIGNED_SHORT;if(a===THREE.IntType)return r.INT;if(a===THREE.UnsignedIntType)return r.UNSIGNED_INT;if(a===THREE.FloatType)return r.FLOAT;b=S.get("OES_texture_half_float");if(null!==b&&a===THREE.HalfFloatType)return b.HALF_FLOAT_OES;if(a===THREE.AlphaFormat)return r.ALPHA;if(a===THREE.RGBFormat)return r.RGB;if(a===THREE.RGBAFormat)return r.RGBA;
+if(a===THREE.LuminanceFormat)return r.LUMINANCE;if(a===THREE.LuminanceAlphaFormat)return r.LUMINANCE_ALPHA;if(a===THREE.AddEquation)return r.FUNC_ADD;if(a===THREE.SubtractEquation)return r.FUNC_SUBTRACT;if(a===THREE.ReverseSubtractEquation)return r.FUNC_REVERSE_SUBTRACT;if(a===THREE.ZeroFactor)return r.ZERO;if(a===THREE.OneFactor)return r.ONE;if(a===THREE.SrcColorFactor)return r.SRC_COLOR;if(a===THREE.OneMinusSrcColorFactor)return r.ONE_MINUS_SRC_COLOR;if(a===THREE.SrcAlphaFactor)return r.SRC_ALPHA;
+if(a===THREE.OneMinusSrcAlphaFactor)return r.ONE_MINUS_SRC_ALPHA;if(a===THREE.DstAlphaFactor)return r.DST_ALPHA;if(a===THREE.OneMinusDstAlphaFactor)return r.ONE_MINUS_DST_ALPHA;if(a===THREE.DstColorFactor)return r.DST_COLOR;if(a===THREE.OneMinusDstColorFactor)return r.ONE_MINUS_DST_COLOR;if(a===THREE.SrcAlphaSaturateFactor)return r.SRC_ALPHA_SATURATE;b=S.get("WEBGL_compressed_texture_s3tc");if(null!==b){if(a===THREE.RGB_S3TC_DXT1_Format)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(a===THREE.RGBA_S3TC_DXT1_Format)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;
+if(a===THREE.RGBA_S3TC_DXT3_Format)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(a===THREE.RGBA_S3TC_DXT5_Format)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}b=S.get("WEBGL_compressed_texture_pvrtc");if(null!==b){if(a===THREE.RGB_PVRTC_4BPPV1_Format)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(a===THREE.RGB_PVRTC_2BPPV1_Format)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(a===THREE.RGBA_PVRTC_4BPPV1_Format)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(a===THREE.RGBA_PVRTC_2BPPV1_Format)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}b=
+S.get("EXT_blend_minmax");if(null!==b){if(a===THREE.MinEquation)return b.MIN_EXT;if(a===THREE.MaxEquation)return b.MAX_EXT}return 0}console.log("THREE.WebGLRenderer",THREE.REVISION);a=a||{};var L=void 0!==a.canvas?a.canvas:document.createElement("canvas"),Q=void 0!==a.context?a.context:null,M=L.width,K=L.height,E=1,O=void 0!==a.alpha?a.alpha:!1,T=void 0!==a.depth?a.depth:!0,H=void 0!==a.stencil?a.stencil:!0,R=void 0!==a.antialias?a.antialias:!1,G=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:
+!0,ia=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,U=new THREE.Color(0),X=0,da=[],ca=[],ga=-1,Z=[],fa=-1,ma=new Float32Array(8),ea=[],ja=[];this.domElement=L;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.gammaFactor=2;this.gammaOutput=this.gammaInput=!1;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=!0;var aa=this,Aa=null,za=null,ta=-1,sa="",ra=null,ya=0,na=0,oa=0,pa=L.width,qa=L.height,
+Da=0,Ea=0,Ba=new THREE.Frustum,xa=new THREE.Matrix4,V=new THREE.Vector3,Y=new THREE.Vector3,wa=!0,Ca={ambient:[0,0,0],directional:{length:0,colors:[],positions:[]},point:{length:0,colors:[],positions:[],distances:[],decays:[]},spot:{length:0,colors:[],positions:[],distances:[],directions:[],anglesCos:[],exponents:[],decays:[]},hemi:{length:0,skyColors:[],groundColors:[],positions:[]}},la={geometries:0,textures:0},ka={calls:0,vertices:0,faces:0,points:0};this.info={render:ka,memory:la,programs:null};
+var r;try{O={alpha:O,depth:T,stencil:H,antialias:R,premultipliedAlpha:G,preserveDrawingBuffer:ia};r=Q||L.getContext("webgl",O)||L.getContext("experimental-webgl",O);if(null===r){if(null!==L.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";throw"Error creating WebGL context.";}L.addEventListener("webglcontextlost",e,!1)}catch(Fa){console.error("THREE.WebGLRenderer: "+Fa)}var S=new THREE.WebGLExtensions(r);S.get("OES_texture_float");S.get("OES_texture_float_linear");
+S.get("OES_texture_half_float");S.get("OES_texture_half_float_linear");S.get("OES_standard_derivatives");S.get("ANGLE_instanced_arrays");S.get("OES_element_index_uint")&&(THREE.BufferGeometry.MaxIndex=4294967296);var ha=new THREE.WebGLCapabilities(r,S,a),I=new THREE.WebGLState(r,S,N),W=new THREE.WebGLProperties,va=new THREE.WebGLObjects(r,W,this.info),ua=new THREE.WebGLPrograms(this,ha);this.info.programs=ua.programs;var Ga=new THREE.WebGLBufferRenderer(r,S,ka),Ha=new THREE.WebGLIndexedBufferRenderer(r,
+S,ka);c();this.context=r;this.capabilities=ha;this.extensions=S;this.state=I;var $=new THREE.WebGLShadowMap(this,da,va);this.shadowMap=$;var Ia=new THREE.SpritePlugin(this,ea),Ja=new THREE.LensFlarePlugin(this,ja);this.getContext=function(){return r};this.getContextAttributes=function(){return r.getContextAttributes()};this.forceContextLoss=function(){S.get("WEBGL_lose_context").loseContext()};this.getMaxAnisotropy=function(){var a;return function(){if(void 0!==a)return a;var b=S.get("EXT_texture_filter_anisotropic");
+return a=null!==b?r.getParameter(b.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0}}();this.getPrecision=function(){return ha.precision};this.getPixelRatio=function(){return E};this.setPixelRatio=function(a){void 0!==a&&(E=a)};this.getSize=function(){return{width:M,height:K}};this.setSize=function(a,b,c){M=a;K=b;L.width=a*E;L.height=b*E;!1!==c&&(L.style.width=a+"px",L.style.height=b+"px");this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){na=a*E;oa=b*E;pa=c*E;qa=d*E;r.viewport(na,oa,pa,qa)};this.getViewport=
+function(a){a.x=na/E;a.y=oa/E;a.z=pa/E;a.w=qa/E};this.setScissor=function(a,b,c,d){r.scissor(a*E,b*E,c*E,d*E)};this.enableScissorTest=function(a){I.setScissorTest(a)};this.getClearColor=function(){return U};this.setClearColor=function(a,c){U.set(a);X=void 0!==c?c:1;b(U.r,U.g,U.b,X)};this.getClearAlpha=function(){return X};this.setClearAlpha=function(a){X=a;b(U.r,U.g,U.b,X)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=r.COLOR_BUFFER_BIT;if(void 0===b||b)d|=r.DEPTH_BUFFER_BIT;if(void 0===
+c||c)d|=r.STENCIL_BUFFER_BIT;r.clear(d)};this.clearColor=function(){r.clear(r.COLOR_BUFFER_BIT)};this.clearDepth=function(){r.clear(r.DEPTH_BUFFER_BIT)};this.clearStencil=function(){r.clear(r.STENCIL_BUFFER_BIT)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.resetGLState=d;this.dispose=function(){L.removeEventListener("webglcontextlost",e,!1)};this.renderBufferImmediate=function(a,b,c){I.initAttributes();var d=W.get(a);a.hasPositions&&!d.position&&(d.position=
+r.createBuffer());a.hasNormals&&!d.normal&&(d.normal=r.createBuffer());a.hasUvs&&!d.uv&&(d.uv=r.createBuffer());a.hasColors&&!d.color&&(d.color=r.createBuffer());b=b.getAttributes();a.hasPositions&&(r.bindBuffer(r.ARRAY_BUFFER,d.position),r.bufferData(r.ARRAY_BUFFER,a.positionArray,r.DYNAMIC_DRAW),I.enableAttribute(b.position),r.vertexAttribPointer(b.position,3,r.FLOAT,!1,0,0));if(a.hasNormals){r.bindBuffer(r.ARRAY_BUFFER,d.normal);if("MeshPhongMaterial"!==c.type&&c.shading===THREE.FlatShading)for(var e=
+0,f=3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,k=(g[e+1]+g[e+4]+g[e+7])/3,l=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=k;g[e+2]=l;g[e+3]=h;g[e+4]=k;g[e+5]=l;g[e+6]=h;g[e+7]=k;g[e+8]=l}r.bufferData(r.ARRAY_BUFFER,a.normalArray,r.DYNAMIC_DRAW);I.enableAttribute(b.normal);r.vertexAttribPointer(b.normal,3,r.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(r.bindBuffer(r.ARRAY_BUFFER,d.uv),r.bufferData(r.ARRAY_BUFFER,a.uvArray,r.DYNAMIC_DRAW),I.enableAttribute(b.uv),r.vertexAttribPointer(b.uv,2,r.FLOAT,
+!1,0,0));a.hasColors&&c.vertexColors!==THREE.NoColors&&(r.bindBuffer(r.ARRAY_BUFFER,d.color),r.bufferData(r.ARRAY_BUFFER,a.colorArray,r.DYNAMIC_DRAW),I.enableAttribute(b.color),r.vertexAttribPointer(b.color,3,r.FLOAT,!1,0,0));I.disableUnusedAttributes();r.drawArrays(r.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f,g){t(e);var h=v(a,b,c,e,f),l=!1;a=d.id+"_"+h.id+"_"+e.wireframe;a!==sa&&(sa=a,l=!0);b=f.morphTargetInfluences;if(void 0!==b){a=[];c=0;for(l=b.length;c<l;c++){var n=
+b[c];a.push([n,c])}a.sort(k);8<a.length&&(a.length=8);var m=d.morphAttributes;c=0;for(l=a.length;c<l;c++)n=a[c],ma[c]=n[0],0!==n[0]?(b=n[1],!0===e.morphTargets&&m.position&&d.addAttribute("morphTarget"+c,m.position[b]),!0===e.morphNormals&&m.normal&&d.addAttribute("morphNormal"+c,m.normal[b])):(!0===e.morphTargets&&d.removeAttribute("morphTarget"+c),!0===e.morphNormals&&d.removeAttribute("morphNormal"+c));a=h.getUniforms();null!==a.morphTargetInfluences&&r.uniform1fv(a.morphTargetInfluences,ma);l=
+!0}b=d.index;c=d.attributes.position;!0===e.wireframe&&(b=va.getWireframeAttribute(d));null!==b?(a=Ha,a.setIndex(b)):a=Ga;if(l){a:{var l=void 0,q;if(d instanceof THREE.InstancedBufferGeometry&&(q=S.get("ANGLE_instanced_arrays"),null===q)){console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");break a}void 0===l&&(l=0);I.initAttributes();var n=d.attributes,h=h.getAttributes(),m=e.defaultAttributeValues,
+p;for(p in h){var s=h[p];if(0<=s){var u=n[p];if(void 0!==u){var w=u.itemSize,x=va.getAttributeBuffer(u);if(u instanceof THREE.InterleavedBufferAttribute){var F=u.data,D=F.stride,u=u.offset;F instanceof THREE.InstancedInterleavedBuffer?(I.enableAttributeAndDivisor(s,F.meshPerAttribute,q),void 0===d.maxInstancedCount&&(d.maxInstancedCount=F.meshPerAttribute*F.count)):I.enableAttribute(s);r.bindBuffer(r.ARRAY_BUFFER,x);r.vertexAttribPointer(s,w,r.FLOAT,!1,D*F.array.BYTES_PER_ELEMENT,(l*D+u)*F.array.BYTES_PER_ELEMENT)}else u instanceof
+THREE.InstancedBufferAttribute?(I.enableAttributeAndDivisor(s,u.meshPerAttribute,q),void 0===d.maxInstancedCount&&(d.maxInstancedCount=u.meshPerAttribute*u.count)):I.enableAttribute(s),r.bindBuffer(r.ARRAY_BUFFER,x),r.vertexAttribPointer(s,w,r.FLOAT,!1,0,l*w*4)}else if(void 0!==m&&(w=m[p],void 0!==w))switch(w.length){case 2:r.vertexAttrib2fv(s,w);break;case 3:r.vertexAttrib3fv(s,w);break;case 4:r.vertexAttrib4fv(s,w);break;default:r.vertexAttrib1fv(s,w)}}}I.disableUnusedAttributes()}null!==b&&r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,
+va.getAttributeBuffer(b))}q=Infinity;null!==b?q=b.count:void 0!==c&&(q=c.count);p=d.drawRange.start;b=d.drawRange.count;c=null!==g?g.start:0;l=null!==g?g.count:Infinity;g=Math.max(0,p,c);q=Math.min(0+q,p+b,c+l)-1;q=Math.max(0,q-g+1);f instanceof THREE.Mesh?(!0===e.wireframe?(I.setLineWidth(e.wireframeLinewidth*E),a.setMode(r.LINES)):a.setMode(r.TRIANGLES),d instanceof THREE.InstancedBufferGeometry&&0<d.maxInstancedCount?a.renderInstances(d):a.render(g,q)):f instanceof THREE.Line?(d=e.linewidth,void 0===
+d&&(d=1),I.setLineWidth(d*E),f instanceof THREE.LineSegments?a.setMode(r.LINES):a.setMode(r.LINE_STRIP),a.render(g,q)):f instanceof THREE.Points&&(a.setMode(r.POINTS),a.render(g,q))};this.render=function(a,b,c,d){if(!1===b instanceof THREE.Camera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else{var e=a.fog;sa="";ta=-1;ra=null;wa=!0;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();b.matrixWorldInverse.getInverse(b.matrixWorld);
+xa.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);Ba.setFromMatrix(xa);da.length=0;fa=ga=-1;ea.length=0;ja.length=0;q(a,b);ca.length=ga+1;Z.length=fa+1;!0===aa.sortObjects&&(ca.sort(m),Z.sort(p));$.render(a);ka.calls=0;ka.vertices=0;ka.faces=0;ka.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);a.overrideMaterial?(d=a.overrideMaterial,s(ca,b,da,e,d),s(Z,b,da,e,d)):(I.setBlending(THREE.NoBlending),s(ca,b,da,e),
+s(Z,b,da,e));Ia.render(a,b);Ja.render(a,b,Da,Ea);c&&(a=c.texture,b=y(c),a.generateMipmaps&&b&&a.minFilter!==THREE.NearestFilter&&a.minFilter!==THREE.LinearFilter&&(a=c instanceof THREE.WebGLRenderTargetCube?r.TEXTURE_CUBE_MAP:r.TEXTURE_2D,c=W.get(c.texture).__webglTexture,I.bindTexture(a,c),r.generateMipmap(a),I.bindTexture(a,null)));I.setDepthTest(!0);I.setDepthWrite(!0);I.setColorWrite(!0)}};this.setFaceCulling=function(a,b){a===THREE.CullFaceNone?I.disable(r.CULL_FACE):(b===THREE.FrontFaceDirectionCW?
+r.frontFace(r.CW):r.frontFace(r.CCW),a===THREE.CullFaceBack?r.cullFace(r.BACK):a===THREE.CullFaceFront?r.cullFace(r.FRONT):r.cullFace(r.FRONT_AND_BACK),I.enable(r.CULL_FACE))};this.setTexture=function(a,b){var c=W.get(a);if(0<a.version&&c.__version!==a.version){var d=a.image;if(void 0===d)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",a);else if(!1===d.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",a);else{void 0===
+c.__webglInit&&(c.__webglInit=!0,a.addEventListener("dispose",g),c.__webglTexture=r.createTexture(),la.textures++);I.activeTexture(r.TEXTURE0+b);I.bindTexture(r.TEXTURE_2D,c.__webglTexture);r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,a.flipY);r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,a.premultiplyAlpha);r.pixelStorei(r.UNPACK_ALIGNMENT,a.unpackAlignment);a.image=B(a.image,ha.maxTextureSize);if((a.wrapS!==THREE.ClampToEdgeWrapping||a.wrapT!==THREE.ClampToEdgeWrapping||a.minFilter!==THREE.NearestFilter&&
+a.minFilter!==THREE.LinearFilter)&&!1===y(a.image)){d=a.image;if(d instanceof HTMLImageElement||d instanceof HTMLCanvasElement){var e=document.createElement("canvas");e.width=THREE.Math.nearestPowerOfTwo(d.width);e.height=THREE.Math.nearestPowerOfTwo(d.height);e.getContext("2d").drawImage(d,0,0,e.width,e.height);console.warn("THREE.WebGLRenderer: image is not power of two ("+d.width+"x"+d.height+"). Resized to "+e.width+"x"+e.height,d);d=e}a.image=d}var f=a.image,d=y(f),e=N(a.format),h=N(a.type);
+x(r.TEXTURE_2D,a,d);var k=a.mipmaps;if(a instanceof THREE.DataTexture)if(0<k.length&&d){for(var l=0,n=k.length;l<n;l++)f=k[l],I.texImage2D(r.TEXTURE_2D,l,e,f.width,f.height,0,e,h,f.data);a.generateMipmaps=!1}else I.texImage2D(r.TEXTURE_2D,0,e,f.width,f.height,0,e,h,f.data);else if(a instanceof THREE.CompressedTexture)for(l=0,n=k.length;l<n;l++)f=k[l],a.format!==THREE.RGBAFormat&&a.format!==THREE.RGBFormat?-1<I.getCompressedTextureFormats().indexOf(e)?I.compressedTexImage2D(r.TEXTURE_2D,l,e,f.width,
+f.height,0,f.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):I.texImage2D(r.TEXTURE_2D,l,e,f.width,f.height,0,e,h,f.data);else if(0<k.length&&d){l=0;for(n=k.length;l<n;l++)f=k[l],I.texImage2D(r.TEXTURE_2D,l,e,e,h,f);a.generateMipmaps=!1}else I.texImage2D(r.TEXTURE_2D,0,e,e,h,a.image);a.generateMipmaps&&d&&r.generateMipmap(r.TEXTURE_2D);c.__version=a.version;if(a.onUpdate)a.onUpdate(a)}}else I.activeTexture(r.TEXTURE0+b),I.bindTexture(r.TEXTURE_2D,
+c.__webglTexture)};this.setRenderTarget=function(a){var b=a instanceof THREE.WebGLRenderTargetCube;if(a&&void 0===W.get(a).__webglFramebuffer){var c=W.get(a),d=W.get(a.texture);void 0===a.depthBuffer&&(a.depthBuffer=!0);void 0===a.stencilBuffer&&(a.stencilBuffer=!0);a.addEventListener("dispose",f);d.__webglTexture=r.createTexture();la.textures++;var e=y(a),g=N(a.texture.format),h=N(a.texture.type);if(b){c.__webglFramebuffer=[];c.__webglRenderbuffer=[];I.bindTexture(r.TEXTURE_CUBE_MAP,d.__webglTexture);
+x(r.TEXTURE_CUBE_MAP,a.texture,e);for(d=0;6>d;d++)c.__webglFramebuffer[d]=r.createFramebuffer(),c.__webglRenderbuffer[d]=r.createRenderbuffer(),I.texImage2D(r.TEXTURE_CUBE_MAP_POSITIVE_X+d,0,g,a.width,a.height,0,g,h,null),J(c.__webglFramebuffer[d],a,r.TEXTURE_CUBE_MAP_POSITIVE_X+d),F(c.__webglRenderbuffer[d],a);a.texture.generateMipmaps&&e&&r.generateMipmap(r.TEXTURE_CUBE_MAP)}else c.__webglFramebuffer=r.createFramebuffer(),c.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:
+r.createRenderbuffer(),I.bindTexture(r.TEXTURE_2D,d.__webglTexture),x(r.TEXTURE_2D,a.texture,e),I.texImage2D(r.TEXTURE_2D,0,g,a.width,a.height,0,g,h,null),J(c.__webglFramebuffer,a,r.TEXTURE_2D),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,c.__webglRenderbuffer):a.depthBuffer&&a.stencilBuffer&&r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,c.__webglRenderbuffer):F(c.__webglRenderbuffer,
+a),a.texture.generateMipmaps&&e&&r.generateMipmap(r.TEXTURE_2D);b?I.bindTexture(r.TEXTURE_CUBE_MAP,null):I.bindTexture(r.TEXTURE_2D,null);r.bindRenderbuffer(r.RENDERBUFFER,null);r.bindFramebuffer(r.FRAMEBUFFER,null)}a?(c=W.get(a),d=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,c=a.width,e=a.height,h=g=0):(d=null,c=pa,e=qa,g=na,h=oa);d!==za&&(r.bindFramebuffer(r.FRAMEBUFFER,d),r.viewport(g,h,c,e),za=d);b&&(d=W.get(a.texture),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,
+r.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,d.__webglTexture,0));Da=c;Ea=e};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(!1===a instanceof THREE.WebGLRenderTarget)console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");else{var g=W.get(a).__webglFramebuffer;if(g){var h=!1;g!==za&&(r.bindFramebuffer(r.FRAMEBUFFER,g),h=!0);try{var k=a.texture;k.format!==THREE.RGBAFormat&&N(k.format)!==r.getParameter(r.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):
+k.type===THREE.UnsignedByteType||N(k.type)===r.getParameter(r.IMPLEMENTATION_COLOR_READ_TYPE)||k.type===THREE.FloatType&&S.get("WEBGL_color_buffer_float")||k.type===THREE.HalfFloatType&&S.get("EXT_color_buffer_half_float")?r.checkFramebufferStatus(r.FRAMEBUFFER)===r.FRAMEBUFFER_COMPLETE?r.readPixels(b,c,d,e,N(k.format),N(k.type),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&
+r.bindFramebuffer(r.FRAMEBUFFER,za)}}}};this.supportsFloatTextures=function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return S.get("OES_texture_float")};this.supportsHalfFloatTextures=function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return S.get("OES_texture_half_float")};this.supportsStandardDerivatives=function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");
+return S.get("OES_standard_derivatives")};this.supportsCompressedTextureS3TC=function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return S.get("WEBGL_compressed_texture_s3tc")};this.supportsCompressedTexturePVRTC=function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return S.get("WEBGL_compressed_texture_pvrtc")};this.supportsBlendMinMax=
+function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return S.get("EXT_blend_minmax")};this.supportsVertexTextures=function(){return ha.vertexTextures};this.supportsInstancedArrays=function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return S.get("ANGLE_instanced_arrays")};this.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")};
+this.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")};this.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")};this.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")};Object.defineProperties(this,{shadowMapEnabled:{get:function(){return $.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");$.enabled=a}},
+shadowMapType:{get:function(){return $.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");$.type=a}},shadowMapCullFace:{get:function(){return $.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");$.cullFace=a}},shadowMapDebug:{get:function(){return $.debug},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapDebug is now .shadowMap.debug.");$.debug=a}}})};
+THREE.WebGLRenderTarget=function(a,b,c){this.uuid=THREE.Math.generateUUID();this.width=a;this.height=b;c=c||{};void 0===c.minFilter&&(c.minFilter=THREE.LinearFilter);this.texture=new THREE.Texture(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.shareDepthFrom=void 0!==c.shareDepthFrom?c.shareDepthFrom:null};
+THREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,get wrapS(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set wrapS(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a},get wrapT(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set wrapT(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a},
+get magFilter(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},set magFilter(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=a},get minFilter(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set minFilter(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a},get anisotropy(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");
+return this.texture.anisotropy},set anisotropy(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=a},get offset(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set offset(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a},get repeat(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set repeat(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");
+this.texture.repeat=a},get format(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");return this.texture.format},set format(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a},get type(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set type(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a},get generateMipmaps(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");
+return this.texture.generateMipmaps},set generateMipmaps(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a},setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose()},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.shareDepthFrom=
+a.shareDepthFrom;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype);THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;
+THREE.WebGLBufferRenderer=function(a,b,c){var d;this.setMode=function(a){d=a};this.render=function(b,g){a.drawArrays(d,b,g);c.calls++;c.vertices+=g;d===a.TRIANGLES&&(c.faces+=g/3)};this.renderInstances=function(a){var c=b.get("ANGLE_instanced_arrays");if(null===c)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{var f=a.attributes.position;f instanceof THREE.InterleavedBufferAttribute?c.drawArraysInstancedANGLE(d,
+0,f.data.count,a.maxInstancedCount):c.drawArraysInstancedANGLE(d,0,f.count,a.maxInstancedCount)}}};
+THREE.WebGLIndexedBufferRenderer=function(a,b,c){var d,e,g;this.setMode=function(a){d=a};this.setIndex=function(c){c.array instanceof Uint32Array&&b.get("OES_element_index_uint")?(e=a.UNSIGNED_INT,g=4):(e=a.UNSIGNED_SHORT,g=2)};this.render=function(b,h){a.drawElements(d,h,e,b*g);c.calls++;c.vertices+=h;d===a.TRIANGLES&&(c.faces+=h/3)};this.renderInstances=function(a){var c=b.get("ANGLE_instanced_arrays");null===c?console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):
+c.drawElementsInstancedANGLE(d,a.index.array.length,e,0,a.maxInstancedCount)}};
+THREE.WebGLExtensions=function(a){var b={};this.get=function(c){if(void 0!==b[c])return b[c];var d;switch(c){case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");
+break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}};
+THREE.WebGLCapabilities=function(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}this.getMaxPrecision=d;this.precision=void 0!==c.precision?c.precision:"highp";
+this.logarithmicDepthBuffer=void 0!==c.logarithmicDepthBuffer?c.logarithmicDepthBuffer:!1;this.maxTextures=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS);this.maxVertexTextures=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS);this.maxTextureSize=a.getParameter(a.MAX_TEXTURE_SIZE);this.maxCubemapSize=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE);this.maxAttributes=a.getParameter(a.MAX_VERTEX_ATTRIBS);this.maxVertexUniforms=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS);this.maxVaryings=a.getParameter(a.MAX_VARYING_VECTORS);
+this.maxFragmentUniforms=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS);this.vertexTextures=0<this.maxVertexTextures;this.floatFragmentTextures=!!b.get("OES_texture_float");this.floatVertexTextures=this.vertexTextures&&this.floatFragmentTextures;c=d(this.precision);c!==this.precision&&(console.warn("THREE.WebGLRenderer:",this.precision,"not supported, using",c,"instead."),this.precision=c);this.logarithmicDepthBuffer&&(this.logarithmicDepthBuffer=!!b.get("EXT_frag_depth"))};
+THREE.WebGLGeometries=function(a,b,c){function d(a){a=a.target;var h=g[a.id].attributes,l;for(l in h)e(h[l]);a.removeEventListener("dispose",d);delete g[a.id];l=b.get(a);l.wireframe&&e(l.wireframe);c.memory.geometries--}function e(c){var d;d=c instanceof THREE.InterleavedBufferAttribute?b.get(c.data).__webglBuffer:b.get(c).__webglBuffer;void 0!==d&&(a.deleteBuffer(d),c instanceof THREE.InterleavedBufferAttribute?b.delete(c.data):b.delete(c))}var g={};this.get=function(a){var b=a.geometry;if(void 0!==
+g[b.id])return g[b.id];b.addEventListener("dispose",d);var e;b instanceof THREE.BufferGeometry?e=b:b instanceof THREE.Geometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new THREE.BufferGeometry).setFromObject(a)),e=b._bufferGeometry);g[b.id]=e;c.memory.geometries++;return e}};
+THREE.WebGLObjects=function(a,b,c){function d(c,d){var e=c instanceof THREE.InterleavedBufferAttribute?c.data:c,g=b.get(e);void 0===g.__webglBuffer?(g.__webglBuffer=a.createBuffer(),a.bindBuffer(d,g.__webglBuffer),a.bufferData(d,e.array,e.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW),g.version=e.version):g.version!==e.version&&(a.bindBuffer(d,g.__webglBuffer),!1===e.dynamic||-1===e.updateRange.count?a.bufferSubData(d,0,e.array):0===e.updateRange.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):
+(a.bufferSubData(d,e.updateRange.offset*e.array.BYTES_PER_ELEMENT,e.array.subarray(e.updateRange.offset,e.updateRange.offset+e.updateRange.count)),e.updateRange.count=0),g.version=e.version)}function e(a,b,c){if(b>c){var d=b;b=c;c=d}d=a[b];return void 0===d?(a[b]=[c],!0):-1===d.indexOf(c)?(d.push(c),!0):!1}var g=new THREE.WebGLGeometries(a,b,c);this.getAttributeBuffer=function(a){return a instanceof THREE.InterleavedBufferAttribute?b.get(a.data).__webglBuffer:b.get(a).__webglBuffer};this.getWireframeAttribute=
+function(c){var g=b.get(c);if(void 0!==g.wireframe)return g.wireframe;var l=[],k=c.index,m=c.attributes;c=m.position;if(null!==k)for(var m={},k=k.array,p=0,n=k.length;p<n;p+=3){var q=k[p+0],s=k[p+1],t=k[p+2];e(m,q,s)&&l.push(q,s);e(m,s,t)&&l.push(s,t);e(m,t,q)&&l.push(t,q)}else for(k=m.position.array,p=0,n=k.length/3-1;p<n;p+=3)q=p+0,s=p+1,t=p+2,l.push(q,s,s,t,t,q);l=new THREE.BufferAttribute(new (65535<c.count?Uint32Array:Uint16Array)(l),1);d(l,a.ELEMENT_ARRAY_BUFFER);return g.wireframe=l};this.update=
+function(b){var c=g.get(b);b.geometry instanceof THREE.Geometry&&c.updateFromObject(b);b=c.index;var e=c.attributes;null!==b&&d(b,a.ELEMENT_ARRAY_BUFFER);for(var k in e)d(e[k],a.ARRAY_BUFFER);b=c.morphAttributes;for(k in b)for(var e=b[k],m=0,p=e.length;m<p;m++)d(e[m],a.ARRAY_BUFFER);return c}};
+THREE.WebGLProgram=function(){function a(a){var b=[],c;for(c in a){var f=a[c];!1!==f&&b.push("#define "+c+" "+f)}return b.join("\n")}function b(a){return""!==a}var c=0;return function(d,e,g,f){var h=d.context,l=g.defines,k=g.__webglShader.vertexShader,m=g.__webglShader.fragmentShader,p="SHADOWMAP_TYPE_BASIC";f.shadowMapType===THREE.PCFShadowMap?p="SHADOWMAP_TYPE_PCF":f.shadowMapType===THREE.PCFSoftShadowMap&&(p="SHADOWMAP_TYPE_PCF_SOFT");var n="ENVMAP_TYPE_CUBE",q="ENVMAP_MODE_REFLECTION",s="ENVMAP_BLENDING_MULTIPLY";
+if(f.envMap){switch(g.envMap.mapping){case THREE.CubeReflectionMapping:case THREE.CubeRefractionMapping:n="ENVMAP_TYPE_CUBE";break;case THREE.EquirectangularReflectionMapping:case THREE.EquirectangularRefractionMapping:n="ENVMAP_TYPE_EQUIREC";break;case THREE.SphericalReflectionMapping:n="ENVMAP_TYPE_SPHERE"}switch(g.envMap.mapping){case THREE.CubeRefractionMapping:case THREE.EquirectangularRefractionMapping:q="ENVMAP_MODE_REFRACTION"}switch(g.combine){case THREE.MultiplyOperation:s="ENVMAP_BLENDING_MULTIPLY";
+break;case THREE.MixOperation:s="ENVMAP_BLENDING_MIX";break;case THREE.AddOperation:s="ENVMAP_BLENDING_ADD"}}var t=0<d.gammaFactor?d.gammaFactor:1,v=a(l),u=h.createProgram();g instanceof THREE.RawShaderMaterial?d=l="":(l=["precision "+f.precision+" float;","precision "+f.precision+" int;","#define SHADER_NAME "+g.__webglShader.name,v,f.supportsVertexTextures?"#define VERTEX_TEXTURES":"",d.gammaInput?"#define GAMMA_INPUT":"",d.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+t,"#define MAX_DIR_LIGHTS "+
+f.maxDirLights,"#define MAX_POINT_LIGHTS "+f.maxPointLights,"#define MAX_SPOT_LIGHTS "+f.maxSpotLights,"#define MAX_HEMI_LIGHTS "+f.maxHemiLights,"#define MAX_SHADOWS "+f.maxShadows,"#define MAX_BONES "+f.maxBones,f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+q:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.displacementMap&&
+f.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.flatShading?"#define FLAT_SHADED":"",f.skinning?"#define USE_SKINNING":"",f.useVertexTexture?"#define BONE_TEXTURE":"",f.morphTargets?"#define USE_MORPHTARGETS":"",f.morphNormals&&!1===f.flatShading?"#define USE_MORPHNORMALS":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?
+"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+p:"",f.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",0<f.pointLightShadows?"#define POINT_LIGHT_SHADOWS":"",f.sizeAttenuation?"#define USE_SIZEATTENUATION":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&d.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;",
+"uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;",
+"\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(b).join("\n"),d=[f.bumpMap||f.normalMap||f.flatShading||g.derivatives?"#extension GL_OES_standard_derivatives : enable":"",f.logarithmicDepthBuffer&&d.extensions.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"","precision "+f.precision+" float;","precision "+
+f.precision+" int;","#define SHADER_NAME "+g.__webglShader.name,v,"#define MAX_DIR_LIGHTS "+f.maxDirLights,"#define MAX_POINT_LIGHTS "+f.maxPointLights,"#define MAX_SPOT_LIGHTS "+f.maxSpotLights,"#define MAX_HEMI_LIGHTS "+f.maxHemiLights,"#define MAX_SHADOWS "+f.maxShadows,f.alphaTest?"#define ALPHATEST "+f.alphaTest:"",d.gammaInput?"#define GAMMA_INPUT":"",d.gammaOutput?"#define GAMMA_OUTPUT":"","#define GAMMA_FACTOR "+t,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp?"#define FOG_EXP2":
+"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+n:"",f.envMap?"#define "+q:"",f.envMap?"#define "+s:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.flatShading?"#define FLAT_SHADED":"",f.metal?"#define METAL":
+"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+p:"",f.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",0<f.pointLightShadows?"#define POINT_LIGHT_SHADOWS":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&d.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","\n"].filter(b).join("\n"));m=d+m;
+k=THREE.WebGLShader(h,h.VERTEX_SHADER,l+k);m=THREE.WebGLShader(h,h.FRAGMENT_SHADER,m);h.attachShader(u,k);h.attachShader(u,m);void 0!==g.index0AttributeName?h.bindAttribLocation(u,0,g.index0AttributeName):!0===f.morphTargets&&h.bindAttribLocation(u,0,"position");h.linkProgram(u);f=h.getProgramInfoLog(u);p=h.getShaderInfoLog(k);n=h.getShaderInfoLog(m);s=q=!0;if(!1===h.getProgramParameter(u,h.LINK_STATUS))q=!1,console.error("THREE.WebGLProgram: shader error: ",h.getError(),"gl.VALIDATE_STATUS",h.getProgramParameter(u,
+h.VALIDATE_STATUS),"gl.getProgramInfoLog",f,p,n);else if(""!==f)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",f);else if(""===p||""===n)s=!1;s&&(this.diagnostics={runnable:q,material:g,programLog:f,vertexShader:{log:p,prefix:l},fragmentShader:{log:n,prefix:d}});h.deleteShader(k);h.deleteShader(m);var w;this.getUniforms=function(){if(void 0===w){for(var a={},b=h.getProgramParameter(u,h.ACTIVE_UNIFORMS),c=0;c<b;c++){var d=h.getActiveUniform(u,c).name,e=h.getUniformLocation(u,d),f=d.lastIndexOf("[0]");
+-1!==f&&f===d.length-3&&(a[d.substr(0,f)]=e);a[d]=e}w=a}return w};var D;this.getAttributes=function(){if(void 0===D){for(var a={},b=h.getProgramParameter(u,h.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=h.getActiveAttrib(u,c).name;a[d]=h.getAttribLocation(u,d)}D=a}return D};this.destroy=function(){h.deleteProgram(u);this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");
+return this.getAttributes()}}});this.id=c++;this.code=e;this.usedTimes=1;this.program=u;this.vertexShader=k;this.fragmentShader=m;return this}}();
+THREE.WebGLPrograms=function(a,b){var c=[],d={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},e="precision supportsVertexTextures map envMap envMapMode lightMap aoMap emissiveMap bumpMap normalMap displacementMap specularMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals maxDirLights maxPointLights maxSpotLights maxHemiLights maxShadows shadowMapEnabled pointLightShadows shadowMapType shadowMapDebug alphaTest metal doubleSided flipSided".split(" ");this.getParameters=
+function(c,e,h,l){var k,m,p,n,q,s=d[c.type];k=q=n=p=m=0;for(var t=e.length;k<t;k++){var v=e[k];!1!==v.visible&&(v instanceof THREE.DirectionalLight&&m++,v instanceof THREE.PointLight&&p++,v instanceof THREE.SpotLight&&n++,v instanceof THREE.HemisphereLight&&q++)}for(var v=k=t=0,u=e.length;v<u;v++){var w=e[v];w.castShadow&&((w instanceof THREE.SpotLight||w instanceof THREE.DirectionalLight)&&t++,w instanceof THREE.PointLight&&(t++,k++))}e=t;b.floatVertexTextures&&l&&l.skeleton&&l.skeleton.useVertexTexture?
+t=1024:(t=Math.floor((b.maxVertexUniforms-20)/4),void 0!==l&&l instanceof THREE.SkinnedMesh&&(t=Math.min(l.skeleton.bones.length,t),t<l.skeleton.bones.length&&console.warn("WebGLRenderer: too many bones - "+l.skeleton.bones.length+", this GPU supports just "+t+" (try OpenGL instead of ANGLE)")));v=a.getPrecision();null!==c.precision&&(v=b.getMaxPrecision(c.precision),v!==c.precision&&console.warn("THREE.WebGLRenderer.initMaterial:",c.precision,"not supported, using",v,"instead."));return{shaderID:s,
+precision:v,supportsVertexTextures:b.vertexTextures,map:!!c.map,envMap:!!c.envMap,envMapMode:c.envMap&&c.envMap.mapping,lightMap:!!c.lightMap,aoMap:!!c.aoMap,emissiveMap:!!c.emissiveMap,bumpMap:!!c.bumpMap,normalMap:!!c.normalMap,displacementMap:!!c.displacementMap,specularMap:!!c.specularMap,alphaMap:!!c.alphaMap,combine:c.combine,vertexColors:c.vertexColors,fog:h,useFog:c.fog,fogExp:h instanceof THREE.FogExp2,flatShading:c.shading===THREE.FlatShading,sizeAttenuation:c.sizeAttenuation,logarithmicDepthBuffer:b.logarithmicDepthBuffer,
+skinning:c.skinning,maxBones:t,useVertexTexture:b.floatVertexTextures&&l&&l.skeleton&&l.skeleton.useVertexTexture,morphTargets:c.morphTargets,morphNormals:c.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,maxDirLights:m,maxPointLights:p,maxSpotLights:n,maxHemiLights:q,maxShadows:e,pointLightShadows:k,shadowMapEnabled:a.shadowMap.enabled&&l.receiveShadow&&0<e,shadowMapType:a.shadowMap.type,shadowMapDebug:a.shadowMap.debug,alphaTest:c.alphaTest,metal:c.metal,doubleSided:c.side===
+THREE.DoubleSide,flipSided:c.side===THREE.BackSide}};this.getProgramCode=function(a,b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(a.fragmentShader),c.push(a.vertexShader));if(void 0!==a.defines)for(var d in a.defines)c.push(d),c.push(a.defines[d]);for(d=0;d<e.length;d++){var k=e[d];c.push(k);c.push(b[k])}return c.join()};this.acquireProgram=function(b,d,e){for(var l,k=0,m=c.length;k<m;k++){var p=c[k];if(p.code===e){l=p;++l.usedTimes;break}}void 0===l&&(l=new THREE.WebGLProgram(a,e,b,d),c.push(l));
+return l};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=c.indexOf(a);c[b]=c[c.length-1];c.pop();a.destroy()}};this.programs=c};THREE.WebGLProperties=function(){var a={};this.get=function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c};this.delete=function(b){delete a[b.uuid]};this.clear=function(){a={}}};
+THREE.WebGLShader=function(){function a(a){a=a.split("\n");for(var c=0;c<a.length;c++)a[c]=c+1+": "+a[c];return a.join("\n")}return function(b,c,d){var e=b.createShader(c);b.shaderSource(e,d);b.compileShader(e);!1===b.getShaderParameter(e,b.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");""!==b.getShaderInfoLog(e)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",c===b.VERTEX_SHADER?"vertex":"fragment",b.getShaderInfoLog(e),a(d));return e}}();
+THREE.WebGLShadowMap=function(a,b,c){function d(a,b,c,d){var e=a.geometry,f=null,f=n,g=a.customDepthMaterial;c&&(f=q,g=a.customDistanceMaterial);g?f=g:(a=a instanceof THREE.SkinnedMesh&&b.skinning,g=0,void 0!==e.morphTargets&&0<e.morphTargets.length&&b.morphTargets&&(g|=1),a&&(g|=2),f=f[g]);f.visible=b.visible;f.wireframe=b.wireframe;f.wireframeLinewidth=b.wireframeLinewidth;c&&void 0!==f.uniforms.lightPos&&f.uniforms.lightPos.value.copy(d);return f}function e(a,b){if(!1!==a.visible){(a instanceof
+THREE.Mesh||a instanceof THREE.Line||a instanceof THREE.Points)&&a.castShadow&&(!1===a.frustumCulled||!0===h.intersectsObject(a))&&!0===a.material.visible&&(a.modelViewMatrix.multiplyMatrices(b.matrixWorldInverse,a.matrixWorld),p.push(a));for(var c=a.children,d=0,f=c.length;d<f;d++)e(c[d],b)}}var g=a.context,f=a.state,h=new THREE.Frustum,l=new THREE.Matrix4;new THREE.Vector3;new THREE.Vector3;for(var k=new THREE.Vector3,m=new THREE.Vector3,p=[],n=Array(4),q=Array(4),s=[new THREE.Vector3(1,0,0),new THREE.Vector3(-1,
+0,0),new THREE.Vector3(0,0,1),new THREE.Vector3(0,0,-1),new THREE.Vector3(0,1,0),new THREE.Vector3(0,-1,0)],t=[new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,1,0),new THREE.Vector3(0,0,1),new THREE.Vector3(0,0,-1)],v=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4],u=new THREE.Vector4,w=THREE.ShaderLib.depthRGBA,D=THREE.UniformsUtils.clone(w.uniforms),x=THREE.ShaderLib.distanceRGBA,B=THREE.UniformsUtils.clone(x.uniforms),
+y=0;4!==y;++y){var z=0!==(y&1),A=0!==(y&2),J=new THREE.ShaderMaterial({uniforms:D,vertexShader:w.vertexShader,fragmentShader:w.fragmentShader,morphTargets:z,skinning:A});J._shadowPass=!0;n[y]=J;z=new THREE.ShaderMaterial({uniforms:B,vertexShader:x.vertexShader,fragmentShader:x.fragmentShader,morphTargets:z,skinning:A});z._shadowPass=!0;q[y]=z}var F=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=THREE.PCFShadowMap;this.cullFace=THREE.CullFaceFront;this.render=function(n){var q,
+w;if(!1!==F.enabled&&(!1!==F.autoUpdate||!1!==F.needsUpdate)){g.clearColor(1,1,1,1);f.disable(g.BLEND);f.enable(g.CULL_FACE);g.frontFace(g.CCW);g.cullFace(F.cullFace===THREE.CullFaceFront?g.FRONT:g.BACK);f.setDepthTest(!0);a.getViewport(u);for(var x=0,D=b.length;x<D;x++){var y=b[x];if(!0===y.castShadow){var z=y.shadow,B=z.camera,A=z.mapSize;if(y instanceof THREE.PointLight){q=6;w=!0;var H=A.x/4,J=A.y/2;v[0].set(2*H,J,H,J);v[1].set(0,J,H,J);v[2].set(3*H,J,H,J);v[3].set(H,J,H,J);v[4].set(3*H,0,H,J);
+v[5].set(H,0,H,J)}else q=1,w=!1;null===z.map&&(H=THREE.LinearFilter,F.type===THREE.PCFSoftShadowMap&&(H=THREE.NearestFilter),z.map=new THREE.WebGLRenderTarget(A.x,A.y,{minFilter:H,magFilter:H,format:THREE.RGBAFormat}),z.matrix=new THREE.Matrix4,y instanceof THREE.SpotLight&&(B.aspect=A.x/A.y),B.updateProjectionMatrix());A=z.map;z=z.matrix;m.setFromMatrixPosition(y.matrixWorld);B.position.copy(m);a.setRenderTarget(A);a.clear();for(A=0;A<q;A++)for(w?(k.copy(B.position),k.add(s[A]),B.up.copy(t[A]),B.lookAt(k),
+H=v[A],a.setViewport(H.x,H.y,H.z,H.w)):(k.setFromMatrixPosition(y.target.matrixWorld),B.lookAt(k)),B.updateMatrixWorld(),B.matrixWorldInverse.getInverse(B.matrixWorld),z.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),z.multiply(B.projectionMatrix),z.multiply(B.matrixWorldInverse),l.multiplyMatrices(B.projectionMatrix,B.matrixWorldInverse),h.setFromMatrix(l),p.length=0,e(n,B),H=0,J=p.length;H<J;H++){var G=p[H],ia=c.update(G),U=G.material;if(U instanceof THREE.MeshFaceMaterial)for(var X=ia.groups,U=U.materials,
+da=0,ca=X.length;da<ca;da++){var ga=X[da],Z=U[ga.materialIndex];!0===Z.visible&&(Z=d(G,Z,w,m),a.renderBufferDirect(B,b,null,ia,Z,G,ga))}else Z=d(G,U,w,m),a.renderBufferDirect(B,b,null,ia,Z,G,null)}a.resetGLState()}}a.setViewport(u.x,u.y,u.z,u.w);n=a.getClearColor();q=a.getClearAlpha();a.setClearColor(n,q);f.enable(g.BLEND);F.cullFace===THREE.CullFaceFront&&g.cullFace(g.BACK);a.resetGLState();F.needsUpdate=!1}}};
+THREE.WebGLState=function(a,b,c){var d=this,e=new Uint8Array(16),g=new Uint8Array(16),f=new Uint8Array(16),h={},l=null,k=null,m=null,p=null,n=null,q=null,s=null,t=null,v=null,u=null,w=null,D=null,x=null,B=null,y=null,z=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),A=void 0,J={};this.init=function(){a.clearColor(0,0,0,1);a.clearDepth(1);a.clearStencil(0);this.enable(a.DEPTH_TEST);a.depthFunc(a.LEQUAL);a.frontFace(a.CCW);a.cullFace(a.BACK);this.enable(a.CULL_FACE);this.enable(a.BLEND);a.blendEquation(a.FUNC_ADD);
+a.blendFunc(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA)};this.initAttributes=function(){for(var a=0,b=e.length;a<b;a++)e[a]=0};this.enableAttribute=function(c){e[c]=1;0===g[c]&&(a.enableVertexAttribArray(c),g[c]=1);0!==f[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,0),f[c]=0)};this.enableAttributeAndDivisor=function(b,c,d){e[b]=1;0===g[b]&&(a.enableVertexAttribArray(b),g[b]=1);f[b]!==c&&(d.vertexAttribDivisorANGLE(b,c),f[b]=c)};this.disableUnusedAttributes=function(){for(var b=0,c=g.length;b<
+c;b++)g[b]!==e[b]&&(a.disableVertexAttribArray(b),g[b]=0)};this.enable=function(b){!0!==h[b]&&(a.enable(b),h[b]=!0)};this.disable=function(b){!1!==h[b]&&(a.disable(b),h[b]=!1)};this.getCompressedTextureFormats=function(){if(null===l&&(l=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)l.push(c[d]);return l};this.setBlending=function(b,d,e,f,g,h,l){b!==k&&(b===THREE.NoBlending?this.disable(a.BLEND):
+b===THREE.AdditiveBlending?(this.enable(a.BLEND),a.blendEquation(a.FUNC_ADD),a.blendFunc(a.SRC_ALPHA,a.ONE)):b===THREE.SubtractiveBlending?(this.enable(a.BLEND),a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR)):b===THREE.MultiplyBlending?(this.enable(a.BLEND),a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR)):b===THREE.CustomBlending?this.enable(a.BLEND):(this.enable(a.BLEND),a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,
+a.ONE,a.ONE_MINUS_SRC_ALPHA)),k=b);if(b===THREE.CustomBlending){g=g||d;h=h||e;l=l||f;if(d!==m||g!==q)a.blendEquationSeparate(c(d),c(g)),m=d,q=g;if(e!==p||f!==n||h!==s||l!==t)a.blendFuncSeparate(c(e),c(f),c(h),c(l)),p=e,n=f,s=h,t=l}else t=s=q=n=p=m=null};this.setDepthFunc=function(b){if(v!==b){if(b)switch(b){case THREE.NeverDepth:a.depthFunc(a.NEVER);break;case THREE.AlwaysDepth:a.depthFunc(a.ALWAYS);break;case THREE.LessDepth:a.depthFunc(a.LESS);break;case THREE.LessEqualDepth:a.depthFunc(a.LEQUAL);
+break;case THREE.EqualDepth:a.depthFunc(a.EQUAL);break;case THREE.GreaterEqualDepth:a.depthFunc(a.GEQUAL);break;case THREE.GreaterDepth:a.depthFunc(a.GREATER);break;case THREE.NotEqualDepth:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);v=b}};this.setDepthTest=function(b){b?this.enable(a.DEPTH_TEST):this.disable(a.DEPTH_TEST)};this.setDepthWrite=function(b){u!==b&&(a.depthMask(b),u=b)};this.setColorWrite=function(b){w!==b&&(a.colorMask(b,b,b,b),w=b)};this.setFlipSided=
+function(b){D!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),D=b)};this.setLineWidth=function(b){b!==x&&(a.lineWidth(b),x=b)};this.setPolygonOffset=function(b,c,d){b?this.enable(a.POLYGON_OFFSET_FILL):this.disable(a.POLYGON_OFFSET_FILL);!b||B===c&&y===d||(a.polygonOffset(c,d),B=c,y=d)};this.setScissorTest=function(b){b?this.enable(a.SCISSOR_TEST):this.disable(a.SCISSOR_TEST)};this.activeTexture=function(b){void 0===b&&(b=a.TEXTURE0+z-1);A!==b&&(a.activeTexture(b),A=b)};this.bindTexture=function(b,c){void 0===
+A&&d.activeTexture();var e=J[A];void 0===e&&(e={type:void 0,texture:void 0},J[A]=e);if(e.type!==b||e.texture!==c)a.bindTexture(b,c),e.type=b,e.texture=c};this.compressedTexImage2D=function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(b){console.error(b)}};this.texImage2D=function(){try{a.texImage2D.apply(a,arguments)}catch(b){console.error(b)}};this.reset=function(){for(var b=0;b<g.length;b++)1===g[b]&&(a.disableVertexAttribArray(b),g[b]=0);h={};D=w=u=k=l=null}};
+THREE.LensFlarePlugin=function(a,b){var c,d,e,g,f,h,l,k,m,p,n=a.context,q=a.state,s,t,v,u,w,D;this.render=function(x,B,y,z){if(0!==b.length){x=new THREE.Vector3;var A=z/y,J=.5*y,F=.5*z,C=16/z,N=new THREE.Vector2(C*A,C),L=new THREE.Vector3(1,1,0),Q=new THREE.Vector2(1,1);if(void 0===v){var C=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),M=new Uint16Array([0,1,2,0,2,3]);s=n.createBuffer();t=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,s);n.bufferData(n.ARRAY_BUFFER,C,n.STATIC_DRAW);n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,
+t);n.bufferData(n.ELEMENT_ARRAY_BUFFER,M,n.STATIC_DRAW);w=n.createTexture();D=n.createTexture();q.bindTexture(n.TEXTURE_2D,w);n.texImage2D(n.TEXTURE_2D,0,n.RGB,16,16,0,n.RGB,n.UNSIGNED_BYTE,null);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST);q.bindTexture(n.TEXTURE_2D,D);n.texImage2D(n.TEXTURE_2D,0,
+n.RGBA,16,16,0,n.RGBA,n.UNSIGNED_BYTE,null);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST);var C=(u=0<n.getParameter(n.MAX_VERTEX_TEXTURE_IMAGE_UNITS))?{vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif ( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility =        visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *=       visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
+fragmentShader:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif ( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if ( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"}:{vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif ( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
+fragmentShader:"precision mediump float;\nuniform lowp int renderType;\nuniform sampler2D map;\nuniform sampler2D occlusionMap;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvoid main() {\nif ( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if ( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a;\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * visibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"},
+M=n.createProgram(),K=n.createShader(n.FRAGMENT_SHADER),E=n.createShader(n.VERTEX_SHADER),O="precision "+a.getPrecision()+" float;\n";n.shaderSource(K,O+C.fragmentShader);n.shaderSource(E,O+C.vertexShader);n.compileShader(K);n.compileShader(E);n.attachShader(M,K);n.attachShader(M,E);n.linkProgram(M);v=M;m=n.getAttribLocation(v,"position");p=n.getAttribLocation(v,"uv");c=n.getUniformLocation(v,"renderType");d=n.getUniformLocation(v,"map");e=n.getUniformLocation(v,"occlusionMap");g=n.getUniformLocation(v,
+"opacity");f=n.getUniformLocation(v,"color");h=n.getUniformLocation(v,"scale");l=n.getUniformLocation(v,"rotation");k=n.getUniformLocation(v,"screenPosition")}n.useProgram(v);q.initAttributes();q.enableAttribute(m);q.enableAttribute(p);q.disableUnusedAttributes();n.uniform1i(e,0);n.uniform1i(d,1);n.bindBuffer(n.ARRAY_BUFFER,s);n.vertexAttribPointer(m,2,n.FLOAT,!1,16,0);n.vertexAttribPointer(p,2,n.FLOAT,!1,16,8);n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,t);q.disable(n.CULL_FACE);n.depthMask(!1);M=0;for(K=
+b.length;M<K;M++)if(C=16/z,N.set(C*A,C),E=b[M],x.set(E.matrixWorld.elements[12],E.matrixWorld.elements[13],E.matrixWorld.elements[14]),x.applyMatrix4(B.matrixWorldInverse),x.applyProjection(B.projectionMatrix),L.copy(x),Q.x=L.x*J+J,Q.y=L.y*F+F,u||0<Q.x&&Q.x<y&&0<Q.y&&Q.y<z){q.activeTexture(n.TEXTURE0);q.bindTexture(n.TEXTURE_2D,null);q.activeTexture(n.TEXTURE1);q.bindTexture(n.TEXTURE_2D,w);n.copyTexImage2D(n.TEXTURE_2D,0,n.RGB,Q.x-8,Q.y-8,16,16,0);n.uniform1i(c,0);n.uniform2f(h,N.x,N.y);n.uniform3f(k,
+L.x,L.y,L.z);q.disable(n.BLEND);q.enable(n.DEPTH_TEST);n.drawElements(n.TRIANGLES,6,n.UNSIGNED_SHORT,0);q.activeTexture(n.TEXTURE0);q.bindTexture(n.TEXTURE_2D,D);n.copyTexImage2D(n.TEXTURE_2D,0,n.RGBA,Q.x-8,Q.y-8,16,16,0);n.uniform1i(c,1);q.disable(n.DEPTH_TEST);q.activeTexture(n.TEXTURE1);q.bindTexture(n.TEXTURE_2D,w);n.drawElements(n.TRIANGLES,6,n.UNSIGNED_SHORT,0);E.positionScreen.copy(L);E.customUpdateCallback?E.customUpdateCallback(E):E.updateLensFlares();n.uniform1i(c,2);q.enable(n.BLEND);for(var O=
+0,T=E.lensFlares.length;O<T;O++){var H=E.lensFlares[O];.001<H.opacity&&.001<H.scale&&(L.x=H.x,L.y=H.y,L.z=H.z,C=H.size*H.scale/z,N.x=C*A,N.y=C,n.uniform3f(k,L.x,L.y,L.z),n.uniform2f(h,N.x,N.y),n.uniform1f(l,H.rotation),n.uniform1f(g,H.opacity),n.uniform3f(f,H.color.r,H.color.g,H.color.b),q.setBlending(H.blending,H.blendEquation,H.blendSrc,H.blendDst),a.setTexture(H.texture,1),n.drawElements(n.TRIANGLES,6,n.UNSIGNED_SHORT,0))}}q.enable(n.CULL_FACE);q.enable(n.DEPTH_TEST);n.depthMask(!0);a.resetGLState()}}};
+THREE.SpritePlugin=function(a,b){var c,d,e,g,f,h,l,k,m,p,n,q,s,t,v,u,w;function D(a,b){return a.z!==b.z?b.z-a.z:b.id-a.id}var x=a.context,B=a.state,y,z,A,J,F=new THREE.Vector3,C=new THREE.Quaternion,N=new THREE.Vector3;this.render=function(L,Q){if(0!==b.length){if(void 0===A){var M=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),K=new Uint16Array([0,1,2,0,2,3]);y=x.createBuffer();z=x.createBuffer();x.bindBuffer(x.ARRAY_BUFFER,y);x.bufferData(x.ARRAY_BUFFER,M,x.STATIC_DRAW);x.bindBuffer(x.ELEMENT_ARRAY_BUFFER,
+z);x.bufferData(x.ELEMENT_ARRAY_BUFFER,K,x.STATIC_DRAW);var M=x.createProgram(),K=x.createShader(x.VERTEX_SHADER),E=x.createShader(x.FRAGMENT_SHADER);x.shaderSource(K,["precision "+a.getPrecision()+" float;","uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n"));
+x.shaderSource(E,["precision "+a.getPrecision()+" float;","uniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n"));
+x.compileShader(K);x.compileShader(E);x.attachShader(M,K);x.attachShader(M,E);x.linkProgram(M);A=M;u=x.getAttribLocation(A,"position");w=x.getAttribLocation(A,"uv");c=x.getUniformLocation(A,"uvOffset");d=x.getUniformLocation(A,"uvScale");e=x.getUniformLocation(A,"rotation");g=x.getUniformLocation(A,"scale");f=x.getUniformLocation(A,"color");h=x.getUniformLocation(A,"map");l=x.getUniformLocation(A,"opacity");k=x.getUniformLocation(A,"modelViewMatrix");m=x.getUniformLocation(A,"projectionMatrix");p=
+x.getUniformLocation(A,"fogType");n=x.getUniformLocation(A,"fogDensity");q=x.getUniformLocation(A,"fogNear");s=x.getUniformLocation(A,"fogFar");t=x.getUniformLocation(A,"fogColor");v=x.getUniformLocation(A,"alphaTest");M=document.createElement("canvas");M.width=8;M.height=8;K=M.getContext("2d");K.fillStyle="white";K.fillRect(0,0,8,8);J=new THREE.Texture(M);J.needsUpdate=!0}x.useProgram(A);B.initAttributes();B.enableAttribute(u);B.enableAttribute(w);B.disableUnusedAttributes();B.disable(x.CULL_FACE);
+B.enable(x.BLEND);x.bindBuffer(x.ARRAY_BUFFER,y);x.vertexAttribPointer(u,2,x.FLOAT,!1,16,0);x.vertexAttribPointer(w,2,x.FLOAT,!1,16,8);x.bindBuffer(x.ELEMENT_ARRAY_BUFFER,z);x.uniformMatrix4fv(m,!1,Q.projectionMatrix.elements);B.activeTexture(x.TEXTURE0);x.uniform1i(h,0);K=M=0;(E=L.fog)?(x.uniform3f(t,E.color.r,E.color.g,E.color.b),E instanceof THREE.Fog?(x.uniform1f(q,E.near),x.uniform1f(s,E.far),x.uniform1i(p,1),K=M=1):E instanceof THREE.FogExp2&&(x.uniform1f(n,E.density),x.uniform1i(p,2),K=M=2)):
+(x.uniform1i(p,0),K=M=0);for(var E=0,O=b.length;E<O;E++){var T=b[E];T.modelViewMatrix.multiplyMatrices(Q.matrixWorldInverse,T.matrixWorld);T.z=-T.modelViewMatrix.elements[14]}b.sort(D);for(var H=[],E=0,O=b.length;E<O;E++){var T=b[E],R=T.material;x.uniform1f(v,R.alphaTest);x.uniformMatrix4fv(k,!1,T.modelViewMatrix.elements);T.matrixWorld.decompose(F,C,N);H[0]=N.x;H[1]=N.y;T=0;L.fog&&R.fog&&(T=K);M!==T&&(x.uniform1i(p,T),M=T);null!==R.map?(x.uniform2f(c,R.map.offset.x,R.map.offset.y),x.uniform2f(d,
+R.map.repeat.x,R.map.repeat.y)):(x.uniform2f(c,0,0),x.uniform2f(d,1,1));x.uniform1f(l,R.opacity);x.uniform3f(f,R.color.r,R.color.g,R.color.b);x.uniform1f(e,R.rotation);x.uniform2fv(g,H);B.setBlending(R.blending,R.blendEquation,R.blendSrc,R.blendDst);B.setDepthTest(R.depthTest);B.setDepthWrite(R.depthWrite);R.map&&R.map.image&&R.map.image.width?a.setTexture(R.map,0):a.setTexture(J,0);x.drawElements(x.TRIANGLES,6,x.UNSIGNED_SHORT,0)}B.enable(x.CULL_FACE);a.resetGLState()}}};
+THREE.CurveUtils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a,b,c,d,e){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){a=.5*(c-a);d=.5*(d-b);var g=e*e;return(2*b-2*c+a+d)*e*g+(-3*b+3*c-2*a-d)*g+a*e+b}};
+THREE.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");var d;b instanceof THREE.Mesh&&(b.matrixAutoUpdate&&b.updateMatrix(),d=b.matrix,b=b.geometry);a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};
+THREE.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture is being deprecated. Use THREE.TextureLoader() instead.");var e=new THREE.TextureLoader;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube is being deprecated. Use THREE.CubeTextureLoader() instead.");var e=new THREE.CubeTextureLoader;e.setCrossOrigin(this.crossOrigin);a=e.load(a,
+c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}};
+THREE.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new THREE.Group,d=0,e=b.length;d<e;d++)c.add(new THREE.Mesh(a,b[d]));return c},detach:function(a,b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new THREE.Matrix4;d.getInverse(c.matrixWorld);a.applyMatrix(d);b.remove(a);c.add(a)}};
+THREE.ShapeUtils={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],g=[],f,h,l;if(0<THREE.ShapeUtils.area(a))for(h=0;h<c;h++)e[h]=h;else for(h=0;h<c;h++)e[h]=c-1-h;var k=2*c;for(h=c-1;2<c;){if(0>=k--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}f=h;c<=f&&(f=0);h=f+1;c<=h&&(h=0);l=h+1;c<=l&&(l=0);var m;a:{var p=
+m=void 0,n=void 0,q=void 0,s=void 0,t=void 0,v=void 0,u=void 0,w=void 0,p=a[e[f]].x,n=a[e[f]].y,q=a[e[h]].x,s=a[e[h]].y,t=a[e[l]].x,v=a[e[l]].y;if(Number.EPSILON>(q-p)*(v-n)-(s-n)*(t-p))m=!1;else{var D=void 0,x=void 0,B=void 0,y=void 0,z=void 0,A=void 0,J=void 0,F=void 0,C=void 0,N=void 0,C=F=J=w=u=void 0,D=t-q,x=v-s,B=p-t,y=n-v,z=q-p,A=s-n;for(m=0;m<c;m++)if(u=a[e[m]].x,w=a[e[m]].y,!(u===p&&w===n||u===q&&w===s||u===t&&w===v)&&(J=u-p,F=w-n,C=u-q,N=w-s,u-=t,w-=v,C=D*N-x*C,J=z*F-A*J,F=B*w-y*u,C>=-Number.EPSILON&&
+F>=-Number.EPSILON&&J>=-Number.EPSILON)){m=!1;break a}m=!0}}if(m){d.push([a[e[f]],a[e[h]],a[e[l]]]);g.push([e[f],e[h],e[l]]);f=h;for(l=h+1;l<c;f++,l++)e[f]=e[l];c--;k=2*c}}return b?g:d}}(),triangulateShape:function(a,b){function c(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function d(a,b,d,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-d.x,l=e.y-d.y,m=a.x-d.x,p=a.y-d.y,z=h*k-g*l,A=h*m-g*p;if(Math.abs(z)>Number.EPSILON){if(0<z){if(0>A||A>
+z)return[];k=l*m-k*p;if(0>k||k>z)return[]}else{if(0<A||A<z)return[];k=l*m-k*p;if(0<k||k<z)return[]}if(0===k)return!f||0!==A&&A!==z?[a]:[];if(k===z)return!f||0!==A&&A!==z?[b]:[];if(0===A)return[d];if(A===z)return[e];f=k/z;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==A||l*m!==k*p)return[];h=0===g&&0===h;k=0===k&&0===l;if(h&&k)return a.x!==d.x||a.y!==d.y?[]:[a];if(h)return c(d,e,a)?[a]:[];if(k)return c(a,b,d)?[d]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),d.x<e.x?(b=d,z=d.x,l=e,d=e.x):(b=
+e,z=e.x,l=d,d=d.x)):(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),d.y<e.y?(b=d,z=d.y,l=e,d=e.y):(b=e,z=e.y,l=d,d=d.y));return k<=z?a<z?[]:a===z?f?[]:[b]:a<=d?[b,h]:[b,l]:k>d?[]:k===d?f?[]:[g]:a<=d?[g,h]:[g,l]}function e(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}var g,f,h,l,k,m={};h=a.concat();g=0;for(f=b.length;g<f;g++)Array.prototype.push.apply(h,b[g]);g=0;for(f=
+h.length;g<f;g++)k=h[g].x+":"+h[g].y,void 0!==m[k]&&console.warn("THREE.Shape: Duplicate point",k),m[k]=g;g=function(a,b){function c(a,b){var d=h.length-1,f=a-1;0>f&&(f=d);var g=a+1;g>d&&(g=0);d=e(h[a],h[f],h[g],k[b]);if(!d)return!1;d=k.length-1;f=b-1;0>f&&(f=d);g=b+1;g>d&&(g=0);return(d=e(k[b],k[f],k[g],h[a]))?!0:!1}function f(a,b){var c,e;for(c=0;c<h.length;c++)if(e=c+1,e%=h.length,e=d(a,b,h[c],h[e],!0),0<e.length)return!0;return!1}function g(a,c){var e,f,h,k;for(e=0;e<l.length;e++)for(f=b[l[e]],
+h=0;h<f.length;h++)if(k=h+1,k%=f.length,k=d(a,c,f[h],f[k],!0),0<k.length)return!0;return!1}var h=a.concat(),k,l=[],m,p,y,z,A,J=[],F,C,N,L=0;for(m=b.length;L<m;L++)l.push(L);F=0;for(var Q=2*l.length;0<l.length;){Q--;if(0>Q){console.log("Infinite Loop! Holes left:"+l.length+", Probably Hole outside Shape!");break}for(p=F;p<h.length;p++){y=h[p];m=-1;for(L=0;L<l.length;L++)if(z=l[L],A=y.x+":"+y.y+":"+z,void 0===J[A]){k=b[z];for(C=0;C<k.length;C++)if(z=k[C],c(p,C)&&!f(y,z)&&!g(y,z)){m=C;l.splice(L,1);
+F=h.slice(0,p+1);z=h.slice(p);C=k.slice(m);N=k.slice(0,m+1);h=F.concat(C).concat(N).concat(z);F=p;break}if(0<=m)break;J[A]=!0}if(0<=m)break}}return h}(a,b);var p=THREE.ShapeUtils.triangulate(g,!1);g=0;for(f=p.length;g<f;g++)for(l=p[g],h=0;3>h;h++)k=l[h].x+":"+l[h].y,k=m[k],void 0!==k&&(l[h]=k);return p.concat()},isClockWise:function(a){return 0>THREE.ShapeUtils.area(a)},b2:function(){return function(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}}(),b3:function(){return function(a,b,c,d,e){var g=
+1-a,f=1-a;return g*g*g*b+3*f*f*a*c+3*(1-a)*a*a*d+a*a*a*e}}()};THREE.Audio=function(a){THREE.Object3D.call(this);this.type="Audio";this.context=a.context;this.source=this.context.createBufferSource();this.source.onended=this.onEnded.bind(this);this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.panner=this.context.createPanner();this.panner.connect(this.gain);this.autoplay=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1};THREE.Audio.prototype=Object.create(THREE.Object3D.prototype);
+THREE.Audio.prototype.constructor=THREE.Audio;THREE.Audio.prototype.load=function(a){var b=this,c=new XMLHttpRequest;c.open("GET",a,!0);c.responseType="arraybuffer";c.onload=function(a){b.context.decodeAudioData(this.response,function(a){b.source.buffer=a;b.autoplay&&b.play()})};c.send();return this};
+THREE.Audio.prototype.play=function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else{var a=this.context.createBufferSource();a.buffer=this.source.buffer;a.loop=this.source.loop;a.onended=this.source.onended;a.start(0,this.startTime);a.playbackRate.value=this.playbackRate;this.isPlaying=!0;this.source=a;this.connect()}};THREE.Audio.prototype.pause=function(){this.source.stop();this.startTime=this.context.currentTime};
+THREE.Audio.prototype.stop=function(){this.source.stop();this.startTime=0};THREE.Audio.prototype.connect=function(){void 0!==this.filter?(this.source.connect(this.filter),this.filter.connect(this.panner)):this.source.connect(this.panner)};THREE.Audio.prototype.disconnect=function(){void 0!==this.filter?(this.source.disconnect(this.filter),this.filter.disconnect(this.panner)):this.source.disconnect(this.panner)};
+THREE.Audio.prototype.setFilter=function(a){!0===this.isPlaying?(this.disconnect(),this.filter=a,this.connect()):this.filter=a};THREE.Audio.prototype.getFilter=function(){return this.filter};THREE.Audio.prototype.setPlaybackRate=function(a){this.playbackRate=a;!0===this.isPlaying&&(this.source.playbackRate.value=this.playbackRate)};THREE.Audio.prototype.getPlaybackRate=function(){return this.playbackRate};THREE.Audio.prototype.onEnded=function(){this.isPlaying=!1};
+THREE.Audio.prototype.setLoop=function(a){this.source.loop=a};THREE.Audio.prototype.getLoop=function(){return this.source.loop};THREE.Audio.prototype.setRefDistance=function(a){this.panner.refDistance=a};THREE.Audio.prototype.getRefDistance=function(){return this.panner.refDistance};THREE.Audio.prototype.setRolloffFactor=function(a){this.panner.rolloffFactor=a};THREE.Audio.prototype.getRolloffFactor=function(){return this.panner.rolloffFactor};
+THREE.Audio.prototype.setVolume=function(a){this.gain.gain.value=a};THREE.Audio.prototype.getVolume=function(){return this.gain.gain.value};THREE.Audio.prototype.updateMatrixWorld=function(){var a=new THREE.Vector3;return function(b){THREE.Object3D.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}();THREE.AudioListener=function(){THREE.Object3D.call(this);this.type="AudioListener";this.context=new (window.AudioContext||window.webkitAudioContext)};
+THREE.AudioListener.prototype=Object.create(THREE.Object3D.prototype);THREE.AudioListener.prototype.constructor=THREE.AudioListener;
+THREE.AudioListener.prototype.updateMatrixWorld=function(){var a=new THREE.Vector3,b=new THREE.Quaternion,c=new THREE.Vector3,d=new THREE.Vector3;return function(e){THREE.Object3D.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var g=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.setPosition(a.x,a.y,a.z);e.setOrientation(d.x,d.y,d.z,g.x,g.y,g.z)}}();THREE.Curve=function(){};
+THREE.Curve.prototype={constructor:THREE.Curve,getPoint:function(a){console.warn("THREE.Curve: Warning, getPoint() not implemented!");return null},getPointAt:function(a){a=this.getUtoTmapping(a);return this.getPoint(a)},getPoints:function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c},getSpacedPoints:function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){a||
+(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c,d=this.getPoint(0),e,g=0;b.push(0);for(e=1;e<=a;e++)c=this.getPoint(e/a),g+=c.distanceTo(d),b.push(g),d=c;return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d=0,e=c.length,g;g=b?b:a*c[e-1];for(var f=0,h=e-
+1,l;f<=h;)if(d=Math.floor(f+(h-f)/2),l=c[d]-g,0>l)f=d+1;else if(0<l)h=d-1;else{h=d;break}d=h;if(c[d]===g)return d/(e-1);f=c[d];return c=(d+(g-f)/(c[d+1]-f))/(e-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);return this.getTangent(a)}};THREE.Curve.Utils=THREE.CurveUtils;
+THREE.Curve.create=function(a,b){a.prototype=Object.create(THREE.Curve.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.CurvePath=function(){this.curves=[];this.autoClose=!1};THREE.CurvePath.prototype=Object.create(THREE.Curve.prototype);THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};
+THREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),d=0;d<c.length;){if(c[d]>=b)return a=this.curves[d],b=1-(c[d]-b)/a.getLength(),a.getPointAt(b);d++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]};
+THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a};THREE.CurvePath.prototype.createPointsGeometry=function(a){a=this.getPoints(a,!0);return this.createGeometry(a)};THREE.CurvePath.prototype.createSpacedPointsGeometry=function(a){a=this.getSpacedPoints(a,!0);return this.createGeometry(a)};
+THREE.CurvePath.prototype.createGeometry=function(a){for(var b=new THREE.Geometry,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new THREE.Vector3(e.x,e.y,e.z||0))}return b};THREE.Path=function(a){THREE.CurvePath.call(this);this.actions=[];a&&this.fromPoints(a)};THREE.Path.prototype=Object.create(THREE.CurvePath.prototype);THREE.Path.prototype.constructor=THREE.Path;THREE.Path.prototype.fromPoints=function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)};
+THREE.Path.prototype.moveTo=function(a,b){this.actions.push({action:"moveTo",args:[a,b]})};THREE.Path.prototype.lineTo=function(a,b){var c=this.actions[this.actions.length-1].args,c=new THREE.LineCurve(new THREE.Vector2(c[c.length-2],c[c.length-1]),new THREE.Vector2(a,b));this.curves.push(c);this.actions.push({action:"lineTo",args:[a,b]})};
+THREE.Path.prototype.quadraticCurveTo=function(a,b,c,d){var e=this.actions[this.actions.length-1].args,e=new THREE.QuadraticBezierCurve(new THREE.Vector2(e[e.length-2],e[e.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d));this.curves.push(e);this.actions.push({action:"quadraticCurveTo",args:[a,b,c,d]})};
+THREE.Path.prototype.bezierCurveTo=function(a,b,c,d,e,g){var f=this.actions[this.actions.length-1].args,f=new THREE.CubicBezierCurve(new THREE.Vector2(f[f.length-2],f[f.length-1]),new THREE.Vector2(a,b),new THREE.Vector2(c,d),new THREE.Vector2(e,g));this.curves.push(f);this.actions.push({action:"bezierCurveTo",args:[a,b,c,d,e,g]})};
+THREE.Path.prototype.splineThru=function(a){var b=Array.prototype.slice.call(arguments),c=this.actions[this.actions.length-1].args,c=[new THREE.Vector2(c[c.length-2],c[c.length-1])];Array.prototype.push.apply(c,a);c=new THREE.SplineCurve(c);this.curves.push(c);this.actions.push({action:"splineThru",args:b})};THREE.Path.prototype.arc=function(a,b,c,d,e,g){var f=this.actions[this.actions.length-1].args;this.absarc(a+f[f.length-2],b+f[f.length-1],c,d,e,g)};
+THREE.Path.prototype.absarc=function(a,b,c,d,e,g){this.absellipse(a,b,c,c,d,e,g)};THREE.Path.prototype.ellipse=function(a,b,c,d,e,g,f,h){var l=this.actions[this.actions.length-1].args;this.absellipse(a+l[l.length-2],b+l[l.length-1],c,d,e,g,f,h)};THREE.Path.prototype.absellipse=function(a,b,c,d,e,g,f,h){var l=[a,b,c,d,e,g,f,h||0];a=new THREE.EllipseCurve(a,b,c,d,e,g,f,h);this.curves.push(a);a=a.getPoint(1);l.push(a.x);l.push(a.y);this.actions.push({action:"ellipse",args:l})};
+THREE.Path.prototype.getSpacedPoints=function(a,b){a||(a=40);for(var c=[],d=0;d<a;d++)c.push(this.getPoint(d/a));return c};
+THREE.Path.prototype.getPoints=function(a,b){a=a||12;for(var c=THREE.ShapeUtils.b2,d=THREE.ShapeUtils.b3,e=[],g,f,h,l,k,m,p,n,q,s,t=0,v=this.actions.length;t<v;t++){q=this.actions[t];var u=q.args;switch(q.action){case "moveTo":e.push(new THREE.Vector2(u[0],u[1]));break;case "lineTo":e.push(new THREE.Vector2(u[0],u[1]));break;case "quadraticCurveTo":g=u[2];f=u[3];k=u[0];m=u[1];0<e.length?(q=e[e.length-1],p=q.x,n=q.y):(q=this.actions[t-1].args,p=q[q.length-2],n=q[q.length-1]);for(u=1;u<=a;u++)s=u/a,
+q=c(s,p,k,g),s=c(s,n,m,f),e.push(new THREE.Vector2(q,s));break;case "bezierCurveTo":g=u[4];f=u[5];k=u[0];m=u[1];h=u[2];l=u[3];0<e.length?(q=e[e.length-1],p=q.x,n=q.y):(q=this.actions[t-1].args,p=q[q.length-2],n=q[q.length-1]);for(u=1;u<=a;u++)s=u/a,q=d(s,p,k,h,g),s=d(s,n,m,l,f),e.push(new THREE.Vector2(q,s));break;case "splineThru":q=this.actions[t-1].args;s=[new THREE.Vector2(q[q.length-2],q[q.length-1])];q=a*u[0].length;s=s.concat(u[0]);s=new THREE.SplineCurve(s);for(u=1;u<=q;u++)e.push(s.getPointAt(u/
+q));break;case "arc":g=u[0];f=u[1];m=u[2];h=u[3];q=u[4];k=!!u[5];p=q-h;n=2*a;for(u=1;u<=n;u++)s=u/n,k||(s=1-s),s=h+s*p,q=g+m*Math.cos(s),s=f+m*Math.sin(s),e.push(new THREE.Vector2(q,s));break;case "ellipse":g=u[0];f=u[1];m=u[2];l=u[3];h=u[4];q=u[5];k=!!u[6];var w=u[7];p=q-h;n=2*a;var D,x;0!==w&&(D=Math.cos(w),x=Math.sin(w));for(u=1;u<=n;u++){s=u/n;k||(s=1-s);s=h+s*p;q=g+m*Math.cos(s);s=f+l*Math.sin(s);if(0!==w){var B=q;q=(B-g)*D-(s-f)*x+g;s=(B-g)*x+(s-f)*D+f}e.push(new THREE.Vector2(q,s))}}}c=e[e.length-
+1];Math.abs(c.x-e[0].x)<Number.EPSILON&&Math.abs(c.y-e[0].y)<Number.EPSILON&&e.splice(e.length-1,1);b&&e.push(e[0]);return e};
+THREE.Path.prototype.toShapes=function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new THREE.Shape;f.actions=e.actions;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,l=h.y-g.y;if(Math.abs(l)>Number.EPSILON){if(0>l&&(g=b[f],k=-k,h=b[e],l=-l),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||
+g.x<=a.x&&a.x<=h.x))return!0}return d}var e=THREE.ShapeUtils.isClockWise,g=function(a){for(var b=[],c=new THREE.Path,d=0,e=a.length;d<e;d++){var f=a[d],g=f.args,f=f.action;"moveTo"===f&&0!==c.actions.length&&(b.push(c),c=new THREE.Path);c[f].apply(c,g)}0!==c.actions.length&&b.push(c);return b}(this.actions);if(0===g.length)return[];if(!0===b)return c(g);var f,h,l,k=[];if(1===g.length)return h=g[0],l=new THREE.Shape,l.actions=h.actions,l.curves=h.curves,k.push(l),k;var m=!e(g[0].getPoints()),m=a?!m:
+m;l=[];var p=[],n=[],q=0,s;p[q]=void 0;n[q]=[];for(var t=0,v=g.length;t<v;t++)h=g[t],s=h.getPoints(),f=e(s),(f=a?!f:f)?(!m&&p[q]&&q++,p[q]={s:new THREE.Shape,p:s},p[q].s.actions=h.actions,p[q].s.curves=h.curves,m&&q++,n[q]=[]):n[q].push({h:h,p:s[0]});if(!p[0])return c(g);if(1<p.length){t=!1;h=[];e=0;for(g=p.length;e<g;e++)l[e]=[];e=0;for(g=p.length;e<g;e++)for(f=n[e],m=0;m<f.length;m++){q=f[m];s=!0;for(v=0;v<p.length;v++)d(q.p,p[v].p)&&(e!==v&&h.push({froms:e,tos:v,hole:m}),s?(s=!1,l[v].push(q)):
+t=!0);s&&l[e].push(q)}0<h.length&&(t||(n=l))}t=0;for(e=p.length;t<e;t++)for(l=p[t].s,k.push(l),h=n[t],g=0,f=h.length;g<f;g++)l.holes.push(h[g].h);return k};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=Object.create(THREE.Path.prototype);THREE.Shape.prototype.constructor=THREE.Shape;THREE.Shape.prototype.extrude=function(a){return new THREE.ExtrudeGeometry(this,a)};THREE.Shape.prototype.makeGeometry=function(a){return new THREE.ShapeGeometry(this,a)};
+THREE.Shape.prototype.getPointsHoles=function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b};THREE.Shape.prototype.extractAllPoints=function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}};THREE.Shape.prototype.extractPoints=function(a){return this.extractAllPoints(a)};THREE.Shape.Utils=THREE.ShapeUtils;THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype);
+THREE.LineCurve.prototype.constructor=THREE.LineCurve;THREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype);
+THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve;THREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b=THREE.ShapeUtils.b2;return new THREE.Vector2(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b=THREE.CurveUtils.tangentQuadraticBezier;return(new THREE.Vector2(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))).normalize()};
+THREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b=THREE.ShapeUtils.b3;return new THREE.Vector2(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))};
+THREE.CubicBezierCurve.prototype.getTangent=function(a){var b=THREE.CurveUtils.tangentCubicBezier;return(new THREE.Vector2(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))).normalize()};THREE.SplineCurve=function(a){this.points=void 0==a?[]:a};THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.SplineCurve.prototype.constructor=THREE.SplineCurve;
+THREE.SplineCurve.prototype.getPoint=function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0===c?c:c-1],e=b[c],g=b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=THREE.CurveUtils.interpolate;return new THREE.Vector2(c(d.x,e.x,g.x,b.x,a),c(d.y,e.y,g.y,b.y,a))};THREE.EllipseCurve=function(a,b,c,d,e,g,f,h){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=g;this.aClockwise=f;this.aRotation=h||0};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype);
+THREE.EllipseCurve.prototype.constructor=THREE.EllipseCurve;
+THREE.EllipseCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;0>b&&(b+=2*Math.PI);b>2*Math.PI&&(b-=2*Math.PI);b=!0===this.aClockwise?this.aEndAngle+(1-a)*(2*Math.PI-b):this.aStartAngle+a*b;a=this.aX+this.xRadius*Math.cos(b);var c=this.aY+this.yRadius*Math.sin(b);if(0!==this.aRotation){var b=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a;a=(e-this.aX)*b-(c-this.aY)*d+this.aX;c=(e-this.aX)*d+(c-this.aY)*b+this.aY}return new THREE.Vector2(a,c)};
+THREE.ArcCurve=function(a,b,c,d,e,g){THREE.EllipseCurve.call(this,a,b,c,c,d,e,g)};THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype);THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b});
+THREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b=THREE.ShapeUtils.b2;return new THREE.Vector3(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y),b(a,this.v0.z,this.v1.z,this.v2.z))});
+THREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b=THREE.ShapeUtils.b3;return new THREE.Vector3(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y),b(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z))});
+THREE.SplineCurve3=THREE.Curve.create(function(a){console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3");this.points=void 0==a?[]:a},function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0==c?c:c-1],e=b[c],g=b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=THREE.CurveUtils.interpolate;return new THREE.Vector3(c(d.x,e.x,g.x,b.x,a),c(d.y,e.y,g.y,b.y,a),c(d.z,e.z,g.z,b.z,a))});
+THREE.CatmullRomCurve3=function(){function a(){}var b=new THREE.Vector3,c=new a,d=new a,e=new a;a.prototype.init=function(a,b,c,d){this.c0=a;this.c1=c;this.c2=-3*a+3*b-2*c-d;this.c3=2*a-2*b+c+d};a.prototype.initNonuniformCatmullRom=function(a,b,c,d,e,m,p){a=((b-a)/e-(c-a)/(e+m)+(c-b)/m)*m;d=((c-b)/m-(d-b)/(m+p)+(d-c)/p)*m;this.init(b,c,a,d)};a.prototype.initCatmullRom=function(a,b,c,d,e){this.init(b,c,e*(c-a),e*(d-b))};a.prototype.calc=function(a){var b=a*a;return this.c0+this.c1*a+this.c2*b+this.c3*
+b*a};return THREE.Curve.create(function(a){this.points=a||[]},function(a){var f=this.points,h,l;l=f.length;2>l&&console.log("duh, you need at least 2 points");a*=l-1;h=Math.floor(a);a-=h;0===a&&h===l-1&&(h=l-2,a=1);var k,m,p;0===h?(b.subVectors(f[0],f[1]).add(f[0]),k=b):k=f[h-1];m=f[h];p=f[h+1];h+2<l?f=f[h+2]:(b.subVectors(f[l-1],f[l-2]).add(f[l-2]),f=b);if(void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var n="chordal"===this.type?.5:.25;l=Math.pow(k.distanceToSquared(m),n);
+h=Math.pow(m.distanceToSquared(p),n);n=Math.pow(p.distanceToSquared(f),n);1E-4>h&&(h=1);1E-4>l&&(l=h);1E-4>n&&(n=h);c.initNonuniformCatmullRom(k.x,m.x,p.x,f.x,l,h,n);d.initNonuniformCatmullRom(k.y,m.y,p.y,f.y,l,h,n);e.initNonuniformCatmullRom(k.z,m.z,p.z,f.z,l,h,n)}else"catmullrom"===this.type&&(l=void 0!==this.tension?this.tension:.5,c.initCatmullRom(k.x,m.x,p.x,f.x,l),d.initCatmullRom(k.y,m.y,p.y,f.y,l),e.initCatmullRom(k.z,m.z,p.z,f.z,l));return new THREE.Vector3(c.calc(a),d.calc(a),e.calc(a))})}();
+THREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=void 0==a?[]:a},function(a){var b=this.points;a*=b.length-0;var c=Math.floor(a);a-=c;var c=c+(0<c?0:(Math.floor(Math.abs(c)/b.length)+1)*b.length),d=b[(c-1)%b.length],e=b[c%b.length],g=b[(c+1)%b.length],b=b[(c+2)%b.length],c=THREE.CurveUtils.interpolate;return new THREE.Vector3(c(d.x,e.x,g.x,b.x,a),c(d.y,e.y,g.y,b.y,a),c(d.z,e.z,g.z,b.z,a))});
+THREE.BoxGeometry=function(a,b,c,d,e,g){function f(a,b,c,d,e,f,g,t){var v,u=h.widthSegments,w=h.heightSegments,D=e/2,x=f/2,B=h.vertices.length;if("x"===a&&"y"===b||"y"===a&&"x"===b)v="z";else if("x"===a&&"z"===b||"z"===a&&"x"===b)v="y",w=h.depthSegments;else if("z"===a&&"y"===b||"y"===a&&"z"===b)v="x",u=h.depthSegments;var y=u+1,z=w+1,A=e/u,J=f/w,F=new THREE.Vector3;F[v]=0<g?1:-1;for(e=0;e<z;e++)for(f=0;f<y;f++){var C=new THREE.Vector3;C[a]=(f*A-D)*c;C[b]=(e*J-x)*d;C[v]=g;h.vertices.push(C)}for(e=
+0;e<w;e++)for(f=0;f<u;f++)x=f+y*e,a=f+y*(e+1),b=f+1+y*(e+1),c=f+1+y*e,d=new THREE.Vector2(f/u,1-e/w),g=new THREE.Vector2(f/u,1-(e+1)/w),v=new THREE.Vector2((f+1)/u,1-(e+1)/w),D=new THREE.Vector2((f+1)/u,1-e/w),x=new THREE.Face3(x+B,a+B,c+B),x.normal.copy(F),x.vertexNormals.push(F.clone(),F.clone(),F.clone()),x.materialIndex=t,h.faces.push(x),h.faceVertexUvs[0].push([d,g,D]),x=new THREE.Face3(a+B,b+B,c+B),x.normal.copy(F),x.vertexNormals.push(F.clone(),F.clone(),F.clone()),x.materialIndex=t,h.faces.push(x),
+h.faceVertexUvs[0].push([g.clone(),v,D.clone()])}THREE.Geometry.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:g};this.widthSegments=d||1;this.heightSegments=e||1;this.depthSegments=g||1;var h=this;d=a/2;e=b/2;g=c/2;f("z","y",-1,-1,c,b,d,0);f("z","y",1,-1,c,b,-d,1);f("x","z",1,1,a,c,e,2);f("x","z",1,-1,a,c,-e,3);f("x","y",1,-1,a,b,g,4);f("x","y",-1,-1,a,b,-g,5);this.mergeVertices()};THREE.BoxGeometry.prototype=Object.create(THREE.Geometry.prototype);
+THREE.BoxGeometry.prototype.constructor=THREE.BoxGeometry;THREE.BoxGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.BoxGeometry(a.width,a.height,a.depth,a.widthSegments,a.heightSegments,a.depthSegments)};THREE.CubeGeometry=THREE.BoxGeometry;THREE.CircleGeometry=function(a,b,c,d){THREE.Geometry.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new THREE.CircleBufferGeometry(a,b,c,d))};
+THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CircleGeometry.prototype.constructor=THREE.CircleGeometry;THREE.CircleGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.CircleGeometry(a.radius,a.segments,a.thetaStart,a.thetaLength)};
+THREE.CircleBufferGeometry=function(a,b,c,d){THREE.BufferGeometry.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||50;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=b+2,g=new Float32Array(3*e),f=new Float32Array(3*e),e=new Float32Array(2*e);f[2]=1;e[0]=.5;e[1]=.5;for(var h=0,l=3,k=2;h<=b;h++,l+=3,k+=2){var m=c+h/b*d;g[l]=a*Math.cos(m);g[l+1]=a*Math.sin(m);f[l+2]=1;e[k]=(g[l]/a+1)/2;e[k+1]=(g[l+1]/a+1)/2}c=
+[];for(l=1;l<=b;l++)c.push(l,l+1,0);this.setIndex(new THREE.BufferAttribute(new Uint16Array(c),1));this.addAttribute("position",new THREE.BufferAttribute(g,3));this.addAttribute("normal",new THREE.BufferAttribute(f,3));this.addAttribute("uv",new THREE.BufferAttribute(e,2));this.boundingSphere=new THREE.Sphere(new THREE.Vector3,a)};THREE.CircleBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype);THREE.CircleBufferGeometry.prototype.constructor=THREE.CircleBufferGeometry;
+THREE.CircleBufferGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.CircleBufferGeometry(a.radius,a.segments,a.thetaStart,a.thetaLength)};
+THREE.CylinderGeometry=function(a,b,c,d,e,g,f,h){THREE.Geometry.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:g,thetaStart:f,thetaLength:h};a=void 0!==a?a:20;b=void 0!==b?b:20;c=void 0!==c?c:100;d=d||8;e=e||1;g=void 0!==g?g:!1;f=void 0!==f?f:0;h=void 0!==h?h:2*Math.PI;var l=c/2,k,m,p=[],n=[];for(m=0;m<=e;m++){var q=[],s=[],t=m/e,v=t*(b-a)+a;for(k=0;k<=d;k++){var u=k/d,w=new THREE.Vector3;w.x=v*Math.sin(u*h+
+f);w.y=-t*c+l;w.z=v*Math.cos(u*h+f);this.vertices.push(w);q.push(this.vertices.length-1);s.push(new THREE.Vector2(u,1-t))}p.push(q);n.push(s)}c=(b-a)/c;for(k=0;k<d;k++)for(0!==a?(f=this.vertices[p[0][k]].clone(),h=this.vertices[p[0][k+1]].clone()):(f=this.vertices[p[1][k]].clone(),h=this.vertices[p[1][k+1]].clone()),f.setY(Math.sqrt(f.x*f.x+f.z*f.z)*c).normalize(),h.setY(Math.sqrt(h.x*h.x+h.z*h.z)*c).normalize(),m=0;m<e;m++){var q=p[m][k],s=p[m+1][k],t=p[m+1][k+1],v=p[m][k+1],u=f.clone(),w=f.clone(),
+D=h.clone(),x=h.clone(),B=n[m][k].clone(),y=n[m+1][k].clone(),z=n[m+1][k+1].clone(),A=n[m][k+1].clone();this.faces.push(new THREE.Face3(q,s,v,[u,w,x]));this.faceVertexUvs[0].push([B,y,A]);this.faces.push(new THREE.Face3(s,t,v,[w.clone(),D,x.clone()]));this.faceVertexUvs[0].push([y.clone(),z,A.clone()])}if(!1===g&&0<a)for(this.vertices.push(new THREE.Vector3(0,l,0)),k=0;k<d;k++)q=p[0][k],s=p[0][k+1],t=this.vertices.length-1,u=new THREE.Vector3(0,1,0),w=new THREE.Vector3(0,1,0),D=new THREE.Vector3(0,
+1,0),B=n[0][k].clone(),y=n[0][k+1].clone(),z=new THREE.Vector2(y.x,0),this.faces.push(new THREE.Face3(q,s,t,[u,w,D],void 0,1)),this.faceVertexUvs[0].push([B,y,z]);if(!1===g&&0<b)for(this.vertices.push(new THREE.Vector3(0,-l,0)),k=0;k<d;k++)q=p[e][k+1],s=p[e][k],t=this.vertices.length-1,u=new THREE.Vector3(0,-1,0),w=new THREE.Vector3(0,-1,0),D=new THREE.Vector3(0,-1,0),B=n[e][k+1].clone(),y=n[e][k].clone(),z=new THREE.Vector2(y.x,1),this.faces.push(new THREE.Face3(q,s,t,[u,w,D],void 0,2)),this.faceVertexUvs[0].push([B,
+y,z]);this.computeFaceNormals()};THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CylinderGeometry.prototype.constructor=THREE.CylinderGeometry;THREE.CylinderGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.CylinderGeometry(a.radiusTop,a.radiusBottom,a.height,a.radialSegments,a.heightSegments,a.openEnded,a.thetaStart,a.thetaLength)};
+THREE.EdgesGeometry=function(a,b){function c(a,b){return a-b}THREE.BufferGeometry.call(this);var d=Math.cos(THREE.Math.degToRad(void 0!==b?b:1)),e=[0,0],g={},f=["a","b","c"],h;a instanceof THREE.BufferGeometry?(h=new THREE.Geometry,h.fromBufferGeometry(a)):h=a.clone();h.mergeVertices();h.computeFaceNormals();var l=h.vertices;h=h.faces;for(var k=0,m=h.length;k<m;k++)for(var p=h[k],n=0;3>n;n++){e[0]=p[f[n]];e[1]=p[f[(n+1)%3]];e.sort(c);var q=e.toString();void 0===g[q]?g[q]={vert1:e[0],vert2:e[1],face1:k,
+face2:void 0}:g[q].face2=k}e=[];for(q in g)if(f=g[q],void 0===f.face2||h[f.face1].normal.dot(h[f.face2].normal)<=d)k=l[f.vert1],e.push(k.x),e.push(k.y),e.push(k.z),k=l[f.vert2],e.push(k.x),e.push(k.y),e.push(k.z);this.addAttribute("position",new THREE.BufferAttribute(new Float32Array(e),3))};THREE.EdgesGeometry.prototype=Object.create(THREE.BufferGeometry.prototype);THREE.EdgesGeometry.prototype.constructor=THREE.EdgesGeometry;
+THREE.ExtrudeGeometry=function(a,b){"undefined"!==typeof a&&(THREE.Geometry.call(this),this.type="ExtrudeGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeFaceNormals())};THREE.ExtrudeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ExtrudeGeometry.prototype.constructor=THREE.ExtrudeGeometry;THREE.ExtrudeGeometry.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],b)};
+THREE.ExtrudeGeometry.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d=1,d=a.x-b.x,e=a.y-b.y,f=c.x-a.x,g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var k=Math.sqrt(h),l=Math.sqrt(f*f+g*g),h=b.x-e/k;b=b.y+d/k;f=((c.x-g/l-h)*g-(c.y+f/l-b)*f)/(d*g-e*f);c=h+d*f-a.x;a=b+e*f-a.y;d=c*c+a*a;if(2>=d)return new THREE.Vector2(c,a);d=Math.sqrt(d/2)}else a=!1,d>Number.EPSILON?
+f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(c=-e,a=d,d=Math.sqrt(h)):(c=d,a=e,d=Math.sqrt(h/2));return new THREE.Vector2(c/d,a/d)}function e(a,b){var c,d;for(G=a.length;0<=--G;){c=G;d=G-1;0>d&&(d=a.length-1);for(var e=0,f=q+2*m,e=0;e<f;e++){var g=T*e,h=T*(e+1),k=b+c+g,g=b+d+g,l=b+d+h,h=b+c+h,k=k+F,g=g+F,l=l+F,h=h+F;J.faces.push(new THREE.Face3(k,g,h,null,null,1));J.faces.push(new THREE.Face3(g,l,h,null,null,1));k=u.generateSideWallUV(J,
+k,g,l,h);J.faceVertexUvs[0].push([k[0],k[1],k[3]]);J.faceVertexUvs[0].push([k[1],k[2],k[3]])}}}function g(a,b,c){J.vertices.push(new THREE.Vector3(a,b,c))}function f(a,b,c){a+=F;b+=F;c+=F;J.faces.push(new THREE.Face3(a,b,c,null,null,0));a=u.generateTopUV(J,a,b,c);J.faceVertexUvs[0].push(a)}var h=void 0!==b.amount?b.amount:100,l=void 0!==b.bevelThickness?b.bevelThickness:6,k=void 0!==b.bevelSize?b.bevelSize:l-2,m=void 0!==b.bevelSegments?b.bevelSegments:3,p=void 0!==b.bevelEnabled?b.bevelEnabled:!0,
+n=void 0!==b.curveSegments?b.curveSegments:12,q=void 0!==b.steps?b.steps:1,s=b.extrudePath,t,v=!1,u=void 0!==b.UVGenerator?b.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator,w,D,x,B;s&&(t=s.getSpacedPoints(q),v=!0,p=!1,w=void 0!==b.frames?b.frames:new THREE.TubeGeometry.FrenetFrames(s,q,!1),D=new THREE.Vector3,x=new THREE.Vector3,B=new THREE.Vector3);p||(k=l=m=0);var y,z,A,J=this,F=this.vertices.length,s=a.extractPoints(n),n=s.shape,C=s.holes;if(s=!THREE.ShapeUtils.isClockWise(n)){n=n.reverse();
+z=0;for(A=C.length;z<A;z++)y=C[z],THREE.ShapeUtils.isClockWise(y)&&(C[z]=y.reverse());s=!1}var N=THREE.ShapeUtils.triangulateShape(n,C),L=n;z=0;for(A=C.length;z<A;z++)y=C[z],n=n.concat(y);var Q,M,K,E,O,T=n.length,H,R=N.length,s=[],G=0;K=L.length;Q=K-1;for(M=G+1;G<K;G++,Q++,M++)Q===K&&(Q=0),M===K&&(M=0),s[G]=d(L[G],L[Q],L[M]);var ia=[],U,X=s.concat();z=0;for(A=C.length;z<A;z++){y=C[z];U=[];G=0;K=y.length;Q=K-1;for(M=G+1;G<K;G++,Q++,M++)Q===K&&(Q=0),M===K&&(M=0),U[G]=d(y[G],y[Q],y[M]);ia.push(U);X=
+X.concat(U)}for(Q=0;Q<m;Q++){K=Q/m;E=l*(1-K);M=k*Math.sin(K*Math.PI/2);G=0;for(K=L.length;G<K;G++)O=c(L[G],s[G],M),g(O.x,O.y,-E);z=0;for(A=C.length;z<A;z++)for(y=C[z],U=ia[z],G=0,K=y.length;G<K;G++)O=c(y[G],U[G],M),g(O.x,O.y,-E)}M=k;for(G=0;G<T;G++)O=p?c(n[G],X[G],M):n[G],v?(x.copy(w.normals[0]).multiplyScalar(O.x),D.copy(w.binormals[0]).multiplyScalar(O.y),B.copy(t[0]).add(x).add(D),g(B.x,B.y,B.z)):g(O.x,O.y,0);for(K=1;K<=q;K++)for(G=0;G<T;G++)O=p?c(n[G],X[G],M):n[G],v?(x.copy(w.normals[K]).multiplyScalar(O.x),
+D.copy(w.binormals[K]).multiplyScalar(O.y),B.copy(t[K]).add(x).add(D),g(B.x,B.y,B.z)):g(O.x,O.y,h/q*K);for(Q=m-1;0<=Q;Q--){K=Q/m;E=l*(1-K);M=k*Math.sin(K*Math.PI/2);G=0;for(K=L.length;G<K;G++)O=c(L[G],s[G],M),g(O.x,O.y,h+E);z=0;for(A=C.length;z<A;z++)for(y=C[z],U=ia[z],G=0,K=y.length;G<K;G++)O=c(y[G],U[G],M),v?g(O.x,O.y+t[q-1].y,t[q-1].x+E):g(O.x,O.y,h+E)}(function(){if(p){var a;a=0*T;for(G=0;G<R;G++)H=N[G],f(H[2]+a,H[1]+a,H[0]+a);a=q+2*m;a*=T;for(G=0;G<R;G++)H=N[G],f(H[0]+a,H[1]+a,H[2]+a)}else{for(G=
+0;G<R;G++)H=N[G],f(H[2],H[1],H[0]);for(G=0;G<R;G++)H=N[G],f(H[0]+T*q,H[1]+T*q,H[2]+T*q)}})();(function(){var a=0;e(L,a);a+=L.length;z=0;for(A=C.length;z<A;z++)y=C[z],e(y,a),a+=y.length})()};
+THREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(a,b,c,d){a=a.vertices;b=a[b];c=a[c];d=a[d];return[new THREE.Vector2(b.x,b.y),new THREE.Vector2(c.x,c.y),new THREE.Vector2(d.x,d.y)]},generateSideWallUV:function(a,b,c,d,e){a=a.vertices;b=a[b];c=a[c];d=a[d];e=a[e];return.01>Math.abs(b.y-c.y)?[new THREE.Vector2(b.x,1-b.z),new THREE.Vector2(c.x,1-c.z),new THREE.Vector2(d.x,1-d.z),new THREE.Vector2(e.x,1-e.z)]:[new THREE.Vector2(b.y,1-b.z),new THREE.Vector2(c.y,1-c.z),new THREE.Vector2(d.y,
+1-d.z),new THREE.Vector2(e.y,1-e.z)]}};THREE.ShapeGeometry=function(a,b){THREE.Geometry.call(this);this.type="ShapeGeometry";!1===Array.isArray(a)&&(a=[a]);this.addShapeList(a,b);this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.constructor=THREE.ShapeGeometry;THREE.ShapeGeometry.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;c<d;c++)this.addShape(a[c],b);return this};
+THREE.ShapeGeometry.prototype.addShape=function(a,b){void 0===b&&(b={});var c=b.material,d=void 0===b.UVGenerator?THREE.ExtrudeGeometry.WorldUVGenerator:b.UVGenerator,e,g,f,h=this.vertices.length;e=a.extractPoints(void 0!==b.curveSegments?b.curveSegments:12);var l=e.shape,k=e.holes;if(!THREE.ShapeUtils.isClockWise(l))for(l=l.reverse(),e=0,g=k.length;e<g;e++)f=k[e],THREE.ShapeUtils.isClockWise(f)&&(k[e]=f.reverse());var m=THREE.ShapeUtils.triangulateShape(l,k);e=0;for(g=k.length;e<g;e++)f=k[e],l=l.concat(f);
+k=l.length;g=m.length;for(e=0;e<k;e++)f=l[e],this.vertices.push(new THREE.Vector3(f.x,f.y,0));for(e=0;e<g;e++)k=m[e],l=k[0]+h,f=k[1]+h,k=k[2]+h,this.faces.push(new THREE.Face3(l,f,k,null,null,c)),this.faceVertexUvs[0].push(d.generateTopUV(this,l,f,k))};
+THREE.LatheGeometry=function(a,b,c,d){THREE.Geometry.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=b||12;c=c||0;d=d||2*Math.PI;for(var e=1/(a.length-1),g=1/b,f=0,h=b;f<=h;f++)for(var l=c+f*g*d,k=Math.cos(l),m=Math.sin(l),l=0,p=a.length;l<p;l++){var n=a[l],q=new THREE.Vector3;q.x=k*n.x-m*n.y;q.y=m*n.x+k*n.y;q.z=n.z;this.vertices.push(q)}c=a.length;f=0;for(h=b;f<h;f++)for(l=0,p=a.length-1;l<p;l++){b=m=l+c*f;d=m+c;var k=m+1+c,m=m+1,n=f*g,q=l*e,s=
+n+g,t=q+e;this.faces.push(new THREE.Face3(b,d,m));this.faceVertexUvs[0].push([new THREE.Vector2(n,q),new THREE.Vector2(s,q),new THREE.Vector2(n,t)]);this.faces.push(new THREE.Face3(d,k,m));this.faceVertexUvs[0].push([new THREE.Vector2(s,q),new THREE.Vector2(s,t),new THREE.Vector2(n,t)])}this.mergeVertices();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.LatheGeometry.prototype.constructor=THREE.LatheGeometry;
+THREE.PlaneGeometry=function(a,b,c,d){THREE.Geometry.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new THREE.PlaneBufferGeometry(a,b,c,d))};THREE.PlaneGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.PlaneGeometry.prototype.constructor=THREE.PlaneGeometry;THREE.PlaneGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.PlaneGeometry(a.width,a.height,a.widthSegments,a.heightSegments)};
+THREE.PlaneBufferGeometry=function(a,b,c,d){THREE.BufferGeometry.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,g=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var f=c+1,h=d+1,l=a/c,k=b/d;b=new Float32Array(f*h*3);a=new Float32Array(f*h*3);for(var m=new Float32Array(f*h*2),p=0,n=0,q=0;q<h;q++)for(var s=q*k-g,t=0;t<f;t++)b[p]=t*l-e,b[p+1]=-s,a[p+2]=1,m[n]=t/c,m[n+1]=1-q/d,p+=3,n+=2;p=0;e=new (65535<b.length/3?Uint32Array:Uint16Array)(c*
+d*6);for(q=0;q<d;q++)for(t=0;t<c;t++)g=t+f*(q+1),h=t+1+f*(q+1),l=t+1+f*q,e[p]=t+f*q,e[p+1]=g,e[p+2]=l,e[p+3]=g,e[p+4]=h,e[p+5]=l,p+=6;this.setIndex(new THREE.BufferAttribute(e,1));this.addAttribute("position",new THREE.BufferAttribute(b,3));this.addAttribute("normal",new THREE.BufferAttribute(a,3));this.addAttribute("uv",new THREE.BufferAttribute(m,2))};THREE.PlaneBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype);THREE.PlaneBufferGeometry.prototype.constructor=THREE.PlaneBufferGeometry;
+THREE.PlaneBufferGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.PlaneBufferGeometry(a.width,a.height,a.widthSegments,a.heightSegments)};
+THREE.RingGeometry=function(a,b,c,d,e,g){THREE.Geometry.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:g};a=a||0;b=b||50;e=void 0!==e?e:0;g=void 0!==g?g:2*Math.PI;c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):8;var f,h=[],l=a,k=(b-a)/d;for(a=0;a<d+1;a++){for(f=0;f<c+1;f++){var m=new THREE.Vector3,p=e+f/c*g;m.x=l*Math.cos(p);m.y=l*Math.sin(p);this.vertices.push(m);h.push(new THREE.Vector2((m.x/b+1)/2,
+(m.y/b+1)/2))}l+=k}b=new THREE.Vector3(0,0,1);for(a=0;a<d;a++)for(e=a*(c+1),f=0;f<c;f++)g=p=f+e,k=p+c+1,m=p+c+2,this.faces.push(new THREE.Face3(g,k,m,[b.clone(),b.clone(),b.clone()])),this.faceVertexUvs[0].push([h[g].clone(),h[k].clone(),h[m].clone()]),g=p,k=p+c+2,m=p+1,this.faces.push(new THREE.Face3(g,k,m,[b.clone(),b.clone(),b.clone()])),this.faceVertexUvs[0].push([h[g].clone(),h[k].clone(),h[m].clone()]);this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,l)};
+THREE.RingGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.RingGeometry.prototype.constructor=THREE.RingGeometry;THREE.RingGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.RingGeometry(a.innerRadius,a.outerRadius,a.thetaSegments,a.phiSegments,a.thetaStart,a.thetaLength)};
+THREE.SphereGeometry=function(a,b,c,d,e,g,f){THREE.Geometry.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:g,thetaLength:f};this.fromBufferGeometry(new THREE.SphereBufferGeometry(a,b,c,d,e,g,f))};THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.SphereGeometry.prototype.constructor=THREE.SphereGeometry;
+THREE.SphereGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.SphereGeometry(a.radius,a.widthSegments,a.heightSegments,a.phiStart,a.phiLength,a.thetaStart,a.thetaLength)};
+THREE.SphereBufferGeometry=function(a,b,c,d,e,g,f){THREE.BufferGeometry.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:g,thetaLength:f};a=a||50;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;g=void 0!==g?g:0;f=void 0!==f?f:Math.PI;for(var h=g+f,l=(b+1)*(c+1),k=new THREE.BufferAttribute(new Float32Array(3*l),3),m=new THREE.BufferAttribute(new Float32Array(3*
+l),3),l=new THREE.BufferAttribute(new Float32Array(2*l),2),p=0,n=[],q=new THREE.Vector3,s=0;s<=c;s++){for(var t=[],v=s/c,u=0;u<=b;u++){var w=u/b,D=-a*Math.cos(d+w*e)*Math.sin(g+v*f),x=a*Math.cos(g+v*f),B=a*Math.sin(d+w*e)*Math.sin(g+v*f);q.set(D,x,B).normalize();k.setXYZ(p,D,x,B);m.setXYZ(p,q.x,q.y,q.z);l.setXY(p,w,1-v);t.push(p);p++}n.push(t)}d=[];for(s=0;s<c;s++)for(u=0;u<b;u++)e=n[s][u+1],f=n[s][u],p=n[s+1][u],q=n[s+1][u+1],(0!==s||0<g)&&d.push(e,f,q),(s!==c-1||h<Math.PI)&&d.push(f,p,q);this.setIndex(new (65535<
+k.count?THREE.Uint32Attribute:THREE.Uint16Attribute)(d,1));this.addAttribute("position",k);this.addAttribute("normal",m);this.addAttribute("uv",l);this.boundingSphere=new THREE.Sphere(new THREE.Vector3,a)};THREE.SphereBufferGeometry.prototype=Object.create(THREE.BufferGeometry.prototype);THREE.SphereBufferGeometry.prototype.constructor=THREE.SphereBufferGeometry;
+THREE.SphereBufferGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.SphereBufferGeometry(a.radius,a.widthSegments,a.heightSegments,a.phiStart,a.phiLength,a.thetaStart,a.thetaLength)};
+THREE.TorusGeometry=function(a,b,c,d,e){THREE.Geometry.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=b||40;c=c||8;d=d||6;e=e||2*Math.PI;for(var g=new THREE.Vector3,f=[],h=[],l=0;l<=c;l++)for(var k=0;k<=d;k++){var m=k/d*e,p=l/c*Math.PI*2;g.x=a*Math.cos(m);g.y=a*Math.sin(m);var n=new THREE.Vector3;n.x=(a+b*Math.cos(p))*Math.cos(m);n.y=(a+b*Math.cos(p))*Math.sin(m);n.z=b*Math.sin(p);this.vertices.push(n);f.push(new THREE.Vector2(k/
+d,l/c));h.push(n.clone().sub(g).normalize())}for(l=1;l<=c;l++)for(k=1;k<=d;k++)a=(d+1)*l+k-1,b=(d+1)*(l-1)+k-1,e=(d+1)*(l-1)+k,g=(d+1)*l+k,m=new THREE.Face3(a,b,g,[h[a].clone(),h[b].clone(),h[g].clone()]),this.faces.push(m),this.faceVertexUvs[0].push([f[a].clone(),f[b].clone(),f[g].clone()]),m=new THREE.Face3(b,e,g,[h[b].clone(),h[e].clone(),h[g].clone()]),this.faces.push(m),this.faceVertexUvs[0].push([f[b].clone(),f[e].clone(),f[g].clone()]);this.computeFaceNormals()};
+THREE.TorusGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TorusGeometry.prototype.constructor=THREE.TorusGeometry;THREE.TorusGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.TorusGeometry(a.radius,a.tube,a.radialSegments,a.tubularSegments,a.arc)};
+THREE.TorusKnotGeometry=function(a,b,c,d,e,g,f){function h(a,b,c,d,e){var f=Math.cos(a),g=Math.sin(a);a*=b/c;b=Math.cos(a);f*=d*(2+b)*.5;g=d*(2+b)*g*.5;d=e*d*Math.sin(a)*.5;return new THREE.Vector3(f,g,d)}THREE.Geometry.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,p:e,q:g,heightScale:f};a=a||100;b=b||40;c=c||64;d=d||8;e=e||2;g=g||3;f=f||1;for(var l=Array(c),k=new THREE.Vector3,m=new THREE.Vector3,p=new THREE.Vector3,n=0;n<c;++n){l[n]=
+Array(d);var q=n/c*2*e*Math.PI,s=h(q,g,e,a,f),q=h(q+.01,g,e,a,f);k.subVectors(q,s);m.addVectors(q,s);p.crossVectors(k,m);m.crossVectors(p,k);p.normalize();m.normalize();for(q=0;q<d;++q){var t=q/d*2*Math.PI,v=-b*Math.cos(t),t=b*Math.sin(t),u=new THREE.Vector3;u.x=s.x+v*m.x+t*p.x;u.y=s.y+v*m.y+t*p.y;u.z=s.z+v*m.z+t*p.z;l[n][q]=this.vertices.push(u)-1}}for(n=0;n<c;++n)for(q=0;q<d;++q)e=(n+1)%c,g=(q+1)%d,a=l[n][q],b=l[e][q],e=l[e][g],g=l[n][g],f=new THREE.Vector2(n/c,q/d),k=new THREE.Vector2((n+1)/c,
+q/d),m=new THREE.Vector2((n+1)/c,(q+1)/d),p=new THREE.Vector2(n/c,(q+1)/d),this.faces.push(new THREE.Face3(a,b,g)),this.faceVertexUvs[0].push([f,k,p]),this.faces.push(new THREE.Face3(b,e,g)),this.faceVertexUvs[0].push([k.clone(),m,p.clone()]);this.computeFaceNormals();this.computeVertexNormals()};THREE.TorusKnotGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TorusKnotGeometry.prototype.constructor=THREE.TorusKnotGeometry;
+THREE.TorusKnotGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.TorusKnotGeometry(a.radius,a.tube,a.radialSegments,a.tubularSegments,a.p,a.q,a.heightScale)};
+THREE.TubeGeometry=function(a,b,c,d,e,g){THREE.Geometry.call(this);this.type="TubeGeometry";this.parameters={path:a,segments:b,radius:c,radialSegments:d,closed:e,taper:g};b=b||64;c=c||1;d=d||8;e=e||!1;g=g||THREE.TubeGeometry.NoTaper;var f=[],h,l,k=b+1,m,p,n,q,s,t=new THREE.Vector3,v,u,w;v=new THREE.TubeGeometry.FrenetFrames(a,b,e);u=v.normals;w=v.binormals;this.tangents=v.tangents;this.normals=u;this.binormals=w;for(v=0;v<k;v++)for(f[v]=[],m=v/(k-1),s=a.getPointAt(m),h=u[v],l=w[v],n=c*g(m),m=0;m<
+d;m++)p=m/d*2*Math.PI,q=-n*Math.cos(p),p=n*Math.sin(p),t.copy(s),t.x+=q*h.x+p*l.x,t.y+=q*h.y+p*l.y,t.z+=q*h.z+p*l.z,f[v][m]=this.vertices.push(new THREE.Vector3(t.x,t.y,t.z))-1;for(v=0;v<b;v++)for(m=0;m<d;m++)g=e?(v+1)%b:v+1,k=(m+1)%d,a=f[v][m],c=f[g][m],g=f[g][k],k=f[v][k],t=new THREE.Vector2(v/b,m/d),u=new THREE.Vector2((v+1)/b,m/d),w=new THREE.Vector2((v+1)/b,(m+1)/d),h=new THREE.Vector2(v/b,(m+1)/d),this.faces.push(new THREE.Face3(a,c,k)),this.faceVertexUvs[0].push([t,u,h]),this.faces.push(new THREE.Face3(c,
+g,k)),this.faceVertexUvs[0].push([u.clone(),w,h.clone()]);this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TubeGeometry.prototype.constructor=THREE.TubeGeometry;THREE.TubeGeometry.prototype.clone=function(){return new this.constructor(this.parameters.path,this.parameters.segments,this.parameters.radius,this.parameters.radialSegments,this.parameters.closed,this.parameters.taper)};THREE.TubeGeometry.NoTaper=function(a){return 1};
+THREE.TubeGeometry.SinusoidalTaper=function(a){return Math.sin(Math.PI*a)};
+THREE.TubeGeometry.FrenetFrames=function(a,b,c){var d=new THREE.Vector3,e=[],g=[],f=[],h=new THREE.Vector3,l=new THREE.Matrix4;b+=1;var k,m,p;this.tangents=e;this.normals=g;this.binormals=f;for(k=0;k<b;k++)m=k/(b-1),e[k]=a.getTangentAt(m),e[k].normalize();g[0]=new THREE.Vector3;f[0]=new THREE.Vector3;a=Number.MAX_VALUE;k=Math.abs(e[0].x);m=Math.abs(e[0].y);p=Math.abs(e[0].z);k<=a&&(a=k,d.set(1,0,0));m<=a&&(a=m,d.set(0,1,0));p<=a&&d.set(0,0,1);h.crossVectors(e[0],d).normalize();g[0].crossVectors(e[0],
+h);f[0].crossVectors(e[0],g[0]);for(k=1;k<b;k++)g[k]=g[k-1].clone(),f[k]=f[k-1].clone(),h.crossVectors(e[k-1],e[k]),h.length()>Number.EPSILON&&(h.normalize(),d=Math.acos(THREE.Math.clamp(e[k-1].dot(e[k]),-1,1)),g[k].applyMatrix4(l.makeRotationAxis(h,d))),f[k].crossVectors(e[k],g[k]);if(c)for(d=Math.acos(THREE.Math.clamp(g[0].dot(g[b-1]),-1,1)),d/=b-1,0<e[0].dot(h.crossVectors(g[0],g[b-1]))&&(d=-d),k=1;k<b;k++)g[k].applyMatrix4(l.makeRotationAxis(e[k],d*k)),f[k].crossVectors(e[k],g[k])};
+THREE.PolyhedronGeometry=function(a,b,c,d){function e(a){var b=a.normalize().clone();b.index=l.vertices.push(b)-1;var c=Math.atan2(a.z,-a.x)/2/Math.PI+.5;a=Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5;b.uv=new THREE.Vector2(c,1-a);return b}function g(a,b,c,d){d=new THREE.Face3(a.index,b.index,c.index,[a.clone(),b.clone(),c.clone()],void 0,d);l.faces.push(d);v.copy(a).add(b).add(c).divideScalar(3);d=Math.atan2(v.z,-v.x);l.faceVertexUvs[0].push([h(a.uv,a,d),h(b.uv,b,d),h(c.uv,c,d)])}function f(a,
+b){for(var c=Math.pow(2,b),d=e(l.vertices[a.a]),f=e(l.vertices[a.b]),h=e(l.vertices[a.c]),k=[],n=a.materialIndex,m=0;m<=c;m++){k[m]=[];for(var p=e(d.clone().lerp(h,m/c)),q=e(f.clone().lerp(h,m/c)),s=c-m,t=0;t<=s;t++)k[m][t]=0===t&&m===c?p:e(p.clone().lerp(q,t/s))}for(m=0;m<c;m++)for(t=0;t<2*(c-m)-1;t++)d=Math.floor(t/2),0===t%2?g(k[m][d+1],k[m+1][d],k[m][d],n):g(k[m][d+1],k[m+1][d+1],k[m+1][d],n)}function h(a,b,c){0>c&&1===a.x&&(a=new THREE.Vector2(a.x-1,a.y));0===b.x&&0===b.z&&(a=new THREE.Vector2(c/
+2/Math.PI+.5,a.y));return a.clone()}THREE.Geometry.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;for(var l=this,k=0,m=a.length;k<m;k+=3)e(new THREE.Vector3(a[k],a[k+1],a[k+2]));a=this.vertices;for(var p=[],n=k=0,m=b.length;k<m;k+=3,n++){var q=a[b[k]],s=a[b[k+1]],t=a[b[k+2]];p[n]=new THREE.Face3(q.index,s.index,t.index,[q.clone(),s.clone(),t.clone()],void 0,n)}for(var v=new THREE.Vector3,k=0,m=p.length;k<m;k++)f(p[k],d);k=0;for(m=this.faceVertexUvs[0].length;k<
+m;k++)b=this.faceVertexUvs[0][k],d=b[0].x,a=b[1].x,p=b[2].x,n=Math.max(d,a,p),q=Math.min(d,a,p),.9<n&&.1>q&&(.2>d&&(b[0].x+=1),.2>a&&(b[1].x+=1),.2>p&&(b[2].x+=1));k=0;for(m=this.vertices.length;k<m;k++)this.vertices[k].multiplyScalar(c);this.mergeVertices();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,c)};THREE.PolyhedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.PolyhedronGeometry.prototype.constructor=THREE.PolyhedronGeometry;
+THREE.PolyhedronGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.PolyhedronGeometry(a.vertices,a.indices,a.radius,a.detail)};
+THREE.DodecahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;THREE.PolyhedronGeometry.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,
+12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b}};THREE.DodecahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype);THREE.DodecahedronGeometry.prototype.constructor=THREE.DodecahedronGeometry;THREE.DodecahedronGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.DodecahedronGeometry(a.radius,a.detail)};
+THREE.IcosahedronGeometry=function(a,b){var c=(1+Math.sqrt(5))/2;THREE.PolyhedronGeometry.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b}};THREE.IcosahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype);
+THREE.IcosahedronGeometry.prototype.constructor=THREE.IcosahedronGeometry;THREE.IcosahedronGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.IcosahedronGeometry(a.radius,a.detail)};THREE.OctahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b}};THREE.OctahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype);
+THREE.OctahedronGeometry.prototype.constructor=THREE.OctahedronGeometry;THREE.OctahedronGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.OctahedronGeometry(a.radius,a.detail)};THREE.TetrahedronGeometry=function(a,b){THREE.PolyhedronGeometry.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b}};THREE.TetrahedronGeometry.prototype=Object.create(THREE.PolyhedronGeometry.prototype);
+THREE.TetrahedronGeometry.prototype.constructor=THREE.TetrahedronGeometry;THREE.TetrahedronGeometry.prototype.clone=function(){var a=this.parameters;return new THREE.TetrahedronGeometry(a.radius,a.detail)};
+THREE.ParametricGeometry=function(a,b,c){THREE.Geometry.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};var d=this.vertices,e=this.faces,g=this.faceVertexUvs[0],f,h,l,k,m=b+1;for(f=0;f<=c;f++)for(k=f/c,h=0;h<=b;h++)l=h/b,l=a(l,k),d.push(l);var p,n,q,s;for(f=0;f<c;f++)for(h=0;h<b;h++)a=f*m+h,d=f*m+h+1,k=(f+1)*m+h+1,l=(f+1)*m+h,p=new THREE.Vector2(h/b,f/c),n=new THREE.Vector2((h+1)/b,f/c),q=new THREE.Vector2((h+1)/b,(f+1)/c),s=new THREE.Vector2(h/b,(f+1)/c),e.push(new THREE.Face3(a,
+d,l)),g.push([p,n,s]),e.push(new THREE.Face3(d,k,l)),g.push([n.clone(),q,s.clone()]);this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ParametricGeometry.prototype.constructor=THREE.ParametricGeometry;
+THREE.WireframeGeometry=function(a){function b(a,b){return a-b}THREE.BufferGeometry.call(this);var c=[0,0],d={},e=["a","b","c"];if(a instanceof THREE.Geometry){var g=a.vertices,f=a.faces,h=0,l=new Uint32Array(6*f.length);a=0;for(var k=f.length;a<k;a++)for(var m=f[a],p=0;3>p;p++){c[0]=m[e[p]];c[1]=m[e[(p+1)%3]];c.sort(b);var n=c.toString();void 0===d[n]&&(l[2*h]=c[0],l[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(k=h;a<k;a++)for(p=0;2>p;p++)d=g[l[2*a+p]],h=6*a+3*p,c[h+0]=d.x,c[h+1]=d.y,
+c[h+2]=d.z;this.addAttribute("position",new THREE.BufferAttribute(c,3))}else if(a instanceof THREE.BufferGeometry){if(null!==a.index){k=a.index.array;g=a.attributes.position;e=a.drawcalls;h=0;0===e.length&&a.addGroup(0,k.length);l=new Uint32Array(2*k.length);f=0;for(m=e.length;f<m;++f){a=e[f];p=a.start;n=a.count;a=p;for(var q=p+n;a<q;a+=3)for(p=0;3>p;p++)c[0]=k[a+p],c[1]=k[a+(p+1)%3],c.sort(b),n=c.toString(),void 0===d[n]&&(l[2*h]=c[0],l[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(k=
+h;a<k;a++)for(p=0;2>p;p++)h=6*a+3*p,d=l[2*a+p],c[h+0]=g.getX(d),c[h+1]=g.getY(d),c[h+2]=g.getZ(d)}else for(g=a.attributes.position.array,h=g.length/3,l=h/3,c=new Float32Array(6*h),a=0,k=l;a<k;a++)for(p=0;3>p;p++)h=18*a+6*p,l=9*a+3*p,c[h+0]=g[l],c[h+1]=g[l+1],c[h+2]=g[l+2],d=9*a+(p+1)%3*3,c[h+3]=g[d],c[h+4]=g[d+1],c[h+5]=g[d+2];this.addAttribute("position",new THREE.BufferAttribute(c,3))}};THREE.WireframeGeometry.prototype=Object.create(THREE.BufferGeometry.prototype);
+THREE.WireframeGeometry.prototype.constructor=THREE.WireframeGeometry;THREE.AxisHelper=function(a){a=a||1;var b=new Float32Array([0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a]),c=new Float32Array([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1]);a=new THREE.BufferGeometry;a.addAttribute("position",new THREE.BufferAttribute(b,3));a.addAttribute("color",new THREE.BufferAttribute(c,3));b=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});THREE.LineSegments.call(this,a,b)};THREE.AxisHelper.prototype=Object.create(THREE.LineSegments.prototype);
+THREE.AxisHelper.prototype.constructor=THREE.AxisHelper;
+THREE.ArrowHelper=function(){var a=new THREE.Geometry;a.vertices.push(new THREE.Vector3(0,0,0),new THREE.Vector3(0,1,0));var b=new THREE.CylinderGeometry(0,.5,1,5,1);b.translate(0,-.5,0);return function(c,d,e,g,f,h){THREE.Object3D.call(this);void 0===g&&(g=16776960);void 0===e&&(e=1);void 0===f&&(f=.2*e);void 0===h&&(h=.2*f);this.position.copy(d);f<e&&(this.line=new THREE.Line(a,new THREE.LineBasicMaterial({color:g})),this.line.matrixAutoUpdate=!1,this.add(this.line));this.cone=new THREE.Mesh(b,new THREE.MeshBasicMaterial({color:g}));
+this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(c);this.setLength(e,f,h)}}();THREE.ArrowHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.ArrowHelper.prototype.constructor=THREE.ArrowHelper;THREE.ArrowHelper.prototype.setDirection=function(){var a=new THREE.Vector3,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();
+THREE.ArrowHelper.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);b<a&&(this.line.scale.set(1,a-b,1),this.line.updateMatrix());this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};THREE.ArrowHelper.prototype.setColor=function(a){void 0!==this.line&&this.line.material.color.set(a);this.cone.material.color.set(a)};
+THREE.BoxHelper=function(a){var b=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),c=new Float32Array(24),d=new THREE.BufferGeometry;d.setIndex(new THREE.BufferAttribute(b,1));d.addAttribute("position",new THREE.BufferAttribute(c,3));THREE.LineSegments.call(this,d,new THREE.LineBasicMaterial({color:16776960}));void 0!==a&&this.update(a)};THREE.BoxHelper.prototype=Object.create(THREE.LineSegments.prototype);THREE.BoxHelper.prototype.constructor=THREE.BoxHelper;
+THREE.BoxHelper.prototype.update=function(){var a=new THREE.Box3;return function(b){a.setFromObject(b);if(!a.empty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();
+THREE.BoundingBoxHelper=function(a,b){var c=void 0!==b?b:8947848;this.object=a;this.box=new THREE.Box3;THREE.Mesh.call(this,new THREE.BoxGeometry(1,1,1),new THREE.MeshBasicMaterial({color:c,wireframe:!0}))};THREE.BoundingBoxHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.BoundingBoxHelper.prototype.constructor=THREE.BoundingBoxHelper;THREE.BoundingBoxHelper.prototype.update=function(){this.box.setFromObject(this.object);this.box.size(this.scale);this.box.center(this.position)};
+THREE.CameraHelper=function(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){d.vertices.push(new THREE.Vector3);d.colors.push(new THREE.Color(b));void 0===g[a]&&(g[a]=[]);g[a].push(d.vertices.length-1)}var d=new THREE.Geometry,e=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors}),g={};b("n1","n2",16755200);b("n2","n4",16755200);b("n4","n3",16755200);b("n3","n1",16755200);b("f1","f2",16755200);b("f2","f4",16755200);b("f4","f3",16755200);b("f3","f1",16755200);b("n1","f1",16755200);
+b("n2","f2",16755200);b("n3","f3",16755200);b("n4","f4",16755200);b("p","n1",16711680);b("p","n2",16711680);b("p","n3",16711680);b("p","n4",16711680);b("u1","u2",43775);b("u2","u3",43775);b("u3","u1",43775);b("c","t",16777215);b("p","c",3355443);b("cn1","cn2",3355443);b("cn3","cn4",3355443);b("cf1","cf2",3355443);b("cf3","cf4",3355443);THREE.LineSegments.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=g;this.update()};
+THREE.CameraHelper.prototype=Object.create(THREE.LineSegments.prototype);THREE.CameraHelper.prototype.constructor=THREE.CameraHelper;
+THREE.CameraHelper.prototype.update=function(){function a(a,f,h,l){d.set(f,h,l).unproject(e);a=c[a];if(void 0!==a)for(f=0,h=a.length;f<h;f++)b.vertices[a[f]].copy(d)}var b,c,d=new THREE.Vector3,e=new THREE.Camera;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1,1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,
+-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1",-1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",0,1,-1);b.verticesNeedUpdate=!0}}();
+THREE.DirectionalLightHelper=function(a,b){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;b=b||1;var c=new THREE.Geometry;c.vertices.push(new THREE.Vector3(-b,b,0),new THREE.Vector3(b,b,0),new THREE.Vector3(b,-b,0),new THREE.Vector3(-b,-b,0),new THREE.Vector3(-b,b,0));var d=new THREE.LineBasicMaterial({fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.lightPlane=new THREE.Line(c,d);this.add(this.lightPlane);
+c=new THREE.Geometry;c.vertices.push(new THREE.Vector3,new THREE.Vector3);d=new THREE.LineBasicMaterial({fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine=new THREE.Line(c,d);this.add(this.targetLine);this.update()};THREE.DirectionalLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.DirectionalLightHelper.prototype.constructor=THREE.DirectionalLightHelper;
+THREE.DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};
+THREE.DirectionalLightHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);this.lightPlane.lookAt(c);this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine.geometry.vertices[1].copy(c);this.targetLine.geometry.verticesNeedUpdate=!0;this.targetLine.material.color.copy(this.lightPlane.material.color)}}();
+THREE.EdgesHelper=function(a,b,c){b=void 0!==b?b:16777215;THREE.LineSegments.call(this,new THREE.EdgesGeometry(a.geometry,c),new THREE.LineBasicMaterial({color:b}));this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1};THREE.EdgesHelper.prototype=Object.create(THREE.LineSegments.prototype);THREE.EdgesHelper.prototype.constructor=THREE.EdgesHelper;
+THREE.FaceNormalsHelper=function(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;c=this.object.geometry;c instanceof THREE.Geometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");c=new THREE.BufferGeometry;b=new THREE.Float32Attribute(6*b,3);c.addAttribute("position",b);THREE.LineSegments.call(this,c,new THREE.LineBasicMaterial({color:a,linewidth:d}));this.matrixAutoUpdate=
+!1;this.update()};THREE.FaceNormalsHelper.prototype=Object.create(THREE.LineSegments.prototype);THREE.FaceNormalsHelper.prototype.constructor=THREE.FaceNormalsHelper;
+THREE.FaceNormalsHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Matrix3;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,g=this.object.geometry,f=g.vertices,g=g.faces,h=0,l=0,k=g.length;l<k;l++){var m=g[l],p=m.normal;a.copy(f[m.a]).add(f[m.b]).add(f[m.c]).divideScalar(3).applyMatrix4(d);b.copy(p).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);
+e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0;return this}}();
+THREE.GridHelper=function(a,b){var c=new THREE.Geometry,d=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});this.color1=new THREE.Color(4473924);this.color2=new THREE.Color(8947848);for(var e=-a;e<=a;e+=b){c.vertices.push(new THREE.Vector3(-a,0,e),new THREE.Vector3(a,0,e),new THREE.Vector3(e,0,-a),new THREE.Vector3(e,0,a));var g=0===e?this.color1:this.color2;c.colors.push(g,g,g,g)}THREE.LineSegments.call(this,c,d)};THREE.GridHelper.prototype=Object.create(THREE.LineSegments.prototype);
+THREE.GridHelper.prototype.constructor=THREE.GridHelper;THREE.GridHelper.prototype.setColors=function(a,b){this.color1.set(a);this.color2.set(b);this.geometry.colorsNeedUpdate=!0};
+THREE.HemisphereLightHelper=function(a,b){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.colors=[new THREE.Color,new THREE.Color];var c=new THREE.SphereGeometry(b,4,2);c.rotateX(-Math.PI/2);for(var d=0;8>d;d++)c.faces[d].color=this.colors[4>d?0:1];d=new THREE.MeshBasicMaterial({vertexColors:THREE.FaceColors,wireframe:!0});this.lightSphere=new THREE.Mesh(c,d);this.add(this.lightSphere);this.update()};
+THREE.HemisphereLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.HemisphereLightHelper.prototype.constructor=THREE.HemisphereLightHelper;THREE.HemisphereLightHelper.prototype.dispose=function(){this.lightSphere.geometry.dispose();this.lightSphere.material.dispose()};
+THREE.HemisphereLightHelper.prototype.update=function(){var a=new THREE.Vector3;return function(){this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity);this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity);this.lightSphere.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());this.lightSphere.geometry.colorsNeedUpdate=!0}}();
+THREE.PointLightHelper=function(a,b){this.light=a;this.light.updateMatrixWorld();var c=new THREE.SphereGeometry(b,4,2),d=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);THREE.Mesh.call(this,c,d);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1};THREE.PointLightHelper.prototype=Object.create(THREE.Mesh.prototype);THREE.PointLightHelper.prototype.constructor=THREE.PointLightHelper;
+THREE.PointLightHelper.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};THREE.PointLightHelper.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)};
+THREE.SkeletonHelper=function(a){this.bones=this.getBoneList(a);for(var b=new THREE.Geometry,c=0;c<this.bones.length;c++)this.bones[c].parent instanceof THREE.Bone&&(b.vertices.push(new THREE.Vector3),b.vertices.push(new THREE.Vector3),b.colors.push(new THREE.Color(0,0,1)),b.colors.push(new THREE.Color(0,1,0)));b.dynamic=!0;c=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors,depthTest:!1,depthWrite:!1,transparent:!0});THREE.LineSegments.call(this,b,c);this.root=a;this.matrix=a.matrixWorld;
+this.matrixAutoUpdate=!1;this.update()};THREE.SkeletonHelper.prototype=Object.create(THREE.LineSegments.prototype);THREE.SkeletonHelper.prototype.constructor=THREE.SkeletonHelper;THREE.SkeletonHelper.prototype.getBoneList=function(a){var b=[];a instanceof THREE.Bone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,this.getBoneList(a.children[c]));return b};
+THREE.SkeletonHelper.prototype.update=function(){for(var a=this.geometry,b=(new THREE.Matrix4).getInverse(this.root.matrixWorld),c=new THREE.Matrix4,d=0,e=0;e<this.bones.length;e++){var g=this.bones[e];g.parent instanceof THREE.Bone&&(c.multiplyMatrices(b,g.matrixWorld),a.vertices[d].setFromMatrixPosition(c),c.multiplyMatrices(b,g.parent.matrixWorld),a.vertices[d+1].setFromMatrixPosition(c),d+=2)}a.verticesNeedUpdate=!0;a.computeBoundingSphere()};
+THREE.SpotLightHelper=function(a){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;a=new THREE.CylinderGeometry(0,1,1,8,1,!0);a.translate(0,-.5,0);a.rotateX(-Math.PI/2);var b=new THREE.MeshBasicMaterial({wireframe:!0,fog:!1});this.cone=new THREE.Mesh(a,b);this.add(this.cone);this.update()};THREE.SpotLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.SpotLightHelper.prototype.constructor=THREE.SpotLightHelper;
+THREE.SpotLightHelper.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};THREE.SpotLightHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(){var c=this.light.distance?this.light.distance:1E4,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)}}();
+THREE.VertexNormalsHelper=function(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;c=this.object.geometry;c instanceof THREE.Geometry?b=3*c.faces.length:c instanceof THREE.BufferGeometry&&(b=c.attributes.normal.count);c=new THREE.BufferGeometry;b=new THREE.Float32Attribute(6*b,3);c.addAttribute("position",b);THREE.LineSegments.call(this,c,new THREE.LineBasicMaterial({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()};
+THREE.VertexNormalsHelper.prototype=Object.create(THREE.LineSegments.prototype);THREE.VertexNormalsHelper.prototype.constructor=THREE.VertexNormalsHelper;
+THREE.VertexNormalsHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Matrix3;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);var e=this.object.matrixWorld,g=this.geometry.attributes.position,f=this.object.geometry;if(f instanceof THREE.Geometry)for(var h=f.vertices,l=f.faces,k=f=0,m=l.length;k<m;k++)for(var p=l[k],n=0,q=p.vertexNormals.length;n<q;n++){var s=p.vertexNormals[n];a.copy(h[p[d[n]]]).applyMatrix4(e);
+b.copy(s).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);g.setXYZ(f,a.x,a.y,a.z);f+=1;g.setXYZ(f,b.x,b.y,b.z);f+=1}else if(f instanceof THREE.BufferGeometry)for(d=f.attributes.position,h=f.attributes.normal,n=f=0,q=d.count;n<q;n++)a.set(d.getX(n),d.getY(n),d.getZ(n)).applyMatrix4(e),b.set(h.getX(n),h.getY(n),h.getZ(n)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),g.setXYZ(f,a.x,a.y,a.z),f+=1,g.setXYZ(f,b.x,b.y,b.z),f+=1;g.needsUpdate=!0;return this}}();
+THREE.WireframeHelper=function(a,b){var c=void 0!==b?b:16777215;THREE.LineSegments.call(this,new THREE.WireframeGeometry(a.geometry),new THREE.LineBasicMaterial({color:c}));this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1};THREE.WireframeHelper.prototype=Object.create(THREE.LineSegments.prototype);THREE.WireframeHelper.prototype.constructor=THREE.WireframeHelper;THREE.ImmediateRenderObject=function(a){THREE.Object3D.call(this);this.material=a;this.render=function(a){}};
+THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);THREE.ImmediateRenderObject.prototype.constructor=THREE.ImmediateRenderObject;THREE.MorphBlendMesh=function(a,b){THREE.Mesh.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation("__default",0,c-1,c/1);this.setAnimationWeight("__default",1)};THREE.MorphBlendMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.MorphBlendMesh.prototype.constructor=THREE.MorphBlendMesh;
+THREE.MorphBlendMesh.prototype.createAnimation=function(a,b,c,d){b={start:b,end:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[a]=b;this.animationsList.push(b)};
+THREE.MorphBlendMesh.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\d+)/,c,d={},e=this.geometry,g=0,f=e.morphTargets.length;g<f;g++){var h=e.morphTargets[g].name.match(b);if(h&&1<h.length){var l=h[1];d[l]||(d[l]={start:Infinity,end:-Infinity});h=d[l];g<h.start&&(h.start=g);g>h.end&&(h.end=g);c||(c=l)}}for(l in d)h=d[l],this.createAnimation(l,h.start,h.end,a);this.firstAnimation=c};
+THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};
+THREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};
+THREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+a+"] undefined in .playAnimation()")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};
+THREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time+=d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var g=d.start+THREE.Math.clamp(Math.floor(d.time/e),0,d.length-1),f=d.weight;g!==d.currentFrame&&
+(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*f,this.morphTargetInfluences[g]=0,d.lastFrame=d.currentFrame,d.currentFrame=g);e=d.time%e/e;d.directionBackwards&&(e=1-e);d.currentFrame!==d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*f,this.morphTargetInfluences[d.lastFrame]=(1-e)*f):this.morphTargetInfluences[d.currentFrame]=f}}};
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension-dependencies.js b/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension-dependencies.js
new file mode 100644
index 0000000000000000000000000000000000000000..9f4ed3b799f5956fb5eb170ef1b69c2c096b83d8
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension-dependencies.js
@@ -0,0 +1,5 @@
+define(function() {
+    return {
+        dependencies: ['mediaelement-and-player', 'iiif-metadata-component']
+    };
+});
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension.cy-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension.cy-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..6755d9e281c5e60100246304fb3d3367a093a1ac
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension.cy-GB.config.json
@@ -0,0 +1 @@
+{"options":{"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"leftPanelEnabled":true,"limitLocales":false,"openTemplate":"http://universalviewer.io?manifest={0}","pessimisticAccessControl":false,"rightPanelEnabled":true,"theme":"uv-en-GB-theme"},"modules":{"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" style=\"width:{7}px; height:{8}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{9}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>"},"content":{"customSize":"arfer","embed":"gwreiddio","embedInstructions":"Er mwyn ymgorffori'r eitem hon ar eich gwefan, cop�wch a gosodwch y cod isod.","height":"Hyd","iiif":"IIIF Manifest","share":"Rhannu","shareInstructions":"I rannu yr eitem hon, copïwch y URL isod.","size":"maint:","width":"Lled"}},"footerPanel":{"options":{"bookmarkEnabled":false,"embedEnabled":false,"feedbackEnabled":false,"minimiseButtons":true,"openEnabled":false,"shareEnabled":true},"content":{"bookmark":"Ychwanegu at nodau tudalen","download":"Lawrlwytho","embed":"Ymgorffori","exitFullScreen":"Dianc o'r sgrin lawn","fullScreen":"Sgrin lawn","open":"agored"}},"genericDialogue":{"content":{"ok":"GWELD"}},"headerPanel":{"content":{"close":"Cau","help":"Cymorth"}},"helpDialogue":{"content":{"text":"testun i'w osod","title":"Cymorth"}},"mediaelementCenterPanel":{"defaultHeight":576,"defaultWidth":720,"content":{}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Priodoledd","collapse":"Lleihau'r Wybodaeth","collapseFull":"Cuddio'r Galeri","description":"Disgrifiad","expand":"Ehangu'r Wybodaeth","expandFull":"Ehangu'r Galeri","holdingText":"Eich modiwl fan hyn!","less":"llai","license":"Trwydded","logo":"Logo","more":"mwy","noData":"Nid oes data i'w arddangos","page":"tudalen","title":"Mwy o Wybodaeth","manifestHeader":"Am yr eitem","canvasHeader":"Am y ddelwedd","copyToClipboard":"Copïo i'r clipfwrdd","copiedToClipboard":"Copïwyd i'r clipfwrdd"}},"resourcesLeftPanel":{"options":{"expandFullEnabled":false,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true},"content":{"title":"Cynnwys"}},"dialogue":{"content":{"close":"Cau"}},"downloadDialogue":{"content":{"download":"Lawrlwytho","entireFileAsOriginal":"Y ffeil gyfan ({0})","noneAvailable":"Nid oes unrhyw opsiynau lawrlwytho ar gael.","preview":"Rhagolwg","title":"Lawrlwytho"}},"loginDialogue":{"content":{"login":"Mewngofnodi","cancel":"Diddymu"}},"settingsDialogue":{"content":{"locale":"Iaith","pagingEnabled":"Arddangos dwy dudalen","preserveViewport":"Cadw'r lefel o glosio","title":"Dewisiadau","website":"<a href='https://github.com/universalviewer/universalviewer'>mwy o wybodaeth</a>"}}},"localisation":{"label":"Cymraeg","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Eich porwr yn peidio cefnogi CORS, os gwelwch yn dda uwchraddio i weld y cynnwys hwn.","authorisationFailedMessage":"Nid oedd yn ymddangos eich ymgais mewngofnodi i fod yn llwyddiannus . Trio eto os gwelwch yn dda.","degradedResourceMessage":"Os gwelwch yn dda mewngofnodwch i weld yn ansawdd llawn.","degradedResourceLogin":"Mewngofnodi","forbiddenResourceMessage":"Eich hawliau mynediad presennol yn annigonol i weld llun hwn"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension.en-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension.en-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..63dcadc2eea7d205e96abe584dc2c40dbd539d20
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-mediaelement-extension.en-GB.config.json
@@ -0,0 +1 @@
+{"options":{"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"leftPanelEnabled":true,"limitLocales":false,"openTemplate":"http://universalviewer.io?manifest={0}","pessimisticAccessControl":false,"rightPanelEnabled":true,"theme":"uv-en-GB-theme"},"modules":{"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" style=\"width:{7}px; height:{8}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{9}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>"},"content":{"customSize":"custom","embed":"Embed","embedInstructions":"To embed this item in your own website, copy and paste the code below.","height":"Height","iiif":"IIIF Manifest","share":"Share","shareInstructions":"To share this item, copy the URL below.","size":"Size:","width":"Width"}},"footerPanel":{"options":{"bookmarkEnabled":false,"embedEnabled":false,"feedbackEnabled":false,"minimiseButtons":true,"openEnabled":false,"shareEnabled":true},"content":{"bookmark":"Add to bookmarks","download":"Download","embed":"Share","exitFullScreen":"Exit Full Screen","fullScreen":"Full Screen","open":"Open"}},"genericDialogue":{"content":{"ok":"OK"}},"headerPanel":{"content":{"close":"Close","help":"Help"}},"helpDialogue":{"content":{"text":"placeholder text","title":"Help"}},"mediaelementCenterPanel":{"defaultHeight":576,"defaultWidth":720,"content":{}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Attribution","collapse":"Collapse Information","collapseFull":"Collapse Gallery","description":"Description","expand":"Expand Information","expandFull":"Expand Gallery","holdingText":"Your module goes here!","less":"less","license":"License","logo":"Logo","more":"more","noData":"No data to display","page":"Page","title":"More Information","manifestHeader":"About the item","canvasHeader":"About the image","copyToClipboard":"Copy to clipboard","copiedToClipboard":"Copied to clipboard"}},"resourcesLeftPanel":{"options":{"expandFullEnabled":false,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true},"content":{"title":"Contents"}},"dialogue":{"content":{"close":"Close"}},"downloadDialogue":{"content":{"download":"Download","entireFileAsOriginal":"Entire file ({0})","noneAvailable":"No download options are available.","preview":"Preview","title":"Download"}},"loginDialogue":{"content":{"login":"Login","cancel":"Cancel"}},"settingsDialogue":{"content":{"locale":"Locale","pagingEnabled":"Two Page View","preserveViewport":"Preserve Zoom","title":"Settings","website":"<a href='https://github.com/universalviewer/universalviewer'>more info</a>"}}},"localisation":{"label":"English (GB)","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Your browser does not support CORS, please upgrade to view this content.","authorisationFailedMessage":"Your log-in attempt did not appear to be successful. Please try again.","degradedResourceMessage":"Please log in to view at full quality.","degradedResourceLogin":"log in","forbiddenResourceMessage":"Your current access rights are insufficient to view this image"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension-dependencies.js b/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension-dependencies.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb923c7586e2ebe8df5ad549dc3baf365c8f028a
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension-dependencies.js
@@ -0,0 +1,5 @@
+define(function() {
+    return {
+        dependencies: ['l10n', 'pdf_combined', 'pdfobject', 'iiif-metadata-component']
+    };
+});
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension.cy-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension.cy-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..bd5d8c84ec8694f915332893e2318741a0c25db0
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension.cy-GB.config.json
@@ -0,0 +1 @@
+{"options":{"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"limitLocales":false,"openTemplate":"http://universalviewer.io?manifest={0}","pessimisticAccessControl":false,"rightPanelEnabled":true,"theme":"uv-en-GB-theme"},"modules":{"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" style=\"width:{7}px; height:{8}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{9}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>"},"content":{"customSize":"arfer","embed":"gwreiddio","embedInstructions":"Er mwyn ymgorffori'r eitem hon ar eich gwefan, cop�wch a gosodwch y cod isod.","height":"Hyd","iiif":"IIIF Manifest","share":"Rhannu","shareInstructions":"I rannu yr eitem hon, copïwch y URL isod.","size":"maint:","width":"Lled"}},"footerPanel":{"options":{"bookmarkEnabled":false,"embedEnabled":false,"feedbackEnabled":false,"minimiseButtons":true,"openEnabled":false,"shareEnabled":true},"content":{"bookmark":"Ychwanegu at nodau tudalen","download":"Lawrlwytho","embed":"Ymgorffori","exitFullScreen":"Dianc o'r sgrin lawn","fullScreen":"Sgrin lawn","open":"agored"}},"genericDialogue":{"content":{"ok":"GWELD"}},"headerPanel":{},"helpDialogue":{"content":{"text":"testun i'w osod","title":"Cymorth"}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Priodoledd","collapse":"Lleihau'r Wybodaeth","collapseFull":"Cuddio'r Galeri","description":"Disgrifiad","expand":"Ehangu'r Wybodaeth","expandFull":"Ehangu'r Galeri","holdingText":"Eich modiwl fan hyn!","less":"llai","license":"Trwydded","logo":"Logo","more":"mwy","noData":"Nid oes data i'w arddangos","page":"tudalen","title":"Mwy o Wybodaeth","manifestHeader":"Am yr eitem","canvasHeader":"Am y ddelwedd","copyToClipboard":"Copïo i'r clipfwrdd","copiedToClipboard":"Copïwyd i'r clipfwrdd"}},"pdfCenterPanel":{"options":{"titleEnabled":false,"usePdfJs":true}},"resourcesLeftPanel":{"options":{"elideCount":40,"galleryThumbHeight":320,"galleryThumbWidth":200,"oneColThumbHeight":320,"oneColThumbWidth":200,"pageModeEnabled":true,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true,"thumbsEnabled":true,"thumbsExtraHeight":8,"thumbsImageFadeInDuration":300,"thumbsLoadRange":15,"treeEnabled":true,"twoColThumbHeight":150,"twoColThumbWidth":90}},"dialogue":{"content":{"close":"Cau"}},"downloadDialogue":{"content":{"download":"Lawrlwytho","entireFileAsOriginal":"Y ffeil gyfan ({0})","noneAvailable":"Nid oes unrhyw opsiynau lawrlwytho ar gael.","preview":"Rhagolwg","title":"Lawrlwytho"}},"loginDialogue":{"content":{"login":"Mewngofnodi","cancel":"Diddymu"}},"settingsDialogue":{"content":{"locale":"Iaith","pagingEnabled":"Arddangos dwy dudalen","preserveViewport":"Cadw'r lefel o glosio","title":"Dewisiadau","website":"<a href='https://github.com/universalviewer/universalviewer'>mwy o wybodaeth</a>"}},"contentLeftPanel":{"content":{"collapse":"Cuddio'r Cynnwys","collapseFull":"Cuddio'r Galeri","expand":"Ehangu'r Cynnwys","expandFull":"Ehangu'r Galeri","index":"Mynegai","thumbnails":"Bodluniau","title":"Cynnwys"}}},"localisation":{"label":"Cymraeg","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Eich porwr yn peidio cefnogi CORS, os gwelwch yn dda uwchraddio i weld y cynnwys hwn.","authorisationFailedMessage":"Nid oedd yn ymddangos eich ymgais mewngofnodi i fod yn llwyddiannus . Trio eto os gwelwch yn dda.","degradedResourceMessage":"Os gwelwch yn dda mewngofnodwch i weld yn ansawdd llawn.","degradedResourceLogin":"Mewngofnodi","forbiddenResourceMessage":"Eich hawliau mynediad presennol yn annigonol i weld llun hwn"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension.en-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension.en-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..485b0410fee9450afe96429f43d90694c82903d2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-pdf-extension.en-GB.config.json
@@ -0,0 +1 @@
+{"options":{"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"limitLocales":false,"openTemplate":"http://universalviewer.io?manifest={0}","pessimisticAccessControl":false,"rightPanelEnabled":true,"theme":"uv-en-GB-theme"},"modules":{"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" style=\"width:{7}px; height:{8}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{9}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>"},"content":{"customSize":"custom","embed":"Embed","embedInstructions":"To embed this item in your own website, copy and paste the code below.","height":"Height","iiif":"IIIF Manifest","share":"Share","shareInstructions":"To share this item, copy the URL below.","size":"Size:","width":"Width"}},"footerPanel":{"options":{"bookmarkEnabled":false,"embedEnabled":false,"feedbackEnabled":false,"minimiseButtons":true,"openEnabled":false,"shareEnabled":true},"content":{"bookmark":"Add to bookmarks","download":"Download","embed":"Share","exitFullScreen":"Exit Full Screen","fullScreen":"Full Screen","open":"Open"}},"genericDialogue":{"content":{"ok":"OK"}},"headerPanel":{"content":{"close":"Close","help":"Help"}},"helpDialogue":{"content":{"text":"placeholder text","title":"Help"}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Attribution","collapse":"Collapse Information","collapseFull":"Collapse Gallery","description":"Description","expand":"Expand Information","expandFull":"Expand Gallery","holdingText":"Your module goes here!","less":"less","license":"License","logo":"Logo","more":"more","noData":"No data to display","page":"Page","title":"More Information","manifestHeader":"About the item","canvasHeader":"About the image","copyToClipboard":"Copy to clipboard","copiedToClipboard":"Copied to clipboard"}},"pdfCenterPanel":{"options":{"titleEnabled":false,"usePdfJs":true},"content":{}},"resourcesLeftPanel":{"options":{"elideCount":40,"galleryThumbHeight":320,"galleryThumbWidth":200,"oneColThumbHeight":320,"oneColThumbWidth":200,"pageModeEnabled":true,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true,"thumbsEnabled":true,"thumbsExtraHeight":8,"thumbsImageFadeInDuration":300,"thumbsLoadRange":15,"treeEnabled":true,"twoColThumbHeight":150,"twoColThumbWidth":90}},"dialogue":{"content":{"close":"Close"}},"downloadDialogue":{"content":{"download":"Download","entireFileAsOriginal":"Entire file ({0})","noneAvailable":"No download options are available.","preview":"Preview","title":"Download"}},"loginDialogue":{"content":{"login":"Login","cancel":"Cancel"}},"settingsDialogue":{"content":{"locale":"Locale","pagingEnabled":"Two Page View","preserveViewport":"Preserve Zoom","title":"Settings","website":"<a href='https://github.com/universalviewer/universalviewer'>more info</a>"}},"contentLeftPanel":{}},"localisation":{"label":"English (GB)","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Your browser does not support CORS, please upgrade to view this content.","authorisationFailedMessage":"Your log-in attempt did not appear to be successful. Please try again.","degradedResourceMessage":"Please log in to view at full quality.","degradedResourceLogin":"log in","forbiddenResourceMessage":"Your current access rights are insufficient to view this image"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension-dependencies.js b/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension-dependencies.js
new file mode 100644
index 0000000000000000000000000000000000000000..f7f855dbb2fb5b7af2e0b8cc9f3b587927493280
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension-dependencies.js
@@ -0,0 +1,5 @@
+define(function() {
+    return {
+        dependencies: ['iiif-tree-component', 'iiif-gallery-component', 'iiif-metadata-component', 'openseadragon.min']
+    };
+});
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension.cy-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension.cy-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..aef3a67708c73791aa09aa16b01a0fbd0b27f468
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension.cy-GB.config.json
@@ -0,0 +1 @@
+{"options":{"allowStealFocus":false,"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"leftPanelEnabled":true,"limitLocales":false,"metrics":[{"type":"mobilelandscape","minWidth":0,"maxWidth":640},{"type":"laptop","minWidth":640,"maxWidth":100000}],"multiSelectionMimeType":"application/zip","navigatorEnabled":true,"openTemplate":"http://universalviewer.io?manifest={0}","overrideFullScreen":false,"pagingEnabled":true,"pagingOptionEnabled":true,"pessimisticAccessControl":false,"preserveViewport":false,"rightPanelEnabled":true,"saveUserSettings":false,"clickToZoomEnabled":true,"searchWithinEnabled":true,"termsOfUseEnabled":false,"theme":"uv-cy-GB-theme","tokenStorage":"session","useArrowKeysToNavigate":false,"zoomToSearchResultEnabled":true},"modules":{"contentLeftPanel":{"options":{"defaultToTreeEnabled":false,"defaultToTreeIfGreaterThan":0,"elideCount":40,"expandFullEnabled":true,"galleryThumbChunkedResizingThreshold":400,"galleryThumbHeight":320,"galleryThumbLoadPadding":3,"galleryThumbWidth":200,"oneColThumbHeight":320,"oneColThumbWidth":200,"pageModeEnabled":true,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true,"tabOrder":"","thumbsEnabled":true,"thumbsExtraHeight":8,"thumbsImageFadeInDuration":300,"thumbsLoadRange":15,"treeEnabled":true,"twoColThumbHeight":150,"twoColThumbWidth":90},"content":{"collapse":"Lleihau'r Cynnwys","collapseFull":"Lleihau'r Galeri","date":"Dyddiad","expand":"Ehangu'r Cynnwys","expandFull":"Ehangu'r Galeri","index":"Mynegai","searchResult":"{0} canlyniad chwilio","searchResults":"{0} canlyniad chwilio","sortBy":"Trefnu yn ôl:","thumbnails":"Bodluniau","title":"Cynnwys","volume":"cyfrol"}},"dialogue":{"content":{"close":"Cau"}},"downloadDialogue":{"options":{"confinedImageSize":1000,"currentViewDisabledPercentage":90,"maxImageWidth":5000,"optionsExplanatoryTextEnabled":false,"selectionEnabled":false},"content":{"currentViewAsJpg":"Delwedd ddethol {0} x {1}px (jpg)","currentViewAsJpgExplanation":"Agor mewn dwy ffenest newydd.","download":"Lawrlwytho","downloadSelection":"Lawrlwytho'r detholiad","downloadSelectionExplanation":"Agor ffenest er mwyn dewis tudalennau i'w lawrlwytho.","editSettings":"Golygu'r dewisiadau","entireDocument":"Y Ddogfen Gyfan ({0})","entireFileAsOriginal":"Y ffeil gyfan ({0})","noneAvailable":"Nid oes unrhyw opsiynau lawrlwytho ar gael.","pagingNote":"Dad-ddewiswch 'Arddangos Dwy Dudalen' i weld dewisiadau pellach.","preview":"Rhagolwg","title":"Lawrlwytho","wholeImageHighRes":"Delwedd gyfan {0} x {1}px ({2})","wholeImageHighResExplanation":"Agor mewn ffenest newydd","wholeImagesHighRes":"Delweddau cyfan ({0})","wholeImagesHighResExplanation":"Agor mewn dwy ffenest newydd.","wholeImageLowResAsJpg":"Delwedd gyfan {0} x {1}px (jpg)","wholeImageLowResAsJpgExplanation":"Agor mewn ffenest newydd"}},"footerPanel":{"options":{"bookmarkEnabled":false,"downloadEnabled":true,"embedEnabled":false,"feedbackEnabled":false,"fullscreenEnabled":true,"minimiseButtons":true,"moreInfoEnabled":true,"openEnabled":false,"printEnabled":false,"shareEnabled":true},"content":{"bookmark":"Ychwanegu at nodau tudalen","download":"Lawrlwytho","embed":"Ymgorffori","feedback":"Adborth","exitFullScreen":"Dianc o'r sgrin lawn","fullScreen":"Sgrin lawn","open":"Agor","share":"Rhannu"}},"genericDialogue":{"content":{"emptyValue":"rhowch rif","invalidNumber":"Rhowch rif dilys","noMatches":"Dim canlyniad sy'n cyfateb.","ok":"GWELD","pageNotFound":"Nid yw'r eitem yn cynnwys tudalen gyda'r rhif a nodwyd. Ceisiwch cyfnewid y math i 'delwedd'.","refresh":"Ailosod"}},"headerPanel":{"options":{"localeToggleEnabled":false,"settingsButtonEnabled":true}},"helpDialogue":{"content":{"text":"testun i'w osod","title":"Cymorth"}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Priodoledd","collapse":"Lleihau'r Wybodaeth","collapseFull":"Cuddio'r Galeri","description":"Disgrifiad","expand":"Ehangu'r Wybodaeth","expandFull":"Ehangu'r Galeri","holdingText":"Eich modiwl fan hyn!","less":"llai","license":"Trwydded","logo":"Logo","more":"mwy","noData":"Nid oes data i'w arddangos","page":"Tudalen","title":"Mwy o Wybodaeth","manifestHeader":"Am yr eitem","canvasHeader":"Am y ddelwedd","copyToClipboard":"Copïo i'r clipfwrdd","copiedToClipboard":"Copïwyd i'r clipfwrdd"}},"multiSelectDialogue":{"options":{"galleryThumbChunkedResizingEnabled":true,"galleryThumbChunkedResizingThreshold":400,"galleryThumbHeight":320,"galleryThumbLoadPadding":3,"galleryThumbWidth":200,"pageModeEnabled":true},"content":{"select":"Lawrlwytho","selectAll":"Dewis y cyfan","title":"Dewis Tudalennau i'w Lawrlwytho"}},"pagingHeaderPanel":{"options":{"autoCompleteBoxEnabled":true,"galleryButtonEnabled":true,"imageSelectionBoxEnabled":false,"pageModeEnabled":false,"pagingToggleEnabled":true},"content":{"close":"Cau","emptyValue":"Mewnosodwch werth","first":"gyntaf","firstImage":"Delwedd Gyntaf","firstPage":"Tudalen gyntaf","folio":"Ffolio","gallery":"Galeri","go":"GWELD","help":"Cymorth","image":"Delwedd","last":"Olaf","lastImage":"Delwedd Olaf","lastPage":"Tudalen Olaf","next":"Nesaf","nextImage":"Delwedd Nesaf","nextPage":"Tudalen Nesaf","of":"o {0}","oneUp":"Gweld un dudalen ar y tro","page":"Tudalen","previous":"Blaenorol","previousImage":"Delwedd Flaenorol","previousPage":"Tudalen Flaenorol","settings":"Dewisiadau","twoUp":"Gweld dwy dudalen ar y tro"}},"seadragonCenterPanel":{"options":{"animationTime":0.15,"autoHideControls":true,"attributionEnabled":true,"blendTime":0,"constrainDuringPan":false,"controlsFadeAfterInactive":1500,"controlsFadeDelay":250,"controlsFadeLength":250,"defaultZoomLevel":0,"immediateRender":false,"maxZoomPixelRatio":1.25,"navigatorPosition":"BOTTOM_RIGHT","pageGap":50,"showHomeControl":false,"trimAttributionCount":150,"visibilityRatio":0.5},"content":{"attribution":"Priodoliad","goHome":"Gweld y maint gwreiddiol","imageUnavailable":"Nid oes delwedd ar gael","next":"nesaf","previous":"blaenorol","rotateRight":"Cylchdroi i'r dde","zoomIn":"Closio","zoomOut":"Gwrthglosio"}},"searchFooterPanel":{"options":{"elideDetailsTermsCount":20,"elideResultsTermsCount":5,"pageModeEnabled":true,"positionMarkerEnabled":true},"content":{"clearSearch":"Gwaredu","defaultLabel":"-","displaying":"{0} {1} o {2}","enterKeyword":"Mewnosodwch allweddair","image":"delwedd","imageCaps":"delwedd","instanceFound":"Dangos 1 canlyniad ar gyfer '{0}' ","instancesFound":"Dangos {0} canlyniad o '{1}' ","nextResult":"Canlyniad nesaf","page":"tudalen","pageCaps":"tudalen","previousResult":"Canlyniad blaenorol","print":"Argraffu","resultFoundFor":"canlyniad a geir ar gyfer","resultsFoundFor":"canlyniad ar gyfer","searchWithin":"Chwilio tu fewn i:"}},"settingsDialogue":{"content":{"locale":"Iaith","navigatorEnabled":"Ffenest llywio ar gael","clickToZoomEnabled":"Cliciwch gyda'r llygoden i glosio","pagingEnabled":"Arddangos dwy dudalen","preserveViewport":"Cadw'r lefel o glosio","title":"Dewisiadau","website":"<a href='https://github.com/universalviewer/universalviewer#contributors'>mwy o wybodaeth</a>"}},"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" data-xywh=\"{7}\" data-rotation=\"{8}\" style=\"width:{9}px; height:{10}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{11}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>","instructionsEnabled":false,"shareFrameEnabled":true},"content":{"customSize":"dewisol","embed":"Ymgorffori","embedInstructions":"Er mwyn ymgorffori'r eitem hon ar eich gwefan, copïwch a gosodwch y cod isod.","height":"Hyd","iiif":"Maniffest IIIF","share":"Rhannu","shareInstructions":"Er mwyn rhannu'r eitem hon, copïwch y URL isod.","size":"Maint:","width":"Lled"}},"clickThroughDialogue":{"content":{"viewTerms":"Darllenwch y Telerau a'r Amodau Llawn"}},"loginDialogue":{"content":{"login":"Mewngofnodi","logout":"Allgofnodi","cancel":"Canslo"}},"mobileFooterPanel":{"content":{"rotateRight":"Cylchdroi i'r dde","moreInfo":"Mwy o Wybodaeth","zoomIn":"Closio","zoomOut":"Gwrthglosio"}},"restrictedDialogue":{"content":{"cancel":"Canslo"}}},"localisation":{"label":"Cymraeg","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Mae angen diweddaru'ch porwr er mwyn galluogi rhannu adnoddau traws-safle.","authorisationFailedMessage":"Ni lwyddoch i fewngofnodi. Rhowch gynnig arni eto.","canvasIndexOutOfRange":"Canfas yn rhy fawr i'w arddangos (ceisiwch eto)","degradedResourceMessage":"Mewngofnodwch i weld ansawdd uchel.","degradedResourceLogin":"Mewngofnodi","forbiddenResourceMessage":"Nid yw'ch hawliau mynediad presennol yn ddigonol i weld y ddelwedd hon","termsOfUse":"Telerau Defnydd"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension.en-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension.en-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..b83293a3562359f928c2fe1b63f94e026046ab46
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-seadragon-extension.en-GB.config.json
@@ -0,0 +1 @@
+{"options":{"allowStealFocus":false,"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"leftPanelEnabled":true,"limitLocales":false,"metrics":[{"type":"mobilelandscape","minWidth":0,"maxWidth":640},{"type":"laptop","minWidth":640,"maxWidth":100000}],"multiSelectionMimeType":"application/zip","navigatorEnabled":true,"openTemplate":"http://universalviewer.io?manifest={0}","overrideFullScreen":false,"pagingEnabled":true,"pagingOptionEnabled":true,"pessimisticAccessControl":false,"preserveViewport":false,"rightPanelEnabled":true,"saveUserSettings":false,"clickToZoomEnabled":true,"searchWithinEnabled":true,"termsOfUseEnabled":false,"theme":"uv-en-GB-theme","tokenStorage":"session","useArrowKeysToNavigate":false,"zoomToSearchResultEnabled":true},"modules":{"contentLeftPanel":{"options":{"defaultToTreeEnabled":false,"defaultToTreeIfGreaterThan":0,"elideCount":40,"expandFullEnabled":true,"galleryThumbChunkedResizingThreshold":400,"galleryThumbHeight":320,"galleryThumbLoadPadding":3,"galleryThumbWidth":200,"oneColThumbHeight":320,"oneColThumbWidth":200,"pageModeEnabled":true,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true,"tabOrder":"","thumbsEnabled":true,"thumbsExtraHeight":8,"thumbsImageFadeInDuration":300,"thumbsLoadRange":15,"treeEnabled":true,"twoColThumbHeight":150,"twoColThumbWidth":90},"content":{"collapse":"Collapse Contents","collapseFull":"Collapse Gallery","date":"date","expand":"Expand Contents","expandFull":"Expand Gallery","index":"Index","searchResult":"{0} search result","searchResults":"{0} search results","sortBy":"Sort By:","thumbnails":"Thumbnails","title":"Contents","volume":"volume"}},"dialogue":{"content":{"close":"Close"}},"downloadDialogue":{"options":{"confinedImageSize":1000,"currentViewDisabledPercentage":90,"maxImageWidth":5000,"optionsExplanatoryTextEnabled":false,"selectionEnabled":false},"content":{"currentViewAsJpg":"Current view {0} x {1}px (jpg)","currentViewAsJpgExplanation":"Opens in a new window","download":"Download","downloadSelection":"Download Selection","downloadSelectionExplanation":"Opens a dialogue to select which pages to download.","editSettings":"Edit Settings","entireDocument":"Entire document ({0})","entireFileAsOriginal":"Entire file ({0})","noneAvailable":"No download options are available.","pagingNote":"Please turn off Two Page View for additional options.","preview":"Preview","title":"Download","wholeImageHighRes":"Whole image {0} x {1}px ({2})","wholeImageHighResExplanation":"Opens in a new window.","wholeImagesHighRes":"Whole images ({0})","wholeImagesHighResExplanation":"Opens in two new windows.","wholeImageLowResAsJpg":"Whole image {0} x {1}px (jpg)","wholeImageLowResAsJpgExplanation":"Opens in a new window."}},"footerPanel":{"options":{"bookmarkEnabled":false,"downloadEnabled":true,"embedEnabled":false,"feedbackEnabled":false,"fullscreenEnabled":true,"minimiseButtons":true,"moreInfoEnabled":true,"openEnabled":false,"printEnabled":false,"shareEnabled":true},"content":{"bookmark":"Add to bookmarks","download":"Download","embed":"Embed","feedback":"Feedback","exitFullScreen":"Exit Full Screen","fullScreen":"Full Screen","open":"Open","share":"Share"}},"genericDialogue":{"content":{"emptyValue":"please enter a value.","invalidNumber":"Please enter a valid number.","noMatches":"No matches were found.","ok":"OK","pageNotFound":"This item does not contain a page with the number you entered. Try switching the numbering mode to 'image'.","refresh":"Refresh"}},"headerPanel":{"options":{"localeToggleEnabled":false,"settingsButtonEnabled":true}},"helpDialogue":{"content":{"text":"placeholder text","title":"Help"}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Attribution","collapse":"Collapse Information","collapseFull":"Collapse Gallery","description":"Description","expand":"Expand Information","expandFull":"Expand Gallery","holdingText":"Your module goes here!","less":"less","license":"License","logo":"Logo","more":"more","noData":"No data to display","page":"Page","title":"More Information","manifestHeader":"About the item","canvasHeader":"About the image","copyToClipboard":"Copy to clipboard","copiedToClipboard":"Copied to clipboard"}},"multiSelectDialogue":{"options":{"galleryThumbChunkedResizingEnabled":true,"galleryThumbChunkedResizingThreshold":400,"galleryThumbHeight":320,"galleryThumbLoadPadding":3,"galleryThumbWidth":200,"pageModeEnabled":true},"content":{"select":"Download","selectAll":"Select All","title":"Select Pages for Download"}},"pagingHeaderPanel":{"options":{"autoCompleteBoxEnabled":true,"galleryButtonEnabled":true,"imageSelectionBoxEnabled":false,"pageModeEnabled":false,"pagingToggleEnabled":true},"content":{"close":"Close","emptyValue":"Please enter a value","first":"First","firstImage":"First Image","firstPage":"First Page","folio":"Folio","gallery":"Gallery","go":"Go","help":"Help","image":"Image","last":"Last","lastImage":"Last Image","lastPage":"Last Page","next":"Next","nextImage":"Next Image","nextPage":"Next Page","of":"of {0}","oneUp":"Single page view","page":"Page","previous":"Previous","previousImage":"Previous Image","previousPage":"Previous Page","settings":"Settings","twoUp":"Two page view"}},"seadragonCenterPanel":{"options":{"animationTime":0.15,"autoHideControls":true,"attributionEnabled":true,"blendTime":0,"constrainDuringPan":false,"controlsFadeAfterInactive":1500,"controlsFadeDelay":250,"controlsFadeLength":250,"defaultZoomLevel":0,"immediateRender":false,"maxZoomPixelRatio":1.25,"navigatorPosition":"BOTTOM_RIGHT","pageGap":50,"showHomeControl":false,"trimAttributionCount":150,"visibilityRatio":0.5},"content":{"attribution":"Attribution","goHome":"Go Home","imageUnavailable":"Image Unavailable","next":"Next","previous":"Previous","rotateRight":"Rotate Right","zoomIn":"Zoom In","zoomOut":"Zoom Out"}},"searchFooterPanel":{"options":{"elideDetailsTermsCount":20,"elideResultsTermsCount":10,"pageModeEnabled":true,"positionMarkerEnabled":true},"content":{"clearSearch":"Clear","defaultLabel":"-","displaying":"{0} {1} of {2}","enterKeyword":"Enter Keyword","image":"image","imageCaps":"Image","instanceFound":"1 instance of '{0}' found","instancesFound":"{0} instances of '{1}' found","nextResult":"Next Result","page":"page","pageCaps":"Page","previousResult":"Previous Result","print":"Print","resultFoundFor":"result found for","resultsFoundFor":"results found for","searchWithin":"Search within this item:"}},"settingsDialogue":{"content":{"locale":"Locale","navigatorEnabled":"Navigator Enabled","clickToZoomEnabled":"Mouse Click To Zoom","pagingEnabled":"Two Page View","preserveViewport":"Preserve Zoom","title":"Settings","website":"<a href='https://github.com/universalviewer/universalviewer#contributors'>more info</a>"}},"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" data-xywh=\"{7}\" data-rotation=\"{8}\" style=\"width:{9}px; height:{10}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{11}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>","instructionsEnabled":false,"shareFrameEnabled":true},"content":{"customSize":"custom","embed":"Embed","embedInstructions":"To embed this item in your own website, copy and paste the code below.","height":"Height","iiif":"IIIF Manifest","share":"Share","shareInstructions":"To share this item, copy the URL below.","size":"Size:","width":"Width"}},"clickThroughDialogue":{"content":{"viewTerms":"Read Full Terms and Conditions"}},"loginDialogue":{"content":{"login":"Login","logout":"Logout","cancel":"Cancel"}},"mobileFooterPanel":{"content":{"rotateRight":"Rotate Right","moreInfo":"More Information","zoomIn":"Zoom In","zoomOut":"Zoom Out"}},"restrictedDialogue":{"content":{"cancel":"Cancel"}}},"localisation":{"label":"English (GB)","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Your browser does not support CORS, please upgrade to view this content.","authorisationFailedMessage":"Your log-in attempt did not appear to be successful. Please try again.","canvasIndexOutOfRange":"Canvas index out of range.","degradedResourceMessage":"Please log in to view at full quality.","degradedResourceLogin":"log in","forbiddenResourceMessage":"Your current access rights are insufficient to view this image","termsOfUse":"Terms of Use"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension-dependencies.js b/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension-dependencies.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b25e8588817ae0e7eabca55e89ec53d082170d7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension-dependencies.js
@@ -0,0 +1,5 @@
+define(function() {
+    return {
+        dependencies: ['virtex', 'three.min', 'Detector', 'stats.min', 'iiif-metadata-component']
+    };
+});
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension.cy-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension.cy-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..a75b15b97997183e13dc66fdd8d6ea0ecb00d2cd
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension.cy-GB.config.json
@@ -0,0 +1 @@
+{"options":{"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"leftPanelEnabled":true,"limitLocales":false,"openTemplate":"http://universalviewer.io?manifest={0}","rightPanelEnabled":true,"theme":"uv-cy-GB-theme"},"modules":{"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" style=\"width:{7}px; height:{8}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{9}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>"},"content":{"customSize":"arfer","embed":"gwreiddio","embedInstructions":"Er mwyn ymgorffori'r eitem hon ar eich gwefan, cop�wch a gosodwch y cod isod.","height":"Hyd","iiif":"IIIF Manifest","share":"Rhannu","shareInstructions":"I rannu yr eitem hon, copïwch y URL isod.","size":"maint:","width":"Lled"}},"footerPanel":{"options":{"downloadEnabled":false,"embedEnabled":false,"feedbackEnabled":false,"minimiseButtons":true,"openEnabled":false,"shareEnabled":true},"content":{"bookmark":"Ychwanegu at nodau tudalen","download":"Lawrlwytho","embed":"Ymgorffori","exitFullScreen":"Dianc o'r sgrin lawn","fullScreen":"Sgrin lawn","open":"agored"}},"genericDialogue":{"content":{"ok":"GWELD"}},"headerPanel":{"content":{"close":"Cau","help":"Cymorth"}},"helpDialogue":{"content":{"text":"testun i'w osod","title":"Cymorth"}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Priodoledd","collapse":"Lleihau'r Wybodaeth","collapseFull":"Cuddio'r Galeri","description":"Disgrifiad","expand":"Ehangu'r Wybodaeth","expandFull":"Ehangu'r Galeri","holdingText":"Eich modiwl fan hyn!","less":"llai","license":"Trwydded","logo":"Logo","more":"mwy","noData":"Nid oes data i'w arddangos","page":"tudalen","title":"Mwy o Wybodaeth","manifestHeader":"Am yr eitem","canvasHeader":"Am y ddelwedd","copyToClipboard":"Copïo i'r clipfwrdd","copiedToClipboard":"Copïwyd i'r clipfwrdd"}},"contentLeftPanel":{"options":{"elideCount":40,"galleryThumbHeight":320,"galleryThumbWidth":200,"oneColThumbHeight":320,"oneColThumbWidth":200,"pageModeEnabled":true,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true,"thumbsEnabled":true,"thumbsExtraHeight":8,"thumbsImageFadeInDuration":300,"thumbsLoadRange":15,"treeEnabled":true,"twoColThumbHeight":150,"twoColThumbWidth":90}},"virtexCenterPanel":{"options":{"showStats":false,"trimAttributionCount":150},"content":{"attribution":"Priodoliad","zoomIn":"chwyddo Mewn","zoomOut":"Zoom Out"}},"dialogue":{"content":{"close":"Cau"}},"downloadDialogue":{"content":{"download":"Lawrlwytho","entireFileAsOriginal":"Y ffeil gyfan ({0})","noneAvailable":"Nid oes unrhyw opsiynau lawrlwytho ar gael.","preview":"Rhagolwg","title":"Lawrlwytho"}},"loginDialogue":{"content":{"login":"Mewngofnodi","cancel":"Diddymu"}},"mediaelementCenterPanel":{"content":{}},"settingsDialogue":{"content":{"locale":"Iaith","pagingEnabled":"Arddangos dwy dudalen","preserveViewport":"Cadw'r lefel o glosio","title":"Dewisiadau","website":"<a href='https://github.com/universalviewer/universalviewer'>mwy o wybodaeth</a>"}}},"localisation":{"label":"Cymraeg","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Eich porwr yn peidio cefnogi CORS, os gwelwch yn dda uwchraddio i weld y cynnwys hwn.","authorisationFailedMessage":"Nid oedd yn ymddangos eich ymgais mewngofnodi i fod yn llwyddiannus . Trio eto os gwelwch yn dda.","degradedResourceMessage":"Os gwelwch yn dda mewngofnodwch i weld yn ansawdd llawn.","degradedResourceLogin":"Mewngofnodi","forbiddenResourceMessage":"Eich hawliau mynediad presennol yn annigonol i weld llun hwn"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension.en-GB.config.json b/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension.en-GB.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..79ed8360f644d80c344bd33f1dc429b2e487b680
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/uv-virtex-extension.en-GB.config.json
@@ -0,0 +1 @@
+{"options":{"bookmarkThumbHeight":150,"bookmarkThumbWidth":90,"dropEnabled":true,"footerPanelEnabled":true,"headerPanelEnabled":true,"leftPanelEnabled":true,"limitLocales":false,"openTemplate":"http://universalviewer.io?manifest={0}","rightPanelEnabled":true,"theme":"uv-en-GB-theme"},"modules":{"shareDialogue":{"options":{"embedTemplate":"<div class=\"uv\" data-locale=\"{0}\" data-config=\"{1}\" data-uri=\"{2}\" data-collectionindex=\"{3}\" data-manifestindex=\"{4}\" data-sequenceindex=\"{5}\" data-canvasindex=\"{6}\" style=\"width:{7}px; height:{8}px; background-color: #000\"></div>\n<script type=\"text/javascript\" id=\"embedUV\" src=\"{9}\"></script><script type=\"text/javascript\">/* wordpress fix */</script>"},"content":{"customSize":"custom","embed":"Embed","embedInstructions":"To embed this item in your own website, copy and paste the code below.","height":"Height","iiif":"IIIF Manifest","share":"Share","shareInstructions":"To share this item, copy the URL below.","size":"Size:","width":"Width"}},"footerPanel":{"options":{"downloadEnabled":false,"embedEnabled":false,"feedbackEnabled":false,"minimiseButtons":true,"openEnabled":false,"shareEnabled":true},"content":{"bookmark":"Add to bookmarks","download":"Download","embed":"Embed","exitFullScreen":"Exit Full Screen","fullScreen":"Full Screen","open":"Open"}},"genericDialogue":{"content":{"ok":"OK"}},"headerPanel":{"content":{"close":"Close","help":"Help"}},"helpDialogue":{"content":{"text":"placeholder text","title":"Help"}},"moreInfoRightPanel":{"options":{"canvasDisplayOrder":"","canvasExclude":"","copyToClipboardEnabled":false,"manifestDisplayOrder":"","manifestExclude":"","panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":false,"rtlLanguageCodes":"ar, ara, dv, div, he, heb, ur, urd","showAllLanguages":false,"textLimit":4,"textLimitType":"lines"},"content":{"attribution":"Attribution","collapse":"Collapse Information","collapseFull":"Collapse Gallery","description":"Description","expand":"Expand Information","expandFull":"Expand Gallery","holdingText":"Your module goes here!","less":"less","license":"License","logo":"Logo","more":"more","noData":"No data to display","page":"Page","title":"More Information","manifestHeader":"About the item","canvasHeader":"About the image","copyToClipboard":"Copy to clipboard","copiedToClipboard":"Copied to clipboard"}},"contentLeftPanel":{"options":{"elideCount":40,"galleryThumbHeight":320,"galleryThumbWidth":200,"oneColThumbHeight":320,"oneColThumbWidth":200,"pageModeEnabled":true,"panelAnimationDuration":250,"panelCollapsedWidth":30,"panelExpandedWidth":255,"panelOpen":true,"thumbsEnabled":true,"thumbsExtraHeight":8,"thumbsImageFadeInDuration":300,"thumbsLoadRange":15,"treeEnabled":true,"twoColThumbHeight":150,"twoColThumbWidth":90}},"virtexCenterPanel":{"options":{"showStats":false,"trimAttributionCount":150},"content":{"attribution":"Attribution","zoomIn":"Zoom In","zoomOut":"Zoom Out"}},"dialogue":{"content":{"close":"Close"}},"downloadDialogue":{"content":{"download":"Download","entireFileAsOriginal":"Entire file ({0})","noneAvailable":"No download options are available.","preview":"Preview","title":"Download"}},"loginDialogue":{"content":{"login":"Login","cancel":"Cancel"}},"mediaelementCenterPanel":{"content":{}},"settingsDialogue":{"content":{"locale":"Locale","pagingEnabled":"Two Page View","preserveViewport":"Preserve Zoom","title":"Settings","website":"<a href='https://github.com/universalviewer/universalviewer'>more info</a>"}}},"localisation":{"label":"English (GB)","locales":[{"name":"cy-GB","label":"Cymraeg"},{"name":"en-GB","label":"English (GB)"}]},"content":{"authCORSError":"Your browser does not support CORS, please upgrade to view this content.","authorisationFailedMessage":"Your log-in attempt did not appear to be successful. Please try again.","degradedResourceMessage":"Please log in to view at full quality.","degradedResourceLogin":"log in","forbiddenResourceMessage":"Your current access rights are insufficient to view this image"}}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/lib/viewer.js b/public/opac/js/universalviewer-2.0.2/lib/viewer.js
new file mode 100644
index 0000000000000000000000000000000000000000..19745e9517f099907990b97db832062e0cabd0f3
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/viewer.js
@@ -0,0 +1,5861 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, PDFFindBar, CustomStyle,
+           PDFFindController, ProgressBar, TextLayerBuilder, DownloadManager,
+           getFileName, scrollIntoView, getPDFFileNameFromURL, PDFHistory,
+           Preferences, ViewHistory, PageView, ThumbnailView, URL,
+           noContextMenuHandler, SecondaryToolbar, PasswordPrompt,
+           PresentationMode, HandTool, Promise, DocumentProperties */
+
+'use strict';
+
+var DEFAULT_SCALE = 'auto';
+var DEFAULT_SCALE_DELTA = 1.1;
+var UNKNOWN_SCALE = 0;
+var CACHE_SIZE = 20;
+var CSS_UNITS = 96.0 / 72.0;
+var SCROLLBAR_PADDING = 40;
+var VERTICAL_PADDING = 5;
+var MAX_AUTO_SCALE = 1.25;
+var MIN_SCALE = 0.25;
+var MAX_SCALE = 4.0;
+var VIEW_HISTORY_MEMORY = 20;
+var SCALE_SELECT_CONTAINER_PADDING = 8;
+var SCALE_SELECT_PADDING = 22;
+var THUMBNAIL_SCROLL_MARGIN = -19;
+var USE_ONLY_CSS_ZOOM = false;
+var CLEANUP_TIMEOUT = 30000;
+var IGNORE_CURRENT_POSITION_ON_ZOOM = false;
+var RenderingStates = {
+  INITIAL: 0,
+  RUNNING: 1,
+  PAUSED: 2,
+  FINISHED: 3
+};
+var FindStates = {
+  FIND_FOUND: 0,
+  FIND_NOTFOUND: 1,
+  FIND_WRAPPED: 2,
+  FIND_PENDING: 3
+};
+
+//PDFJS.imageResourcesPath = 'modules/uv-pdfcenterpanel-module/img/';
+  //PDFJS.workerSrc = 'extensions/uv-pdf-extension/js/pdfworker.min.js';
+  //PDFJS.cMapUrl = '../web/cmaps/';
+  //PDFJS.cMapPacked = true;
+
+var mozL10n = document.mozL10n || document.webL10n;
+
+
+// optimised CSS custom property getter/setter
+var CustomStyle = (function CustomStyleClosure() {
+
+  // As noted on: http://www.zachstronaut.com/posts/2009/02/17/
+  //              animate-css-transforms-firefox-webkit.html
+  // in some versions of IE9 it is critical that ms appear in this list
+  // before Moz
+  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];
+  var _cache = {};
+
+  function CustomStyle() {}
+
+  CustomStyle.getProp = function get(propName, element) {
+    // check cache only when no element is given
+    if (arguments.length == 1 && typeof _cache[propName] == 'string') {
+      return _cache[propName];
+    }
+
+    element = element || document.documentElement;
+    var style = element.style, prefixed, uPropName;
+
+    // test standard property first
+    if (typeof style[propName] == 'string') {
+      return (_cache[propName] = propName);
+    }
+
+    // capitalize
+    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);
+
+    // test vendor specific properties
+    for (var i = 0, l = prefixes.length; i < l; i++) {
+      prefixed = prefixes[i] + uPropName;
+      if (typeof style[prefixed] == 'string') {
+        return (_cache[propName] = prefixed);
+      }
+    }
+
+    //if all fails then set to undefined
+    return (_cache[propName] = 'undefined');
+  };
+
+  CustomStyle.setProp = function set(propName, element, str) {
+    var prop = this.getProp(propName);
+    if (prop != 'undefined') {
+      element.style[prop] = str;
+    }
+  };
+
+  return CustomStyle;
+})();
+
+function getFileName(url) {
+  var anchor = url.indexOf('#');
+  var query = url.indexOf('?');
+  var end = Math.min(
+    anchor > 0 ? anchor : url.length,
+    query > 0 ? query : url.length);
+  return url.substring(url.lastIndexOf('/', end) + 1, end);
+}
+
+/**
+ * Returns scale factor for the canvas. It makes sense for the HiDPI displays.
+ * @return {Object} The object with horizontal (sx) and vertical (sy)
+                    scales. The scaled property is set to false if scaling is
+                    not required, true otherwise.
+ */
+function getOutputScale(ctx) {
+  var devicePixelRatio = window.devicePixelRatio || 1;
+  var backingStoreRatio = ctx.webkitBackingStorePixelRatio ||
+                          ctx.mozBackingStorePixelRatio ||
+                          ctx.msBackingStorePixelRatio ||
+                          ctx.oBackingStorePixelRatio ||
+                          ctx.backingStorePixelRatio || 1;
+  var pixelRatio = devicePixelRatio / backingStoreRatio;
+  return {
+    sx: pixelRatio,
+    sy: pixelRatio,
+    scaled: pixelRatio != 1
+  };
+}
+
+/**
+ * Scrolls specified element into view of its parent.
+ * element {Object} The element to be visible.
+ * spot {Object} An object with optional top and left properties,
+ *               specifying the offset from the top left edge.
+ */
+function scrollIntoView(element, spot) {
+  // Assuming offsetParent is available (it's not available when viewer is in
+  // hidden iframe or object). We have to scroll: if the offsetParent is not set
+  // producing the error. See also animationStartedClosure.
+  var parent = element.offsetParent;
+  var offsetY = element.offsetTop + element.clientTop;
+  var offsetX = element.offsetLeft + element.clientLeft;
+  if (!parent) {
+    console.error('offsetParent is not set -- cannot scroll');
+    return;
+  }
+  while (parent.clientHeight === parent.scrollHeight) {
+    if (parent.dataset._scaleY) {
+      offsetY /= parent.dataset._scaleY;
+      offsetX /= parent.dataset._scaleX;
+    }
+    offsetY += parent.offsetTop;
+    offsetX += parent.offsetLeft;
+    parent = parent.offsetParent;
+    if (!parent) {
+      return; // no need to scroll
+    }
+  }
+  if (spot) {
+    if (spot.top !== undefined) {
+      offsetY += spot.top;
+    }
+    if (spot.left !== undefined) {
+      offsetX += spot.left;
+      parent.scrollLeft = offsetX;
+    }
+  }
+  parent.scrollTop = offsetY;
+}
+
+/**
+ * Event handler to suppress context menu.
+ */
+function noContextMenuHandler(e) {
+  e.preventDefault();
+}
+
+/**
+ * Returns the filename or guessed filename from the url (see issue 3455).
+ * url {String} The original PDF location.
+ * @return {String} Guessed PDF file name.
+ */
+function getPDFFileNameFromURL(url) {
+  var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
+  //            SCHEME      HOST         1.PATH  2.QUERY   3.REF
+  // Pattern to get last matching NAME.pdf
+  var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
+  var splitURI = reURI.exec(url);
+  var suggestedFilename = reFilename.exec(splitURI[1]) ||
+                           reFilename.exec(splitURI[2]) ||
+                           reFilename.exec(splitURI[3]);
+  if (suggestedFilename) {
+    suggestedFilename = suggestedFilename[0];
+    if (suggestedFilename.indexOf('%') != -1) {
+      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf
+      try {
+        suggestedFilename =
+          reFilename.exec(decodeURIComponent(suggestedFilename))[0];
+      } catch(e) { // Possible (extremely rare) errors:
+        // URIError "Malformed URI", e.g. for "%AA.pdf"
+        // TypeError "null has no properties", e.g. for "%2F.pdf"
+      }
+    }
+  }
+  return suggestedFilename || 'document.pdf';
+}
+
+var ProgressBar = (function ProgressBarClosure() {
+
+  function clamp(v, min, max) {
+    return Math.min(Math.max(v, min), max);
+  }
+
+  function ProgressBar(id, opts) {
+
+    // Fetch the sub-elements for later.
+    this.div = document.querySelector(id + ' .progress');
+
+    // Get the loading bar element, so it can be resized to fit the viewer.
+    this.bar = this.div.parentNode;
+
+    // Get options, with sensible defaults.
+    this.height = opts.height || 100;
+    this.width = opts.width || 100;
+    this.units = opts.units || '%';
+
+    // Initialize heights.
+    this.div.style.height = this.height + this.units;
+    this.percent = 0;
+  }
+
+  ProgressBar.prototype = {
+
+    updateBar: function ProgressBar_updateBar() {
+      if (this._indeterminate) {
+        this.div.classList.add('indeterminate');
+        this.div.style.width = this.width + this.units;
+        return;
+      }
+
+      this.div.classList.remove('indeterminate');
+      var progressSize = this.width * this._percent / 100;
+      this.div.style.width = progressSize + this.units;
+    },
+
+    get percent() {
+      return this._percent;
+    },
+
+    set percent(val) {
+      this._indeterminate = isNaN(val);
+      this._percent = clamp(val, 0, 100);
+      this.updateBar();
+    },
+
+    setWidth: function ProgressBar_setWidth(viewer) {
+      if (viewer) {
+        var container = viewer.parentNode;
+        var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;
+        if (scrollbarWidth > 0) {
+          this.bar.setAttribute('style', 'width: calc(100% - ' +
+                                         scrollbarWidth + 'px);');
+        }
+      }
+    },
+
+    hide: function ProgressBar_hide() {
+      this.bar.classList.add('hidden');
+      this.bar.removeAttribute('style');
+    }
+  };
+
+  return ProgressBar;
+})();
+
+var Cache = function cacheCache(size) {
+  var data = [];
+  this.push = function cachePush(view) {
+    var i = data.indexOf(view);
+    if (i >= 0) {
+      data.splice(i);
+    }
+    data.push(view);
+    if (data.length > size) {
+      data.shift().destroy();
+    }
+  };
+};
+
+
+
+
+var DEFAULT_PREFERENCES = {
+  showPreviousViewOnLoad: true,
+  defaultZoomValue: '',
+  ifAvailableShowOutlineOnLoad: false,
+  enableHandToolOnLoad: false,
+  enableWebGL: false
+};
+
+
+/**
+ * Preferences - Utility for storing persistent settings.
+ *   Used for settings that should be applied to all opened documents,
+ *   or every time the viewer is loaded.
+ */
+var Preferences = {
+  prefs: Object.create(DEFAULT_PREFERENCES),
+  isInitializedPromiseResolved: false,
+  initializedPromise: null,
+
+  /**
+   * Initialize and fetch the current preference values from storage.
+   * @return {Promise} A promise that is resolved when the preferences
+   *                   have been initialized.
+   */
+  initialize: function preferencesInitialize() {
+    return this.initializedPromise =
+        this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {
+      this.isInitializedPromiseResolved = true;
+      if (prefObj) {
+        this.prefs = prefObj;
+      }
+    }.bind(this));
+  },
+
+  /**
+   * Stub function for writing preferences to storage.
+   * NOTE: This should be overridden by a build-specific function defined below.
+   * @param {Object} prefObj The preferences that should be written to storage.
+   * @return {Promise} A promise that is resolved when the preference values
+   *                   have been written.
+   */
+  _writeToStorage: function preferences_writeToStorage(prefObj) {
+    return Promise.resolve();
+  },
+
+  /**
+   * Stub function for reading preferences from storage.
+   * NOTE: This should be overridden by a build-specific function defined below.
+   * @param {Object} prefObj The preferences that should be read from storage.
+   * @return {Promise} A promise that is resolved with an {Object} containing
+   *                   the preferences that have been read.
+   */
+  _readFromStorage: function preferences_readFromStorage(prefObj) {
+    return Promise.resolve();
+  },
+
+  /**
+   * Reset the preferences to their default values and update storage.
+   * @return {Promise} A promise that is resolved when the preference values
+   *                   have been reset.
+   */
+  reset: function preferencesReset() {
+    return this.initializedPromise.then(function() {
+      this.prefs = Object.create(DEFAULT_PREFERENCES);
+      return this._writeToStorage(DEFAULT_PREFERENCES);
+    }.bind(this));
+  },
+
+  /**
+   * Replace the current preference values with the ones from storage.
+   * @return {Promise} A promise that is resolved when the preference values
+   *                   have been updated.
+   */
+  reload: function preferencesReload() {
+    return this.initializedPromise.then(function () {
+      this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {
+        if (prefObj) {
+          this.prefs = prefObj;
+        }
+      }.bind(this));
+    }.bind(this));
+  },
+
+  /**
+   * Set the value of a preference.
+   * @param {string} name The name of the preference that should be changed.
+   * @param {boolean|number|string} value The new value of the preference.
+   * @return {Promise} A promise that is resolved when the value has been set,
+   *                   provided that the preference exists and the types match.
+   */
+  set: function preferencesSet(name, value) {
+    return this.initializedPromise.then(function () {
+      if (DEFAULT_PREFERENCES[name] === undefined) {
+        throw new Error('preferencesSet: \'' + name + '\' is undefined.');
+      } else if (value === undefined) {
+        throw new Error('preferencesSet: no value is specified.');
+      }
+      var valueType = typeof value;
+      var defaultType = typeof DEFAULT_PREFERENCES[name];
+
+      if (valueType !== defaultType) {
+        if (valueType === 'number' && defaultType === 'string') {
+          value = value.toString();
+        } else {
+          throw new Error('Preferences_set: \'' + value + '\' is a \"' +
+                          valueType + '\", expected \"' + defaultType + '\".');
+        }
+      } else {
+        if (valueType === 'number' && (value | 0) !== value) {
+          throw new Error('Preferences_set: \'' + value +
+                          '\' must be an \"integer\".');
+        }
+      }
+      this.prefs[name] = value;
+      return this._writeToStorage(this.prefs);
+    }.bind(this));
+  },
+
+  /**
+   * Get the value of a preference.
+   * @param {string} name The name of the preference whose value is requested.
+   * @return {Promise} A promise that is resolved with a {boolean|number|string}
+   *                   containing the value of the preference.
+   */
+  get: function preferencesGet(name) {
+    return this.initializedPromise.then(function () {
+      var defaultValue = DEFAULT_PREFERENCES[name];
+
+      if (defaultValue === undefined) {
+        throw new Error('preferencesGet: \'' + name + '\' is undefined.');
+      } else {
+        var prefValue = this.prefs[name];
+
+        if (prefValue !== undefined) {
+          return prefValue;
+        }
+      }
+      return defaultValue;
+    }.bind(this));
+  }
+};
+
+
+Preferences._writeToStorage = function (prefObj) {
+  return new Promise(function (resolve) {
+    localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
+    resolve();
+  });
+};
+
+Preferences._readFromStorage = function (prefObj) {
+  return new Promise(function (resolve) {
+    var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
+    resolve(readPrefs);
+  });
+};
+
+
+(function mozPrintCallbackPolyfillClosure() {
+  if ('mozPrintCallback' in document.createElement('canvas')) {
+    return;
+  }
+  // Cause positive result on feature-detection:
+  HTMLCanvasElement.prototype.mozPrintCallback = undefined;
+
+  var canvases;   // During print task: non-live NodeList of <canvas> elements
+  var index;      // Index of <canvas> element that is being processed
+
+  var print = window.print;
+  window.print = function print() {
+    if (canvases) {
+      console.warn('Ignored window.print() because of a pending print job.');
+      return;
+    }
+    try {
+      dispatchEvent('beforeprint');
+    } finally {
+      canvases = document.querySelectorAll('canvas');
+      index = -1;
+      next();
+    }
+  };
+
+  function dispatchEvent(eventType) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent(eventType, false, false, 'custom');
+    window.dispatchEvent(event);
+  }
+
+  function next() {
+    if (!canvases) {
+      return; // Print task cancelled by user (state reset in abort())
+    }
+
+    renderProgress();
+    if (++index < canvases.length) {
+      var canvas = canvases[index];
+      if (typeof canvas.mozPrintCallback === 'function') {
+        canvas.mozPrintCallback({
+          context: canvas.getContext('2d'),
+          abort: abort,
+          done: next
+        });
+      } else {
+        next();
+      }
+    } else {
+      renderProgress();
+      print.call(window);
+      setTimeout(abort, 20); // Tidy-up
+    }
+  }
+
+  function abort() {
+    if (canvases) {
+      canvases = null;
+      renderProgress();
+      dispatchEvent('afterprint');
+    }
+  }
+
+  function renderProgress() {
+    var progressContainer = document.getElementById('mozPrintCallback-shim');
+    if (canvases) {
+      var progress = Math.round(100 * index / canvases.length);
+      var progressBar = progressContainer.querySelector('progress');
+      var progressPerc = progressContainer.querySelector('.relative-progress');
+      progressBar.value = progress;
+      progressPerc.textContent = progress + '%';
+      progressContainer.removeAttribute('hidden');
+      progressContainer.onclick = abort;
+    } else {
+      progressContainer.setAttribute('hidden', '');
+    }
+  }
+
+  var hasAttachEvent = !!document.attachEvent;
+
+  window.addEventListener('keydown', function(event) {
+    // Intercept Cmd/Ctrl + P in all browsers.
+    // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera
+    if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) &&
+        !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
+      window.print();
+      if (hasAttachEvent) {
+        // Only attachEvent can cancel Ctrl + P dialog in IE <=10
+        // attachEvent is gone in IE11, so the dialog will re-appear in IE11.
+        return;
+      }
+      event.preventDefault();
+      if (event.stopImmediatePropagation) {
+        event.stopImmediatePropagation();
+      } else {
+        event.stopPropagation();
+      }
+      return;
+    }
+    if (event.keyCode === 27 && canvases) { // Esc
+      abort();
+    }
+  }, true);
+  if (hasAttachEvent) {
+    document.attachEvent('onkeydown', function(event) {
+      event = event || window.event;
+      if (event.keyCode === 80/*P*/ && event.ctrlKey) {
+        event.keyCode = 0;
+        return false;
+      }
+    });
+  }
+
+  if ('onbeforeprint' in window) {
+    // Do not propagate before/afterprint events when they are not triggered
+    // from within this polyfill. (FF/IE).
+    var stopPropagationIfNeeded = function(event) {
+      if (event.detail !== 'custom' && event.stopImmediatePropagation) {
+        event.stopImmediatePropagation();
+      }
+    };
+    window.addEventListener('beforeprint', stopPropagationIfNeeded, false);
+    window.addEventListener('afterprint', stopPropagationIfNeeded, false);
+  }
+})();
+
+
+
+var DownloadManager = (function DownloadManagerClosure() {
+
+  function download(blobUrl, filename) {
+    var a = document.createElement('a');
+    if (a.click) {
+      // Use a.click() if available. Otherwise, Chrome might show
+      // "Unsafe JavaScript attempt to initiate a navigation change
+      //  for frame with URL" and not open the PDF at all.
+      // Supported by (not mentioned = untested):
+      // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click)
+      // - Chrome 19 - 26 (18- does not support a.click)
+      // - Opera 9 - 12.15
+      // - Internet Explorer 6 - 10
+      // - Safari 6 (5.1- does not support a.click)
+      a.href = blobUrl;
+      a.target = '_parent';
+      // Use a.download if available. This increases the likelihood that
+      // the file is downloaded instead of opened by another PDF plugin.
+      if ('download' in a) {
+        a.download = filename;
+      }
+      // <a> must be in the document for IE and recent Firefox versions.
+      // (otherwise .click() is ignored)
+      (document.body || document.documentElement).appendChild(a);
+      a.click();
+      a.parentNode.removeChild(a);
+    } else {
+      if (window.top === window &&
+          blobUrl.split('#')[0] === window.location.href.split('#')[0]) {
+        // If _parent == self, then opening an identical URL with different
+        // location hash will only cause a navigation, not a download.
+        var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';
+        blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');
+      }
+      window.open(blobUrl, '_parent');
+    }
+  }
+
+  function DownloadManager() {}
+
+  DownloadManager.prototype = {
+    downloadUrl: function DownloadManager_downloadUrl(url, filename) {
+      if (!PDFJS.isValidUrl(url, true)) {
+        return; // restricted/invalid URL
+      }
+
+      download(url + '#pdfjs.action=download', filename);
+    },
+
+    downloadData: function DownloadManager_downloadData(data, filename,
+                                                        contentType) {
+
+      var blobUrl = PDFJS.createObjectURL(data, contentType);
+      download(blobUrl, filename);
+    },
+
+    download: function DownloadManager_download(blob, url, filename) {
+      if (!URL) {
+        // URL.createObjectURL is not supported
+        this.downloadUrl(url, filename);
+        return;
+      }
+
+      if (navigator.msSaveBlob) {
+        // IE10 / IE11
+        if (!navigator.msSaveBlob(blob, filename)) {
+          this.downloadUrl(url, filename);
+        }
+        return;
+      }
+
+      var blobUrl = URL.createObjectURL(blob);
+      download(blobUrl, filename);
+    }
+  };
+
+  return DownloadManager;
+})();
+
+
+
+
+var cache = new Cache(CACHE_SIZE);
+var currentPageNumber = 1;
+
+
+/**
+ * View History - This is a utility for saving various view parameters for
+ *                recently opened files.
+ *
+ * The way that the view parameters are stored depends on how PDF.js is built,
+ * for 'node make <flag>' the following cases exist:
+ *  - FIREFOX or MOZCENTRAL - uses sessionStorage.
+ *  - B2G                   - uses asyncStorage.
+ *  - GENERIC or CHROME     - uses localStorage, if it is available.
+ */
+var ViewHistory = (function ViewHistoryClosure() {
+  function ViewHistory(fingerprint) {
+    this.fingerprint = fingerprint;
+    var initializedPromiseResolve;
+    this.isInitializedPromiseResolved = false;
+    this.initializedPromise = new Promise(function (resolve) {
+      initializedPromiseResolve = resolve;
+    });
+
+    var resolvePromise = (function ViewHistoryResolvePromise(db) {
+      this.isInitializedPromiseResolved = true;
+      this.initialize(db || '{}');
+      initializedPromiseResolve();
+    }).bind(this);
+
+
+
+    resolvePromise(localStorage.getItem('database'));
+  }
+
+  ViewHistory.prototype = {
+    initialize: function ViewHistory_initialize(database) {
+      database = JSON.parse(database);
+      if (!('files' in database)) {
+        database.files = [];
+      }
+      if (database.files.length >= VIEW_HISTORY_MEMORY) {
+        database.files.shift();
+      }
+      var index;
+      for (var i = 0, length = database.files.length; i < length; i++) {
+        var branch = database.files[i];
+        if (branch.fingerprint === this.fingerprint) {
+          index = i;
+          break;
+        }
+      }
+      if (typeof index !== 'number') {
+        index = database.files.push({fingerprint: this.fingerprint}) - 1;
+      }
+      this.file = database.files[index];
+      this.database = database;
+    },
+
+    set: function ViewHistory_set(name, val) {
+      if (!this.isInitializedPromiseResolved) {
+        return;
+      }
+      var file = this.file;
+      file[name] = val;
+      var database = JSON.stringify(this.database);
+
+
+
+      localStorage.setItem('database', database);
+    },
+
+    get: function ViewHistory_get(name, defaultValue) {
+      if (!this.isInitializedPromiseResolved) {
+        return defaultValue;
+      }
+      return this.file[name] || defaultValue;
+    }
+  };
+
+  return ViewHistory;
+})();
+
+
+/**
+ * Creates a "search bar" given set of DOM elements
+ * that act as controls for searching, or for setting
+ * search preferences in the UI. This object also sets
+ * up the appropriate events for the controls. Actual
+ * searching is done by PDFFindController
+ */
+var PDFFindBar = {
+  opened: false,
+  bar: null,
+  toggleButton: null,
+  findField: null,
+  highlightAll: null,
+  caseSensitive: null,
+  findMsg: null,
+  findStatusIcon: null,
+  findPreviousButton: null,
+  findNextButton: null,
+
+  initialize: function(options) {
+    if(typeof PDFFindController === 'undefined' || PDFFindController === null) {
+      throw 'PDFFindBar cannot be initialized ' +
+            'without a PDFFindController instance.';
+    }
+
+    this.bar = options.bar;
+    this.toggleButton = options.toggleButton;
+    this.findField = options.findField;
+    this.highlightAll = options.highlightAllCheckbox;
+    this.caseSensitive = options.caseSensitiveCheckbox;
+    this.findMsg = options.findMsg;
+    this.findStatusIcon = options.findStatusIcon;
+    this.findPreviousButton = options.findPreviousButton;
+    this.findNextButton = options.findNextButton;
+
+    var self = this;
+    this.toggleButton.addEventListener('click', function() {
+      self.toggle();
+    });
+
+    this.findField.addEventListener('input', function() {
+      self.dispatchEvent('');
+    });
+
+    this.bar.addEventListener('keydown', function(evt) {
+      switch (evt.keyCode) {
+        case 13: // Enter
+          if (evt.target === self.findField) {
+            self.dispatchEvent('again', evt.shiftKey);
+          }
+          break;
+        case 27: // Escape
+          self.close();
+          break;
+      }
+    });
+
+    this.findPreviousButton.addEventListener('click',
+      function() { self.dispatchEvent('again', true); }
+    );
+
+    this.findNextButton.addEventListener('click', function() {
+      self.dispatchEvent('again', false);
+    });
+
+    this.highlightAll.addEventListener('click', function() {
+      self.dispatchEvent('highlightallchange');
+    });
+
+    this.caseSensitive.addEventListener('click', function() {
+      self.dispatchEvent('casesensitivitychange');
+    });
+  },
+
+  dispatchEvent: function(aType, aFindPrevious) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('find' + aType, true, true, {
+      query: this.findField.value,
+      caseSensitive: this.caseSensitive.checked,
+      highlightAll: this.highlightAll.checked,
+      findPrevious: aFindPrevious
+    });
+    return window.dispatchEvent(event);
+  },
+
+  updateUIState: function(state, previous) {
+    var notFound = false;
+    var findMsg = '';
+    var status = '';
+
+    switch (state) {
+      case FindStates.FIND_FOUND:
+        break;
+
+      case FindStates.FIND_PENDING:
+        status = 'pending';
+        break;
+
+      case FindStates.FIND_NOTFOUND:
+        findMsg = mozL10n.get('find_not_found', null, 'Phrase not found');
+        notFound = true;
+        break;
+
+      case FindStates.FIND_WRAPPED:
+        if (previous) {
+          findMsg = mozL10n.get('find_reached_top', null,
+                      'Reached top of document, continued from bottom');
+        } else {
+          findMsg = mozL10n.get('find_reached_bottom', null,
+                                'Reached end of document, continued from top');
+        }
+        break;
+    }
+
+    if (notFound) {
+      this.findField.classList.add('notFound');
+    } else {
+      this.findField.classList.remove('notFound');
+    }
+
+    this.findField.setAttribute('data-status', status);
+    this.findMsg.textContent = findMsg;
+  },
+
+  open: function() {
+    if (!this.opened) {
+      this.opened = true;
+      this.toggleButton.classList.add('toggled');
+      this.bar.classList.remove('hidden');
+    }
+
+    this.findField.select();
+    this.findField.focus();
+  },
+
+  close: function() {
+    if (!this.opened) {
+      return;
+    }
+    this.opened = false;
+    this.toggleButton.classList.remove('toggled');
+    this.bar.classList.add('hidden');
+
+    PDFFindController.active = false;
+  },
+
+  toggle: function() {
+    if (this.opened) {
+      this.close();
+    } else {
+      this.open();
+    }
+  }
+};
+
+
+
+/**
+ * Provides a "search" or "find" functionality for the PDF.
+ * This object actually performs the search for a given string.
+ */
+
+var PDFFindController = {
+  startedTextExtraction: false,
+
+  extractTextPromises: [],
+
+  pendingFindMatches: {},
+
+  // If active, find results will be highlighted.
+  active: false,
+
+  // Stores the text for each page.
+  pageContents: [],
+
+  pageMatches: [],
+
+  // Currently selected match.
+  selected: {
+    pageIdx: -1,
+    matchIdx: -1
+  },
+
+  // Where find algorithm currently is in the document.
+  offset: {
+    pageIdx: null,
+    matchIdx: null
+  },
+
+  resumePageIdx: null,
+
+  state: null,
+
+  dirtyMatch: false,
+
+  findTimeout: null,
+
+  pdfPageSource: null,
+
+  integratedFind: false,
+
+  initialize: function(options) {
+    if(typeof PDFFindBar === 'undefined' || PDFFindBar === null) {
+      throw 'PDFFindController cannot be initialized ' +
+            'without a PDFFindBar instance';
+    }
+
+    this.pdfPageSource = options.pdfPageSource;
+    this.integratedFind = options.integratedFind;
+
+    var events = [
+      'find',
+      'findagain',
+      'findhighlightallchange',
+      'findcasesensitivitychange'
+    ];
+
+    this.firstPagePromise = new Promise(function (resolve) {
+      this.resolveFirstPage = resolve;
+    }.bind(this));
+    this.handleEvent = this.handleEvent.bind(this);
+
+    for (var i = 0; i < events.length; i++) {
+      window.addEventListener(events[i], this.handleEvent);
+    }
+  },
+
+  reset: function pdfFindControllerReset() {
+    this.startedTextExtraction = false;
+    this.extractTextPromises = [];
+    this.active = false;
+  },
+
+  calcFindMatch: function(pageIndex) {
+    var pageContent = this.pageContents[pageIndex];
+    var query = this.state.query;
+    var caseSensitive = this.state.caseSensitive;
+    var queryLen = query.length;
+
+    if (queryLen === 0) {
+      // Do nothing the matches should be wiped out already.
+      return;
+    }
+
+    if (!caseSensitive) {
+      pageContent = pageContent.toLowerCase();
+      query = query.toLowerCase();
+    }
+
+    var matches = [];
+
+    var matchIdx = -queryLen;
+    while (true) {
+      matchIdx = pageContent.indexOf(query, matchIdx + queryLen);
+      if (matchIdx === -1) {
+        break;
+      }
+
+      matches.push(matchIdx);
+    }
+    this.pageMatches[pageIndex] = matches;
+    this.updatePage(pageIndex);
+    if (this.resumePageIdx === pageIndex) {
+      this.resumePageIdx = null;
+      this.nextPageMatch();
+    }
+  },
+
+  extractText: function() {
+    if (this.startedTextExtraction) {
+      return;
+    }
+    this.startedTextExtraction = true;
+
+    this.pageContents = [];
+    var extractTextPromisesResolves = [];
+    for (var i = 0, ii = this.pdfPageSource.pdfDocument.numPages; i < ii; i++) {
+      this.extractTextPromises.push(new Promise(function (resolve) {
+        extractTextPromisesResolves.push(resolve);
+      }));
+    }
+
+    var self = this;
+    function extractPageText(pageIndex) {
+      self.pdfPageSource.pages[pageIndex].getTextContent().then(
+        function textContentResolved(textContent) {
+          var textItems = textContent.items;
+          var str = '';
+
+          for (var i = 0; i < textItems.length; i++) {
+            str += textItems[i].str;
+          }
+
+          // Store the pageContent as a string.
+          self.pageContents.push(str);
+
+          extractTextPromisesResolves[pageIndex](pageIndex);
+          if ((pageIndex + 1) < self.pdfPageSource.pages.length) {
+            extractPageText(pageIndex + 1);
+          }
+        }
+      );
+    }
+    extractPageText(0);
+  },
+
+  handleEvent: function(e) {
+    if (this.state === null || e.type !== 'findagain') {
+      this.dirtyMatch = true;
+    }
+    this.state = e.detail;
+    this.updateUIState(FindStates.FIND_PENDING);
+
+    this.firstPagePromise.then(function() {
+      this.extractText();
+
+      clearTimeout(this.findTimeout);
+      if (e.type === 'find') {
+        // Only trigger the find action after 250ms of silence.
+        this.findTimeout = setTimeout(this.nextMatch.bind(this), 250);
+      } else {
+        this.nextMatch();
+      }
+    }.bind(this));
+  },
+
+  updatePage: function(idx) {
+    var page = this.pdfPageSource.pages[idx];
+
+    if (this.selected.pageIdx === idx) {
+      // If the page is selected, scroll the page into view, which triggers
+      // rendering the page, which adds the textLayer. Once the textLayer is
+      // build, it will scroll onto the selected match.
+      page.scrollIntoView();
+    }
+
+    if (page.textLayer) {
+      page.textLayer.updateMatches();
+    }
+  },
+
+  nextMatch: function() {
+    var previous = this.state.findPrevious;
+    var currentPageIndex = this.pdfPageSource.page - 1;
+    var numPages = this.pdfPageSource.pages.length;
+
+    this.active = true;
+
+    if (this.dirtyMatch) {
+      // Need to recalculate the matches, reset everything.
+      this.dirtyMatch = false;
+      this.selected.pageIdx = this.selected.matchIdx = -1;
+      this.offset.pageIdx = currentPageIndex;
+      this.offset.matchIdx = null;
+      this.hadMatch = false;
+      this.resumePageIdx = null;
+      this.pageMatches = [];
+      var self = this;
+
+      for (var i = 0; i < numPages; i++) {
+        // Wipe out any previous highlighted matches.
+        this.updatePage(i);
+
+        // As soon as the text is extracted start finding the matches.
+        if (!(i in this.pendingFindMatches)) {
+          this.pendingFindMatches[i] = true;
+          this.extractTextPromises[i].then(function(pageIdx) {
+            delete self.pendingFindMatches[pageIdx];
+            self.calcFindMatch(pageIdx);
+          });
+        }
+      }
+    }
+
+    // If there's no query there's no point in searching.
+    if (this.state.query === '') {
+      this.updateUIState(FindStates.FIND_FOUND);
+      return;
+    }
+
+    // If we're waiting on a page, we return since we can't do anything else.
+    if (this.resumePageIdx) {
+      return;
+    }
+
+    var offset = this.offset;
+    // If there's already a matchIdx that means we are iterating through a
+    // page's matches.
+    if (offset.matchIdx !== null) {
+      var numPageMatches = this.pageMatches[offset.pageIdx].length;
+      if ((!previous && offset.matchIdx + 1 < numPageMatches) ||
+          (previous && offset.matchIdx > 0)) {
+        // The simple case, we just have advance the matchIdx to select the next
+        // match on the page.
+        this.hadMatch = true;
+        offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;
+        this.updateMatch(true);
+        return;
+      }
+      // We went beyond the current page's matches, so we advance to the next
+      // page.
+      this.advanceOffsetPage(previous);
+    }
+    // Start searching through the page.
+    this.nextPageMatch();
+  },
+
+  matchesReady: function(matches) {
+    var offset = this.offset;
+    var numMatches = matches.length;
+    var previous = this.state.findPrevious;
+    if (numMatches) {
+      // There were matches for the page, so initialize the matchIdx.
+      this.hadMatch = true;
+      offset.matchIdx = previous ? numMatches - 1 : 0;
+      this.updateMatch(true);
+      // matches were found
+      return true;
+    } else {
+      // No matches attempt to search the next page.
+      this.advanceOffsetPage(previous);
+      if (offset.wrapped) {
+        offset.matchIdx = null;
+        if (!this.hadMatch) {
+          // No point in wrapping there were no matches.
+          this.updateMatch(false);
+          // while matches were not found, searching for a page
+          // with matches should nevertheless halt.
+          return true;
+        }
+      }
+      // matches were not found (and searching is not done)
+      return false;
+    }
+  },
+
+  nextPageMatch: function() {
+    if (this.resumePageIdx !== null) {
+      console.error('There can only be one pending page.');
+    }
+    do {
+      var pageIdx = this.offset.pageIdx;
+      var matches = this.pageMatches[pageIdx];
+      if (!matches) {
+        // The matches don't exist yet for processing by "matchesReady",
+        // so set a resume point for when they do exist.
+        this.resumePageIdx = pageIdx;
+        break;
+      }
+    } while (!this.matchesReady(matches));
+  },
+
+  advanceOffsetPage: function(previous) {
+    var offset = this.offset;
+    var numPages = this.extractTextPromises.length;
+    offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;
+    offset.matchIdx = null;
+    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
+      offset.pageIdx = previous ? numPages - 1 : 0;
+      offset.wrapped = true;
+      return;
+    }
+  },
+
+  updateMatch: function(found) {
+    var state = FindStates.FIND_NOTFOUND;
+    var wrapped = this.offset.wrapped;
+    this.offset.wrapped = false;
+    if (found) {
+      var previousPage = this.selected.pageIdx;
+      this.selected.pageIdx = this.offset.pageIdx;
+      this.selected.matchIdx = this.offset.matchIdx;
+      state = wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND;
+      // Update the currently selected page to wipe out any selected matches.
+      if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {
+        this.updatePage(previousPage);
+      }
+    }
+    this.updateUIState(state, this.state.findPrevious);
+    if (this.selected.pageIdx !== -1) {
+      this.updatePage(this.selected.pageIdx, true);
+    }
+  },
+
+  updateUIState: function(state, previous) {
+    if (this.integratedFind) {
+      FirefoxCom.request('updateFindControlState',
+                         {result: state, findPrevious: previous});
+      return;
+    }
+    PDFFindBar.updateUIState(state, previous);
+  }
+};
+
+
+
+var PDFHistory = {
+  initialized: false,
+  initialDestination: null,
+
+  initialize: function pdfHistoryInitialize(fingerprint) {
+    if (PDFJS.disableHistory || PDFView.isViewerEmbedded) {
+      // The browsing history is only enabled when the viewer is standalone,
+      // i.e. not when it is embedded in a web page.
+      return;
+    }
+    this.initialized = true;
+    this.reInitialized = false;
+    this.allowHashChange = true;
+    this.historyUnlocked = true;
+
+    this.previousHash = window.location.hash.substring(1);
+    this.currentBookmark = '';
+    this.currentPage = 0;
+    this.updatePreviousBookmark = false;
+    this.previousBookmark = '';
+    this.previousPage = 0;
+    this.nextHashParam = '';
+
+    this.fingerprint = fingerprint;
+    this.currentUid = this.uid = 0;
+    this.current = {};
+
+    var state = window.history.state;
+    if (this._isStateObjectDefined(state)) {
+      // This corresponds to navigating back to the document
+      // from another page in the browser history.
+      if (state.target.dest) {
+        this.initialDestination = state.target.dest;
+      } else {
+        PDFView.initialBookmark = state.target.hash;
+      }
+      this.currentUid = state.uid;
+      this.uid = state.uid + 1;
+      this.current = state.target;
+    } else {
+      // This corresponds to the loading of a new document.
+      if (state && state.fingerprint &&
+          this.fingerprint !== state.fingerprint) {
+        // Reinitialize the browsing history when a new document
+        // is opened in the web viewer.
+        this.reInitialized = true;
+      }
+      this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);
+    }
+
+    var self = this;
+    window.addEventListener('popstate', function pdfHistoryPopstate(evt) {
+      evt.preventDefault();
+      evt.stopPropagation();
+
+      if (!self.historyUnlocked) {
+        return;
+      }
+      if (evt.state) {
+        // Move back/forward in the history.
+        self._goTo(evt.state);
+      } else {
+        // Handle the user modifying the hash of a loaded document.
+        self.previousHash = window.location.hash.substring(1);
+
+        // If the history is empty when the hash changes,
+        // update the previous entry in the browser history.
+        if (self.uid === 0) {
+          var previousParams = (self.previousHash && self.currentBookmark &&
+                                self.previousHash !== self.currentBookmark) ?
+            { hash: self.currentBookmark, page: self.currentPage } :
+            { page: 1 };
+          self.historyUnlocked = false;
+          self.allowHashChange = false;
+          window.history.back();
+          self._pushToHistory(previousParams, false, true);
+          window.history.forward();
+          self.historyUnlocked = true;
+        }
+        self._pushToHistory({ hash: self.previousHash }, false, true);
+        self._updatePreviousBookmark();
+      }
+    }, false);
+
+    function pdfHistoryBeforeUnload() {
+      var previousParams = self._getPreviousParams(null, true);
+      if (previousParams) {
+        var replacePrevious = (!self.current.dest &&
+                               self.current.hash !== self.previousHash);
+        self._pushToHistory(previousParams, false, replacePrevious);
+        self._updatePreviousBookmark();
+      }
+      // Remove the event listener when navigating away from the document,
+      // since 'beforeunload' prevents Firefox from caching the document.
+      window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false);
+    }
+    window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
+
+    window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {
+      // If the entire viewer (including the PDF file) is cached in the browser,
+      // we need to reattach the 'beforeunload' event listener since
+      // the 'DOMContentLoaded' event is not fired on 'pageshow'.
+      window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
+    }, false);
+  },
+
+  _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {
+    return (state && state.uid >= 0 &&
+            state.fingerprint && this.fingerprint === state.fingerprint &&
+            state.target && state.target.hash) ? true : false;
+  },
+
+  _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj,
+                                                              replace) {
+    if (replace) {
+      window.history.replaceState(stateObj, '', document.URL);
+    } else {
+      window.history.pushState(stateObj, '', document.URL);
+    }
+  },
+
+  get isHashChangeUnlocked() {
+    if (!this.initialized) {
+      return true;
+    }
+    // If the current hash changes when moving back/forward in the history,
+    // this will trigger a 'popstate' event *as well* as a 'hashchange' event.
+    // Since the hash generally won't correspond to the exact the position
+    // stored in the history's state object, triggering the 'hashchange' event
+    // can thus corrupt the browser history.
+    //
+    // When the hash changes during a 'popstate' event, we *only* prevent the
+    // first 'hashchange' event and immediately reset allowHashChange.
+    // If it is not reset, the user would not be able to change the hash.
+
+    var temp = this.allowHashChange;
+    this.allowHashChange = true;
+    return temp;
+  },
+
+  _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {
+    if (this.updatePreviousBookmark &&
+        this.currentBookmark && this.currentPage) {
+      this.previousBookmark = this.currentBookmark;
+      this.previousPage = this.currentPage;
+      this.updatePreviousBookmark = false;
+    }
+  },
+
+  updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark,
+                                                                  pageNum) {
+    if (this.initialized) {
+      this.currentBookmark = bookmark.substring(1);
+      this.currentPage = pageNum | 0;
+      this._updatePreviousBookmark();
+    }
+  },
+
+  updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {
+    if (this.initialized) {
+      this.nextHashParam = param;
+    }
+  },
+
+  push: function pdfHistoryPush(params, isInitialBookmark) {
+    if (!(this.initialized && this.historyUnlocked)) {
+      return;
+    }
+    if (params.dest && !params.hash) {
+      params.hash = (this.current.hash && this.current.dest &&
+                     this.current.dest === params.dest) ?
+        this.current.hash :
+        PDFView.getDestinationHash(params.dest).split('#')[1];
+    }
+    if (params.page) {
+      params.page |= 0;
+    }
+    if (isInitialBookmark) {
+      var target = window.history.state.target;
+      if (!target) {
+        // Invoked when the user specifies an initial bookmark,
+        // thus setting PDFView.initialBookmark, when the document is loaded.
+        this._pushToHistory(params, false);
+        this.previousHash = window.location.hash.substring(1);
+      }
+      this.updatePreviousBookmark = this.nextHashParam ? false : true;
+      if (target) {
+        // If the current document is reloaded,
+        // avoid creating duplicate entries in the history.
+        this._updatePreviousBookmark();
+      }
+      return;
+    }
+    if (this.nextHashParam) {
+      if (this.nextHashParam === params.hash) {
+        this.nextHashParam = null;
+        this.updatePreviousBookmark = true;
+        return;
+      } else {
+        this.nextHashParam = null;
+      }
+    }
+
+    if (params.hash) {
+      if (this.current.hash) {
+        if (this.current.hash !== params.hash) {
+          this._pushToHistory(params, true);
+        } else {
+          if (!this.current.page && params.page) {
+            this._pushToHistory(params, false, true);
+          }
+          this.updatePreviousBookmark = true;
+        }
+      } else {
+        this._pushToHistory(params, true);
+      }
+    } else if (this.current.page && params.page &&
+               this.current.page !== params.page) {
+      this._pushToHistory(params, true);
+    }
+  },
+
+  _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage,
+                                                            beforeUnload) {
+    if (!(this.currentBookmark && this.currentPage)) {
+      return null;
+    } else if (this.updatePreviousBookmark) {
+      this.updatePreviousBookmark = false;
+    }
+    if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {
+      // Prevent the history from getting stuck in the current state,
+      // effectively preventing the user from going back/forward in the history.
+      //
+      // This happens if the current position in the document didn't change when
+      // the history was previously updated. The reasons for this are either:
+      // 1. The current zoom value is such that the document does not need to,
+      //    or cannot, be scrolled to display the destination.
+      // 2. The previous destination is broken, and doesn't actally point to a
+      //    position within the document.
+      //    (This is either due to a bad PDF generator, or the user making a
+      //     mistake when entering a destination in the hash parameters.)
+      return null;
+    }
+    if ((!this.current.dest && !onlyCheckPage) || beforeUnload) {
+      if (this.previousBookmark === this.currentBookmark) {
+        return null;
+      }
+    } else if (this.current.page || onlyCheckPage) {
+      if (this.previousPage === this.currentPage) {
+        return null;
+      }
+    } else {
+      return null;
+    }
+    var params = { hash: this.currentBookmark, page: this.currentPage };
+    if (PresentationMode.active) {
+      params.hash = null;
+    }
+    return params;
+  },
+
+  _stateObj: function pdfHistory_stateObj(params) {
+    return { fingerprint: this.fingerprint, uid: this.uid, target: params };
+  },
+
+  _pushToHistory: function pdfHistory_pushToHistory(params,
+                                                    addPrevious, overwrite) {
+    if (!this.initialized) {
+      return;
+    }
+    if (!params.hash && params.page) {
+      params.hash = ('page=' + params.page);
+    }
+    if (addPrevious && !overwrite) {
+      var previousParams = this._getPreviousParams();
+      if (previousParams) {
+        var replacePrevious = (!this.current.dest &&
+                               this.current.hash !== this.previousHash);
+        this._pushToHistory(previousParams, false, replacePrevious);
+      }
+    }
+    this._pushOrReplaceState(this._stateObj(params),
+                             (overwrite || this.uid === 0));
+    this.currentUid = this.uid++;
+    this.current = params;
+    this.updatePreviousBookmark = true;
+  },
+
+  _goTo: function pdfHistory_goTo(state) {
+    if (!(this.initialized && this.historyUnlocked &&
+          this._isStateObjectDefined(state))) {
+      return;
+    }
+    if (!this.reInitialized && state.uid < this.currentUid) {
+      var previousParams = this._getPreviousParams(true);
+      if (previousParams) {
+        this._pushToHistory(this.current, false);
+        this._pushToHistory(previousParams, false);
+        this.currentUid = state.uid;
+        window.history.back();
+        return;
+      }
+    }
+    this.historyUnlocked = false;
+
+    if (state.target.dest) {
+      PDFView.navigateTo(state.target.dest);
+    } else {
+      PDFView.setHash(state.target.hash);
+    }
+    this.currentUid = state.uid;
+    if (state.uid > this.uid) {
+      this.uid = state.uid;
+    }
+    this.current = state.target;
+    this.updatePreviousBookmark = true;
+
+    var currentHash = window.location.hash.substring(1);
+    if (this.previousHash !== currentHash) {
+      this.allowHashChange = false;
+    }
+    this.previousHash = currentHash;
+
+    this.historyUnlocked = true;
+  },
+
+  back: function pdfHistoryBack() {
+    this.go(-1);
+  },
+
+  forward: function pdfHistoryForward() {
+    this.go(1);
+  },
+
+  go: function pdfHistoryGo(direction) {
+    if (this.initialized && this.historyUnlocked) {
+      var state = window.history.state;
+      if (direction === -1 && state && state.uid > 0) {
+        window.history.back();
+      } else if (direction === 1 && state && state.uid < (this.uid - 1)) {
+        window.history.forward();
+      }
+    }
+  }
+};
+
+
+var SecondaryToolbar = {
+  opened: false,
+  previousContainerHeight: null,
+  newContainerHeight: null,
+
+  initialize: function secondaryToolbarInitialize(options) {
+    this.toolbar = options.toolbar;
+    this.presentationMode = options.presentationMode;
+    this.documentProperties = options.documentProperties;
+    this.buttonContainer = this.toolbar.firstElementChild;
+
+    // Define the toolbar buttons.
+    this.toggleButton = options.toggleButton;
+    this.presentationModeButton = options.presentationModeButton;
+    this.openFile = options.openFile;
+    this.print = options.print;
+    this.download = options.download;
+    this.viewBookmark = options.viewBookmark;
+    this.firstPage = options.firstPage;
+    this.lastPage = options.lastPage;
+    this.pageRotateCw = options.pageRotateCw;
+    this.pageRotateCcw = options.pageRotateCcw;
+    this.documentPropertiesButton = options.documentPropertiesButton;
+
+    // Attach the event listeners.
+    var elements = [
+      // Button to toggle the visibility of the secondary toolbar:
+      { element: this.toggleButton, handler: this.toggle },
+      // All items within the secondary toolbar
+      // (except for toggleHandTool, hand_tool.js is responsible for it):
+      { element: this.presentationModeButton,
+        handler: this.presentationModeClick },
+      { element: this.openFile, handler: this.openFileClick },
+      { element: this.print, handler: this.printClick },
+      { element: this.download, handler: this.downloadClick },
+      { element: this.viewBookmark, handler: this.viewBookmarkClick },
+      { element: this.firstPage, handler: this.firstPageClick },
+      { element: this.lastPage, handler: this.lastPageClick },
+      { element: this.pageRotateCw, handler: this.pageRotateCwClick },
+      { element: this.pageRotateCcw, handler: this.pageRotateCcwClick },
+      { element: this.documentPropertiesButton,
+        handler: this.documentPropertiesClick }
+    ];
+
+    for (var item in elements) {
+      var element = elements[item].element;
+      if (element) {
+        element.addEventListener('click', elements[item].handler.bind(this));
+      }
+    }
+  },
+
+  // Event handling functions.
+  presentationModeClick: function secondaryToolbarPresentationModeClick(evt) {
+    this.presentationMode.request();
+    this.close();
+  },
+
+  openFileClick: function secondaryToolbarOpenFileClick(evt) {
+    document.getElementById('fileInput').click();
+    this.close();
+  },
+
+  printClick: function secondaryToolbarPrintClick(evt) {
+    window.print();
+    this.close();
+  },
+
+  downloadClick: function secondaryToolbarDownloadClick(evt) {
+    PDFView.download();
+    this.close();
+  },
+
+  viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) {
+    this.close();
+  },
+
+  firstPageClick: function secondaryToolbarFirstPageClick(evt) {
+    PDFView.page = 1;
+    this.close();
+  },
+
+  lastPageClick: function secondaryToolbarLastPageClick(evt) {
+    PDFView.page = PDFView.pdfDocument.numPages;
+    this.close();
+  },
+
+  pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) {
+    PDFView.rotatePages(90);
+  },
+
+  pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) {
+    PDFView.rotatePages(-90);
+  },
+
+  documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) {
+    this.documentProperties.show();
+    this.close();
+  },
+
+  // Misc. functions for interacting with the toolbar.
+  setMaxHeight: function secondaryToolbarSetMaxHeight(container) {
+    if (!container || !this.buttonContainer) {
+      return;
+    }
+    this.newContainerHeight = container.clientHeight;
+    if (this.previousContainerHeight === this.newContainerHeight) {
+      return;
+    }
+    this.buttonContainer.setAttribute('style',
+      'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;');
+    this.previousContainerHeight = this.newContainerHeight;
+  },
+
+  open: function secondaryToolbarOpen() {
+    if (this.opened) {
+      return;
+    }
+    this.opened = true;
+    this.toggleButton.classList.add('toggled');
+    this.toolbar.classList.remove('hidden');
+  },
+
+  close: function secondaryToolbarClose(target) {
+    if (!this.opened) {
+      return;
+    } else if (target && !this.toolbar.contains(target)) {
+      return;
+    }
+    this.opened = false;
+    this.toolbar.classList.add('hidden');
+    this.toggleButton.classList.remove('toggled');
+  },
+
+  toggle: function secondaryToolbarToggle() {
+    if (this.opened) {
+      this.close();
+    } else {
+      this.open();
+    }
+  }
+};
+
+
+var PasswordPrompt = {
+  visible: false,
+  updatePassword: null,
+  reason: null,
+  overlayContainer: null,
+  passwordField: null,
+  passwordText: null,
+  passwordSubmit: null,
+  passwordCancel: null,
+
+  initialize: function secondaryToolbarInitialize(options) {
+    this.overlayContainer = options.overlayContainer;
+    this.passwordField = options.passwordField;
+    this.passwordText = options.passwordText;
+    this.passwordSubmit = options.passwordSubmit;
+    this.passwordCancel = options.passwordCancel;
+
+    // Attach the event listeners.
+    this.passwordSubmit.addEventListener('click',
+      this.verifyPassword.bind(this));
+
+    this.passwordCancel.addEventListener('click', this.hide.bind(this));
+
+    this.passwordField.addEventListener('keydown',
+      function (e) {
+        if (e.keyCode === 13) { // Enter key
+          this.verifyPassword();
+        }
+      }.bind(this));
+
+    window.addEventListener('keydown',
+      function (e) {
+        if (e.keyCode === 27) { // Esc key
+          this.hide();
+        }
+      }.bind(this));
+  },
+
+  show: function passwordPromptShow() {
+    if (this.visible) {
+      return;
+    }
+    this.visible = true;
+    this.overlayContainer.classList.remove('hidden');
+    this.overlayContainer.firstElementChild.classList.remove('hidden');
+    this.passwordField.focus();
+
+    var promptString = mozL10n.get('password_label', null,
+      'Enter the password to open this PDF file.');
+
+    if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) {
+      promptString = mozL10n.get('password_invalid', null,
+        'Invalid password. Please try again.');
+    }
+
+    this.passwordText.textContent = promptString;
+  },
+
+  hide: function passwordPromptClose() {
+    if (!this.visible) {
+      return;
+    }
+    this.visible = false;
+    this.passwordField.value = '';
+    this.overlayContainer.classList.add('hidden');
+    this.overlayContainer.firstElementChild.classList.add('hidden');
+  },
+
+  verifyPassword: function passwordPromptVerifyPassword() {
+    var password = this.passwordField.value;
+    if (password && password.length > 0) {
+      this.hide();
+      return this.updatePassword(password);
+    }
+  }
+};
+
+
+var DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms
+var SELECTOR = 'presentationControls';
+var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1000; // in ms
+
+var PresentationMode = {
+  active: false,
+  args: null,
+  contextMenuOpen: false,
+  prevCoords: { x: null, y: null },
+
+  initialize: function presentationModeInitialize(options) {
+    this.container = options.container;
+    this.secondaryToolbar = options.secondaryToolbar;
+
+    this.viewer = this.container.firstElementChild;
+
+    this.firstPage = options.firstPage;
+    this.lastPage = options.lastPage;
+    this.pageRotateCw = options.pageRotateCw;
+    this.pageRotateCcw = options.pageRotateCcw;
+
+    this.firstPage.addEventListener('click', function() {
+      this.contextMenuOpen = false;
+      this.secondaryToolbar.firstPageClick();
+    }.bind(this));
+    this.lastPage.addEventListener('click', function() {
+      this.contextMenuOpen = false;
+      this.secondaryToolbar.lastPageClick();
+    }.bind(this));
+
+    this.pageRotateCw.addEventListener('click', function() {
+      this.contextMenuOpen = false;
+      this.secondaryToolbar.pageRotateCwClick();
+    }.bind(this));
+    this.pageRotateCcw.addEventListener('click', function() {
+      this.contextMenuOpen = false;
+      this.secondaryToolbar.pageRotateCcwClick();
+    }.bind(this));
+  },
+
+  get isFullscreen() {
+    return (document.fullscreenElement ||
+            document.mozFullScreen ||
+            document.webkitIsFullScreen ||
+            document.msFullscreenElement);
+  },
+
+  /**
+   * Initialize a timeout that is used to reset PDFView.currentPosition when the
+   * browser transitions to fullscreen mode. Since resize events are triggered
+   * multiple times during the switch to fullscreen mode, this is necessary in
+   * order to prevent the page from being scrolled partially, or completely,
+   * out of view when Presentation Mode is enabled.
+   * Note: This is only an issue at certain zoom levels, e.g. 'page-width'.
+   */
+  _setSwitchInProgress: function presentationMode_setSwitchInProgress() {
+    if (this.switchInProgress) {
+      clearTimeout(this.switchInProgress);
+    }
+    this.switchInProgress = setTimeout(function switchInProgressTimeout() {
+      delete this.switchInProgress;
+    }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
+
+    PDFView.currentPosition = null;
+  },
+
+  _resetSwitchInProgress: function presentationMode_resetSwitchInProgress() {
+    if (this.switchInProgress) {
+      clearTimeout(this.switchInProgress);
+      delete this.switchInProgress;
+    }
+  },
+
+  request: function presentationModeRequest() {
+    if (!PDFView.supportsFullscreen || this.isFullscreen ||
+        !this.viewer.hasChildNodes()) {
+      return false;
+    }
+    this._setSwitchInProgress();
+
+    if (this.container.requestFullscreen) {
+      this.container.requestFullscreen();
+    } else if (this.container.mozRequestFullScreen) {
+      this.container.mozRequestFullScreen();
+    } else if (this.container.webkitRequestFullScreen) {
+      this.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
+    } else if (this.container.msRequestFullscreen) {
+      this.container.msRequestFullscreen();
+    } else {
+      return false;
+    }
+
+    this.args = {
+      page: PDFView.page,
+      previousScale: PDFView.currentScaleValue
+    };
+
+    return true;
+  },
+
+  enter: function presentationModeEnter() {
+    this.active = true;
+    this._resetSwitchInProgress();
+
+    // Ensure that the correct page is scrolled into view when entering
+    // Presentation Mode, by waiting until fullscreen mode in enabled.
+    // Note: This is only necessary in non-Mozilla browsers.
+    setTimeout(function enterPresentationModeTimeout() {
+      PDFView.page = this.args.page;
+      PDFView.setScale('page-fit', true);
+    }.bind(this), 0);
+
+    window.addEventListener('mousemove', this.mouseMove, false);
+    window.addEventListener('mousedown', this.mouseDown, false);
+    window.addEventListener('contextmenu', this.contextMenu, false);
+
+    this.showControls();
+    HandTool.enterPresentationMode();
+    this.contextMenuOpen = false;
+    this.container.setAttribute('contextmenu', 'viewerContextMenu');
+  },
+
+  exit: function presentationModeExit() {
+    var page = PDFView.page;
+
+    // Ensure that the correct page is scrolled into view when exiting
+    // Presentation Mode, by waiting until fullscreen mode is disabled.
+    // Note: This is only necessary in non-Mozilla browsers.
+    setTimeout(function exitPresentationModeTimeout() {
+      this.active = false;
+      PDFView.setScale(this.args.previousScale);
+      PDFView.page = page;
+      this.args = null;
+    }.bind(this), 0);
+
+    window.removeEventListener('mousemove', this.mouseMove, false);
+    window.removeEventListener('mousedown', this.mouseDown, false);
+    window.removeEventListener('contextmenu', this.contextMenu, false);
+
+    this.hideControls();
+    PDFView.clearMouseScrollState();
+    HandTool.exitPresentationMode();
+    this.container.removeAttribute('contextmenu');
+    this.contextMenuOpen = false;
+
+    // Ensure that the thumbnail of the current page is visible
+    // when exiting presentation mode.
+    scrollIntoView(document.getElementById('thumbnailContainer' + page));
+  },
+
+  showControls: function presentationModeShowControls() {
+    if (this.controlsTimeout) {
+      clearTimeout(this.controlsTimeout);
+    } else {
+      this.container.classList.add(SELECTOR);
+    }
+    this.controlsTimeout = setTimeout(function hideControlsTimeout() {
+      this.container.classList.remove(SELECTOR);
+      delete this.controlsTimeout;
+    }.bind(this), DELAY_BEFORE_HIDING_CONTROLS);
+  },
+
+  hideControls: function presentationModeHideControls() {
+    if (!this.controlsTimeout) {
+      return;
+    }
+    this.container.classList.remove(SELECTOR);
+    clearTimeout(this.controlsTimeout);
+    delete this.controlsTimeout;
+  },
+
+  mouseMove: function presentationModeMouseMove(evt) {
+    // Workaround for a bug in WebKit browsers that causes the 'mousemove' event
+    // to be fired when the cursor is changed. For details, see:
+    // http://code.google.com/p/chromium/issues/detail?id=103041.
+
+    var currCoords = { x: evt.clientX, y: evt.clientY };
+    var prevCoords = PresentationMode.prevCoords;
+    PresentationMode.prevCoords = currCoords;
+
+    if (currCoords.x === prevCoords.x && currCoords.y === prevCoords.y) {
+      return;
+    }
+    PresentationMode.showControls();
+  },
+
+  mouseDown: function presentationModeMouseDown(evt) {
+    var self = PresentationMode;
+    if (self.contextMenuOpen) {
+      self.contextMenuOpen = false;
+      evt.preventDefault();
+      return;
+    }
+
+    if (evt.button === 0) {
+      // Enable clicking of links in presentation mode. Please note:
+      // Only links pointing to destinations in the current PDF document work.
+      var isInternalLink = (evt.target.href &&
+                            evt.target.classList.contains('internalLink'));
+      if (!isInternalLink) {
+        // Unless an internal link was clicked, advance one page.
+        evt.preventDefault();
+        PDFView.page += (evt.shiftKey ? -1 : 1);
+      }
+    }
+  },
+
+  contextMenu: function presentationModeContextMenu(evt) {
+    PresentationMode.contextMenuOpen = true;
+  }
+};
+
+(function presentationModeClosure() {
+  function presentationModeChange(e) {
+    if (PresentationMode.isFullscreen) {
+      PresentationMode.enter();
+    } else {
+      PresentationMode.exit();
+    }
+  }
+
+  window.addEventListener('fullscreenchange', presentationModeChange, false);
+  window.addEventListener('mozfullscreenchange', presentationModeChange, false);
+  window.addEventListener('webkitfullscreenchange', presentationModeChange,
+                          false);
+  window.addEventListener('MSFullscreenChange', presentationModeChange, false);
+})();
+
+
+/* Copyright 2013 Rob Wu <gwnRob@gmail.com>
+ * https://github.com/Rob--W/grab-to-pan.js
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+var GrabToPan = (function GrabToPanClosure() {
+  /**
+   * Construct a GrabToPan instance for a given HTML element.
+   * @param options.element {Element}
+   * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)`
+   * @param options.onActiveChanged {function(boolean)} optional. Called
+   *  when grab-to-pan is (de)activated. The first argument is a boolean that
+   *  shows whether grab-to-pan is activated.
+   */
+  function GrabToPan(options) {
+    this.element = options.element;
+    this.document = options.element.ownerDocument;
+    if (typeof options.ignoreTarget === 'function') {
+      this.ignoreTarget = options.ignoreTarget;
+    }
+    this.onActiveChanged = options.onActiveChanged;
+
+    // Bind the contexts to ensure that `this` always points to
+    // the GrabToPan instance.
+    this.activate = this.activate.bind(this);
+    this.deactivate = this.deactivate.bind(this);
+    this.toggle = this.toggle.bind(this);
+    this._onmousedown = this._onmousedown.bind(this);
+    this._onmousemove = this._onmousemove.bind(this);
+    this._endPan = this._endPan.bind(this);
+
+    // This overlay will be inserted in the document when the mouse moves during
+    // a grab operation, to ensure that the cursor has the desired appearance.
+    var overlay = this.overlay = document.createElement('div');
+    overlay.className = 'grab-to-pan-grabbing';
+  }
+  GrabToPan.prototype = {
+    /**
+     * Class name of element which can be grabbed
+     */
+    CSS_CLASS_GRAB: 'grab-to-pan-grab',
+
+    /**
+     * Bind a mousedown event to the element to enable grab-detection.
+     */
+    activate: function GrabToPan_activate() {
+      if (!this.active) {
+        this.active = true;
+        this.element.addEventListener('mousedown', this._onmousedown, true);
+        this.element.classList.add(this.CSS_CLASS_GRAB);
+        if (this.onActiveChanged) {
+          this.onActiveChanged(true);
+        }
+      }
+    },
+
+    /**
+     * Removes all events. Any pending pan session is immediately stopped.
+     */
+    deactivate: function GrabToPan_deactivate() {
+      if (this.active) {
+        this.active = false;
+        this.element.removeEventListener('mousedown', this._onmousedown, true);
+        this._endPan();
+        this.element.classList.remove(this.CSS_CLASS_GRAB);
+        if (this.onActiveChanged) {
+          this.onActiveChanged(false);
+        }
+      }
+    },
+
+    toggle: function GrabToPan_toggle() {
+      if (this.active) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+    },
+
+    /**
+     * Whether to not pan if the target element is clicked.
+     * Override this method to change the default behaviour.
+     *
+     * @param node {Element} The target of the event
+     * @return {boolean} Whether to not react to the click event.
+     */
+    ignoreTarget: function GrabToPan_ignoreTarget(node) {
+      // Use matchesSelector to check whether the clicked element
+      // is (a child of) an input element / link
+      return node[matchesSelector](
+        'a[href], a[href] *, input, textarea, button, button *, select, option'
+      );
+    },
+
+    /**
+     * @private
+     */
+    _onmousedown: function GrabToPan__onmousedown(event) {
+      if (event.button !== 0 || this.ignoreTarget(event.target)) {
+        return;
+      }
+      if (event.originalTarget) {
+        try {
+          /* jshint expr:true */
+          event.originalTarget.tagName;
+        } catch (e) {
+          // Mozilla-specific: element is a scrollbar (XUL element)
+          return;
+        }
+      }
+
+      this.scrollLeftStart = this.element.scrollLeft;
+      this.scrollTopStart = this.element.scrollTop;
+      this.clientXStart = event.clientX;
+      this.clientYStart = event.clientY;
+      this.document.addEventListener('mousemove', this._onmousemove, true);
+      this.document.addEventListener('mouseup', this._endPan, true);
+      // When a scroll event occurs before a mousemove, assume that the user
+      // dragged a scrollbar (necessary for Opera Presto, Safari and IE)
+      // (not needed for Chrome/Firefox)
+      this.element.addEventListener('scroll', this._endPan, true);
+      event.preventDefault();
+      event.stopPropagation();
+      this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING);
+    },
+
+    /**
+     * @private
+     */
+    _onmousemove: function GrabToPan__onmousemove(event) {
+      this.element.removeEventListener('scroll', this._endPan, true);
+      if (isLeftMouseReleased(event)) {
+        this._endPan();
+        return;
+      }
+      var xDiff = event.clientX - this.clientXStart;
+      var yDiff = event.clientY - this.clientYStart;
+      this.element.scrollTop = this.scrollTopStart - yDiff;
+      this.element.scrollLeft = this.scrollLeftStart - xDiff;
+      if (!this.overlay.parentNode) {
+        document.body.appendChild(this.overlay);
+      }
+    },
+
+    /**
+     * @private
+     */
+    _endPan: function GrabToPan__endPan() {
+      this.element.removeEventListener('scroll', this._endPan, true);
+      this.document.removeEventListener('mousemove', this._onmousemove, true);
+      this.document.removeEventListener('mouseup', this._endPan, true);
+      if (this.overlay.parentNode) {
+        this.overlay.parentNode.removeChild(this.overlay);
+      }
+    }
+  };
+
+  // Get the correct (vendor-prefixed) name of the matches method.
+  var matchesSelector;
+  ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) {
+    var name = prefix + 'atches';
+    if (name in document.documentElement) {
+      matchesSelector = name;
+    }
+    name += 'Selector';
+    if (name in document.documentElement) {
+      matchesSelector = name;
+    }
+    return matchesSelector; // If found, then truthy, and [].some() ends.
+  });
+
+  // Browser sniffing because it's impossible to feature-detect
+  // whether event.which for onmousemove is reliable
+  var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;
+  var chrome = window.chrome;
+  var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
+  //                                       ^ Chrome 15+       ^ Opera 15+
+  var isSafari6plus = /Apple/.test(navigator.vendor) &&
+                      /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);
+
+  /**
+   * Whether the left mouse is not pressed.
+   * @param event {MouseEvent}
+   * @return {boolean} True if the left mouse button is not pressed.
+   *                   False if unsure or if the left mouse button is pressed.
+   */
+  function isLeftMouseReleased(event) {
+    if ('buttons' in event && isNotIEorIsIE10plus) {
+      // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons
+      // Firefox 15+
+      // Internet Explorer 10+
+      return !(event.buttons | 1);
+    }
+    if (isChrome15OrOpera15plus || isSafari6plus) {
+      // Chrome 14+
+      // Opera 15+
+      // Safari 6.0+
+      return event.which === 0;
+    }
+  }
+
+  return GrabToPan;
+})();
+
+var HandTool = {
+  initialize: function handToolInitialize(options) {
+    var toggleHandTool = options.toggleHandTool;
+    this.handTool = new GrabToPan({
+      element: options.container,
+      onActiveChanged: function(isActive) {
+        if (!toggleHandTool) {
+          return;
+        }
+        if (isActive) {
+          toggleHandTool.title =
+            mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool');
+          toggleHandTool.firstElementChild.textContent =
+            mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool');
+        } else {
+          toggleHandTool.title =
+            mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool');
+          toggleHandTool.firstElementChild.textContent =
+            mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool');
+        }
+      }
+    });
+    if (toggleHandTool) {
+      toggleHandTool.addEventListener('click', this.toggle.bind(this), false);
+
+      window.addEventListener('localized', function (evt) {
+        Preferences.get('enableHandToolOnLoad').then(function (prefValue) {
+          if (prefValue) {
+            this.handTool.activate();
+          }
+        }.bind(this));
+      }.bind(this));
+    }
+  },
+
+  toggle: function handToolToggle() {
+    this.handTool.toggle();
+    SecondaryToolbar.close();
+  },
+
+  enterPresentationMode: function handToolEnterPresentationMode() {
+    if (this.handTool.active) {
+      this.wasActive = true;
+      this.handTool.deactivate();
+    }
+  },
+
+  exitPresentationMode: function handToolExitPresentationMode() {
+    if (this.wasActive) {
+      this.wasActive = null;
+      this.handTool.activate();
+    }
+  }
+};
+
+
+var DocumentProperties = {
+  overlayContainer: null,
+  fileName: '',
+  fileSize: '',
+  visible: false,
+
+  // Document property fields (in the viewer).
+  fileNameField: null,
+  fileSizeField: null,
+  titleField: null,
+  authorField: null,
+  subjectField: null,
+  keywordsField: null,
+  creationDateField: null,
+  modificationDateField: null,
+  creatorField: null,
+  producerField: null,
+  versionField: null,
+  pageCountField: null,
+
+  initialize: function documentPropertiesInitialize(options) {
+    this.overlayContainer = options.overlayContainer;
+
+    // Set the document property fields.
+    this.fileNameField = options.fileNameField;
+    this.fileSizeField = options.fileSizeField;
+    this.titleField = options.titleField;
+    this.authorField = options.authorField;
+    this.subjectField = options.subjectField;
+    this.keywordsField = options.keywordsField;
+    this.creationDateField = options.creationDateField;
+    this.modificationDateField = options.modificationDateField;
+    this.creatorField = options.creatorField;
+    this.producerField = options.producerField;
+    this.versionField = options.versionField;
+    this.pageCountField = options.pageCountField;
+
+    // Bind the event listener for the Close button.
+    if (options.closeButton) {
+      options.closeButton.addEventListener('click', this.hide.bind(this));
+    }
+
+    this.dataAvailablePromise = new Promise(function (resolve) {
+      this.resolveDataAvailable = resolve;
+    }.bind(this));
+
+    // Bind the event listener for the Esc key (to close the dialog).
+    window.addEventListener('keydown',
+      function (e) {
+        if (e.keyCode === 27) { // Esc key
+          this.hide();
+        }
+      }.bind(this));
+  },
+
+  getProperties: function documentPropertiesGetProperties() {
+    if (!this.visible) {
+      // If the dialog was closed before dataAvailablePromise was resolved,
+      // don't bother updating the properties.
+      return;
+    }
+    // Get the file name.
+    this.fileName = getPDFFileNameFromURL(PDFView.url);
+
+    // Get the file size.
+    PDFView.pdfDocument.getDownloadInfo().then(function(data) {
+      this.setFileSize(data.length);
+      this.updateUI(this.fileSizeField, this.fileSize);
+    }.bind(this));
+
+    // Get the other document properties.
+    PDFView.pdfDocument.getMetadata().then(function(data) {
+      var fields = [
+        { field: this.fileNameField, content: this.fileName },
+        // The fileSize field is updated once getDownloadInfo is resolved.
+        { field: this.titleField, content: data.info.Title },
+        { field: this.authorField, content: data.info.Author },
+        { field: this.subjectField, content: data.info.Subject },
+        { field: this.keywordsField, content: data.info.Keywords },
+        { field: this.creationDateField,
+          content: this.parseDate(data.info.CreationDate) },
+        { field: this.modificationDateField,
+          content: this.parseDate(data.info.ModDate) },
+        { field: this.creatorField, content: data.info.Creator },
+        { field: this.producerField, content: data.info.Producer },
+        { field: this.versionField, content: data.info.PDFFormatVersion },
+        { field: this.pageCountField, content: PDFView.pdfDocument.numPages }
+      ];
+
+      // Show the properties in the dialog.
+      for (var item in fields) {
+        var element = fields[item];
+        this.updateUI(element.field, element.content);
+      }
+    }.bind(this));
+  },
+
+  updateUI: function documentPropertiesUpdateUI(field, content) {
+    if (field && content !== undefined && content !== '') {
+      field.textContent = content;
+    }
+  },
+
+  setFileSize: function documentPropertiesSetFileSize(fileSize) {
+    var kb = fileSize / 1024;
+    if (kb < 1024) {
+      this.fileSize = mozL10n.get('document_properties_kb', {
+        size_kb: (+kb.toPrecision(3)).toLocaleString(),
+        size_b: fileSize.toLocaleString()
+      }, '{{size_kb}} KB ({{size_b}} bytes)');
+    } else {
+      this.fileSize = mozL10n.get('document_properties_mb', {
+        size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),
+        size_b: fileSize.toLocaleString()
+      }, '{{size_mb}} MB ({{size_b}} bytes)');
+    }
+  },
+
+  show: function documentPropertiesShow() {
+    if (this.visible) {
+      return;
+    }
+    this.visible = true;
+    this.overlayContainer.classList.remove('hidden');
+    this.overlayContainer.lastElementChild.classList.remove('hidden');
+
+    this.dataAvailablePromise.then(function () {
+      this.getProperties();
+    }.bind(this));
+  },
+
+  hide: function documentPropertiesClose() {
+    if (!this.visible) {
+      return;
+    }
+    this.visible = false;
+    this.overlayContainer.classList.add('hidden');
+    this.overlayContainer.lastElementChild.classList.add('hidden');
+  },
+
+  parseDate: function documentPropertiesParseDate(inputDate) {
+    // This is implemented according to the PDF specification (see
+    // http://www.gnupdf.org/Date for an overview), but note that
+    // Adobe Reader doesn't handle changing the date to universal time
+    // and doesn't use the user's time zone (they're effectively ignoring
+    // the HH' and mm' parts of the date string).
+    var dateToParse = inputDate;
+    if (dateToParse === undefined) {
+      return '';
+    }
+
+    // Remove the D: prefix if it is available.
+    if (dateToParse.substring(0,2) === 'D:') {
+      dateToParse = dateToParse.substring(2);
+    }
+
+    // Get all elements from the PDF date string.
+    // JavaScript's Date object expects the month to be between
+    // 0 and 11 instead of 1 and 12, so we're correcting for this.
+    var year = parseInt(dateToParse.substring(0,4), 10);
+    var month = parseInt(dateToParse.substring(4,6), 10) - 1;
+    var day = parseInt(dateToParse.substring(6,8), 10);
+    var hours = parseInt(dateToParse.substring(8,10), 10);
+    var minutes = parseInt(dateToParse.substring(10,12), 10);
+    var seconds = parseInt(dateToParse.substring(12,14), 10);
+    var utRel = dateToParse.substring(14,15);
+    var offsetHours = parseInt(dateToParse.substring(15,17), 10);
+    var offsetMinutes = parseInt(dateToParse.substring(18,20), 10);
+
+    // As per spec, utRel = 'Z' means equal to universal time.
+    // The other cases ('-' and '+') have to be handled here.
+    if (utRel == '-') {
+      hours += offsetHours;
+      minutes += offsetMinutes;
+    } else if (utRel == '+') {
+      hours -= offsetHours;
+      minutes += offsetMinutes;
+    }
+
+    // Return the new date format from the user's locale.
+    var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));
+    var dateString = date.toLocaleDateString();
+    var timeString = date.toLocaleTimeString();
+    return mozL10n.get('document_properties_date_string',
+                       {date: dateString, time: timeString},
+                       '{{date}}, {{time}}');
+  }
+};
+
+
+var PDFView = {
+  pages: [],
+  thumbnails: [],
+  currentScale: UNKNOWN_SCALE,
+  currentScaleValue: null,
+  initialBookmark: document.location.hash.substring(1),
+  container: null,
+  thumbnailContainer: null,
+  initialized: false,
+  fellback: false,
+  pdfDocument: null,
+  sidebarOpen: false,
+  pageViewScroll: null,
+  thumbnailViewScroll: null,
+  pageRotation: 0,
+  mouseScrollTimeStamp: 0,
+  mouseScrollDelta: 0,
+  lastScroll: 0,
+  previousPageNumber: 1,
+  isViewerEmbedded: (window.parent !== window),
+  idleTimeout: null,
+  currentPosition: null,
+
+  // called once when the document is loaded
+  initialize: function pdfViewInitialize() {
+    var self = this;
+    var container = this.container = document.getElementById('viewerContainer');
+    this.pageViewScroll = {};
+    this.watchScroll(container, this.pageViewScroll, updateViewarea);
+
+    var thumbnailContainer = this.thumbnailContainer =
+                             document.getElementById('thumbnailView');
+    this.thumbnailViewScroll = {};
+    this.watchScroll(thumbnailContainer, this.thumbnailViewScroll,
+                     this.renderHighestPriority.bind(this));
+
+    Preferences.initialize();
+
+    PDFFindBar.initialize({
+      bar: document.getElementById('findbar'),
+      toggleButton: document.getElementById('viewFind'),
+      findField: document.getElementById('findInput'),
+      highlightAllCheckbox: document.getElementById('findHighlightAll'),
+      caseSensitiveCheckbox: document.getElementById('findMatchCase'),
+      findMsg: document.getElementById('findMsg'),
+      findStatusIcon: document.getElementById('findStatusIcon'),
+      findPreviousButton: document.getElementById('findPrevious'),
+      findNextButton: document.getElementById('findNext')
+    });
+
+    PDFFindController.initialize({
+      pdfPageSource: this,
+      integratedFind: this.supportsIntegratedFind
+    });
+
+    HandTool.initialize({
+      container: container,
+      toggleHandTool: document.getElementById('toggleHandTool')
+    });
+
+    SecondaryToolbar.initialize({
+      toolbar: document.getElementById('secondaryToolbar'),
+      presentationMode: PresentationMode,
+      toggleButton: document.getElementById('secondaryToolbarToggle'),
+      presentationModeButton:
+        document.getElementById('secondaryPresentationMode'),
+      openFile: document.getElementById('secondaryOpenFile'),
+      print: document.getElementById('secondaryPrint'),
+      download: document.getElementById('secondaryDownload'),
+      viewBookmark: document.getElementById('secondaryViewBookmark'),
+      firstPage: document.getElementById('firstPage'),
+      lastPage: document.getElementById('lastPage'),
+      pageRotateCw: document.getElementById('pageRotateCw'),
+      pageRotateCcw: document.getElementById('pageRotateCcw'),
+      documentProperties: DocumentProperties,
+      documentPropertiesButton: document.getElementById('documentProperties')
+    });
+
+    PasswordPrompt.initialize({
+      overlayContainer: document.getElementById('overlayContainer'),
+      passwordField: document.getElementById('password'),
+      passwordText: document.getElementById('passwordText'),
+      passwordSubmit: document.getElementById('passwordSubmit'),
+      passwordCancel: document.getElementById('passwordCancel')
+    });
+
+    PresentationMode.initialize({
+      container: container,
+      secondaryToolbar: SecondaryToolbar,
+      firstPage: document.getElementById('contextFirstPage'),
+      lastPage: document.getElementById('contextLastPage'),
+      pageRotateCw: document.getElementById('contextPageRotateCw'),
+      pageRotateCcw: document.getElementById('contextPageRotateCcw')
+    });
+
+    DocumentProperties.initialize({
+      overlayContainer: document.getElementById('overlayContainer'),
+      closeButton: document.getElementById('documentPropertiesClose'),
+      fileNameField: document.getElementById('fileNameField'),
+      fileSizeField: document.getElementById('fileSizeField'),
+      titleField: document.getElementById('titleField'),
+      authorField: document.getElementById('authorField'),
+      subjectField: document.getElementById('subjectField'),
+      keywordsField: document.getElementById('keywordsField'),
+      creationDateField: document.getElementById('creationDateField'),
+      modificationDateField: document.getElementById('modificationDateField'),
+      creatorField: document.getElementById('creatorField'),
+      producerField: document.getElementById('producerField'),
+      versionField: document.getElementById('versionField'),
+      pageCountField: document.getElementById('pageCountField')
+    });
+
+    container.addEventListener('scroll', function() {
+      self.lastScroll = Date.now();
+    }, false);
+
+    var initializedPromise = Promise.all([
+      Preferences.get('enableWebGL').then(function (value) {
+        PDFJS.disableWebGL = !value;
+      })
+      // TODO move more preferences and other async stuff here
+    ]);
+
+    return initializedPromise.then(function () {
+      PDFView.initialized = true;
+    });
+  },
+
+  getPage: function pdfViewGetPage(n) {
+    return this.pdfDocument.getPage(n);
+  },
+
+  // Helper function to keep track whether a div was scrolled up or down and
+  // then call a callback.
+  watchScroll: function pdfViewWatchScroll(viewAreaElement, state, callback) {
+    state.down = true;
+    state.lastY = viewAreaElement.scrollTop;
+    viewAreaElement.addEventListener('scroll', function webViewerScroll(evt) {
+      var currentY = viewAreaElement.scrollTop;
+      var lastY = state.lastY;
+      if (currentY > lastY) {
+        state.down = true;
+      } else if (currentY < lastY) {
+        state.down = false;
+      }
+      // else do nothing and use previous value
+      state.lastY = currentY;
+      callback();
+    }, true);
+  },
+
+  _setScaleUpdatePages: function pdfView_setScaleUpdatePages(
+      newScale, newValue, resetAutoSettings, noScroll) {
+    this.currentScaleValue = newValue;
+    if (newScale === this.currentScale) {
+      return;
+    }
+    for (var i = 0, ii = this.pages.length; i < ii; i++) {
+      this.pages[i].update(newScale);
+    }
+    this.currentScale = newScale;
+
+    if (!noScroll) {
+      var page = this.page, dest;
+      if (this.currentPosition && !IGNORE_CURRENT_POSITION_ON_ZOOM) {
+        page = this.currentPosition.page;
+        dest = [null, { name: 'XYZ' }, this.currentPosition.left,
+                this.currentPosition.top, null];
+      }
+      this.pages[page - 1].scrollIntoView(dest);
+    }
+    var event = document.createEvent('UIEvents');
+    event.initUIEvent('scalechange', false, false, window, 0);
+    event.scale = newScale;
+    event.resetAutoSettings = resetAutoSettings;
+    window.dispatchEvent(event);
+  },
+
+  setScale: function pdfViewSetScale(value, resetAutoSettings, noScroll) {
+    if (value === 'custom') {
+      return;
+    }
+    var scale = parseFloat(value);
+
+    if (scale > 0) {
+      this._setScaleUpdatePages(scale, value, true, noScroll);
+    } else {
+      var currentPage = this.pages[this.page - 1];
+      if (!currentPage) {
+        return;
+      }
+      var hPadding = PresentationMode.active ? 0 : SCROLLBAR_PADDING;
+      var vPadding = PresentationMode.active ? 0 : VERTICAL_PADDING;
+      var pageWidthScale = (this.container.clientWidth - hPadding) /
+                            currentPage.width * currentPage.scale;
+      var pageHeightScale = (this.container.clientHeight - vPadding) /
+                             currentPage.height * currentPage.scale;
+      switch (value) {
+        case 'page-actual':
+          scale = 1;
+          break;
+        case 'page-width':
+          scale = pageWidthScale;
+          break;
+        case 'page-height':
+          scale = pageHeightScale;
+          break;
+        case 'page-fit':
+          scale = Math.min(pageWidthScale, pageHeightScale);
+          break;
+        case 'auto':
+          scale = Math.min(MAX_AUTO_SCALE, pageWidthScale);
+          break;
+        default:
+          console.error('pdfViewSetScale: \'' + value +
+                        '\' is an unknown zoom value.');
+          return;
+      }
+      this._setScaleUpdatePages(scale, value, resetAutoSettings, noScroll);
+
+      selectScaleOption(value);
+    }
+  },
+
+  zoomIn: function pdfViewZoomIn(ticks) {
+    var newScale = this.currentScale;
+    do {
+      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
+      newScale = Math.ceil(newScale * 10) / 10;
+      newScale = Math.min(MAX_SCALE, newScale);
+    } while (--ticks && newScale < MAX_SCALE);
+    this.setScale(newScale, true);
+  },
+
+  zoomOut: function pdfViewZoomOut(ticks) {
+    var newScale = this.currentScale;
+    do {
+      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
+      newScale = Math.floor(newScale * 10) / 10;
+      newScale = Math.max(MIN_SCALE, newScale);
+    } while (--ticks && newScale > MIN_SCALE);
+    this.setScale(newScale, true);
+  },
+
+  set page(val) {
+    var pages = this.pages;
+    var event = document.createEvent('UIEvents');
+    event.initUIEvent('pagechange', false, false, window, 0);
+
+    if (!(0 < val && val <= pages.length)) {
+      this.previousPageNumber = val;
+      event.pageNumber = this.page;
+      window.dispatchEvent(event);
+      return;
+    }
+
+    pages[val - 1].updateStats();
+    this.previousPageNumber = currentPageNumber;
+    currentPageNumber = val;
+    event.pageNumber = val;
+    window.dispatchEvent(event);
+
+    // checking if the this.page was called from the updateViewarea function:
+    // avoiding the creation of two "set page" method (internal and public)
+    if (updateViewarea.inProgress) {
+      return;
+    }
+    // Avoid scrolling the first page during loading
+    if (this.loading && val === 1) {
+      return;
+    }
+    pages[val - 1].scrollIntoView();
+  },
+
+  get page() {
+    return currentPageNumber;
+  },
+
+  get supportsPrinting() {
+    var canvas = document.createElement('canvas');
+    var value = 'mozPrintCallback' in canvas;
+    // shadow
+    Object.defineProperty(this, 'supportsPrinting', { value: value,
+                                                      enumerable: true,
+                                                      configurable: true,
+                                                      writable: false });
+    return value;
+  },
+
+  get supportsFullscreen() {
+    var doc = document.documentElement;
+    var support = doc.requestFullscreen || doc.mozRequestFullScreen ||
+                  doc.webkitRequestFullScreen || doc.msRequestFullscreen;
+
+    if (document.fullscreenEnabled === false ||
+        document.mozFullScreenEnabled === false ||
+        document.webkitFullscreenEnabled === false ||
+        document.msFullscreenEnabled === false) {
+      support = false;
+    }
+
+    Object.defineProperty(this, 'supportsFullscreen', { value: support,
+                                                        enumerable: true,
+                                                        configurable: true,
+                                                        writable: false });
+    return support;
+  },
+
+  get supportsIntegratedFind() {
+    var support = false;
+    Object.defineProperty(this, 'supportsIntegratedFind', { value: support,
+                                                            enumerable: true,
+                                                            configurable: true,
+                                                            writable: false });
+    return support;
+  },
+
+  get supportsDocumentFonts() {
+    var support = true;
+    Object.defineProperty(this, 'supportsDocumentFonts', { value: support,
+                                                           enumerable: true,
+                                                           configurable: true,
+                                                           writable: false });
+    return support;
+  },
+
+  get supportsDocumentColors() {
+    var support = true;
+    Object.defineProperty(this, 'supportsDocumentColors', { value: support,
+                                                            enumerable: true,
+                                                            configurable: true,
+                                                            writable: false });
+    return support;
+  },
+
+  get loadingBar() {
+    var bar = new ProgressBar('#loadingBar', {});
+    Object.defineProperty(this, 'loadingBar', { value: bar,
+                                                enumerable: true,
+                                                configurable: true,
+                                                writable: false });
+    return bar;
+  },
+
+  get isHorizontalScrollbarEnabled() {
+    return (PresentationMode.active ? false :
+            (this.container.scrollWidth > this.container.clientWidth));
+  },
+
+
+  setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
+    this.url = url;
+    try {
+      this.setTitle(decodeURIComponent(getFileName(url)) || url);
+    } catch (e) {
+      // decodeURIComponent may throw URIError,
+      // fall back to using the unprocessed url in that case
+      this.setTitle(url);
+    }
+  },
+
+  setTitle: function pdfViewSetTitle(title) {
+    document.title = title;
+  },
+
+  close: function pdfViewClose() {
+    var errorWrapper = document.getElementById('errorWrapper');
+    errorWrapper.setAttribute('hidden', 'true');
+
+    if (!this.pdfDocument) {
+      return;
+    }
+
+    this.pdfDocument.destroy();
+    this.pdfDocument = null;
+
+    var thumbsView = document.getElementById('thumbnailView');
+    while (thumbsView.hasChildNodes()) {
+      thumbsView.removeChild(thumbsView.lastChild);
+    }
+
+    if ('_loadingInterval' in thumbsView) {
+      clearInterval(thumbsView._loadingInterval);
+    }
+
+    var container = document.getElementById('viewer');
+    while (container.hasChildNodes()) {
+      container.removeChild(container.lastChild);
+    }
+
+    if (typeof PDFBug !== 'undefined') {
+      PDFBug.cleanup();
+    }
+  },
+
+  // TODO(mack): This function signature should really be pdfViewOpen(url, args)
+  open: function pdfViewOpen(url, scale, password,
+                             pdfDataRangeTransport, args) {
+    if (this.pdfDocument) {
+      // Reload the preferences if a document was previously opened.
+      Preferences.reload();
+    }
+    this.close();
+
+    var parameters = {password: password};
+    if (typeof url === 'string') { // URL
+      this.setTitleUsingUrl(url);
+      parameters.url = url;
+    } else if (url && 'byteLength' in url) { // ArrayBuffer
+      parameters.data = url;
+    }
+    if (args) {
+      for (var prop in args) {
+        parameters[prop] = args[prop];
+      }
+    }
+
+    var self = this;
+    self.loading = true;
+    self.downloadComplete = false;
+
+    var passwordNeeded = function passwordNeeded(updatePassword, reason) {
+      PasswordPrompt.updatePassword = updatePassword;
+      PasswordPrompt.reason = reason;
+      PasswordPrompt.show();
+    };
+
+    function getDocumentProgress(progressData) {
+      self.progress(progressData.loaded / progressData.total);
+    }
+
+    PDFJS.getDocument(parameters, pdfDataRangeTransport, passwordNeeded,
+                      getDocumentProgress).then(
+      function getDocumentCallback(pdfDocument) {
+        self.load(pdfDocument, scale);
+        self.loading = false;
+      },
+      function getDocumentError(message, exception) {
+        var loadingErrorMessage = mozL10n.get('loading_error', null,
+          'An error occurred while loading the PDF.');
+
+        if (exception && exception.name === 'InvalidPDFException') {
+          // change error message also for other builds
+          loadingErrorMessage = mozL10n.get('invalid_file_error', null,
+                                        'Invalid or corrupted PDF file.');
+        }
+
+        if (exception && exception.name === 'MissingPDFException') {
+          // special message for missing PDF's
+          loadingErrorMessage = mozL10n.get('missing_file_error', null,
+                                        'Missing PDF file.');
+
+        }
+
+        var moreInfo = {
+          message: message
+        };
+        self.error(loadingErrorMessage, moreInfo);
+        self.loading = false;
+      }
+    );
+  },
+
+  download: function pdfViewDownload() {
+    function downloadByUrl() {
+      downloadManager.downloadUrl(url, filename);
+    }
+
+    var url = this.url.split('#')[0];
+    var filename = getPDFFileNameFromURL(url);
+    var downloadManager = new DownloadManager();
+    downloadManager.onerror = function (err) {
+      // This error won't really be helpful because it's likely the
+      // fallback won't work either (or is already open).
+      PDFView.error('PDF failed to download.');
+    };
+
+    if (!this.pdfDocument) { // the PDF is not ready yet
+      downloadByUrl();
+      return;
+    }
+
+    if (!this.downloadComplete) { // the PDF is still downloading
+      downloadByUrl();
+      return;
+    }
+
+    this.pdfDocument.getData().then(
+      function getDataSuccess(data) {
+        var blob = PDFJS.createBlob(data, 'application/pdf');
+        downloadManager.download(blob, url, filename);
+      },
+      downloadByUrl // Error occurred try downloading with just the url.
+    ).then(null, downloadByUrl);
+  },
+
+  fallback: function pdfViewFallback(featureId) {
+    return;
+  },
+
+  navigateTo: function pdfViewNavigateTo(dest) {
+    var destString = '';
+    var self = this;
+
+    var goToDestination = function(destRef) {
+      self.pendingRefStr = null;
+      // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>
+      var pageNumber = destRef instanceof Object ?
+        self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
+        (destRef + 1);
+      if (pageNumber) {
+        if (pageNumber > self.pages.length) {
+          pageNumber = self.pages.length;
+        }
+        var currentPage = self.pages[pageNumber - 1];
+        currentPage.scrollIntoView(dest);
+
+        // Update the browsing history.
+        PDFHistory.push({ dest: dest, hash: destString, page: pageNumber });
+      } else {
+        self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {
+          var pageNum = pageIndex + 1;
+          self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] = pageNum;
+          goToDestination(destRef);
+        });
+      }
+    };
+
+    this.destinationsPromise.then(function() {
+      if (typeof dest === 'string') {
+        destString = dest;
+        dest = self.destinations[dest];
+      }
+      if (!(dest instanceof Array)) {
+        return; // invalid destination
+      }
+      goToDestination(dest[0]);
+    });
+  },
+
+  getDestinationHash: function pdfViewGetDestinationHash(dest) {
+    if (typeof dest === 'string') {
+      return PDFView.getAnchorUrl('#' + escape(dest));
+    }
+    if (dest instanceof Array) {
+      var destRef = dest[0]; // see navigateTo method for dest format
+      var pageNumber = destRef instanceof Object ?
+        this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
+        (destRef + 1);
+      if (pageNumber) {
+        var pdfOpenParams = PDFView.getAnchorUrl('#page=' + pageNumber);
+        var destKind = dest[1];
+        if (typeof destKind === 'object' && 'name' in destKind &&
+            destKind.name == 'XYZ') {
+          var scale = (dest[4] || this.currentScaleValue);
+          var scaleNumber = parseFloat(scale);
+          if (scaleNumber) {
+            scale = scaleNumber * 100;
+          }
+          pdfOpenParams += '&zoom=' + scale;
+          if (dest[2] || dest[3]) {
+            pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);
+          }
+        }
+        return pdfOpenParams;
+      }
+    }
+    return '';
+  },
+
+  /**
+   * Prefix the full url on anchor links to make sure that links are resolved
+   * relative to the current URL instead of the one defined in <base href>.
+   * @param {String} anchor The anchor hash, including the #.
+   */
+  getAnchorUrl: function getAnchorUrl(anchor) {
+    return anchor;
+  },
+
+  /**
+   * Show the error box.
+   * @param {String} message A message that is human readable.
+   * @param {Object} moreInfo (optional) Further information about the error
+   *                            that is more technical.  Should have a 'message'
+   *                            and optionally a 'stack' property.
+   */
+  error: function pdfViewError(message, moreInfo) {
+    var moreInfoText = mozL10n.get('error_version_info',
+      {version: PDFJS.version || '?', build: PDFJS.build || '?'},
+      'PDF.js v{{version}} (build: {{build}})') + '\n';
+    if (moreInfo) {
+      moreInfoText +=
+        mozL10n.get('error_message', {message: moreInfo.information},
+        'Message: {{message}}');
+      if (moreInfo.stack) {
+        moreInfoText += '\n' +
+          mozL10n.get('error_stack', {stack: moreInfo.stack},
+          'Stack: {{stack}}');
+      } else {
+        if (moreInfo.filename) {
+          moreInfoText += '\n' +
+            mozL10n.get('error_file', {file: moreInfo.filename},
+            'File: {{file}}');
+        }
+        if (moreInfo.lineNumber) {
+          moreInfoText += '\n' +
+            mozL10n.get('error_line', {line: moreInfo.lineNumber},
+            'Line: {{line}}');
+        }
+      }
+    }
+
+    var errorWrapper = document.getElementById('errorWrapper');
+    errorWrapper.removeAttribute('hidden');
+
+    var errorMessage = document.getElementById('errorMessage');
+    errorMessage.textContent = message;
+
+    var closeButton = document.getElementById('errorClose');
+    closeButton.onclick = function() {
+      errorWrapper.setAttribute('hidden', 'true');
+    };
+
+    var errorMoreInfo = document.getElementById('errorMoreInfo');
+    var moreInfoButton = document.getElementById('errorShowMore');
+    var lessInfoButton = document.getElementById('errorShowLess');
+    moreInfoButton.onclick = function() {
+      errorMoreInfo.removeAttribute('hidden');
+      moreInfoButton.setAttribute('hidden', 'true');
+      lessInfoButton.removeAttribute('hidden');
+      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
+    };
+    lessInfoButton.onclick = function() {
+      errorMoreInfo.setAttribute('hidden', 'true');
+      moreInfoButton.removeAttribute('hidden');
+      lessInfoButton.setAttribute('hidden', 'true');
+    };
+    moreInfoButton.oncontextmenu = noContextMenuHandler;
+    lessInfoButton.oncontextmenu = noContextMenuHandler;
+    closeButton.oncontextmenu = noContextMenuHandler;
+    moreInfoButton.removeAttribute('hidden');
+    lessInfoButton.setAttribute('hidden', 'true');
+    errorMoreInfo.value = moreInfoText;
+  },
+
+  progress: function pdfViewProgress(level) {
+    var percent = Math.round(level * 100);
+    // When we transition from full request to range requests, it's possible
+    // that we discard some of the loaded data. This can cause the loading
+    // bar to move backwards. So prevent this by only updating the bar if it
+    // increases.
+    if (percent > PDFView.loadingBar.percent) {
+      PDFView.loadingBar.percent = percent;
+    }
+  },
+
+  load: function pdfViewLoad(pdfDocument, scale) {
+    var self = this;
+    var isOnePageRenderedResolved = false;
+    var resolveOnePageRendered = null;
+    var onePageRendered = new Promise(function (resolve) {
+      resolveOnePageRendered = resolve;
+    });
+    function bindOnAfterDraw(pageView, thumbnailView) {
+      // when page is painted, using the image as thumbnail base
+      pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() {
+        if (!isOnePageRenderedResolved) {
+          isOnePageRenderedResolved = true;
+          resolveOnePageRendered();
+        }
+        thumbnailView.setImage(pageView.canvas);
+      };
+    }
+
+    PDFFindController.reset();
+
+    this.pdfDocument = pdfDocument;
+
+    DocumentProperties.resolveDataAvailable();
+
+    var downloadedPromise = pdfDocument.getDownloadInfo().then(function() {
+      self.downloadComplete = true;
+      PDFView.loadingBar.hide();
+      var outerContainer = document.getElementById('outerContainer');
+      outerContainer.classList.remove('loadingInProgress');
+    });
+
+    var pagesCount = pdfDocument.numPages;
+
+    var id = pdfDocument.fingerprint;
+    document.getElementById('numPages').textContent =
+      mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}');
+    document.getElementById('pageNumber').max = pagesCount;
+
+    PDFView.documentFingerprint = id;
+    var store = PDFView.store = new ViewHistory(id);
+
+    this.pageRotation = 0;
+
+    var pages = this.pages = [];
+    var pagesRefMap = this.pagesRefMap = {};
+    var thumbnails = this.thumbnails = [];
+
+    var resolvePagesPromise;
+    var pagesPromise = new Promise(function (resolve) {
+      resolvePagesPromise = resolve;
+    });
+    this.pagesPromise = pagesPromise;
+
+    var firstPagePromise = pdfDocument.getPage(1);
+    var container = document.getElementById('viewer');
+    var thumbsView = document.getElementById('thumbnailView');
+
+    // Fetch a single page so we can get a viewport that will be the default
+    // viewport for all pages
+    firstPagePromise.then(function(pdfPage) {
+      var viewport = pdfPage.getViewport((scale || 1.0) * CSS_UNITS);
+      for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+        var viewportClone = viewport.clone();
+        var pageView = new PageView(container, pageNum, scale,
+                                    self.navigateTo.bind(self),
+                                    viewportClone);
+        var thumbnailView = new ThumbnailView(thumbsView, pageNum,
+                                              viewportClone);
+        bindOnAfterDraw(pageView, thumbnailView);
+        pages.push(pageView);
+        thumbnails.push(thumbnailView);
+      }
+
+      // Fetch all the pages since the viewport is needed before printing
+      // starts to create the correct size canvas. Wait until one page is
+      // rendered so we don't tie up too many resources early on.
+      onePageRendered.then(function () {
+        if (!PDFJS.disableAutoFetch) {
+          var getPagesLeft = pagesCount;
+          for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+            pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) {
+              var pageView = pages[pageNum - 1];
+              if (!pageView.pdfPage) {
+                pageView.setPdfPage(pdfPage);
+              }
+              var refStr = pdfPage.ref.num + ' ' + pdfPage.ref.gen + ' R';
+              pagesRefMap[refStr] = pageNum;
+              getPagesLeft--;
+              if (!getPagesLeft) {
+                resolvePagesPromise();
+              }
+            }.bind(null, pageNum));
+          }
+        } else {
+          // XXX: Printing is semi-broken with auto fetch disabled.
+          resolvePagesPromise();
+        }
+      });
+
+      downloadedPromise.then(function () {
+        var event = document.createEvent('CustomEvent');
+        event.initCustomEvent('documentload', true, true, {});
+        window.dispatchEvent(event);
+      });
+
+      PDFView.loadingBar.setWidth(container);
+
+      PDFFindController.resolveFirstPage();
+
+      // Initialize the browsing history.
+      PDFHistory.initialize(self.documentFingerprint);
+    });
+
+    // Fetch the necessary preference values.
+    var showPreviousViewOnLoad;
+    var showPreviousViewOnLoadPromise =
+      Preferences.get('showPreviousViewOnLoad').then(function (prefValue) {
+        showPreviousViewOnLoad = prefValue;
+      });
+    var defaultZoomValue;
+    var defaultZoomValuePromise =
+      Preferences.get('defaultZoomValue').then(function (prefValue) {
+        defaultZoomValue = prefValue;
+      });
+
+    var storePromise = store.initializedPromise;
+    Promise.all([firstPagePromise, storePromise, showPreviousViewOnLoadPromise,
+                 defaultZoomValuePromise]).then(function resolved() {
+      var storedHash = null;
+      if (showPreviousViewOnLoad && store.get('exists', false)) {
+        var pageNum = store.get('page', '1');
+        var zoom = defaultZoomValue || store.get('zoom', PDFView.currentScale);
+        var left = store.get('scrollLeft', '0');
+        var top = store.get('scrollTop', '0');
+
+        storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +
+                     left + ',' + top;
+      } else if (defaultZoomValue) {
+        storedHash = 'page=1&zoom=' + defaultZoomValue;
+      }
+      self.setInitialView(storedHash, scale);
+
+      // Make all navigation keys work on document load,
+      // unless the viewer is embedded in a web page.
+      if (!self.isViewerEmbedded) {
+        self.container.focus();
+      }
+    }, function rejected(errorMsg) {
+      console.error(errorMsg);
+
+      firstPagePromise.then(function () {
+        self.setInitialView(null, scale);
+      });
+    });
+
+    pagesPromise.then(function() {
+      if (PDFView.supportsPrinting) {
+        pdfDocument.getJavaScript().then(function(javaScript) {
+          if (javaScript.length) {
+            console.warn('Warning: JavaScript is not supported');
+            PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript);
+          }
+          // Hack to support auto printing.
+          var regex = /\bprint\s*\(/g;
+          for (var i = 0, ii = javaScript.length; i < ii; i++) {
+            var js = javaScript[i];
+            if (js && regex.test(js)) {
+              setTimeout(function() {
+                window.print();
+              });
+              return;
+            }
+          }
+        });
+      }
+    });
+
+    var destinationsPromise =
+      this.destinationsPromise = pdfDocument.getDestinations();
+    destinationsPromise.then(function(destinations) {
+      self.destinations = destinations;
+    });
+
+    // outline depends on destinations and pagesRefMap
+    var promises = [pagesPromise, destinationsPromise,
+                    PDFView.animationStartedPromise];
+    Promise.all(promises).then(function() {
+      pdfDocument.getOutline().then(function(outline) {
+        self.outline = new DocumentOutlineView(outline);
+        document.getElementById('viewOutline').disabled = !outline;
+
+        if (outline) {
+          Preferences.get('ifAvailableShowOutlineOnLoad').then(
+            function (prefValue) {
+              if (prefValue) {
+                if (!self.sidebarOpen) {
+                  document.getElementById('sidebarToggle').click();
+                }
+                self.switchSidebarView('outline');
+              }
+            });
+        }
+      });
+      pdfDocument.getAttachments().then(function(attachments) {
+        self.attachments = new DocumentAttachmentsView(attachments);
+        document.getElementById('viewAttachments').disabled = !attachments;
+      });
+    });
+
+    pdfDocument.getMetadata().then(function(data) {
+      var info = data.info, metadata = data.metadata;
+      self.documentInfo = info;
+      self.metadata = metadata;
+
+      // Provides some basic debug information
+      console.log('PDF ' + pdfDocument.fingerprint + ' [' +
+                  info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +
+                  ' / ' + (info.Creator || '-').trim() + ']' +
+                  ' (PDF.js: ' + (PDFJS.version || '-') +
+                  (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');
+
+      var pdfTitle;
+      if (metadata && metadata.has('dc:title')) {
+        pdfTitle = metadata.get('dc:title');
+      }
+
+      if (!pdfTitle && info && info['Title']) {
+        pdfTitle = info['Title'];
+      }
+
+      if (pdfTitle) {
+        self.setTitle(pdfTitle + ' - ' + document.title);
+      }
+
+      if (info.IsAcroFormPresent) {
+        console.warn('Warning: AcroForm/XFA is not supported');
+        PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.forms);
+      }
+
+    });
+  },
+
+  setInitialView: function pdfViewSetInitialView(storedHash, scale) {
+    // Reset the current scale, as otherwise the page's scale might not get
+    // updated if the zoom level stayed the same.
+    this.currentScale = 0;
+    this.currentScaleValue = null;
+    // When opening a new file (when one is already loaded in the viewer):
+    // Reset 'currentPageNumber', since otherwise the page's scale will be wrong
+    // if 'currentPageNumber' is larger than the number of pages in the file.
+    document.getElementById('pageNumber').value = currentPageNumber = 1;
+    // Reset the current position when loading a new file,
+    // to prevent displaying the wrong position in the document.
+    this.currentPosition = null;
+
+    if (PDFHistory.initialDestination) {
+      this.navigateTo(PDFHistory.initialDestination);
+      PDFHistory.initialDestination = null;
+    } else if (this.initialBookmark) {
+      this.setHash(this.initialBookmark);
+      PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark);
+      this.initialBookmark = null;
+    } else if (storedHash) {
+      this.setHash(storedHash);
+    } else if (scale) {
+      this.setScale(scale, true);
+      this.page = 1;
+    }
+
+    if (PDFView.currentScale === UNKNOWN_SCALE) {
+      // Scale was not initialized: invalid bookmark or scale was not specified.
+      // Setting the default one.
+      this.setScale(DEFAULT_SCALE, true);
+    }
+  },
+
+  renderHighestPriority: function pdfViewRenderHighestPriority() {
+    if (PDFView.idleTimeout) {
+      clearTimeout(PDFView.idleTimeout);
+      PDFView.idleTimeout = null;
+    }
+
+    // Pages have a higher priority than thumbnails, so check them first.
+    var visiblePages = this.getVisiblePages();
+    var pageView = this.getHighestPriority(visiblePages, this.pages,
+                                           this.pageViewScroll.down);
+    if (pageView) {
+      this.renderView(pageView, 'page');
+      return;
+    }
+    // No pages needed rendering so check thumbnails.
+    if (this.sidebarOpen) {
+      var visibleThumbs = this.getVisibleThumbs();
+      var thumbView = this.getHighestPriority(visibleThumbs,
+                                              this.thumbnails,
+                                              this.thumbnailViewScroll.down);
+      if (thumbView) {
+        this.renderView(thumbView, 'thumbnail');
+        return;
+      }
+    }
+
+    PDFView.idleTimeout = setTimeout(function () {
+      PDFView.cleanup();
+    }, CLEANUP_TIMEOUT);
+  },
+
+  cleanup: function pdfViewCleanup() {
+    for (var i = 0, ii = this.pages.length; i < ii; i++) {
+      if (this.pages[i] &&
+          this.pages[i].renderingState !== RenderingStates.FINISHED) {
+        this.pages[i].reset();
+      }
+    }
+    this.pdfDocument.cleanup();
+  },
+
+  getHighestPriority: function pdfViewGetHighestPriority(visible, views,
+                                                         scrolledDown) {
+    // The state has changed figure out which page has the highest priority to
+    // render next (if any).
+    // Priority:
+    // 1 visible pages
+    // 2 if last scrolled down page after the visible pages
+    // 2 if last scrolled up page before the visible pages
+    var visibleViews = visible.views;
+
+    var numVisible = visibleViews.length;
+    if (numVisible === 0) {
+      return false;
+    }
+    for (var i = 0; i < numVisible; ++i) {
+      var view = visibleViews[i].view;
+      if (!this.isViewFinished(view)) {
+        return view;
+      }
+    }
+
+    // All the visible views have rendered, try to render next/previous pages.
+    if (scrolledDown) {
+      var nextPageIndex = visible.last.id;
+      // ID's start at 1 so no need to add 1.
+      if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {
+        return views[nextPageIndex];
+      }
+    } else {
+      var previousPageIndex = visible.first.id - 2;
+      if (views[previousPageIndex] &&
+          !this.isViewFinished(views[previousPageIndex])) {
+        return views[previousPageIndex];
+      }
+    }
+    // Everything that needs to be rendered has been.
+    return false;
+  },
+
+  isViewFinished: function pdfViewIsViewFinished(view) {
+    return view.renderingState === RenderingStates.FINISHED;
+  },
+
+  // Render a page or thumbnail view. This calls the appropriate function based
+  // on the views state. If the view is already rendered it will return false.
+  renderView: function pdfViewRender(view, type) {
+    var state = view.renderingState;
+    switch (state) {
+      case RenderingStates.FINISHED:
+        return false;
+      case RenderingStates.PAUSED:
+        PDFView.highestPriorityPage = type + view.id;
+        view.resume();
+        break;
+      case RenderingStates.RUNNING:
+        PDFView.highestPriorityPage = type + view.id;
+        break;
+      case RenderingStates.INITIAL:
+        PDFView.highestPriorityPage = type + view.id;
+        view.draw(this.renderHighestPriority.bind(this));
+        break;
+    }
+    return true;
+  },
+
+  setHash: function pdfViewSetHash(hash) {
+    if (!hash) {
+      return;
+    }
+
+    if (hash.indexOf('=') >= 0) {
+      var params = PDFView.parseQueryString(hash);
+      // borrowing syntax from "Parameters for Opening PDF Files"
+      if ('nameddest' in params) {
+        PDFHistory.updateNextHashParam(params.nameddest);
+        PDFView.navigateTo(params.nameddest);
+        return;
+      }
+      var pageNumber, dest;
+      if ('page' in params) {
+        pageNumber = (params.page | 0) || 1;
+      }
+      if ('zoom' in params) {
+        var zoomArgs = params.zoom.split(','); // scale,left,top
+        // building destination array
+
+        // If the zoom value, it has to get divided by 100. If it is a string,
+        // it should stay as it is.
+        var zoomArg = zoomArgs[0];
+        var zoomArgNumber = parseFloat(zoomArg);
+        if (zoomArgNumber) {
+          zoomArg = zoomArgNumber / 100;
+        }
+        dest = [null, {name: 'XYZ'},
+                zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null,
+                zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null,
+                zoomArg];
+      }
+      if (dest) {
+        var currentPage = this.pages[(pageNumber || this.page) - 1];
+        currentPage.scrollIntoView(dest);
+      } else if (pageNumber) {
+        this.page = pageNumber; // simple page
+      }
+      if ('pagemode' in params) {
+        var toggle = document.getElementById('sidebarToggle');
+        if (params.pagemode === 'thumbs' || params.pagemode === 'bookmarks' ||
+            params.pagemode === 'attachments') {
+          if (!this.sidebarOpen) {
+            toggle.click();
+          }
+          this.switchSidebarView(params.pagemode === 'bookmarks' ?
+                                   'outline' :
+                                   params.pagemode);
+        } else if (params.pagemode === 'none' && this.sidebarOpen) {
+          toggle.click();
+        }
+      }
+    } else if (/^\d+$/.test(hash)) { // page number
+      this.page = hash;
+    } else { // named destination
+      PDFHistory.updateNextHashParam(unescape(hash));
+      PDFView.navigateTo(unescape(hash));
+    }
+  },
+
+  switchSidebarView: function pdfViewSwitchSidebarView(view) {
+    var thumbsView = document.getElementById('thumbnailView');
+    var outlineView = document.getElementById('outlineView');
+    var attachmentsView = document.getElementById('attachmentsView');
+
+    var thumbsButton = document.getElementById('viewThumbnail');
+    var outlineButton = document.getElementById('viewOutline');
+    var attachmentsButton = document.getElementById('viewAttachments');
+
+    switch (view) {
+      case 'thumbs':
+        var wasAnotherViewVisible = thumbsView.classList.contains('hidden');
+
+        thumbsButton.classList.add('toggled');
+        outlineButton.classList.remove('toggled');
+        attachmentsButton.classList.remove('toggled');
+        thumbsView.classList.remove('hidden');
+        outlineView.classList.add('hidden');
+        attachmentsView.classList.add('hidden');
+
+        PDFView.renderHighestPriority();
+
+        if (wasAnotherViewVisible) {
+          // Ensure that the thumbnail of the current page is visible
+          // when switching from another view.
+          scrollIntoView(document.getElementById('thumbnailContainer' +
+                                                 this.page));
+        }
+        break;
+
+      case 'outline':
+        thumbsButton.classList.remove('toggled');
+        outlineButton.classList.add('toggled');
+        attachmentsButton.classList.remove('toggled');
+        thumbsView.classList.add('hidden');
+        outlineView.classList.remove('hidden');
+        attachmentsView.classList.add('hidden');
+
+        if (outlineButton.getAttribute('disabled')) {
+          return;
+        }
+        break;
+
+      case 'attachments':
+        thumbsButton.classList.remove('toggled');
+        outlineButton.classList.remove('toggled');
+        attachmentsButton.classList.add('toggled');
+        thumbsView.classList.add('hidden');
+        outlineView.classList.add('hidden');
+        attachmentsView.classList.remove('hidden');
+
+        if (attachmentsButton.getAttribute('disabled')) {
+          return;
+        }
+        break;
+    }
+  },
+
+  getVisiblePages: function pdfViewGetVisiblePages() {
+    if (!PresentationMode.active) {
+      return this.getVisibleElements(this.container, this.pages, true);
+    } else {
+      // The algorithm in getVisibleElements doesn't work in all browsers and
+      // configurations when presentation mode is active.
+      var visible = [];
+      var currentPage = this.pages[this.page - 1];
+      visible.push({ id: currentPage.id, view: currentPage });
+      return { first: currentPage, last: currentPage, views: visible };
+    }
+  },
+
+  getVisibleThumbs: function pdfViewGetVisibleThumbs() {
+    return this.getVisibleElements(this.thumbnailContainer, this.thumbnails);
+  },
+
+  // Generic helper to find out what elements are visible within a scroll pane.
+  getVisibleElements: function pdfViewGetVisibleElements(
+      scrollEl, views, sortByVisibility) {
+    var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight;
+    var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth;
+
+    var visible = [], view;
+    var currentHeight, viewHeight, hiddenHeight, percentHeight;
+    var currentWidth, viewWidth;
+    for (var i = 0, ii = views.length; i < ii; ++i) {
+      view = views[i];
+      currentHeight = view.el.offsetTop + view.el.clientTop;
+      viewHeight = view.el.clientHeight;
+      if ((currentHeight + viewHeight) < top) {
+        continue;
+      }
+      if (currentHeight > bottom) {
+        break;
+      }
+      currentWidth = view.el.offsetLeft + view.el.clientLeft;
+      viewWidth = view.el.clientWidth;
+      if ((currentWidth + viewWidth) < left || currentWidth > right) {
+        continue;
+      }
+      hiddenHeight = Math.max(0, top - currentHeight) +
+                     Math.max(0, currentHeight + viewHeight - bottom);
+      percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0;
+
+      visible.push({ id: view.id, x: currentWidth, y: currentHeight,
+                     view: view, percent: percentHeight });
+    }
+
+    var first = visible[0];
+    var last = visible[visible.length - 1];
+
+    if (sortByVisibility) {
+      visible.sort(function(a, b) {
+        var pc = a.percent - b.percent;
+        if (Math.abs(pc) > 0.001) {
+          return -pc;
+        }
+        return a.id - b.id; // ensure stability
+      });
+    }
+    return {first: first, last: last, views: visible};
+  },
+
+  // Helper function to parse query string (e.g. ?param1=value&parm2=...).
+  parseQueryString: function pdfViewParseQueryString(query) {
+    var parts = query.split('&');
+    var params = {};
+    for (var i = 0, ii = parts.length; i < ii; ++i) {
+      var param = parts[i].split('=');
+      var key = param[0];
+      var value = param.length > 1 ? param[1] : null;
+      params[decodeURIComponent(key)] = decodeURIComponent(value);
+    }
+    return params;
+  },
+
+  beforePrint: function pdfViewSetupBeforePrint() {
+    if (!this.supportsPrinting) {
+      var printMessage = mozL10n.get('printing_not_supported', null,
+          'Warning: Printing is not fully supported by this browser.');
+      this.error(printMessage);
+      return;
+    }
+
+    var alertNotReady = false;
+    var i, ii;
+    if (!this.pages.length) {
+      alertNotReady = true;
+    } else {
+      for (i = 0, ii = this.pages.length; i < ii; ++i) {
+        if (!this.pages[i].pdfPage) {
+          alertNotReady = true;
+          break;
+        }
+      }
+    }
+    if (alertNotReady) {
+      var notReadyMessage = mozL10n.get('printing_not_ready', null,
+          'Warning: The PDF is not fully loaded for printing.');
+      window.alert(notReadyMessage);
+      return;
+    }
+
+    var body = document.querySelector('body');
+    body.setAttribute('data-mozPrintCallback', true);
+    for (i = 0, ii = this.pages.length; i < ii; ++i) {
+      this.pages[i].beforePrint();
+    }
+  },
+
+  afterPrint: function pdfViewSetupAfterPrint() {
+    var div = document.getElementById('printContainer');
+    while (div.hasChildNodes()) {
+      div.removeChild(div.lastChild);
+    }
+  },
+
+  rotatePages: function pdfViewRotatePages(delta) {
+    var currentPage = this.pages[this.page - 1];
+    var i, l;
+    this.pageRotation = (this.pageRotation + 360 + delta) % 360;
+
+    for (i = 0, l = this.pages.length; i < l; i++) {
+      var page = this.pages[i];
+      page.update(page.scale, this.pageRotation);
+    }
+
+    for (i = 0, l = this.thumbnails.length; i < l; i++) {
+      var thumb = this.thumbnails[i];
+      thumb.update(this.pageRotation);
+    }
+
+    this.setScale(this.currentScaleValue, true, true);
+
+    this.renderHighestPriority();
+
+    if (currentPage) {
+      currentPage.scrollIntoView();
+    }
+  },
+
+  /**
+   * This function flips the page in presentation mode if the user scrolls up
+   * or down with large enough motion and prevents page flipping too often.
+   *
+   * @this {PDFView}
+   * @param {number} mouseScrollDelta The delta value from the mouse event.
+   */
+  mouseScroll: function pdfViewMouseScroll(mouseScrollDelta) {
+    var MOUSE_SCROLL_COOLDOWN_TIME = 50;
+
+    var currentTime = (new Date()).getTime();
+    var storedTime = this.mouseScrollTimeStamp;
+
+    // In case one page has already been flipped there is a cooldown time
+    // which has to expire before next page can be scrolled on to.
+    if (currentTime > storedTime &&
+        currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
+      return;
+    }
+
+    // In case the user decides to scroll to the opposite direction than before
+    // clear the accumulated delta.
+    if ((this.mouseScrollDelta > 0 && mouseScrollDelta < 0) ||
+        (this.mouseScrollDelta < 0 && mouseScrollDelta > 0)) {
+      this.clearMouseScrollState();
+    }
+
+    this.mouseScrollDelta += mouseScrollDelta;
+
+    var PAGE_FLIP_THRESHOLD = 120;
+    if (Math.abs(this.mouseScrollDelta) >= PAGE_FLIP_THRESHOLD) {
+
+      var PageFlipDirection = {
+        UP: -1,
+        DOWN: 1
+      };
+
+      // In presentation mode scroll one page at a time.
+      var pageFlipDirection = (this.mouseScrollDelta > 0) ?
+                                PageFlipDirection.UP :
+                                PageFlipDirection.DOWN;
+      this.clearMouseScrollState();
+      var currentPage = this.page;
+
+      // In case we are already on the first or the last page there is no need
+      // to do anything.
+      if ((currentPage == 1 && pageFlipDirection == PageFlipDirection.UP) ||
+          (currentPage == this.pages.length &&
+           pageFlipDirection == PageFlipDirection.DOWN)) {
+        return;
+      }
+
+      this.page += pageFlipDirection;
+      this.mouseScrollTimeStamp = currentTime;
+    }
+  },
+
+  /**
+   * This function clears the member attributes used with mouse scrolling in
+   * presentation mode.
+   *
+   * @this {PDFView}
+   */
+  clearMouseScrollState: function pdfViewClearMouseScrollState() {
+    this.mouseScrollTimeStamp = 0;
+    this.mouseScrollDelta = 0;
+  }
+};
+
+
+var PageView = function pageView(container, id, scale,
+                                 navigateTo, defaultViewport) {
+  this.id = id;
+
+  this.rotation = 0;
+  this.scale = scale || 1.0;
+  this.viewport = defaultViewport;
+  this.pdfPageRotate = defaultViewport.rotation;
+
+  this.renderingState = RenderingStates.INITIAL;
+  this.resume = null;
+
+  this.textLayer = null;
+
+  this.zoomLayer = null;
+
+  this.annotationLayer = null;
+
+  var anchor = document.createElement('a');
+  anchor.name = '' + this.id;
+
+  var div = this.el = document.createElement('div');
+  div.id = 'pageContainer' + this.id;
+  div.className = 'page';
+  div.style.width = Math.floor(this.viewport.width) + 'px';
+  div.style.height = Math.floor(this.viewport.height) + 'px';
+
+  container.appendChild(anchor);
+  container.appendChild(div);
+
+  this.setPdfPage = function pageViewSetPdfPage(pdfPage) {
+    this.pdfPage = pdfPage;
+    this.pdfPageRotate = pdfPage.rotate;
+    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, totalRotation);
+    this.stats = pdfPage.stats;
+    this.reset();
+  };
+
+  this.destroy = function pageViewDestroy() {
+    this.zoomLayer = null;
+    this.reset();
+    if (this.pdfPage) {
+      this.pdfPage.destroy();
+    }
+  };
+
+  this.reset = function pageViewReset(keepAnnotations) {
+    if (this.renderTask) {
+      this.renderTask.cancel();
+    }
+    this.resume = null;
+    this.renderingState = RenderingStates.INITIAL;
+
+    div.style.width = Math.floor(this.viewport.width) + 'px';
+    div.style.height = Math.floor(this.viewport.height) + 'px';
+
+    var childNodes = div.childNodes;
+    for (var i = div.childNodes.length - 1; i >= 0; i--) {
+      var node = childNodes[i];
+      if ((this.zoomLayer && this.zoomLayer === node) ||
+          (keepAnnotations && this.annotationLayer === node)) {
+        continue;
+      }
+      div.removeChild(node);
+    }
+    div.removeAttribute('data-loaded');
+
+    if (keepAnnotations) {
+      if (this.annotationLayer) {
+        // Hide annotationLayer until all elements are resized
+        // so they are not displayed on the already-resized page
+        this.annotationLayer.setAttribute('hidden', 'true');
+      }
+    } else {
+      this.annotationLayer = null;
+    }
+
+    delete this.canvas;
+
+    this.loadingIconDiv = document.createElement('div');
+    this.loadingIconDiv.className = 'loadingIcon';
+    div.appendChild(this.loadingIconDiv);
+  };
+
+  this.update = function pageViewUpdate(scale, rotation) {
+    this.scale = scale || this.scale;
+
+    if (typeof rotation !== 'undefined') {
+      this.rotation = rotation;
+    }
+
+    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = this.viewport.clone({
+      scale: this.scale * CSS_UNITS,
+      rotation: totalRotation
+    });
+
+    if (USE_ONLY_CSS_ZOOM && this.canvas) {
+      this.cssTransform(this.canvas);
+      return;
+    } else if (this.canvas && !this.zoomLayer) {
+      this.zoomLayer = this.canvas.parentNode;
+      this.zoomLayer.style.position = 'absolute';
+    }
+    if (this.zoomLayer) {
+      this.cssTransform(this.zoomLayer.firstChild);
+    }
+    this.reset(true);
+  };
+
+  this.cssTransform = function pageCssTransform(canvas) {
+    // Scale canvas, canvas wrapper, and page container.
+    var width = this.viewport.width;
+    var height = this.viewport.height;
+    canvas.style.width = canvas.parentNode.style.width = div.style.width =
+        Math.floor(width) + 'px';
+    canvas.style.height = canvas.parentNode.style.height = div.style.height =
+        Math.floor(height) + 'px';
+    // The canvas may have been originally rotated, so rotate relative to that.
+    var relativeRotation = this.viewport.rotation - canvas._viewport.rotation;
+    var absRotation = Math.abs(relativeRotation);
+    var scaleX = 1, scaleY = 1;
+    if (absRotation === 90 || absRotation === 270) {
+      // Scale x and y because of the rotation.
+      scaleX = height / width;
+      scaleY = width / height;
+    }
+    var cssTransform = 'rotate(' + relativeRotation + 'deg) ' +
+                       'scale(' + scaleX + ',' + scaleY + ')';
+    CustomStyle.setProp('transform', canvas, cssTransform);
+
+    if (this.textLayer) {
+      // Rotating the text layer is more complicated since the divs inside the
+      // the text layer are rotated.
+      // TODO: This could probably be simplified by drawing the text layer in
+      // one orientation then rotating overall.
+      var textRelativeRotation = this.viewport.rotation -
+                                 this.textLayer.viewport.rotation;
+      var textAbsRotation = Math.abs(textRelativeRotation);
+      var scale = (width / canvas.width);
+      if (textAbsRotation === 90 || textAbsRotation === 270) {
+        scale = width / canvas.height;
+      }
+      var textLayerDiv = this.textLayer.textLayerDiv;
+      var transX, transY;
+      switch (textAbsRotation) {
+        case 0:
+          transX = transY = 0;
+          break;
+        case 90:
+          transX = 0;
+          transY = '-' + textLayerDiv.style.height;
+          break;
+        case 180:
+          transX = '-' + textLayerDiv.style.width;
+          transY = '-' + textLayerDiv.style.height;
+          break;
+        case 270:
+          transX = '-' + textLayerDiv.style.width;
+          transY = 0;
+          break;
+        default:
+          console.error('Bad rotation value.');
+          break;
+      }
+      CustomStyle.setProp('transform', textLayerDiv,
+                          'rotate(' + textAbsRotation + 'deg) ' +
+                            'scale(' + scale + ', ' + scale + ') ' +
+                            'translate(' + transX + ', ' + transY + ')');
+      CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');
+    }
+
+    if (USE_ONLY_CSS_ZOOM && this.annotationLayer) {
+      setupAnnotations(div, this.pdfPage, this.viewport);
+    }
+  };
+
+  Object.defineProperty(this, 'width', {
+    get: function PageView_getWidth() {
+      return this.viewport.width;
+    },
+    enumerable: true
+  });
+
+  Object.defineProperty(this, 'height', {
+    get: function PageView_getHeight() {
+      return this.viewport.height;
+    },
+    enumerable: true
+  });
+
+  var self = this;
+
+  function setupAnnotations(pageDiv, pdfPage, viewport) {
+
+    function bindLink(link, dest) {
+      link.href = PDFView.getDestinationHash(dest);
+      link.onclick = function pageViewSetupLinksOnclick() {
+        if (dest) {
+          PDFView.navigateTo(dest);
+        }
+        return false;
+      };
+      if (dest) {
+        link.className = 'internalLink';
+      }
+    }
+
+    function bindNamedAction(link, action) {
+      link.href = PDFView.getAnchorUrl('');
+      link.onclick = function pageViewSetupNamedActionOnClick() {
+        // See PDF reference, table 8.45 - Named action
+        switch (action) {
+          case 'GoToPage':
+            document.getElementById('pageNumber').focus();
+            break;
+
+          case 'GoBack':
+            PDFHistory.back();
+            break;
+
+          case 'GoForward':
+            PDFHistory.forward();
+            break;
+
+          case 'Find':
+            if (!PDFView.supportsIntegratedFind) {
+              PDFFindBar.toggle();
+            }
+            break;
+
+          case 'NextPage':
+            PDFView.page++;
+            break;
+
+          case 'PrevPage':
+            PDFView.page--;
+            break;
+
+          case 'LastPage':
+            PDFView.page = PDFView.pages.length;
+            break;
+
+          case 'FirstPage':
+            PDFView.page = 1;
+            break;
+
+          default:
+            break; // No action according to spec
+        }
+        return false;
+      };
+      link.className = 'internalLink';
+    }
+
+    pdfPage.getAnnotations().then(function(annotationsData) {
+      viewport = viewport.clone({ dontFlip: true });
+      var transform = viewport.transform;
+      var transformStr = 'matrix(' + transform.join(',') + ')';
+      var data, element, i, ii;
+
+      if (self.annotationLayer) {
+        // If an annotationLayer already exists, refresh its children's
+        // transformation matrices
+        for (i = 0, ii = annotationsData.length; i < ii; i++) {
+          data = annotationsData[i];
+          element = self.annotationLayer.querySelector(
+            '[data-annotation-id="' + data.id + '"]');
+          if (element) {
+            CustomStyle.setProp('transform', element, transformStr);
+          }
+        }
+        // See this.reset()
+        self.annotationLayer.removeAttribute('hidden');
+      } else {
+        for (i = 0, ii = annotationsData.length; i < ii; i++) {
+          data = annotationsData[i];
+          var annotation = PDFJS.Annotation.fromData(data);
+          if (!annotation || !annotation.hasHtml()) {
+            continue;
+          }
+
+          element = annotation.getHtmlElement(pdfPage.commonObjs);
+          element.setAttribute('data-annotation-id', data.id);
+          mozL10n.translate(element);
+
+          data = annotation.getData();
+          var rect = data.rect;
+          var view = pdfPage.view;
+          rect = PDFJS.Util.normalizeRect([
+            rect[0],
+            view[3] - rect[1] + view[1],
+            rect[2],
+            view[3] - rect[3] + view[1]
+          ]);
+          element.style.left = rect[0] + 'px';
+          element.style.top = rect[1] + 'px';
+          element.style.position = 'absolute';
+
+          CustomStyle.setProp('transform', element, transformStr);
+          var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';
+          CustomStyle.setProp('transformOrigin', element, transformOriginStr);
+
+          if (data.subtype === 'Link' && !data.url) {
+            var link = element.getElementsByTagName('a')[0];
+            if (link) {
+              if (data.action) {
+                bindNamedAction(link, data.action);
+              } else {
+                bindLink(link, ('dest' in data) ? data.dest : null);
+              }
+            }
+          }
+
+          if (!self.annotationLayer) {
+            var annotationLayerDiv = document.createElement('div');
+            annotationLayerDiv.className = 'annotationLayer';
+            pageDiv.appendChild(annotationLayerDiv);
+            self.annotationLayer = annotationLayerDiv;
+          }
+
+          self.annotationLayer.appendChild(element);
+        }
+      }
+    });
+  }
+
+  this.getPagePoint = function pageViewGetPagePoint(x, y) {
+    return this.viewport.convertToPdfPoint(x, y);
+  };
+
+  this.scrollIntoView = function pageViewScrollIntoView(dest) {
+    if (PresentationMode.active) {
+      if (PDFView.page !== this.id) {
+        // Avoid breaking PDFView.getVisiblePages in presentation mode.
+        PDFView.page = this.id;
+        return;
+      }
+      dest = null;
+      PDFView.setScale(PDFView.currentScaleValue, true, true);
+    }
+    if (!dest) {
+      scrollIntoView(div);
+      return;
+    }
+
+    var x = 0, y = 0;
+    var width = 0, height = 0, widthScale, heightScale;
+    var changeOrientation = (this.rotation % 180 === 0 ? false : true);
+    var pageWidth = (changeOrientation ? this.height : this.width) /
+      this.scale / CSS_UNITS;
+    var pageHeight = (changeOrientation ? this.width : this.height) /
+      this.scale / CSS_UNITS;
+    var scale = 0;
+    switch (dest[1].name) {
+      case 'XYZ':
+        x = dest[2];
+        y = dest[3];
+        scale = dest[4];
+        // If x and/or y coordinates are not supplied, default to
+        // _top_ left of the page (not the obvious bottom left,
+        // since aligning the bottom of the intended page with the
+        // top of the window is rarely helpful).
+        x = x !== null ? x : 0;
+        y = y !== null ? y : pageHeight;
+        break;
+      case 'Fit':
+      case 'FitB':
+        scale = 'page-fit';
+        break;
+      case 'FitH':
+      case 'FitBH':
+        y = dest[2];
+        scale = 'page-width';
+        break;
+      case 'FitV':
+      case 'FitBV':
+        x = dest[2];
+        width = pageWidth;
+        height = pageHeight;
+        scale = 'page-height';
+        break;
+      case 'FitR':
+        x = dest[2];
+        y = dest[3];
+        width = dest[4] - x;
+        height = dest[5] - y;
+        widthScale = (PDFView.container.clientWidth - SCROLLBAR_PADDING) /
+          width / CSS_UNITS;
+        heightScale = (PDFView.container.clientHeight - SCROLLBAR_PADDING) /
+          height / CSS_UNITS;
+        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
+        break;
+      default:
+        return;
+    }
+
+    if (scale && scale !== PDFView.currentScale) {
+      PDFView.setScale(scale, true, true);
+    } else if (PDFView.currentScale === UNKNOWN_SCALE) {
+      PDFView.setScale(DEFAULT_SCALE, true, true);
+    }
+
+    if (scale === 'page-fit' && !dest[4]) {
+      scrollIntoView(div);
+      return;
+    }
+
+    var boundingRect = [
+      this.viewport.convertToViewportPoint(x, y),
+      this.viewport.convertToViewportPoint(x + width, y + height)
+    ];
+    var left = Math.min(boundingRect[0][0], boundingRect[1][0]);
+    var top = Math.min(boundingRect[0][1], boundingRect[1][1]);
+
+    scrollIntoView(div, { left: left, top: top });
+  };
+
+  this.getTextContent = function pageviewGetTextContent() {
+    return PDFView.getPage(this.id).then(function(pdfPage) {
+      return pdfPage.getTextContent();
+    });
+  };
+
+  this.draw = function pageviewDraw(callback) {
+    var pdfPage = this.pdfPage;
+
+    if (this.pagePdfPromise) {
+      return;
+    }
+    if (!pdfPage) {
+      var promise = PDFView.getPage(this.id);
+      promise.then(function(pdfPage) {
+        delete this.pagePdfPromise;
+        this.setPdfPage(pdfPage);
+        this.draw(callback);
+      }.bind(this));
+      this.pagePdfPromise = promise;
+      return;
+    }
+
+    if (this.renderingState !== RenderingStates.INITIAL) {
+      console.error('Must be in new state before drawing');
+    }
+
+    this.renderingState = RenderingStates.RUNNING;
+
+    var viewport = this.viewport;
+    // Wrap the canvas so if it has a css transform for highdpi the overflow
+    // will be hidden in FF.
+    var canvasWrapper = document.createElement('div');
+    canvasWrapper.style.width = div.style.width;
+    canvasWrapper.style.height = div.style.height;
+    canvasWrapper.classList.add('canvasWrapper');
+
+    var canvas = document.createElement('canvas');
+    canvas.id = 'page' + this.id;
+    canvasWrapper.appendChild(canvas);
+    if (this.annotationLayer) {
+      // annotationLayer needs to stay on top
+      div.insertBefore(canvasWrapper, this.annotationLayer);
+    } else {
+      div.appendChild(canvasWrapper);
+    }
+    this.canvas = canvas;
+
+    var ctx = canvas.getContext('2d');
+    var outputScale = getOutputScale(ctx);
+
+    if (USE_ONLY_CSS_ZOOM) {
+      var actualSizeViewport = viewport.clone({ scale: CSS_UNITS });
+      // Use a scale that will make the canvas be the original intended size
+      // of the page.
+      outputScale.sx *= actualSizeViewport.width / viewport.width;
+      outputScale.sy *= actualSizeViewport.height / viewport.height;
+      outputScale.scaled = true;
+    }
+
+    canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
+    canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
+    canvas.style.width = Math.floor(viewport.width) + 'px';
+    canvas.style.height = Math.floor(viewport.height) + 'px';
+    // Add the viewport so it's known what it was originally drawn with.
+    canvas._viewport = viewport;
+
+    var textLayerDiv = null;
+    if (!PDFJS.disableTextLayer) {
+      textLayerDiv = document.createElement('div');
+      textLayerDiv.className = 'textLayer';
+      textLayerDiv.style.width = canvas.style.width;
+      textLayerDiv.style.height = canvas.style.height;
+      if (this.annotationLayer) {
+        // annotationLayer needs to stay on top
+        div.insertBefore(textLayerDiv, this.annotationLayer);
+      } else {
+        div.appendChild(textLayerDiv);
+      }
+    }
+    var textLayer = this.textLayer =
+      textLayerDiv ? new TextLayerBuilder({
+        textLayerDiv: textLayerDiv,
+        pageIndex: this.id - 1,
+        lastScrollSource: PDFView,
+        viewport: this.viewport,
+        isViewerInPresentationMode: PresentationMode.active
+      }) : null;
+    // TODO(mack): use data attributes to store these
+    ctx._scaleX = outputScale.sx;
+    ctx._scaleY = outputScale.sy;
+    if (outputScale.scaled) {
+      ctx.scale(outputScale.sx, outputScale.sy);
+    }
+
+    // Rendering area
+
+    var self = this;
+    function pageViewDrawCallback(error) {
+      // The renderTask may have been replaced by a new one, so only remove the
+      // reference to the renderTask if it matches the one that is triggering
+      // this callback.
+      if (renderTask === self.renderTask) {
+        self.renderTask = null;
+      }
+
+      if (error === 'cancelled') {
+        return;
+      }
+
+      self.renderingState = RenderingStates.FINISHED;
+
+      if (self.loadingIconDiv) {
+        div.removeChild(self.loadingIconDiv);
+        delete self.loadingIconDiv;
+      }
+
+      if (self.zoomLayer) {
+        div.removeChild(self.zoomLayer);
+        self.zoomLayer = null;
+      }
+
+      if (error) {
+        PDFView.error(mozL10n.get('rendering_error', null,
+          'An error occurred while rendering the page.'), error);
+      }
+
+      self.stats = pdfPage.stats;
+      self.updateStats();
+      if (self.onAfterDraw) {
+        self.onAfterDraw();
+      }
+
+      cache.push(self);
+
+      var event = document.createEvent('CustomEvent');
+      event.initCustomEvent('pagerender', true, true, {
+        pageNumber: pdfPage.pageNumber
+      });
+      div.dispatchEvent(event);
+
+      callback();
+    }
+
+    var renderContext = {
+      canvasContext: ctx,
+      viewport: this.viewport,
+      textLayer: textLayer,
+      // intent: 'default', // === 'display'
+      continueCallback: function pdfViewcContinueCallback(cont) {
+        if (PDFView.highestPriorityPage !== 'page' + self.id) {
+          self.renderingState = RenderingStates.PAUSED;
+          self.resume = function resumeCallback() {
+            self.renderingState = RenderingStates.RUNNING;
+            cont();
+          };
+          return;
+        }
+        cont();
+      }
+    };
+    var renderTask = this.renderTask = this.pdfPage.render(renderContext);
+
+    this.renderTask.promise.then(
+      function pdfPageRenderCallback() {
+        pageViewDrawCallback(null);
+        if (textLayer) {
+          self.getTextContent().then(
+            function textContentResolved(textContent) {
+              textLayer.setTextContent(textContent);
+            }
+          );
+        }
+      },
+      function pdfPageRenderError(error) {
+        pageViewDrawCallback(error);
+      }
+    );
+
+    setupAnnotations(div, pdfPage, this.viewport);
+    div.setAttribute('data-loaded', true);
+  };
+
+  this.beforePrint = function pageViewBeforePrint() {
+    var pdfPage = this.pdfPage;
+
+    var viewport = pdfPage.getViewport(1);
+    // Use the same hack we use for high dpi displays for printing to get better
+    // output until bug 811002 is fixed in FF.
+    var PRINT_OUTPUT_SCALE = 2;
+    var canvas = document.createElement('canvas');
+    canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;
+    canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;
+    canvas.style.width = (PRINT_OUTPUT_SCALE * viewport.width) + 'pt';
+    canvas.style.height = (PRINT_OUTPUT_SCALE * viewport.height) + 'pt';
+    var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +
+                              (1 / PRINT_OUTPUT_SCALE) + ')';
+    CustomStyle.setProp('transform' , canvas, cssScale);
+    CustomStyle.setProp('transformOrigin' , canvas, '0% 0%');
+
+    var printContainer = document.getElementById('printContainer');
+    var canvasWrapper = document.createElement('div');
+    canvasWrapper.style.width = viewport.width + 'pt';
+    canvasWrapper.style.height = viewport.height + 'pt';
+    canvasWrapper.appendChild(canvas);
+    printContainer.appendChild(canvasWrapper);
+
+    canvas.mozPrintCallback = function(obj) {
+      var ctx = obj.context;
+
+      ctx.save();
+      ctx.fillStyle = 'rgb(255, 255, 255)';
+      ctx.fillRect(0, 0, canvas.width, canvas.height);
+      ctx.restore();
+      ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE);
+
+      var renderContext = {
+        canvasContext: ctx,
+        viewport: viewport,
+        intent: 'print'
+      };
+
+      pdfPage.render(renderContext).promise.then(function() {
+        // Tell the printEngine that rendering this canvas/page has finished.
+        obj.done();
+      }, function(error) {
+        console.error(error);
+        // Tell the printEngine that rendering this canvas/page has failed.
+        // This will make the print proces stop.
+        if ('abort' in obj) {
+          obj.abort();
+        } else {
+          obj.done();
+        }
+      });
+    };
+  };
+
+  this.updateStats = function pageViewUpdateStats() {
+    if (!this.stats) {
+      return;
+    }
+
+    if (PDFJS.pdfBug && Stats.enabled) {
+      var stats = this.stats;
+      Stats.add(this.id, stats);
+    }
+  };
+};
+
+
+var ThumbnailView = function thumbnailView(container, id, defaultViewport) {
+  var anchor = document.createElement('a');
+  anchor.href = PDFView.getAnchorUrl('#page=' + id);
+  anchor.title = mozL10n.get('thumb_page_title', {page: id}, 'Page {{page}}');
+  anchor.onclick = function stopNavigation() {
+    PDFView.page = id;
+    return false;
+  };
+
+  this.pdfPage = undefined;
+  this.viewport = defaultViewport;
+  this.pdfPageRotate = defaultViewport.rotation;
+
+  this.rotation = 0;
+  this.pageWidth = this.viewport.width;
+  this.pageHeight = this.viewport.height;
+  this.pageRatio = this.pageWidth / this.pageHeight;
+  this.id = id;
+
+  this.canvasWidth = 98;
+  this.canvasHeight = this.canvasWidth / this.pageWidth * this.pageHeight;
+  this.scale = (this.canvasWidth / this.pageWidth);
+
+  var div = this.el = document.createElement('div');
+  div.id = 'thumbnailContainer' + id;
+  div.className = 'thumbnail';
+
+  if (id === 1) {
+    // Highlight the thumbnail of the first page when no page number is
+    // specified (or exists in cache) when the document is loaded.
+    div.classList.add('selected');
+  }
+
+  var ring = document.createElement('div');
+  ring.className = 'thumbnailSelectionRing';
+  ring.style.width = this.canvasWidth + 'px';
+  ring.style.height = this.canvasHeight + 'px';
+
+  div.appendChild(ring);
+  anchor.appendChild(div);
+  container.appendChild(anchor);
+
+  this.hasImage = false;
+  this.renderingState = RenderingStates.INITIAL;
+
+  this.setPdfPage = function thumbnailViewSetPdfPage(pdfPage) {
+    this.pdfPage = pdfPage;
+    this.pdfPageRotate = pdfPage.rotate;
+    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = pdfPage.getViewport(1, totalRotation);
+    this.update();
+  };
+
+  this.update = function thumbnailViewUpdate(rotation) {
+    if (rotation !== undefined) {
+      this.rotation = rotation;
+    }
+    var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+    this.viewport = this.viewport.clone({
+      scale: 1,
+      rotation: totalRotation
+    });
+    this.pageWidth = this.viewport.width;
+    this.pageHeight = this.viewport.height;
+    this.pageRatio = this.pageWidth / this.pageHeight;
+
+    this.canvasHeight = this.canvasWidth / this.pageWidth * this.pageHeight;
+    this.scale = (this.canvasWidth / this.pageWidth);
+
+    div.removeAttribute('data-loaded');
+    ring.textContent = '';
+    ring.style.width = this.canvasWidth + 'px';
+    ring.style.height = this.canvasHeight + 'px';
+
+    this.hasImage = false;
+    this.renderingState = RenderingStates.INITIAL;
+    this.resume = null;
+  };
+
+  this.getPageDrawContext = function thumbnailViewGetPageDrawContext() {
+    var canvas = document.createElement('canvas');
+    canvas.id = 'thumbnail' + id;
+
+    canvas.width = this.canvasWidth;
+    canvas.height = this.canvasHeight;
+    canvas.className = 'thumbnailImage';
+    canvas.setAttribute('aria-label', mozL10n.get('thumb_page_canvas',
+      {page: id}, 'Thumbnail of Page {{page}}'));
+
+    div.setAttribute('data-loaded', true);
+
+    ring.appendChild(canvas);
+
+    var ctx = canvas.getContext('2d');
+    ctx.save();
+    ctx.fillStyle = 'rgb(255, 255, 255)';
+    ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
+    ctx.restore();
+    return ctx;
+  };
+
+  this.drawingRequired = function thumbnailViewDrawingRequired() {
+    return !this.hasImage;
+  };
+
+  this.draw = function thumbnailViewDraw(callback) {
+    if (!this.pdfPage) {
+      var promise = PDFView.getPage(this.id);
+      promise.then(function(pdfPage) {
+        this.setPdfPage(pdfPage);
+        this.draw(callback);
+      }.bind(this));
+      return;
+    }
+
+    if (this.renderingState !== RenderingStates.INITIAL) {
+      console.error('Must be in new state before drawing');
+    }
+
+    this.renderingState = RenderingStates.RUNNING;
+    if (this.hasImage) {
+      callback();
+      return;
+    }
+
+    var self = this;
+    var ctx = this.getPageDrawContext();
+    var drawViewport = this.viewport.clone({ scale: this.scale });
+    var renderContext = {
+      canvasContext: ctx,
+      viewport: drawViewport,
+      continueCallback: function(cont) {
+        if (PDFView.highestPriorityPage !== 'thumbnail' + self.id) {
+          self.renderingState = RenderingStates.PAUSED;
+          self.resume = function() {
+            self.renderingState = RenderingStates.RUNNING;
+            cont();
+          };
+          return;
+        }
+        cont();
+      }
+    };
+    this.pdfPage.render(renderContext).promise.then(
+      function pdfPageRenderCallback() {
+        self.renderingState = RenderingStates.FINISHED;
+        callback();
+      },
+      function pdfPageRenderError(error) {
+        self.renderingState = RenderingStates.FINISHED;
+        callback();
+      }
+    );
+    this.hasImage = true;
+  };
+
+  this.setImage = function thumbnailViewSetImage(img) {
+    if (!this.pdfPage) {
+      var promise = PDFView.getPage(this.id);
+      promise.then(function(pdfPage) {
+        this.setPdfPage(pdfPage);
+        this.setImage(img);
+      }.bind(this));
+      return;
+    }
+    if (this.hasImage || !img) {
+      return;
+    }
+    this.renderingState = RenderingStates.FINISHED;
+    var ctx = this.getPageDrawContext();
+    ctx.drawImage(img, 0, 0, img.width, img.height,
+                  0, 0, ctx.canvas.width, ctx.canvas.height);
+
+    this.hasImage = true;
+  };
+};
+
+
+var FIND_SCROLL_OFFSET_TOP = -50;
+var FIND_SCROLL_OFFSET_LEFT = -400;
+
+/**
+ * TextLayerBuilder provides text-selection
+ * functionality for the PDF. It does this
+ * by creating overlay divs over the PDF
+ * text. This divs contain text that matches
+ * the PDF text they are overlaying. This
+ * object also provides for a way to highlight
+ * text that is being searched for.
+ */
+var TextLayerBuilder = function textLayerBuilder(options) {
+  var textLayerFrag = document.createDocumentFragment();
+
+  this.textLayerDiv = options.textLayerDiv;
+  this.layoutDone = false;
+  this.divContentDone = false;
+  this.pageIdx = options.pageIndex;
+  this.matches = [];
+  this.lastScrollSource = options.lastScrollSource;
+  this.viewport = options.viewport;
+  this.isViewerInPresentationMode = options.isViewerInPresentationMode;
+  this.textDivs = [];
+
+  if (typeof PDFFindController === 'undefined') {
+    window.PDFFindController = null;
+  }
+
+  if (typeof this.lastScrollSource === 'undefined') {
+    this.lastScrollSource = null;
+  }
+
+  this.renderLayer = function textLayerBuilderRenderLayer() {
+    var textDivs = this.textDivs;
+    var canvas = document.createElement('canvas');
+    var ctx = canvas.getContext('2d');
+
+    // No point in rendering so many divs as it'd make the browser unusable
+    // even after the divs are rendered
+    var MAX_TEXT_DIVS_TO_RENDER = 100000;
+    if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {
+      return;
+    }
+
+    for (var i = 0, ii = textDivs.length; i < ii; i++) {
+      var textDiv = textDivs[i];
+      if ('isWhitespace' in textDiv.dataset) {
+        continue;
+      }
+
+      ctx.font = textDiv.style.fontSize + ' ' + textDiv.style.fontFamily;
+      var width = ctx.measureText(textDiv.textContent).width;
+
+      if (width > 0) {
+        textLayerFrag.appendChild(textDiv);
+        var textScale = textDiv.dataset.canvasWidth / width;
+        var rotation = textDiv.dataset.angle;
+        var transform = 'scale(' + textScale + ', 1)';
+        transform = 'rotate(' + rotation + 'deg) ' + transform;
+        CustomStyle.setProp('transform' , textDiv, transform);
+        CustomStyle.setProp('transformOrigin' , textDiv, '0% 0%');
+      }
+    }
+
+    this.textLayerDiv.appendChild(textLayerFrag);
+    this.renderingDone = true;
+    this.updateMatches();
+  };
+
+  this.setupRenderLayoutTimer = function textLayerSetupRenderLayoutTimer() {
+    // Schedule renderLayout() if user has been scrolling, otherwise
+    // run it right away
+    var RENDER_DELAY = 200; // in ms
+    var self = this;
+    var lastScroll = (this.lastScrollSource === null ?
+                      0 : this.lastScrollSource.lastScroll);
+
+    if (Date.now() - lastScroll > RENDER_DELAY) {
+      // Render right away
+      this.renderLayer();
+    } else {
+      // Schedule
+      if (this.renderTimer) {
+        clearTimeout(this.renderTimer);
+      }
+      this.renderTimer = setTimeout(function() {
+        self.setupRenderLayoutTimer();
+      }, RENDER_DELAY);
+    }
+  };
+
+  this.appendText = function textLayerBuilderAppendText(geom, styles) {
+    var style = styles[geom.fontName];
+    var textDiv = document.createElement('div');
+    this.textDivs.push(textDiv);
+    if (!/\S/.test(geom.str)) {
+      textDiv.dataset.isWhitespace = true;
+      return;
+    }
+    var tx = PDFJS.Util.transform(this.viewport.transform, geom.transform);
+    var angle = Math.atan2(tx[1], tx[0]);
+    if (style.vertical) {
+      angle += Math.PI / 2;
+    }
+    var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));
+    var fontAscent = (style.ascent ? style.ascent * fontHeight :
+      (style.descent ? (1 + style.descent) * fontHeight : fontHeight));
+
+    textDiv.style.position = 'absolute';
+    textDiv.style.left = (tx[4] + (fontAscent * Math.sin(angle))) + 'px';
+    textDiv.style.top = (tx[5] - (fontAscent * Math.cos(angle))) + 'px';
+    textDiv.style.fontSize = fontHeight + 'px';
+    textDiv.style.fontFamily = style.fontFamily;
+
+    textDiv.textContent = geom.str;
+    textDiv.dataset.fontName = geom.fontName;
+    textDiv.dataset.angle = angle * (180 / Math.PI);
+    if (style.vertical) {
+      textDiv.dataset.canvasWidth = geom.height * this.viewport.scale;
+    } else {
+      textDiv.dataset.canvasWidth = geom.width * this.viewport.scale;
+    }
+
+  };
+
+  this.setTextContent = function textLayerBuilderSetTextContent(textContent) {
+    this.textContent = textContent;
+
+    var textItems = textContent.items;
+    for (var i = 0; i < textItems.length; i++) {
+      this.appendText(textItems[i], textContent.styles);
+    }
+    this.divContentDone = true;
+
+    this.setupRenderLayoutTimer();
+  };
+
+  this.convertMatches = function textLayerBuilderConvertMatches(matches) {
+    var i = 0;
+    var iIndex = 0;
+    var bidiTexts = this.textContent.items;
+    var end = bidiTexts.length - 1;
+    var queryLen = (PDFFindController === null ?
+                    0 : PDFFindController.state.query.length);
+
+    var ret = [];
+
+    // Loop over all the matches.
+    for (var m = 0; m < matches.length; m++) {
+      var matchIdx = matches[m];
+      // # Calculate the begin position.
+
+      // Loop over the divIdxs.
+      while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) {
+        iIndex += bidiTexts[i].str.length;
+        i++;
+      }
+
+      // TODO: Do proper handling here if something goes wrong.
+      if (i == bidiTexts.length) {
+        console.error('Could not find matching mapping');
+      }
+
+      var match = {
+        begin: {
+          divIdx: i,
+          offset: matchIdx - iIndex
+        }
+      };
+
+      // # Calculate the end position.
+      matchIdx += queryLen;
+
+      // Somewhat same array as above, but use a > instead of >= to get the end
+      // position right.
+      while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) {
+        iIndex += bidiTexts[i].str.length;
+        i++;
+      }
+
+      match.end = {
+        divIdx: i,
+        offset: matchIdx - iIndex
+      };
+      ret.push(match);
+    }
+
+    return ret;
+  };
+
+  this.renderMatches = function textLayerBuilder_renderMatches(matches) {
+    // Early exit if there is nothing to render.
+    if (matches.length === 0) {
+      return;
+    }
+
+    var bidiTexts = this.textContent.items;
+    var textDivs = this.textDivs;
+    var prevEnd = null;
+    var isSelectedPage = (PDFFindController === null ?
+      false : (this.pageIdx === PDFFindController.selected.pageIdx));
+
+    var selectedMatchIdx = (PDFFindController === null ?
+                            -1 : PDFFindController.selected.matchIdx);
+
+    var highlightAll = (PDFFindController === null ?
+                        false : PDFFindController.state.highlightAll);
+
+    var infty = {
+      divIdx: -1,
+      offset: undefined
+    };
+
+    function beginText(begin, className) {
+      var divIdx = begin.divIdx;
+      var div = textDivs[divIdx];
+      div.textContent = '';
+      appendTextToDiv(divIdx, 0, begin.offset, className);
+    }
+
+    function appendText(from, to, className) {
+      appendTextToDiv(from.divIdx, from.offset, to.offset, className);
+    }
+
+    function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
+      var div = textDivs[divIdx];
+
+      var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset);
+      var node = document.createTextNode(content);
+      if (className) {
+        var span = document.createElement('span');
+        span.className = className;
+        span.appendChild(node);
+        div.appendChild(span);
+        return;
+      }
+      div.appendChild(node);
+    }
+
+    function highlightDiv(divIdx, className) {
+      textDivs[divIdx].className = className;
+    }
+
+    var i0 = selectedMatchIdx, i1 = i0 + 1, i;
+
+    if (highlightAll) {
+      i0 = 0;
+      i1 = matches.length;
+    } else if (!isSelectedPage) {
+      // Not highlighting all and this isn't the selected page, so do nothing.
+      return;
+    }
+
+    for (i = i0; i < i1; i++) {
+      var match = matches[i];
+      var begin = match.begin;
+      var end = match.end;
+
+      var isSelected = isSelectedPage && i === selectedMatchIdx;
+      var highlightSuffix = (isSelected ? ' selected' : '');
+      if (isSelected && !this.isViewerInPresentationMode) {
+        scrollIntoView(textDivs[begin.divIdx], { top: FIND_SCROLL_OFFSET_TOP,
+                                               left: FIND_SCROLL_OFFSET_LEFT });
+      }
+
+      // Match inside new div.
+      if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
+        // If there was a previous div, then add the text at the end
+        if (prevEnd !== null) {
+          appendText(prevEnd, infty);
+        }
+        // clears the divs and set the content until the begin point.
+        beginText(begin);
+      } else {
+        appendText(prevEnd, begin);
+      }
+
+      if (begin.divIdx === end.divIdx) {
+        appendText(begin, end, 'highlight' + highlightSuffix);
+      } else {
+        appendText(begin, infty, 'highlight begin' + highlightSuffix);
+        for (var n = begin.divIdx + 1; n < end.divIdx; n++) {
+          highlightDiv(n, 'highlight middle' + highlightSuffix);
+        }
+        beginText(end, 'highlight end' + highlightSuffix);
+      }
+      prevEnd = end;
+    }
+
+    if (prevEnd) {
+      appendText(prevEnd, infty);
+    }
+  };
+
+  this.updateMatches = function textLayerUpdateMatches() {
+    // Only show matches, once all rendering is done.
+    if (!this.renderingDone) {
+      return;
+    }
+
+    // Clear out all matches.
+    var matches = this.matches;
+    var textDivs = this.textDivs;
+    var bidiTexts = this.textContent.items;
+    var clearedUntilDivIdx = -1;
+
+    // Clear out all current matches.
+    for (var i = 0; i < matches.length; i++) {
+      var match = matches[i];
+      var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);
+      for (var n = begin; n <= match.end.divIdx; n++) {
+        var div = textDivs[n];
+        div.textContent = bidiTexts[n].str;
+        div.className = '';
+      }
+      clearedUntilDivIdx = match.end.divIdx + 1;
+    }
+
+    if (PDFFindController === null || !PDFFindController.active) {
+      return;
+    }
+
+    // Convert the matches on the page controller into the match format used
+    // for the textLayer.
+    this.matches = matches = (this.convertMatches(PDFFindController === null ?
+      [] : (PDFFindController.pageMatches[this.pageIdx] || [])));
+
+    this.renderMatches(this.matches);
+  };
+};
+
+
+
+var DocumentOutlineView = function documentOutlineView(outline) {
+  var outlineView = document.getElementById('outlineView');
+  while (outlineView.firstChild) {
+    outlineView.removeChild(outlineView.firstChild);
+  }
+
+  if (!outline) {
+    if (!outlineView.classList.contains('hidden')) {
+      PDFView.switchSidebarView('thumbs');
+    }
+    return;
+  }
+
+  function bindItemLink(domObj, item) {
+    domObj.href = PDFView.getDestinationHash(item.dest);
+    domObj.onclick = function documentOutlineViewOnclick(e) {
+      PDFView.navigateTo(item.dest);
+      return false;
+    };
+  }
+
+
+  var queue = [{parent: outlineView, items: outline}];
+  while (queue.length > 0) {
+    var levelData = queue.shift();
+    var i, n = levelData.items.length;
+    for (i = 0; i < n; i++) {
+      var item = levelData.items[i];
+      var div = document.createElement('div');
+      div.className = 'outlineItem';
+      var a = document.createElement('a');
+      bindItemLink(a, item);
+      a.textContent = item.title;
+      div.appendChild(a);
+
+      if (item.items.length > 0) {
+        var itemsDiv = document.createElement('div');
+        itemsDiv.className = 'outlineItems';
+        div.appendChild(itemsDiv);
+        queue.push({parent: itemsDiv, items: item.items});
+      }
+
+      levelData.parent.appendChild(div);
+    }
+  }
+};
+
+var DocumentAttachmentsView = function documentAttachmentsView(attachments) {
+  var attachmentsView = document.getElementById('attachmentsView');
+  while (attachmentsView.firstChild) {
+    attachmentsView.removeChild(attachmentsView.firstChild);
+  }
+
+  if (!attachments) {
+    if (!attachmentsView.classList.contains('hidden')) {
+      PDFView.switchSidebarView('thumbs');
+    }
+    return;
+  }
+
+  function bindItemLink(domObj, item) {
+    domObj.href = '#';
+    domObj.onclick = function documentAttachmentsViewOnclick(e) {
+      var downloadManager = new DownloadManager();
+      downloadManager.downloadData(item.content, getFileName(item.filename),
+                                   '');
+      return false;
+    };
+  }
+
+  var names = Object.keys(attachments).sort(function(a,b) {
+    return a.toLowerCase().localeCompare(b.toLowerCase());
+  });
+  for (var i = 0, ii = names.length; i < ii; i++) {
+    var item = attachments[names[i]];
+    var div = document.createElement('div');
+    div.className = 'attachmentsItem';
+    var a = document.createElement('a');
+    bindItemLink(a, item);
+    a.textContent = getFileName(item.filename);
+    div.appendChild(a);
+    attachmentsView.appendChild(div);
+  }
+};
+
+
+function webViewerLoad(evt) {
+  PDFView.initialize().then(webViewerInitialized);
+}
+
+function webViewerInitialized() {
+  $('#viewerContainer').targetBlank();
+
+    var params = PDFView.parseQueryString(document.location.search.substring(1));
+  var file = 'file' in params ? params.file : PDFJS.DEFAULT_URL;
+
+  var fileInput = document.createElement('input');
+  fileInput.id = 'fileInput';
+  fileInput.className = 'fileInput';
+  fileInput.setAttribute('type', 'file');
+  fileInput.oncontextmenu = noContextMenuHandler;
+  document.body.appendChild(fileInput);
+
+  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
+    document.getElementById('openFile').setAttribute('hidden', 'true');
+    document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true');
+  } else {
+    document.getElementById('fileInput').value = null;
+  }
+
+  // Special debugging flags in the hash section of the URL.
+  var hash = document.location.hash.substring(1);
+  var hashParams = PDFView.parseQueryString(hash);
+
+  if ('disableWorker' in hashParams) {
+    PDFJS.disableWorker = (hashParams['disableWorker'] === 'true');
+  }
+
+  if ('disableRange' in hashParams) {
+    PDFJS.disableRange = (hashParams['disableRange'] === 'true');
+  }
+
+  if ('disableAutoFetch' in hashParams) {
+    PDFJS.disableAutoFetch = (hashParams['disableAutoFetch'] === 'true');
+  }
+
+  if ('disableFontFace' in hashParams) {
+    PDFJS.disableFontFace = (hashParams['disableFontFace'] === 'true');
+  }
+
+  if ('disableHistory' in hashParams) {
+    PDFJS.disableHistory = (hashParams['disableHistory'] === 'true');
+  }
+
+  if ('webgl' in hashParams) {
+    PDFJS.disableWebGL = (hashParams['webgl'] !== 'true');
+  }
+
+  if ('useOnlyCssZoom' in hashParams) {
+    USE_ONLY_CSS_ZOOM = (hashParams['useOnlyCssZoom'] === 'true');
+  }
+
+  if ('verbosity' in hashParams) {
+    PDFJS.verbosity = hashParams['verbosity'] | 0;
+  }
+
+  if ('ignoreCurrentPositionOnZoom' in hashParams) {
+    IGNORE_CURRENT_POSITION_ON_ZOOM =
+      (hashParams['ignoreCurrentPositionOnZoom'] === 'true');
+  }
+
+
+
+  var locale = PDFJS.locale || navigator.language;
+  if ('locale' in hashParams) {
+    locale = hashParams['locale'];
+  }
+  mozL10n.setLanguage(locale);
+
+  if ('textLayer' in hashParams) {
+    switch (hashParams['textLayer']) {
+      case 'off':
+        PDFJS.disableTextLayer = true;
+        break;
+      case 'visible':
+      case 'shadow':
+      case 'hover':
+        var viewer = document.getElementById('viewer');
+        viewer.classList.add('textLayer-' + hashParams['textLayer']);
+        break;
+    }
+  }
+
+  if ('pdfBug' in hashParams) {
+    PDFJS.pdfBug = true;
+    var pdfBug = hashParams['pdfBug'];
+    var enabled = pdfBug.split(',');
+    PDFBug.enable(enabled);
+    PDFBug.init();
+  }
+
+  if (!PDFView.supportsPrinting) {
+    document.getElementById('print').classList.add('hidden');
+    document.getElementById('secondaryPrint').classList.add('hidden');
+  }
+
+  if (!PDFView.supportsFullscreen) {
+    document.getElementById('presentationMode').classList.add('hidden');
+    document.getElementById('secondaryPresentationMode').
+      classList.add('hidden');
+  }
+
+  if (PDFView.supportsIntegratedFind) {
+    document.getElementById('viewFind').classList.add('hidden');
+  }
+
+  // Listen for unsuporrted features to trigger the fallback UI.
+  PDFJS.UnsupportedManager.listen(PDFView.fallback.bind(PDFView));
+
+  // Suppress context menus for some controls
+  document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler;
+
+  var mainContainer = document.getElementById('mainContainer');
+  var outerContainer = document.getElementById('outerContainer');
+  mainContainer.addEventListener('transitionend', function(e) {
+    if (e.target == mainContainer) {
+      var event = document.createEvent('UIEvents');
+      event.initUIEvent('resize', false, false, window, 0);
+      window.dispatchEvent(event);
+      outerContainer.classList.remove('sidebarMoving');
+    }
+  }, true);
+
+  document.getElementById('sidebarToggle').addEventListener('click',
+    function() {
+      this.classList.toggle('toggled');
+      outerContainer.classList.add('sidebarMoving');
+      outerContainer.classList.toggle('sidebarOpen');
+      PDFView.sidebarOpen = outerContainer.classList.contains('sidebarOpen');
+      PDFView.renderHighestPriority();
+    });
+
+  document.getElementById('viewThumbnail').addEventListener('click',
+    function() {
+      PDFView.switchSidebarView('thumbs');
+    });
+
+  document.getElementById('viewOutline').addEventListener('click',
+    function() {
+      PDFView.switchSidebarView('outline');
+    });
+
+  document.getElementById('viewAttachments').addEventListener('click',
+    function() {
+      PDFView.switchSidebarView('attachments');
+    });
+
+  document.getElementById('previous').addEventListener('click',
+    function() {
+      PDFView.page--;
+    });
+
+  document.getElementById('next').addEventListener('click',
+    function() {
+      PDFView.page++;
+    });
+
+  document.getElementById('zoomIn').addEventListener('click',
+    function() {
+      PDFView.zoomIn();
+    });
+
+  document.getElementById('zoomOut').addEventListener('click',
+    function() {
+      PDFView.zoomOut();
+    });
+
+  document.getElementById('pageNumber').addEventListener('click',
+    function() {
+      this.select();
+    });
+
+  document.getElementById('pageNumber').addEventListener('change',
+    function() {
+      // Handle the user inputting a floating point number.
+      PDFView.page = (this.value | 0);
+
+      if (this.value !== (this.value | 0).toString()) {
+        this.value = PDFView.page;
+      }
+    });
+
+  document.getElementById('scaleSelect').addEventListener('change',
+    function() {
+      PDFView.setScale(this.value);
+    });
+
+  document.getElementById('presentationMode').addEventListener('click',
+    SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));
+
+  document.getElementById('openFile').addEventListener('click',
+    SecondaryToolbar.openFileClick.bind(SecondaryToolbar));
+
+  document.getElementById('print').addEventListener('click',
+    SecondaryToolbar.printClick.bind(SecondaryToolbar));
+
+  document.getElementById('download').addEventListener('click',
+    SecondaryToolbar.downloadClick.bind(SecondaryToolbar));
+
+
+  if (file) {
+    PDFView.open(file, 0);
+  }
+}
+
+document.addEventListener('DOMContentLoaded', webViewerLoad, true);
+
+function updateViewarea() {
+
+  if (!PDFView.initialized) {
+    return;
+  }
+  var visible = PDFView.getVisiblePages();
+  var visiblePages = visible.views;
+  if (visiblePages.length === 0) {
+    return;
+  }
+
+  PDFView.renderHighestPriority();
+
+  var currentId = PDFView.page;
+  var firstPage = visible.first;
+
+  for (var i = 0, ii = visiblePages.length, stillFullyVisible = false;
+       i < ii; ++i) {
+    var page = visiblePages[i];
+
+    if (page.percent < 100) {
+      break;
+    }
+    if (page.id === PDFView.page) {
+      stillFullyVisible = true;
+      break;
+    }
+  }
+
+  if (!stillFullyVisible) {
+    currentId = visiblePages[0].id;
+  }
+
+  if (!PresentationMode.active) {
+    updateViewarea.inProgress = true; // used in "set page"
+    PDFView.page = currentId;
+    updateViewarea.inProgress = false;
+  }
+
+  var currentScale = PDFView.currentScale;
+  var currentScaleValue = PDFView.currentScaleValue;
+  var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ?
+    Math.round(currentScale * 10000) / 100 : currentScaleValue;
+
+  var pageNumber = firstPage.id;
+  var pdfOpenParams = '#page=' + pageNumber;
+  pdfOpenParams += '&zoom=' + normalizedScaleValue;
+  var currentPage = PDFView.pages[pageNumber - 1];
+  var container = PDFView.container;
+  var topLeft = currentPage.getPagePoint((container.scrollLeft - firstPage.x),
+                                         (container.scrollTop - firstPage.y));
+  var intLeft = Math.round(topLeft[0]);
+  var intTop = Math.round(topLeft[1]);
+  pdfOpenParams += ',' + intLeft + ',' + intTop;
+
+  if (PresentationMode.active || PresentationMode.switchInProgress) {
+    PDFView.currentPosition = null;
+  } else {
+    PDFView.currentPosition = { page: pageNumber, left: intLeft, top: intTop };
+  }
+
+  var store = PDFView.store;
+  store.initializedPromise.then(function() {
+    store.set('exists', true);
+    store.set('page', pageNumber);
+    store.set('zoom', normalizedScaleValue);
+    store.set('scrollLeft', intLeft);
+    store.set('scrollTop', intTop);
+  });
+  var href = PDFView.getAnchorUrl(pdfOpenParams);
+  document.getElementById('viewBookmark').href = href;
+  document.getElementById('secondaryViewBookmark').href = href;
+
+  // Update the current bookmark in the browsing history.
+  PDFHistory.updateCurrentBookmark(pdfOpenParams, pageNumber);
+}
+
+window.addEventListener('resize', function webViewerResize(evt) {
+  if (PDFView.initialized &&
+      (document.getElementById('pageWidthOption').selected ||
+       document.getElementById('pageFitOption').selected ||
+       document.getElementById('pageAutoOption').selected)) {
+    PDFView.setScale(document.getElementById('scaleSelect').value);
+  }
+  updateViewarea();
+
+  // Set the 'max-height' CSS property of the secondary toolbar.
+  SecondaryToolbar.setMaxHeight(PDFView.container);
+});
+
+window.addEventListener('hashchange', function webViewerHashchange(evt) {
+  if (PDFHistory.isHashChangeUnlocked) {
+    PDFView.setHash(document.location.hash.substring(1));
+  }
+});
+
+window.addEventListener('change', function webViewerChange(evt) {
+  var files = evt.target.files;
+  if (!files || files.length === 0) {
+    return;
+  }
+  var file = files[0];
+
+  if (!PDFJS.disableCreateObjectURL &&
+      typeof URL !== 'undefined' && URL.createObjectURL) {
+    PDFView.open(URL.createObjectURL(file), 0);
+  } else {
+    // Read the local file into a Uint8Array.
+    var fileReader = new FileReader();
+    fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
+      var buffer = evt.target.result;
+      var uint8Array = new Uint8Array(buffer);
+      PDFView.open(uint8Array, 0);
+    };
+    fileReader.readAsArrayBuffer(file);
+  }
+
+  PDFView.setTitleUsingUrl(file.name);
+
+  // URL does not reflect proper document location - hiding some icons.
+  document.getElementById('viewBookmark').setAttribute('hidden', 'true');
+  document.getElementById('secondaryViewBookmark').
+    setAttribute('hidden', 'true');
+  document.getElementById('download').setAttribute('hidden', 'true');
+  document.getElementById('secondaryDownload').setAttribute('hidden', 'true');
+}, true);
+
+function selectScaleOption(value) {
+  var options = document.getElementById('scaleSelect').options;
+  var predefinedValueFound = false;
+  for (var i = 0; i < options.length; i++) {
+    var option = options[i];
+    if (option.value != value) {
+      option.selected = false;
+      continue;
+    }
+    option.selected = true;
+    predefinedValueFound = true;
+  }
+  return predefinedValueFound;
+}
+
+window.addEventListener('localized', function localized(evt) {
+  document.getElementsByTagName('html')[0].dir = mozL10n.getDirection();
+
+  PDFView.animationStartedPromise.then(function() {
+    // Adjust the width of the zoom box to fit the content.
+    // Note: This is only done if the zoom box is actually visible,
+    // since otherwise element.clientWidth will return 0.
+    var container = document.getElementById('scaleSelectContainer');
+    if (container.clientWidth > 0) {
+      var select = document.getElementById('scaleSelect');
+      select.setAttribute('style', 'min-width: inherit;');
+      var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
+      select.setAttribute('style', 'min-width: ' +
+                                   (width + SCALE_SELECT_PADDING) + 'px;');
+      container.setAttribute('style', 'min-width: ' + width + 'px; ' +
+                                      'max-width: ' + width + 'px;');
+    }
+
+    // Set the 'max-height' CSS property of the secondary toolbar.
+    SecondaryToolbar.setMaxHeight(PDFView.container);
+  });
+}, true);
+
+window.addEventListener('scalechange', function scalechange(evt) {
+  document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE);
+  document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE);
+
+  var customScaleOption = document.getElementById('customScaleOption');
+  customScaleOption.selected = false;
+
+  if (!evt.resetAutoSettings &&
+      (document.getElementById('pageWidthOption').selected ||
+       document.getElementById('pageFitOption').selected ||
+       document.getElementById('pageAutoOption').selected)) {
+    updateViewarea();
+    return;
+  }
+
+  var predefinedValueFound = selectScaleOption('' + evt.scale);
+  if (!predefinedValueFound) {
+    customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%';
+    customScaleOption.selected = true;
+  }
+  updateViewarea();
+}, true);
+
+window.addEventListener('pagechange', function pagechange(evt) {
+  var page = evt.pageNumber;
+  if (PDFView.previousPageNumber !== page) {
+    document.getElementById('pageNumber').value = page;
+    var selected = document.querySelector('.thumbnail.selected');
+    if (selected) {
+      selected.classList.remove('selected');
+    }
+    var thumbnail = document.getElementById('thumbnailContainer' + page);
+    thumbnail.classList.add('selected');
+    var visibleThumbs = PDFView.getVisibleThumbs();
+    var numVisibleThumbs = visibleThumbs.views.length;
+
+    // If the thumbnail isn't currently visible, scroll it into view.
+    if (numVisibleThumbs > 0) {
+      var first = visibleThumbs.first.id;
+      // Account for only one thumbnail being visible.
+      var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first);
+      if (page <= first || page >= last) {
+        scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });
+      }
+    }
+  }
+  document.getElementById('previous').disabled = (page <= 1);
+  document.getElementById('next').disabled = (page >= PDFView.pages.length);
+}, true);
+
+function handleMouseWheel(evt) {
+  var MOUSE_WHEEL_DELTA_FACTOR = 40;
+  var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail :
+              evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR;
+  var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn';
+
+  if (evt.ctrlKey) { // Only zoom the pages, not the entire viewer
+    evt.preventDefault();
+    PDFView[direction](Math.abs(ticks));
+  } else if (PresentationMode.active) {
+    PDFView.mouseScroll(ticks * MOUSE_WHEEL_DELTA_FACTOR);
+  }
+}
+
+window.addEventListener('DOMMouseScroll', handleMouseWheel);
+window.addEventListener('mousewheel', handleMouseWheel);
+
+window.addEventListener('click', function click(evt) {
+  if (!PresentationMode.active) {
+    if (SecondaryToolbar.opened && PDFView.container.contains(evt.target)) {
+      SecondaryToolbar.close();
+    }
+  } else if (evt.button === 0) {
+    // Necessary since preventDefault() in 'mousedown' won't stop
+    // the event propagation in all circumstances in presentation mode.
+    evt.preventDefault();
+  }
+}, false);
+
+window.addEventListener('keydown', function keydown(evt) {
+  if (PasswordPrompt.visible) {
+    return;
+  }
+
+  var handled = false;
+  var cmd = (evt.ctrlKey ? 1 : 0) |
+            (evt.altKey ? 2 : 0) |
+            (evt.shiftKey ? 4 : 0) |
+            (evt.metaKey ? 8 : 0);
+
+  // First, handle the key bindings that are independent whether an input
+  // control is selected or not.
+  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
+    // either CTRL or META key with optional SHIFT.
+    switch (evt.keyCode) {
+      case 70: // f
+        if (!PDFView.supportsIntegratedFind) {
+          PDFFindBar.open();
+          handled = true;
+        }
+        break;
+      case 71: // g
+        if (!PDFView.supportsIntegratedFind) {
+          PDFFindBar.dispatchEvent('again', cmd === 5 || cmd === 12);
+          handled = true;
+        }
+        break;
+      case 61: // FF/Mac '='
+      case 107: // FF '+' and '='
+      case 187: // Chrome '+'
+      case 171: // FF with German keyboard
+        PDFView.zoomIn();
+        handled = true;
+        break;
+      case 173: // FF/Mac '-'
+      case 109: // FF '-'
+      case 189: // Chrome '-'
+        PDFView.zoomOut();
+        handled = true;
+        break;
+      case 48: // '0'
+      case 96: // '0' on Numpad of Swedish keyboard
+        // keeping it unhandled (to restore page zoom to 100%)
+        setTimeout(function () {
+          // ... and resetting the scale after browser adjusts its scale
+          PDFView.setScale(DEFAULT_SCALE, true);
+        });
+        handled = false;
+        break;
+    }
+  }
+
+  // CTRL or META without shift
+  if (cmd === 1 || cmd === 8) {
+    switch (evt.keyCode) {
+      case 83: // s
+        PDFView.download();
+        handled = true;
+        break;
+    }
+  }
+
+  // CTRL+ALT or Option+Command
+  if (cmd === 3 || cmd === 10) {
+    switch (evt.keyCode) {
+      case 80: // p
+        SecondaryToolbar.presentationModeClick();
+        handled = true;
+        break;
+      case 71: // g
+        // focuses input#pageNumber field
+        document.getElementById('pageNumber').select();
+        handled = true;
+        break;
+    }
+  }
+
+  if (handled) {
+    evt.preventDefault();
+    return;
+  }
+
+  // Some shortcuts should not get handled if a control/input element
+  // is selected.
+  var curElement = document.activeElement || document.querySelector(':focus');
+  var curElementTagName = curElement && curElement.tagName.toUpperCase();
+  if (curElementTagName === 'INPUT' ||
+      curElementTagName === 'TEXTAREA' ||
+      curElementTagName === 'SELECT') {
+    // Make sure that the secondary toolbar is closed when Escape is pressed.
+    if (evt.keyCode !== 27) { // 'Esc'
+      return;
+    }
+  }
+
+  if (cmd === 0) { // no control key pressed at all.
+    switch (evt.keyCode) {
+      case 38: // up arrow
+      case 33: // pg up
+      case 8: // backspace
+        if (!PresentationMode.active &&
+            PDFView.currentScaleValue !== 'page-fit') {
+          break;
+        }
+        /* in presentation mode */
+        /* falls through */
+      case 37: // left arrow
+        // horizontal scrolling using arrow keys
+        if (PDFView.isHorizontalScrollbarEnabled) {
+          break;
+        }
+        /* falls through */
+      case 75: // 'k'
+      case 80: // 'p'
+        PDFView.page--;
+        handled = true;
+        break;
+      case 27: // esc key
+        if (SecondaryToolbar.opened) {
+          SecondaryToolbar.close();
+          handled = true;
+        }
+        if (!PDFView.supportsIntegratedFind && PDFFindBar.opened) {
+          PDFFindBar.close();
+          handled = true;
+        }
+        break;
+      case 40: // down arrow
+      case 34: // pg down
+      case 32: // spacebar
+        if (!PresentationMode.active &&
+            PDFView.currentScaleValue !== 'page-fit') {
+          break;
+        }
+        /* falls through */
+      case 39: // right arrow
+        // horizontal scrolling using arrow keys
+        if (PDFView.isHorizontalScrollbarEnabled) {
+          break;
+        }
+        /* falls through */
+      case 74: // 'j'
+      case 78: // 'n'
+        PDFView.page++;
+        handled = true;
+        break;
+
+      case 36: // home
+        if (PresentationMode.active) {
+          PDFView.page = 1;
+          handled = true;
+        }
+        break;
+      case 35: // end
+        if (PresentationMode.active) {
+          PDFView.page = PDFView.pdfDocument.numPages;
+          handled = true;
+        }
+        break;
+
+      case 72: // 'h'
+        if (!PresentationMode.active) {
+          HandTool.toggle();
+        }
+        break;
+      case 82: // 'r'
+        PDFView.rotatePages(90);
+        break;
+    }
+  }
+
+  if (cmd === 4) { // shift-key
+    switch (evt.keyCode) {
+      case 32: // spacebar
+        if (!PresentationMode.active &&
+            PDFView.currentScaleValue !== 'page-fit') {
+          break;
+        }
+        PDFView.page--;
+        handled = true;
+        break;
+
+      case 82: // 'r'
+        PDFView.rotatePages(-90);
+        break;
+    }
+  }
+
+  if (!handled && !PresentationMode.active) {
+    // 33=Page Up  34=Page Down  35=End    36=Home
+    // 37=Left     38=Up         39=Right  40=Down
+    if (evt.keyCode >= 33 && evt.keyCode <= 40 &&
+        !PDFView.container.contains(curElement)) {
+      // The page container is not focused, but a page navigation key has been
+      // pressed. Change the focus to the viewer container to make sure that
+      // navigation by keyboard works as expected.
+      PDFView.container.focus();
+    }
+    // 32=Spacebar
+    if (evt.keyCode === 32 && curElementTagName !== 'BUTTON') {
+      if (!PDFView.container.contains(curElement)) {
+        PDFView.container.focus();
+      }
+    }
+  }
+
+  if (cmd === 2) { // alt-key
+    switch (evt.keyCode) {
+      case 37: // left arrow
+        if (PresentationMode.active) {
+          PDFHistory.back();
+          handled = true;
+        }
+        break;
+      case 39: // right arrow
+        if (PresentationMode.active) {
+          PDFHistory.forward();
+          handled = true;
+        }
+        break;
+    }
+  }
+
+  if (handled) {
+    evt.preventDefault();
+    PDFView.clearMouseScrollState();
+  }
+});
+
+window.addEventListener('beforeprint', function beforePrint(evt) {
+  PDFView.beforePrint();
+});
+
+window.addEventListener('afterprint', function afterPrint(evt) {
+  PDFView.afterPrint();
+});
+
+(function animationStartedClosure() {
+  // The offsetParent is not set until the pdf.js iframe or object is visible.
+  // Waiting for first animation.
+  var requestAnimationFrame = window.requestAnimationFrame ||
+                              window.mozRequestAnimationFrame ||
+                              window.webkitRequestAnimationFrame ||
+                              window.oRequestAnimationFrame ||
+                              window.msRequestAnimationFrame ||
+                              function startAtOnce(callback) { callback(); };
+  PDFView.animationStartedPromise = new Promise(function (resolve) {
+    requestAnimationFrame(function onAnimationFrame() {
+      resolve();
+    });
+  });
+})();
+
diff --git a/public/opac/js/universalviewer-2.0.2/lib/viewer.min.js b/public/opac/js/universalviewer-2.0.2/lib/viewer.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..67a7201715a0f9b34b9533882f8cce2ce1eeb4d4
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/viewer.min.js
@@ -0,0 +1,178 @@
+var DEFAULT_SCALE="auto",DEFAULT_SCALE_DELTA=1.1,UNKNOWN_SCALE=0,CACHE_SIZE=20,CSS_UNITS=96/72,SCROLLBAR_PADDING=40,VERTICAL_PADDING=5,MAX_AUTO_SCALE=1.25,MIN_SCALE=.25,MAX_SCALE=4,VIEW_HISTORY_MEMORY=20,SCALE_SELECT_CONTAINER_PADDING=8,SCALE_SELECT_PADDING=22,THUMBNAIL_SCROLL_MARGIN=-19,USE_ONLY_CSS_ZOOM=!1,CLEANUP_TIMEOUT=3E4,IGNORE_CURRENT_POSITION_ON_ZOOM=!1,RenderingStates={INITIAL:0,RUNNING:1,PAUSED:2,FINISHED:3},FindStates={FIND_FOUND:0,FIND_NOTFOUND:1,FIND_WRAPPED:2,FIND_PENDING:3},mozL10n=
+document.mozL10n||document.webL10n,CustomStyle=function(){function a(){}var b=["ms","Moz","Webkit","O"],c={};a.getProp=function(a,e){if(1==arguments.length&&"string"==typeof c[a])return c[a];e=e||document.documentElement;var f=e.style,g,h;if("string"==typeof f[a])return c[a]=a;h=a.charAt(0).toUpperCase()+a.slice(1);for(var k=0,m=b.length;k<m;k++)if(g=b[k]+h,"string"==typeof f[g])return c[a]=g;return c[a]="undefined"};a.setProp=function(a,b,c){a=this.getProp(a);"undefined"!=a&&(b.style[a]=c)};return a}();
+function getFileName(a){var b=a.indexOf("#"),c=a.indexOf("?"),b=Math.min(0<b?b:a.length,0<c?c:a.length);return a.substring(a.lastIndexOf("/",b)+1,b)}function getOutputScale(a){a=(window.devicePixelRatio||1)/(a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||a.backingStorePixelRatio||1);return{sx:a,sy:a,scaled:1!=a}}
+function scrollIntoView(a,b){var c=a.offsetParent,d=a.offsetTop+a.clientTop,e=a.offsetLeft+a.clientLeft;if(c){for(;c.clientHeight===c.scrollHeight;)if(c.dataset._scaleY&&(d/=c.dataset._scaleY,e/=c.dataset._scaleX),d+=c.offsetTop,e+=c.offsetLeft,c=c.offsetParent,!c)return;b&&(void 0!==b.top&&(d+=b.top),void 0!==b.left&&(e+=b.left,c.scrollLeft=e));c.scrollTop=d}else console.error("offsetParent is not set -- cannot scroll")}function noContextMenuHandler(a){a.preventDefault()}
+function getPDFFileNameFromURL(a){var b=/[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;a=/^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/.exec(a);if(a=b.exec(a[1])||b.exec(a[2])||b.exec(a[3]))if(a=a[0],-1!=a.indexOf("%"))try{a=b.exec(decodeURIComponent(a))[0]}catch(c){}return a||"document.pdf"}
+var ProgressBar=function(){function a(a,c){this.div=document.querySelector(a+" .progress");this.bar=this.div.parentNode;this.height=c.height||100;this.width=c.width||100;this.units=c.units||"%";this.div.style.height=this.height+this.units;this.percent=0}a.prototype={updateBar:function(){this._indeterminate?(this.div.classList.add("indeterminate"),this.div.style.width=this.width+this.units):(this.div.classList.remove("indeterminate"),this.div.style.width=this.width*this._percent/100+this.units)},get percent(){return this._percent},
+set percent(a){this._indeterminate=isNaN(a);this._percent=Math.min(Math.max(a,0),100);this.updateBar()},setWidth:function(a){a&&(a=a.parentNode.offsetWidth-a.offsetWidth,0<a&&this.bar.setAttribute("style","width: calc(100% - "+a+"px);"))},hide:function(){this.bar.classList.add("hidden");this.bar.removeAttribute("style")}};return a}(),Cache=function(a){var b=[];this.push=function(c){var d=b.indexOf(c);0<=d&&b.splice(d);b.push(c);b.length>a&&b.shift().destroy()}},DEFAULT_PREFERENCES={showPreviousViewOnLoad:!0,
+defaultZoomValue:"",ifAvailableShowOutlineOnLoad:!1,enableHandToolOnLoad:!1,enableWebGL:!1},Preferences={prefs:Object.create(DEFAULT_PREFERENCES),isInitializedPromiseResolved:!1,initializedPromise:null,initialize:function(){return this.initializedPromise=this._readFromStorage(DEFAULT_PREFERENCES).then(function(a){this.isInitializedPromiseResolved=!0;a&&(this.prefs=a)}.bind(this))},reset:function(){return this.initializedPromise.then(function(){this.prefs=Object.create(DEFAULT_PREFERENCES);return this._writeToStorage(DEFAULT_PREFERENCES)}.bind(this))},
+reload:function(){return this.initializedPromise.then(function(){this._readFromStorage(DEFAULT_PREFERENCES).then(function(a){a&&(this.prefs=a)}.bind(this))}.bind(this))},set:function(a,b){return this.initializedPromise.then(function(){if(void 0===DEFAULT_PREFERENCES[a])throw Error("preferencesSet: '"+a+"' is undefined.");if(void 0===b)throw Error("preferencesSet: no value is specified.");var c=typeof b,d=typeof DEFAULT_PREFERENCES[a];if(c!==d)if("number"===c&&"string"===d)b=b.toString();else throw Error("Preferences_set: '"+
+b+"' is a \""+c+'", expected "'+d+'".');else if("number"===c&&(b|0)!==b)throw Error("Preferences_set: '"+b+'\' must be an "integer".');this.prefs[a]=b;return this._writeToStorage(this.prefs)}.bind(this))},get:function(a){return this.initializedPromise.then(function(){var b=DEFAULT_PREFERENCES[a];if(void 0===b)throw Error("preferencesGet: '"+a+"' is undefined.");var c=this.prefs[a];return void 0!==c?c:b}.bind(this))},_writeToStorage:function(a){return new Promise(function(b){localStorage.setItem("pdfjs.preferences",
+JSON.stringify(a));b()})},_readFromStorage:function(a){return new Promise(function(a){var c=JSON.parse(localStorage.getItem("pdfjs.preferences"));a(c)})}};
+(function(){function a(a){var b=document.createEvent("CustomEvent");b.initCustomEvent(a,!1,!1,"custom");window.dispatchEvent(b)}function b(){if(e)if(d(),++f<e.length){var a=e[f];"function"===typeof a.mozPrintCallback?a.mozPrintCallback({context:a.getContext("2d"),abort:c,done:b}):b()}else d(),g.call(window),setTimeout(c,20)}function c(){e&&(e=null,d(),a("afterprint"))}function d(){var a=document.getElementById("mozPrintCallback-shim");if(e){var b=Math.round(100*f/e.length),d=a.querySelector("progress"),
+g=a.querySelector(".relative-progress");d.value=b;g.textContent=b+"%";a.removeAttribute("hidden");a.onclick=c}else a.setAttribute("hidden","")}if(!("mozPrintCallback"in document.createElement("canvas"))){HTMLCanvasElement.prototype.mozPrintCallback=void 0;var e,f,g=window.print;window.print=function(){if(e)console.warn("Ignored window.print() because of a pending print job.");else try{a("beforeprint")}finally{e=document.querySelectorAll("canvas"),f=-1,b()}};var h=!!document.attachEvent;window.addEventListener("keydown",
+function(a){80!==a.keyCode||!a.ctrlKey&&!a.metaKey||a.altKey||a.shiftKey&&!window.chrome&&!window.opera?27===a.keyCode&&e&&c():(window.print(),h||(a.preventDefault(),a.stopImmediatePropagation?a.stopImmediatePropagation():a.stopPropagation()))},!0);h&&document.attachEvent("onkeydown",function(a){a=a||window.event;if(80===a.keyCode&&a.ctrlKey)return a.keyCode=0,!1});if("onbeforeprint"in window){var k=function(a){"custom"!==a.detail&&a.stopImmediatePropagation&&a.stopImmediatePropagation()};window.addEventListener("beforeprint",
+k,!1);window.addEventListener("afterprint",k,!1)}}})();
+var DownloadManager=function(){function a(a,b){var e=document.createElement("a");e.click?(e.href=a,e.target="_parent","download"in e&&(e.download=b),(document.body||document.documentElement).appendChild(e),e.click(),e.parentNode.removeChild(e)):(window.top===window&&a.split("#")[0]===window.location.href.split("#")[0]&&(e=-1===a.indexOf("?")?"?":"&",a=a.replace(/#|$/,e+"$&")),window.open(a,"_parent"))}function b(){}b.prototype={downloadUrl:function(b,d){PDFJS.isValidUrl(b,!0)&&a(b+"#pdfjs.action=download",
+d)},downloadData:function(b,d,e){b=PDFJS.createObjectURL(b,e);a(b,d)},download:function(b,d,e){URL?navigator.msSaveBlob?navigator.msSaveBlob(b,e)||this.downloadUrl(d,e):(b=URL.createObjectURL(b),a(b,e)):this.downloadUrl(d,e)}};return b}(),cache=new Cache(CACHE_SIZE),currentPageNumber=1,ViewHistory=function(){function a(a){this.fingerprint=a;var c;this.isInitializedPromiseResolved=!1;this.initializedPromise=new Promise(function(a){c=a});(function(a){this.isInitializedPromiseResolved=!0;this.initialize(a||
+"{}");c()}).call(this,localStorage.getItem("database"))}a.prototype={initialize:function(a){a=JSON.parse(a);"files"in a||(a.files=[]);a.files.length>=VIEW_HISTORY_MEMORY&&a.files.shift();for(var c,d=0,e=a.files.length;d<e;d++)if(a.files[d].fingerprint===this.fingerprint){c=d;break}"number"!==typeof c&&(c=a.files.push({fingerprint:this.fingerprint})-1);this.file=a.files[c];this.database=a},set:function(a,c){if(this.isInitializedPromiseResolved){this.file[a]=c;var d=JSON.stringify(this.database);localStorage.setItem("database",
+d)}},get:function(a,c){return this.isInitializedPromiseResolved?this.file[a]||c:c}};return a}(),PDFFindBar={opened:!1,bar:null,toggleButton:null,findField:null,highlightAll:null,caseSensitive:null,findMsg:null,findStatusIcon:null,findPreviousButton:null,findNextButton:null,initialize:function(a){if("undefined"===typeof PDFFindController||null===PDFFindController)throw"PDFFindBar cannot be initialized without a PDFFindController instance.";this.bar=a.bar;this.toggleButton=a.toggleButton;this.findField=
+a.findField;this.highlightAll=a.highlightAllCheckbox;this.caseSensitive=a.caseSensitiveCheckbox;this.findMsg=a.findMsg;this.findStatusIcon=a.findStatusIcon;this.findPreviousButton=a.findPreviousButton;this.findNextButton=a.findNextButton;var b=this;this.toggleButton.addEventListener("click",function(){b.toggle()});this.findField.addEventListener("input",function(){b.dispatchEvent("")});this.bar.addEventListener("keydown",function(a){switch(a.keyCode){case 13:a.target===b.findField&&b.dispatchEvent("again",
+a.shiftKey);break;case 27:b.close()}});this.findPreviousButton.addEventListener("click",function(){b.dispatchEvent("again",!0)});this.findNextButton.addEventListener("click",function(){b.dispatchEvent("again",!1)});this.highlightAll.addEventListener("click",function(){b.dispatchEvent("highlightallchange")});this.caseSensitive.addEventListener("click",function(){b.dispatchEvent("casesensitivitychange")})},dispatchEvent:function(a,b){var c=document.createEvent("CustomEvent");c.initCustomEvent("find"+
+a,!0,!0,{query:this.findField.value,caseSensitive:this.caseSensitive.checked,highlightAll:this.highlightAll.checked,findPrevious:b});return window.dispatchEvent(c)},updateUIState:function(a,b){var c=!1,d="",e="";switch(a){case FindStates.FIND_PENDING:e="pending";break;case FindStates.FIND_NOTFOUND:d=mozL10n.get("find_not_found",null,"Phrase not found");c=!0;break;case FindStates.FIND_WRAPPED:d=b?mozL10n.get("find_reached_top",null,"Reached top of document, continued from bottom"):mozL10n.get("find_reached_bottom",
+null,"Reached end of document, continued from top")}c?this.findField.classList.add("notFound"):this.findField.classList.remove("notFound");this.findField.setAttribute("data-status",e);this.findMsg.textContent=d},open:function(){this.opened||(this.opened=!0,this.toggleButton.classList.add("toggled"),this.bar.classList.remove("hidden"));this.findField.select();this.findField.focus()},close:function(){this.opened&&(this.opened=!1,this.toggleButton.classList.remove("toggled"),this.bar.classList.add("hidden"),
+PDFFindController.active=!1)},toggle:function(){this.opened?this.close():this.open()}},PDFFindController={startedTextExtraction:!1,extractTextPromises:[],pendingFindMatches:{},active:!1,pageContents:[],pageMatches:[],selected:{pageIdx:-1,matchIdx:-1},offset:{pageIdx:null,matchIdx:null},resumePageIdx:null,state:null,dirtyMatch:!1,findTimeout:null,pdfPageSource:null,integratedFind:!1,initialize:function(a){if("undefined"===typeof PDFFindBar||null===PDFFindBar)throw"PDFFindController cannot be initialized without a PDFFindBar instance";
+this.pdfPageSource=a.pdfPageSource;this.integratedFind=a.integratedFind;a=["find","findagain","findhighlightallchange","findcasesensitivitychange"];this.firstPagePromise=new Promise(function(a){this.resolveFirstPage=a}.bind(this));this.handleEvent=this.handleEvent.bind(this);for(var b=0;b<a.length;b++)window.addEventListener(a[b],this.handleEvent)},reset:function(){this.startedTextExtraction=!1;this.extractTextPromises=[];this.active=!1},calcFindMatch:function(a){var b=this.pageContents[a],c=this.state.query,
+d=this.state.caseSensitive,e=c.length;if(0!==e){d||(b=b.toLowerCase(),c=c.toLowerCase());for(var d=[],f=-e;;){f=b.indexOf(c,f+e);if(-1===f)break;d.push(f)}this.pageMatches[a]=d;this.updatePage(a);this.resumePageIdx===a&&(this.resumePageIdx=null,this.nextPageMatch())}},extractText:function(){function a(c){e.pdfPageSource.pages[c].getTextContent().then(function(d){d=d.items;for(var h="",k=0;k<d.length;k++)h+=d[k].str;e.pageContents.push(h);b[c](c);c+1<e.pdfPageSource.pages.length&&a(c+1)})}if(!this.startedTextExtraction){this.startedTextExtraction=
+!0;this.pageContents=[];for(var b=[],c=0,d=this.pdfPageSource.pdfDocument.numPages;c<d;c++)this.extractTextPromises.push(new Promise(function(a){b.push(a)}));var e=this;a(0)}},handleEvent:function(a){if(null===this.state||"findagain"!==a.type)this.dirtyMatch=!0;this.state=a.detail;this.updateUIState(FindStates.FIND_PENDING);this.firstPagePromise.then(function(){this.extractText();clearTimeout(this.findTimeout);"find"===a.type?this.findTimeout=setTimeout(this.nextMatch.bind(this),250):this.nextMatch()}.bind(this))},
+updatePage:function(a){var b=this.pdfPageSource.pages[a];this.selected.pageIdx===a&&b.scrollIntoView();b.textLayer&&b.textLayer.updateMatches()},nextMatch:function(){var a=this.state.findPrevious,b=this.pdfPageSource.page-1,c=this.pdfPageSource.pages.length;this.active=!0;if(this.dirtyMatch){this.dirtyMatch=!1;this.selected.pageIdx=this.selected.matchIdx=-1;this.offset.pageIdx=b;this.offset.matchIdx=null;this.hadMatch=!1;this.resumePageIdx=null;this.pageMatches=[];for(var d=this,b=0;b<c;b++)this.updatePage(b),
+b in this.pendingFindMatches||(this.pendingFindMatches[b]=!0,this.extractTextPromises[b].then(function(a){delete d.pendingFindMatches[a];d.calcFindMatch(a)}))}if(""===this.state.query)this.updateUIState(FindStates.FIND_FOUND);else if(!this.resumePageIdx){c=this.offset;if(null!==c.matchIdx){b=this.pageMatches[c.pageIdx].length;if(!a&&c.matchIdx+1<b||a&&0<c.matchIdx){this.hadMatch=!0;c.matchIdx=a?c.matchIdx-1:c.matchIdx+1;this.updateMatch(!0);return}this.advanceOffsetPage(a)}this.nextPageMatch()}},
+matchesReady:function(a){var b=this.offset;a=a.length;var c=this.state.findPrevious;if(a)return this.hadMatch=!0,b.matchIdx=c?a-1:0,this.updateMatch(!0),!0;this.advanceOffsetPage(c);return b.wrapped&&(b.matchIdx=null,!this.hadMatch)?(this.updateMatch(!1),!0):!1},nextPageMatch:function(){null!==this.resumePageIdx&&console.error("There can only be one pending page.");do{var a=this.offset.pageIdx,b=this.pageMatches[a];if(!b){this.resumePageIdx=a;break}}while(!this.matchesReady(b))},advanceOffsetPage:function(a){var b=
+this.offset,c=this.extractTextPromises.length;b.pageIdx=a?b.pageIdx-1:b.pageIdx+1;b.matchIdx=null;if(b.pageIdx>=c||0>b.pageIdx)b.pageIdx=a?c-1:0,b.wrapped=!0},updateMatch:function(a){var b=FindStates.FIND_NOTFOUND,c=this.offset.wrapped;this.offset.wrapped=!1;a&&(a=this.selected.pageIdx,this.selected.pageIdx=this.offset.pageIdx,this.selected.matchIdx=this.offset.matchIdx,b=c?FindStates.FIND_WRAPPED:FindStates.FIND_FOUND,-1!==a&&a!==this.selected.pageIdx&&this.updatePage(a));this.updateUIState(b,this.state.findPrevious);
+-1!==this.selected.pageIdx&&this.updatePage(this.selected.pageIdx,!0)},updateUIState:function(a,b){this.integratedFind?FirefoxCom.request("updateFindControlState",{result:a,findPrevious:b}):PDFFindBar.updateUIState(a,b)}},PDFHistory={initialized:!1,initialDestination:null,initialize:function(a){function b(){var a=c._getPreviousParams(null,!0);a&&(c._pushToHistory(a,!1,!c.current.dest&&c.current.hash!==c.previousHash),c._updatePreviousBookmark());window.removeEventListener("beforeunload",b,!1)}if(!PDFJS.disableHistory&&
+!PDFView.isViewerEmbedded){this.initialized=!0;this.reInitialized=!1;this.historyUnlocked=this.allowHashChange=!0;this.previousHash=window.location.hash.substring(1);this.currentBookmark="";this.currentPage=0;this.updatePreviousBookmark=!1;this.previousBookmark="";this.previousPage=0;this.nextHashParam="";this.fingerprint=a;this.currentUid=this.uid=0;this.current={};a=window.history.state;this._isStateObjectDefined(a)?(a.target.dest?this.initialDestination=a.target.dest:PDFView.initialBookmark=a.target.hash,
+this.currentUid=a.uid,this.uid=a.uid+1,this.current=a.target):(a&&a.fingerprint&&this.fingerprint!==a.fingerprint&&(this.reInitialized=!0),this._pushOrReplaceState({fingerprint:this.fingerprint},!0));var c=this;window.addEventListener("popstate",function(a){a.preventDefault();a.stopPropagation();c.historyUnlocked&&(a.state?c._goTo(a.state):(c.previousHash=window.location.hash.substring(1),0===c.uid&&(a=c.previousHash&&c.currentBookmark&&c.previousHash!==c.currentBookmark?{hash:c.currentBookmark,page:c.currentPage}:
+{page:1},c.historyUnlocked=!1,c.allowHashChange=!1,window.history.back(),c._pushToHistory(a,!1,!0),window.history.forward(),c.historyUnlocked=!0),c._pushToHistory({hash:c.previousHash},!1,!0),c._updatePreviousBookmark()))},!1);window.addEventListener("beforeunload",b,!1);window.addEventListener("pageshow",function(a){window.addEventListener("beforeunload",b,!1)},!1)}},_isStateObjectDefined:function(a){return a&&0<=a.uid&&a.fingerprint&&this.fingerprint===a.fingerprint&&a.target&&a.target.hash?!0:
+!1},_pushOrReplaceState:function(a,b){b?window.history.replaceState(a,"",document.URL):window.history.pushState(a,"",document.URL)},get isHashChangeUnlocked(){if(!this.initialized)return!0;var a=this.allowHashChange;this.allowHashChange=!0;return a},_updatePreviousBookmark:function(){this.updatePreviousBookmark&&this.currentBookmark&&this.currentPage&&(this.previousBookmark=this.currentBookmark,this.previousPage=this.currentPage,this.updatePreviousBookmark=!1)},updateCurrentBookmark:function(a,b){this.initialized&&
+(this.currentBookmark=a.substring(1),this.currentPage=b|0,this._updatePreviousBookmark())},updateNextHashParam:function(a){this.initialized&&(this.nextHashParam=a)},push:function(a,b){if(this.initialized&&this.historyUnlocked)if(a.dest&&!a.hash&&(a.hash=this.current.hash&&this.current.dest&&this.current.dest===a.dest?this.current.hash:PDFView.getDestinationHash(a.dest).split("#")[1]),a.page&&(a.page|=0),b){var c=window.history.state.target;c||(this._pushToHistory(a,!1),this.previousHash=window.location.hash.substring(1));
+this.updatePreviousBookmark=this.nextHashParam?!1:!0;c&&this._updatePreviousBookmark()}else{if(this.nextHashParam){if(this.nextHashParam===a.hash){this.nextHashParam=null;this.updatePreviousBookmark=!0;return}this.nextHashParam=null}a.hash?this.current.hash?this.current.hash!==a.hash?this._pushToHistory(a,!0):(!this.current.page&&a.page&&this._pushToHistory(a,!1,!0),this.updatePreviousBookmark=!0):this._pushToHistory(a,!0):this.current.page&&a.page&&this.current.page!==a.page&&this._pushToHistory(a,
+!0)}},_getPreviousParams:function(a,b){if(!this.currentBookmark||!this.currentPage)return null;this.updatePreviousBookmark&&(this.updatePreviousBookmark=!1);if(0<this.uid&&(!this.previousBookmark||!this.previousPage))return null;if(!this.current.dest&&!a||b){if(this.previousBookmark===this.currentBookmark)return null}else if(this.current.page||a){if(this.previousPage===this.currentPage)return null}else return null;var c={hash:this.currentBookmark,page:this.currentPage};PresentationMode.active&&(c.hash=
+null);return c},_stateObj:function(a){return{fingerprint:this.fingerprint,uid:this.uid,target:a}},_pushToHistory:function(a,b,c){this.initialized&&(!a.hash&&a.page&&(a.hash="page="+a.page),b&&!c&&(b=this._getPreviousParams())&&this._pushToHistory(b,!1,!this.current.dest&&this.current.hash!==this.previousHash),this._pushOrReplaceState(this._stateObj(a),c||0===this.uid),this.currentUid=this.uid++,this.current=a,this.updatePreviousBookmark=!0)},_goTo:function(a){if(this.initialized&&this.historyUnlocked&&
+this._isStateObjectDefined(a)){if(!this.reInitialized&&a.uid<this.currentUid){var b=this._getPreviousParams(!0);if(b){this._pushToHistory(this.current,!1);this._pushToHistory(b,!1);this.currentUid=a.uid;window.history.back();return}}this.historyUnlocked=!1;a.target.dest?PDFView.navigateTo(a.target.dest):PDFView.setHash(a.target.hash);this.currentUid=a.uid;a.uid>this.uid&&(this.uid=a.uid);this.current=a.target;this.updatePreviousBookmark=!0;a=window.location.hash.substring(1);this.previousHash!==a&&
+(this.allowHashChange=!1);this.previousHash=a;this.historyUnlocked=!0}},back:function(){this.go(-1)},forward:function(){this.go(1)},go:function(a){if(this.initialized&&this.historyUnlocked){var b=window.history.state;-1===a&&b&&0<b.uid?window.history.back():1===a&&b&&b.uid<this.uid-1&&window.history.forward()}}},SecondaryToolbar={opened:!1,previousContainerHeight:null,newContainerHeight:null,initialize:function(a){this.toolbar=a.toolbar;this.presentationMode=a.presentationMode;this.documentProperties=
+a.documentProperties;this.buttonContainer=this.toolbar.firstElementChild;this.toggleButton=a.toggleButton;this.presentationModeButton=a.presentationModeButton;this.openFile=a.openFile;this.print=a.print;this.download=a.download;this.viewBookmark=a.viewBookmark;this.firstPage=a.firstPage;this.lastPage=a.lastPage;this.pageRotateCw=a.pageRotateCw;this.pageRotateCcw=a.pageRotateCcw;this.documentPropertiesButton=a.documentPropertiesButton;a=[{element:this.toggleButton,handler:this.toggle},{element:this.presentationModeButton,
+handler:this.presentationModeClick},{element:this.openFile,handler:this.openFileClick},{element:this.print,handler:this.printClick},{element:this.download,handler:this.downloadClick},{element:this.viewBookmark,handler:this.viewBookmarkClick},{element:this.firstPage,handler:this.firstPageClick},{element:this.lastPage,handler:this.lastPageClick},{element:this.pageRotateCw,handler:this.pageRotateCwClick},{element:this.pageRotateCcw,handler:this.pageRotateCcwClick},{element:this.documentPropertiesButton,
+handler:this.documentPropertiesClick}];for(var b in a){var c=a[b].element;c&&c.addEventListener("click",a[b].handler.bind(this))}},presentationModeClick:function(a){this.presentationMode.request();this.close()},openFileClick:function(a){document.getElementById("fileInput").click();this.close()},printClick:function(a){window.print();this.close()},downloadClick:function(a){PDFView.download();this.close()},viewBookmarkClick:function(a){this.close()},firstPageClick:function(a){PDFView.page=1;this.close()},
+lastPageClick:function(a){PDFView.page=PDFView.pdfDocument.numPages;this.close()},pageRotateCwClick:function(a){PDFView.rotatePages(90)},pageRotateCcwClick:function(a){PDFView.rotatePages(-90)},documentPropertiesClick:function(a){this.documentProperties.show();this.close()},setMaxHeight:function(a){a&&this.buttonContainer&&(this.newContainerHeight=a.clientHeight,this.previousContainerHeight!==this.newContainerHeight&&(this.buttonContainer.setAttribute("style","max-height: "+(this.newContainerHeight-
+SCROLLBAR_PADDING)+"px;"),this.previousContainerHeight=this.newContainerHeight))},open:function(){this.opened||(this.opened=!0,this.toggleButton.classList.add("toggled"),this.toolbar.classList.remove("hidden"))},close:function(a){!this.opened||a&&!this.toolbar.contains(a)||(this.opened=!1,this.toolbar.classList.add("hidden"),this.toggleButton.classList.remove("toggled"))},toggle:function(){this.opened?this.close():this.open()}},PasswordPrompt={visible:!1,updatePassword:null,reason:null,overlayContainer:null,
+passwordField:null,passwordText:null,passwordSubmit:null,passwordCancel:null,initialize:function(a){this.overlayContainer=a.overlayContainer;this.passwordField=a.passwordField;this.passwordText=a.passwordText;this.passwordSubmit=a.passwordSubmit;this.passwordCancel=a.passwordCancel;this.passwordSubmit.addEventListener("click",this.verifyPassword.bind(this));this.passwordCancel.addEventListener("click",this.hide.bind(this));this.passwordField.addEventListener("keydown",function(a){13===a.keyCode&&
+this.verifyPassword()}.bind(this));window.addEventListener("keydown",function(a){27===a.keyCode&&this.hide()}.bind(this))},show:function(){if(!this.visible){this.visible=!0;this.overlayContainer.classList.remove("hidden");this.overlayContainer.firstElementChild.classList.remove("hidden");this.passwordField.focus();var a=mozL10n.get("password_label",null,"Enter the password to open this PDF file.");this.reason===PDFJS.PasswordResponses.INCORRECT_PASSWORD&&(a=mozL10n.get("password_invalid",null,"Invalid password. Please try again."));
+this.passwordText.textContent=a}},hide:function(){this.visible&&(this.visible=!1,this.passwordField.value="",this.overlayContainer.classList.add("hidden"),this.overlayContainer.firstElementChild.classList.add("hidden"))},verifyPassword:function(){var a=this.passwordField.value;if(a&&0<a.length)return this.hide(),this.updatePassword(a)}},DELAY_BEFORE_HIDING_CONTROLS=3E3,SELECTOR="presentationControls",DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS=1E3,PresentationMode={active:!1,args:null,contextMenuOpen:!1,
+prevCoords:{x:null,y:null},initialize:function(a){this.container=a.container;this.secondaryToolbar=a.secondaryToolbar;this.viewer=this.container.firstElementChild;this.firstPage=a.firstPage;this.lastPage=a.lastPage;this.pageRotateCw=a.pageRotateCw;this.pageRotateCcw=a.pageRotateCcw;this.firstPage.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.firstPageClick()}.bind(this));this.lastPage.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.lastPageClick()}.bind(this));
+this.pageRotateCw.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.pageRotateCwClick()}.bind(this));this.pageRotateCcw.addEventListener("click",function(){this.contextMenuOpen=!1;this.secondaryToolbar.pageRotateCcwClick()}.bind(this))},get isFullscreen(){return document.fullscreenElement||document.mozFullScreen||document.webkitIsFullScreen||document.msFullscreenElement},_setSwitchInProgress:function(){this.switchInProgress&&clearTimeout(this.switchInProgress);this.switchInProgress=
+setTimeout(function(){delete this.switchInProgress}.bind(this),DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);PDFView.currentPosition=null},_resetSwitchInProgress:function(){this.switchInProgress&&(clearTimeout(this.switchInProgress),delete this.switchInProgress)},request:function(){if(!PDFView.supportsFullscreen||this.isFullscreen||!this.viewer.hasChildNodes())return!1;this._setSwitchInProgress();if(this.container.requestFullscreen)this.container.requestFullscreen();else if(this.container.mozRequestFullScreen)this.container.mozRequestFullScreen();
+else if(this.container.webkitRequestFullScreen)this.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);else if(this.container.msRequestFullscreen)this.container.msRequestFullscreen();else return!1;this.args={page:PDFView.page,previousScale:PDFView.currentScaleValue};return!0},enter:function(){this.active=!0;this._resetSwitchInProgress();setTimeout(function(){PDFView.page=this.args.page;PDFView.setScale("page-fit",!0)}.bind(this),0);window.addEventListener("mousemove",this.mouseMove,!1);
+window.addEventListener("mousedown",this.mouseDown,!1);window.addEventListener("contextmenu",this.contextMenu,!1);this.showControls();HandTool.enterPresentationMode();this.contextMenuOpen=!1;this.container.setAttribute("contextmenu","viewerContextMenu")},exit:function(){var a=PDFView.page;setTimeout(function(){this.active=!1;PDFView.setScale(this.args.previousScale);PDFView.page=a;this.args=null}.bind(this),0);window.removeEventListener("mousemove",this.mouseMove,!1);window.removeEventListener("mousedown",
+this.mouseDown,!1);window.removeEventListener("contextmenu",this.contextMenu,!1);this.hideControls();PDFView.clearMouseScrollState();HandTool.exitPresentationMode();this.container.removeAttribute("contextmenu");this.contextMenuOpen=!1;scrollIntoView(document.getElementById("thumbnailContainer"+a))},showControls:function(){this.controlsTimeout?clearTimeout(this.controlsTimeout):this.container.classList.add(SELECTOR);this.controlsTimeout=setTimeout(function(){this.container.classList.remove(SELECTOR);
+delete this.controlsTimeout}.bind(this),DELAY_BEFORE_HIDING_CONTROLS)},hideControls:function(){this.controlsTimeout&&(this.container.classList.remove(SELECTOR),clearTimeout(this.controlsTimeout),delete this.controlsTimeout)},mouseMove:function(a){a={x:a.clientX,y:a.clientY};var b=PresentationMode.prevCoords;PresentationMode.prevCoords=a;a.x===b.x&&a.y===b.y||PresentationMode.showControls()},mouseDown:function(a){var b=PresentationMode;b.contextMenuOpen?(b.contextMenuOpen=!1,a.preventDefault()):0!==
+a.button||a.target.href&&a.target.classList.contains("internalLink")||(a.preventDefault(),PDFView.page+=a.shiftKey?-1:1)},contextMenu:function(a){PresentationMode.contextMenuOpen=!0}};(function(){function a(a){PresentationMode.isFullscreen?PresentationMode.enter():PresentationMode.exit()}window.addEventListener("fullscreenchange",a,!1);window.addEventListener("mozfullscreenchange",a,!1);window.addEventListener("webkitfullscreenchange",a,!1);window.addEventListener("MSFullscreenChange",a,!1)})();"use strict";
+var GrabToPan=function(){function a(a){this.element=a.element;this.document=a.element.ownerDocument;"function"===typeof a.ignoreTarget&&(this.ignoreTarget=a.ignoreTarget);this.onActiveChanged=a.onActiveChanged;this.activate=this.activate.bind(this);this.deactivate=this.deactivate.bind(this);this.toggle=this.toggle.bind(this);this._onmousedown=this._onmousedown.bind(this);this._onmousemove=this._onmousemove.bind(this);this._endPan=this._endPan.bind(this);(this.overlay=document.createElement("div")).className=
+"grab-to-pan-grabbing"}a.prototype={CSS_CLASS_GRAB:"grab-to-pan-grab",activate:function(){if(!this.active&&(this.active=!0,this.element.addEventListener("mousedown",this._onmousedown,!0),this.element.classList.add(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!0)},deactivate:function(){if(this.active&&(this.active=!1,this.element.removeEventListener("mousedown",this._onmousedown,!0),this._endPan(),this.element.classList.remove(this.CSS_CLASS_GRAB),this.onActiveChanged))this.onActiveChanged(!1)},
+toggle:function(){this.active?this.deactivate():this.activate()},ignoreTarget:function(a){return a[b]("a[href], a[href] *, input, textarea, button, button *, select, option")},_onmousedown:function(a){if(0===a.button&&!this.ignoreTarget(a.target)){if(a.originalTarget)try{a.originalTarget.tagName}catch(b){return}this.scrollLeftStart=this.element.scrollLeft;this.scrollTopStart=this.element.scrollTop;this.clientXStart=a.clientX;this.clientYStart=a.clientY;this.document.addEventListener("mousemove",this._onmousemove,
+!0);this.document.addEventListener("mouseup",this._endPan,!0);this.element.addEventListener("scroll",this._endPan,!0);a.preventDefault();a.stopPropagation();this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING)}},_onmousemove:function(a){this.element.removeEventListener("scroll",this._endPan,!0);var b;b="buttons"in a&&c?!(a.buttons|1):e||f?0===a.which:void 0;b?this._endPan():(b=a.clientX-this.clientXStart,this.element.scrollTop=this.scrollTopStart-(a.clientY-this.clientYStart),this.element.scrollLeft=
+this.scrollLeftStart-b,this.overlay.parentNode||document.body.appendChild(this.overlay))},_endPan:function(){this.element.removeEventListener("scroll",this._endPan,!0);this.document.removeEventListener("mousemove",this._onmousemove,!0);this.document.removeEventListener("mouseup",this._endPan,!0);this.overlay.parentNode&&this.overlay.parentNode.removeChild(this.overlay)}};var b;["webkitM","mozM","msM","oM","m"].some(function(a){a+="atches";a in document.documentElement&&(b=a);a+="Selector";a in document.documentElement&&
+(b=a);return b});var c=!document.documentMode||9<document.documentMode,d=window.chrome,e=d&&(d.webstore||d.app),f=/Apple/.test(navigator.vendor)&&/Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);return a}(),HandTool={initialize:function(a){var b=a.toggleHandTool;this.handTool=new GrabToPan({element:a.container,onActiveChanged:function(a){b&&(a?(b.title=mozL10n.get("hand_tool_disable.title",null,"Disable hand tool"),b.firstElementChild.textContent=mozL10n.get("hand_tool_disable_label",null,
+"Disable hand tool")):(b.title=mozL10n.get("hand_tool_enable.title",null,"Enable hand tool"),b.firstElementChild.textContent=mozL10n.get("hand_tool_enable_label",null,"Enable hand tool")))}});b&&(b.addEventListener("click",this.toggle.bind(this),!1),window.addEventListener("localized",function(a){Preferences.get("enableHandToolOnLoad").then(function(a){a&&this.handTool.activate()}.bind(this))}.bind(this)))},toggle:function(){this.handTool.toggle();SecondaryToolbar.close()},enterPresentationMode:function(){this.handTool.active&&
+(this.wasActive=!0,this.handTool.deactivate())},exitPresentationMode:function(){this.wasActive&&(this.wasActive=null,this.handTool.activate())}},DocumentProperties={overlayContainer:null,fileName:"",fileSize:"",visible:!1,fileNameField:null,fileSizeField:null,titleField:null,authorField:null,subjectField:null,keywordsField:null,creationDateField:null,modificationDateField:null,creatorField:null,producerField:null,versionField:null,pageCountField:null,initialize:function(a){this.overlayContainer=a.overlayContainer;
+this.fileNameField=a.fileNameField;this.fileSizeField=a.fileSizeField;this.titleField=a.titleField;this.authorField=a.authorField;this.subjectField=a.subjectField;this.keywordsField=a.keywordsField;this.creationDateField=a.creationDateField;this.modificationDateField=a.modificationDateField;this.creatorField=a.creatorField;this.producerField=a.producerField;this.versionField=a.versionField;this.pageCountField=a.pageCountField;a.closeButton&&a.closeButton.addEventListener("click",this.hide.bind(this));
+this.dataAvailablePromise=new Promise(function(a){this.resolveDataAvailable=a}.bind(this));window.addEventListener("keydown",function(a){27===a.keyCode&&this.hide()}.bind(this))},getProperties:function(){this.visible&&(this.fileName=getPDFFileNameFromURL(PDFView.url),PDFView.pdfDocument.getDownloadInfo().then(function(a){this.setFileSize(a.length);this.updateUI(this.fileSizeField,this.fileSize)}.bind(this)),PDFView.pdfDocument.getMetadata().then(function(a){a=[{field:this.fileNameField,content:this.fileName},
+{field:this.titleField,content:a.info.Title},{field:this.authorField,content:a.info.Author},{field:this.subjectField,content:a.info.Subject},{field:this.keywordsField,content:a.info.Keywords},{field:this.creationDateField,content:this.parseDate(a.info.CreationDate)},{field:this.modificationDateField,content:this.parseDate(a.info.ModDate)},{field:this.creatorField,content:a.info.Creator},{field:this.producerField,content:a.info.Producer},{field:this.versionField,content:a.info.PDFFormatVersion},{field:this.pageCountField,
+content:PDFView.pdfDocument.numPages}];for(var b in a){var c=a[b];this.updateUI(c.field,c.content)}}.bind(this)))},updateUI:function(a,b){a&&void 0!==b&&""!==b&&(a.textContent=b)},setFileSize:function(a){var b=a/1024;this.fileSize=1024>b?mozL10n.get("document_properties_kb",{size_kb:(+b.toPrecision(3)).toLocaleString(),size_b:a.toLocaleString()},"{{size_kb}} KB ({{size_b}} bytes)"):mozL10n.get("document_properties_mb",{size_mb:(+(b/1024).toPrecision(3)).toLocaleString(),size_b:a.toLocaleString()},
+"{{size_mb}} MB ({{size_b}} bytes)")},show:function(){this.visible||(this.visible=!0,this.overlayContainer.classList.remove("hidden"),this.overlayContainer.lastElementChild.classList.remove("hidden"),this.dataAvailablePromise.then(function(){this.getProperties()}.bind(this)))},hide:function(){this.visible&&(this.visible=!1,this.overlayContainer.classList.add("hidden"),this.overlayContainer.lastElementChild.classList.add("hidden"))},parseDate:function(a){var b=a;if(void 0===b)return"";"D:"===b.substring(0,
+2)&&(b=b.substring(2));a=parseInt(b.substring(0,4),10);var c=parseInt(b.substring(4,6),10)-1,d=parseInt(b.substring(6,8),10),e=parseInt(b.substring(8,10),10),f=parseInt(b.substring(10,12),10),g=parseInt(b.substring(12,14),10),h=b.substring(14,15),k=parseInt(b.substring(15,17),10),b=parseInt(b.substring(18,20),10);"-"==h?(e+=k,f+=b):"+"==h&&(e-=k,f+=b);c=new Date(Date.UTC(a,c,d,e,f,g));a=c.toLocaleDateString();c=c.toLocaleTimeString();return mozL10n.get("document_properties_date_string",{date:a,time:c},
+"{{date}}, {{time}}")}},PDFView={pages:[],thumbnails:[],currentScale:UNKNOWN_SCALE,currentScaleValue:null,initialBookmark:document.location.hash.substring(1),container:null,thumbnailContainer:null,initialized:!1,fellback:!1,pdfDocument:null,sidebarOpen:!1,pageViewScroll:null,thumbnailViewScroll:null,pageRotation:0,mouseScrollTimeStamp:0,mouseScrollDelta:0,lastScroll:0,previousPageNumber:1,isViewerEmbedded:window.parent!==window,idleTimeout:null,currentPosition:null,initialize:function(){var a=this,
+b=this.container=document.getElementById("viewerContainer");this.pageViewScroll={};this.watchScroll(b,this.pageViewScroll,updateViewarea);var c=this.thumbnailContainer=document.getElementById("thumbnailView");this.thumbnailViewScroll={};this.watchScroll(c,this.thumbnailViewScroll,this.renderHighestPriority.bind(this));Preferences.initialize();PDFFindBar.initialize({bar:document.getElementById("findbar"),toggleButton:document.getElementById("viewFind"),findField:document.getElementById("findInput"),
+highlightAllCheckbox:document.getElementById("findHighlightAll"),caseSensitiveCheckbox:document.getElementById("findMatchCase"),findMsg:document.getElementById("findMsg"),findStatusIcon:document.getElementById("findStatusIcon"),findPreviousButton:document.getElementById("findPrevious"),findNextButton:document.getElementById("findNext")});PDFFindController.initialize({pdfPageSource:this,integratedFind:this.supportsIntegratedFind});HandTool.initialize({container:b,toggleHandTool:document.getElementById("toggleHandTool")});
+SecondaryToolbar.initialize({toolbar:document.getElementById("secondaryToolbar"),presentationMode:PresentationMode,toggleButton:document.getElementById("secondaryToolbarToggle"),presentationModeButton:document.getElementById("secondaryPresentationMode"),openFile:document.getElementById("secondaryOpenFile"),print:document.getElementById("secondaryPrint"),download:document.getElementById("secondaryDownload"),viewBookmark:document.getElementById("secondaryViewBookmark"),firstPage:document.getElementById("firstPage"),
+lastPage:document.getElementById("lastPage"),pageRotateCw:document.getElementById("pageRotateCw"),pageRotateCcw:document.getElementById("pageRotateCcw"),documentProperties:DocumentProperties,documentPropertiesButton:document.getElementById("documentProperties")});PasswordPrompt.initialize({overlayContainer:document.getElementById("overlayContainer"),passwordField:document.getElementById("password"),passwordText:document.getElementById("passwordText"),passwordSubmit:document.getElementById("passwordSubmit"),
+passwordCancel:document.getElementById("passwordCancel")});PresentationMode.initialize({container:b,secondaryToolbar:SecondaryToolbar,firstPage:document.getElementById("contextFirstPage"),lastPage:document.getElementById("contextLastPage"),pageRotateCw:document.getElementById("contextPageRotateCw"),pageRotateCcw:document.getElementById("contextPageRotateCcw")});DocumentProperties.initialize({overlayContainer:document.getElementById("overlayContainer"),closeButton:document.getElementById("documentPropertiesClose"),
+fileNameField:document.getElementById("fileNameField"),fileSizeField:document.getElementById("fileSizeField"),titleField:document.getElementById("titleField"),authorField:document.getElementById("authorField"),subjectField:document.getElementById("subjectField"),keywordsField:document.getElementById("keywordsField"),creationDateField:document.getElementById("creationDateField"),modificationDateField:document.getElementById("modificationDateField"),creatorField:document.getElementById("creatorField"),
+producerField:document.getElementById("producerField"),versionField:document.getElementById("versionField"),pageCountField:document.getElementById("pageCountField")});b.addEventListener("scroll",function(){a.lastScroll=Date.now()},!1);return Promise.all([Preferences.get("enableWebGL").then(function(a){PDFJS.disableWebGL=!a})]).then(function(){PDFView.initialized=!0})},getPage:function(a){return this.pdfDocument.getPage(a)},watchScroll:function(a,b,c){b.down=!0;b.lastY=a.scrollTop;a.addEventListener("scroll",
+function(d){d=a.scrollTop;var e=b.lastY;d>e?b.down=!0:d<e&&(b.down=!1);b.lastY=d;c()},!0)},_setScaleUpdatePages:function(a,b,c,d){this.currentScaleValue=b;if(a!==this.currentScale){b=0;for(var e=this.pages.length;b<e;b++)this.pages[b].update(a);this.currentScale=a;if(!d){d=this.page;var f;this.currentPosition&&!IGNORE_CURRENT_POSITION_ON_ZOOM&&(d=this.currentPosition.page,f=[null,{name:"XYZ"},this.currentPosition.left,this.currentPosition.top,null]);this.pages[d-1].scrollIntoView(f)}f=document.createEvent("UIEvents");
+f.initUIEvent("scalechange",!1,!1,window,0);f.scale=a;f.resetAutoSettings=c;window.dispatchEvent(f)}},setScale:function(a,b,c){if("custom"!==a){var d=parseFloat(a);if(0<d)this._setScaleUpdatePages(d,a,!0,c);else{var e=this.pages[this.page-1];if(e){d=(this.container.clientWidth-(PresentationMode.active?0:SCROLLBAR_PADDING))/e.width*e.scale;e=(this.container.clientHeight-(PresentationMode.active?0:VERTICAL_PADDING))/e.height*e.scale;switch(a){case "page-actual":d=1;break;case "page-width":break;case "page-height":d=
+e;break;case "page-fit":d=Math.min(d,e);break;case "auto":d=Math.min(MAX_AUTO_SCALE,d);break;default:console.error("pdfViewSetScale: '"+a+"' is an unknown zoom value.");return}this._setScaleUpdatePages(d,a,b,c);selectScaleOption(a)}}}},zoomIn:function(a){var b=this.currentScale;do b=(b*DEFAULT_SCALE_DELTA).toFixed(2),b=Math.ceil(10*b)/10,b=Math.min(MAX_SCALE,b);while(--a&&b<MAX_SCALE);this.setScale(b,!0)},zoomOut:function(a){var b=this.currentScale;do b=(b/DEFAULT_SCALE_DELTA).toFixed(2),b=Math.floor(10*
+b)/10,b=Math.max(MIN_SCALE,b);while(--a&&b>MIN_SCALE);this.setScale(b,!0)},set page(a){var b=this.pages,c=document.createEvent("UIEvents");c.initUIEvent("pagechange",!1,!1,window,0);0<a&&a<=b.length?(b[a-1].updateStats(),this.previousPageNumber=currentPageNumber,currentPageNumber=a,c.pageNumber=a,window.dispatchEvent(c),updateViewarea.inProgress||this.loading&&1===a||b[a-1].scrollIntoView()):(this.previousPageNumber=a,c.pageNumber=this.page,window.dispatchEvent(c))},get page(){return currentPageNumber},
+get supportsPrinting(){var a="mozPrintCallback"in document.createElement("canvas");Object.defineProperty(this,"supportsPrinting",{value:a,enumerable:!0,configurable:!0,writable:!1});return a},get supportsFullscreen(){var a=document.documentElement,a=a.requestFullscreen||a.mozRequestFullScreen||a.webkitRequestFullScreen||a.msRequestFullscreen;if(!1===document.fullscreenEnabled||!1===document.mozFullScreenEnabled||!1===document.webkitFullscreenEnabled||!1===document.msFullscreenEnabled)a=!1;Object.defineProperty(this,
+"supportsFullscreen",{value:a,enumerable:!0,configurable:!0,writable:!1});return a},get supportsIntegratedFind(){Object.defineProperty(this,"supportsIntegratedFind",{value:!1,enumerable:!0,configurable:!0,writable:!1});return!1},get supportsDocumentFonts(){Object.defineProperty(this,"supportsDocumentFonts",{value:!0,enumerable:!0,configurable:!0,writable:!1});return!0},get supportsDocumentColors(){Object.defineProperty(this,"supportsDocumentColors",{value:!0,enumerable:!0,configurable:!0,writable:!1});
+return!0},get loadingBar(){var a=new ProgressBar("#loadingBar",{});Object.defineProperty(this,"loadingBar",{value:a,enumerable:!0,configurable:!0,writable:!1});return a},get isHorizontalScrollbarEnabled(){return PresentationMode.active?!1:this.container.scrollWidth>this.container.clientWidth},setTitleUsingUrl:function(a){this.url=a;try{this.setTitle(decodeURIComponent(getFileName(a))||a)}catch(b){this.setTitle(a)}},setTitle:function(a){document.title=a},close:function(){document.getElementById("errorWrapper").setAttribute("hidden",
+"true");if(this.pdfDocument){this.pdfDocument.destroy();this.pdfDocument=null;for(var a=document.getElementById("thumbnailView");a.hasChildNodes();)a.removeChild(a.lastChild);"_loadingInterval"in a&&clearInterval(a._loadingInterval);for(a=document.getElementById("viewer");a.hasChildNodes();)a.removeChild(a.lastChild);"undefined"!==typeof PDFBug&&PDFBug.cleanup()}},open:function(a,b,c,d,e){this.pdfDocument&&Preferences.reload();this.close();c={password:c};"string"===typeof a?(this.setTitleUsingUrl(a),
+c.url=a):a&&"byteLength"in a&&(c.data=a);if(e)for(var f in e)c[f]=e[f];var g=this;g.loading=!0;g.downloadComplete=!1;PDFJS.getDocument(c,d,function(a,b){PasswordPrompt.updatePassword=a;PasswordPrompt.reason=b;PasswordPrompt.show()},function(a){g.progress(a.loaded/a.total)}).then(function(a){g.load(a,b);g.loading=!1},function(a,b){var c=mozL10n.get("loading_error",null,"An error occurred while loading the PDF.");b&&"InvalidPDFException"===b.name&&(c=mozL10n.get("invalid_file_error",null,"Invalid or corrupted PDF file."));
+b&&"MissingPDFException"===b.name&&(c=mozL10n.get("missing_file_error",null,"Missing PDF file."));g.error(c,{message:a});g.loading=!1})},download:function(){function a(){d.downloadUrl(b,c)}var b=this.url.split("#")[0],c=getPDFFileNameFromURL(b),d=new DownloadManager;d.onerror=function(a){PDFView.error("PDF failed to download.")};this.pdfDocument?this.downloadComplete?this.pdfDocument.getData().then(function(a){a=PDFJS.createBlob(a,"application/pdf");d.download(a,b,c)},a).then(null,a):a():a()},fallback:function(a){},
+navigateTo:function(a){var b="",c=this,d=function(e){c.pendingRefStr=null;var f=e instanceof Object?c.pagesRefMap[e.num+" "+e.gen+" R"]:e+1;f?(f>c.pages.length&&(f=c.pages.length),c.pages[f-1].scrollIntoView(a),PDFHistory.push({dest:a,hash:b,page:f})):c.pdfDocument.getPageIndex(e).then(function(a){c.pagesRefMap[e.num+" "+e.gen+" R"]=a+1;d(e)})};this.destinationsPromise.then(function(){"string"===typeof a&&(b=a,a=c.destinations[a]);a instanceof Array&&d(a[0])})},getDestinationHash:function(a){if("string"===
+typeof a)return PDFView.getAnchorUrl("#"+escape(a));if(a instanceof Array){var b=a[0];if(b=b instanceof Object?this.pagesRefMap[b.num+" "+b.gen+" R"]:b+1){var b=PDFView.getAnchorUrl("#page="+b),c=a[1];if("object"===typeof c&&"name"in c&&"XYZ"==c.name){var c=a[4]||this.currentScaleValue,d=parseFloat(c);d&&(c=100*d);b+="&zoom="+c;if(a[2]||a[3])b+=","+(a[2]||0)+","+(a[3]||0)}return b}}return""},getAnchorUrl:function(a){return a},error:function(a,b){var c=mozL10n.get("error_version_info",{version:PDFJS.version||
+"?",build:PDFJS.build||"?"},"PDF.js v{{version}} (build: {{build}})")+"\n";b&&(c+=mozL10n.get("error_message",{message:b.message},"Message: {{message}}"),b.stack?c+="\n"+mozL10n.get("error_stack",{stack:b.stack},"Stack: {{stack}}"):(b.filename&&(c+="\n"+mozL10n.get("error_file",{file:b.filename},"File: {{file}}")),b.lineNumber&&(c+="\n"+mozL10n.get("error_line",{line:b.lineNumber},"Line: {{line}}"))));var d=document.getElementById("errorWrapper");d.removeAttribute("hidden");document.getElementById("errorMessage").textContent=
+a;var e=document.getElementById("errorClose");e.onclick=function(){d.setAttribute("hidden","true")};var f=document.getElementById("errorMoreInfo"),g=document.getElementById("errorShowMore"),h=document.getElementById("errorShowLess");g.onclick=function(){f.removeAttribute("hidden");g.setAttribute("hidden","true");h.removeAttribute("hidden");f.style.height=f.scrollHeight+"px"};h.onclick=function(){f.setAttribute("hidden","true");g.removeAttribute("hidden");h.setAttribute("hidden","true")};g.oncontextmenu=
+noContextMenuHandler;h.oncontextmenu=noContextMenuHandler;e.oncontextmenu=noContextMenuHandler;g.removeAttribute("hidden");h.setAttribute("hidden","true");f.value=c},progress:function(a){a=Math.round(100*a);a>PDFView.loadingBar.percent&&(PDFView.loadingBar.percent=a)},load:function(a,b){function c(a,b){a.onAfterDraw=function(){e||(e=!0,f());b.setImage(a.canvas)}}var d=this,e=!1,f=null,g=new Promise(function(a){f=a});PDFFindController.reset();this.pdfDocument=a;DocumentProperties.resolveDataAvailable();
+var h=a.getDownloadInfo().then(function(){d.downloadComplete=!0;PDFView.loadingBar.hide();document.getElementById("outerContainer").classList.remove("loadingInProgress")}),k=a.numPages,m=a.fingerprint;document.getElementById("numPages").textContent=mozL10n.get("page_of",{pageCount:k},"of {{pageCount}}");document.getElementById("pageNumber").max=k;PDFView.documentFingerprint=m;var p=PDFView.store=new ViewHistory(m);this.pageRotation=0;var u=this.pages=[],v=this.pagesRefMap={},y=this.thumbnails=[],
+q;this.pagesPromise=m=new Promise(function(a){q=a});var l=a.getPage(1),r=document.getElementById("viewer"),n=document.getElementById("thumbnailView");l.then(function(e){e=e.getViewport((b||1)*CSS_UNITS);for(var f=1;f<=k;++f){var m=e.clone(),p=new PageView(r,f,b,d.navigateTo.bind(d),m),m=new ThumbnailView(n,f,m);c(p,m);u.push(p);y.push(m)}g.then(function(){if(PDFJS.disableAutoFetch)q();else for(var b=k,c=1;c<=k;++c)a.getPage(c).then(function(a,c){var d=u[a-1];d.pdfPage||d.setPdfPage(c);v[c.ref.num+
+" "+c.ref.gen+" R"]=a;b--;b||q()}.bind(null,c))});h.then(function(){var a=document.createEvent("CustomEvent");a.initCustomEvent("documentload",!0,!0,{});window.dispatchEvent(a)});PDFView.loadingBar.setWidth(r);PDFFindController.resolveFirstPage();PDFHistory.initialize(d.documentFingerprint)});var w,t=Preferences.get("showPreviousViewOnLoad").then(function(a){w=a}),x,z=Preferences.get("defaultZoomValue").then(function(a){x=a});Promise.all([l,p.initializedPromise,t,z]).then(function(){var a=null;if(w&&
+p.get("exists",!1))var a=p.get("page","1"),c=x||p.get("zoom",PDFView.currentScale),e=p.get("scrollLeft","0"),g=p.get("scrollTop","0"),a="page="+a+"&zoom="+c+","+e+","+g;else x&&(a="page=1&zoom="+x);d.setInitialView(a,b);d.isViewerEmbedded||d.container.focus()},function(a){console.error(a);l.then(function(){d.setInitialView(null,b)})});m.then(function(){PDFView.supportsPrinting&&a.getJavaScript().then(function(a){a.length&&(console.warn("Warning: JavaScript is not supported"),PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript));
+for(var b=/\bprint\s*\(/g,c=0,d=a.length;c<d;c++){var e=a[c];if(e&&b.test(e)){setTimeout(function(){window.print()});break}}})});t=this.destinationsPromise=a.getDestinations();t.then(function(a){d.destinations=a});Promise.all([m,t,PDFView.animationStartedPromise]).then(function(){a.getOutline().then(function(a){d.outline=new DocumentOutlineView(a);document.getElementById("viewOutline").disabled=!a;a&&Preferences.get("ifAvailableShowOutlineOnLoad").then(function(a){a&&(d.sidebarOpen||document.getElementById("sidebarToggle").click(),
+d.switchSidebarView("outline"))})});a.getAttachments().then(function(a){d.attachments=new DocumentAttachmentsView(a);document.getElementById("viewAttachments").disabled=!a})});a.getMetadata().then(function(b){var c=b.info;b=b.metadata;d.documentInfo=c;d.metadata=b;console.log("PDF "+a.fingerprint+" ["+c.PDFFormatVersion+" "+(c.Producer||"-").trim()+" / "+(c.Creator||"-").trim()+"] (PDF.js: "+(PDFJS.version||"-")+(PDFJS.disableWebGL?"":" [WebGL]")+")");var e;b&&b.has("dc:title")&&(e=b.get("dc:title"));
+!e&&c&&c.Title&&(e=c.Title);e&&d.setTitle(e+" - "+document.title);c.IsAcroFormPresent&&(console.warn("Warning: AcroForm/XFA is not supported"),PDFView.fallback(PDFJS.UNSUPPORTED_FEATURES.forms))})},setInitialView:function(a,b){this.currentScale=0;this.currentScaleValue=null;document.getElementById("pageNumber").value=currentPageNumber=1;this.currentPosition=null;PDFHistory.initialDestination?(this.navigateTo(PDFHistory.initialDestination),PDFHistory.initialDestination=null):this.initialBookmark?(this.setHash(this.initialBookmark),
+PDFHistory.push({hash:this.initialBookmark},!!this.initialBookmark),this.initialBookmark=null):a?this.setHash(a):b&&(this.setScale(b,!0),this.page=1);PDFView.currentScale===UNKNOWN_SCALE&&this.setScale(DEFAULT_SCALE,!0)},renderHighestPriority:function(){PDFView.idleTimeout&&(clearTimeout(PDFView.idleTimeout),PDFView.idleTimeout=null);var a=this.getVisiblePages();if(a=this.getHighestPriority(a,this.pages,this.pageViewScroll.down))this.renderView(a,"page");else{if(this.sidebarOpen&&(a=this.getVisibleThumbs(),
+a=this.getHighestPriority(a,this.thumbnails,this.thumbnailViewScroll.down))){this.renderView(a,"thumbnail");return}PDFView.idleTimeout=setTimeout(function(){PDFView.cleanup()},CLEANUP_TIMEOUT)}},cleanup:function(){for(var a=0,b=this.pages.length;a<b;a++)this.pages[a]&&this.pages[a].renderingState!==RenderingStates.FINISHED&&this.pages[a].reset();this.pdfDocument.cleanup()},getHighestPriority:function(a,b,c){var d=a.views,e=d.length;if(0===e)return!1;for(var f=0;f<e;++f){var g=d[f].view;if(!this.isViewFinished(g))return g}a=
+c?a.last.id:a.first.id-2;return b[a]&&!this.isViewFinished(b[a])?b[a]:!1},isViewFinished:function(a){return a.renderingState===RenderingStates.FINISHED},renderView:function(a,b){switch(a.renderingState){case RenderingStates.FINISHED:return!1;case RenderingStates.PAUSED:PDFView.highestPriorityPage=b+a.id;a.resume();break;case RenderingStates.RUNNING:PDFView.highestPriorityPage=b+a.id;break;case RenderingStates.INITIAL:PDFView.highestPriorityPage=b+a.id,a.draw(this.renderHighestPriority.bind(this))}return!0},
+setHash:function(a){if(a)if(0<=a.indexOf("="))if(a=PDFView.parseQueryString(a),"nameddest"in a)PDFHistory.updateNextHashParam(a.nameddest),PDFView.navigateTo(a.nameddest);else{var b,c;"page"in a&&(b=a.page|0||1);if("zoom"in a){c=a.zoom.split(",");var d=c[0],e=parseFloat(d);e&&(d=e/100);c=[null,{name:"XYZ"},1<c.length?c[1]|0:null,2<c.length?c[2]|0:null,d]}c?this.pages[(b||this.page)-1].scrollIntoView(c):b&&(this.page=b);"pagemode"in a&&(b=document.getElementById("sidebarToggle"),"thumbs"===a.pagemode||
+"bookmarks"===a.pagemode||"attachments"===a.pagemode?(this.sidebarOpen||b.click(),this.switchSidebarView("bookmarks"===a.pagemode?"outline":a.pagemode)):"none"===a.pagemode&&this.sidebarOpen&&b.click())}else/^\d+$/.test(a)?this.page=a:(PDFHistory.updateNextHashParam(unescape(a)),PDFView.navigateTo(unescape(a)))},switchSidebarView:function(a){var b=document.getElementById("thumbnailView"),c=document.getElementById("outlineView"),d=document.getElementById("attachmentsView"),e=document.getElementById("viewThumbnail"),
+f=document.getElementById("viewOutline"),g=document.getElementById("viewAttachments");switch(a){case "thumbs":a=b.classList.contains("hidden");e.classList.add("toggled");f.classList.remove("toggled");g.classList.remove("toggled");b.classList.remove("hidden");c.classList.add("hidden");d.classList.add("hidden");PDFView.renderHighestPriority();a&&scrollIntoView(document.getElementById("thumbnailContainer"+this.page));break;case "outline":e.classList.remove("toggled");f.classList.add("toggled");g.classList.remove("toggled");
+b.classList.add("hidden");c.classList.remove("hidden");d.classList.add("hidden");if(f.getAttribute("disabled"))break;break;case "attachments":e.classList.remove("toggled"),f.classList.remove("toggled"),g.classList.add("toggled"),b.classList.add("hidden"),c.classList.add("hidden"),d.classList.remove("hidden"),g.getAttribute("disabled")}},getVisiblePages:function(){if(PresentationMode.active){var a=[],b=this.pages[this.page-1];a.push({id:b.id,view:b});return{first:b,last:b,views:a}}return this.getVisibleElements(this.container,
+this.pages,!0)},getVisibleThumbs:function(){return this.getVisibleElements(this.thumbnailContainer,this.thumbnails)},getVisibleElements:function(a,b,c){var d=a.scrollTop,e=d+a.clientHeight,f=a.scrollLeft,g=f+a.clientWidth;a=[];for(var h,k,m,p,u,v=0,y=b.length;v<y;++v)if(h=b[v],k=h.el.offsetTop+h.el.clientTop,m=h.el.clientHeight,!(k+m<d)){if(k>e)break;u=h.el.offsetLeft+h.el.clientLeft;p=h.el.clientWidth;u+p<f||u>g||(p=Math.max(0,d-k)+Math.max(0,k+m-e),m=100*(m-p)/m|0,a.push({id:h.id,x:u,y:k,view:h,
+percent:m}))}b=a[0];d=a[a.length-1];c&&a.sort(function(a,b){var c=a.percent-b.percent;return.001<Math.abs(c)?-c:a.id-b.id});return{first:b,last:d,views:a}},parseQueryString:function(a){a=a.split("&");for(var b={},c=0,d=a.length;c<d;++c){var e=a[c].split("="),f=1<e.length?e[1]:null;b[decodeURIComponent(e[0])]=decodeURIComponent(f)}return b},beforePrint:function(){if(this.supportsPrinting){var a=!1,b,c;if(this.pages.length)for(b=0,c=this.pages.length;b<c;++b){if(!this.pages[b].pdfPage){a=!0;break}}else a=
+!0;if(a)a=mozL10n.get("printing_not_ready",null,"Warning: The PDF is not fully loaded for printing."),window.alert(a);else for(document.querySelector("body").setAttribute("data-mozPrintCallback",!0),b=0,c=this.pages.length;b<c;++b)this.pages[b].beforePrint()}else a=mozL10n.get("printing_not_supported",null,"Warning: Printing is not fully supported by this browser."),this.error(a)},afterPrint:function(){for(var a=document.getElementById("printContainer");a.hasChildNodes();)a.removeChild(a.lastChild)},
+rotatePages:function(a){var b=this.pages[this.page-1],c;this.pageRotation=(this.pageRotation+360+a)%360;a=0;for(c=this.pages.length;a<c;a++){var d=this.pages[a];d.update(d.scale,this.pageRotation)}a=0;for(c=this.thumbnails.length;a<c;a++)this.thumbnails[a].update(this.pageRotation);this.setScale(this.currentScaleValue,!0,!0);this.renderHighestPriority();b&&b.scrollIntoView()},mouseScroll:function(a){var b=(new Date).getTime(),c=this.mouseScrollTimeStamp;b>c&&50>b-c||((0<this.mouseScrollDelta&&0>a||
+0>this.mouseScrollDelta&&0<a)&&this.clearMouseScrollState(),this.mouseScrollDelta+=a,120<=Math.abs(this.mouseScrollDelta)&&(a=0<this.mouseScrollDelta?-1:1,this.clearMouseScrollState(),c=this.page,1==c&&-1==a||c==this.pages.length&&1==a||(this.page+=a,this.mouseScrollTimeStamp=b)))},clearMouseScrollState:function(){this.mouseScrollDelta=this.mouseScrollTimeStamp=0}},PageView=function(a,b,c,d,e){function f(a,b,c){function d(a,b){a.href=PDFView.getDestinationHash(b);a.onclick=function(){b&&PDFView.navigateTo(b);
+return!1};b&&(a.className="internalLink")}function e(a,b){a.href=PDFView.getAnchorUrl("");a.onclick=function(){switch(b){case "GoToPage":document.getElementById("pageNumber").focus();break;case "GoBack":PDFHistory.back();break;case "GoForward":PDFHistory.forward();break;case "Find":PDFView.supportsIntegratedFind||PDFFindBar.toggle();break;case "NextPage":PDFView.page++;break;case "PrevPage":PDFView.page--;break;case "LastPage":PDFView.page=PDFView.pages.length;break;case "FirstPage":PDFView.page=
+1}return!1};a.className="internalLink"}b.getAnnotations().then(function(g){c=c.clone({dontFlip:!0});var f="matrix("+c.transform.join(",")+")",l,r,n,w;if(h.annotationLayer){n=0;for(w=g.length;n<w;n++)l=g[n],(r=h.annotationLayer.querySelector('[data-annotation-id="'+l.id+'"]'))&&CustomStyle.setProp("transform",r,f);h.annotationLayer.removeAttribute("hidden")}else for(n=0,w=g.length;n<w;n++){l=g[n];var t=PDFJS.Annotation.fromData(l);if(t&&t.hasHtml()){r=t.getHtmlElement(b.commonObjs);r.setAttribute("data-annotation-id",
+l.id);mozL10n.translate(r);l=t.getData();var t=l.rect,x=b.view,t=PDFJS.Util.normalizeRect([t[0],x[3]-t[1]+x[1],t[2],x[3]-t[3]+x[1]]);r.style.left=t[0]+"px";r.style.top=t[1]+"px";r.style.position="absolute";CustomStyle.setProp("transform",r,f);CustomStyle.setProp("transformOrigin",r,-t[0]+"px "+-t[1]+"px");"Link"!==l.subtype||l.url||(t=r.getElementsByTagName("a")[0])&&(l.action?e(t,l.action):d(t,"dest"in l?l.dest:null));h.annotationLayer||(l=document.createElement("div"),l.className="annotationLayer",
+a.appendChild(l),h.annotationLayer=l);h.annotationLayer.appendChild(r)}}})}this.id=b;this.rotation=0;this.scale=c||1;this.viewport=e;this.pdfPageRotate=e.rotation;this.renderingState=RenderingStates.INITIAL;this.annotationLayer=this.zoomLayer=this.textLayer=this.resume=null;b=document.createElement("a");b.name=""+this.id;var g=this.el=document.createElement("div");g.id="pageContainer"+this.id;g.className="page";g.style.width=Math.floor(this.viewport.width)+"px";g.style.height=Math.floor(this.viewport.height)+
+"px";a.appendChild(b);a.appendChild(g);this.setPdfPage=function(a){this.pdfPage=a;this.pdfPageRotate=a.rotate;this.viewport=a.getViewport(this.scale*CSS_UNITS,(this.rotation+this.pdfPageRotate)%360);this.stats=a.stats;this.reset()};this.destroy=function(){this.zoomLayer=null;this.reset();this.pdfPage&&this.pdfPage.destroy()};this.reset=function(a){this.renderTask&&this.renderTask.cancel();this.resume=null;this.renderingState=RenderingStates.INITIAL;g.style.width=Math.floor(this.viewport.width)+"px";
+g.style.height=Math.floor(this.viewport.height)+"px";for(var b=g.childNodes,c=g.childNodes.length-1;0<=c;c--){var d=b[c];this.zoomLayer&&this.zoomLayer===d||a&&this.annotationLayer===d||g.removeChild(d)}g.removeAttribute("data-loaded");a?this.annotationLayer&&this.annotationLayer.setAttribute("hidden","true"):this.annotationLayer=null;delete this.canvas;this.loadingIconDiv=document.createElement("div");this.loadingIconDiv.className="loadingIcon";g.appendChild(this.loadingIconDiv)};this.update=function(a,
+b){this.scale=a||this.scale;"undefined"!==typeof b&&(this.rotation=b);this.viewport=this.viewport.clone({scale:this.scale*CSS_UNITS,rotation:(this.rotation+this.pdfPageRotate)%360});USE_ONLY_CSS_ZOOM&&this.canvas?this.cssTransform(this.canvas):(this.canvas&&!this.zoomLayer&&(this.zoomLayer=this.canvas.parentNode,this.zoomLayer.style.position="absolute"),this.zoomLayer&&this.cssTransform(this.zoomLayer.firstChild),this.reset(!0))};this.cssTransform=function(a){var b=this.viewport.width,c=this.viewport.height;
+a.style.width=a.parentNode.style.width=g.style.width=Math.floor(b)+"px";a.style.height=a.parentNode.style.height=g.style.height=Math.floor(c)+"px";var d=this.viewport.rotation-a._viewport.rotation,e=Math.abs(d),h=1,q=1;if(90===e||270===e)h=c/b,q=b/c;CustomStyle.setProp("transform",a,"rotate("+d+"deg) scale("+h+","+q+")");if(this.textLayer){c=Math.abs(this.viewport.rotation-this.textLayer.viewport.rotation);d=b/a.width;if(90===c||270===c)d=b/a.height;a=this.textLayer.textLayerDiv;var l,r;switch(c){case 0:l=
+r=0;break;case 90:l=0;r="-"+a.style.height;break;case 180:l="-"+a.style.width;r="-"+a.style.height;break;case 270:l="-"+a.style.width;r=0;break;default:console.error("Bad rotation value.")}CustomStyle.setProp("transform",a,"rotate("+c+"deg) scale("+d+", "+d+") translate("+l+", "+r+")");CustomStyle.setProp("transformOrigin",a,"0% 0%")}USE_ONLY_CSS_ZOOM&&this.annotationLayer&&f(g,this.pdfPage,this.viewport)};Object.defineProperty(this,"width",{get:function(){return this.viewport.width},enumerable:!0});
+Object.defineProperty(this,"height",{get:function(){return this.viewport.height},enumerable:!0});var h=this;this.getPagePoint=function(a,b){return this.viewport.convertToPdfPoint(a,b)};this.scrollIntoView=function(a){if(PresentationMode.active){if(PDFView.page!==this.id){PDFView.page=this.id;return}a=null;PDFView.setScale(PDFView.currentScaleValue,!0,!0)}if(a){var b=0,c=0,d=0,e=0,f,h;h=0===this.rotation%180?!1:!0;f=(h?this.height:this.width)/this.scale/CSS_UNITS;h=(h?this.width:this.height)/this.scale/
+CSS_UNITS;var l=0;switch(a[1].name){case "XYZ":b=a[2];c=a[3];l=a[4];b=null!==b?b:0;c=null!==c?c:h;break;case "Fit":case "FitB":l="page-fit";break;case "FitH":case "FitBH":c=a[2];l="page-width";break;case "FitV":case "FitBV":b=a[2];d=f;e=h;l="page-height";break;case "FitR":b=a[2];c=a[3];d=a[4]-b;e=a[5]-c;f=(PDFView.container.clientWidth-SCROLLBAR_PADDING)/d/CSS_UNITS;h=(PDFView.container.clientHeight-SCROLLBAR_PADDING)/e/CSS_UNITS;l=Math.min(Math.abs(f),Math.abs(h));break;default:return}l&&l!==PDFView.currentScale?
+PDFView.setScale(l,!0,!0):PDFView.currentScale===UNKNOWN_SCALE&&PDFView.setScale(DEFAULT_SCALE,!0,!0);"page-fit"!==l||a[4]?(b=[this.viewport.convertToViewportPoint(b,c),this.viewport.convertToViewportPoint(b+d,c+e)],a=Math.min(b[0][0],b[1][0]),b=Math.min(b[0][1],b[1][1]),scrollIntoView(g,{left:a,top:b})):scrollIntoView(g)}else scrollIntoView(g)};this.getTextContent=function(){return PDFView.getPage(this.id).then(function(a){return a.getTextContent()})};this.draw=function(a){function b(d){w===n.renderTask&&
+(n.renderTask=null);if("cancelled"!==d){n.renderingState=RenderingStates.FINISHED;n.loadingIconDiv&&(g.removeChild(n.loadingIconDiv),delete n.loadingIconDiv);n.zoomLayer&&(g.removeChild(n.zoomLayer),n.zoomLayer=null);d&&PDFView.error(mozL10n.get("rendering_error",null,"An error occurred while rendering the page."),d);n.stats=c.stats;n.updateStats();if(n.onAfterDraw)n.onAfterDraw();cache.push(n);d=document.createEvent("CustomEvent");d.initCustomEvent("pagerender",!0,!0,{pageNumber:c.pageNumber});g.dispatchEvent(d);
+a()}}var c=this.pdfPage;if(!this.pagePdfPromise)if(c){this.renderingState!==RenderingStates.INITIAL&&console.error("Must be in new state before drawing");this.renderingState=RenderingStates.RUNNING;var d=this.viewport,e=document.createElement("div");e.style.width=g.style.width;e.style.height=g.style.height;e.classList.add("canvasWrapper");var h=document.createElement("canvas");h.id="page"+this.id;e.appendChild(h);this.annotationLayer?g.insertBefore(e,this.annotationLayer):g.appendChild(e);this.canvas=
+h;var e=h.getContext("2d"),q=getOutputScale(e);if(USE_ONLY_CSS_ZOOM){var l=d.clone({scale:CSS_UNITS});q.sx*=l.width/d.width;q.sy*=l.height/d.height;q.scaled=!0}h.width=Math.floor(d.width)*q.sx|0;h.height=Math.floor(d.height)*q.sy|0;h.style.width=Math.floor(d.width)+"px";h.style.height=Math.floor(d.height)+"px";h._viewport=d;d=null;PDFJS.disableTextLayer||(d=document.createElement("div"),d.className="textLayer",d.style.width=h.style.width,d.style.height=h.style.height,this.annotationLayer?g.insertBefore(d,
+this.annotationLayer):g.appendChild(d));var r=this.textLayer=d?new TextLayerBuilder({textLayerDiv:d,pageIndex:this.id-1,lastScrollSource:PDFView,viewport:this.viewport,isViewerInPresentationMode:PresentationMode.active}):null;e._scaleX=q.sx;e._scaleY=q.sy;q.scaled&&e.scale(q.sx,q.sy);var n=this,w=this.renderTask=this.pdfPage.render({canvasContext:e,viewport:this.viewport,textLayer:r,continueCallback:function(a){PDFView.highestPriorityPage!=="page"+n.id?(n.renderingState=RenderingStates.PAUSED,n.resume=
+function(){n.renderingState=RenderingStates.RUNNING;a()}):a()}});this.renderTask.promise.then(function(){b(null);r&&n.getTextContent().then(function(a){r.setTextContent(a)})},function(a){b(a)});f(g,c,this.viewport);g.setAttribute("data-loaded",!0)}else h=PDFView.getPage(this.id),h.then(function(b){delete this.pagePdfPromise;this.setPdfPage(b);this.draw(a)}.bind(this)),this.pagePdfPromise=h};this.beforePrint=function(){var a=this.pdfPage,b=a.getViewport(1),c=document.createElement("canvas");c.width=
+2*Math.floor(b.width);c.height=2*Math.floor(b.height);c.style.width=2*b.width+"pt";c.style.height=2*b.height+"pt";CustomStyle.setProp("transform",c,"scale(0.5, 0.5)");CustomStyle.setProp("transformOrigin",c,"0% 0%");var d=document.getElementById("printContainer"),e=document.createElement("div");e.style.width=b.width+"pt";e.style.height=b.height+"pt";e.appendChild(c);d.appendChild(e);c.mozPrintCallback=function(d){var e=d.context;e.save();e.fillStyle="rgb(255, 255, 255)";e.fillRect(0,0,c.width,c.height);
+e.restore();e.scale(2,2);a.render({canvasContext:e,viewport:b,intent:"print"}).promise.then(function(){d.done()},function(a){console.error(a);"abort"in d?d.abort():d.done()})}};this.updateStats=function(){this.stats&&PDFJS.pdfBug&&Stats.enabled&&Stats.add(this.id,this.stats)}},ThumbnailView=function(a,b,c){var d=document.createElement("a");d.href=PDFView.getAnchorUrl("#page="+b);d.title=mozL10n.get("thumb_page_title",{page:b},"Page {{page}}");d.onclick=function(){PDFView.page=b;return!1};this.pdfPage=
+void 0;this.viewport=c;this.pdfPageRotate=c.rotation;this.rotation=0;this.pageWidth=this.viewport.width;this.pageHeight=this.viewport.height;this.pageRatio=this.pageWidth/this.pageHeight;this.id=b;this.canvasWidth=98;this.canvasHeight=this.canvasWidth/this.pageWidth*this.pageHeight;this.scale=this.canvasWidth/this.pageWidth;var e=this.el=document.createElement("div");e.id="thumbnailContainer"+b;e.className="thumbnail";1===b&&e.classList.add("selected");var f=document.createElement("div");f.className=
+"thumbnailSelectionRing";f.style.width=this.canvasWidth+"px";f.style.height=this.canvasHeight+"px";e.appendChild(f);d.appendChild(e);a.appendChild(d);this.hasImage=!1;this.renderingState=RenderingStates.INITIAL;this.setPdfPage=function(a){this.pdfPage=a;this.pdfPageRotate=a.rotate;this.viewport=a.getViewport(1,(this.rotation+this.pdfPageRotate)%360);this.update()};this.update=function(a){void 0!==a&&(this.rotation=a);this.viewport=this.viewport.clone({scale:1,rotation:(this.rotation+this.pdfPageRotate)%
+360});this.pageWidth=this.viewport.width;this.pageHeight=this.viewport.height;this.pageRatio=this.pageWidth/this.pageHeight;this.canvasHeight=this.canvasWidth/this.pageWidth*this.pageHeight;this.scale=this.canvasWidth/this.pageWidth;e.removeAttribute("data-loaded");f.textContent="";f.style.width=this.canvasWidth+"px";f.style.height=this.canvasHeight+"px";this.hasImage=!1;this.renderingState=RenderingStates.INITIAL;this.resume=null};this.getPageDrawContext=function(){var a=document.createElement("canvas");
+a.id="thumbnail"+b;a.width=this.canvasWidth;a.height=this.canvasHeight;a.className="thumbnailImage";a.setAttribute("aria-label",mozL10n.get("thumb_page_canvas",{page:b},"Thumbnail of Page {{page}}"));e.setAttribute("data-loaded",!0);f.appendChild(a);a=a.getContext("2d");a.save();a.fillStyle="rgb(255, 255, 255)";a.fillRect(0,0,this.canvasWidth,this.canvasHeight);a.restore();return a};this.drawingRequired=function(){return!this.hasImage};this.draw=function(a){if(this.pdfPage)if(this.renderingState!==
+RenderingStates.INITIAL&&console.error("Must be in new state before drawing"),this.renderingState=RenderingStates.RUNNING,this.hasImage)a();else{var b=this,c=this.getPageDrawContext(),d=this.viewport.clone({scale:this.scale});this.pdfPage.render({canvasContext:c,viewport:d,continueCallback:function(a){PDFView.highestPriorityPage!=="thumbnail"+b.id?(b.renderingState=RenderingStates.PAUSED,b.resume=function(){b.renderingState=RenderingStates.RUNNING;a()}):a()}}).promise.then(function(){b.renderingState=
+RenderingStates.FINISHED;a()},function(c){b.renderingState=RenderingStates.FINISHED;a()});this.hasImage=!0}else PDFView.getPage(this.id).then(function(b){this.setPdfPage(b);this.draw(a)}.bind(this))};this.setImage=function(a){if(!this.pdfPage)PDFView.getPage(this.id).then(function(b){this.setPdfPage(b);this.setImage(a)}.bind(this));else if(!this.hasImage&&a){this.renderingState=RenderingStates.FINISHED;var b=this.getPageDrawContext();b.drawImage(a,0,0,a.width,a.height,0,0,b.canvas.width,b.canvas.height);
+this.hasImage=!0}}},FIND_SCROLL_OFFSET_TOP=-50,FIND_SCROLL_OFFSET_LEFT=-400,TextLayerBuilder=function(a){var b=document.createDocumentFragment();this.textLayerDiv=a.textLayerDiv;this.divContentDone=this.layoutDone=!1;this.pageIdx=a.pageIndex;this.matches=[];this.lastScrollSource=a.lastScrollSource;this.viewport=a.viewport;this.isViewerInPresentationMode=a.isViewerInPresentationMode;this.textDivs=[];"undefined"===typeof PDFFindController&&(window.PDFFindController=null);"undefined"===typeof this.lastScrollSource&&
+(this.lastScrollSource=null);this.renderLayer=function(){var a=this.textDivs,d=document.createElement("canvas").getContext("2d");if(!(1E5<a.length)){for(var e=0,f=a.length;e<f;e++){var g=a[e];if(!("isWhitespace"in g.dataset)){d.font=g.style.fontSize+" "+g.style.fontFamily;var h=d.measureText(g.textContent).width;0<h&&(b.appendChild(g),h="scale("+g.dataset.canvasWidth/h+", 1)",h="rotate("+g.dataset.angle+"deg) "+h,CustomStyle.setProp("transform",g,h),CustomStyle.setProp("transformOrigin",g,"0% 0%"))}}this.textLayerDiv.appendChild(b);
+this.renderingDone=!0;this.updateMatches()}};this.setupRenderLayoutTimer=function(){var a=this,b=null===this.lastScrollSource?0:this.lastScrollSource.lastScroll;200<Date.now()-b?this.renderLayer():(this.renderTimer&&clearTimeout(this.renderTimer),this.renderTimer=setTimeout(function(){a.setupRenderLayoutTimer()},200))};this.appendText=function(a,b){var e=b[a.fontName],f=document.createElement("div");this.textDivs.push(f);if(/\S/.test(a.str)){var g=PDFJS.Util.transform(this.viewport.transform,a.transform),
+h=Math.atan2(g[1],g[0]);e.vertical&&(h+=Math.PI/2);var k=Math.sqrt(g[2]*g[2]+g[3]*g[3]),m=e.ascent?e.ascent*k:e.descent?(1+e.descent)*k:k;f.style.position="absolute";f.style.left=g[4]+m*Math.sin(h)+"px";f.style.top=g[5]-m*Math.cos(h)+"px";f.style.fontSize=k+"px";f.style.fontFamily=e.fontFamily;f.textContent=a.str;f.dataset.fontName=a.fontName;f.dataset.angle=180/Math.PI*h;f.dataset.canvasWidth=e.vertical?a.height*this.viewport.scale:a.width*this.viewport.scale}else f.dataset.isWhitespace=!0};this.setTextContent=
+function(a){this.textContent=a;for(var b=a.items,e=0;e<b.length;e++)this.appendText(b[e],a.styles);this.divContentDone=!0;this.setupRenderLayoutTimer()};this.convertMatches=function(a){for(var b=0,e=0,f=this.textContent.items,g=f.length-1,h=null===PDFFindController?0:PDFFindController.state.query.length,k=[],m=0;m<a.length;m++){for(var p=a[m];b!==g&&p>=e+f[b].str.length;)e+=f[b].str.length,b++;b==f.length&&console.error("Could not find matching mapping");for(var u={begin:{divIdx:b,offset:p-e}},p=
+p+h;b!==g&&p>e+f[b].str.length;)e+=f[b].str.length,b++;u.end={divIdx:b,offset:p-e};k.push(u)}return k};this.renderMatches=function(a){function b(a,c){var d=a.divIdx;h[d].textContent="";f(d,0,a.offset,c)}function e(a,b,c){f(a.divIdx,a.offset,b.offset,c)}function f(a,b,c,d){var e=h[a];a=g[a].str.substring(b,c);a=document.createTextNode(a);d?(b=document.createElement("span"),b.className=d,b.appendChild(a),e.appendChild(b)):e.appendChild(a)}if(0!==a.length){var g=this.textContent.items,h=this.textDivs,
+k=null,m=null===PDFFindController?!1:this.pageIdx===PDFFindController.selected.pageIdx,p=null===PDFFindController?-1:PDFFindController.selected.matchIdx,u={divIdx:-1,offset:void 0},v=p,y=v+1;if(null===PDFFindController?0:PDFFindController.state.highlightAll)v=0,y=a.length;else if(!m)return;for(;v<y;v++){var q=a[v],l=q.begin,q=q.end,r=m&&v===p,n=r?" selected":"";r&&!this.isViewerInPresentationMode&&scrollIntoView(h[l.divIdx],{top:FIND_SCROLL_OFFSET_TOP,left:FIND_SCROLL_OFFSET_LEFT});k&&l.divIdx===
+k.divIdx?e(k,l):(null!==k&&e(k,u),b(l));if(l.divIdx===q.divIdx)e(l,q,"highlight"+n);else{e(l,u,"highlight begin"+n);for(k=l.divIdx+1;k<q.divIdx;k++)h[k].className="highlight middle"+n;b(q,"highlight end"+n)}k=q}k&&e(k,u)}};this.updateMatches=function(){if(this.renderingDone){for(var a=this.matches,b=this.textDivs,e=this.textContent.items,f=-1,g=0;g<a.length;g++){for(var h=a[g],f=Math.max(f,h.begin.divIdx);f<=h.end.divIdx;f++){var k=b[f];k.textContent=e[f].str;k.className=""}f=h.end.divIdx+1}null!==
+PDFFindController&&PDFFindController.active&&(this.matches=this.convertMatches(null===PDFFindController?[]:PDFFindController.pageMatches[this.pageIdx]||[]),this.renderMatches(this.matches))}}},DocumentOutlineView=function(a){function b(a,b){a.href=PDFView.getDestinationHash(b.dest);a.onclick=function(a){PDFView.navigateTo(b.dest);return!1}}for(var c=document.getElementById("outlineView");c.firstChild;)c.removeChild(c.firstChild);if(a)for(a=[{parent:c,items:a}];0<a.length;){var c=a.shift(),d,e=c.items.length;
+for(d=0;d<e;d++){var f=c.items[d],g=document.createElement("div");g.className="outlineItem";var h=document.createElement("a");b(h,f);h.textContent=f.title;g.appendChild(h);0<f.items.length&&(h=document.createElement("div"),h.className="outlineItems",g.appendChild(h),a.push({parent:h,items:f.items}));c.parent.appendChild(g)}}else c.classList.contains("hidden")||PDFView.switchSidebarView("thumbs")},DocumentAttachmentsView=function(a){function b(a,b){a.href="#";a.onclick=function(a){(new DownloadManager).downloadData(b.content,
+getFileName(b.filename),"");return!1}}for(var c=document.getElementById("attachmentsView");c.firstChild;)c.removeChild(c.firstChild);if(a)for(var d=Object.keys(a).sort(function(a,b){return a.toLowerCase().localeCompare(b.toLowerCase())}),e=0,f=d.length;e<f;e++){var g=a[d[e]],h=document.createElement("div");h.className="attachmentsItem";var k=document.createElement("a");b(k,g);k.textContent=getFileName(g.filename);h.appendChild(k);c.appendChild(h)}else c.classList.contains("hidden")||PDFView.switchSidebarView("thumbs")};
+function webViewerLoad(a){PDFView.initialize().then(webViewerInitialized)}
+function webViewerInitialized(){$("#viewerContainer").targetBlank();var a=PDFView.parseQueryString(document.location.search.substring(1)),a="file"in a?a.file:PDFJS.DEFAULT_URL,b=document.createElement("input");b.id="fileInput";b.className="fileInput";b.setAttribute("type","file");b.oncontextmenu=noContextMenuHandler;document.body.appendChild(b);window.File&&window.FileReader&&window.FileList&&window.Blob?document.getElementById("fileInput").value=null:(document.getElementById("openFile").setAttribute("hidden",
+"true"),document.getElementById("secondaryOpenFile").setAttribute("hidden","true"));b=document.location.hash.substring(1);b=PDFView.parseQueryString(b);"disableWorker"in b&&(PDFJS.disableWorker="true"===b.disableWorker);"disableRange"in b&&(PDFJS.disableRange="true"===b.disableRange);"disableAutoFetch"in b&&(PDFJS.disableAutoFetch="true"===b.disableAutoFetch);"disableFontFace"in b&&(PDFJS.disableFontFace="true"===b.disableFontFace);"disableHistory"in b&&(PDFJS.disableHistory="true"===b.disableHistory);
+"webgl"in b&&(PDFJS.disableWebGL="true"!==b.webgl);"useOnlyCssZoom"in b&&(USE_ONLY_CSS_ZOOM="true"===b.useOnlyCssZoom);"verbosity"in b&&(PDFJS.verbosity=b.verbosity|0);"ignoreCurrentPositionOnZoom"in b&&(IGNORE_CURRENT_POSITION_ON_ZOOM="true"===b.ignoreCurrentPositionOnZoom);var c=PDFJS.locale||navigator.language;"locale"in b&&(c=b.locale);mozL10n.setLanguage(c);if("textLayer"in b)switch(b.textLayer){case "off":PDFJS.disableTextLayer=!0;break;case "visible":case "shadow":case "hover":document.getElementById("viewer").classList.add("textLayer-"+
+b.textLayer)}"pdfBug"in b&&(PDFJS.pdfBug=!0,b=b.pdfBug.split(","),PDFBug.enable(b),PDFBug.init());PDFView.supportsPrinting||(document.getElementById("print").classList.add("hidden"),document.getElementById("secondaryPrint").classList.add("hidden"));PDFView.supportsFullscreen||(document.getElementById("presentationMode").classList.add("hidden"),document.getElementById("secondaryPresentationMode").classList.add("hidden"));PDFView.supportsIntegratedFind&&document.getElementById("viewFind").classList.add("hidden");
+PDFJS.UnsupportedManager.listen(PDFView.fallback.bind(PDFView));document.getElementById("scaleSelect").oncontextmenu=noContextMenuHandler;var d=document.getElementById("mainContainer"),e=document.getElementById("outerContainer");d.addEventListener("transitionend",function(a){a.target==d&&(a=document.createEvent("UIEvents"),a.initUIEvent("resize",!1,!1,window,0),window.dispatchEvent(a),e.classList.remove("sidebarMoving"))},!0);document.getElementById("sidebarToggle").addEventListener("click",function(){this.classList.toggle("toggled");
+e.classList.add("sidebarMoving");e.classList.toggle("sidebarOpen");PDFView.sidebarOpen=e.classList.contains("sidebarOpen");PDFView.renderHighestPriority()});document.getElementById("viewThumbnail").addEventListener("click",function(){PDFView.switchSidebarView("thumbs")});document.getElementById("viewOutline").addEventListener("click",function(){PDFView.switchSidebarView("outline")});document.getElementById("viewAttachments").addEventListener("click",function(){PDFView.switchSidebarView("attachments")});
+document.getElementById("previous").addEventListener("click",function(){PDFView.page--});document.getElementById("next").addEventListener("click",function(){PDFView.page++});document.getElementById("zoomIn").addEventListener("click",function(){PDFView.zoomIn()});document.getElementById("zoomOut").addEventListener("click",function(){PDFView.zoomOut()});document.getElementById("pageNumber").addEventListener("click",function(){this.select()});document.getElementById("pageNumber").addEventListener("change",
+function(){PDFView.page=this.value|0;this.value!==(this.value|0).toString()&&(this.value=PDFView.page)});document.getElementById("scaleSelect").addEventListener("change",function(){PDFView.setScale(this.value)});document.getElementById("presentationMode").addEventListener("click",SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));document.getElementById("openFile").addEventListener("click",SecondaryToolbar.openFileClick.bind(SecondaryToolbar));document.getElementById("print").addEventListener("click",
+SecondaryToolbar.printClick.bind(SecondaryToolbar));document.getElementById("download").addEventListener("click",SecondaryToolbar.downloadClick.bind(SecondaryToolbar));a&&PDFView.open(a,0)}document.addEventListener("DOMContentLoaded",webViewerLoad,!0);
+function updateViewarea(){if(PDFView.initialized){var a=PDFView.getVisiblePages(),b=a.views;if(0!==b.length){PDFView.renderHighestPriority();for(var c=PDFView.page,a=a.first,d=0,e=b.length,f=!1;d<e;++d){var g=b[d];if(100>g.percent)break;if(g.id===PDFView.page){f=!0;break}}f||(c=b[0].id);PresentationMode.active||(updateViewarea.inProgress=!0,PDFView.page=c,updateViewarea.inProgress=!1);var b=PDFView.currentScale,c=PDFView.currentScaleValue,h=parseFloat(c)===b?Math.round(1E4*b)/100:c,k=a.id,b="#page="+
+k+("&zoom="+h),c=PDFView.container,a=PDFView.pages[k-1].getPagePoint(c.scrollLeft-a.x,c.scrollTop-a.y),m=Math.round(a[0]),p=Math.round(a[1]),b=b+(","+m+","+p);PDFView.currentPosition=PresentationMode.active||PresentationMode.switchInProgress?null:{page:k,left:m,top:p};var u=PDFView.store;u.initializedPromise.then(function(){u.set("exists",!0);u.set("page",k);u.set("zoom",h);u.set("scrollLeft",m);u.set("scrollTop",p)});a=PDFView.getAnchorUrl(b);document.getElementById("viewBookmark").href=a;document.getElementById("secondaryViewBookmark").href=
+a;PDFHistory.updateCurrentBookmark(b,k)}}}window.addEventListener("resize",function(a){PDFView.initialized&&(document.getElementById("pageWidthOption").selected||document.getElementById("pageFitOption").selected||document.getElementById("pageAutoOption").selected)&&PDFView.setScale(document.getElementById("scaleSelect").value);updateViewarea();SecondaryToolbar.setMaxHeight(PDFView.container)});window.addEventListener("hashchange",function(a){PDFHistory.isHashChangeUnlocked&&PDFView.setHash(document.location.hash.substring(1))});
+window.addEventListener("change",function(a){if((a=a.target.files)&&0!==a.length){a=a[0];if(!PDFJS.disableCreateObjectURL&&"undefined"!==typeof URL&&URL.createObjectURL)PDFView.open(URL.createObjectURL(a),0);else{var b=new FileReader;b.onload=function(a){a=new Uint8Array(a.target.result);PDFView.open(a,0)};b.readAsArrayBuffer(a)}PDFView.setTitleUsingUrl(a.name);document.getElementById("viewBookmark").setAttribute("hidden","true");document.getElementById("secondaryViewBookmark").setAttribute("hidden",
+"true");document.getElementById("download").setAttribute("hidden","true");document.getElementById("secondaryDownload").setAttribute("hidden","true")}},!0);function selectScaleOption(a){for(var b=document.getElementById("scaleSelect").options,c=!1,d=0;d<b.length;d++){var e=b[d];e.value!=a?e.selected=!1:c=e.selected=!0}return c}
+window.addEventListener("localized",function(a){document.getElementsByTagName("html")[0].dir=mozL10n.getDirection();PDFView.animationStartedPromise.then(function(){var a=document.getElementById("scaleSelectContainer");if(0<a.clientWidth){var c=document.getElementById("scaleSelect");c.setAttribute("style","min-width: inherit;");var d=c.clientWidth+SCALE_SELECT_CONTAINER_PADDING;c.setAttribute("style","min-width: "+(d+SCALE_SELECT_PADDING)+"px;");a.setAttribute("style","min-width: "+d+"px; max-width: "+
+d+"px;")}SecondaryToolbar.setMaxHeight(PDFView.container)})},!0);
+window.addEventListener("scalechange",function(a){document.getElementById("zoomOut").disabled=a.scale===MIN_SCALE;document.getElementById("zoomIn").disabled=a.scale===MAX_SCALE;var b=document.getElementById("customScaleOption");b.selected=!1;!a.resetAutoSettings&&(document.getElementById("pageWidthOption").selected||document.getElementById("pageFitOption").selected||document.getElementById("pageAutoOption").selected)||selectScaleOption(""+a.scale)||(b.textContent=Math.round(1E4*a.scale)/100+"%",b.selected=
+!0);updateViewarea()},!0);
+window.addEventListener("pagechange",function(a){a=a.pageNumber;if(PDFView.previousPageNumber!==a){document.getElementById("pageNumber").value=a;var b=document.querySelector(".thumbnail.selected");b&&b.classList.remove("selected");b=document.getElementById("thumbnailContainer"+a);b.classList.add("selected");var c=PDFView.getVisibleThumbs(),d=c.views.length;if(0<d){var e=c.first.id,c=1<d?c.last.id:e;(a<=e||a>=c)&&scrollIntoView(b,{top:THUMBNAIL_SCROLL_MARGIN})}}document.getElementById("previous").disabled=1>=
+a;document.getElementById("next").disabled=a>=PDFView.pages.length},!0);function handleMouseWheel(a){var b="DOMMouseScroll"===a.type?-a.detail:a.wheelDelta/40,c=0>b?"zoomOut":"zoomIn";a.ctrlKey?(a.preventDefault(),PDFView[c](Math.abs(b))):PresentationMode.active&&PDFView.mouseScroll(40*b)}window.addEventListener("DOMMouseScroll",handleMouseWheel);window.addEventListener("mousewheel",handleMouseWheel);
+window.addEventListener("click",function(a){PresentationMode.active?0===a.button&&a.preventDefault():SecondaryToolbar.opened&&PDFView.container.contains(a.target)&&SecondaryToolbar.close()},!1);
+window.addEventListener("keydown",function(a){if(!PasswordPrompt.visible){var b=!1,c=(a.ctrlKey?1:0)|(a.altKey?2:0)|(a.shiftKey?4:0)|(a.metaKey?8:0);if(1===c||8===c||5===c||12===c)switch(a.keyCode){case 70:PDFView.supportsIntegratedFind||(PDFFindBar.open(),b=!0);break;case 71:PDFView.supportsIntegratedFind||(PDFFindBar.dispatchEvent("again",5===c||12===c),b=!0);break;case 61:case 107:case 187:case 171:PDFView.zoomIn();b=!0;break;case 173:case 109:case 189:PDFView.zoomOut();b=!0;break;case 48:case 96:setTimeout(function(){PDFView.setScale(DEFAULT_SCALE,
+!0)}),b=!1}if(1===c||8===c)switch(a.keyCode){case 83:PDFView.download(),b=!0}if(3===c||10===c)switch(a.keyCode){case 80:SecondaryToolbar.presentationModeClick();b=!0;break;case 71:document.getElementById("pageNumber").select(),b=!0}if(b)a.preventDefault();else{var d=document.activeElement||document.querySelector(":focus"),e=d&&d.tagName.toUpperCase();if("INPUT"!==e&&"TEXTAREA"!==e&&"SELECT"!==e||27===a.keyCode){if(0===c)switch(a.keyCode){case 38:case 33:case 8:if(!PresentationMode.active&&"page-fit"!==
+PDFView.currentScaleValue)break;case 37:if(PDFView.isHorizontalScrollbarEnabled)break;case 75:case 80:PDFView.page--;b=!0;break;case 27:SecondaryToolbar.opened&&(SecondaryToolbar.close(),b=!0);!PDFView.supportsIntegratedFind&&PDFFindBar.opened&&(PDFFindBar.close(),b=!0);break;case 40:case 34:case 32:if(!PresentationMode.active&&"page-fit"!==PDFView.currentScaleValue)break;case 39:if(PDFView.isHorizontalScrollbarEnabled)break;case 74:case 78:PDFView.page++;b=!0;break;case 36:PresentationMode.active&&
+(PDFView.page=1,b=!0);break;case 35:PresentationMode.active&&(PDFView.page=PDFView.pdfDocument.numPages,b=!0);break;case 72:PresentationMode.active||HandTool.toggle();break;case 82:PDFView.rotatePages(90)}if(4===c)switch(a.keyCode){case 32:if(!PresentationMode.active&&"page-fit"!==PDFView.currentScaleValue)break;PDFView.page--;b=!0;break;case 82:PDFView.rotatePages(-90)}b||PresentationMode.active||(33<=a.keyCode&&40>=a.keyCode&&!PDFView.container.contains(d)&&PDFView.container.focus(),32===a.keyCode&&
+"BUTTON"!==e&&(PDFView.container.contains(d)||PDFView.container.focus()));if(2===c)switch(a.keyCode){case 37:PresentationMode.active&&(PDFHistory.back(),b=!0);break;case 39:PresentationMode.active&&(PDFHistory.forward(),b=!0)}b&&(a.preventDefault(),PDFView.clearMouseScrollState())}}}});window.addEventListener("beforeprint",function(a){PDFView.beforePrint()});window.addEventListener("afterprint",function(a){PDFView.afterPrint()});
+(function(){var a=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){a()};PDFView.animationStartedPromise=new Promise(function(b){a(function(){b()})})})();
diff --git a/public/opac/js/universalviewer-2.0.2/lib/virtex.js b/public/opac/js/universalviewer-2.0.2/lib/virtex.js
new file mode 100644
index 0000000000000000000000000000000000000000..43310de2c8f5f80e502bdbe5d02635895987c596
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/lib/virtex.js
@@ -0,0 +1,343 @@
+!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.virtex=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
+(function (global){
+
+
+
+
+
+
+var requestAnimFrame = (function () {
+    return window.requestAnimationFrame ||
+        window.webkitRequestAnimationFrame ||
+        window.mozRequestAnimationFrame ||
+        window.oRequestAnimationFrame ||
+        window.msRequestAnimationFrame ||
+        function (callback) {
+            window.setTimeout(callback, 1000 / 200);
+        };
+})();
+var Virtex;
+(function (Virtex) {
+    var Viewport = (function () {
+        function Viewport(options) {
+            this._isMouseDown = false;
+            this._mouseX = 0;
+            this._mouseXOnMouseDown = 0;
+            this._mouseY = 0;
+            this._mouseYOnMouseDown = 0;
+            this._pinchStart = new THREE.Vector2();
+            this._targetRotationOnMouseDownX = 0;
+            this._targetRotationOnMouseDownY = 0;
+            this._targetRotationX = 0;
+            this._targetRotationY = 0;
+            this.options = $.extend({
+                ambientLightColor: 0xd0d0d0,
+                cameraZ: 4.5,
+                directionalLight1Color: 0xffffff,
+                directionalLight1Intensity: 0.75,
+                directionalLight2Color: 0x002958,
+                directionalLight2Intensity: 0.5,
+                doubleSided: true,
+                fadeSpeed: 1750,
+                far: 10000,
+                fov: 45,
+                maxZoom: 10,
+                minZoom: 2,
+                near: 0.1,
+                shading: THREE.SmoothShading,
+                shininess: 1,
+                showStats: false,
+                zoomSpeed: 1
+            }, options);
+            var success = this._init();
+            this._resize();
+            if (success) {
+                this._draw();
+            }
+        }
+        Viewport.prototype._init = function () {
+            var _this = this;
+            this._$element = $(this.options.element);
+            if (!this._$element.length) {
+                console.log('element not found');
+                return false;
+            }
+            if (!Detector.webgl) {
+                Detector.addGetWebGLMessage();
+                this._$oldie = $('#oldie');
+                this._$oldie.appendTo(this._$element);
+                return false;
+            }
+            this._$element.append('<div class="viewport"></div><div class="loading"><div class="bar"></div></div>');
+            this._$viewport = this._$element.find('.viewport');
+            this._$loading = this._$element.find('.loading');
+            this._$loadingBar = this._$loading.find('.bar');
+            this._$loading.hide();
+            this._scene = new THREE.Scene();
+            this._modelGroup = new THREE.Object3D();
+            this._lightGroup = new THREE.Object3D();
+            // LIGHTS //
+            var light1 = new THREE.DirectionalLight(this.options.directionalLight1Color, this.options.directionalLight1Intensity);
+            light1.position.set(1, 1, 1);
+            this._lightGroup.add(light1);
+            var light2 = new THREE.DirectionalLight(this.options.directionalLight2Color, this.options.directionalLight2Intensity);
+            light2.position.set(-1, -1, -1);
+            this._lightGroup.add(light2);
+            var ambientLight = new THREE.AmbientLight(this.options.ambientLightColor);
+            this._lightGroup.add(ambientLight);
+            this._scene.add(this._lightGroup);
+            // CAMERA //
+            this._camera = new THREE.PerspectiveCamera(this.options.fov, this._getWidth() / this._getHeight(), this.options.near, this.options.far);
+            this._camera.position.z = this._targetZoom = this.options.cameraZ;
+            // RENDERER //
+            this._renderer = new THREE.WebGLRenderer({
+                antialias: true,
+                alpha: true
+            });
+            this._renderer.setSize(this._$viewport.width(), this._$viewport.height());
+            this._$viewport.append(this._renderer.domElement);
+            // STATS //
+            if (this.options.showStats) {
+                this._stats = new Stats();
+                this._stats.domElement.style.position = 'absolute';
+                this._stats.domElement.style.top = '0px';
+                this._$viewport.append(this._stats.domElement);
+            }
+            // EVENTS //
+            this._$element.on('mousedown', function (e) {
+                _this._onMouseDown(e.originalEvent);
+            });
+            this._$element.on('mousemove', function (e) {
+                _this._onMouseMove(e.originalEvent);
+            });
+            this._$element.on('mouseup', function (e) {
+                _this._onMouseUp(e.originalEvent);
+            });
+            this._$element.on('mouseout', function (e) {
+                _this._onMouseOut(e.originalEvent);
+            });
+            this._$element.on('mousewheel', function (e) {
+                _this._onMouseWheel(e.originalEvent);
+            });
+            this._$element.on('DOMMouseScroll', function (e) {
+                _this._onMouseWheel(e.originalEvent); // firefox
+            });
+            this._$element.on('touchstart', function (e) {
+                _this._onTouchStart(e.originalEvent);
+            });
+            this._$element.on('touchmove', function (e) {
+                _this._onTouchMove(e.originalEvent);
+            });
+            this._$element.on('touchend', function (e) {
+                _this._onTouchEnd(e.originalEvent);
+            });
+            window.addEventListener('resize', function () { return _this._resize(); }, false);
+            // LOADER //
+            this._$loading.show();
+            var loader = new THREE.ObjectLoader();
+            loader.setCrossOrigin('anonymous');
+            loader.load(this.options.object, function (obj) {
+                if (_this.options.doubleSided) {
+                    obj.traverse(function (child) {
+                        if (child.material)
+                            child.material.side = THREE.DoubleSide;
+                    });
+                }
+                _this._modelGroup.add(obj);
+                _this._scene.add(_this._modelGroup);
+                _this._$loading.fadeOut(_this.options.fadeSpeed);
+            }, function (e) {
+                if (e.lengthComputable) {
+                    _this._loadProgress(e.loaded / e.total);
+                }
+            }, function (e) {
+                // error
+                console.log(e);
+            });
+            return true;
+        };
+        Viewport.prototype._loadProgress = function (progress) {
+            var fullWidth = this._$loading.width();
+            var width = Math.floor(fullWidth * progress);
+            this._$loadingBar.width(width);
+        };
+        Viewport.prototype._onMouseDown = function (event) {
+            event.preventDefault();
+            this._isMouseDown = true;
+            this._mouseXOnMouseDown = event.clientX - this._viewportHalfX;
+            this._targetRotationOnMouseDownX = this._targetRotationX;
+            this._mouseYOnMouseDown = event.clientY - this._viewportHalfY;
+            this._targetRotationOnMouseDownY = this._targetRotationY;
+        };
+        Viewport.prototype._onMouseMove = function (event) {
+            this._mouseX = event.clientX - this._viewportHalfX;
+            this._mouseY = event.clientY - this._viewportHalfY;
+            if (this._isMouseDown) {
+                this._targetRotationY = this._targetRotationOnMouseDownY + (this._mouseY - this._mouseYOnMouseDown) * 0.02;
+                this._targetRotationX = this._targetRotationOnMouseDownX + (this._mouseX - this._mouseXOnMouseDown) * 0.02;
+            }
+        };
+        Viewport.prototype._onMouseUp = function (event) {
+            this._isMouseDown = false;
+        };
+        Viewport.prototype._onMouseOut = function (event) {
+            this._isMouseDown = false;
+        };
+        Viewport.prototype._onMouseWheel = function (event) {
+            event.preventDefault();
+            event.stopPropagation();
+            var delta = 0;
+            if (event.wheelDelta !== undefined) {
+                delta = event.wheelDelta;
+            }
+            else if (event.detail !== undefined) {
+                delta = -event.detail;
+            }
+            if (delta > 0) {
+                this.zoomIn();
+            }
+            else if (delta < 0) {
+                this.zoomOut();
+            }
+        };
+        Viewport.prototype._onTouchStart = function (event) {
+            var touches = event.touches;
+            if (touches.length === 1) {
+                this._isMouseDown = true;
+                event.preventDefault();
+                this._mouseXOnMouseDown = touches[0].pageX - this._viewportHalfX;
+                this._targetRotationOnMouseDownX = this._targetRotationX;
+                this._mouseYOnMouseDown = touches[0].pageY - this._viewportHalfY;
+                this._targetRotationOnMouseDownY = this._targetRotationY;
+            }
+        };
+        Viewport.prototype._onTouchMove = function (event) {
+            event.preventDefault();
+            event.stopPropagation();
+            var touches = event.touches;
+            switch (touches.length) {
+                case 1:
+                    event.preventDefault();
+                    this._mouseX = touches[0].pageX - this._viewportHalfX;
+                    this._targetRotationX = this._targetRotationOnMouseDownX + (this._mouseX - this._mouseXOnMouseDown) * 0.05;
+                    this._mouseY = touches[0].pageY - this._viewportHalfY;
+                    this._targetRotationY = this._targetRotationOnMouseDownY + (this._mouseY - this._mouseYOnMouseDown) * 0.05;
+                    break;
+                case 2:
+                    var dx = touches[0].pageX - touches[1].pageX;
+                    var dy = touches[0].pageY - touches[1].pageY;
+                    var distance = Math.sqrt(dx * dx + dy * dy);
+                    var pinchEnd = new THREE.Vector2(0, distance);
+                    var pinchDelta = new THREE.Vector2();
+                    pinchDelta.subVectors(pinchEnd, this._pinchStart);
+                    if (pinchDelta.y > 0) {
+                        this.zoomIn();
+                    }
+                    else if (pinchDelta.y < 0) {
+                        this.zoomOut();
+                    }
+                    this._pinchStart.copy(pinchEnd);
+                    break;
+                case 3:
+                    //var panEnd = new THREE.Vector2();
+                    //panEnd.set(touches[0].pageX, touches[0].pageY);
+                    //var panDelta = new THREE.Vector2();
+                    //panDelta.subVectors(panEnd, panStart);
+                    //
+                    //panCamera(panDelta.x, panDelta.y);
+                    //
+                    //panStart.copy(panEnd);
+                    break;
+            }
+        };
+        Viewport.prototype._onTouchEnd = function (event) {
+            this._isMouseDown = false;
+        };
+        Viewport.prototype._draw = function () {
+            var _this = this;
+            requestAnimFrame(function () { return _this._draw(); });
+            this._render();
+            if (this.options.showStats) {
+                this._stats.update();
+            }
+        };
+        Viewport.prototype._render = function () {
+            // horizontal rotation
+            this._modelGroup.rotation.y += (this._targetRotationX - this._modelGroup.rotation.y) * 0.1;
+            // vertical rotation
+            var finalRotationY = (this._targetRotationY - this._modelGroup.rotation.x);
+            if (this._modelGroup.rotation.x <= 1 && this._modelGroup.rotation.x >= -1) {
+                this._modelGroup.rotation.x += finalRotationY * 0.1;
+            }
+            if (this._modelGroup.rotation.x > 1) {
+                this._modelGroup.rotation.x = 1;
+            }
+            else if (this._modelGroup.rotation.x < -1) {
+                this._modelGroup.rotation.x = -1;
+            }
+            var zoomDelta = (this._targetZoom - this._camera.position.z) * 0.1;
+            this._camera.position.z = this._camera.position.z + zoomDelta;
+            this._renderer.render(this._scene, this._camera);
+        };
+        Viewport.prototype._getWidth = function () {
+            return this._$element.width();
+        };
+        Viewport.prototype._getHeight = function () {
+            return this._$element.height();
+        };
+        Viewport.prototype.zoomIn = function () {
+            var t = this._camera.position.z - this.options.zoomSpeed;
+            if (t > this.options.minZoom) {
+                this._targetZoom = t;
+            }
+            else {
+                this._targetZoom = this.options.minZoom;
+            }
+        };
+        Viewport.prototype.zoomOut = function () {
+            var t = this._camera.position.z + this.options.zoomSpeed;
+            if (t < this.options.maxZoom) {
+                this._targetZoom = t;
+            }
+            else {
+                this._targetZoom = this.options.maxZoom;
+            }
+        };
+        Viewport.prototype._resize = function () {
+            if (this._$element && this._$viewport) {
+                this._$element.width(this._getWidth());
+                this._$element.height(this._getHeight());
+                this._$viewport.width(this._getWidth());
+                this._$viewport.height(this._getHeight());
+                this._viewportHalfX = this._$viewport.width() / 2;
+                this._viewportHalfY = this._$viewport.height() / 2;
+                this._camera.aspect = this._$viewport.width() / this._$viewport.height();
+                this._camera.updateProjectionMatrix();
+                this._renderer.setSize(this._$viewport.width(), this._$viewport.height());
+                this._$loading.css({
+                    left: (this._viewportHalfX) - (this._$loading.width() / 2),
+                    top: (this._viewportHalfY) - (this._$loading.height() / 2)
+                });
+            }
+            else if (this._$oldie) {
+                this._$oldie.css({
+                    left: (this._$element.width() / 2) - (this._$oldie.outerWidth() / 2),
+                    top: (this._$element.height() / 2) - (this._$oldie.outerHeight() / 2)
+                });
+            }
+        };
+        return Viewport;
+    })();
+    Virtex.Viewport = Viewport;
+})(Virtex || (Virtex = {}));
+
+global.virtex = module.exports = {
+    create: function (options) {
+        return new Virtex.Viewport(options);
+    }
+};
+
+}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}]},{},[1])
+(1)
+});
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/package.json b/public/opac/js/universalviewer-2.0.2/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..46f19d525dc394d6e8a47182ac0557ab67682f5c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/package.json
@@ -0,0 +1,64 @@
+{
+  "name": "universalviewer",
+  "version": "2.0.2",
+  "description": "The Universal Viewer is an open source project to enable cultural heritage institutions to present their digital artifacts in an IIIF-compliant and highly customisable user interface.",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/universalviewer/universalviewer.git"
+  },
+  "keywords": [
+    "IIIF",
+    "viewer"
+  ],
+  "author": "Edward Silverton <ed@edsilv.com> (http://edsilv.com)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/universalviewer/universalviewer/issues"
+  },
+  "scripts": {
+  },
+  "homepage": "https://github.com/universalviewer/universalviewer",
+  "devDependencies": {
+    "async": "^0.9.0",
+    "base-component": "viewdir/base-component#v1.0.8",
+    "chalk": "^0.5.1",
+    "cucumber": "^0.4.5",
+    "eventemitter2": "^1.0.3",
+    "exjs": "BSick7/exjs",
+    "extensions": "edsilv/extensions",
+    "glob": "^4.3.5",
+    "glob-array": "^0.1.2",
+    "grunt": "^0.4.5",
+    "grunt-contrib-clean": "~0.4.0",
+    "grunt-contrib-compress": "~0.5.2",
+    "grunt-contrib-concat": "^1.0.1",
+    "grunt-contrib-connect": "~0.8.0",
+    "grunt-contrib-copy": "~0.4.1",
+    "grunt-contrib-uglify": "^1.0.1",
+    "grunt-exec": "~0.4.2",
+    "grunt-protractor-runner": "^1.1.4",
+    "grunt-sync": "^0.2.3",
+    "grunt-text-replace": "~0.3.7",
+    "grunt-typescript": "^0.8.0",
+    "hooker": "^0.2.3",
+    "http-status-codes": "edsilv/http-status-codes",
+    "iiif-gallery-component": "viewdir/iiif-gallery-component#v1.0.6",
+    "iiif-metadata-component": "viewdir/iiif-metadata-component#v1.0.10",
+    "iiif-tree-component": "viewdir/iiif-tree-component#v1.0.7",
+    "jquery-plugins": "edsilv/jquery-plugins",
+    "jquery-tiny-pubsub": "edsilv/jquery-tiny-pubsub",
+    "json-schema-generator": "krg7880/json-schema-generator",
+    "key-codes": "edsilv/key-codes",
+    "less": "^2.4.0",
+    "lodash": "^3.1.0",
+    "manifold": "viewdir/manifold#v1.1.12",
+    "ncp": "^2.0.0",
+    "openseadragon": "^2.2.1",
+    "protractor": "1.3.1",
+    "requirejs": "2.2.0",
+    "three.js": "^0.73.0",
+    "units": "edsilv/Units",
+    "utils": "edsilv/utils",
+    "virtex3d": "^0.2.6"
+  }
+}
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-mediaelement-extension.cy-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-mediaelement-extension.cy-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..05552ecdde3bd2ec7a98642953c44d69e979920b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-mediaelement-extension.cy-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"leftPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"pessimisticAccessControl":{"type":"boolean"},"rightPanelEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1}},"required":["bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","leftPanelEnabled","limitLocales","openTemplate","pessimisticAccessControl","rightPanelEnabled","theme"]},"modules":{"type":"object","properties":{"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1}},"required":["embedTemplate"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"bookmarkEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"openEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["bookmarkEnabled","embedEnabled","feedbackEnabled","minimiseButtons","openEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1}},"required":["bookmark","download","embed","exitFullScreen","fullScreen","open"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"ok":{"type":"string","minLength":1}},"required":["ok"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1},"help":{"type":"string","minLength":1}},"required":["close","help"]}},"required":["content"]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"mediaelementCenterPanel":{"type":"object","properties":{"defaultHeight":{"type":"number"},"defaultWidth":{"type":"number"},"content":{"type":"object","properties":{},"required":[]}},"required":["defaultHeight","defaultWidth","content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"resourcesLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"expandFullEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"}},"required":["expandFullEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen"]},"content":{"type":"object","properties":{"title":{"type":"string","minLength":1}},"required":["title"]}},"required":["options","content"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"download":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["download","entireFileAsOriginal","noneAvailable","preview","title"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","cancel"]}},"required":["content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]}},"required":["shareDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","mediaelementCenterPanel","moreInfoRightPanel","resourcesLeftPanel","dialogue","downloadDialogue","loginDialogue","settingsDialogue"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-mediaelement-extension.en-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-mediaelement-extension.en-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..05552ecdde3bd2ec7a98642953c44d69e979920b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-mediaelement-extension.en-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"leftPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"pessimisticAccessControl":{"type":"boolean"},"rightPanelEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1}},"required":["bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","leftPanelEnabled","limitLocales","openTemplate","pessimisticAccessControl","rightPanelEnabled","theme"]},"modules":{"type":"object","properties":{"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1}},"required":["embedTemplate"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"bookmarkEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"openEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["bookmarkEnabled","embedEnabled","feedbackEnabled","minimiseButtons","openEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1}},"required":["bookmark","download","embed","exitFullScreen","fullScreen","open"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"ok":{"type":"string","minLength":1}},"required":["ok"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1},"help":{"type":"string","minLength":1}},"required":["close","help"]}},"required":["content"]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"mediaelementCenterPanel":{"type":"object","properties":{"defaultHeight":{"type":"number"},"defaultWidth":{"type":"number"},"content":{"type":"object","properties":{},"required":[]}},"required":["defaultHeight","defaultWidth","content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"resourcesLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"expandFullEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"}},"required":["expandFullEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen"]},"content":{"type":"object","properties":{"title":{"type":"string","minLength":1}},"required":["title"]}},"required":["options","content"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"download":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["download","entireFileAsOriginal","noneAvailable","preview","title"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","cancel"]}},"required":["content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]}},"required":["shareDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","mediaelementCenterPanel","moreInfoRightPanel","resourcesLeftPanel","dialogue","downloadDialogue","loginDialogue","settingsDialogue"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-pdf-extension.cy-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-pdf-extension.cy-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..1a3804b4da3b7ed652afe752524d071decc2dd84
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-pdf-extension.cy-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"pessimisticAccessControl":{"type":"boolean"},"rightPanelEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1}},"required":["bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","limitLocales","openTemplate","pessimisticAccessControl","rightPanelEnabled","theme"]},"modules":{"type":"object","properties":{"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1}},"required":["embedTemplate"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"bookmarkEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"openEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["bookmarkEnabled","embedEnabled","feedbackEnabled","minimiseButtons","openEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1}},"required":["bookmark","download","embed","exitFullScreen","fullScreen","open"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"ok":{"type":"string","minLength":1}},"required":["ok"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{},"required":[]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"pdfCenterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"titleEnabled":{"type":"boolean"},"usePdfJs":{"type":"boolean"}},"required":["titleEnabled","usePdfJs"]}},"required":["options"]},"resourcesLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"elideCount":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbWidth":{"type":"number"},"oneColThumbHeight":{"type":"number"},"oneColThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"thumbsEnabled":{"type":"boolean"},"thumbsExtraHeight":{"type":"number"},"thumbsImageFadeInDuration":{"type":"number"},"thumbsLoadRange":{"type":"number"},"treeEnabled":{"type":"boolean"},"twoColThumbHeight":{"type":"number"},"twoColThumbWidth":{"type":"number"}},"required":["elideCount","galleryThumbHeight","galleryThumbWidth","oneColThumbHeight","oneColThumbWidth","pageModeEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","thumbsEnabled","thumbsExtraHeight","thumbsImageFadeInDuration","thumbsLoadRange","treeEnabled","twoColThumbHeight","twoColThumbWidth"]}},"required":["options"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"download":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["download","entireFileAsOriginal","noneAvailable","preview","title"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","cancel"]}},"required":["content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]},"contentLeftPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"index":{"type":"string","minLength":1},"thumbnails":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["collapse","collapseFull","expand","expandFull","index","thumbnails","title"]}},"required":["content"]}},"required":["shareDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","moreInfoRightPanel","pdfCenterPanel","resourcesLeftPanel","dialogue","downloadDialogue","loginDialogue","settingsDialogue","contentLeftPanel"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-pdf-extension.en-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-pdf-extension.en-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..01668a8d2afae759ea5c5042f302fffdcee17c75
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-pdf-extension.en-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"pessimisticAccessControl":{"type":"boolean"},"rightPanelEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1}},"required":["bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","limitLocales","openTemplate","pessimisticAccessControl","rightPanelEnabled","theme"]},"modules":{"type":"object","properties":{"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1}},"required":["embedTemplate"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"bookmarkEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"openEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["bookmarkEnabled","embedEnabled","feedbackEnabled","minimiseButtons","openEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1}},"required":["bookmark","download","embed","exitFullScreen","fullScreen","open"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"ok":{"type":"string","minLength":1}},"required":["ok"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1},"help":{"type":"string","minLength":1}},"required":["close","help"]}},"required":["content"]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"pdfCenterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"titleEnabled":{"type":"boolean"},"usePdfJs":{"type":"boolean"}},"required":["titleEnabled","usePdfJs"]},"content":{"type":"object","properties":{},"required":[]}},"required":["options","content"]},"resourcesLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"elideCount":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbWidth":{"type":"number"},"oneColThumbHeight":{"type":"number"},"oneColThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"thumbsEnabled":{"type":"boolean"},"thumbsExtraHeight":{"type":"number"},"thumbsImageFadeInDuration":{"type":"number"},"thumbsLoadRange":{"type":"number"},"treeEnabled":{"type":"boolean"},"twoColThumbHeight":{"type":"number"},"twoColThumbWidth":{"type":"number"}},"required":["elideCount","galleryThumbHeight","galleryThumbWidth","oneColThumbHeight","oneColThumbWidth","pageModeEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","thumbsEnabled","thumbsExtraHeight","thumbsImageFadeInDuration","thumbsLoadRange","treeEnabled","twoColThumbHeight","twoColThumbWidth"]}},"required":["options"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"download":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["download","entireFileAsOriginal","noneAvailable","preview","title"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","cancel"]}},"required":["content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]},"contentLeftPanel":{"type":"object","properties":{},"required":[]}},"required":["shareDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","moreInfoRightPanel","pdfCenterPanel","resourcesLeftPanel","dialogue","downloadDialogue","loginDialogue","settingsDialogue","contentLeftPanel"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-seadragon-extension.cy-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-seadragon-extension.cy-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..da598b928e44cbe19609c9afc8b1cd7b0a970a3e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-seadragon-extension.cy-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"allowStealFocus":{"type":"boolean"},"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"leftPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"metrics":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["type","minWidth","maxWidth"],"properties":{"type":{"type":"string","minLength":1},"minWidth":{"type":"number"},"maxWidth":{"type":"number"}}}},"multiSelectionMimeType":{"type":"string","minLength":1},"navigatorEnabled":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"overrideFullScreen":{"type":"boolean"},"pagingEnabled":{"type":"boolean"},"pagingOptionEnabled":{"type":"boolean"},"pessimisticAccessControl":{"type":"boolean"},"preserveViewport":{"type":"boolean"},"rightPanelEnabled":{"type":"boolean"},"saveUserSettings":{"type":"boolean"},"clickToZoomEnabled":{"type":"boolean"},"searchWithinEnabled":{"type":"boolean"},"termsOfUseEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1},"tokenStorage":{"type":"string","minLength":1},"useArrowKeysToNavigate":{"type":"boolean"},"zoomToSearchResultEnabled":{"type":"boolean"}},"required":["allowStealFocus","bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","leftPanelEnabled","limitLocales","metrics","multiSelectionMimeType","navigatorEnabled","openTemplate","overrideFullScreen","pagingEnabled","pagingOptionEnabled","pessimisticAccessControl","preserveViewport","rightPanelEnabled","saveUserSettings","clickToZoomEnabled","searchWithinEnabled","termsOfUseEnabled","theme","tokenStorage","useArrowKeysToNavigate","zoomToSearchResultEnabled"]},"modules":{"type":"object","properties":{"contentLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"defaultToTreeEnabled":{"type":"boolean"},"defaultToTreeIfGreaterThan":{"type":"number"},"elideCount":{"type":"number"},"expandFullEnabled":{"type":"boolean"},"galleryThumbChunkedResizingThreshold":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbLoadPadding":{"type":"number"},"galleryThumbWidth":{"type":"number"},"oneColThumbHeight":{"type":"number"},"oneColThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"tabOrder":{"type":"string"},"thumbsEnabled":{"type":"boolean"},"thumbsExtraHeight":{"type":"number"},"thumbsImageFadeInDuration":{"type":"number"},"thumbsLoadRange":{"type":"number"},"treeEnabled":{"type":"boolean"},"twoColThumbHeight":{"type":"number"},"twoColThumbWidth":{"type":"number"}},"required":["defaultToTreeEnabled","defaultToTreeIfGreaterThan","elideCount","expandFullEnabled","galleryThumbChunkedResizingThreshold","galleryThumbHeight","galleryThumbLoadPadding","galleryThumbWidth","oneColThumbHeight","oneColThumbWidth","pageModeEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","tabOrder","thumbsEnabled","thumbsExtraHeight","thumbsImageFadeInDuration","thumbsLoadRange","treeEnabled","twoColThumbHeight","twoColThumbWidth"]},"content":{"type":"object","properties":{"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"date":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"index":{"type":"string","minLength":1},"searchResult":{"type":"string","minLength":1},"searchResults":{"type":"string","minLength":1},"sortBy":{"type":"string","minLength":1},"thumbnails":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"volume":{"type":"string","minLength":1}},"required":["collapse","collapseFull","date","expand","expandFull","index","searchResult","searchResults","sortBy","thumbnails","title","volume"]}},"required":["options","content"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"confinedImageSize":{"type":"number"},"currentViewDisabledPercentage":{"type":"number"},"maxImageWidth":{"type":"number"},"optionsExplanatoryTextEnabled":{"type":"boolean"},"selectionEnabled":{"type":"boolean"}},"required":["confinedImageSize","currentViewDisabledPercentage","maxImageWidth","optionsExplanatoryTextEnabled","selectionEnabled"]},"content":{"type":"object","properties":{"currentViewAsJpg":{"type":"string","minLength":1},"currentViewAsJpgExplanation":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"downloadSelection":{"type":"string","minLength":1},"downloadSelectionExplanation":{"type":"string","minLength":1},"editSettings":{"type":"string","minLength":1},"entireDocument":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"pagingNote":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"wholeImageHighRes":{"type":"string","minLength":1},"wholeImageHighResExplanation":{"type":"string","minLength":1},"wholeImagesHighRes":{"type":"string","minLength":1},"wholeImagesHighResExplanation":{"type":"string","minLength":1},"wholeImageLowResAsJpg":{"type":"string","minLength":1},"wholeImageLowResAsJpgExplanation":{"type":"string","minLength":1}},"required":["currentViewAsJpg","currentViewAsJpgExplanation","download","downloadSelection","downloadSelectionExplanation","editSettings","entireDocument","entireFileAsOriginal","noneAvailable","pagingNote","preview","title","wholeImageHighRes","wholeImageHighResExplanation","wholeImagesHighRes","wholeImagesHighResExplanation","wholeImageLowResAsJpg","wholeImageLowResAsJpgExplanation"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"bookmarkEnabled":{"type":"boolean"},"downloadEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"fullscreenEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"moreInfoEnabled":{"type":"boolean"},"openEnabled":{"type":"boolean"},"printEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["bookmarkEnabled","downloadEnabled","embedEnabled","feedbackEnabled","fullscreenEnabled","minimiseButtons","moreInfoEnabled","openEnabled","printEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"feedback":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1},"share":{"type":"string","minLength":1}},"required":["bookmark","download","embed","feedback","exitFullScreen","fullScreen","open","share"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"emptyValue":{"type":"string","minLength":1},"invalidNumber":{"type":"string","minLength":1},"noMatches":{"type":"string","minLength":1},"ok":{"type":"string","minLength":1},"pageNotFound":{"type":"string","minLength":1},"refresh":{"type":"string","minLength":1}},"required":["emptyValue","invalidNumber","noMatches","ok","pageNotFound","refresh"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"localeToggleEnabled":{"type":"boolean"},"settingsButtonEnabled":{"type":"boolean"}},"required":["localeToggleEnabled","settingsButtonEnabled"]}},"required":["options"]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"multiSelectDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"galleryThumbChunkedResizingEnabled":{"type":"boolean"},"galleryThumbChunkedResizingThreshold":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbLoadPadding":{"type":"number"},"galleryThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"}},"required":["galleryThumbChunkedResizingEnabled","galleryThumbChunkedResizingThreshold","galleryThumbHeight","galleryThumbLoadPadding","galleryThumbWidth","pageModeEnabled"]},"content":{"type":"object","properties":{"select":{"type":"string","minLength":1},"selectAll":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["select","selectAll","title"]}},"required":["options","content"]},"pagingHeaderPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"autoCompleteBoxEnabled":{"type":"boolean"},"galleryButtonEnabled":{"type":"boolean"},"imageSelectionBoxEnabled":{"type":"boolean"},"pageModeEnabled":{"type":"boolean"},"pagingToggleEnabled":{"type":"boolean"}},"required":["autoCompleteBoxEnabled","galleryButtonEnabled","imageSelectionBoxEnabled","pageModeEnabled","pagingToggleEnabled"]},"content":{"type":"object","properties":{"close":{"type":"string","minLength":1},"emptyValue":{"type":"string","minLength":1},"first":{"type":"string","minLength":1},"firstImage":{"type":"string","minLength":1},"firstPage":{"type":"string","minLength":1},"folio":{"type":"string","minLength":1},"gallery":{"type":"string","minLength":1},"go":{"type":"string","minLength":1},"help":{"type":"string","minLength":1},"image":{"type":"string","minLength":1},"last":{"type":"string","minLength":1},"lastImage":{"type":"string","minLength":1},"lastPage":{"type":"string","minLength":1},"next":{"type":"string","minLength":1},"nextImage":{"type":"string","minLength":1},"nextPage":{"type":"string","minLength":1},"of":{"type":"string","minLength":1},"oneUp":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"previous":{"type":"string","minLength":1},"previousImage":{"type":"string","minLength":1},"previousPage":{"type":"string","minLength":1},"settings":{"type":"string","minLength":1},"twoUp":{"type":"string","minLength":1}},"required":["close","emptyValue","first","firstImage","firstPage","folio","gallery","go","help","image","last","lastImage","lastPage","next","nextImage","nextPage","of","oneUp","page","previous","previousImage","previousPage","settings","twoUp"]}},"required":["options","content"]},"seadragonCenterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"animationTime":{"type":"number"},"autoHideControls":{"type":"boolean"},"attributionEnabled":{"type":"boolean"},"blendTime":{"type":"number"},"constrainDuringPan":{"type":"boolean"},"controlsFadeAfterInactive":{"type":"number"},"controlsFadeDelay":{"type":"number"},"controlsFadeLength":{"type":"number"},"defaultZoomLevel":{"type":"number"},"immediateRender":{"type":"boolean"},"maxZoomPixelRatio":{"type":"number"},"navigatorPosition":{"type":"string","minLength":1},"pageGap":{"type":"number"},"showHomeControl":{"type":"boolean"},"trimAttributionCount":{"type":"number"},"visibilityRatio":{"type":"number"}},"required":["animationTime","autoHideControls","attributionEnabled","blendTime","constrainDuringPan","controlsFadeAfterInactive","controlsFadeDelay","controlsFadeLength","defaultZoomLevel","immediateRender","maxZoomPixelRatio","navigatorPosition","pageGap","showHomeControl","trimAttributionCount","visibilityRatio"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"goHome":{"type":"string","minLength":1},"imageUnavailable":{"type":"string","minLength":1},"next":{"type":"string","minLength":1},"previous":{"type":"string","minLength":1},"rotateRight":{"type":"string","minLength":1},"zoomIn":{"type":"string","minLength":1},"zoomOut":{"type":"string","minLength":1}},"required":["attribution","goHome","imageUnavailable","next","previous","rotateRight","zoomIn","zoomOut"]}},"required":["options","content"]},"searchFooterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"elideDetailsTermsCount":{"type":"number"},"elideResultsTermsCount":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"positionMarkerEnabled":{"type":"boolean"}},"required":["elideDetailsTermsCount","elideResultsTermsCount","pageModeEnabled","positionMarkerEnabled"]},"content":{"type":"object","properties":{"clearSearch":{"type":"string","minLength":1},"defaultLabel":{"type":"string","minLength":1},"displaying":{"type":"string","minLength":1},"enterKeyword":{"type":"string","minLength":1},"image":{"type":"string","minLength":1},"imageCaps":{"type":"string","minLength":1},"instanceFound":{"type":"string","minLength":1},"instancesFound":{"type":"string","minLength":1},"nextResult":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"pageCaps":{"type":"string","minLength":1},"previousResult":{"type":"string","minLength":1},"print":{"type":"string","minLength":1},"resultFoundFor":{"type":"string","minLength":1},"resultsFoundFor":{"type":"string","minLength":1},"searchWithin":{"type":"string","minLength":1}},"required":["clearSearch","defaultLabel","displaying","enterKeyword","image","imageCaps","instanceFound","instancesFound","nextResult","page","pageCaps","previousResult","print","resultFoundFor","resultsFoundFor","searchWithin"]}},"required":["options","content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"navigatorEnabled":{"type":"string","minLength":1},"clickToZoomEnabled":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","navigatorEnabled","clickToZoomEnabled","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]},"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1},"instructionsEnabled":{"type":"boolean"},"shareFrameEnabled":{"type":"boolean"}},"required":["embedTemplate","instructionsEnabled","shareFrameEnabled"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"clickThroughDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"viewTerms":{"type":"string","minLength":1}},"required":["viewTerms"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"logout":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","logout","cancel"]}},"required":["content"]},"mobileFooterPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"rotateRight":{"type":"string","minLength":1},"moreInfo":{"type":"string","minLength":1},"zoomIn":{"type":"string","minLength":1},"zoomOut":{"type":"string","minLength":1}},"required":["rotateRight","moreInfo","zoomIn","zoomOut"]}},"required":["content"]},"restrictedDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"cancel":{"type":"string","minLength":1}},"required":["cancel"]}},"required":["content"]}},"required":["contentLeftPanel","dialogue","downloadDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","moreInfoRightPanel","multiSelectDialogue","pagingHeaderPanel","seadragonCenterPanel","searchFooterPanel","settingsDialogue","shareDialogue","clickThroughDialogue","loginDialogue","mobileFooterPanel","restrictedDialogue"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"canvasIndexOutOfRange":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1},"termsOfUse":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","canvasIndexOutOfRange","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage","termsOfUse"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-seadragon-extension.en-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-seadragon-extension.en-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..da598b928e44cbe19609c9afc8b1cd7b0a970a3e
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-seadragon-extension.en-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"allowStealFocus":{"type":"boolean"},"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"leftPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"metrics":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["type","minWidth","maxWidth"],"properties":{"type":{"type":"string","minLength":1},"minWidth":{"type":"number"},"maxWidth":{"type":"number"}}}},"multiSelectionMimeType":{"type":"string","minLength":1},"navigatorEnabled":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"overrideFullScreen":{"type":"boolean"},"pagingEnabled":{"type":"boolean"},"pagingOptionEnabled":{"type":"boolean"},"pessimisticAccessControl":{"type":"boolean"},"preserveViewport":{"type":"boolean"},"rightPanelEnabled":{"type":"boolean"},"saveUserSettings":{"type":"boolean"},"clickToZoomEnabled":{"type":"boolean"},"searchWithinEnabled":{"type":"boolean"},"termsOfUseEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1},"tokenStorage":{"type":"string","minLength":1},"useArrowKeysToNavigate":{"type":"boolean"},"zoomToSearchResultEnabled":{"type":"boolean"}},"required":["allowStealFocus","bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","leftPanelEnabled","limitLocales","metrics","multiSelectionMimeType","navigatorEnabled","openTemplate","overrideFullScreen","pagingEnabled","pagingOptionEnabled","pessimisticAccessControl","preserveViewport","rightPanelEnabled","saveUserSettings","clickToZoomEnabled","searchWithinEnabled","termsOfUseEnabled","theme","tokenStorage","useArrowKeysToNavigate","zoomToSearchResultEnabled"]},"modules":{"type":"object","properties":{"contentLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"defaultToTreeEnabled":{"type":"boolean"},"defaultToTreeIfGreaterThan":{"type":"number"},"elideCount":{"type":"number"},"expandFullEnabled":{"type":"boolean"},"galleryThumbChunkedResizingThreshold":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbLoadPadding":{"type":"number"},"galleryThumbWidth":{"type":"number"},"oneColThumbHeight":{"type":"number"},"oneColThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"tabOrder":{"type":"string"},"thumbsEnabled":{"type":"boolean"},"thumbsExtraHeight":{"type":"number"},"thumbsImageFadeInDuration":{"type":"number"},"thumbsLoadRange":{"type":"number"},"treeEnabled":{"type":"boolean"},"twoColThumbHeight":{"type":"number"},"twoColThumbWidth":{"type":"number"}},"required":["defaultToTreeEnabled","defaultToTreeIfGreaterThan","elideCount","expandFullEnabled","galleryThumbChunkedResizingThreshold","galleryThumbHeight","galleryThumbLoadPadding","galleryThumbWidth","oneColThumbHeight","oneColThumbWidth","pageModeEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","tabOrder","thumbsEnabled","thumbsExtraHeight","thumbsImageFadeInDuration","thumbsLoadRange","treeEnabled","twoColThumbHeight","twoColThumbWidth"]},"content":{"type":"object","properties":{"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"date":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"index":{"type":"string","minLength":1},"searchResult":{"type":"string","minLength":1},"searchResults":{"type":"string","minLength":1},"sortBy":{"type":"string","minLength":1},"thumbnails":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"volume":{"type":"string","minLength":1}},"required":["collapse","collapseFull","date","expand","expandFull","index","searchResult","searchResults","sortBy","thumbnails","title","volume"]}},"required":["options","content"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"confinedImageSize":{"type":"number"},"currentViewDisabledPercentage":{"type":"number"},"maxImageWidth":{"type":"number"},"optionsExplanatoryTextEnabled":{"type":"boolean"},"selectionEnabled":{"type":"boolean"}},"required":["confinedImageSize","currentViewDisabledPercentage","maxImageWidth","optionsExplanatoryTextEnabled","selectionEnabled"]},"content":{"type":"object","properties":{"currentViewAsJpg":{"type":"string","minLength":1},"currentViewAsJpgExplanation":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"downloadSelection":{"type":"string","minLength":1},"downloadSelectionExplanation":{"type":"string","minLength":1},"editSettings":{"type":"string","minLength":1},"entireDocument":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"pagingNote":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"wholeImageHighRes":{"type":"string","minLength":1},"wholeImageHighResExplanation":{"type":"string","minLength":1},"wholeImagesHighRes":{"type":"string","minLength":1},"wholeImagesHighResExplanation":{"type":"string","minLength":1},"wholeImageLowResAsJpg":{"type":"string","minLength":1},"wholeImageLowResAsJpgExplanation":{"type":"string","minLength":1}},"required":["currentViewAsJpg","currentViewAsJpgExplanation","download","downloadSelection","downloadSelectionExplanation","editSettings","entireDocument","entireFileAsOriginal","noneAvailable","pagingNote","preview","title","wholeImageHighRes","wholeImageHighResExplanation","wholeImagesHighRes","wholeImagesHighResExplanation","wholeImageLowResAsJpg","wholeImageLowResAsJpgExplanation"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"bookmarkEnabled":{"type":"boolean"},"downloadEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"fullscreenEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"moreInfoEnabled":{"type":"boolean"},"openEnabled":{"type":"boolean"},"printEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["bookmarkEnabled","downloadEnabled","embedEnabled","feedbackEnabled","fullscreenEnabled","minimiseButtons","moreInfoEnabled","openEnabled","printEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"feedback":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1},"share":{"type":"string","minLength":1}},"required":["bookmark","download","embed","feedback","exitFullScreen","fullScreen","open","share"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"emptyValue":{"type":"string","minLength":1},"invalidNumber":{"type":"string","minLength":1},"noMatches":{"type":"string","minLength":1},"ok":{"type":"string","minLength":1},"pageNotFound":{"type":"string","minLength":1},"refresh":{"type":"string","minLength":1}},"required":["emptyValue","invalidNumber","noMatches","ok","pageNotFound","refresh"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"localeToggleEnabled":{"type":"boolean"},"settingsButtonEnabled":{"type":"boolean"}},"required":["localeToggleEnabled","settingsButtonEnabled"]}},"required":["options"]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"multiSelectDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"galleryThumbChunkedResizingEnabled":{"type":"boolean"},"galleryThumbChunkedResizingThreshold":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbLoadPadding":{"type":"number"},"galleryThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"}},"required":["galleryThumbChunkedResizingEnabled","galleryThumbChunkedResizingThreshold","galleryThumbHeight","galleryThumbLoadPadding","galleryThumbWidth","pageModeEnabled"]},"content":{"type":"object","properties":{"select":{"type":"string","minLength":1},"selectAll":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["select","selectAll","title"]}},"required":["options","content"]},"pagingHeaderPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"autoCompleteBoxEnabled":{"type":"boolean"},"galleryButtonEnabled":{"type":"boolean"},"imageSelectionBoxEnabled":{"type":"boolean"},"pageModeEnabled":{"type":"boolean"},"pagingToggleEnabled":{"type":"boolean"}},"required":["autoCompleteBoxEnabled","galleryButtonEnabled","imageSelectionBoxEnabled","pageModeEnabled","pagingToggleEnabled"]},"content":{"type":"object","properties":{"close":{"type":"string","minLength":1},"emptyValue":{"type":"string","minLength":1},"first":{"type":"string","minLength":1},"firstImage":{"type":"string","minLength":1},"firstPage":{"type":"string","minLength":1},"folio":{"type":"string","minLength":1},"gallery":{"type":"string","minLength":1},"go":{"type":"string","minLength":1},"help":{"type":"string","minLength":1},"image":{"type":"string","minLength":1},"last":{"type":"string","minLength":1},"lastImage":{"type":"string","minLength":1},"lastPage":{"type":"string","minLength":1},"next":{"type":"string","minLength":1},"nextImage":{"type":"string","minLength":1},"nextPage":{"type":"string","minLength":1},"of":{"type":"string","minLength":1},"oneUp":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"previous":{"type":"string","minLength":1},"previousImage":{"type":"string","minLength":1},"previousPage":{"type":"string","minLength":1},"settings":{"type":"string","minLength":1},"twoUp":{"type":"string","minLength":1}},"required":["close","emptyValue","first","firstImage","firstPage","folio","gallery","go","help","image","last","lastImage","lastPage","next","nextImage","nextPage","of","oneUp","page","previous","previousImage","previousPage","settings","twoUp"]}},"required":["options","content"]},"seadragonCenterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"animationTime":{"type":"number"},"autoHideControls":{"type":"boolean"},"attributionEnabled":{"type":"boolean"},"blendTime":{"type":"number"},"constrainDuringPan":{"type":"boolean"},"controlsFadeAfterInactive":{"type":"number"},"controlsFadeDelay":{"type":"number"},"controlsFadeLength":{"type":"number"},"defaultZoomLevel":{"type":"number"},"immediateRender":{"type":"boolean"},"maxZoomPixelRatio":{"type":"number"},"navigatorPosition":{"type":"string","minLength":1},"pageGap":{"type":"number"},"showHomeControl":{"type":"boolean"},"trimAttributionCount":{"type":"number"},"visibilityRatio":{"type":"number"}},"required":["animationTime","autoHideControls","attributionEnabled","blendTime","constrainDuringPan","controlsFadeAfterInactive","controlsFadeDelay","controlsFadeLength","defaultZoomLevel","immediateRender","maxZoomPixelRatio","navigatorPosition","pageGap","showHomeControl","trimAttributionCount","visibilityRatio"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"goHome":{"type":"string","minLength":1},"imageUnavailable":{"type":"string","minLength":1},"next":{"type":"string","minLength":1},"previous":{"type":"string","minLength":1},"rotateRight":{"type":"string","minLength":1},"zoomIn":{"type":"string","minLength":1},"zoomOut":{"type":"string","minLength":1}},"required":["attribution","goHome","imageUnavailable","next","previous","rotateRight","zoomIn","zoomOut"]}},"required":["options","content"]},"searchFooterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"elideDetailsTermsCount":{"type":"number"},"elideResultsTermsCount":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"positionMarkerEnabled":{"type":"boolean"}},"required":["elideDetailsTermsCount","elideResultsTermsCount","pageModeEnabled","positionMarkerEnabled"]},"content":{"type":"object","properties":{"clearSearch":{"type":"string","minLength":1},"defaultLabel":{"type":"string","minLength":1},"displaying":{"type":"string","minLength":1},"enterKeyword":{"type":"string","minLength":1},"image":{"type":"string","minLength":1},"imageCaps":{"type":"string","minLength":1},"instanceFound":{"type":"string","minLength":1},"instancesFound":{"type":"string","minLength":1},"nextResult":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"pageCaps":{"type":"string","minLength":1},"previousResult":{"type":"string","minLength":1},"print":{"type":"string","minLength":1},"resultFoundFor":{"type":"string","minLength":1},"resultsFoundFor":{"type":"string","minLength":1},"searchWithin":{"type":"string","minLength":1}},"required":["clearSearch","defaultLabel","displaying","enterKeyword","image","imageCaps","instanceFound","instancesFound","nextResult","page","pageCaps","previousResult","print","resultFoundFor","resultsFoundFor","searchWithin"]}},"required":["options","content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"navigatorEnabled":{"type":"string","minLength":1},"clickToZoomEnabled":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","navigatorEnabled","clickToZoomEnabled","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]},"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1},"instructionsEnabled":{"type":"boolean"},"shareFrameEnabled":{"type":"boolean"}},"required":["embedTemplate","instructionsEnabled","shareFrameEnabled"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"clickThroughDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"viewTerms":{"type":"string","minLength":1}},"required":["viewTerms"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"logout":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","logout","cancel"]}},"required":["content"]},"mobileFooterPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"rotateRight":{"type":"string","minLength":1},"moreInfo":{"type":"string","minLength":1},"zoomIn":{"type":"string","minLength":1},"zoomOut":{"type":"string","minLength":1}},"required":["rotateRight","moreInfo","zoomIn","zoomOut"]}},"required":["content"]},"restrictedDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"cancel":{"type":"string","minLength":1}},"required":["cancel"]}},"required":["content"]}},"required":["contentLeftPanel","dialogue","downloadDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","moreInfoRightPanel","multiSelectDialogue","pagingHeaderPanel","seadragonCenterPanel","searchFooterPanel","settingsDialogue","shareDialogue","clickThroughDialogue","loginDialogue","mobileFooterPanel","restrictedDialogue"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"canvasIndexOutOfRange":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1},"termsOfUse":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","canvasIndexOutOfRange","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage","termsOfUse"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-virtex-extension.cy-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-virtex-extension.cy-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..e139a152b3a863cb73587a41119181df205d150b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-virtex-extension.cy-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"leftPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"rightPanelEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1}},"required":["bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","leftPanelEnabled","limitLocales","openTemplate","rightPanelEnabled","theme"]},"modules":{"type":"object","properties":{"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1}},"required":["embedTemplate"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"downloadEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"openEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["downloadEnabled","embedEnabled","feedbackEnabled","minimiseButtons","openEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1}},"required":["bookmark","download","embed","exitFullScreen","fullScreen","open"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"ok":{"type":"string","minLength":1}},"required":["ok"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1},"help":{"type":"string","minLength":1}},"required":["close","help"]}},"required":["content"]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"contentLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"elideCount":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbWidth":{"type":"number"},"oneColThumbHeight":{"type":"number"},"oneColThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"thumbsEnabled":{"type":"boolean"},"thumbsExtraHeight":{"type":"number"},"thumbsImageFadeInDuration":{"type":"number"},"thumbsLoadRange":{"type":"number"},"treeEnabled":{"type":"boolean"},"twoColThumbHeight":{"type":"number"},"twoColThumbWidth":{"type":"number"}},"required":["elideCount","galleryThumbHeight","galleryThumbWidth","oneColThumbHeight","oneColThumbWidth","pageModeEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","thumbsEnabled","thumbsExtraHeight","thumbsImageFadeInDuration","thumbsLoadRange","treeEnabled","twoColThumbHeight","twoColThumbWidth"]}},"required":["options"]},"virtexCenterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"showStats":{"type":"boolean"},"trimAttributionCount":{"type":"number"}},"required":["showStats","trimAttributionCount"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"zoomIn":{"type":"string","minLength":1},"zoomOut":{"type":"string","minLength":1}},"required":["attribution","zoomIn","zoomOut"]}},"required":["options","content"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"download":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["download","entireFileAsOriginal","noneAvailable","preview","title"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","cancel"]}},"required":["content"]},"mediaelementCenterPanel":{"type":"object","properties":{"content":{"type":"object","properties":{},"required":[]}},"required":["content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]}},"required":["shareDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","moreInfoRightPanel","contentLeftPanel","virtexCenterPanel","dialogue","downloadDialogue","loginDialogue","mediaelementCenterPanel","settingsDialogue"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/schema/uv-virtex-extension.en-GB.schema.json b/public/opac/js/universalviewer-2.0.2/schema/uv-virtex-extension.en-GB.schema.json
new file mode 100644
index 0000000000000000000000000000000000000000..e139a152b3a863cb73587a41119181df205d150b
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/schema/uv-virtex-extension.en-GB.schema.json
@@ -0,0 +1 @@
+{"$schema":"http://json-schema.org/draft-04/schema#","description":"","type":"object","properties":{"options":{"type":"object","properties":{"bookmarkThumbHeight":{"type":"number"},"bookmarkThumbWidth":{"type":"number"},"dropEnabled":{"type":"boolean"},"footerPanelEnabled":{"type":"boolean"},"headerPanelEnabled":{"type":"boolean"},"leftPanelEnabled":{"type":"boolean"},"limitLocales":{"type":"boolean"},"openTemplate":{"type":"string","minLength":1},"rightPanelEnabled":{"type":"boolean"},"theme":{"type":"string","minLength":1}},"required":["bookmarkThumbHeight","bookmarkThumbWidth","dropEnabled","footerPanelEnabled","headerPanelEnabled","leftPanelEnabled","limitLocales","openTemplate","rightPanelEnabled","theme"]},"modules":{"type":"object","properties":{"shareDialogue":{"type":"object","properties":{"options":{"type":"object","properties":{"embedTemplate":{"type":"string","minLength":1}},"required":["embedTemplate"]},"content":{"type":"object","properties":{"customSize":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"embedInstructions":{"type":"string","minLength":1},"height":{"type":"string","minLength":1},"iiif":{"type":"string","minLength":1},"share":{"type":"string","minLength":1},"shareInstructions":{"type":"string","minLength":1},"size":{"type":"string","minLength":1},"width":{"type":"string","minLength":1}},"required":["customSize","embed","embedInstructions","height","iiif","share","shareInstructions","size","width"]}},"required":["options","content"]},"footerPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"downloadEnabled":{"type":"boolean"},"embedEnabled":{"type":"boolean"},"feedbackEnabled":{"type":"boolean"},"minimiseButtons":{"type":"boolean"},"openEnabled":{"type":"boolean"},"shareEnabled":{"type":"boolean"}},"required":["downloadEnabled","embedEnabled","feedbackEnabled","minimiseButtons","openEnabled","shareEnabled"]},"content":{"type":"object","properties":{"bookmark":{"type":"string","minLength":1},"download":{"type":"string","minLength":1},"embed":{"type":"string","minLength":1},"exitFullScreen":{"type":"string","minLength":1},"fullScreen":{"type":"string","minLength":1},"open":{"type":"string","minLength":1}},"required":["bookmark","download","embed","exitFullScreen","fullScreen","open"]}},"required":["options","content"]},"genericDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"ok":{"type":"string","minLength":1}},"required":["ok"]}},"required":["content"]},"headerPanel":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1},"help":{"type":"string","minLength":1}},"required":["close","help"]}},"required":["content"]},"helpDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"text":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["text","title"]}},"required":["content"]},"moreInfoRightPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"canvasDisplayOrder":{"type":"string"},"canvasExclude":{"type":"string"},"copyToClipboardEnabled":{"type":"boolean"},"manifestDisplayOrder":{"type":"string"},"manifestExclude":{"type":"string"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"rtlLanguageCodes":{"type":"string","minLength":1},"showAllLanguages":{"type":"boolean"},"textLimit":{"type":"number"},"textLimitType":{"type":"string","minLength":1}},"required":["canvasDisplayOrder","canvasExclude","copyToClipboardEnabled","manifestDisplayOrder","manifestExclude","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","rtlLanguageCodes","showAllLanguages","textLimit","textLimitType"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"collapse":{"type":"string","minLength":1},"collapseFull":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"expand":{"type":"string","minLength":1},"expandFull":{"type":"string","minLength":1},"holdingText":{"type":"string","minLength":1},"less":{"type":"string","minLength":1},"license":{"type":"string","minLength":1},"logo":{"type":"string","minLength":1},"more":{"type":"string","minLength":1},"noData":{"type":"string","minLength":1},"page":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"manifestHeader":{"type":"string","minLength":1},"canvasHeader":{"type":"string","minLength":1},"copyToClipboard":{"type":"string","minLength":1},"copiedToClipboard":{"type":"string","minLength":1}},"required":["attribution","collapse","collapseFull","description","expand","expandFull","holdingText","less","license","logo","more","noData","page","title","manifestHeader","canvasHeader","copyToClipboard","copiedToClipboard"]}},"required":["options","content"]},"contentLeftPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"elideCount":{"type":"number"},"galleryThumbHeight":{"type":"number"},"galleryThumbWidth":{"type":"number"},"oneColThumbHeight":{"type":"number"},"oneColThumbWidth":{"type":"number"},"pageModeEnabled":{"type":"boolean"},"panelAnimationDuration":{"type":"number"},"panelCollapsedWidth":{"type":"number"},"panelExpandedWidth":{"type":"number"},"panelOpen":{"type":"boolean"},"thumbsEnabled":{"type":"boolean"},"thumbsExtraHeight":{"type":"number"},"thumbsImageFadeInDuration":{"type":"number"},"thumbsLoadRange":{"type":"number"},"treeEnabled":{"type":"boolean"},"twoColThumbHeight":{"type":"number"},"twoColThumbWidth":{"type":"number"}},"required":["elideCount","galleryThumbHeight","galleryThumbWidth","oneColThumbHeight","oneColThumbWidth","pageModeEnabled","panelAnimationDuration","panelCollapsedWidth","panelExpandedWidth","panelOpen","thumbsEnabled","thumbsExtraHeight","thumbsImageFadeInDuration","thumbsLoadRange","treeEnabled","twoColThumbHeight","twoColThumbWidth"]}},"required":["options"]},"virtexCenterPanel":{"type":"object","properties":{"options":{"type":"object","properties":{"showStats":{"type":"boolean"},"trimAttributionCount":{"type":"number"}},"required":["showStats","trimAttributionCount"]},"content":{"type":"object","properties":{"attribution":{"type":"string","minLength":1},"zoomIn":{"type":"string","minLength":1},"zoomOut":{"type":"string","minLength":1}},"required":["attribution","zoomIn","zoomOut"]}},"required":["options","content"]},"dialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"close":{"type":"string","minLength":1}},"required":["close"]}},"required":["content"]},"downloadDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"download":{"type":"string","minLength":1},"entireFileAsOriginal":{"type":"string","minLength":1},"noneAvailable":{"type":"string","minLength":1},"preview":{"type":"string","minLength":1},"title":{"type":"string","minLength":1}},"required":["download","entireFileAsOriginal","noneAvailable","preview","title"]}},"required":["content"]},"loginDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"login":{"type":"string","minLength":1},"cancel":{"type":"string","minLength":1}},"required":["login","cancel"]}},"required":["content"]},"mediaelementCenterPanel":{"type":"object","properties":{"content":{"type":"object","properties":{},"required":[]}},"required":["content"]},"settingsDialogue":{"type":"object","properties":{"content":{"type":"object","properties":{"locale":{"type":"string","minLength":1},"pagingEnabled":{"type":"string","minLength":1},"preserveViewport":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"website":{"type":"string","minLength":1}},"required":["locale","pagingEnabled","preserveViewport","title","website"]}},"required":["content"]}},"required":["shareDialogue","footerPanel","genericDialogue","headerPanel","helpDialogue","moreInfoRightPanel","contentLeftPanel","virtexCenterPanel","dialogue","downloadDialogue","loginDialogue","mediaelementCenterPanel","settingsDialogue"]},"localisation":{"type":"object","properties":{"label":{"type":"string","minLength":1},"locales":{"type":"array","uniqueItems":true,"minItems":1,"items":{"required":["name","label"],"properties":{"name":{"type":"string","minLength":1},"label":{"type":"string","minLength":1}}}}},"required":["label","locales"]},"content":{"type":"object","properties":{"authCORSError":{"type":"string","minLength":1},"authorisationFailedMessage":{"type":"string","minLength":1},"degradedResourceMessage":{"type":"string","minLength":1},"degradedResourceLogin":{"type":"string","minLength":1},"forbiddenResourceMessage":{"type":"string","minLength":1}},"required":["authCORSError","authorisationFailedMessage","degradedResourceMessage","degradedResourceLogin","forbiddenResourceMessage"]}},"required":["options","modules","localisation","content"]}
\ No newline at end of file
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-mediaelement-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-mediaelement-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..50ac788106822705a1515ce5c9b4f4cb75470cf1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-mediaelement-extension/theme.css
@@ -0,0 +1,3178 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel ul {
+  margin: 10px 10px 10px 10px;
+  padding: 0;
+  list-style-type: none;
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+.mejs-container {
+  position: relative;
+  background: #000;
+  font-family: Helvetica, Arial;
+  text-align: left;
+  vertical-align: top;
+}
+.me-plugin {
+  position: absolute;
+}
+.mejs-embed,
+.mejs-embed body {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  background: #000;
+  overflow: hidden;
+}
+.mejs-container-fullscreen {
+  position: fixed;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  z-index: 1000;
+}
+.mejs-container-fullscreen .mejs-mediaelement,
+.mejs-container-fullscreen video {
+  width: 100%;
+  height: 100%;
+}
+/* Start: LAYERS */
+.mejs-background {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.mejs-mediaelement {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+.mejs-poster {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.mejs-poster img {
+  padding: 0;
+  border: 0;
+  display: block;
+}
+.mejs-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.mejs-overlay-play {
+  cursor: pointer;
+}
+.mejs-overlay-button {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100px;
+  height: 100px;
+  margin: -50px 0 0 -50px;
+  background: url('../../img/uv-mediaelementcenterpanel-module/bigplay.png') no-repeat;
+}
+.mejs-overlay:hover .mejs-overlay-button {
+  background-position: 0 -100px;
+}
+.mejs-overlay-loading {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 80px;
+  height: 80px;
+  margin: -40px 0 0 -40px;
+  background: #333;
+  background: url(background.png);
+  background: rgba(0, 0, 0, 0.9);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50, 50, 50, 0.9)), to(rgba(0, 0, 0, 0.9)));
+  background: -webkit-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: -moz-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: -o-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: -ms-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: linear-gradient(rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+}
+.mejs-overlay-loading span {
+  display: block;
+  width: 80px;
+  height: 80px;
+  background: transparent url('../../img/uv-mediaelementcenterpanel-module/loading.gif') 50% 50% no-repeat;
+}
+/* End: LAYERS */
+/* Start: CONTROL BAR */
+.mejs-container .mejs-controls {
+  position: absolute;
+  background: none;
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+  bottom: 0;
+  left: 0;
+  background: url(background.png);
+  background: rgba(0, 0, 0, 0.7);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50, 50, 50, 0.7)), to(rgba(0, 0, 0, 0.7)));
+  background: -webkit-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -moz-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -o-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -ms-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: linear-gradient(rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  height: 30px;
+  width: 100%;
+}
+.mejs-container .mejs-controls div {
+  list-style-type: none;
+  background-image: none;
+  display: block;
+  float: left;
+  margin: 0;
+  padding: 0;
+  width: 26px;
+  height: 26px;
+  font-size: 11px;
+  line-height: 11px;
+  background: 0;
+  font-family: Helvetica, Arial;
+  border: 0;
+}
+.mejs-controls .mejs-button button {
+  cursor: pointer;
+  display: block;
+  font-size: 0;
+  line-height: 0;
+  text-decoration: none;
+  margin: 7px 5px;
+  padding: 0;
+  position: absolute;
+  height: 16px;
+  width: 16px;
+  border: 0;
+  outline-color: transparent !important;
+  background: transparent url(controls.png) no-repeat;
+}
+/* :focus for accessibility */
+.mejs-controls .mejs-button button:focus {
+  outline: solid 1px yellow;
+}
+/* End: CONTROL BAR */
+/* Start: Time (current / duration) */
+.mejs-container .mejs-controls .mejs-time {
+  color: #fff;
+  display: block;
+  height: 20px;
+  width: auto;
+  padding: 8px 3px 0 3px ;
+  overflow: hidden;
+  text-align: center;
+  padding: auto 4px;
+}
+.mejs-container .mejs-controls .mejs-time span {
+  font-size: 11px;
+  color: #fff;
+  line-height: 12px;
+  display: block;
+  float: left;
+  margin: 1px 2px 0 0;
+  width: auto;
+}
+/* End: Time (current / duration) */
+/* Start: Play/pause */
+.mejs-controls .mejs-play button {
+  background-position: 0 0;
+}
+.mejs-controls .mejs-pause button {
+  background-position: 0 -16px;
+}
+/* End: Play/pause */
+/* Stop */
+.mejs-controls .mejs-stop button {
+  background-position: -112px 0;
+}
+/* End: Play/pause */
+/* Start: Progress bar */
+.mejs-controls div.mejs-time-rail {
+  width: 200px;
+  padding-top: 5px;
+}
+.mejs-controls .mejs-time-rail span {
+  display: block;
+  position: absolute;
+  width: 180px;
+  height: 10px;
+  -webkit-border-radius: 2px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+  cursor: pointer;
+}
+.mejs-controls .mejs-time-rail .mejs-time-total {
+  margin: 5px;
+  background: #333;
+  background: rgba(50, 50, 50, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30, 30, 30, 0.8)), to(rgba(60, 60, 60, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -moz-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -o-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -ms-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: linear-gradient(rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+}
+.mejs-controls .mejs-time-rail .mejs-time-loaded {
+  background: #3caac8;
+  background: rgba(60, 170, 200, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(44, 124, 145, 0.8)), to(rgba(78, 183, 212, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: -moz-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: -o-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: -ms-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: linear-gradient(rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  width: 0;
+}
+.mejs-controls .mejs-time-rail .mejs-time-current {
+  width: 0;
+  background: #fff;
+  background: rgba(255, 255, 255, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.9)), to(rgba(200, 200, 200, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -o-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -ms-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: linear-gradient(rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+}
+.mejs-controls .mejs-time-rail .mejs-time-handle {
+  display: none;
+  position: absolute;
+  margin: 0;
+  width: 10px;
+  background: #fff;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  cursor: pointer;
+  border: solid 2px #333;
+  top: -2px;
+  text-align: center;
+}
+.mejs-controls .mejs-time-rail .mejs-time-float {
+  position: absolute;
+  display: none;
+  background: #eee;
+  width: 36px;
+  height: 17px;
+  /*border: solid 1px #333;*/
+  top: -26px;
+  margin-left: -18px;
+  text-align: center;
+  color: #111;
+}
+.mejs-controls .mejs-time-rail .mejs-time-float-current {
+  margin: 2px;
+  width: 30px;
+  display: block;
+  text-align: center;
+  left: 0;
+}
+.mejs-controls .mejs-time-rail .mejs-time-float-corner {
+  /*position: absolute;*/
+  display: block;
+  width: 0;
+  height: 0;
+  line-height: 0;
+  border: solid 5px #eee;
+  border-color: #eee transparent transparent transparent;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  /*top: 15px;
+	left: 13px;*/
+  margin-top: -13px;
+  margin-left: 12px;
+}
+/*
+.mejs-controls .mejs-time-rail:hover .mejs-time-handle {
+	visibility:visible;
+}
+*/
+/* End: Progress bar */
+/* Start: Fullscreen */
+.mejs-controls .mejs-fullscreen-button button {
+  background-position: -32px 0;
+}
+.mejs-controls .mejs-unfullscreen button {
+  background-position: -32px -16px;
+}
+/* End: Fullscreen */
+/* Start: Mute/Volume */
+.mejs-controls .mejs-mute button {
+  background-position: -16px -16px;
+}
+.mejs-controls .mejs-unmute button {
+  background-position: -16px 0;
+}
+.mejs-controls .mejs-volume-button {
+  position: relative;
+}
+.mejs-controls .mejs-volume-button .mejs-volume-slider {
+  display: none;
+  height: 115px;
+  width: 25px;
+  background: url(background.png);
+  background: rgba(50, 50, 50, 0.7);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  top: -115px;
+  left: 0;
+  z-index: 1;
+  position: absolute;
+  margin: 0;
+}
+.mejs-controls .mejs-volume-button:hover {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+/*
+.mejs-controls .mejs-volume-button:hover .mejs-volume-slider {
+	display: block;
+}
+*/
+.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total {
+  position: absolute;
+  left: 11px;
+  top: 8px;
+  width: 2px;
+  height: 100px;
+  background: #ddd;
+  background: rgba(255, 255, 255, 0.5);
+  margin: 0;
+}
+.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current {
+  position: absolute;
+  left: 11px;
+  top: 8px;
+  width: 2px;
+  height: 100px;
+  background: #ddd;
+  background: rgba(255, 255, 255, 0.9);
+  margin: 0;
+}
+.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle {
+  position: absolute;
+  left: 4px;
+  top: -3px;
+  width: 16px;
+  height: 6px;
+  background: #ddd;
+  background: rgba(255, 255, 255, 0.9);
+  cursor: N-resize;
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+  margin: 0;
+}
+/* horizontal version */
+.mejs-controls div.mejs-horizontal-volume-slider {
+  height: 26px;
+  width: 60px;
+  position: relative;
+}
+.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {
+  position: absolute;
+  left: 0;
+  top: 11px;
+  width: 50px;
+  height: 8px;
+  margin: 0;
+  padding: 0;
+  font-size: 1px;
+  -webkit-border-radius: 2px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+  background: #333;
+  background: rgba(50, 50, 50, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30, 30, 30, 0.8)), to(rgba(60, 60, 60, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -moz-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -o-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -ms-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: linear-gradient(rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+}
+.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {
+  position: absolute;
+  left: 0;
+  top: 11px;
+  width: 50px;
+  height: 8px;
+  margin: 0;
+  padding: 0;
+  font-size: 1px;
+  -webkit-border-radius: 2px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+  background: #fff;
+  background: rgba(255, 255, 255, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.9)), to(rgba(200, 200, 200, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -o-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -ms-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: linear-gradient(rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+}
+.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle {
+  display: none;
+}
+/* End: Mute/Volume */
+/* Start: TRACK (Captions and Chapters) */
+.mejs-controls .mejs-captions-button {
+  position: relative;
+}
+.mejs-controls .mejs-captions-button button {
+  background-position: -48px 0;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector {
+  visibility: hidden;
+  position: absolute;
+  bottom: 26px;
+  right: -10px;
+  width: 130px;
+  height: 100px;
+  background: url(background.png);
+  background: rgba(50, 50, 50, 0.7);
+  border: solid 1px transparent;
+  padding: 10px;
+  overflow: hidden;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+/*
+.mejs-controls .mejs-captions-button:hover  .mejs-captions-selector {
+	visibility: visible;
+}
+*/
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul {
+  margin: 0;
+  padding: 0;
+  display: block;
+  list-style-type: none !important;
+  overflow: hidden;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul li {
+  margin: 0 0 6px 0;
+  padding: 0;
+  list-style-type: none !important;
+  display: block;
+  color: #fff;
+  overflow: hidden;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input {
+  clear: both;
+  float: left;
+  margin: 3px 3px 0 5px;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label {
+  width: 100px;
+  float: left;
+  padding: 4px 0 0 0;
+  line-height: 15px;
+  font-family: helvetica, arial;
+  font-size: 10px;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-translations {
+  font-size: 10px;
+  margin: 0 0 5px 0;
+}
+.mejs-chapters {
+  position: absolute;
+  top: 0;
+  left: 0;
+  -xborder-right: solid 1px #fff;
+  width: 10000px;
+}
+.mejs-chapters .mejs-chapter {
+  position: absolute;
+  float: left;
+  background: #222;
+  background: rgba(0, 0, 0, 0.7);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50, 50, 50, 0.7)), to(rgba(0, 0, 0, 0.7)));
+  background: -webkit-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -moz-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -o-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -ms-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: linear-gradient(rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#323232, endColorstr=#000000);
+  overflow: hidden;
+  border: 0;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block {
+  font-size: 11px;
+  color: #fff;
+  padding: 5px;
+  display: block;
+  border-right: solid 1px #333;
+  border-bottom: solid 1px #333;
+  cursor: pointer;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block-last {
+  border-right: none;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block:hover {
+  /*background: #333;*/
+  background: #666;
+  background: rgba(102, 102, 102, 0.7);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(102, 102, 102, 0.7)), to(rgba(50, 50, 50, 0.6)));
+  background: -webkit-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: -moz-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: -o-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: -ms-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: linear-gradient(rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#666666, endColorstr=#323232);
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title {
+  font-size: 12px;
+  font-weight: bold;
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  margin: 0 0 3px 0;
+  line-height: 12px;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan {
+  font-size: 12px;
+  line-height: 12px;
+  margin: 3px 0 4px 0;
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.mejs-captions-layer {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  text-align: center;
+  /*font-weight: bold;*/
+  line-height: 22px;
+  font-size: 12px;
+  color: #fff;
+}
+.mejs-captions-layer a {
+  color: #fff;
+  text-decoration: underline;
+}
+.mejs-captions-layer[lang=ar] {
+  font-size: 20px;
+  font-weight: normal;
+}
+.mejs-captions-position {
+  position: absolute;
+  width: 100%;
+  bottom: 15px;
+  left: 0;
+}
+.mejs-captions-position-hover {
+  bottom: 45px;
+}
+.mejs-captions-text {
+  padding: 3px 5px;
+  background: url(background.png);
+  background: rgba(20, 20, 20, 0.8);
+}
+/* End: TRACK (Captions and Chapters) */
+.mejs-clear {
+  clear: both;
+}
+/* Start: ERROR */
+.me-cannotplay {
+  padding: 20px;
+  color: #fff;
+  vertical-align: middle;
+}
+.me-cannotplay p {
+  position: relative;
+  top: 50%;
+  text-align: center;
+  width: 80%;
+}
+.me-cannotplay a {
+  color: #fff;
+  font-weight: bold;
+  text-decoration: underline;
+}
+.me-cannotplay span {
+  padding: 15px;
+  display: block;
+}
+/* End: ERROR */
+/* Start: Loop */
+.mejs-controls .mejs-loop-off button {
+  background-position: -64px -16px;
+}
+.mejs-controls .mejs-loop-on button {
+  background-position: -64px 0;
+}
+/* End: Loop */
+/* Start: backlight */
+.mejs-controls .mejs-backlight-off button {
+  background-position: -80px -16px;
+}
+.mejs-controls .mejs-backlight-on button {
+  background-position: -80px 0;
+}
+/* End: backlight */
+/* Start: picture controls */
+.mejs-controls .mejs-picturecontrols-button {
+  background-position: -96px 0;
+}
+/* End: picture controls */
+/* context menu */
+.mejs-contextmenu {
+  position: absolute;
+  width: 150px;
+  padding: 10px;
+  border-radius: 4px;
+  top: 0;
+  left: 0;
+  background: #fff;
+  border: solid 1px #999;
+  z-index: 1001;
+  /* make sure it shows on fullscreen */
+}
+.mejs-contextmenu .mejs-contextmenu-separator {
+  height: 1px;
+  font-size: 0;
+  margin: 5px 6px;
+  background: #333;
+}
+.mejs-contextmenu .mejs-contextmenu-item {
+  font-family: Helvetica, Arial;
+  font-size: 12px;
+  padding: 4px 6px;
+  cursor: pointer;
+  color: #333;
+}
+.mejs-contextmenu .mejs-contextmenu-item:hover {
+  background: #2C7C91;
+  color: #fff;
+}
+/* Start: SourceChooser */
+.mejs-controls .mejs-sourcechooser-button {
+  position: relative;
+}
+.mejs-controls .mejs-sourcechooser-button button {
+  background-position: -128px 0;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector {
+  visibility: hidden;
+  position: absolute;
+  bottom: 26px;
+  right: -10px;
+  width: 130px;
+  height: 100px;
+  background: url(background.png);
+  background: rgba(50, 50, 50, 0.7);
+  border: solid 1px transparent;
+  padding: 10px;
+  overflow: hidden;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul {
+  margin: 0;
+  padding: 0;
+  display: block;
+  list-style-type: none !important;
+  overflow: hidden;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li {
+  margin: 0 0 6px 0;
+  padding: 0;
+  list-style-type: none !important;
+  display: block;
+  color: #fff;
+  overflow: hidden;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input {
+  clear: both;
+  float: left;
+  margin: 3px 3px 0 5px;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label {
+  width: 100px;
+  float: left;
+  padding: 4px 0 0 0;
+  line-height: 15px;
+  font-family: helvetica, arial;
+  font-size: 10px;
+}
+/* End: SourceChooser */
+/* UV */
+.mejs-container.mejs-uv {
+  background-color: transparent;
+}
+.mejs-uv .mejs-controls {
+  height: 43px;
+  background-image: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png');
+  background-repeat: repeat-x;
+  background-position: 0 5px;
+  margin: 0 0 0 11px;
+}
+.mejs-uv .mejs-button,
+.mejs-uv .mejs-time {
+  position: absolute;
+  background: #ddd;
+}
+.mejs-uv .mejs-controls .mejs-playpause-button {
+  width: 37px;
+  height: 37px;
+  left: -5px;
+  margin: 0;
+  border: none;
+}
+.mejs-uv .mejs-controls .mejs-playpause-button button {
+  width: 37px;
+  height: 37px;
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -1px -18px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-pause button {
+  background-position: -40px -18px;
+}
+.mejs-uv .mejs-controls .mejs-time-rail {
+  position: absolute;
+  margin: 6px 5px 0 0;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-current {
+  width: 0;
+  height: 6px;
+  background: #FFB81D;
+}
+.mejs-uv .mejs-controls .mejs-currenttime-container {
+  position: absolute;
+  margin: 4px 0 0 0;
+  color: #fff;
+}
+.mejs-uv .mejs-controls .mejs-currenttime-container .slash {
+  padding: 0 0 0 3px;
+}
+.mejs-uv .mejs-controls .mejs-duration-container {
+  position: absolute;
+  margin: 4px 5px 0 0;
+  padding-left: 0;
+  color: #fff;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-total {
+  background: #000;
+  height: 6px;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-loaded {
+  background: #FFB81D;
+  width: 0;
+  height: 6px;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-handle {
+  display: block;
+  margin: 0;
+  width: 15px;
+  height: 15px;
+  border: 0;
+  top: -5px;
+  left: -1px;
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat 0 0;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-float {
+  display: none;
+}
+.mejs-uv .mejs-controls .mejs-volume-button {
+  position: absolute;
+  margin: 10px 5px 0 0;
+  width: 18px;
+  height: 17px;
+}
+.mejs-uv .mejs-controls .mejs-horizontal-volume-slider {
+  position: absolute;
+  margin: 3px 5px 0 0;
+}
+.mejs-uv .mejs-controls .mejs-mute button {
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -19px 0;
+  width: 18px;
+  height: 17px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-unmute button {
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -40px 0;
+  width: 18px;
+  height: 17px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-slider {
+  background: #525252;
+  width: 22px;
+  height: 65px;
+  top: -64px;
+  left: -4px;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-total {
+  background: #3e3e3e;
+  left: 8px;
+  width: 6px;
+  height: 50px;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-current {
+  left: 8px;
+  width: 6px;
+  background: #757575;
+  height: 70px;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-handle {
+  width: 14px;
+}
+.mejs-uv .mejs-controls .mejs-fullscreen-button {
+  position: absolute;
+  margin: 11px 10px 0 0;
+  width: 18px;
+  height: 17px;
+}
+.mejs-uv .mejs-controls .mejs-fullscreen-button button {
+  width: 17px;
+  height: 15px;
+  background: transparent url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -1px -58px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-unfullscreen button {
+  width: 17px;
+  height: 15px;
+  background: transparent url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -22px -58px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-time button {
+  color: #333;
+}
+.mejs-uv .mejs-controls .mejs-captions-button {
+  display: none;
+}
+/* END: UV */
+#app .mejs-container.mejs-uv {
+  background-color: #000;
+}
+#app .centerPanel .content {
+  position: relative;
+}
+#app .centerPanel .content .container {
+  position: absolute;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+#app .headerPanel .options .centerOptions {
+  width: 432px;
+}
+#app .headerPanel .options .centerOptions .prevOptions {
+  margin: 0 10px 0 0;
+}
+#app .headerPanel .options .centerOptions .mode label {
+  width: 42px;
+}
+#app .headerPanel .options .centerOptions .search {
+  width: 140px;
+}
+#app .headerPanel .options .centerOptions .nextOptions {
+  margin: 0 0 0 10px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 290px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-pdf-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-pdf-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..16b526a15de448f1f4b0c004d15c6074a83ee703
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-pdf-extension/theme.css
@@ -0,0 +1,4044 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel ul {
+  margin: 10px 10px 10px 10px;
+  padding: 0;
+  list-style-type: none;
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+* {
+  padding: 0;
+  margin: 0;
+}
+/* Font size is needed to make the activity bar the correct size. */
+body {
+  font-size: 10px;
+  height: 100%;
+  background-color: #404040;
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png');
+}
+body,
+input,
+button,
+select {
+  font: message-box;
+  outline: none;
+}
+.hidden {
+  display: none !important;
+}
+[hidden] {
+  display: none !important;
+}
+#viewerContainer:-webkit-full-screen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+}
+#viewerContainer:-moz-full-screen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+}
+#viewerContainer:-ms-fullscreen {
+  top: 0px !important;
+  border-top: 2px solid transparent;
+  width: 100%;
+  height: 100%;
+  overflow: hidden !important;
+  cursor: none;
+}
+#viewerContainer:-ms-fullscreen::-ms-backdrop {
+  background-color: #000;
+}
+#viewerContainer:fullscreen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+}
+:-webkit-full-screen .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+:-moz-full-screen .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+:-ms-fullscreen .page {
+  margin-bottom: 100% !important;
+  border: 0;
+}
+:fullscreen .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+:-webkit-full-screen a:not(.internalLink) {
+  display: none;
+}
+:-moz-full-screen a:not(.internalLink) {
+  display: none;
+}
+:-ms-fullscreen a:not(.internalLink) {
+  display: none !important;
+}
+:fullscreen a:not(.internalLink) {
+  display: none;
+}
+:-webkit-full-screen .textLayer > div {
+  cursor: none;
+}
+:-moz-full-screen .textLayer > div {
+  cursor: none;
+}
+:fullscreen .textLayer > div {
+  cursor: none;
+}
+#viewerContainer.presentationControls,
+#viewerContainer.presentationControls .textLayer > div {
+  cursor: default;
+}
+/* outer/inner center provides horizontal center */
+.outerCenter {
+  pointer-events: none;
+  position: relative;
+}
+#outerContainer[dir='ltr'] .outerCenter {
+  float: right;
+  right: 50%;
+}
+#outerContainer[dir='rtl'] .outerCenter {
+  float: left;
+  left: 50%;
+}
+.innerCenter {
+  pointer-events: auto;
+  position: relative;
+}
+#outerContainer[dir='ltr'] .innerCenter {
+  float: right;
+  right: -50%;
+}
+#outerContainer[dir='rtl'] .innerCenter {
+  float: left;
+  left: -50%;
+}
+#outerContainer {
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+#sidebarContainer {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  width: 200px;
+  visibility: hidden;
+  -webkit-transition-duration: 200ms;
+  -webkit-transition-timing-function: ease;
+  transition-duration: 200ms;
+  transition-timing-function: ease;
+}
+#outerContainer[dir='ltr'] #sidebarContainer {
+  -webkit-transition-property: left;
+  transition-property: left;
+  left: -200px;
+}
+#outerContainer[dir='rtl'] #sidebarContainer {
+  -webkit-transition-property: right;
+  transition-property: right;
+  right: -200px;
+}
+#outerContainer.sidebarMoving > #sidebarContainer,
+#outerContainer.sidebarOpen > #sidebarContainer {
+  visibility: visible;
+}
+#outerContainer[dir='ltr'].sidebarOpen > #sidebarContainer {
+  left: 0px;
+}
+#outerContainer[dir='rtl'].sidebarOpen > #sidebarContainer {
+  right: 0px;
+}
+#mainContainer {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  min-width: 320px;
+  -webkit-transition-duration: 200ms;
+  -webkit-transition-timing-function: ease;
+  transition-duration: 200ms;
+  transition-timing-function: ease;
+}
+#outerContainer[dir='ltr'].sidebarOpen > #mainContainer {
+  -webkit-transition-property: left;
+  transition-property: left;
+  left: 200px;
+}
+#outerContainer[dir='rtl'].sidebarOpen > #mainContainer {
+  -webkit-transition-property: right;
+  transition-property: right;
+  right: 200px;
+}
+#sidebarContent {
+  top: 32px;
+  bottom: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  width: 200px;
+  background-color: rgba(0, 0, 0, 0.1);
+}
+#outerContainer[dir='ltr'] #sidebarContent {
+  left: 0;
+  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25);
+}
+#outerContainer[dir='rtl'] #sidebarContent {
+  right: 0;
+  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25);
+}
+#viewerContainer {
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  top: 32px;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  outline: none;
+}
+#outerContainer[dir='ltr'] #viewerContainer {
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.05);
+}
+#outerContainer[dir='rtl'] #viewerContainer {
+  box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.05);
+}
+.toolbar {
+  position: relative;
+  left: 0;
+  right: 0;
+  z-index: 9999;
+  cursor: default;
+}
+#toolbarContainer {
+  width: 100%;
+}
+#toolbarSidebar {
+  width: 200px;
+  height: 32px;
+  background-color: #424242;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(77, 77, 77, 0.99), rgba(64, 64, 64, 0.95));
+}
+#outerContainer[dir='ltr'] #toolbarSidebar {
+  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 0 1px rgba(0, 0, 0, 0.1);
+}
+#outerContainer[dir='rtl'] #toolbarSidebar {
+  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 0 1px rgba(0, 0, 0, 0.1);
+}
+#toolbarContainer,
+.findbar,
+.secondaryToolbar {
+  position: relative;
+  height: 32px;
+  background-color: #474747;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(82, 82, 82, 0.99), rgba(69, 69, 69, 0.95));
+}
+#outerContainer[dir='ltr'] #toolbarContainer,
+.findbar,
+.secondaryToolbar {
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+#outerContainer[dir='rtl'] #toolbarContainer,
+.findbar,
+.secondaryToolbar {
+  box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+#toolbarViewer {
+  height: 32px;
+}
+#loadingBar {
+  position: relative;
+  width: 100%;
+  height: 6px;
+  background-color: #333;
+  border-bottom: 1px solid #333;
+}
+#loadingBar .progress {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 0%;
+  height: 100%;
+  background-color: #ddd;
+  overflow: hidden;
+  -webkit-transition: width 200ms;
+  transition: width 200ms;
+}
+@-webkit-keyframes progressIndeterminate {
+  0% {
+    left: 0%;
+  }
+  50% {
+    left: 100%;
+  }
+  100% {
+    left: 100%;
+  }
+}
+@keyframes progressIndeterminate {
+  0% {
+    left: 0%;
+  }
+  50% {
+    left: 100%;
+  }
+  100% {
+    left: 100%;
+  }
+}
+#loadingBar .progress.indeterminate {
+  background-color: #999;
+  -webkit-transition: none;
+  transition: none;
+}
+#loadingBar .indeterminate .glimmer {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: 50px;
+  background-image: linear-gradient(to right, #999 0%, #fff 50%, #999 100%);
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  -webkit-animation: progressIndeterminate 2s linear infinite;
+  animation: progressIndeterminate 2s linear infinite;
+}
+.findbar,
+.secondaryToolbar {
+  top: 32px;
+  position: absolute;
+  z-index: 10000;
+  height: 32px;
+  min-width: 16px;
+  padding: 0px 6px 0px 6px;
+  margin: 4px 2px 4px 2px;
+  color: #d9d9d9;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  cursor: default;
+}
+#outerContainer[dir='ltr'] .findbar {
+  left: 68px;
+}
+#outerContainer[dir='rtl'] .findbar {
+  right: 68px;
+}
+.findbar label {
+  -webkit-user-select: none;
+  -moz-user-select: none;
+}
+#findInput[data-status="pending"] {
+  background-image: url('../../img/uv-pdfcenterpanel-module/loading-small.png');
+  background-repeat: no-repeat;
+  background-position: right;
+}
+.secondaryToolbar {
+  padding: 6px;
+  height: auto;
+  z-index: 30000;
+}
+#outerContainer[dir='ltr'] .secondaryToolbar {
+  right: 4px;
+}
+#outerContainer[dir='rtl'] .secondaryToolbar {
+  left: 4px;
+}
+#secondaryToolbarButtonContainer {
+  max-width: 200px;
+  max-height: 400px;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+  margin-bottom: -4px;
+}
+.doorHanger,
+.doorHangerRight {
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  border-radius: 2px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+.doorHanger:after,
+.doorHanger:before,
+.doorHangerRight:after,
+.doorHangerRight:before {
+  bottom: 100%;
+  border: solid transparent;
+  content: " ";
+  height: 0;
+  width: 0;
+  position: absolute;
+  pointer-events: none;
+}
+.doorHanger:after,
+.doorHangerRight:after {
+  border-bottom-color: rgba(82, 82, 82, 0.99);
+  border-width: 8px;
+}
+.doorHanger:before,
+.doorHangerRight:before {
+  border-bottom-color: rgba(0, 0, 0, 0.5);
+  border-width: 9px;
+}
+#outerContainer[dir='ltr'] .doorHanger:after,
+#outerContainer[dir='rtl'] .doorHangerRight:after {
+  left: 13px;
+  margin-left: -8px;
+}
+#outerContainer[dir='ltr'] .doorHanger:before,
+#outerContainer[dir='rtl'] .doorHangerRight:before {
+  left: 13px;
+  margin-left: -9px;
+}
+#outerContainer[dir='rtl'] .doorHanger:after,
+#outerContainer[dir='ltr'] .doorHangerRight:after {
+  right: 13px;
+  margin-right: -8px;
+}
+#outerContainer[dir='rtl'] .doorHanger:before,
+#outerContainer[dir='ltr'] .doorHangerRight:before {
+  right: 13px;
+  margin-right: -9px;
+}
+#findMsg {
+  font-style: italic;
+  color: #A6B7D0;
+}
+.notFound {
+  background-color: #ff8999;
+}
+#outerContainer[dir='ltr'] #toolbarViewerLeft {
+  margin-left: -1px;
+}
+#outerContainer[dir='rtl'] #toolbarViewerRight {
+  margin-right: -1px;
+}
+#outerContainer[dir='ltr'] #toolbarViewerLeft,
+#outerContainer[dir='rtl'] #toolbarViewerRight {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+#outerContainer[dir='ltr'] #toolbarViewerRight,
+#outerContainer[dir='rtl'] #toolbarViewerLeft {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+#outerContainer[dir='ltr'] #toolbarViewerLeft > *,
+#outerContainer[dir='ltr'] #toolbarViewerMiddle > *,
+#outerContainer[dir='ltr'] #toolbarViewerRight > *,
+#outerContainer[dir='ltr'] .findbar > * {
+  position: relative;
+  float: left;
+}
+#outerContainer[dir='rtl'] #toolbarViewerLeft > *,
+#outerContainer[dir='rtl'] #toolbarViewerMiddle > *,
+#outerContainer[dir='rtl'] #toolbarViewerRight > *,
+#outerContainer[dir='rtl'] .findbar > * {
+  position: relative;
+  float: right;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton {
+  margin: 3px 2px 4px 0;
+  display: inline-block;
+}
+#outerContainer[dir='rtl'] .splitToolbarButton {
+  margin: 3px 0 4px 2px;
+  display: inline-block;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton > .toolbarButton {
+  border-radius: 0;
+  float: left;
+}
+#outerContainer[dir='rtl'] .splitToolbarButton > .toolbarButton {
+  border-radius: 0;
+  float: right;
+}
+.toolbarButton,
+.secondaryToolbarButton {
+  border: 0 none;
+  background-color: rgba(0, 0, 0, 0);
+  width: 32px;
+  height: 25px;
+}
+.toolbarButton > span {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.toolbarButton[disabled],
+.secondaryToolbarButton[disabled] {
+  opacity: .5;
+}
+.toolbarButton.group {
+  margin-right: 0;
+}
+.splitToolbarButton.toggled .toolbarButton {
+  margin: 0;
+}
+.splitToolbarButton:hover > .toolbarButton,
+.splitToolbarButton:focus > .toolbarButton,
+.splitToolbarButton.toggled > .toolbarButton,
+.toolbarButton.textButton {
+  background-color: rgba(0, 0, 0, 0.12);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.35);
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 150ms;
+  -webkit-transition-timing-function: ease;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+.splitToolbarButton > .toolbarButton:hover,
+.splitToolbarButton > .toolbarButton:focus,
+.dropdownToolbarButton:hover,
+.overlayButton:hover,
+.toolbarButton.textButton:hover,
+.toolbarButton.textButton:focus {
+  background-color: rgba(0, 0, 0, 0.2);
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 0 1px rgba(0, 0, 0, 0.05);
+  z-index: 199;
+}
+.splitToolbarButton > .toolbarButton {
+  position: relative;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,
+#outerContainer[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {
+  position: relative;
+  margin: 0;
+  margin-right: -1px;
+  border-top-left-radius: 2px;
+  border-bottom-left-radius: 2px;
+  border-right-color: transparent;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,
+#outerContainer[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {
+  position: relative;
+  margin: 0;
+  margin-left: -1px;
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+  border-left-color: transparent;
+}
+.splitToolbarButtonSeparator {
+  padding: 8px 0;
+  width: 1px;
+  background-color: rgba(0, 0, 0, 0.5);
+  z-index: 99;
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+  display: inline-block;
+  margin: 5px 0;
+}
+#outerContainer[dir='ltr'] .splitToolbarButtonSeparator {
+  float: left;
+}
+#outerContainer[dir='rtl'] .splitToolbarButtonSeparator {
+  float: right;
+}
+.splitToolbarButton:hover > .splitToolbarButtonSeparator,
+.splitToolbarButton.toggled > .splitToolbarButtonSeparator {
+  padding: 12px 0;
+  margin: 1px 0;
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.03);
+  -webkit-transition-property: padding;
+  -webkit-transition-duration: 10ms;
+  -webkit-transition-timing-function: ease;
+  transition-property: padding;
+  transition-duration: 10ms;
+  transition-timing-function: ease;
+}
+.toolbarButton,
+.dropdownToolbarButton,
+.overlayButton,
+.secondaryToolbarButton {
+  min-width: 16px;
+  padding: 2px 6px 0;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  color: rgba(255, 255, 255, 0.8);
+  font-size: 12px;
+  line-height: 14px;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  /* Opera does not support user-select, use <... unselectable="on"> instead */
+  cursor: default;
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 150ms;
+  -webkit-transition-timing-function: ease;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+#outerContainer[dir='ltr'] .toolbarButton,
+#outerContainer[dir='ltr'] .overlayButton,
+#outerContainer[dir='ltr'] .dropdownToolbarButton {
+  margin: 3px 2px 4px 0;
+}
+#outerContainer[dir='rtl'] .toolbarButton,
+#outerContainer[dir='rtl'] .overlayButton,
+#outerContainer[dir='rtl'] .dropdownToolbarButton {
+  margin: 3px 0 4px 2px;
+}
+.toolbarButton:hover,
+.toolbarButton:focus,
+.dropdownToolbarButton,
+.overlayButton,
+.secondaryToolbarButton:hover,
+.secondaryToolbarButton:focus {
+  background-color: rgba(0, 0, 0, 0.12);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.35);
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+}
+.toolbarButton:hover:active,
+.overlayButton:hover:active,
+.dropdownToolbarButton:hover:active,
+.secondaryToolbarButton:hover:active {
+  background-color: rgba(0, 0, 0, 0.2);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  border-color: rgba(0, 0, 0, 0.35) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.45);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 10ms;
+  -webkit-transition-timing-function: linear;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 10ms;
+  transition-timing-function: linear;
+}
+.toolbarButton.toggled,
+.splitToolbarButton.toggled > .toolbarButton.toggled,
+.secondaryToolbarButton.toggled {
+  background-color: rgba(0, 0, 0, 0.3);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  border-color: rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.45) rgba(0, 0, 0, 0.5);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 10ms;
+  -webkit-transition-timing-function: linear;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 10ms;
+  transition-timing-function: linear;
+}
+.toolbarButton.toggled:hover:active,
+.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,
+.secondaryToolbarButton.toggled:hover:active {
+  background-color: rgba(0, 0, 0, 0.4);
+  border-color: rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.5) rgba(0, 0, 0, 0.55);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2) inset, 0 0 1px rgba(0, 0, 0, 0.3) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+}
+.dropdownToolbarButton {
+  width: 120px;
+  max-width: 120px;
+  padding: 3px 2px 2px;
+  overflow: hidden;
+  background: url('../../img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png') no-repeat;
+}
+#outerContainer[dir='ltr'] .dropdownToolbarButton {
+  background-position: 95%;
+}
+#outerContainer[dir='rtl'] .dropdownToolbarButton {
+  background-position: 5%;
+}
+.dropdownToolbarButton > select {
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  /* in the future this might matter, see bugzilla bug #649849 */
+  min-width: 140px;
+  font-size: 12px;
+  color: #f2f2f2;
+  margin: 0;
+  padding: 0;
+  border: none;
+  background: rgba(0, 0, 0, 0);
+  /* Opera does not support 'transparent' <select> background */
+}
+.dropdownToolbarButton > select > option {
+  background: #3d3d3d;
+}
+.overlayButton {
+  margin: 3px 2px 4px 5px !important;
+  line-height: 16px;
+  padding: 2px 6px 3px 6px;
+}
+#customScaleOption {
+  display: none;
+}
+#pageWidthOption {
+  border-bottom: 1px rgba(255, 255, 255, 0.5) solid;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton:first-child,
+#outerContainer[dir='ltr'] .toolbarButton:first-child,
+#outerContainer[dir='rtl'] .splitToolbarButton:last-child,
+#outerContainer[dir='rtl'] .toolbarButton:last-child {
+  margin-left: 4px;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton:last-child,
+#outerContainer[dir='ltr'] .toolbarButton:last-child,
+#outerContainer[dir='rtl'] .splitToolbarButton:first-child,
+#outerContainer[dir='rtl'] .toolbarButton:first-child {
+  margin-right: 4px;
+}
+.toolbarButtonSpacer {
+  width: 30px;
+  display: inline-block;
+  height: 1px;
+}
+.toolbarButtonFlexibleSpacer {
+  -webkit-box-flex: 1;
+  -moz-box-flex: 1;
+  min-width: 30px;
+}
+#outerContainer[dir='ltr'] #findPrevious {
+  margin-left: 3px;
+}
+#outerContainer[dir='ltr'] #findNext {
+  margin-right: 3px;
+}
+#outerContainer[dir='rtl'] #findPrevious {
+  margin-right: 3px;
+}
+#outerContainer[dir='rtl'] #findNext {
+  margin-left: 3px;
+}
+.toolbarButton::before,
+.secondaryToolbarButton::before {
+  /* All matching images have a size of 16x16
+   * All relevant containers have a size of 32x25 */
+  position: absolute;
+  display: inline-block;
+  top: 4px;
+  left: 7px;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton::before {
+  left: 4px;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton::before {
+  right: 4px;
+}
+#outerContainer[dir='ltr'] .toolbarButton#sidebarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton#sidebarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.findPrevious::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.findPrevious::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.findNext::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.findNext::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.pageUp::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.pageUp::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.pageDown::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.pageDown::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png');
+}
+.toolbarButton.zoomOut::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png');
+}
+.toolbarButton.zoomIn::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png');
+}
+.toolbarButton.presentationMode::before,
+.secondaryToolbarButton.presentationMode::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png');
+}
+.toolbarButton.print::before,
+.secondaryToolbarButton.print::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-print.png');
+}
+.toolbarButton.openFile::before,
+.secondaryToolbarButton.openFile::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-openFile.png');
+}
+.toolbarButton.download::before,
+.secondaryToolbarButton.download::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-download.png');
+}
+.toolbarButton.bookmark,
+.secondaryToolbarButton.bookmark {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  outline: none;
+  padding-top: 4px;
+  text-decoration: none;
+}
+.secondaryToolbarButton.bookmark {
+  padding-top: 5px;
+}
+.bookmark[href='#'] {
+  opacity: .5;
+  pointer-events: none;
+}
+.toolbarButton.bookmark::before,
+.secondaryToolbarButton.bookmark::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png');
+}
+#viewThumbnail.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png');
+}
+#outerContainer[dir="ltr"] #viewOutline.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png');
+}
+#outerContainer[dir="rtl"] #viewOutline.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png');
+}
+#viewAttachments.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png');
+}
+#viewFind.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-search.png');
+}
+.secondaryToolbarButton {
+  position: relative;
+  margin: 0 0 4px 0;
+  padding: 3px 0 1px 0;
+  height: auto;
+  min-height: 25px;
+  width: auto;
+  min-width: 100%;
+  white-space: normal;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton {
+  padding-left: 24px;
+  text-align: left;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton {
+  padding-right: 24px;
+  text-align: right;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton.bookmark {
+  padding-left: 27px;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton.bookmark {
+  padding-right: 27px;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton > span {
+  padding-right: 4px;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton > span {
+  padding-left: 4px;
+}
+.secondaryToolbarButton.firstPage::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png');
+}
+.secondaryToolbarButton.lastPage::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png');
+}
+.secondaryToolbarButton.rotateCcw::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png');
+}
+.secondaryToolbarButton.rotateCw::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png');
+}
+.secondaryToolbarButton.handTool::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png');
+}
+.secondaryToolbarButton.documentProperties::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png');
+}
+.verticalToolbarSeparator {
+  display: block;
+  padding: 8px 0;
+  margin: 8px 4px;
+  width: 1px;
+  background-color: rgba(0, 0, 0, 0.5);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+}
+#outerContainer[dir='ltr'] .verticalToolbarSeparator {
+  margin-left: 2px;
+}
+#outerContainer[dir='rtl'] .verticalToolbarSeparator {
+  margin-right: 2px;
+}
+.horizontalToolbarSeparator {
+  display: block;
+  margin: 0 0 4px 0;
+  height: 1px;
+  width: 100%;
+  background-color: rgba(0, 0, 0, 0.5);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+}
+.toolbarField {
+  padding: 3px 6px !important;
+  margin: 4px 0 4px 0  !important;
+  border: 1px solid transparent !important;
+  border-radius: 2px !important;
+  background-color: rgba(255, 255, 255, 0.09);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.35);
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.05) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  color: #f2f2f2;
+  font-size: 12px !important;
+  line-height: 14px !important;
+  outline-style: none;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+.toolbarField[type=checkbox] {
+  display: inline-block;
+  margin: 8px 0px !important;
+}
+.toolbarField.pageNumber {
+  -moz-appearance: textfield;
+  /* hides the spinner in moz */
+  min-width: 16px;
+  text-align: right;
+  width: 40px;
+}
+.toolbarField.pageNumber::-webkit-inner-spin-button,
+.toolbarField.pageNumber::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  margin: 0;
+}
+.toolbarField:hover {
+  background-color: rgba(255, 255, 255, 0.11);
+  border-color: rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.43) rgba(0, 0, 0, 0.45);
+}
+.toolbarField:focus {
+  background-color: rgba(255, 255, 255, 0.15);
+  border-color: rgba(77, 184, 255, 0.8) rgba(77, 184, 255, 0.85) rgba(77, 184, 255, 0.9);
+}
+.toolbarLabel {
+  min-width: 16px;
+  padding: 3px 6px 3px 2px;
+  margin: 4px 2px 4px 0;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  color: #d9d9d9;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  cursor: default;
+}
+#thumbnailView {
+  position: absolute;
+  width: 120px;
+  top: 0;
+  bottom: 0;
+  padding: 10px 40px 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+.thumbnail {
+  float: left;
+  margin-bottom: 5px;
+}
+#thumbnailView > a:last-of-type > .thumbnail {
+  margin-bottom: 10px;
+}
+.thumbnail:not([data-loaded]) {
+  border: 1px dashed rgba(255, 255, 255, 0.5);
+  margin-bottom: 10px;
+}
+.thumbnailImage {
+  transition-duration: 150ms;
+  border: 1px solid transparent;
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);
+  opacity: 0.8;
+  z-index: 99;
+}
+.thumbnailSelectionRing {
+  border-radius: 2px;
+  padding: 7px;
+  transition-duration: 150ms;
+}
+a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,
+.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {
+  opacity: .9;
+}
+a:focus > .thumbnail > .thumbnailSelectionRing,
+.thumbnail:hover > .thumbnailSelectionRing {
+  background-color: rgba(255, 255, 255, 0.15);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.2) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: rgba(255, 255, 255, 0.9);
+}
+.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5);
+  opacity: 1;
+}
+.thumbnail.selected > .thumbnailSelectionRing {
+  background-color: rgba(255, 255, 255, 0.3);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: #ffffff;
+}
+#outlineView,
+#attachmentsView {
+  position: absolute;
+  width: 192px;
+  top: 0;
+  bottom: 0;
+  padding: 4px 4px 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+}
+#outerContainer[dir='ltr'] .outlineItem > .outlineItems {
+  margin-left: 20px;
+}
+#outerContainer[dir='rtl'] .outlineItem > .outlineItems {
+  margin-right: 20px;
+}
+.outlineItem > a,
+.attachmentsItem > a {
+  text-decoration: none;
+  display: inline-block;
+  min-width: 95%;
+  height: auto;
+  margin-bottom: 1px;
+  border-radius: 2px;
+  color: rgba(255, 255, 255, 0.8);
+  font-size: 13px;
+  line-height: 15px;
+  -moz-user-select: none;
+  white-space: normal;
+}
+#outerContainer[dir='ltr'] .outlineItem > a,
+#outerContainer[dir='ltr'] .attachmentsItem > a {
+  padding: 2px 0 5px 10px;
+}
+#outerContainer[dir='rtl'] .outlineItem > a,
+#outerContainer[dir='rtl'] .attachmentsItem > a {
+  padding: 2px 10px 5px 0;
+}
+.outlineItem > a:hover,
+.attachmentsItem > a:hover {
+  background-color: rgba(255, 255, 255, 0.02);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.2) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: rgba(255, 255, 255, 0.9);
+}
+.outlineItem.selected {
+  background-color: rgba(255, 255, 255, 0.08);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: #ffffff;
+}
+.noResults {
+  font-size: 12px;
+  color: rgba(255, 255, 255, 0.8);
+  font-style: italic;
+  cursor: default;
+}
+.canvasWrapper {
+  overflow: hidden;
+}
+canvas {
+  margin: 0;
+  display: block;
+}
+.page {
+  direction: ltr;
+  width: 816px;
+  height: 1056px;
+  margin: 1px auto -8px auto;
+  position: relative;
+  overflow: visible;
+  border: 9px solid transparent;
+  background-clip: content-box;
+  border-image: url('../../img/uv-pdfcenterpanel-module/shadow.png') 9 9 repeat;
+  background-color: white;
+}
+.annotLink > a:hover {
+  opacity: 0.2;
+  background: #ff0;
+  box-shadow: 0px 2px 10px #ff0;
+}
+.loadingIcon {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  background: url('../../img/uv-pdfcenterpanel-module/loading-icon.gif') center no-repeat;
+}
+.textLayer {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  color: #000;
+  font-family: sans-serif;
+  overflow: hidden;
+}
+.textLayer > div {
+  color: transparent;
+  position: absolute;
+  white-space: pre;
+  cursor: text;
+}
+.textLayer .highlight {
+  margin: -1px;
+  padding: 1px;
+  background-color: rgba(180, 0, 170, 0.2);
+  border-radius: 4px;
+}
+.textLayer .highlight.begin {
+  border-radius: 4px 0px 0px 4px;
+}
+.textLayer .highlight.end {
+  border-radius: 0px 4px 4px 0px;
+}
+.textLayer .highlight.middle {
+  border-radius: 0px;
+}
+.textLayer .highlight.selected {
+  background-color: rgba(0, 100, 0, 0.2);
+}
+/* TODO: file FF bug to support ::-moz-selection:window-inactive
+   so we can override the opaque grey background when the window is inactive;
+   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */
+::selection {
+  background: rgba(0, 0, 255, 0.3);
+}
+::-moz-selection {
+  background: rgba(0, 0, 255, 0.3);
+}
+.annotationHighlight {
+  position: absolute;
+  border: 2px #FFFF99 solid;
+}
+.annotText > img {
+  position: absolute;
+  cursor: pointer;
+}
+.annotTextContentWrapper {
+  position: absolute;
+  width: 20em;
+}
+.annotTextContent {
+  z-index: 200;
+  float: left;
+  max-width: 20em;
+  background-color: #FFFF99;
+  box-shadow: 0px 2px 5px #333;
+  border-radius: 2px;
+  padding: 0.6em;
+  cursor: pointer;
+}
+.annotTextContent > h1 {
+  font-size: 1em;
+  border-bottom: 1px solid #000000;
+  padding-bottom: 0.2em;
+}
+.annotTextContent > p {
+  padding-top: 0.2em;
+}
+.annotLink > a {
+  position: absolute;
+  font-size: 1em;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+#errorWrapper {
+  background: none repeat scroll 0 0 #FF5555;
+  color: white;
+  left: 0;
+  position: absolute;
+  right: 0;
+  z-index: 1000;
+  padding: 3px;
+  font-size: 0.8em;
+}
+.loadingInProgress #errorWrapper {
+  top: 39px;
+}
+#errorMessageLeft {
+  float: left;
+}
+#errorMessageRight {
+  float: right;
+}
+#errorMoreInfo {
+  background-color: #FFFFFF;
+  color: black;
+  padding: 3px;
+  margin: 3px;
+  width: 98%;
+}
+#overlayContainer {
+  display: table;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.2);
+  z-index: 10000;
+}
+#overlayContainer > * {
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+#promptContainer {
+  display: table-cell;
+  vertical-align: middle;
+  text-align: center;
+}
+#promptContainer > * {
+  display: inline-block;
+}
+.prompt {
+  display: table;
+  padding: 15px;
+  border-spacing: 4px;
+  color: #d9d9d9;
+  line-height: 14px;
+  text-align: center;
+  background-color: #474747;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(82, 82, 82, 0.99), rgba(69, 69, 69, 0.95));
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+.prompt > .row {
+  display: table-row;
+}
+.prompt > .row > * {
+  display: table-cell;
+}
+.prompt .toolbarField {
+  margin: 5px 0;
+  width: 200px;
+}
+.prompt .toolbarField:hover,
+.prompt .toolbarField:focus {
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+}
+#documentPropertiesContainer {
+  display: table-cell;
+  vertical-align: middle;
+  text-align: center;
+}
+#documentPropertiesContainer > * {
+  display: inline-block;
+  padding: 15px;
+  border-spacing: 4px;
+  max-width: 350px;
+  max-height: 350px;
+  color: #d9d9d9;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  cursor: default;
+  background-color: #474747;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(82, 82, 82, 0.99), rgba(69, 69, 69, 0.95));
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+#documentPropertiesContainer .separator {
+  display: block;
+  margin: 4px 0 4px 0;
+  height: 1px;
+  width: 100%;
+  background-color: rgba(0, 0, 0, 0.5);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+}
+#documentPropertiesContainer .row {
+  display: table-row;
+}
+#outerContainer[dir='ltr'] #documentPropertiesContainer .row > * {
+  display: table-cell;
+  min-width: 100px;
+}
+#outerContainer[dir='rtl'] #documentPropertiesContainer .row > * {
+  display: table-cell;
+  min-width: 100px;
+  text-align: right;
+}
+#documentPropertiesContainer .row span {
+  width: 125px;
+  word-wrap: break-word;
+}
+#documentPropertiesContainer .row p {
+  max-width: 225px;
+  word-wrap: break-word;
+}
+#documentPropertiesContainer .buttonRow {
+  margin-top: 10px;
+  text-align: center;
+  vertical-align: middle;
+}
+.clearBoth {
+  clear: both;
+}
+.fileInput {
+  background: white;
+  color: black;
+  margin-top: 5px;
+  visibility: hidden;
+  position: fixed;
+  right: 0;
+  top: 0;
+}
+#PDFBug {
+  background: none repeat scroll 0 0 white;
+  border: 1px solid #666666;
+  position: fixed;
+  top: 32px;
+  right: 0;
+  bottom: 0;
+  font-size: 10px;
+  padding: 0;
+  width: 300px;
+}
+#PDFBug .controls {
+  background: #EEEEEE;
+  border-bottom: 1px solid #666666;
+  padding: 3px;
+}
+#PDFBug .panels {
+  bottom: 0;
+  left: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  right: 0;
+  top: 27px;
+}
+#PDFBug button.active {
+  font-weight: bold;
+}
+.debuggerShowText {
+  background: none repeat scroll 0 0 yellow;
+  color: blue;
+  opacity: 0.3;
+}
+.debuggerHideText:hover {
+  background: none repeat scroll 0 0 yellow;
+  opacity: 0.3;
+}
+#PDFBug .stats {
+  font-family: courier;
+  font-size: 10px;
+  white-space: pre;
+}
+#PDFBug .stats .title {
+  font-weight: bold;
+}
+#PDFBug table {
+  font-size: 10px;
+}
+#viewer.textLayer-visible .textLayer > div,
+#viewer.textLayer-hover .textLayer > div:hover {
+  background-color: white;
+  color: black;
+}
+#viewer.textLayer-shadow .textLayer > div {
+  background-color: rgba(255, 255, 255, 0.6);
+  color: black;
+}
+.grab-to-pan-grab {
+  cursor: url('../../img/uv-pdfcenterpanel-module/grab.cur'), move !important;
+  cursor: -webkit-grab !important;
+  cursor: -moz-grab !important;
+  cursor: grab !important;
+}
+.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {
+  cursor: inherit !important;
+}
+.grab-to-pan-grab:active,
+.grab-to-pan-grabbing {
+  cursor: url('../../img/uv-pdfcenterpanel-module/grabbing.cur'), move !important;
+  cursor: -webkit-grabbing !important;
+  cursor: -moz-grabbing !important;
+  cursor: grabbing !important;
+  position: fixed;
+  background: transparent;
+  display: block;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  z-index: 50000;
+  /* should be higher than anything else in PDF.js! */
+}
+@page {
+  margin: 0;
+}
+#printContainer {
+  display: none;
+}
+@media screen and (min-resolution: 2dppx) {
+  /* Rules for Retina screens */
+  .toolbarButton::before {
+    -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    top: -5px;
+  }
+  .secondaryToolbarButton::before {
+    -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    top: -4px;
+  }
+  #outerContainer[dir='ltr'] .toolbarButton::before,
+  #outerContainer[dir='rtl'] .toolbarButton::before {
+    left: -1px;
+  }
+  #outerContainer[dir='ltr'] .secondaryToolbarButton::before {
+    left: -2px;
+  }
+  #outerContainer[dir='rtl'] .secondaryToolbarButton::before {
+    left: 186px;
+  }
+  .dropdownToolbarButton {
+    background: url('../../img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png') no-repeat;
+    background-size: 7px 16px;
+  }
+  #outerContainer[dir='ltr'] .toolbarButton#sidebarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton#sidebarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.findPrevious::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.findPrevious::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.findNext::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.findNext::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.pageUp::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.pageUp::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.pageDown::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.pageDown::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png');
+  }
+  .toolbarButton.zoomIn::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png');
+  }
+  .toolbarButton.zoomOut::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png');
+  }
+  .toolbarButton.presentationMode::before,
+  .secondaryToolbarButton.presentationMode::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png');
+  }
+  .toolbarButton.print::before,
+  .secondaryToolbarButton.print::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png');
+  }
+  .toolbarButton.openFile::before,
+  .secondaryToolbarButton.openFile::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png');
+  }
+  .toolbarButton.download::before,
+  .secondaryToolbarButton.download::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png');
+  }
+  .toolbarButton.bookmark::before,
+  .secondaryToolbarButton.bookmark::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png');
+  }
+  #viewThumbnail.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png');
+  }
+  #outerContainer[dir="ltr"] #viewOutline.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png');
+  }
+  #outerContainer[dir="rtl"] #viewOutline.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png');
+  }
+  #viewAttachments.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments@2x.png');
+  }
+  #viewFind.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png');
+  }
+  .secondaryToolbarButton.firstPage::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png');
+  }
+  .secondaryToolbarButton.lastPage::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png');
+  }
+  .secondaryToolbarButton.rotateCcw::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png');
+  }
+  .secondaryToolbarButton.rotateCw::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png');
+  }
+  .secondaryToolbarButton.handTool::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png');
+  }
+  .secondaryToolbarButton.documentProperties::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png');
+  }
+}
+@media print {
+  /* General rules for printing. */
+  body {
+    background: transparent none;
+  }
+  /* Rules for browsers that don't support mozPrintCallback. */
+  #sidebarContainer,
+  #secondaryToolbar,
+  .toolbar,
+  #loadingBox,
+  #errorWrapper,
+  .textLayer {
+    display: none;
+  }
+  #viewerContainer {
+    overflow: visible;
+  }
+  #mainContainer,
+  #viewerContainer,
+  .page,
+  .page canvas {
+    position: static;
+    padding: 0;
+    margin: 0;
+  }
+  .page {
+    float: left;
+    display: none;
+    border: none;
+    box-shadow: none;
+  }
+  .page[data-loaded] {
+    display: block;
+  }
+  .fileInput {
+    display: none;
+  }
+  /* Rules for browsers that support mozPrintCallback */
+  #outerContainer[data-mozPrintCallback] #outerContainer {
+    display: none;
+  }
+  #outerContainer[data-mozPrintCallback] #printContainer {
+    display: block;
+  }
+  #printContainer canvas {
+    position: relative;
+    top: 0;
+    left: 0;
+  }
+}
+.visibleLargeView,
+.visibleMediumView,
+.visibleSmallView {
+  display: none;
+}
+@media all and (max-width: 960px) {
+  #outerContainer[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='ltr'] #outerContainer.sidebarOpen .outerCenter {
+    float: left;
+    left: 205px;
+  }
+  #outerContainer[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='rtl'] #outerContainer.sidebarOpen .outerCenter {
+    float: right;
+    right: 205px;
+  }
+}
+@media all and (max-width: 900px) {
+  .sidebarOpen .hiddenLargeView {
+    display: none;
+  }
+  .sidebarOpen .visibleLargeView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 860px) {
+  .sidebarOpen .hiddenMediumView {
+    display: none;
+  }
+  .sidebarOpen .visibleMediumView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 770px) {
+  #sidebarContainer {
+    top: 32px;
+    z-index: 100;
+  }
+  .loadingInProgress #sidebarContainer {
+    top: 39px;
+  }
+  #sidebarContent {
+    top: 32px;
+    background-color: rgba(0, 0, 0, 0.7);
+  }
+  #outerContainer[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {
+    left: 0px;
+  }
+  #outerContainer[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {
+    right: 0px;
+  }
+  #outerContainer[dir='ltr'] .outerCenter {
+    float: left;
+    left: 205px;
+  }
+  #outerContainer[dir='rtl'] .outerCenter {
+    float: right;
+    right: 205px;
+  }
+  #outerContainer .hiddenLargeView,
+  #outerContainer .hiddenMediumView {
+    display: inherit;
+  }
+  #outerContainer .visibleLargeView,
+  #outerContainer .visibleMediumView {
+    display: none;
+  }
+}
+@media all and (max-width: 700px) {
+  #outerContainer .hiddenLargeView {
+    display: none;
+  }
+  #outerContainer .visibleLargeView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 660px) {
+  #outerContainer .hiddenMediumView {
+    display: none;
+  }
+  #outerContainer .visibleMediumView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 600px) {
+  .hiddenSmallView {
+    display: none;
+  }
+  .visibleSmallView {
+    display: inherit;
+  }
+  #outerContainer[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='ltr'] #outerContainer.sidebarOpen .outerCenter,
+  #outerContainer[dir='ltr'] .outerCenter {
+    left: 156px;
+  }
+  #outerContainer[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='rtl'] #outerContainer.sidebarOpen .outerCenter,
+  #outerContainer[dir='rtl'] .outerCenter {
+    right: 156px;
+  }
+  .toolbarButtonSpacer {
+    width: 0;
+  }
+}
+@media all and (max-width: 510px) {
+  #scaleSelectContainer,
+  #pageNumberLabel {
+    display: none;
+  }
+}
+#app .centerPanel .content .container {
+  margin: 0 20px 0 20px;
+}
+#app .centerPanel .content #pdfContainer {
+  overflow: auto;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+#app .leftPanel .thumbsView .thumb .wrap {
+  border: none;
+}
+#app .leftPanel .thumbsView .thumb .wrap img {
+  display: block;
+  width: 90px;
+}
+#app .leftPanel .thumbsView .thumb.selected .wrap {
+  border: none;
+}
+#app .headerPanel .options .centerOptions {
+  width: 432px;
+}
+#app .headerPanel .options .centerOptions .prevOptions {
+  margin: 0 10px 0 0;
+}
+#app .headerPanel .options .centerOptions .mode label {
+  width: 42px;
+}
+#app .headerPanel .options .centerOptions .search {
+  width: 140px;
+}
+#app .headerPanel .options .centerOptions .nextOptions {
+  margin: 0 0 0 10px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 290px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-seadragon-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-seadragon-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..6a9083ff0672ea54fa63e55161564ad4514034d1
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-seadragon-extension/theme.css
@@ -0,0 +1,3185 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn.first {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/first.png');
+  background-repeat: no-repeat;
+  margin: 0 0 0 0;
+}
+#app .headerPanel a.imageBtn.first:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.prev {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/prev.png');
+  background-repeat: no-repeat;
+  margin: 0 0 0 5px;
+}
+#app .headerPanel a.imageBtn.prev:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.next {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/next.png');
+  background-repeat: no-repeat;
+  margin: 0 5px 0 0;
+}
+#app .headerPanel a.imageBtn.next:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.last {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/last.png');
+  background-repeat: no-repeat;
+  margin: 0 0 0 0;
+}
+#app .headerPanel a.imageBtn.last:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.go {
+  background: url('../../img/uv-pagingheaderpanel-module/go.png') no-repeat;
+  width: 28px;
+  line-height: 24px;
+}
+#app .headerPanel a.imageBtn.disabled {
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+  background-color: transparent;
+}
+#app .headerPanel a.imageBtn.disabled:hover {
+  background-color: transparent;
+}
+#app .headerPanel .centerOptions .image-selectionbox-options {
+  float: left;
+  margin: 0 0 0 0;
+}
+#app .headerPanel .centerOptions .image-selectionbox {
+  height: 30px;
+}
+#app .headerPanel .centerOptions .prevOptions {
+  float: left;
+  margin: 0 15px 0 0;
+}
+#app .headerPanel .centerOptions .mode {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .centerOptions .search {
+  float: left;
+  margin: 0 0 0 5px;
+  width: 113px;
+}
+#app .headerPanel .centerOptions .search .searchText {
+  border: none;
+  padding: 0 0 0 2px;
+}
+#app .headerPanel .centerOptions .nextOptions {
+  float: left;
+  margin: 0 0 0 15px;
+}
+#app .headerPanel .centerOptions .mode input {
+  float: left;
+}
+#app .headerPanel .centerOptions .mode label {
+  clear: none;
+  width: 30px;
+  margin: 0 0 0 0;
+  padding: 0;
+  float: left;
+  font-size: 11px;
+  line-height: 18px;
+  text-align: right;
+}
+#app .headerPanel .centerOptions .mode label.disabled {
+  color: #9a9a9a;
+}
+#app .headerPanel .centerOptions.modeOptionsDisabled {
+  width: 280px;
+}
+#app .headerPanel .centerOptions .autocompleteText {
+  width: 30px;
+  height: 19px;
+  line-height: 19px;
+  float: left;
+  font-size: 11px;
+  padding: 0;
+  margin-top: 6px;
+}
+#app .headerPanel .centerOptions .autocomplete {
+  position: absolute;
+  background: #fff;
+  width: 60px;
+  border: 2px solid #ffffff;
+  list-style-type: none;
+  -webkit-margin-before: 0px;
+  -webkit-margin-after: 0px;
+  -webkit-margin-start: 0px;
+  -webkit-margin-end: 0px;
+  -webkit-padding-start: 0px;
+  margin: 0;
+  padding: 0;
+  max-height: 150px;
+  overflow-y: auto;
+  overflow-x: hidden;
+  z-index: 1000;
+}
+#app .headerPanel .centerOptions .autocomplete .result {
+  padding: 4px;
+  width: 270px;
+  overflow: hidden;
+}
+#app .headerPanel .centerOptions .autocomplete .result.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 4px 4px;
+  height: 25px;
+}
+#app .headerPanel .centerOptions .autocomplete .result.selected {
+  background: #efefef;
+}
+#app .headerPanel .rightOptions .pagingToggleButtons {
+  float: left;
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .one-up {
+  background-image: url('../../img/uv-pagingheaderpanel-module/one_up.png');
+  background-repeat: no-repeat;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .one-up.on {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .two-up {
+  background-image: url('../../img/uv-pagingheaderpanel-module/two_up.png');
+  background-repeat: no-repeat;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .two-up.on {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+#app .headerPanel .rightOptions .gallery {
+  background-image: url('../../img/uv-pagingheaderpanel-module/grid.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+#app .headerPanel .rightOptions .gallery.on {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+#app .headerPanel .rightOptions .localeToggle {
+  color: #fff;
+  text-decoration: none;
+  font-size: 14px;
+  float: left;
+  margin: 4px 8px 4px 4px;
+  cursor: pointer;
+}
+#app .headerPanel .rightOptions .localeToggle:link,
+#app .headerPanel .rightOptions .localeToggle:visited,
+#app .headerPanel .rightOptions .localeToggle:hover,
+#app .headerPanel .rightOptions .localeToggle:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .headerPanel .searchText {
+  width: 30px;
+  height: 19px;
+  line-height: 19px;
+  float: left;
+  font-size: 11px;
+  padding: 0;
+  margin-top: 6px;
+}
+#app .headerPanel .total {
+  float: left;
+  display: block;
+  height: 18px;
+  line-height: 18px;
+  margin: 6px 5px 0 5px;
+  width: 41px;
+  font-size: 11px;
+  overflow: hidden;
+}
+#app .centerPanel .content {
+  position: relative;
+}
+#app .centerPanel .content .displayregion {
+  border: 2px solid #fff !important;
+}
+#app .centerPanel .content #viewer {
+  margin: 0 8px 0 8px;
+}
+#app .centerPanel .content #viewer .navigator.extraMargin {
+  margin: 0 30px 0 0 !important;
+}
+#app .centerPanel .content #viewer .paging.btn {
+  position: absolute !important;
+  width: 30px;
+  height: 90px;
+  background-repeat: no-repeat;
+  background-color: #000;
+  background-position: 0px 50%;
+  cursor: pointer;
+  padding: 0px;
+  border: none;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.vertical {
+  height: 30px;
+  width: 90px;
+  background-position: 50% 0;
+}
+#app .centerPanel .content #viewer .paging.btn.prev {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/left_arrow.png');
+  left: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.prev.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/left_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow.png');
+  left: 0;
+  top: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical.down {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow.png');
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical.down.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/right_arrow.png');
+  right: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.next.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/right_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow.png');
+  left: 0;
+  top: 0;
+  margin-left: 15px;
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical.up {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical.up.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .zoomIn {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer .zoomOut {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer .goHome {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer div[title="Rotate left"] {
+  display: none !important;
+}
+#app .centerPanel .content #viewer .rotate {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer div[title="Previous page"] {
+  display: none !important;
+}
+#app .centerPanel .content #viewer div[title="Next page"] {
+  display: none !important;
+}
+#app .centerPanel .content .spinner {
+  position: absolute;
+  background: rgba(0, 0, 0, 0.9);
+  width: 34px;
+  height: 34px;
+  border-radius: 34px;
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .centerPanel .content .searchOverlay {
+  background-color: #14a4c3;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+#app .centerPanel .content .searchOverlay.current {
+  border: 3px solid #fff;
+}
+#app .openseadragon-canvas {
+  outline: none;
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel .tabs {
+  height: 25px;
+  border-bottom: 1px solid #373737;
+}
+#app .leftPanel .tabs .tab {
+  color: #fff;
+  background-color: #211f1f;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+#app .leftPanel .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .leftPanel .tabs .tab.on {
+  border: 1px solid #373737;
+  border-bottom: 1px solid #211f1f;
+  color: #14a4c3;
+  margin-bottom: -1px;
+  height: 25px;
+  line-height: 25px;
+}
+#app .leftPanel .tabsContent {
+  padding: 10px 10px 10px 10px;
+}
+#app .leftPanel .tabsContent .options {
+  padding: 0 0 10px 0;
+}
+#app .leftPanel .tabsContent .options .top {
+  overflow: hidden;
+  height: auto;
+}
+#app .leftPanel .tabsContent .options .bottom {
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .left {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView {
+  padding: 5px 0 0 0;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView span {
+  display: block;
+  float: left;
+  color: #fff;
+  padding: 5px 4px 0 0;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView select {
+  float: left;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .right {
+  float: right;
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .multiSelectAll {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .btn {
+  margin-left: 10px;
+}
+#app .leftPanel .tabsContent .btn-group .btn {
+  padding: 0 5px 0 5px;
+  background: #565656;
+  color: #9a9a9a;
+  width: 55px;
+}
+#app .leftPanel .tabsContent .btn-group .btn.on {
+  background: #DDD;
+  color: #000;
+}
+#app .leftPanel .views .treeView {
+  font-weight: normal;
+  overflow: auto;
+}
+#app.browser-Explorer .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: -11px;
+}
+#app.browser-Firefox .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: 9px;
+  overflow: hidden;
+}
+#app .footerPanel .searchResults {
+  position: relative;
+  height: 60px;
+  padding: 30px 9px 0 9px;
+}
+#app .footerPanel .searchResults .line {
+  background: #565656;
+  height: 2px;
+}
+#app .footerPanel .searchResults .searchResultPlacemarker {
+  position: absolute;
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_down.png');
+  height: 24px;
+  width: 18px;
+  cursor: pointer;
+  margin: -24 0 0 -9;
+}
+#app .footerPanel .searchResults .searchResultPlacemarker.hover {
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_down_hover.png');
+}
+#app .footerPanel .searchResults .searchResultPlacemarker.current {
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_down_hover.png');
+}
+#app .footerPanel .searchResults .positionPlacemarker {
+  position: absolute;
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_up.png');
+  height: 24px;
+  width: 18px;
+  margin: 2px 0 0 -9px;
+  cursor: pointer;
+}
+#app .footerPanel .searchResults .placeMarkerDetails {
+  position: absolute;
+  width: 200px;
+  z-index: 1;
+  margin: 13px 0 0 9px;
+  background: #fff;
+  cursor: pointer;
+}
+#app .footerPanel .searchResults .placeMarkerDetails h1 {
+  color: #000;
+  font-size: 11px;
+  font-weight: bold;
+  background-position: 0 1px;
+  background-repeat: no-repeat;
+  margin: 5px;
+  padding: 0 5px 5px 0;
+  text-transform: none;
+}
+#app .footerPanel .searchResults .placeMarkerDetails p {
+  font-size: 11px;
+  font-weight: bold;
+  margin: 5px 5px 5px 5px;
+  padding: 0;
+  color: #000;
+}
+#app .footerPanel .searchResults .placeMarkerDetails .top {
+  display: inline;
+}
+#app .footerPanel .searchResults .placeMarkerDetails .bottom {
+  display: inline;
+}
+#app .footerPanel .searchResults .label {
+  position: absolute;
+  color: #fff;
+  margin: 8px 15px 0 15px;
+  min-width: 160px;
+}
+#app .footerPanel .searchResults .label.left {
+  text-align: right;
+}
+#app .footerPanel .searchResults .label.right {
+  text-align: left;
+}
+#app .footerPanel .search {
+  position: relative;
+  background-color: #211f1f;
+  height: 32px;
+}
+#app .footerPanel .search .searchTextContainer {
+  background: #fff;
+  float: left;
+  width: 270px;
+  position: relative;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete {
+  position: absolute;
+  background: #fff;
+  width: 270px;
+  border: 2px solid #ffffff;
+  list-style-type: none;
+  -webkit-margin-before: 0px;
+  -webkit-margin-after: 0px;
+  -webkit-margin-start: 0px;
+  -webkit-margin-end: 0px;
+  -webkit-padding-start: 0px;
+  margin: 0;
+  padding: 0;
+  max-height: 300px;
+  overflow-y: auto;
+  overflow-x: hidden;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete .result {
+  padding: 4px;
+  width: 270px;
+  overflow: hidden;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete .result.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 4px 4px;
+  height: 25px;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete .result.selected {
+  background: #efefef;
+}
+#app .footerPanel .search .searchTextContainer .searchText {
+  width: 245px;
+  margin: 1px 0 0 0;
+  font-size: 12px;
+  height: 22px;
+  line-height: 22px;
+  padding: 0;
+  float: left;
+  border: none;
+}
+#app .footerPanel .search .searchTextContainer .searchText.searching {
+  background: url('../../img/uv-searchfooterpanel-module/spinner.gif') no-repeat;
+  background-position: right 3px;
+}
+#app .footerPanel .search .searchTextContainer a.imageButton.searchButton {
+  background: url('../../img/uv-searchfooterpanel-module/search.png') no-repeat;
+  height: 18px;
+  width: 18px;
+  margin: 2px 2px 0 0;
+  float: right;
+  cursor: pointer;
+}
+#app .footerPanel .searchOptions {
+  position: absolute;
+  width: 420px;
+  margin: 4px 0 0 0;
+}
+#app .footerPanel .searchOptions .label {
+  color: #fff;
+  font-weight: bold;
+  padding: 0 10px 0 0;
+  margin: 4px 0 0 0;
+  float: left;
+}
+#app .footerPanel .searchPager {
+  position: relative;
+  background-color: #211f1f;
+  height: 32px;
+  overflow: hidden;
+}
+#app .footerPanel .searchPager .controls {
+  position: absolute;
+  margin-top: 1px;
+  width: 585px;
+}
+#app .footerPanel .searchPager .controls a.previousResult {
+  -webkit-touch-callout: none;
+  /* iOS Safari */
+  -webkit-user-select: none;
+  /* Chrome/Safari/Opera */
+  -khtml-user-select: none;
+  /* Konqueror */
+  -moz-user-select: none;
+  /* Firefox */
+  -ms-user-select: none;
+  /* Internet Explorer/Edge */
+  user-select: none;
+  /* Non-prefixed version, currently
+                                  not supported by any browser */
+  background-image: url('../../img/uv-searchfooterpanel-module/prev.png');
+  background-repeat: no-repeat;
+  height: 30px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 25px;
+  padding-right: 10px;
+  line-height: 30px;
+  float: left;
+  margin: 0 10px 0 0;
+}
+#app .footerPanel .searchPager .controls a.previousResult:link,
+#app .footerPanel .searchPager .controls a.previousResult:visited,
+#app .footerPanel .searchPager .controls a.previousResult:hover,
+#app .footerPanel .searchPager .controls a.previousResult:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .searchPager .controls a.previousResult.disabled {
+  opacity: 0.25;
+  filter: alpha(opacity=25);
+}
+#app .footerPanel .searchPager .controls a.nextResult {
+  -webkit-touch-callout: none;
+  /* iOS Safari */
+  -webkit-user-select: none;
+  /* Chrome/Safari/Opera */
+  -khtml-user-select: none;
+  /* Konqueror */
+  -moz-user-select: none;
+  /* Firefox */
+  -ms-user-select: none;
+  /* Internet Explorer/Edge */
+  user-select: none;
+  /* Non-prefixed version, currently
+                                  not supported by any browser */
+  background-image: url('../../img/uv-searchfooterpanel-module/next.png');
+  background-repeat: no-repeat;
+  height: 30px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 25px;
+  padding-left: 10px;
+  line-height: 30px;
+  float: right;
+  margin: 0 0 0 10px;
+}
+#app .footerPanel .searchPager .controls a.nextResult:link,
+#app .footerPanel .searchPager .controls a.nextResult:visited,
+#app .footerPanel .searchPager .controls a.nextResult:hover,
+#app .footerPanel .searchPager .controls a.nextResult:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .searchPager .controls a.nextResult.disabled {
+  opacity: 0.25;
+  filter: alpha(opacity=25);
+}
+#app .footerPanel .searchPager .controls a.clearSearch {
+  -webkit-touch-callout: none;
+  /* iOS Safari */
+  -webkit-user-select: none;
+  /* Chrome/Safari/Opera */
+  -khtml-user-select: none;
+  /* Konqueror */
+  -moz-user-select: none;
+  /* Firefox */
+  -ms-user-select: none;
+  /* Internet Explorer/Edge */
+  user-select: none;
+  /* Non-prefixed version, currently
+                                  not supported by any browser */
+  cursor: pointer;
+  color: #26b5cc;
+  text-decoration: none;
+  margin: 0 0 0 10px;
+  font-size: 12px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  margin: 4px 0 0 0;
+  color: #fff;
+  text-align: center;
+  font-size: 14px;
+  float: left;
+  width: 345px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo .number {
+  font-weight: bold;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo .terms {
+  font-weight: bold;
+}
+/*
+#app .footerPanel .searchOptions .autoCompleteWidget {
+    position: relative;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget input[type="text"]{
+    width: 300px;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results {
+    position: absolute;
+    left: 0;
+    top: 50px;
+    overflow-x: hidden;
+    overflow-y: auto;
+    overflow: auto;
+    max-height: 300px;
+    width: 300px;
+    background: #fff;
+    border: 1px solid;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul{
+    list-style-type: none;
+    margin: 10px;
+    padding: 0;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul li{
+    padding: 2px;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul li.selected{
+    background: lightgrey;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul li a:hover{
+    text-decoration: none;
+}
+*/
+#app .overlays > div.multiSelect {
+  width: 480px;
+}
+#app .overlays > div.multiSelect .content {
+  height: 350px;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .header .btn-primary {
+  width: auto;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .main .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .main .thumb.selected .wrap {
+  border: 2px solid #14a4c3;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .main .thumb span {
+  color: #000;
+}
+#app .overlays > div.multiSelect .bottom {
+  background: none;
+}
+#app.browser-Explorer .overlays > div.multiSelect .content .iiif-gallery-component .header input[type="range"] {
+  margin-top: -11px;
+}
+#app.browser-Firefox .overlays > div.multiSelect .content .iiif-gallery-component .header input[type="range"] {
+  margin-top: 9px;
+  overflow: hidden;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .footerPanel.mobile {
+    display: block;
+    position: relative;
+    height: 50px;
+  }
+  #app .footerPanel.mobile .options {
+    position: absolute;
+    width: 315px;
+  }
+  #app .footerPanel.mobile .options .spacer {
+    float: left;
+    width: 30px;
+    height: 41px;
+  }
+  #app .footerPanel.mobile .options a {
+    margin-right: 15px;
+  }
+  #app .footerPanel.mobile .options a.zoomIn {
+    background-image: url('../../img/uv-osdmobilefooterpanel-module/zoom_in.png');
+    background-repeat: no-repeat;
+    height: 21px;
+    line-height: 21px;
+    cursor: pointer;
+    color: #fff;
+    text-decoration: none;
+    background-position: left center;
+    padding-left: 35px;
+    padding-right: 10px;
+    line-height: 22px;
+    font: 0/0 a;
+    text-shadow: none;
+    background-color: transparent;
+    border: 0;
+    line-height: 0;
+    font-size: 0;
+    color: transparent;
+    width: 27px;
+    padding: 0;
+  }
+  #app .footerPanel.mobile .options a.zoomIn:link,
+  #app .footerPanel.mobile .options a.zoomIn:visited,
+  #app .footerPanel.mobile .options a.zoomIn:hover,
+  #app .footerPanel.mobile .options a.zoomIn:active {
+    color: #fff;
+    text-decoration: none;
+  }
+  #app .footerPanel.mobile .options a.zoomOut {
+    background-image: url('../../img/uv-osdmobilefooterpanel-module/zoom_out.png');
+    background-repeat: no-repeat;
+    height: 21px;
+    line-height: 21px;
+    cursor: pointer;
+    color: #fff;
+    text-decoration: none;
+    background-position: left center;
+    padding-left: 35px;
+    padding-right: 10px;
+    line-height: 22px;
+    font: 0/0 a;
+    text-shadow: none;
+    background-color: transparent;
+    border: 0;
+    line-height: 0;
+    font-size: 0;
+    color: transparent;
+    width: 27px;
+    padding: 0;
+  }
+  #app .footerPanel.mobile .options a.zoomOut:link,
+  #app .footerPanel.mobile .options a.zoomOut:visited,
+  #app .footerPanel.mobile .options a.zoomOut:hover,
+  #app .footerPanel.mobile .options a.zoomOut:active {
+    color: #fff;
+    text-decoration: none;
+  }
+  #app .footerPanel.mobile .options a.rotate {
+    background-image: url('../../img/uv-osdmobilefooterpanel-module/rotate_right.png');
+    background-repeat: no-repeat;
+    height: 21px;
+    line-height: 21px;
+    cursor: pointer;
+    color: #fff;
+    text-decoration: none;
+    background-position: left center;
+    padding-left: 35px;
+    padding-right: 10px;
+    line-height: 22px;
+    font: 0/0 a;
+    text-shadow: none;
+    background-color: transparent;
+    border: 0;
+    line-height: 0;
+    font-size: 0;
+    color: transparent;
+    width: 27px;
+    padding: 0;
+  }
+  #app .footerPanel.mobile .options a.rotate:link,
+  #app .footerPanel.mobile .options a.rotate:visited,
+  #app .footerPanel.mobile .options a.rotate:hover,
+  #app .footerPanel.mobile .options a.rotate:active {
+    color: #fff;
+    text-decoration: none;
+  }
+  #app .footerPanel.mobile .options a.bookmark {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.open {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.feedback {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.embed {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.fullScreen {
+    display: none;
+  }
+}
+#app .headerPanel .options .centerOptions {
+  width: 432px;
+}
+#app .headerPanel .options .centerOptions .prevOptions {
+  margin: 0 10px 0 0;
+}
+#app .headerPanel .options .centerOptions .mode label {
+  width: 42px;
+}
+#app .headerPanel .options .centerOptions .search {
+  width: 140px;
+}
+#app .headerPanel .options .centerOptions .nextOptions {
+  margin: 0 0 0 10px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 290px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-virtex-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-virtex-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..d1d158f353f8221b7ea82a410869a1ecf603307d
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/css/uv-virtex-extension/theme.css
@@ -0,0 +1,2455 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel .tabs {
+  height: 25px;
+  border-bottom: 1px solid #373737;
+}
+#app .leftPanel .tabs .tab {
+  color: #fff;
+  background-color: #211f1f;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+#app .leftPanel .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .leftPanel .tabs .tab.on {
+  border: 1px solid #373737;
+  border-bottom: 1px solid #211f1f;
+  color: #14a4c3;
+  margin-bottom: -1px;
+  height: 25px;
+  line-height: 25px;
+}
+#app .leftPanel .tabsContent {
+  padding: 10px 10px 10px 10px;
+}
+#app .leftPanel .tabsContent .options {
+  padding: 0 0 10px 0;
+}
+#app .leftPanel .tabsContent .options .top {
+  overflow: hidden;
+  height: auto;
+}
+#app .leftPanel .tabsContent .options .bottom {
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .left {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView {
+  padding: 5px 0 0 0;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView span {
+  display: block;
+  float: left;
+  color: #fff;
+  padding: 5px 4px 0 0;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView select {
+  float: left;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .right {
+  float: right;
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .multiSelectAll {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .btn {
+  margin-left: 10px;
+}
+#app .leftPanel .tabsContent .btn-group .btn {
+  padding: 0 5px 0 5px;
+  background: #565656;
+  color: #9a9a9a;
+  width: 55px;
+}
+#app .leftPanel .tabsContent .btn-group .btn.on {
+  background: #DDD;
+  color: #000;
+}
+#app .leftPanel .views .treeView {
+  font-weight: normal;
+  overflow: auto;
+}
+#app.browser-Explorer .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: -11px;
+}
+#app.browser-Firefox .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: 9px;
+  overflow: hidden;
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+.virtex {
+  background: #252424;
+  background: -moz-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #252424), color-stop(85%, #171717));
+  background: -webkit-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: -o-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: -ms-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: radial-gradient(ellipse at center, #252424 0%, #171717 85%);
+}
+.virtex .viewport {
+  position: relative;
+}
+.virtex .loading {
+  position: absolute;
+  width: 150px;
+  height: 5px;
+  background-color: #171717;
+}
+.virtex .loading .bar {
+  height: 5px;
+  width: 1px;
+  background-color: #fff;
+}
+#oldie {
+  position: absolute;
+  margin-top: 0px !important;
+  margin-right: 0px !important;
+  margin-bottom: 0px !important;
+  margin-left: 0px !important;
+  font-family: sans-serif !important;
+  line-height: 18px !important;
+}
+#app .centerPanel a.imageBtn {
+  height: 28px;
+  width: 28px;
+  float: left;
+  cursor: pointer;
+}
+#app .centerPanel .content {
+  position: relative;
+}
+#app .centerPanel .content .navigation {
+  position: absolute;
+  left: 0;
+  top: 0;
+  overflow: hidden;
+  margin-left: 15px;
+}
+#app .centerPanel .content .navigation a.imageBtn.zoomIn {
+  background-image: url('../../img/uv-virtexcenterpanel-module/zoom_in.png');
+}
+#app .centerPanel .content .navigation a.imageBtn.zoomOut {
+  background-image: url('../../img/uv-virtexcenterpanel-module/zoom_out.png');
+}
+#app .centerPanel .content .virtex {
+  background: none;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+#app .headerPanel .options .centerOptions {
+  width: 432px;
+}
+#app .headerPanel .options .centerOptions .prevOptions {
+  margin: 0 10px 0 0;
+}
+#app .headerPanel .options .centerOptions .mode label {
+  width: 42px;
+}
+#app .headerPanel .options .centerOptions .search {
+  width: 140px;
+}
+#app .headerPanel .options .centerOptions .nextOptions {
+  margin: 0 0 0 10px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 290px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-contentleftpanel-module/padlock.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-contentleftpanel-module/padlock.png
new file mode 100644
index 0000000000000000000000000000000000000000..42565c975d5819561bead967b34056a25bba3018
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-contentleftpanel-module/padlock.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-contentleftpanel-module/thumb_placeholder.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-contentleftpanel-module/thumb_placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..bacbc63c2f9e55b05148254295e1b12cda6d3125
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-contentleftpanel-module/thumb_placeholder.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/bigplay.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/bigplay.png
new file mode 100644
index 0000000000000000000000000000000000000000..694553e31c387188b6bde397a5200c212aff2dc5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/bigplay.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0ee90397b7401cc96f8544959855ac0dd69479c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome.png
new file mode 100644
index 0000000000000000000000000000000000000000..51dffb149211a97f914a093b3abbf5008ff955d9
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/loading.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/loading.gif
new file mode 100644
index 0000000000000000000000000000000000000000..612222be5e474c36c345042dd6f697fa1d16a6a0
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-mediaelementcenterpanel-module/loading.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-moreinforightpanel-module/copy.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-moreinforightpanel-module/copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e64490c4917f23ef4aba481a6f6661220268fa0
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-moreinforightpanel-module/copy.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/rotate_right.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/rotate_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcc50496d7e6bbbfcc4d6d426db70cec26ad0eea
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/rotate_right.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_in.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_in.png
new file mode 100644
index 0000000000000000000000000000000000000000..da5b7bd0ebebe46da09e5ae2fafea7eaaf37977a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_in.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_out.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_out.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc575c665beea1860ab7bac6ad6c54046ebe5600
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_out.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/first.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/first.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f0123a7655a11d2a112c1189c41cdf0a9a6f8d2
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/first.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/grid.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/grid.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c3d1026fea0f156d6580a98f08b0833d26a423d
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/grid.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/last.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/last.png
new file mode 100644
index 0000000000000000000000000000000000000000..be3b4952bdff32d3cc18594ba3128c5b9832ec13
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/last.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/next.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3de98023eaf24b13ad9e9ed56ef4d8cf3198309
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/next.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/one_up.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/one_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ca2f5a5909ed6db18462a5b861f1177f6535f65
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/one_up.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/prev.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..e70d135bcab57b10949230840291eca4e49f2f60
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/prev.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/settings.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7a02c6dfa64f4d2a0aece91d7bee0a0a26f5682
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/settings.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/two_up.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/two_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d8ac00607e87c07034199960351db235bb192ed
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pagingheaderpanel-module/two_up.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-check.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-check.svg
new file mode 100644
index 0000000000000000000000000000000000000000..71cd16df576f158da70e8007c946cf25ad25e397
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-check.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <path
+     d="M 1.5006714,23.536225 6.8925879,18.994244 14.585721,26.037937 34.019683,4.5410479 38.499329,9.2235032 14.585721,35.458952 z"
+     id="path4"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.25402856;stroke-opacity:1" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-comment.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-comment.svg
new file mode 100644
index 0000000000000000000000000000000000000000..86f1f17249f0a2e49e54a6610fa928c91815c2d7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-comment.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   height="40"
+   width="40"
+   viewBox="0 0 40 40">
+  <rect
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915" />
+  <path
+     d="m 20.677967,8.54499 c -7.342801,0 -13.295293,4.954293 -13.295293,11.065751 0,2.088793 0.3647173,3.484376 1.575539,5.150563 L 6.0267418,31.45501 13.560595,29.011117 c 2.221262,1.387962 4.125932,1.665377 7.117372,1.665377 7.3428,0 13.295291,-4.954295 13.295291,-11.065753 0,-6.111458 -5.952491,-11.065751 -13.295291,-11.065751 z"
+     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93031836;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-help.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-help.svg
new file mode 100644
index 0000000000000000000000000000000000000000..00938fefe048b07fede7186d235179fe6ac2482c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-help.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <g
+     transform="translate(0,-60)"
+     id="layer1">
+    <rect
+       width="36.460953"
+       height="34.805603"
+       x="1.7695236"
+       y="62.597198"
+       style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.30826771;stroke-opacity:1" />
+    <g
+       transform="matrix(0.88763677,0,0,0.88763677,2.2472646,8.9890584)">
+      <path
+         d="M 20,64.526342 C 11.454135,64.526342 4.5263421,71.454135 4.5263421,80 4.5263421,88.545865 11.454135,95.473658 20,95.473658 28.545865,95.473658 35.473658,88.545865 35.473658,80 35.473658,71.454135 28.545865,64.526342 20,64.526342 z m -0.408738,9.488564 c 3.527079,0 6.393832,2.84061 6.393832,6.335441 0,3.494831 -2.866753,6.335441 -6.393832,6.335441 -3.527079,0 -6.393832,-2.84061 -6.393832,-6.335441 0,-3.494831 2.866753,-6.335441 6.393832,-6.335441 z"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.02768445;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         d="m 7.2335209,71.819938 4.9702591,4.161823 c -1.679956,2.581606 -1.443939,6.069592 0.159325,8.677725 l -5.1263071,3.424463 c 0.67516,1.231452 3.0166401,3.547686 4.2331971,4.194757 l 3.907728,-4.567277 c 2.541952,1.45975 5.730694,1.392161 8.438683,-0.12614 l 3.469517,6.108336 c 1.129779,-0.44367 4.742234,-3.449633 5.416358,-5.003859 l -5.46204,-4.415541 c 1.44319,-2.424098 1.651175,-5.267515 0.557303,-7.748623 l 5.903195,-3.833951 C 33.14257,71.704996 30.616217,69.018606 29.02952,67.99296 l -4.118813,4.981678 C 22.411934,71.205099 18.900853,70.937534 16.041319,72.32916 l -3.595408,-5.322091 c -1.345962,0.579488 -4.1293881,2.921233 -5.2123901,4.812869 z m 8.1010311,3.426672 c 2.75284,-2.446266 6.769149,-2.144694 9.048998,0.420874 2.279848,2.56557 2.113919,6.596919 -0.638924,9.043185 -2.752841,2.446267 -6.775754,2.13726 -9.055604,-0.428308 -2.279851,-2.565568 -2.107313,-6.589485 0.64553,-9.035751 z"
+         style="fill:#000000;fill-opacity:1;stroke:none" />
+    </g>
+  </g>
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-insert.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-insert.svg
new file mode 100644
index 0000000000000000000000000000000000000000..519ef6826e56b178cbad9d91adf0b7a870696602
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-insert.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,1.4044602 57.432701,62.632577 6.5672991,62.627924 z"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:1.00493038;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-key.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-key.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8d09d5378d5be7d1350e08c3ece3d87e2e711a96
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-key.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 25.470843,9.4933766 C 25.30219,12.141818 30.139101,14.445969 34.704831,13.529144 40.62635,12.541995 41.398833,7.3856498 35.97505,5.777863 31.400921,4.1549155 25.157674,6.5445892 25.470843,9.4933766 z M 4.5246282,17.652051 C 4.068249,11.832873 9.2742983,5.9270407 18.437379,3.0977088 29.751911,-0.87185184 45.495663,1.4008022 53.603953,7.1104009 c 9.275765,6.1889221 7.158128,16.2079421 -3.171076,21.5939521 -1.784316,1.635815 -6.380222,1.21421 -7.068351,3.186186 -1.04003,0.972427 -1.288046,2.050158 -1.232864,3.168203 1.015111,2.000108 -3.831548,1.633216 -3.270553,3.759574 0.589477,5.264544 -0.179276,10.53738 -0.362842,15.806257 -0.492006,2.184998 1.163456,4.574232 -0.734888,6.610642 -2.482919,2.325184 -7.30604,2.189143 -9.193497,-0.274767 -2.733688,-1.740626 -8.254447,-3.615254 -6.104247,-6.339626 3.468112,-1.708686 -2.116197,-3.449897 0.431242,-5.080274 5.058402,-1.39256 -2.393215,-2.304318 -0.146889,-4.334645 3.069198,-0.977415 2.056986,-2.518352 -0.219121,-3.540397 1.876567,-1.807151 1.484149,-4.868919 -2.565455,-5.942205 0.150866,-1.805474 2.905737,-4.136876 -1.679967,-5.20493 C 10.260902,27.882167 4.6872697,22.95045 4.5245945,17.652051 z"
+     id="path604"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.72665179;stroke-opacity:1" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-newparagraph.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-newparagraph.svg
new file mode 100644
index 0000000000000000000000000000000000000000..38d2497da9112076d3e88876d03aedbb1437a1a2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-newparagraph.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,10.913072 57.432701,53.086929 6.567299,53.083723 z"
+     id="path2985"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:0.83403099;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-noicon.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-noicon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c07d1080832bebea22ad1cf45fe3bac16ca90642
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-noicon.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-note.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-note.svg
new file mode 100644
index 0000000000000000000000000000000000000000..70173651c7e2a3d53492f234e7444c9d775b3b2c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-note.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="36.075428"
+     height="31.096582"
+     x="1.962286"
+     y="4.4517088"
+     id="rect4"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.23004246;stroke-opacity:1" />
+  <rect
+     width="27.96859"
+     height="1.5012145"
+     x="6.0157046"
+     y="10.285"
+     id="rect6"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157056"
+     y="23.21689"
+     id="rect8"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="5.8130345"
+     y="28.964394"
+     id="rect10"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157046"
+     y="17.426493"
+     id="rect12"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-paragraph.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-paragraph.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6ae5212b75d6855aa2cf7964de2b27650a6a2b80
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/annotation-paragraph.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  <path
+     d="m 17.692678,34.50206 0,-16.182224 c -1.930515,-0.103225 -3.455824,-0.730383 -4.57593,-1.881473 -1.12011,-1.151067 -1.680164,-2.619596 -1.680164,-4.405591 0,-1.992435 0.621995,-3.5796849 1.865988,-4.7617553 1.243989,-1.1820288 3.06352,-1.7730536 5.458598,-1.7730764 l 9.802246,0 0,2.6789711 -2.229895,0 0,26.3251486 -2.632515,0 0,-26.3251486 -3.45324,0 0,26.3251486 z"
+     style="font-size:29.42051125px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07795751;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..bef02743fc108697e14e0e5daab8181f7ef91dd8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next.png
new file mode 100644
index 0000000000000000000000000000000000000000..de1d0fc901c2d2369660026bd466d4c3f0a62eba
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0250307c0d10b0c0a38a8381361ec265ef3080c8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..de1d0fc901c2d2369660026bd466d4c3f0a62eba
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0250307c0d10b0c0a38a8381361ec265ef3080c8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous.png
new file mode 100644
index 0000000000000000000000000000000000000000..bef02743fc108697e14e0e5daab8181f7ef91dd8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/grab.cur b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/grab.cur
new file mode 100644
index 0000000000000000000000000000000000000000..db7ad5aed3ef958aa13903afa769386382a87ad3
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/grab.cur differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/grabbing.cur b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/grabbing.cur
new file mode 100644
index 0000000000000000000000000000000000000000..e0dfd04e4d3fcbaa6588c8cbb9e9065609bcb862
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/grabbing.cur differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/loading-icon.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/loading-icon.gif
new file mode 100644
index 0000000000000000000000000000000000000000..1c72ebb554be018511ae972c3f2361dff02dce02
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/loading-icon.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/loading-small.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/loading-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..51848a70fe3928e0e22f65be8a70a593211c4a22
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/loading-small.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png
new file mode 100644
index 0000000000000000000000000000000000000000..40925e25ace9954a0e3092c1cd19a02eca82fd07
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..adb240eaad3c4cd7329cccd7af188e6472302a00
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png
new file mode 100644
index 0000000000000000000000000000000000000000..e68846aa5f609f48e89b25692abdd85c2de7ecb9
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ad8af5173850f4b645f9c94f4efe3379564b128
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb85a841b18be0235fc6c6714223609e1097d1f4
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c13f77ff003460753a39d9e406c0020231cabda
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png
new file mode 100644
index 0000000000000000000000000000000000000000..be763e0c4a02cab5d7842c8999faade8c47059bf
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..8570984f2d9952ebb8543a6c8bbca2408be3fe90
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png
new file mode 100644
index 0000000000000000000000000000000000000000..675d6da2c09cebd7e2375d94cbc43de49a28a6e8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9e74312270af04fa2b9b033675d8674faab64e6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1c7598886bd49e194764015577b766aadd82288
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb257b41c537552a19f711ced5ec19cad5fc1c9f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/shadow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/shadow.png
new file mode 100644
index 0000000000000000000000000000000000000000..31d3bdb14f1d67953d18dc04e73db834aaa200f2
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/shadow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/texture.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/texture.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb5ccb5ec3cdf7f20c344483958a2684e11e6df5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/texture.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..a187be6c9ba78003d9d2013e4cdc1c7f73bb8949
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4efbaa6758dce6ea82f9e03e81c0196cd806b266
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download.png
new file mode 100644
index 0000000000000000000000000000000000000000..eaab35f09e12fed1a285ca765b38846f84ebbb91
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..896face455a605a86196bce9ad3b7d640468dd17
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png
new file mode 100644
index 0000000000000000000000000000000000000000..306eb43b86861ffd83ab17541d64a4e8d240c86a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7570bc0d30db3dafe54aa7c1fe92367690f5046
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5cf1bd06139d17c90cb6ab492221803f5047543
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..91ab76593eadd6280b2a554d8d3eb1430d7ef6ba
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..1957f79ab95a970cc93eaeadec532661c5a1ae55
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..16ebcb8ef1e923710574bb914e19526f2545abdb
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png
new file mode 100644
index 0000000000000000000000000000000000000000..8219ecf83c6bcf74acc8d0cf5935347a7937edb5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..758c01d8364c5597d7e9ead825cf4e7754c8d929
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..98e7ce481c163c0d4221be87d262096c631f800e
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a01b02380b90e5ab32727ac5460eca3108a8f1e5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb9daa337656a75091ea00d4c5600ba4f557d834
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a5cfd755b0b400bc6b7790c0fd41e7aa70d8aa1c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ac21244dff26830f46ec462f2dab36e1a18938c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cada9e7918da28bdf84af38c354dbf1e1c6fe31a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print.png
new file mode 100644
index 0000000000000000000000000000000000000000..51275e54bee695c76a455579262ad642efe7220c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..53d18daf7825ae12d99406068073d16ab682737e
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9b75579b1e058baada95941a4a7ff0c80edb5cb
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..456b133248fd5310857db3e2b174730f6488371b
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..8437095273c46e84b404dcdc1157240cfdd1b454
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d9bfa4f63d6a8ae5cbaafa2efadd2c16b48a3d8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f90f83da745ff2470745ecf1c0c276b7179b088
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b066fe5cb0ef03ceee653393df468690f382abdf
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f85ec061ea167b1718d2865cfc1e53370f11b7a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..291e006797fc7f0e84d297e952630c719fe6eeab
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png
new file mode 100644
index 0000000000000000000000000000000000000000..025dc9040e5073bfd18da3464566163456f72534
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f834df94000475b8edda3b062279b17277db9d8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcd0b268a475662d421e9144764a09d20faf4155
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaa9430211e168a593f7e3bb486b3cac2be6556b
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3410f70dfa653e77cd7e6b9e2c69cb2e2869c7ef
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png
new file mode 100644
index 0000000000000000000000000000000000000000..976365a50612903b56e307401195ad1159e91b3f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6a197fdf33da57ada4fec17e042708b1586fb29
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png
new file mode 100644
index 0000000000000000000000000000000000000000..584ba55881f9a192ddea645d6d8525bab205e289
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb7db9383669cf734685ca7422bbab1032f486fd
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png
new file mode 100644
index 0000000000000000000000000000000000000000..513d081bc2d2f3eb64801a5e8cde86ef4455829c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5d49d5ff107f01daa307bd0f89f98efc31eeec7
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png
new file mode 100644
index 0000000000000000000000000000000000000000..156c26b941c12a13130e7a7c181d13300a85de89
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..959e1919d5a7a83a9c319de4d65ddaf6dc6c2763
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..4929fc767e1e11e26b921794dd1a282d319832f6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..351c44db9e4c5b05c8e9d48146905cbe1d41785c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/home.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/home.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1a07f89e2935b138fd883802c39cf5ddde3de74
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/home.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e0abf91bc86d94289ef4db411c80b18f23961a5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..6734c847635965674930318b18b14638e6b43c8f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/pixel.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/pixel.gif
new file mode 100644
index 0000000000000000000000000000000000000000..9a4dbb4f0c821f79383053ea56c121a6c8ba1ce7
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/pixel.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..72e1dabb25e63afcbbbdfa41e6e09e7e48a4eebd
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2550de8b978a438813883d7c9935634abe40321
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/rotate_right.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/rotate_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcc50496d7e6bbbfcc4d6d426db70cec26ad0eea
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/rotate_right.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..634642273a509f1cf7ac7f19bb783cd8bbd4f212
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c12f3037d1c0ad8e2dcb7135d2fa5d630bf9edf
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/zoom_in.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/zoom_in.png
new file mode 100644
index 0000000000000000000000000000000000000000..da5b7bd0ebebe46da09e5ae2fafea7eaaf37977a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/zoom_in.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/zoom_out.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/zoom_out.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc575c665beea1860ab7bac6ad6c54046ebe5600
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-seadragoncenterpanel-module/zoom_out.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/next.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3de98023eaf24b13ad9e9ed56ef4d8cf3198309
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/next.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_down.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..53497471bc5e7a43de2fb259f93a53adb40c06e6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_down.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_down_hover.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_down_hover.png
new file mode 100644
index 0000000000000000000000000000000000000000..4609c8672391b4b01526df69666f5931a57921f8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_down_hover.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_up.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..e518a82c3ab855e96bc43e529fea3d0a53632638
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/placemarker_up.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/prev.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..e70d135bcab57b10949230840291eca4e49f2f60
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/prev.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/search.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/search.png
new file mode 100644
index 0000000000000000000000000000000000000000..6494c2a46949bc7d6cb771a03857993680af2280
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/search.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/spinner.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/spinner.gif
new file mode 100644
index 0000000000000000000000000000000000000000..148005da279b97c0acc697d48a815645977dc723
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-searchfooterpanel-module/spinner.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/arrows_left.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/arrows_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..de3d0a7501dcc4cc9cc6853691a7593fe9c86514
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/arrows_left.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/arrows_right.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/arrows_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d6423a40ec7124da3a442f2deab8bc91dcfbd8c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/arrows_right.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/bookmark.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab1ada4ea0e39274c7d3d2df7f39546a6b7e1e82
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/bookmark.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close.png
new file mode 100644
index 0000000000000000000000000000000000000000..192c5b4174e23e17594e4344ebea854163a10769
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_attribution.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_attribution.png
new file mode 100644
index 0000000000000000000000000000000000000000..63d3b6aaca4b4d0cc1eb19f9e86d9912f5e84c4d
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_attribution.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_information_box.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_information_box.png
new file mode 100644
index 0000000000000000000000000000000000000000..624c69403b1af08ed1c877e56664de9d4e5dd0ad
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_information_box.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_message_box.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_message_box.png
new file mode 100644
index 0000000000000000000000000000000000000000..624c69403b1af08ed1c877e56664de9d4e5dd0ad
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/close_message_box.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/copy.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e64490c4917f23ef4aba481a6f6661220268fa0
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/copy.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/dialogue_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/dialogue_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..63f4d420cc9c0934cb77de5e770c604d59fad09b
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/dialogue_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/download.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/download.png
new file mode 100644
index 0000000000000000000000000000000000000000..427949cce3d86032a32c9e4859fa5106ab06f38f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/download.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/embed.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/embed.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eee1b8dab10de034fffbd298d1e2fb784104cb8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/embed.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/error.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/error.png
new file mode 100644
index 0000000000000000000000000000000000000000..b34622dc30abdd592adcb15be41fd70b23822de3
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/error.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/exit_fullscreen.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/exit_fullscreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ac59bea3a80eb42a0eb41dff27a129a8144c9dc
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/exit_fullscreen.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/feedback.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/feedback.png
new file mode 100644
index 0000000000000000000000000000000000000000..820b6b00d5b8cf0cb190eeba086ab79ba22cf7d6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/feedback.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/fullscreen.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/fullscreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..a93a7fa75ecf8a870f63f65b0dfffd292ba00056
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/fullscreen.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/hidden_thumb.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/hidden_thumb.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f85f82c9301f39f36d8034643d616b7d57ef421
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/hidden_thumb.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/iiif.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/iiif.png
new file mode 100644
index 0000000000000000000000000000000000000000..78d17919024dc1dbbdcf02f7fa19055faec3dcf6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/iiif.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/minus.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/minus.png
new file mode 100644
index 0000000000000000000000000000000000000000..bacbc63c2f9e55b05148254295e1b12cda6d3125
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/minus.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/modal_bg.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/modal_bg.gif
new file mode 100644
index 0000000000000000000000000000000000000000..dfa72f9e5b0fc69771a008408ed04e6074894846
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/modal_bg.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/moreinfo.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/moreinfo.png
new file mode 100644
index 0000000000000000000000000000000000000000..49f402d38d078c24d882dfa02330e6dfb5fec258
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/moreinfo.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/open.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/open.png
new file mode 100644
index 0000000000000000000000000000000000000000..a94f321e621f3efe14944fed3c18c3693c5efc4d
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/open.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/plus.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/plus.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ac754c5355708d4a5c2d67b202a6f4da2cc3882
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/plus.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/print.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/print.png
new file mode 100644
index 0000000000000000000000000000000000000000..cca841fb4afb6e0cbb1d72d87c764efc7d1b9928
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/print.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/search_result.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/search_result.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0fa494bf237c5efc74b71a822a0b43f5e2a8d1a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/search_result.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/settings.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..7949b5383a602198029463fd219258228c25d0ae
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/settings.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/share.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/share.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee982988b96c222cb002926649d0f006a2bfa1a8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/share.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/sprite.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/sprite.png
new file mode 100644
index 0000000000000000000000000000000000000000..53f3df4891a4ae318932eacf77745907e4059c22
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/sprite.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/unavailable.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/unavailable.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4ff2963a578d20c823a3cc35f9439c40cd6eef8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-shared-module/unavailable.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-virtexcenterpanel-module/zoom_in.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-virtexcenterpanel-module/zoom_in.png
new file mode 100644
index 0000000000000000000000000000000000000000..da5b7bd0ebebe46da09e5ae2fafea7eaaf37977a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-virtexcenterpanel-module/zoom_in.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-virtexcenterpanel-module/zoom_out.png b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-virtexcenterpanel-module/zoom_out.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc575c665beea1860ab7bac6ad6c54046ebe5600
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-cy-GB-theme/img/uv-virtexcenterpanel-module/zoom_out.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-mediaelement-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-mediaelement-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..a207fe947793ebbf87af953fd6d5f9e58aee6762
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-mediaelement-extension/theme.css
@@ -0,0 +1,3166 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel ul {
+  margin: 10px 10px 10px 10px;
+  padding: 0;
+  list-style-type: none;
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+.mejs-container {
+  position: relative;
+  background: #000;
+  font-family: Helvetica, Arial;
+  text-align: left;
+  vertical-align: top;
+}
+.me-plugin {
+  position: absolute;
+}
+.mejs-embed,
+.mejs-embed body {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  background: #000;
+  overflow: hidden;
+}
+.mejs-container-fullscreen {
+  position: fixed;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  z-index: 1000;
+}
+.mejs-container-fullscreen .mejs-mediaelement,
+.mejs-container-fullscreen video {
+  width: 100%;
+  height: 100%;
+}
+/* Start: LAYERS */
+.mejs-background {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.mejs-mediaelement {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+.mejs-poster {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.mejs-poster img {
+  padding: 0;
+  border: 0;
+  display: block;
+}
+.mejs-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.mejs-overlay-play {
+  cursor: pointer;
+}
+.mejs-overlay-button {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100px;
+  height: 100px;
+  margin: -50px 0 0 -50px;
+  background: url('../../img/uv-mediaelementcenterpanel-module/bigplay.png') no-repeat;
+}
+.mejs-overlay:hover .mejs-overlay-button {
+  background-position: 0 -100px;
+}
+.mejs-overlay-loading {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 80px;
+  height: 80px;
+  margin: -40px 0 0 -40px;
+  background: #333;
+  background: url(background.png);
+  background: rgba(0, 0, 0, 0.9);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50, 50, 50, 0.9)), to(rgba(0, 0, 0, 0.9)));
+  background: -webkit-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: -moz-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: -o-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: -ms-linear-gradient(top, rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+  background: linear-gradient(rgba(50, 50, 50, 0.9), rgba(0, 0, 0, 0.9));
+}
+.mejs-overlay-loading span {
+  display: block;
+  width: 80px;
+  height: 80px;
+  background: transparent url('../../img/uv-mediaelementcenterpanel-module/loading.gif') 50% 50% no-repeat;
+}
+/* End: LAYERS */
+/* Start: CONTROL BAR */
+.mejs-container .mejs-controls {
+  position: absolute;
+  background: none;
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+  bottom: 0;
+  left: 0;
+  background: url(background.png);
+  background: rgba(0, 0, 0, 0.7);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50, 50, 50, 0.7)), to(rgba(0, 0, 0, 0.7)));
+  background: -webkit-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -moz-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -o-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -ms-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: linear-gradient(rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  height: 30px;
+  width: 100%;
+}
+.mejs-container .mejs-controls div {
+  list-style-type: none;
+  background-image: none;
+  display: block;
+  float: left;
+  margin: 0;
+  padding: 0;
+  width: 26px;
+  height: 26px;
+  font-size: 11px;
+  line-height: 11px;
+  background: 0;
+  font-family: Helvetica, Arial;
+  border: 0;
+}
+.mejs-controls .mejs-button button {
+  cursor: pointer;
+  display: block;
+  font-size: 0;
+  line-height: 0;
+  text-decoration: none;
+  margin: 7px 5px;
+  padding: 0;
+  position: absolute;
+  height: 16px;
+  width: 16px;
+  border: 0;
+  outline-color: transparent !important;
+  background: transparent url(controls.png) no-repeat;
+}
+/* :focus for accessibility */
+.mejs-controls .mejs-button button:focus {
+  outline: solid 1px yellow;
+}
+/* End: CONTROL BAR */
+/* Start: Time (current / duration) */
+.mejs-container .mejs-controls .mejs-time {
+  color: #fff;
+  display: block;
+  height: 20px;
+  width: auto;
+  padding: 8px 3px 0 3px ;
+  overflow: hidden;
+  text-align: center;
+  padding: auto 4px;
+}
+.mejs-container .mejs-controls .mejs-time span {
+  font-size: 11px;
+  color: #fff;
+  line-height: 12px;
+  display: block;
+  float: left;
+  margin: 1px 2px 0 0;
+  width: auto;
+}
+/* End: Time (current / duration) */
+/* Start: Play/pause */
+.mejs-controls .mejs-play button {
+  background-position: 0 0;
+}
+.mejs-controls .mejs-pause button {
+  background-position: 0 -16px;
+}
+/* End: Play/pause */
+/* Stop */
+.mejs-controls .mejs-stop button {
+  background-position: -112px 0;
+}
+/* End: Play/pause */
+/* Start: Progress bar */
+.mejs-controls div.mejs-time-rail {
+  width: 200px;
+  padding-top: 5px;
+}
+.mejs-controls .mejs-time-rail span {
+  display: block;
+  position: absolute;
+  width: 180px;
+  height: 10px;
+  -webkit-border-radius: 2px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+  cursor: pointer;
+}
+.mejs-controls .mejs-time-rail .mejs-time-total {
+  margin: 5px;
+  background: #333;
+  background: rgba(50, 50, 50, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30, 30, 30, 0.8)), to(rgba(60, 60, 60, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -moz-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -o-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -ms-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: linear-gradient(rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+}
+.mejs-controls .mejs-time-rail .mejs-time-loaded {
+  background: #3caac8;
+  background: rgba(60, 170, 200, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(44, 124, 145, 0.8)), to(rgba(78, 183, 212, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: -moz-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: -o-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: -ms-linear-gradient(top, rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  background: linear-gradient(rgba(44, 124, 145, 0.8), rgba(78, 183, 212, 0.8));
+  width: 0;
+}
+.mejs-controls .mejs-time-rail .mejs-time-current {
+  width: 0;
+  background: #fff;
+  background: rgba(255, 255, 255, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.9)), to(rgba(200, 200, 200, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -o-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -ms-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: linear-gradient(rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+}
+.mejs-controls .mejs-time-rail .mejs-time-handle {
+  display: none;
+  position: absolute;
+  margin: 0;
+  width: 10px;
+  background: #fff;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  cursor: pointer;
+  border: solid 2px #333;
+  top: -2px;
+  text-align: center;
+}
+.mejs-controls .mejs-time-rail .mejs-time-float {
+  position: absolute;
+  display: none;
+  background: #eee;
+  width: 36px;
+  height: 17px;
+  /*border: solid 1px #333;*/
+  top: -26px;
+  margin-left: -18px;
+  text-align: center;
+  color: #111;
+}
+.mejs-controls .mejs-time-rail .mejs-time-float-current {
+  margin: 2px;
+  width: 30px;
+  display: block;
+  text-align: center;
+  left: 0;
+}
+.mejs-controls .mejs-time-rail .mejs-time-float-corner {
+  /*position: absolute;*/
+  display: block;
+  width: 0;
+  height: 0;
+  line-height: 0;
+  border: solid 5px #eee;
+  border-color: #eee transparent transparent transparent;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  /*top: 15px;
+	left: 13px;*/
+  margin-top: -13px;
+  margin-left: 12px;
+}
+/*
+.mejs-controls .mejs-time-rail:hover .mejs-time-handle {
+	visibility:visible;
+}
+*/
+/* End: Progress bar */
+/* Start: Fullscreen */
+.mejs-controls .mejs-fullscreen-button button {
+  background-position: -32px 0;
+}
+.mejs-controls .mejs-unfullscreen button {
+  background-position: -32px -16px;
+}
+/* End: Fullscreen */
+/* Start: Mute/Volume */
+.mejs-controls .mejs-mute button {
+  background-position: -16px -16px;
+}
+.mejs-controls .mejs-unmute button {
+  background-position: -16px 0;
+}
+.mejs-controls .mejs-volume-button {
+  position: relative;
+}
+.mejs-controls .mejs-volume-button .mejs-volume-slider {
+  display: none;
+  height: 115px;
+  width: 25px;
+  background: url(background.png);
+  background: rgba(50, 50, 50, 0.7);
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  top: -115px;
+  left: 0;
+  z-index: 1;
+  position: absolute;
+  margin: 0;
+}
+.mejs-controls .mejs-volume-button:hover {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+/*
+.mejs-controls .mejs-volume-button:hover .mejs-volume-slider {
+	display: block;
+}
+*/
+.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total {
+  position: absolute;
+  left: 11px;
+  top: 8px;
+  width: 2px;
+  height: 100px;
+  background: #ddd;
+  background: rgba(255, 255, 255, 0.5);
+  margin: 0;
+}
+.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current {
+  position: absolute;
+  left: 11px;
+  top: 8px;
+  width: 2px;
+  height: 100px;
+  background: #ddd;
+  background: rgba(255, 255, 255, 0.9);
+  margin: 0;
+}
+.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle {
+  position: absolute;
+  left: 4px;
+  top: -3px;
+  width: 16px;
+  height: 6px;
+  background: #ddd;
+  background: rgba(255, 255, 255, 0.9);
+  cursor: N-resize;
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+  margin: 0;
+}
+/* horizontal version */
+.mejs-controls div.mejs-horizontal-volume-slider {
+  height: 26px;
+  width: 60px;
+  position: relative;
+}
+.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {
+  position: absolute;
+  left: 0;
+  top: 11px;
+  width: 50px;
+  height: 8px;
+  margin: 0;
+  padding: 0;
+  font-size: 1px;
+  -webkit-border-radius: 2px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+  background: #333;
+  background: rgba(50, 50, 50, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30, 30, 30, 0.8)), to(rgba(60, 60, 60, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -moz-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -o-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: -ms-linear-gradient(top, rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+  background: linear-gradient(rgba(30, 30, 30, 0.8), rgba(60, 60, 60, 0.8));
+}
+.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {
+  position: absolute;
+  left: 0;
+  top: 11px;
+  width: 50px;
+  height: 8px;
+  margin: 0;
+  padding: 0;
+  font-size: 1px;
+  -webkit-border-radius: 2px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+  background: #fff;
+  background: rgba(255, 255, 255, 0.8);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.9)), to(rgba(200, 200, 200, 0.8)));
+  background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -o-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: -ms-linear-gradient(top, rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+  background: linear-gradient(rgba(255, 255, 255, 0.9), rgba(200, 200, 200, 0.8));
+}
+.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle {
+  display: none;
+}
+/* End: Mute/Volume */
+/* Start: TRACK (Captions and Chapters) */
+.mejs-controls .mejs-captions-button {
+  position: relative;
+}
+.mejs-controls .mejs-captions-button button {
+  background-position: -48px 0;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector {
+  visibility: hidden;
+  position: absolute;
+  bottom: 26px;
+  right: -10px;
+  width: 130px;
+  height: 100px;
+  background: url(background.png);
+  background: rgba(50, 50, 50, 0.7);
+  border: solid 1px transparent;
+  padding: 10px;
+  overflow: hidden;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+/*
+.mejs-controls .mejs-captions-button:hover  .mejs-captions-selector {
+	visibility: visible;
+}
+*/
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul {
+  margin: 0;
+  padding: 0;
+  display: block;
+  list-style-type: none !important;
+  overflow: hidden;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul li {
+  margin: 0 0 6px 0;
+  padding: 0;
+  list-style-type: none !important;
+  display: block;
+  color: #fff;
+  overflow: hidden;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input {
+  clear: both;
+  float: left;
+  margin: 3px 3px 0 5px;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label {
+  width: 100px;
+  float: left;
+  padding: 4px 0 0 0;
+  line-height: 15px;
+  font-family: helvetica, arial;
+  font-size: 10px;
+}
+.mejs-controls .mejs-captions-button .mejs-captions-translations {
+  font-size: 10px;
+  margin: 0 0 5px 0;
+}
+.mejs-chapters {
+  position: absolute;
+  top: 0;
+  left: 0;
+  -xborder-right: solid 1px #fff;
+  width: 10000px;
+}
+.mejs-chapters .mejs-chapter {
+  position: absolute;
+  float: left;
+  background: #222;
+  background: rgba(0, 0, 0, 0.7);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50, 50, 50, 0.7)), to(rgba(0, 0, 0, 0.7)));
+  background: -webkit-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -moz-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -o-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: -ms-linear-gradient(top, rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  background: linear-gradient(rgba(50, 50, 50, 0.7), rgba(0, 0, 0, 0.7));
+  filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#323232, endColorstr=#000000);
+  overflow: hidden;
+  border: 0;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block {
+  font-size: 11px;
+  color: #fff;
+  padding: 5px;
+  display: block;
+  border-right: solid 1px #333;
+  border-bottom: solid 1px #333;
+  cursor: pointer;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block-last {
+  border-right: none;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block:hover {
+  /*background: #333;*/
+  background: #666;
+  background: rgba(102, 102, 102, 0.7);
+  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(102, 102, 102, 0.7)), to(rgba(50, 50, 50, 0.6)));
+  background: -webkit-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: -moz-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: -o-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: -ms-linear-gradient(top, rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  background: linear-gradient(rgba(102, 102, 102, 0.7), rgba(50, 50, 50, 0.6));
+  filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#666666, endColorstr=#323232);
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title {
+  font-size: 12px;
+  font-weight: bold;
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  margin: 0 0 3px 0;
+  line-height: 12px;
+}
+.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan {
+  font-size: 12px;
+  line-height: 12px;
+  margin: 3px 0 4px 0;
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.mejs-captions-layer {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  text-align: center;
+  /*font-weight: bold;*/
+  line-height: 22px;
+  font-size: 12px;
+  color: #fff;
+}
+.mejs-captions-layer a {
+  color: #fff;
+  text-decoration: underline;
+}
+.mejs-captions-layer[lang=ar] {
+  font-size: 20px;
+  font-weight: normal;
+}
+.mejs-captions-position {
+  position: absolute;
+  width: 100%;
+  bottom: 15px;
+  left: 0;
+}
+.mejs-captions-position-hover {
+  bottom: 45px;
+}
+.mejs-captions-text {
+  padding: 3px 5px;
+  background: url(background.png);
+  background: rgba(20, 20, 20, 0.8);
+}
+/* End: TRACK (Captions and Chapters) */
+.mejs-clear {
+  clear: both;
+}
+/* Start: ERROR */
+.me-cannotplay {
+  padding: 20px;
+  color: #fff;
+  vertical-align: middle;
+}
+.me-cannotplay p {
+  position: relative;
+  top: 50%;
+  text-align: center;
+  width: 80%;
+}
+.me-cannotplay a {
+  color: #fff;
+  font-weight: bold;
+  text-decoration: underline;
+}
+.me-cannotplay span {
+  padding: 15px;
+  display: block;
+}
+/* End: ERROR */
+/* Start: Loop */
+.mejs-controls .mejs-loop-off button {
+  background-position: -64px -16px;
+}
+.mejs-controls .mejs-loop-on button {
+  background-position: -64px 0;
+}
+/* End: Loop */
+/* Start: backlight */
+.mejs-controls .mejs-backlight-off button {
+  background-position: -80px -16px;
+}
+.mejs-controls .mejs-backlight-on button {
+  background-position: -80px 0;
+}
+/* End: backlight */
+/* Start: picture controls */
+.mejs-controls .mejs-picturecontrols-button {
+  background-position: -96px 0;
+}
+/* End: picture controls */
+/* context menu */
+.mejs-contextmenu {
+  position: absolute;
+  width: 150px;
+  padding: 10px;
+  border-radius: 4px;
+  top: 0;
+  left: 0;
+  background: #fff;
+  border: solid 1px #999;
+  z-index: 1001;
+  /* make sure it shows on fullscreen */
+}
+.mejs-contextmenu .mejs-contextmenu-separator {
+  height: 1px;
+  font-size: 0;
+  margin: 5px 6px;
+  background: #333;
+}
+.mejs-contextmenu .mejs-contextmenu-item {
+  font-family: Helvetica, Arial;
+  font-size: 12px;
+  padding: 4px 6px;
+  cursor: pointer;
+  color: #333;
+}
+.mejs-contextmenu .mejs-contextmenu-item:hover {
+  background: #2C7C91;
+  color: #fff;
+}
+/* Start: SourceChooser */
+.mejs-controls .mejs-sourcechooser-button {
+  position: relative;
+}
+.mejs-controls .mejs-sourcechooser-button button {
+  background-position: -128px 0;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector {
+  visibility: hidden;
+  position: absolute;
+  bottom: 26px;
+  right: -10px;
+  width: 130px;
+  height: 100px;
+  background: url(background.png);
+  background: rgba(50, 50, 50, 0.7);
+  border: solid 1px transparent;
+  padding: 10px;
+  overflow: hidden;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul {
+  margin: 0;
+  padding: 0;
+  display: block;
+  list-style-type: none !important;
+  overflow: hidden;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li {
+  margin: 0 0 6px 0;
+  padding: 0;
+  list-style-type: none !important;
+  display: block;
+  color: #fff;
+  overflow: hidden;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input {
+  clear: both;
+  float: left;
+  margin: 3px 3px 0 5px;
+}
+.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label {
+  width: 100px;
+  float: left;
+  padding: 4px 0 0 0;
+  line-height: 15px;
+  font-family: helvetica, arial;
+  font-size: 10px;
+}
+/* End: SourceChooser */
+/* UV */
+.mejs-container.mejs-uv {
+  background-color: transparent;
+}
+.mejs-uv .mejs-controls {
+  height: 43px;
+  background-image: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png');
+  background-repeat: repeat-x;
+  background-position: 0 5px;
+  margin: 0 0 0 11px;
+}
+.mejs-uv .mejs-button,
+.mejs-uv .mejs-time {
+  position: absolute;
+  background: #ddd;
+}
+.mejs-uv .mejs-controls .mejs-playpause-button {
+  width: 37px;
+  height: 37px;
+  left: -5px;
+  margin: 0;
+  border: none;
+}
+.mejs-uv .mejs-controls .mejs-playpause-button button {
+  width: 37px;
+  height: 37px;
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -1px -18px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-pause button {
+  background-position: -40px -18px;
+}
+.mejs-uv .mejs-controls .mejs-time-rail {
+  position: absolute;
+  margin: 6px 5px 0 0;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-current {
+  width: 0;
+  height: 6px;
+  background: #FFB81D;
+}
+.mejs-uv .mejs-controls .mejs-currenttime-container {
+  position: absolute;
+  margin: 4px 0 0 0;
+  color: #fff;
+}
+.mejs-uv .mejs-controls .mejs-currenttime-container .slash {
+  padding: 0 0 0 3px;
+}
+.mejs-uv .mejs-controls .mejs-duration-container {
+  position: absolute;
+  margin: 4px 5px 0 0;
+  padding-left: 0;
+  color: #fff;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-total {
+  background: #000;
+  height: 6px;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-loaded {
+  background: #FFB81D;
+  width: 0;
+  height: 6px;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-handle {
+  display: block;
+  margin: 0;
+  width: 15px;
+  height: 15px;
+  border: 0;
+  top: -5px;
+  left: -1px;
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat 0 0;
+}
+.mejs-uv .mejs-controls .mejs-time-rail .mejs-time-float {
+  display: none;
+}
+.mejs-uv .mejs-controls .mejs-volume-button {
+  position: absolute;
+  margin: 10px 5px 0 0;
+  width: 18px;
+  height: 17px;
+}
+.mejs-uv .mejs-controls .mejs-horizontal-volume-slider {
+  position: absolute;
+  margin: 3px 5px 0 0;
+}
+.mejs-uv .mejs-controls .mejs-mute button {
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -19px 0;
+  width: 18px;
+  height: 17px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-unmute button {
+  background: url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -40px 0;
+  width: 18px;
+  height: 17px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-slider {
+  background: #525252;
+  width: 22px;
+  height: 65px;
+  top: -64px;
+  left: -4px;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-total {
+  background: #3e3e3e;
+  left: 8px;
+  width: 6px;
+  height: 50px;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-current {
+  left: 8px;
+  width: 6px;
+  background: #757575;
+  height: 70px;
+}
+.mejs-uv .mejs-controls .mejs-volume-button .mejs-volume-handle {
+  width: 14px;
+}
+.mejs-uv .mejs-controls .mejs-fullscreen-button {
+  position: absolute;
+  margin: 11px 10px 0 0;
+  width: 18px;
+  height: 17px;
+}
+.mejs-uv .mejs-controls .mejs-fullscreen-button button {
+  width: 17px;
+  height: 15px;
+  background: transparent url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -1px -58px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-unfullscreen button {
+  width: 17px;
+  height: 15px;
+  background: transparent url('../../img/uv-mediaelementcenterpanel-module/controls-wellcome.png') no-repeat -22px -58px;
+  margin: 0;
+  padding: 0;
+}
+.mejs-uv .mejs-controls .mejs-time button {
+  color: #333;
+}
+.mejs-uv .mejs-controls .mejs-captions-button {
+  display: none;
+}
+/* END: UV */
+#app .mejs-container.mejs-uv {
+  background-color: #000;
+}
+#app .centerPanel .content {
+  position: relative;
+}
+#app .centerPanel .content .container {
+  position: absolute;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+#app .headerPanel .options .centerOptions {
+  width: 390px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 337px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-pdf-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-pdf-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..00b175d67009d44c250079561aa01698804fe45c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-pdf-extension/theme.css
@@ -0,0 +1,4032 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel ul {
+  margin: 10px 10px 10px 10px;
+  padding: 0;
+  list-style-type: none;
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+* {
+  padding: 0;
+  margin: 0;
+}
+/* Font size is needed to make the activity bar the correct size. */
+body {
+  font-size: 10px;
+  height: 100%;
+  background-color: #404040;
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png');
+}
+body,
+input,
+button,
+select {
+  font: message-box;
+  outline: none;
+}
+.hidden {
+  display: none !important;
+}
+[hidden] {
+  display: none !important;
+}
+#viewerContainer:-webkit-full-screen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+}
+#viewerContainer:-moz-full-screen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+}
+#viewerContainer:-ms-fullscreen {
+  top: 0px !important;
+  border-top: 2px solid transparent;
+  width: 100%;
+  height: 100%;
+  overflow: hidden !important;
+  cursor: none;
+}
+#viewerContainer:-ms-fullscreen::-ms-backdrop {
+  background-color: #000;
+}
+#viewerContainer:fullscreen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+}
+:-webkit-full-screen .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+:-moz-full-screen .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+:-ms-fullscreen .page {
+  margin-bottom: 100% !important;
+  border: 0;
+}
+:fullscreen .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+:-webkit-full-screen a:not(.internalLink) {
+  display: none;
+}
+:-moz-full-screen a:not(.internalLink) {
+  display: none;
+}
+:-ms-fullscreen a:not(.internalLink) {
+  display: none !important;
+}
+:fullscreen a:not(.internalLink) {
+  display: none;
+}
+:-webkit-full-screen .textLayer > div {
+  cursor: none;
+}
+:-moz-full-screen .textLayer > div {
+  cursor: none;
+}
+:fullscreen .textLayer > div {
+  cursor: none;
+}
+#viewerContainer.presentationControls,
+#viewerContainer.presentationControls .textLayer > div {
+  cursor: default;
+}
+/* outer/inner center provides horizontal center */
+.outerCenter {
+  pointer-events: none;
+  position: relative;
+}
+#outerContainer[dir='ltr'] .outerCenter {
+  float: right;
+  right: 50%;
+}
+#outerContainer[dir='rtl'] .outerCenter {
+  float: left;
+  left: 50%;
+}
+.innerCenter {
+  pointer-events: auto;
+  position: relative;
+}
+#outerContainer[dir='ltr'] .innerCenter {
+  float: right;
+  right: -50%;
+}
+#outerContainer[dir='rtl'] .innerCenter {
+  float: left;
+  left: -50%;
+}
+#outerContainer {
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+#sidebarContainer {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  width: 200px;
+  visibility: hidden;
+  -webkit-transition-duration: 200ms;
+  -webkit-transition-timing-function: ease;
+  transition-duration: 200ms;
+  transition-timing-function: ease;
+}
+#outerContainer[dir='ltr'] #sidebarContainer {
+  -webkit-transition-property: left;
+  transition-property: left;
+  left: -200px;
+}
+#outerContainer[dir='rtl'] #sidebarContainer {
+  -webkit-transition-property: right;
+  transition-property: right;
+  right: -200px;
+}
+#outerContainer.sidebarMoving > #sidebarContainer,
+#outerContainer.sidebarOpen > #sidebarContainer {
+  visibility: visible;
+}
+#outerContainer[dir='ltr'].sidebarOpen > #sidebarContainer {
+  left: 0px;
+}
+#outerContainer[dir='rtl'].sidebarOpen > #sidebarContainer {
+  right: 0px;
+}
+#mainContainer {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  min-width: 320px;
+  -webkit-transition-duration: 200ms;
+  -webkit-transition-timing-function: ease;
+  transition-duration: 200ms;
+  transition-timing-function: ease;
+}
+#outerContainer[dir='ltr'].sidebarOpen > #mainContainer {
+  -webkit-transition-property: left;
+  transition-property: left;
+  left: 200px;
+}
+#outerContainer[dir='rtl'].sidebarOpen > #mainContainer {
+  -webkit-transition-property: right;
+  transition-property: right;
+  right: 200px;
+}
+#sidebarContent {
+  top: 32px;
+  bottom: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  width: 200px;
+  background-color: rgba(0, 0, 0, 0.1);
+}
+#outerContainer[dir='ltr'] #sidebarContent {
+  left: 0;
+  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25);
+}
+#outerContainer[dir='rtl'] #sidebarContent {
+  right: 0;
+  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25);
+}
+#viewerContainer {
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  top: 32px;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  outline: none;
+}
+#outerContainer[dir='ltr'] #viewerContainer {
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.05);
+}
+#outerContainer[dir='rtl'] #viewerContainer {
+  box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.05);
+}
+.toolbar {
+  position: relative;
+  left: 0;
+  right: 0;
+  z-index: 9999;
+  cursor: default;
+}
+#toolbarContainer {
+  width: 100%;
+}
+#toolbarSidebar {
+  width: 200px;
+  height: 32px;
+  background-color: #424242;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(77, 77, 77, 0.99), rgba(64, 64, 64, 0.95));
+}
+#outerContainer[dir='ltr'] #toolbarSidebar {
+  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 0 1px rgba(0, 0, 0, 0.1);
+}
+#outerContainer[dir='rtl'] #toolbarSidebar {
+  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 0 1px rgba(0, 0, 0, 0.1);
+}
+#toolbarContainer,
+.findbar,
+.secondaryToolbar {
+  position: relative;
+  height: 32px;
+  background-color: #474747;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(82, 82, 82, 0.99), rgba(69, 69, 69, 0.95));
+}
+#outerContainer[dir='ltr'] #toolbarContainer,
+.findbar,
+.secondaryToolbar {
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+#outerContainer[dir='rtl'] #toolbarContainer,
+.findbar,
+.secondaryToolbar {
+  box-shadow: inset -1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+#toolbarViewer {
+  height: 32px;
+}
+#loadingBar {
+  position: relative;
+  width: 100%;
+  height: 6px;
+  background-color: #333;
+  border-bottom: 1px solid #333;
+}
+#loadingBar .progress {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 0%;
+  height: 100%;
+  background-color: #ddd;
+  overflow: hidden;
+  -webkit-transition: width 200ms;
+  transition: width 200ms;
+}
+@-webkit-keyframes progressIndeterminate {
+  0% {
+    left: 0%;
+  }
+  50% {
+    left: 100%;
+  }
+  100% {
+    left: 100%;
+  }
+}
+@keyframes progressIndeterminate {
+  0% {
+    left: 0%;
+  }
+  50% {
+    left: 100%;
+  }
+  100% {
+    left: 100%;
+  }
+}
+#loadingBar .progress.indeterminate {
+  background-color: #999;
+  -webkit-transition: none;
+  transition: none;
+}
+#loadingBar .indeterminate .glimmer {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: 50px;
+  background-image: linear-gradient(to right, #999 0%, #fff 50%, #999 100%);
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  -webkit-animation: progressIndeterminate 2s linear infinite;
+  animation: progressIndeterminate 2s linear infinite;
+}
+.findbar,
+.secondaryToolbar {
+  top: 32px;
+  position: absolute;
+  z-index: 10000;
+  height: 32px;
+  min-width: 16px;
+  padding: 0px 6px 0px 6px;
+  margin: 4px 2px 4px 2px;
+  color: #d9d9d9;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  cursor: default;
+}
+#outerContainer[dir='ltr'] .findbar {
+  left: 68px;
+}
+#outerContainer[dir='rtl'] .findbar {
+  right: 68px;
+}
+.findbar label {
+  -webkit-user-select: none;
+  -moz-user-select: none;
+}
+#findInput[data-status="pending"] {
+  background-image: url('../../img/uv-pdfcenterpanel-module/loading-small.png');
+  background-repeat: no-repeat;
+  background-position: right;
+}
+.secondaryToolbar {
+  padding: 6px;
+  height: auto;
+  z-index: 30000;
+}
+#outerContainer[dir='ltr'] .secondaryToolbar {
+  right: 4px;
+}
+#outerContainer[dir='rtl'] .secondaryToolbar {
+  left: 4px;
+}
+#secondaryToolbarButtonContainer {
+  max-width: 200px;
+  max-height: 400px;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+  margin-bottom: -4px;
+}
+.doorHanger,
+.doorHangerRight {
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  border-radius: 2px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+.doorHanger:after,
+.doorHanger:before,
+.doorHangerRight:after,
+.doorHangerRight:before {
+  bottom: 100%;
+  border: solid transparent;
+  content: " ";
+  height: 0;
+  width: 0;
+  position: absolute;
+  pointer-events: none;
+}
+.doorHanger:after,
+.doorHangerRight:after {
+  border-bottom-color: rgba(82, 82, 82, 0.99);
+  border-width: 8px;
+}
+.doorHanger:before,
+.doorHangerRight:before {
+  border-bottom-color: rgba(0, 0, 0, 0.5);
+  border-width: 9px;
+}
+#outerContainer[dir='ltr'] .doorHanger:after,
+#outerContainer[dir='rtl'] .doorHangerRight:after {
+  left: 13px;
+  margin-left: -8px;
+}
+#outerContainer[dir='ltr'] .doorHanger:before,
+#outerContainer[dir='rtl'] .doorHangerRight:before {
+  left: 13px;
+  margin-left: -9px;
+}
+#outerContainer[dir='rtl'] .doorHanger:after,
+#outerContainer[dir='ltr'] .doorHangerRight:after {
+  right: 13px;
+  margin-right: -8px;
+}
+#outerContainer[dir='rtl'] .doorHanger:before,
+#outerContainer[dir='ltr'] .doorHangerRight:before {
+  right: 13px;
+  margin-right: -9px;
+}
+#findMsg {
+  font-style: italic;
+  color: #A6B7D0;
+}
+.notFound {
+  background-color: #ff8999;
+}
+#outerContainer[dir='ltr'] #toolbarViewerLeft {
+  margin-left: -1px;
+}
+#outerContainer[dir='rtl'] #toolbarViewerRight {
+  margin-right: -1px;
+}
+#outerContainer[dir='ltr'] #toolbarViewerLeft,
+#outerContainer[dir='rtl'] #toolbarViewerRight {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+#outerContainer[dir='ltr'] #toolbarViewerRight,
+#outerContainer[dir='rtl'] #toolbarViewerLeft {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+#outerContainer[dir='ltr'] #toolbarViewerLeft > *,
+#outerContainer[dir='ltr'] #toolbarViewerMiddle > *,
+#outerContainer[dir='ltr'] #toolbarViewerRight > *,
+#outerContainer[dir='ltr'] .findbar > * {
+  position: relative;
+  float: left;
+}
+#outerContainer[dir='rtl'] #toolbarViewerLeft > *,
+#outerContainer[dir='rtl'] #toolbarViewerMiddle > *,
+#outerContainer[dir='rtl'] #toolbarViewerRight > *,
+#outerContainer[dir='rtl'] .findbar > * {
+  position: relative;
+  float: right;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton {
+  margin: 3px 2px 4px 0;
+  display: inline-block;
+}
+#outerContainer[dir='rtl'] .splitToolbarButton {
+  margin: 3px 0 4px 2px;
+  display: inline-block;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton > .toolbarButton {
+  border-radius: 0;
+  float: left;
+}
+#outerContainer[dir='rtl'] .splitToolbarButton > .toolbarButton {
+  border-radius: 0;
+  float: right;
+}
+.toolbarButton,
+.secondaryToolbarButton {
+  border: 0 none;
+  background-color: rgba(0, 0, 0, 0);
+  width: 32px;
+  height: 25px;
+}
+.toolbarButton > span {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.toolbarButton[disabled],
+.secondaryToolbarButton[disabled] {
+  opacity: .5;
+}
+.toolbarButton.group {
+  margin-right: 0;
+}
+.splitToolbarButton.toggled .toolbarButton {
+  margin: 0;
+}
+.splitToolbarButton:hover > .toolbarButton,
+.splitToolbarButton:focus > .toolbarButton,
+.splitToolbarButton.toggled > .toolbarButton,
+.toolbarButton.textButton {
+  background-color: rgba(0, 0, 0, 0.12);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.35);
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 150ms;
+  -webkit-transition-timing-function: ease;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+.splitToolbarButton > .toolbarButton:hover,
+.splitToolbarButton > .toolbarButton:focus,
+.dropdownToolbarButton:hover,
+.overlayButton:hover,
+.toolbarButton.textButton:hover,
+.toolbarButton.textButton:focus {
+  background-color: rgba(0, 0, 0, 0.2);
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 0 1px rgba(0, 0, 0, 0.05);
+  z-index: 199;
+}
+.splitToolbarButton > .toolbarButton {
+  position: relative;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,
+#outerContainer[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {
+  position: relative;
+  margin: 0;
+  margin-right: -1px;
+  border-top-left-radius: 2px;
+  border-bottom-left-radius: 2px;
+  border-right-color: transparent;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,
+#outerContainer[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {
+  position: relative;
+  margin: 0;
+  margin-left: -1px;
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+  border-left-color: transparent;
+}
+.splitToolbarButtonSeparator {
+  padding: 8px 0;
+  width: 1px;
+  background-color: rgba(0, 0, 0, 0.5);
+  z-index: 99;
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+  display: inline-block;
+  margin: 5px 0;
+}
+#outerContainer[dir='ltr'] .splitToolbarButtonSeparator {
+  float: left;
+}
+#outerContainer[dir='rtl'] .splitToolbarButtonSeparator {
+  float: right;
+}
+.splitToolbarButton:hover > .splitToolbarButtonSeparator,
+.splitToolbarButton.toggled > .splitToolbarButtonSeparator {
+  padding: 12px 0;
+  margin: 1px 0;
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.03);
+  -webkit-transition-property: padding;
+  -webkit-transition-duration: 10ms;
+  -webkit-transition-timing-function: ease;
+  transition-property: padding;
+  transition-duration: 10ms;
+  transition-timing-function: ease;
+}
+.toolbarButton,
+.dropdownToolbarButton,
+.overlayButton,
+.secondaryToolbarButton {
+  min-width: 16px;
+  padding: 2px 6px 0;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  color: rgba(255, 255, 255, 0.8);
+  font-size: 12px;
+  line-height: 14px;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  /* Opera does not support user-select, use <... unselectable="on"> instead */
+  cursor: default;
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 150ms;
+  -webkit-transition-timing-function: ease;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+#outerContainer[dir='ltr'] .toolbarButton,
+#outerContainer[dir='ltr'] .overlayButton,
+#outerContainer[dir='ltr'] .dropdownToolbarButton {
+  margin: 3px 2px 4px 0;
+}
+#outerContainer[dir='rtl'] .toolbarButton,
+#outerContainer[dir='rtl'] .overlayButton,
+#outerContainer[dir='rtl'] .dropdownToolbarButton {
+  margin: 3px 0 4px 2px;
+}
+.toolbarButton:hover,
+.toolbarButton:focus,
+.dropdownToolbarButton,
+.overlayButton,
+.secondaryToolbarButton:hover,
+.secondaryToolbarButton:focus {
+  background-color: rgba(0, 0, 0, 0.12);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.35);
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.15) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+}
+.toolbarButton:hover:active,
+.overlayButton:hover:active,
+.dropdownToolbarButton:hover:active,
+.secondaryToolbarButton:hover:active {
+  background-color: rgba(0, 0, 0, 0.2);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  border-color: rgba(0, 0, 0, 0.35) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.45);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 10ms;
+  -webkit-transition-timing-function: linear;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 10ms;
+  transition-timing-function: linear;
+}
+.toolbarButton.toggled,
+.splitToolbarButton.toggled > .toolbarButton.toggled,
+.secondaryToolbarButton.toggled {
+  background-color: rgba(0, 0, 0, 0.3);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  border-color: rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.45) rgba(0, 0, 0, 0.5);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  -webkit-transition-property: background-color, border-color, box-shadow;
+  -webkit-transition-duration: 10ms;
+  -webkit-transition-timing-function: linear;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 10ms;
+  transition-timing-function: linear;
+}
+.toolbarButton.toggled:hover:active,
+.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,
+.secondaryToolbarButton.toggled:hover:active {
+  background-color: rgba(0, 0, 0, 0.4);
+  border-color: rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.5) rgba(0, 0, 0, 0.55);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2) inset, 0 0 1px rgba(0, 0, 0, 0.3) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+}
+.dropdownToolbarButton {
+  width: 120px;
+  max-width: 120px;
+  padding: 3px 2px 2px;
+  overflow: hidden;
+  background: url('../../img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png') no-repeat;
+}
+#outerContainer[dir='ltr'] .dropdownToolbarButton {
+  background-position: 95%;
+}
+#outerContainer[dir='rtl'] .dropdownToolbarButton {
+  background-position: 5%;
+}
+.dropdownToolbarButton > select {
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  /* in the future this might matter, see bugzilla bug #649849 */
+  min-width: 140px;
+  font-size: 12px;
+  color: #f2f2f2;
+  margin: 0;
+  padding: 0;
+  border: none;
+  background: rgba(0, 0, 0, 0);
+  /* Opera does not support 'transparent' <select> background */
+}
+.dropdownToolbarButton > select > option {
+  background: #3d3d3d;
+}
+.overlayButton {
+  margin: 3px 2px 4px 5px !important;
+  line-height: 16px;
+  padding: 2px 6px 3px 6px;
+}
+#customScaleOption {
+  display: none;
+}
+#pageWidthOption {
+  border-bottom: 1px rgba(255, 255, 255, 0.5) solid;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton:first-child,
+#outerContainer[dir='ltr'] .toolbarButton:first-child,
+#outerContainer[dir='rtl'] .splitToolbarButton:last-child,
+#outerContainer[dir='rtl'] .toolbarButton:last-child {
+  margin-left: 4px;
+}
+#outerContainer[dir='ltr'] .splitToolbarButton:last-child,
+#outerContainer[dir='ltr'] .toolbarButton:last-child,
+#outerContainer[dir='rtl'] .splitToolbarButton:first-child,
+#outerContainer[dir='rtl'] .toolbarButton:first-child {
+  margin-right: 4px;
+}
+.toolbarButtonSpacer {
+  width: 30px;
+  display: inline-block;
+  height: 1px;
+}
+.toolbarButtonFlexibleSpacer {
+  -webkit-box-flex: 1;
+  -moz-box-flex: 1;
+  min-width: 30px;
+}
+#outerContainer[dir='ltr'] #findPrevious {
+  margin-left: 3px;
+}
+#outerContainer[dir='ltr'] #findNext {
+  margin-right: 3px;
+}
+#outerContainer[dir='rtl'] #findPrevious {
+  margin-right: 3px;
+}
+#outerContainer[dir='rtl'] #findNext {
+  margin-left: 3px;
+}
+.toolbarButton::before,
+.secondaryToolbarButton::before {
+  /* All matching images have a size of 16x16
+   * All relevant containers have a size of 32x25 */
+  position: absolute;
+  display: inline-block;
+  top: 4px;
+  left: 7px;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton::before {
+  left: 4px;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton::before {
+  right: 4px;
+}
+#outerContainer[dir='ltr'] .toolbarButton#sidebarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton#sidebarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.findPrevious::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.findPrevious::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.findNext::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.findNext::before {
+  content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.pageUp::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.pageUp::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png');
+}
+#outerContainer[dir='ltr'] .toolbarButton.pageDown::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png');
+}
+#outerContainer[dir='rtl'] .toolbarButton.pageDown::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png');
+}
+.toolbarButton.zoomOut::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png');
+}
+.toolbarButton.zoomIn::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png');
+}
+.toolbarButton.presentationMode::before,
+.secondaryToolbarButton.presentationMode::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png');
+}
+.toolbarButton.print::before,
+.secondaryToolbarButton.print::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-print.png');
+}
+.toolbarButton.openFile::before,
+.secondaryToolbarButton.openFile::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-openFile.png');
+}
+.toolbarButton.download::before,
+.secondaryToolbarButton.download::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-download.png');
+}
+.toolbarButton.bookmark,
+.secondaryToolbarButton.bookmark {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  outline: none;
+  padding-top: 4px;
+  text-decoration: none;
+}
+.secondaryToolbarButton.bookmark {
+  padding-top: 5px;
+}
+.bookmark[href='#'] {
+  opacity: .5;
+  pointer-events: none;
+}
+.toolbarButton.bookmark::before,
+.secondaryToolbarButton.bookmark::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png');
+}
+#viewThumbnail.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png');
+}
+#outerContainer[dir="ltr"] #viewOutline.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png');
+}
+#outerContainer[dir="rtl"] #viewOutline.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png');
+}
+#viewAttachments.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png');
+}
+#viewFind.toolbarButton::before {
+  content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-search.png');
+}
+.secondaryToolbarButton {
+  position: relative;
+  margin: 0 0 4px 0;
+  padding: 3px 0 1px 0;
+  height: auto;
+  min-height: 25px;
+  width: auto;
+  min-width: 100%;
+  white-space: normal;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton {
+  padding-left: 24px;
+  text-align: left;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton {
+  padding-right: 24px;
+  text-align: right;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton.bookmark {
+  padding-left: 27px;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton.bookmark {
+  padding-right: 27px;
+}
+#outerContainer[dir="ltr"] .secondaryToolbarButton > span {
+  padding-right: 4px;
+}
+#outerContainer[dir="rtl"] .secondaryToolbarButton > span {
+  padding-left: 4px;
+}
+.secondaryToolbarButton.firstPage::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png');
+}
+.secondaryToolbarButton.lastPage::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png');
+}
+.secondaryToolbarButton.rotateCcw::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png');
+}
+.secondaryToolbarButton.rotateCw::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png');
+}
+.secondaryToolbarButton.handTool::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png');
+}
+.secondaryToolbarButton.documentProperties::before {
+  content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png');
+}
+.verticalToolbarSeparator {
+  display: block;
+  padding: 8px 0;
+  margin: 8px 4px;
+  width: 1px;
+  background-color: rgba(0, 0, 0, 0.5);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+}
+#outerContainer[dir='ltr'] .verticalToolbarSeparator {
+  margin-left: 2px;
+}
+#outerContainer[dir='rtl'] .verticalToolbarSeparator {
+  margin-right: 2px;
+}
+.horizontalToolbarSeparator {
+  display: block;
+  margin: 0 0 4px 0;
+  height: 1px;
+  width: 100%;
+  background-color: rgba(0, 0, 0, 0.5);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+}
+.toolbarField {
+  padding: 3px 6px !important;
+  margin: 4px 0 4px 0  !important;
+  border: 1px solid transparent !important;
+  border-radius: 2px !important;
+  background-color: rgba(255, 255, 255, 0.09);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  border: 1px solid rgba(0, 0, 0, 0.35);
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.05) inset, 0 1px 0 rgba(255, 255, 255, 0.05);
+  color: #f2f2f2;
+  font-size: 12px !important;
+  line-height: 14px !important;
+  outline-style: none;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+.toolbarField[type=checkbox] {
+  display: inline-block;
+  margin: 8px 0px !important;
+}
+.toolbarField.pageNumber {
+  -moz-appearance: textfield;
+  /* hides the spinner in moz */
+  min-width: 16px;
+  text-align: right;
+  width: 40px;
+}
+.toolbarField.pageNumber::-webkit-inner-spin-button,
+.toolbarField.pageNumber::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  margin: 0;
+}
+.toolbarField:hover {
+  background-color: rgba(255, 255, 255, 0.11);
+  border-color: rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.43) rgba(0, 0, 0, 0.45);
+}
+.toolbarField:focus {
+  background-color: rgba(255, 255, 255, 0.15);
+  border-color: rgba(77, 184, 255, 0.8) rgba(77, 184, 255, 0.85) rgba(77, 184, 255, 0.9);
+}
+.toolbarLabel {
+  min-width: 16px;
+  padding: 3px 6px 3px 2px;
+  margin: 4px 2px 4px 0;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  color: #d9d9d9;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  cursor: default;
+}
+#thumbnailView {
+  position: absolute;
+  width: 120px;
+  top: 0;
+  bottom: 0;
+  padding: 10px 40px 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+.thumbnail {
+  float: left;
+  margin-bottom: 5px;
+}
+#thumbnailView > a:last-of-type > .thumbnail {
+  margin-bottom: 10px;
+}
+.thumbnail:not([data-loaded]) {
+  border: 1px dashed rgba(255, 255, 255, 0.5);
+  margin-bottom: 10px;
+}
+.thumbnailImage {
+  transition-duration: 150ms;
+  border: 1px solid transparent;
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);
+  opacity: 0.8;
+  z-index: 99;
+}
+.thumbnailSelectionRing {
+  border-radius: 2px;
+  padding: 7px;
+  transition-duration: 150ms;
+}
+a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,
+.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {
+  opacity: .9;
+}
+a:focus > .thumbnail > .thumbnailSelectionRing,
+.thumbnail:hover > .thumbnailSelectionRing {
+  background-color: rgba(255, 255, 255, 0.15);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.2) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: rgba(255, 255, 255, 0.9);
+}
+.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5);
+  opacity: 1;
+}
+.thumbnail.selected > .thumbnailSelectionRing {
+  background-color: rgba(255, 255, 255, 0.3);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: #ffffff;
+}
+#outlineView,
+#attachmentsView {
+  position: absolute;
+  width: 192px;
+  top: 0;
+  bottom: 0;
+  padding: 4px 4px 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+}
+#outerContainer[dir='ltr'] .outlineItem > .outlineItems {
+  margin-left: 20px;
+}
+#outerContainer[dir='rtl'] .outlineItem > .outlineItems {
+  margin-right: 20px;
+}
+.outlineItem > a,
+.attachmentsItem > a {
+  text-decoration: none;
+  display: inline-block;
+  min-width: 95%;
+  height: auto;
+  margin-bottom: 1px;
+  border-radius: 2px;
+  color: rgba(255, 255, 255, 0.8);
+  font-size: 13px;
+  line-height: 15px;
+  -moz-user-select: none;
+  white-space: normal;
+}
+#outerContainer[dir='ltr'] .outlineItem > a,
+#outerContainer[dir='ltr'] .attachmentsItem > a {
+  padding: 2px 0 5px 10px;
+}
+#outerContainer[dir='rtl'] .outlineItem > a,
+#outerContainer[dir='rtl'] .attachmentsItem > a {
+  padding: 2px 10px 5px 0;
+}
+.outlineItem > a:hover,
+.attachmentsItem > a:hover {
+  background-color: rgba(255, 255, 255, 0.02);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.2) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: rgba(255, 255, 255, 0.9);
+}
+.outlineItem.selected {
+  background-color: rgba(255, 255, 255, 0.08);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05) inset, 0 0 1px rgba(255, 255, 255, 0.1) inset, 0 0 1px rgba(0, 0, 0, 0.2);
+  color: #ffffff;
+}
+.noResults {
+  font-size: 12px;
+  color: rgba(255, 255, 255, 0.8);
+  font-style: italic;
+  cursor: default;
+}
+.canvasWrapper {
+  overflow: hidden;
+}
+canvas {
+  margin: 0;
+  display: block;
+}
+.page {
+  direction: ltr;
+  width: 816px;
+  height: 1056px;
+  margin: 1px auto -8px auto;
+  position: relative;
+  overflow: visible;
+  border: 9px solid transparent;
+  background-clip: content-box;
+  border-image: url('../../img/uv-pdfcenterpanel-module/shadow.png') 9 9 repeat;
+  background-color: white;
+}
+.annotLink > a:hover {
+  opacity: 0.2;
+  background: #ff0;
+  box-shadow: 0px 2px 10px #ff0;
+}
+.loadingIcon {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  background: url('../../img/uv-pdfcenterpanel-module/loading-icon.gif') center no-repeat;
+}
+.textLayer {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  color: #000;
+  font-family: sans-serif;
+  overflow: hidden;
+}
+.textLayer > div {
+  color: transparent;
+  position: absolute;
+  white-space: pre;
+  cursor: text;
+}
+.textLayer .highlight {
+  margin: -1px;
+  padding: 1px;
+  background-color: rgba(180, 0, 170, 0.2);
+  border-radius: 4px;
+}
+.textLayer .highlight.begin {
+  border-radius: 4px 0px 0px 4px;
+}
+.textLayer .highlight.end {
+  border-radius: 0px 4px 4px 0px;
+}
+.textLayer .highlight.middle {
+  border-radius: 0px;
+}
+.textLayer .highlight.selected {
+  background-color: rgba(0, 100, 0, 0.2);
+}
+/* TODO: file FF bug to support ::-moz-selection:window-inactive
+   so we can override the opaque grey background when the window is inactive;
+   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */
+::selection {
+  background: rgba(0, 0, 255, 0.3);
+}
+::-moz-selection {
+  background: rgba(0, 0, 255, 0.3);
+}
+.annotationHighlight {
+  position: absolute;
+  border: 2px #FFFF99 solid;
+}
+.annotText > img {
+  position: absolute;
+  cursor: pointer;
+}
+.annotTextContentWrapper {
+  position: absolute;
+  width: 20em;
+}
+.annotTextContent {
+  z-index: 200;
+  float: left;
+  max-width: 20em;
+  background-color: #FFFF99;
+  box-shadow: 0px 2px 5px #333;
+  border-radius: 2px;
+  padding: 0.6em;
+  cursor: pointer;
+}
+.annotTextContent > h1 {
+  font-size: 1em;
+  border-bottom: 1px solid #000000;
+  padding-bottom: 0.2em;
+}
+.annotTextContent > p {
+  padding-top: 0.2em;
+}
+.annotLink > a {
+  position: absolute;
+  font-size: 1em;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+#errorWrapper {
+  background: none repeat scroll 0 0 #FF5555;
+  color: white;
+  left: 0;
+  position: absolute;
+  right: 0;
+  z-index: 1000;
+  padding: 3px;
+  font-size: 0.8em;
+}
+.loadingInProgress #errorWrapper {
+  top: 39px;
+}
+#errorMessageLeft {
+  float: left;
+}
+#errorMessageRight {
+  float: right;
+}
+#errorMoreInfo {
+  background-color: #FFFFFF;
+  color: black;
+  padding: 3px;
+  margin: 3px;
+  width: 98%;
+}
+#overlayContainer {
+  display: table;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.2);
+  z-index: 10000;
+}
+#overlayContainer > * {
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+#promptContainer {
+  display: table-cell;
+  vertical-align: middle;
+  text-align: center;
+}
+#promptContainer > * {
+  display: inline-block;
+}
+.prompt {
+  display: table;
+  padding: 15px;
+  border-spacing: 4px;
+  color: #d9d9d9;
+  line-height: 14px;
+  text-align: center;
+  background-color: #474747;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(82, 82, 82, 0.99), rgba(69, 69, 69, 0.95));
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+.prompt > .row {
+  display: table-row;
+}
+.prompt > .row > * {
+  display: table-cell;
+}
+.prompt .toolbarField {
+  margin: 5px 0;
+  width: 200px;
+}
+.prompt .toolbarField:hover,
+.prompt .toolbarField:focus {
+  border-color: rgba(0, 0, 0, 0.32) rgba(0, 0, 0, 0.38) rgba(0, 0, 0, 0.42);
+}
+#documentPropertiesContainer {
+  display: table-cell;
+  vertical-align: middle;
+  text-align: center;
+}
+#documentPropertiesContainer > * {
+  display: inline-block;
+  padding: 15px;
+  border-spacing: 4px;
+  max-width: 350px;
+  max-height: 350px;
+  color: #d9d9d9;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  cursor: default;
+  background-color: #474747;
+  /* fallback */
+  background-image: url('../../img/uv-pdfcenterpanel-module/texture.png'), linear-gradient(rgba(82, 82, 82, 0.99), rgba(69, 69, 69, 0.95));
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(0, 0, 0, 0.15), 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+#documentPropertiesContainer .separator {
+  display: block;
+  margin: 4px 0 4px 0;
+  height: 1px;
+  width: 100%;
+  background-color: rgba(0, 0, 0, 0.5);
+  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
+}
+#documentPropertiesContainer .row {
+  display: table-row;
+}
+#outerContainer[dir='ltr'] #documentPropertiesContainer .row > * {
+  display: table-cell;
+  min-width: 100px;
+}
+#outerContainer[dir='rtl'] #documentPropertiesContainer .row > * {
+  display: table-cell;
+  min-width: 100px;
+  text-align: right;
+}
+#documentPropertiesContainer .row span {
+  width: 125px;
+  word-wrap: break-word;
+}
+#documentPropertiesContainer .row p {
+  max-width: 225px;
+  word-wrap: break-word;
+}
+#documentPropertiesContainer .buttonRow {
+  margin-top: 10px;
+  text-align: center;
+  vertical-align: middle;
+}
+.clearBoth {
+  clear: both;
+}
+.fileInput {
+  background: white;
+  color: black;
+  margin-top: 5px;
+  visibility: hidden;
+  position: fixed;
+  right: 0;
+  top: 0;
+}
+#PDFBug {
+  background: none repeat scroll 0 0 white;
+  border: 1px solid #666666;
+  position: fixed;
+  top: 32px;
+  right: 0;
+  bottom: 0;
+  font-size: 10px;
+  padding: 0;
+  width: 300px;
+}
+#PDFBug .controls {
+  background: #EEEEEE;
+  border-bottom: 1px solid #666666;
+  padding: 3px;
+}
+#PDFBug .panels {
+  bottom: 0;
+  left: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  right: 0;
+  top: 27px;
+}
+#PDFBug button.active {
+  font-weight: bold;
+}
+.debuggerShowText {
+  background: none repeat scroll 0 0 yellow;
+  color: blue;
+  opacity: 0.3;
+}
+.debuggerHideText:hover {
+  background: none repeat scroll 0 0 yellow;
+  opacity: 0.3;
+}
+#PDFBug .stats {
+  font-family: courier;
+  font-size: 10px;
+  white-space: pre;
+}
+#PDFBug .stats .title {
+  font-weight: bold;
+}
+#PDFBug table {
+  font-size: 10px;
+}
+#viewer.textLayer-visible .textLayer > div,
+#viewer.textLayer-hover .textLayer > div:hover {
+  background-color: white;
+  color: black;
+}
+#viewer.textLayer-shadow .textLayer > div {
+  background-color: rgba(255, 255, 255, 0.6);
+  color: black;
+}
+.grab-to-pan-grab {
+  cursor: url('../../img/uv-pdfcenterpanel-module/grab.cur'), move !important;
+  cursor: -webkit-grab !important;
+  cursor: -moz-grab !important;
+  cursor: grab !important;
+}
+.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {
+  cursor: inherit !important;
+}
+.grab-to-pan-grab:active,
+.grab-to-pan-grabbing {
+  cursor: url('../../img/uv-pdfcenterpanel-module/grabbing.cur'), move !important;
+  cursor: -webkit-grabbing !important;
+  cursor: -moz-grabbing !important;
+  cursor: grabbing !important;
+  position: fixed;
+  background: transparent;
+  display: block;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  z-index: 50000;
+  /* should be higher than anything else in PDF.js! */
+}
+@page {
+  margin: 0;
+}
+#printContainer {
+  display: none;
+}
+@media screen and (min-resolution: 2dppx) {
+  /* Rules for Retina screens */
+  .toolbarButton::before {
+    -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    top: -5px;
+  }
+  .secondaryToolbarButton::before {
+    -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    top: -4px;
+  }
+  #outerContainer[dir='ltr'] .toolbarButton::before,
+  #outerContainer[dir='rtl'] .toolbarButton::before {
+    left: -1px;
+  }
+  #outerContainer[dir='ltr'] .secondaryToolbarButton::before {
+    left: -2px;
+  }
+  #outerContainer[dir='rtl'] .secondaryToolbarButton::before {
+    left: 186px;
+  }
+  .dropdownToolbarButton {
+    background: url('../../img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png') no-repeat;
+    background-size: 7px 16px;
+  }
+  #outerContainer[dir='ltr'] .toolbarButton#sidebarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton#sidebarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.findPrevious::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.findPrevious::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.findNext::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.findNext::before {
+    content: url('../../img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.pageUp::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.pageUp::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png');
+  }
+  #outerContainer[dir='ltr'] .toolbarButton.pageDown::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png');
+  }
+  #outerContainer[dir='rtl'] .toolbarButton.pageDown::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png');
+  }
+  .toolbarButton.zoomIn::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png');
+  }
+  .toolbarButton.zoomOut::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png');
+  }
+  .toolbarButton.presentationMode::before,
+  .secondaryToolbarButton.presentationMode::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png');
+  }
+  .toolbarButton.print::before,
+  .secondaryToolbarButton.print::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png');
+  }
+  .toolbarButton.openFile::before,
+  .secondaryToolbarButton.openFile::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png');
+  }
+  .toolbarButton.download::before,
+  .secondaryToolbarButton.download::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png');
+  }
+  .toolbarButton.bookmark::before,
+  .secondaryToolbarButton.bookmark::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png');
+  }
+  #viewThumbnail.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png');
+  }
+  #outerContainer[dir="ltr"] #viewOutline.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png');
+  }
+  #outerContainer[dir="rtl"] #viewOutline.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png');
+  }
+  #viewAttachments.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments@2x.png');
+  }
+  #viewFind.toolbarButton::before {
+    content: url('../../img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png');
+  }
+  .secondaryToolbarButton.firstPage::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png');
+  }
+  .secondaryToolbarButton.lastPage::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png');
+  }
+  .secondaryToolbarButton.rotateCcw::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png');
+  }
+  .secondaryToolbarButton.rotateCw::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png');
+  }
+  .secondaryToolbarButton.handTool::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png');
+  }
+  .secondaryToolbarButton.documentProperties::before {
+    content: url('../../img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png');
+  }
+}
+@media print {
+  /* General rules for printing. */
+  body {
+    background: transparent none;
+  }
+  /* Rules for browsers that don't support mozPrintCallback. */
+  #sidebarContainer,
+  #secondaryToolbar,
+  .toolbar,
+  #loadingBox,
+  #errorWrapper,
+  .textLayer {
+    display: none;
+  }
+  #viewerContainer {
+    overflow: visible;
+  }
+  #mainContainer,
+  #viewerContainer,
+  .page,
+  .page canvas {
+    position: static;
+    padding: 0;
+    margin: 0;
+  }
+  .page {
+    float: left;
+    display: none;
+    border: none;
+    box-shadow: none;
+  }
+  .page[data-loaded] {
+    display: block;
+  }
+  .fileInput {
+    display: none;
+  }
+  /* Rules for browsers that support mozPrintCallback */
+  #outerContainer[data-mozPrintCallback] #outerContainer {
+    display: none;
+  }
+  #outerContainer[data-mozPrintCallback] #printContainer {
+    display: block;
+  }
+  #printContainer canvas {
+    position: relative;
+    top: 0;
+    left: 0;
+  }
+}
+.visibleLargeView,
+.visibleMediumView,
+.visibleSmallView {
+  display: none;
+}
+@media all and (max-width: 960px) {
+  #outerContainer[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='ltr'] #outerContainer.sidebarOpen .outerCenter {
+    float: left;
+    left: 205px;
+  }
+  #outerContainer[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='rtl'] #outerContainer.sidebarOpen .outerCenter {
+    float: right;
+    right: 205px;
+  }
+}
+@media all and (max-width: 900px) {
+  .sidebarOpen .hiddenLargeView {
+    display: none;
+  }
+  .sidebarOpen .visibleLargeView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 860px) {
+  .sidebarOpen .hiddenMediumView {
+    display: none;
+  }
+  .sidebarOpen .visibleMediumView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 770px) {
+  #sidebarContainer {
+    top: 32px;
+    z-index: 100;
+  }
+  .loadingInProgress #sidebarContainer {
+    top: 39px;
+  }
+  #sidebarContent {
+    top: 32px;
+    background-color: rgba(0, 0, 0, 0.7);
+  }
+  #outerContainer[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {
+    left: 0px;
+  }
+  #outerContainer[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {
+    right: 0px;
+  }
+  #outerContainer[dir='ltr'] .outerCenter {
+    float: left;
+    left: 205px;
+  }
+  #outerContainer[dir='rtl'] .outerCenter {
+    float: right;
+    right: 205px;
+  }
+  #outerContainer .hiddenLargeView,
+  #outerContainer .hiddenMediumView {
+    display: inherit;
+  }
+  #outerContainer .visibleLargeView,
+  #outerContainer .visibleMediumView {
+    display: none;
+  }
+}
+@media all and (max-width: 700px) {
+  #outerContainer .hiddenLargeView {
+    display: none;
+  }
+  #outerContainer .visibleLargeView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 660px) {
+  #outerContainer .hiddenMediumView {
+    display: none;
+  }
+  #outerContainer .visibleMediumView {
+    display: inherit;
+  }
+}
+@media all and (max-width: 600px) {
+  .hiddenSmallView {
+    display: none;
+  }
+  .visibleSmallView {
+    display: inherit;
+  }
+  #outerContainer[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='ltr'] #outerContainer.sidebarOpen .outerCenter,
+  #outerContainer[dir='ltr'] .outerCenter {
+    left: 156px;
+  }
+  #outerContainer[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,
+  #outerContainer[dir='rtl'] #outerContainer.sidebarOpen .outerCenter,
+  #outerContainer[dir='rtl'] .outerCenter {
+    right: 156px;
+  }
+  .toolbarButtonSpacer {
+    width: 0;
+  }
+}
+@media all and (max-width: 510px) {
+  #scaleSelectContainer,
+  #pageNumberLabel {
+    display: none;
+  }
+}
+#app .centerPanel .content .container {
+  margin: 0 20px 0 20px;
+}
+#app .centerPanel .content #pdfContainer {
+  overflow: auto;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+#app .leftPanel .thumbsView .thumb .wrap {
+  border: none;
+}
+#app .leftPanel .thumbsView .thumb .wrap img {
+  display: block;
+  width: 90px;
+}
+#app .leftPanel .thumbsView .thumb.selected .wrap {
+  border: none;
+}
+#app .headerPanel .options .centerOptions {
+  width: 390px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 337px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-seadragon-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-seadragon-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..0c39ef957efcf3aec3e744778ed9e9aa1e379851
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-seadragon-extension/theme.css
@@ -0,0 +1,3173 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn.first {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/first.png');
+  background-repeat: no-repeat;
+  margin: 0 0 0 0;
+}
+#app .headerPanel a.imageBtn.first:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.prev {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/prev.png');
+  background-repeat: no-repeat;
+  margin: 0 0 0 5px;
+}
+#app .headerPanel a.imageBtn.prev:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.next {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/next.png');
+  background-repeat: no-repeat;
+  margin: 0 5px 0 0;
+}
+#app .headerPanel a.imageBtn.next:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.last {
+  background-color: #565656;
+  background-image: url('../../img/uv-pagingheaderpanel-module/last.png');
+  background-repeat: no-repeat;
+  margin: 0 0 0 0;
+}
+#app .headerPanel a.imageBtn.last:hover {
+  background-color: #343434;
+}
+#app .headerPanel a.imageBtn.go {
+  background: url('../../img/uv-pagingheaderpanel-module/go.png') no-repeat;
+  width: 28px;
+  line-height: 24px;
+}
+#app .headerPanel a.imageBtn.disabled {
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+  background-color: transparent;
+}
+#app .headerPanel a.imageBtn.disabled:hover {
+  background-color: transparent;
+}
+#app .headerPanel .centerOptions .image-selectionbox-options {
+  float: left;
+  margin: 0 0 0 0;
+}
+#app .headerPanel .centerOptions .image-selectionbox {
+  height: 30px;
+}
+#app .headerPanel .centerOptions .prevOptions {
+  float: left;
+  margin: 0 15px 0 0;
+}
+#app .headerPanel .centerOptions .mode {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .centerOptions .search {
+  float: left;
+  margin: 0 0 0 5px;
+  width: 113px;
+}
+#app .headerPanel .centerOptions .search .searchText {
+  border: none;
+  padding: 0 0 0 2px;
+}
+#app .headerPanel .centerOptions .nextOptions {
+  float: left;
+  margin: 0 0 0 15px;
+}
+#app .headerPanel .centerOptions .mode input {
+  float: left;
+}
+#app .headerPanel .centerOptions .mode label {
+  clear: none;
+  width: 30px;
+  margin: 0 0 0 0;
+  padding: 0;
+  float: left;
+  font-size: 11px;
+  line-height: 18px;
+  text-align: right;
+}
+#app .headerPanel .centerOptions .mode label.disabled {
+  color: #9a9a9a;
+}
+#app .headerPanel .centerOptions.modeOptionsDisabled {
+  width: 280px;
+}
+#app .headerPanel .centerOptions .autocompleteText {
+  width: 30px;
+  height: 19px;
+  line-height: 19px;
+  float: left;
+  font-size: 11px;
+  padding: 0;
+  margin-top: 6px;
+}
+#app .headerPanel .centerOptions .autocomplete {
+  position: absolute;
+  background: #fff;
+  width: 60px;
+  border: 2px solid #ffffff;
+  list-style-type: none;
+  -webkit-margin-before: 0px;
+  -webkit-margin-after: 0px;
+  -webkit-margin-start: 0px;
+  -webkit-margin-end: 0px;
+  -webkit-padding-start: 0px;
+  margin: 0;
+  padding: 0;
+  max-height: 150px;
+  overflow-y: auto;
+  overflow-x: hidden;
+  z-index: 1000;
+}
+#app .headerPanel .centerOptions .autocomplete .result {
+  padding: 4px;
+  width: 270px;
+  overflow: hidden;
+}
+#app .headerPanel .centerOptions .autocomplete .result.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 4px 4px;
+  height: 25px;
+}
+#app .headerPanel .centerOptions .autocomplete .result.selected {
+  background: #efefef;
+}
+#app .headerPanel .rightOptions .pagingToggleButtons {
+  float: left;
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .one-up {
+  background-image: url('../../img/uv-pagingheaderpanel-module/one_up.png');
+  background-repeat: no-repeat;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .one-up.on {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .two-up {
+  background-image: url('../../img/uv-pagingheaderpanel-module/two_up.png');
+  background-repeat: no-repeat;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+#app .headerPanel .rightOptions .pagingToggleButtons .two-up.on {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+#app .headerPanel .rightOptions .gallery {
+  background-image: url('../../img/uv-pagingheaderpanel-module/grid.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+#app .headerPanel .rightOptions .gallery.on {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+#app .headerPanel .rightOptions .localeToggle {
+  color: #fff;
+  text-decoration: none;
+  font-size: 14px;
+  float: left;
+  margin: 4px 8px 4px 4px;
+  cursor: pointer;
+}
+#app .headerPanel .rightOptions .localeToggle:link,
+#app .headerPanel .rightOptions .localeToggle:visited,
+#app .headerPanel .rightOptions .localeToggle:hover,
+#app .headerPanel .rightOptions .localeToggle:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .headerPanel .searchText {
+  width: 30px;
+  height: 19px;
+  line-height: 19px;
+  float: left;
+  font-size: 11px;
+  padding: 0;
+  margin-top: 6px;
+}
+#app .headerPanel .total {
+  float: left;
+  display: block;
+  height: 18px;
+  line-height: 18px;
+  margin: 6px 5px 0 5px;
+  width: 41px;
+  font-size: 11px;
+  overflow: hidden;
+}
+#app .centerPanel .content {
+  position: relative;
+}
+#app .centerPanel .content .displayregion {
+  border: 2px solid #fff !important;
+}
+#app .centerPanel .content #viewer {
+  margin: 0 8px 0 8px;
+}
+#app .centerPanel .content #viewer .navigator.extraMargin {
+  margin: 0 30px 0 0 !important;
+}
+#app .centerPanel .content #viewer .paging.btn {
+  position: absolute !important;
+  width: 30px;
+  height: 90px;
+  background-repeat: no-repeat;
+  background-color: #000;
+  background-position: 0px 50%;
+  cursor: pointer;
+  padding: 0px;
+  border: none;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.vertical {
+  height: 30px;
+  width: 90px;
+  background-position: 50% 0;
+}
+#app .centerPanel .content #viewer .paging.btn.prev {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/left_arrow.png');
+  left: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.prev.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/left_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow.png');
+  left: 0;
+  top: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical.down {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow.png');
+}
+#app .centerPanel .content #viewer .paging.btn.prev.vertical.down.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/right_arrow.png');
+  right: 0;
+}
+#app .centerPanel .content #viewer .paging.btn.next.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/right_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow.png');
+  left: 0;
+  top: 0;
+  margin-left: 15px;
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/down_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical.up {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow.png');
+}
+#app .centerPanel .content #viewer .paging.btn.next.vertical.up.disabled {
+  background-image: url('../../img/uv-seadragoncenterpanel-module/up_arrow_disabled.png');
+}
+#app .centerPanel .content #viewer .zoomIn {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer .zoomOut {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer .goHome {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer div[title="Rotate left"] {
+  display: none !important;
+}
+#app .centerPanel .content #viewer .rotate {
+  cursor: pointer !important;
+}
+#app .centerPanel .content #viewer div[title="Previous page"] {
+  display: none !important;
+}
+#app .centerPanel .content #viewer div[title="Next page"] {
+  display: none !important;
+}
+#app .centerPanel .content .spinner {
+  position: absolute;
+  background: rgba(0, 0, 0, 0.9);
+  width: 34px;
+  height: 34px;
+  border-radius: 34px;
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .centerPanel .content .searchOverlay {
+  background-color: #14a4c3;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+#app .centerPanel .content .searchOverlay.current {
+  border: 3px solid #fff;
+}
+#app .openseadragon-canvas {
+  outline: none;
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel .tabs {
+  height: 25px;
+  border-bottom: 1px solid #373737;
+}
+#app .leftPanel .tabs .tab {
+  color: #fff;
+  background-color: #211f1f;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+#app .leftPanel .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .leftPanel .tabs .tab.on {
+  border: 1px solid #373737;
+  border-bottom: 1px solid #211f1f;
+  color: #14a4c3;
+  margin-bottom: -1px;
+  height: 25px;
+  line-height: 25px;
+}
+#app .leftPanel .tabsContent {
+  padding: 10px 10px 10px 10px;
+}
+#app .leftPanel .tabsContent .options {
+  padding: 0 0 10px 0;
+}
+#app .leftPanel .tabsContent .options .top {
+  overflow: hidden;
+  height: auto;
+}
+#app .leftPanel .tabsContent .options .bottom {
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .left {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView {
+  padding: 5px 0 0 0;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView span {
+  display: block;
+  float: left;
+  color: #fff;
+  padding: 5px 4px 0 0;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView select {
+  float: left;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .right {
+  float: right;
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .multiSelectAll {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .btn {
+  margin-left: 10px;
+}
+#app .leftPanel .tabsContent .btn-group .btn {
+  padding: 0 5px 0 5px;
+  background: #565656;
+  color: #9a9a9a;
+  width: 55px;
+}
+#app .leftPanel .tabsContent .btn-group .btn.on {
+  background: #DDD;
+  color: #000;
+}
+#app .leftPanel .views .treeView {
+  font-weight: normal;
+  overflow: auto;
+}
+#app.browser-Explorer .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: -11px;
+}
+#app.browser-Firefox .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: 9px;
+  overflow: hidden;
+}
+#app .footerPanel .searchResults {
+  position: relative;
+  height: 60px;
+  padding: 30px 9px 0 9px;
+}
+#app .footerPanel .searchResults .line {
+  background: #565656;
+  height: 2px;
+}
+#app .footerPanel .searchResults .searchResultPlacemarker {
+  position: absolute;
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_down.png');
+  height: 24px;
+  width: 18px;
+  cursor: pointer;
+  margin: -24 0 0 -9;
+}
+#app .footerPanel .searchResults .searchResultPlacemarker.hover {
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_down_hover.png');
+}
+#app .footerPanel .searchResults .searchResultPlacemarker.current {
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_down_hover.png');
+}
+#app .footerPanel .searchResults .positionPlacemarker {
+  position: absolute;
+  background: url('../../img/uv-searchfooterpanel-module/placemarker_up.png');
+  height: 24px;
+  width: 18px;
+  margin: 2px 0 0 -9px;
+  cursor: pointer;
+}
+#app .footerPanel .searchResults .placeMarkerDetails {
+  position: absolute;
+  width: 200px;
+  z-index: 1;
+  margin: 13px 0 0 9px;
+  background: #fff;
+  cursor: pointer;
+}
+#app .footerPanel .searchResults .placeMarkerDetails h1 {
+  color: #000;
+  font-size: 11px;
+  font-weight: bold;
+  background-position: 0 1px;
+  background-repeat: no-repeat;
+  margin: 5px;
+  padding: 0 5px 5px 0;
+  text-transform: none;
+}
+#app .footerPanel .searchResults .placeMarkerDetails p {
+  font-size: 11px;
+  font-weight: bold;
+  margin: 5px 5px 5px 5px;
+  padding: 0;
+  color: #000;
+}
+#app .footerPanel .searchResults .placeMarkerDetails .top {
+  display: inline;
+}
+#app .footerPanel .searchResults .placeMarkerDetails .bottom {
+  display: inline;
+}
+#app .footerPanel .searchResults .label {
+  position: absolute;
+  color: #fff;
+  margin: 8px 15px 0 15px;
+  min-width: 160px;
+}
+#app .footerPanel .searchResults .label.left {
+  text-align: right;
+}
+#app .footerPanel .searchResults .label.right {
+  text-align: left;
+}
+#app .footerPanel .search {
+  position: relative;
+  background-color: #211f1f;
+  height: 32px;
+}
+#app .footerPanel .search .searchTextContainer {
+  background: #fff;
+  float: left;
+  width: 270px;
+  position: relative;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete {
+  position: absolute;
+  background: #fff;
+  width: 270px;
+  border: 2px solid #ffffff;
+  list-style-type: none;
+  -webkit-margin-before: 0px;
+  -webkit-margin-after: 0px;
+  -webkit-margin-start: 0px;
+  -webkit-margin-end: 0px;
+  -webkit-padding-start: 0px;
+  margin: 0;
+  padding: 0;
+  max-height: 300px;
+  overflow-y: auto;
+  overflow-x: hidden;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete .result {
+  padding: 4px;
+  width: 270px;
+  overflow: hidden;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete .result.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 4px 4px;
+  height: 25px;
+}
+#app .footerPanel .search .searchTextContainer .autocomplete .result.selected {
+  background: #efefef;
+}
+#app .footerPanel .search .searchTextContainer .searchText {
+  width: 245px;
+  margin: 1px 0 0 0;
+  font-size: 12px;
+  height: 22px;
+  line-height: 22px;
+  padding: 0;
+  float: left;
+  border: none;
+}
+#app .footerPanel .search .searchTextContainer .searchText.searching {
+  background: url('../../img/uv-searchfooterpanel-module/spinner.gif') no-repeat;
+  background-position: right 3px;
+}
+#app .footerPanel .search .searchTextContainer a.imageButton.searchButton {
+  background: url('../../img/uv-searchfooterpanel-module/search.png') no-repeat;
+  height: 18px;
+  width: 18px;
+  margin: 2px 2px 0 0;
+  float: right;
+  cursor: pointer;
+}
+#app .footerPanel .searchOptions {
+  position: absolute;
+  width: 420px;
+  margin: 4px 0 0 0;
+}
+#app .footerPanel .searchOptions .label {
+  color: #fff;
+  font-weight: bold;
+  padding: 0 10px 0 0;
+  margin: 4px 0 0 0;
+  float: left;
+}
+#app .footerPanel .searchPager {
+  position: relative;
+  background-color: #211f1f;
+  height: 32px;
+  overflow: hidden;
+}
+#app .footerPanel .searchPager .controls {
+  position: absolute;
+  margin-top: 1px;
+  width: 585px;
+}
+#app .footerPanel .searchPager .controls a.previousResult {
+  -webkit-touch-callout: none;
+  /* iOS Safari */
+  -webkit-user-select: none;
+  /* Chrome/Safari/Opera */
+  -khtml-user-select: none;
+  /* Konqueror */
+  -moz-user-select: none;
+  /* Firefox */
+  -ms-user-select: none;
+  /* Internet Explorer/Edge */
+  user-select: none;
+  /* Non-prefixed version, currently
+                                  not supported by any browser */
+  background-image: url('../../img/uv-searchfooterpanel-module/prev.png');
+  background-repeat: no-repeat;
+  height: 30px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 25px;
+  padding-right: 10px;
+  line-height: 30px;
+  float: left;
+  margin: 0 10px 0 0;
+}
+#app .footerPanel .searchPager .controls a.previousResult:link,
+#app .footerPanel .searchPager .controls a.previousResult:visited,
+#app .footerPanel .searchPager .controls a.previousResult:hover,
+#app .footerPanel .searchPager .controls a.previousResult:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .searchPager .controls a.previousResult.disabled {
+  opacity: 0.25;
+  filter: alpha(opacity=25);
+}
+#app .footerPanel .searchPager .controls a.nextResult {
+  -webkit-touch-callout: none;
+  /* iOS Safari */
+  -webkit-user-select: none;
+  /* Chrome/Safari/Opera */
+  -khtml-user-select: none;
+  /* Konqueror */
+  -moz-user-select: none;
+  /* Firefox */
+  -ms-user-select: none;
+  /* Internet Explorer/Edge */
+  user-select: none;
+  /* Non-prefixed version, currently
+                                  not supported by any browser */
+  background-image: url('../../img/uv-searchfooterpanel-module/next.png');
+  background-repeat: no-repeat;
+  height: 30px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 25px;
+  padding-left: 10px;
+  line-height: 30px;
+  float: right;
+  margin: 0 0 0 10px;
+}
+#app .footerPanel .searchPager .controls a.nextResult:link,
+#app .footerPanel .searchPager .controls a.nextResult:visited,
+#app .footerPanel .searchPager .controls a.nextResult:hover,
+#app .footerPanel .searchPager .controls a.nextResult:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .searchPager .controls a.nextResult.disabled {
+  opacity: 0.25;
+  filter: alpha(opacity=25);
+}
+#app .footerPanel .searchPager .controls a.clearSearch {
+  -webkit-touch-callout: none;
+  /* iOS Safari */
+  -webkit-user-select: none;
+  /* Chrome/Safari/Opera */
+  -khtml-user-select: none;
+  /* Konqueror */
+  -moz-user-select: none;
+  /* Firefox */
+  -ms-user-select: none;
+  /* Internet Explorer/Edge */
+  user-select: none;
+  /* Non-prefixed version, currently
+                                  not supported by any browser */
+  cursor: pointer;
+  color: #26b5cc;
+  text-decoration: none;
+  margin: 0 0 0 10px;
+  font-size: 12px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  margin: 4px 0 0 0;
+  color: #fff;
+  text-align: center;
+  font-size: 14px;
+  float: left;
+  width: 345px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo .number {
+  font-weight: bold;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo .terms {
+  font-weight: bold;
+}
+/*
+#app .footerPanel .searchOptions .autoCompleteWidget {
+    position: relative;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget input[type="text"]{
+    width: 300px;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results {
+    position: absolute;
+    left: 0;
+    top: 50px;
+    overflow-x: hidden;
+    overflow-y: auto;
+    overflow: auto;
+    max-height: 300px;
+    width: 300px;
+    background: #fff;
+    border: 1px solid;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul{
+    list-style-type: none;
+    margin: 10px;
+    padding: 0;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul li{
+    padding: 2px;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul li.selected{
+    background: lightgrey;
+}
+
+#app .footerPanel .searchOptions .autoCompleteWidget .results ul li a:hover{
+    text-decoration: none;
+}
+*/
+#app .overlays > div.multiSelect {
+  width: 480px;
+}
+#app .overlays > div.multiSelect .content {
+  height: 350px;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .header .btn-primary {
+  width: auto;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .main .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .main .thumb.selected .wrap {
+  border: 2px solid #14a4c3;
+}
+#app .overlays > div.multiSelect .content .iiif-gallery-component .main .thumb span {
+  color: #000;
+}
+#app .overlays > div.multiSelect .bottom {
+  background: none;
+}
+#app.browser-Explorer .overlays > div.multiSelect .content .iiif-gallery-component .header input[type="range"] {
+  margin-top: -11px;
+}
+#app.browser-Firefox .overlays > div.multiSelect .content .iiif-gallery-component .header input[type="range"] {
+  margin-top: 9px;
+  overflow: hidden;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .footerPanel.mobile {
+    display: block;
+    position: relative;
+    height: 50px;
+  }
+  #app .footerPanel.mobile .options {
+    position: absolute;
+    width: 315px;
+  }
+  #app .footerPanel.mobile .options .spacer {
+    float: left;
+    width: 30px;
+    height: 41px;
+  }
+  #app .footerPanel.mobile .options a {
+    margin-right: 15px;
+  }
+  #app .footerPanel.mobile .options a.zoomIn {
+    background-image: url('../../img/uv-osdmobilefooterpanel-module/zoom_in.png');
+    background-repeat: no-repeat;
+    height: 21px;
+    line-height: 21px;
+    cursor: pointer;
+    color: #fff;
+    text-decoration: none;
+    background-position: left center;
+    padding-left: 35px;
+    padding-right: 10px;
+    line-height: 22px;
+    font: 0/0 a;
+    text-shadow: none;
+    background-color: transparent;
+    border: 0;
+    line-height: 0;
+    font-size: 0;
+    color: transparent;
+    width: 27px;
+    padding: 0;
+  }
+  #app .footerPanel.mobile .options a.zoomIn:link,
+  #app .footerPanel.mobile .options a.zoomIn:visited,
+  #app .footerPanel.mobile .options a.zoomIn:hover,
+  #app .footerPanel.mobile .options a.zoomIn:active {
+    color: #fff;
+    text-decoration: none;
+  }
+  #app .footerPanel.mobile .options a.zoomOut {
+    background-image: url('../../img/uv-osdmobilefooterpanel-module/zoom_out.png');
+    background-repeat: no-repeat;
+    height: 21px;
+    line-height: 21px;
+    cursor: pointer;
+    color: #fff;
+    text-decoration: none;
+    background-position: left center;
+    padding-left: 35px;
+    padding-right: 10px;
+    line-height: 22px;
+    font: 0/0 a;
+    text-shadow: none;
+    background-color: transparent;
+    border: 0;
+    line-height: 0;
+    font-size: 0;
+    color: transparent;
+    width: 27px;
+    padding: 0;
+  }
+  #app .footerPanel.mobile .options a.zoomOut:link,
+  #app .footerPanel.mobile .options a.zoomOut:visited,
+  #app .footerPanel.mobile .options a.zoomOut:hover,
+  #app .footerPanel.mobile .options a.zoomOut:active {
+    color: #fff;
+    text-decoration: none;
+  }
+  #app .footerPanel.mobile .options a.rotate {
+    background-image: url('../../img/uv-osdmobilefooterpanel-module/rotate_right.png');
+    background-repeat: no-repeat;
+    height: 21px;
+    line-height: 21px;
+    cursor: pointer;
+    color: #fff;
+    text-decoration: none;
+    background-position: left center;
+    padding-left: 35px;
+    padding-right: 10px;
+    line-height: 22px;
+    font: 0/0 a;
+    text-shadow: none;
+    background-color: transparent;
+    border: 0;
+    line-height: 0;
+    font-size: 0;
+    color: transparent;
+    width: 27px;
+    padding: 0;
+  }
+  #app .footerPanel.mobile .options a.rotate:link,
+  #app .footerPanel.mobile .options a.rotate:visited,
+  #app .footerPanel.mobile .options a.rotate:hover,
+  #app .footerPanel.mobile .options a.rotate:active {
+    color: #fff;
+    text-decoration: none;
+  }
+  #app .footerPanel.mobile .options a.bookmark {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.open {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.feedback {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.embed {
+    display: none;
+  }
+  #app .footerPanel.mobile .options a.fullScreen {
+    display: none;
+  }
+}
+#app .headerPanel .options .centerOptions {
+  width: 390px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 337px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-virtex-extension/theme.css b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-virtex-extension/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..0daab7cd8d865bc340d0c96ef0a466f8196e9b47
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/css/uv-virtex-extension/theme.css
@@ -0,0 +1,2443 @@
+#app .overlay {
+  color: #000;
+}
+#app .overlay.share {
+  width: 280px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.share .middle .content .tabs {
+  padding: 5px 0 0 0;
+  line-height: normal;
+  font-size: 0px;
+}
+#app .overlay.share .middle .content .tabs .tab {
+  line-height: normal;
+  color: #565656;
+  font-size: 12px;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab:hover {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+  text-decoration: none;
+}
+#app .overlay.share .middle .content .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .overlay.share .middle .content .tabs .tab.on {
+  border-bottom: 1px solid #14a4c3;
+  color: #000;
+  margin-bottom: -1px;
+  font-weight: bold;
+  height: 23px;
+  line-height: 23px;
+}
+#app .overlay.share .middle .content .tabsContent {
+  padding: 10px 0 5px 0;
+  border-top: 1px solid #efefef;
+}
+#app .overlay.share .middle .content .tabsContent .header {
+  margin-bottom: 5px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareInput {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareLink {
+  display: block;
+  overflow: hidden;
+  height: 18px;
+  text-overflow: ellipsis;
+}
+#app .overlay.share .middle .content .tabsContent .shareView .shareFrame {
+  width: 240px;
+  border: none;
+  height: 30px;
+  margin-top: 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .code {
+  width: 100%;
+  background: #efefef;
+  border: 1px solid #9a9a9a;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize {
+  overflow: hidden;
+  padding-top: 10px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .size {
+  padding: 0 5px 0 0;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize .x {
+  padding: 0 5px 0 5px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize select {
+  margin-right: 5px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .tabsContent .embedView .customSize input {
+  display: inline-block;
+  width: 50px;
+  height: 21px;
+  font-size: 11px;
+}
+#app .overlay.share .middle .content .footer {
+  overflow: hidden;
+}
+#app .overlay.share .middle .content .footer a {
+  font-size: 11px;
+  display: block;
+  float: left;
+  line-height: 30px;
+}
+#app .overlay.share .middle .content .footer a.imageBtn {
+  width: 30px;
+  height: 30px;
+}
+#app .overlay.share .middle .content .footer a.iiif {
+  background-image: url('../../img/uv-shared-module/iiif.png');
+  background-repeat: no-repeat;
+  margin-right: 5px;
+}
+#app .overlay.moreInfo {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component {
+  height: 200px;
+  overflow: auto;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items {
+  padding-left: 0px;
+}
+#app .overlay.moreInfo .content .iiif-metadata-component .items .item .value {
+  color: #000;
+}
+#app .overlay.download {
+  width: 260px;
+  padding: 0 0 30px 8px;
+}
+#app .overlay.download .middle .noneAvailable {
+  padding: 10px 0 10px 0;
+}
+#app .overlay.download .middle .pagingNote {
+  padding: 10px 0 0 0;
+}
+#app .overlay.download .middle ol.options {
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group {
+  border-bottom: 1px solid #efefef;
+}
+#app .overlay.download .middle ol.options li.group.lastVisible {
+  border-bottom: none;
+}
+#app .overlay.download .middle ol.options li.group ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+#app .overlay.download .middle ol.options li.group ul li {
+  overflow: hidden;
+}
+#app .overlay.download .middle ol.options li.group ul li input {
+  float: left;
+  display: block;
+}
+#app .overlay.download .middle ol.options li.group ul li label {
+  float: left;
+  width: 190px;
+  line-height: 1.2em;
+}
+#app .overlay.download .middle ol.options li.group ul li label span.explanatory {
+  display: block;
+  font-size: 11px;
+  margin: 4px 0 4px 0;
+  color: #949494;
+}
+#app .overlay.download .middle .footer a {
+  margin-top: 5px;
+  font-size: 11px;
+  display: block;
+}
+#app .overlay.help {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.help .scroll {
+  height: 180px;
+}
+#app .overlay.help .bottom {
+  background: none;
+}
+#app .overlay.settings {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.settings .scroll {
+  height: 180px;
+}
+#app .overlay.settings .scroll .setting {
+  margin-bottom: 10px;
+}
+#app .overlay.settings .scroll .setting input {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .scroll .setting label {
+  margin: 0 5px 0 0;
+}
+#app .overlay.settings .version {
+  float: left;
+}
+#app .overlay.settings .website {
+  float: right;
+}
+#app .overlay.settings .bottom {
+  background: none;
+}
+#app .overlay.externalContent {
+  width: 470px;
+  height: 300px;
+}
+#app .overlay.externalContent .middle .content {
+  width: 470px;
+  height: 300px;
+  overflow: hidden;
+}
+#app .overlay.externalContent .middle .content iframe {
+  overflow: auto;
+  border: none;
+}
+#app .overlay.externalContent .bottom {
+  background: none;
+}
+#app .overlay.clickthrough {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.clickthrough .message {
+  height: 180px;
+}
+#app .overlay.clickthrough .message.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQACgABACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkEAAoAAgAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkEAAoAAwAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkEAAoABAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQACgAFACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQACgAGACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAAKAAcALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .overlay.clickthrough .message h1 {
+  border-bottom: none;
+  font-size: 12px;
+}
+#app .overlay.clickthrough .bottom {
+  background: none;
+}
+#app .overlay.login {
+  width: 470px;
+  height: 250px;
+}
+#app .overlay.login .message {
+  height: 180px;
+}
+#app .overlay.login .message h1 {
+  border-bottom: none !important;
+  font-size: 12px !important;
+}
+#app .overlay.login .message .warning {
+  display: block;
+  background-color: #FFB81D;
+  font-weight: bold;
+  padding: 10px 10px 10px 10px;
+  margin-bottom: 10px;
+}
+#app .overlay.login .bottom {
+  background: none;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .overlay.share {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.download {
+    padding: 0 0 45px 8px;
+  }
+  #app .overlay.moreInfo {
+    padding: 0 0 45px 8px;
+  }
+}
+#app .leftPanel .views .thumbsView {
+  overflow: auto;
+}
+#app .leftPanel .views .thumbsView .thumbs {
+  overflow: hidden;
+  width: 210px;
+  position: relative;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb {
+  cursor: pointer;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap {
+  border: 2px solid #373737;
+  padding: 2px;
+  overflow: hidden;
+  text-align: center;
+  background: none;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.loadingFailed {
+  background: url('../../img/uv-shared-module/error.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .wrap img {
+  display: block;
+  max-width: 100%;
+  max-height: 100%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.selected .wrap {
+  border: 2px solid #fff;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info {
+  overflow: hidden;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info span {
+  font-size: 11px;
+  color: #fff;
+  display: block;
+  padding: 2px 0 0 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .index {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .label {
+  float: left;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb .info .searchResults {
+  float: right;
+  width: 35px;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  color: #14a4c3;
+  padding-left: 14px;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol {
+  margin: 0 0 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .label {
+  width: 178px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.oneCol .wrap {
+  width: 208px;
+  max-height: 373px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol {
+  margin: 0 7px 7px 0;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .label {
+  width: 63px;
+}
+#app .leftPanel .views .thumbsView .thumbs .thumb.twoCol .wrap {
+  width: 98px;
+  max-height: 182px;
+}
+#app .leftPanel .views .thumbsView .thumbs .separator {
+  height: 1px;
+  clear: both;
+  border: none;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right.paged .thumb.first {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.left-to-right .thumb {
+  float: left;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb {
+  float: right;
+}
+#app .leftPanel .views .thumbsView .thumbs.right-to-left .thumb.first {
+  float: left;
+}
+#app .leftPanel .top .title {
+  text-transform: uppercase;
+}
+#app .leftPanel .tabs {
+  height: 25px;
+  border-bottom: 1px solid #373737;
+}
+#app .leftPanel .tabs .tab {
+  color: #fff;
+  background-color: #211f1f;
+  display: inline-block;
+  text-align: center;
+  line-height: 22px;
+  height: 22px;
+  overflow: hidden;
+  width: 75px;
+  margin: 0;
+  cursor: pointer;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+#app .leftPanel .tabs .tab.first {
+  margin: 0 0 0 10px;
+}
+#app .leftPanel .tabs .tab.on {
+  border: 1px solid #373737;
+  border-bottom: 1px solid #211f1f;
+  color: #14a4c3;
+  margin-bottom: -1px;
+  height: 25px;
+  line-height: 25px;
+}
+#app .leftPanel .tabsContent {
+  padding: 10px 10px 10px 10px;
+}
+#app .leftPanel .tabsContent .options {
+  padding: 0 0 10px 0;
+}
+#app .leftPanel .tabsContent .options .top {
+  overflow: hidden;
+  height: auto;
+}
+#app .leftPanel .tabsContent .options .bottom {
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .left {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView {
+  padding: 5px 0 0 0;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView span {
+  display: block;
+  float: left;
+  color: #fff;
+  padding: 5px 4px 0 0;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .left .treeView select {
+  float: left;
+  font-size: 11px;
+}
+#app .leftPanel .tabsContent .options .bottom .right {
+  float: right;
+  overflow: hidden;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .multiSelectAll {
+  float: left;
+}
+#app .leftPanel .tabsContent .options .bottom .right .multiSelect .btn {
+  margin-left: 10px;
+}
+#app .leftPanel .tabsContent .btn-group .btn {
+  padding: 0 5px 0 5px;
+  background: #565656;
+  color: #9a9a9a;
+  width: 55px;
+}
+#app .leftPanel .tabsContent .btn-group .btn.on {
+  background: #DDD;
+  color: #000;
+}
+#app .leftPanel .views .treeView {
+  font-weight: normal;
+  overflow: auto;
+}
+#app.browser-Explorer .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: -11px;
+}
+#app.browser-Firefox .leftPanel .views .galleryView .header input[type="range"] {
+  margin-top: 9px;
+  overflow: hidden;
+}
+#app .rightPanel .top .title {
+  text-transform: uppercase;
+}
+#app .rightPanel .content {
+  padding: 10px 10px 10px 10px;
+}
+#app .rightPanel .main {
+  overflow: auto;
+  color: #fff;
+}
+#app .rightPanel .main.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+#app .rightPanel .main .noData {
+  padding: 0 10px 20px 10px;
+}
+#app .rightPanel .main .groups {
+  padding: 10px 10px 20px 10px;
+}
+#app .rightPanel .main .groups .items .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+#app .rightPanel .main .groups .items .item .header {
+  font-size: 11px;
+  text-transform: uppercase;
+}
+.virtex {
+  background: #252424;
+  background: -moz-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #252424), color-stop(85%, #171717));
+  background: -webkit-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: -o-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: -ms-radial-gradient(center, ellipse cover, #252424 0%, #171717 85%);
+  background: radial-gradient(ellipse at center, #252424 0%, #171717 85%);
+}
+.virtex .viewport {
+  position: relative;
+}
+.virtex .loading {
+  position: absolute;
+  width: 150px;
+  height: 5px;
+  background-color: #171717;
+}
+.virtex .loading .bar {
+  height: 5px;
+  width: 1px;
+  background-color: #fff;
+}
+#oldie {
+  position: absolute;
+  margin-top: 0px !important;
+  margin-right: 0px !important;
+  margin-bottom: 0px !important;
+  margin-left: 0px !important;
+  font-family: sans-serif !important;
+  line-height: 18px !important;
+}
+#app .centerPanel a.imageBtn {
+  height: 28px;
+  width: 28px;
+  float: left;
+  cursor: pointer;
+}
+#app .centerPanel .content {
+  position: relative;
+}
+#app .centerPanel .content .navigation {
+  position: absolute;
+  left: 0;
+  top: 0;
+  overflow: hidden;
+  margin-left: 15px;
+}
+#app .centerPanel .content .navigation a.imageBtn.zoomIn {
+  background-image: url('../../img/uv-virtexcenterpanel-module/zoom_in.png');
+}
+#app .centerPanel .content .navigation a.imageBtn.zoomOut {
+  background-image: url('../../img/uv-virtexcenterpanel-module/zoom_out.png');
+}
+#app .centerPanel .content .virtex {
+  background: none;
+}
+*,
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+::-webkit-scrollbar {
+  width: 12px;
+  height: 12px;
+}
+::-webkit-scrollbar-track {
+  background: none;
+}
+::-webkit-scrollbar-thumb {
+  background: #565656;
+}
+html,
+body {
+  margin: 0;
+  padding: 0;
+  height: 100%;
+}
+html {
+  font-size: 12px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: sans-serif;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #fff;
+  background-color: #000;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+button,
+input,
+select[multiple],
+textarea {
+  background-image: none;
+}
+a {
+  color: #26b5cc;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  padding: 5px 5px 5px 5px;
+  line-height: 1.42857143;
+  background-color: #000;
+  border: 1px solid #565656;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 17px;
+  margin-bottom: 17px;
+  border: 0;
+  border-top: 1px solid #efefef;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0 0 0 0);
+  border: 0;
+}
+.btn {
+  display: inline-block;
+  padding: 5px 5px;
+  margin-bottom: 0;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+  color: #fff;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default {
+  color: #fff;
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  color: #fff;
+  background-color: #424242;
+  border-color: #383838;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #565656;
+  border-color: #565656;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary {
+  color: #fff;
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-secondary:hover,
+.btn-secondary:focus,
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  color: #fff;
+  background-color: #10859e;
+  border-color: #0e758b;
+}
+.btn-secondary:active,
+.btn-secondary.active,
+.open .dropdown-toggle.btn-secondary {
+  background-image: none;
+}
+.btn-secondary.disabled,
+.btn-secondary[disabled],
+fieldset[disabled] .btn-secondary,
+.btn-secondary.disabled:hover,
+.btn-secondary[disabled]:hover,
+fieldset[disabled] .btn-secondary:hover,
+.btn-secondary.disabled:focus,
+.btn-secondary[disabled]:focus,
+fieldset[disabled] .btn-secondary:focus,
+.btn-secondary.disabled:active,
+.btn-secondary[disabled]:active,
+fieldset[disabled] .btn-secondary:active,
+.btn-secondary.disabled.active,
+.btn-secondary[disabled].active,
+fieldset[disabled] .btn-secondary.active {
+  background-color: #14a4c3;
+  border-color: #14a4c3;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #f3a700;
+  border-color: #df9900;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #FFB81D;
+  border-color: #FFB81D;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #d2322d;
+  border-color: #c12e2a;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #47a447;
+  border-color: #419641;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #39b3d7;
+  border-color: #2aabd2;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.btn-link {
+  color: #26b5cc;
+  font-weight: normal;
+  cursor: pointer;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #48c8dd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #9a9a9a;
+  text-decoration: none;
+}
+.btn-lg {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-xs {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs {
+  padding: 1px 5px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+/* WebKit */
+input[type=range] {
+  -webkit-appearance: none;
+}
+input[type=range]::-webkit-slider-runnable-track {
+  width: 300px;
+  height: 5px;
+  background: #9a9a9a;
+  border: none;
+}
+input[type=range]::-webkit-slider-thumb {
+  -webkit-appearance: none;
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+  margin-top: -5px;
+}
+input[type=range]:focus {
+  outline: none;
+}
+input[type=range]:focus::-webkit-slider-runnable-track {
+  background: #9a9a9a;
+}
+/* Firefox */
+input[type=range] {
+  /* fix for FF unable to apply focus style bug  */
+  /*required for proper track sizing in FF*/
+  width: 300px;
+}
+input[type=range]::-moz-range-track {
+  width: 300px;
+  height: 5px;
+  background: #ddd;
+  border: none;
+}
+input[type=range]::-moz-range-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+/*hide the outline behind the border*/
+input[type=range]:-moz-focusring {
+  outline: 1px solid white;
+  outline-offset: -1px;
+}
+input[type=range]:focus::-moz-range-track {
+  background: #ccc;
+}
+/* IE */
+input[type=range]::-ms-track {
+  width: 300px;
+  height: 5px;
+  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+  background: transparent;
+  /*leave room for the larger thumb to overflow with a transparent border */
+  border-color: transparent;
+  border-width: 6px 0;
+  /*remove default tick marks*/
+  color: transparent;
+}
+input[type=range]::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-fill-upper {
+  background: #9a9a9a;
+}
+input[type=range]::-ms-thumb {
+  border: none;
+  height: 16px;
+  width: 16px;
+  border-radius: 50%;
+  background: #565656;
+}
+input[type=range]:focus::-ms-fill-lower {
+  background: #9a9a9a;
+}
+input[type=range]:focus::-ms-fill-upper {
+  background: #efefef;
+}
+.btn-default .caret {
+  border-top-color: #fff;
+}
+.btn-primary .caret,
+.btn-success .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret {
+  border-top-color: #fff;
+}
+.dropup .btn-default .caret {
+  border-bottom-color: #fff;
+}
+.dropup .btn-primary .caret,
+.dropup .btn-success .caret,
+.dropup .btn-warning .caret,
+.dropup .btn-danger .caret,
+.dropup .btn-info .caret {
+  border-bottom-color: #fff;
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+  outline: none;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar:before,
+.btn-toolbar:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-toolbar:after {
+  clear: both;
+}
+.btn-toolbar .btn-group {
+  float: left;
+}
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group,
+.btn-toolbar > .btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group-xs > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+  padding: 1px 5px;
+}
+.btn-group-sm > .btn {
+  padding: 5px 5px;
+  font-size: 11px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-group-lg > .btn {
+  padding: 15px 15px;
+  font-size: 14px;
+  line-height: 1.33;
+  border-radius: 6px;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after {
+  content: " ";
+  /* 1 */
+  display: table;
+  /* 2 */
+}
+.btn-group-vertical > .btn-group:after {
+  clear: both;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified .btn {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+  display: none;
+}
+#app .headerPanel {
+  color: #000;
+}
+#app .headerPanel a.imageBtn {
+  height: 30px;
+  width: 30px;
+  float: left;
+}
+#app .headerPanel.showInformation {
+  height: 80px;
+}
+#app .headerPanel .options {
+  height: 40px;
+  background-color: #211f1f;
+}
+#app .headerPanel .options .centerOptions {
+  margin: 5px 0 0 0;
+  position: absolute;
+}
+#app .headerPanel .options .rightOptions {
+  float: right;
+  margin: 5px 0 0 0;
+}
+#app .headerPanel .options .rightOptions .settings {
+  background: url('../../img/uv-shared-module/settings.png');
+  height: 30px;
+  width: 30px;
+  margin-right: 8px;
+}
+#app .headerPanel .informationBox {
+  background: #FFB81D;
+  color: #343434;
+  width: 100%;
+  position: absolute;
+  height: 40px;
+}
+#app .headerPanel .informationBox .message {
+  float: left;
+  overflow: hidden;
+  margin: 13px;
+}
+#app .headerPanel .informationBox .actions {
+  float: left;
+  margin: 6px 0 0 0;
+}
+#app .headerPanel .informationBox .actions .btn {
+  margin: 0 6px 0 0;
+}
+#app .headerPanel .informationBox .close {
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_information_box.png');
+  background-repeat: no-repeat;
+  width: 17px;
+  height: 17px;
+  background-position: 4px 4px;
+  cursor: pointer;
+  margin: 12px;
+}
+#app .leftPanel a {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .leftPanel .top .title {
+  height: 20px;
+  margin: 9px 0 0 10px;
+  float: left;
+  cursor: pointer;
+}
+#app .leftPanel .top .collapseButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app .leftPanel .top .expandFullButton {
+  float: right;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: none;
+}
+#app .leftPanel .closed {
+  width: 25px;
+  float: right;
+}
+#app .leftPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 8px 0 0px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .leftPanel .closed .title:link,
+#app .leftPanel .closed .title:visited,
+#app .leftPanel .closed .title:hover,
+#app .leftPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .leftPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 5px 0 0;
+  display: block;
+}
+#app.browser-Explorer.browser-version-8 .leftPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .rightPanel .top {
+  height: 35px;
+  position: relative;
+}
+#app .rightPanel .top .title {
+  position: absolute;
+  height: 20px;
+  margin-top: 9px;
+  cursor: pointer;
+  left: 35px;
+}
+#app .rightPanel .top .collapseButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_right.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: block;
+  left: 5px;
+}
+#app .rightPanel .top .expandFullButton {
+  position: absolute;
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin-top: 7px;
+  display: none;
+  left: 5px;
+}
+#app .rightPanel .closed {
+  width: 25px;
+}
+#app .rightPanel .closed .title {
+  color: #fff;
+  text-decoration: none;
+  white-space: nowrap;
+  display: block;
+  margin: 8px 3px 0 5px;
+  cursor: pointer;
+  text-transform: uppercase;
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+#app .rightPanel .closed .title:link,
+#app .rightPanel .closed .title:visited,
+#app .rightPanel .closed .title:hover,
+#app .rightPanel .closed .title:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .rightPanel .closed .expandButton {
+  background: url('../../img/uv-shared-module/arrows_left.png') no-repeat;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  margin: 7px 0 0 5px;
+  display: block;
+}
+#app .rightPanel .main {
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+#app.browser-Explorer.browser-version-8 .rightPanel .closed .title {
+  writing-mode: tb-lr;
+}
+#app .centerPanel .title {
+  height: 38px;
+  font-size: 20px;
+  color: #fff;
+  padding: 0 20px 0 20px;
+}
+#app .centerPanel .title span {
+  line-height: 30px;
+}
+#app .centerPanel .content .attribution {
+  background: #343434;
+  background: rgba(52, 52, 52, 0.7);
+  position: absolute;
+  width: 190px;
+  padding: 10px 10px 10px 10px;
+  margin: 10px 0 5px 15px;
+  font-size: 11px;
+}
+#app .centerPanel .content .attribution .header {
+  overflow: hidden;
+}
+#app .centerPanel .content .attribution .header .title {
+  font-size: 11px;
+  font-weight: bold;
+  height: 20px;
+  width: 150px;
+  line-height: 18px;
+  float: left;
+  padding: 0;
+  text-transform: uppercase;
+}
+#app .centerPanel .content .attribution .header .close {
+  width: 16px;
+  height: 16px;
+  margin: 2px;
+  float: right;
+  background-image: url('../../img/uv-shared-module/close_attribution.png');
+  cursor: pointer;
+}
+#app .centerPanel .content .attribution .main {
+  margin-top: 5px;
+}
+#app .centerPanel .content .attribution .main img {
+  margin-top: 5px;
+  margin-bottom: 5px;
+  max-width: 100px;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle) {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):link {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):hover {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):visited {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main a:not(.toggle):active {
+  color: #26b5cc;
+}
+#app .centerPanel .content .attribution .main .attribution-text {
+  overflow: hidden;
+}
+#app .footerPanel .searchOptions {
+  width: 425px;
+}
+#app .footerPanel .options {
+  height: 41px;
+}
+#app .footerPanel .options a {
+  float: left;
+  margin-top: 10px;
+  margin-right: 15px;
+}
+#app .footerPanel .options a.moreInfo {
+  background-image: url('../../img/uv-shared-module/moreinfo.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.moreInfo:link,
+#app .footerPanel .options a.moreInfo:visited,
+#app .footerPanel .options a.moreInfo:hover,
+#app .footerPanel .options a.moreInfo:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.open {
+  background-image: url('../../img/uv-shared-module/open.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.open:link,
+#app .footerPanel .options a.open:visited,
+#app .footerPanel .options a.open:hover,
+#app .footerPanel .options a.open:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.share {
+  background-image: url('../../img/uv-shared-module/share.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.share:link,
+#app .footerPanel .options a.share:visited,
+#app .footerPanel .options a.share:hover,
+#app .footerPanel .options a.share:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.embed {
+  background-image: url('../../img/uv-shared-module/embed.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 35px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.embed:link,
+#app .footerPanel .options a.embed:visited,
+#app .footerPanel .options a.embed:hover,
+#app .footerPanel .options a.embed:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.download {
+  background-image: url('../../img/uv-shared-module/download.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.download:link,
+#app .footerPanel .options a.download:visited,
+#app .footerPanel .options a.download:hover,
+#app .footerPanel .options a.download:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.bookmark {
+  background-image: url('../../img/uv-shared-module/bookmark.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.bookmark:link,
+#app .footerPanel .options a.bookmark:visited,
+#app .footerPanel .options a.bookmark:hover,
+#app .footerPanel .options a.bookmark:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.feedback {
+  background-image: url('../../img/uv-shared-module/feedback.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.feedback:link,
+#app .footerPanel .options a.feedback:visited,
+#app .footerPanel .options a.feedback:hover,
+#app .footerPanel .options a.feedback:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.print {
+  background-image: url('../../img/uv-shared-module/print.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: left center;
+  padding-left: 30px;
+  padding-right: 10px;
+  line-height: 22px;
+}
+#app .footerPanel .options a.print:link,
+#app .footerPanel .options a.print:visited,
+#app .footerPanel .options a.print:hover,
+#app .footerPanel .options a.print:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.fullScreen {
+  background-image: url('../../img/uv-shared-module/fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.fullScreen:link,
+#app .footerPanel .options a.fullScreen:visited,
+#app .footerPanel .options a.fullScreen:hover,
+#app .footerPanel .options a.fullScreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options a.exitFullscreen {
+  background-image: url('../../img/uv-shared-module/exit_fullscreen.png');
+  background-repeat: no-repeat;
+  height: 21px;
+  line-height: 21px;
+  cursor: pointer;
+  color: #fff;
+  text-decoration: none;
+  background-position: right center;
+  padding-right: 30px;
+  padding-left: 10px;
+  line-height: 22px;
+  min-width: 25px;
+  float: right;
+  margin-right: 0;
+}
+#app .footerPanel .options a.exitFullscreen:link,
+#app .footerPanel .options a.exitFullscreen:visited,
+#app .footerPanel .options a.exitFullscreen:hover,
+#app .footerPanel .options a.exitFullscreen:active {
+  color: #fff;
+  text-decoration: none;
+}
+#app .footerPanel .options.minimiseButtons a:first-child {
+  margin-left: 10px;
+}
+#app .footerPanel .options.minimiseButtons a.moreInfo {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.open {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.download {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.bookmark {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.feedback {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.print {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.share {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.embed {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 27px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.fullScreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.exitFullscreen {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app .footerPanel .options.minimiseButtons a.normal {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  width: 21px;
+  padding: 0;
+}
+#app.lightbox .footerPanel .options a.imageBtn.normal {
+  background: url('../../img/uv-shared-module/close_lightbox.png') no-repeat;
+}
+#app .overlays {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background: rgba(0, 0, 0, 0.5);
+  background-image: url('../../img/uv-shared-module/modal_bg.gif');
+  display: none;
+}
+#app .overlay {
+  position: absolute;
+}
+#app .overlay .top {
+  width: 100%;
+  overflow: auto;
+}
+#app .overlay .top .close {
+  font: 0/0 a;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+  line-height: 0;
+  font-size: 0;
+  color: transparent;
+  background-image: url('../../img/uv-shared-module/close.png');
+  width: 24px;
+  height: 24px;
+  float: right;
+  background-color: #14a4c3;
+}
+#app .overlay .middle {
+  width: 100%;
+  background: #fff;
+}
+#app .overlay .middle .content {
+  padding-right: 10px;
+  padding-bottom: 10px;
+  padding-left: 10px;
+  overflow: auto;
+}
+#app .overlay .middle .content .buttons {
+  padding: 10px 0 0 0;
+  float: right;
+}
+#app .overlay .middle .content .buttons .btn {
+  margin: 0 0 0 10px;
+}
+#app .overlay .middle .content h1 {
+  color: #000;
+  font-size: 18px;
+  font-weight: bold;
+  margin: 15px 0px 0px 0px;
+  padding: 0 0 10px 0;
+}
+#app .overlay .middle .content h2 {
+  color: #000;
+  font-size: 14px;
+  font-weight: bold;
+  margin: 0;
+  padding: 15px 0 10px 0;
+}
+#app .overlay .middle .content p {
+  margin: 0;
+  padding: 10px 0 10px 0;
+}
+#app .overlay .middle .content p p {
+  padding-top: 0;
+}
+#app .overlay .middle .content ol.options {
+  list-style-image: none;
+  list-style-position: inside;
+  list-style-type: none;
+  margin: 0;
+}
+#app .overlay .middle .content ol.options li {
+  margin: 2px 0 0 0;
+  padding: 4px;
+}
+#app .overlay .middle .content ol.options li input {
+  margin: 0;
+  padding: 0;
+  width: auto;
+  height: auto;
+  display: inline;
+}
+#app .overlay .middle .content ol.options li label {
+  display: inline;
+  margin: 0 0 0 5px;
+  padding: 0;
+  float: none;
+  clear: none;
+  line-height: 0.9em;
+  text-align: left;
+  width: 200px;
+}
+#app .overlay .bottom {
+  height: 11px;
+  background: url('../../img/uv-shared-module/dialogue_arrow.png') no-repeat;
+}
+#app .overlay.genericDialogue {
+  width: 250px;
+}
+#app .overlay.genericDialogue .bottom {
+  background: none;
+}
+#app .overlay.genericDialogue .message {
+  color: #000;
+  padding: 10px 0 10px 0;
+}
+#app .overlay.genericDialogue .accept {
+  float: right;
+}
+#app .overlay .scroll {
+  margin: 10px 0 0 0;
+  padding: 0 10px 0 0;
+  overflow: auto;
+}
+.iiif-gallery-component *,
+.iiif-gallery-component *:before,
+.iiif-gallery-component *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.iiif-gallery-component .header {
+  overflow: hidden;
+  height: 45px;
+}
+.iiif-gallery-component .header .left {
+  float: left;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right {
+  float: right;
+  overflow: hidden;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .multiSelectAll {
+  float: left;
+}
+.iiif-gallery-component .header .right .multiSelectOptions .select {
+  margin-left: 10px;
+}
+.iiif-gallery-component .header .btn {
+  float: left;
+  width: 30px;
+  height: 30px;
+}
+.iiif-gallery-component .header .btn.size-up {
+  margin-left: 5px;
+}
+.iiif-gallery-component .header .btn.size-down {
+  margin-right: 5px;
+}
+.iiif-gallery-component .header input[type="range"] {
+  float: left;
+  margin-top: 12px;
+  width: 100px;
+}
+.iiif-gallery-component .main {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 1000px;
+}
+.iiif-gallery-component .main .thumbs {
+  margin-right: 10px;
+  overflow: hidden;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb input {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: none;
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea input {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb.insideScrollArea .wrap.multiSelected {
+  border: 2px solid #14a4c3;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  margin: 0 7px 7px 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  border: 2px solid transparent;
+  padding: 2px;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  display: none;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  color: transparent;
+  padding: 2px 0 0 0;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  background: none;
+}
+.iiif-gallery-component .main .thumbs .thumb.selected .wrap {
+  border: 2px solid transparent;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap {
+  border: 2px solid #373737;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .wrap img {
+  display: block;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info span {
+  color: #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea .info .searchResults {
+  color: #14a4c3;
+  background: url('../../img/uv-shared-module/search_result.png') no-repeat 0px 3px;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.selected .wrap {
+  border: 2px solid #fff;
+}
+.iiif-gallery-component .main .thumbs .thumb.insideScrollArea.searchpreview .wrap {
+  border: 2px solid #26b5cc;
+}
+.iiif-gallery-component .main .thumbs .thumb {
+  float: left;
+  cursor: pointer;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap {
+  overflow: hidden;
+  text-align: center;
+  background: none;
+  position: relative;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.loading {
+  background-image: url('data:image/gif;base64,R0lGODlhFAAUAMQSAGxsbFpaWnh4eEZGRhwcHD8/PzU1NVJSUisrKwgICH5+fkxMTGNjYyUlJXJycnt7exISEoCAgAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1OTFjMzhjNS0xZmQyLTg5NGUtYjMyZi1kYTNkZWQ5NmQ5YjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzc0OEE1NDA5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Qzc0OEE1M0Y5OTMzMTFFNUFBRjI5MkI3NTFFODJFRTYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NTkxYzM4YzUtMWZkMi04OTRlLWIzMmYtZGEzZGVkOTZkOWIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5MWMzOGM1LTFmZDItODk0ZS1iMzJmLWRhM2RlZDk2ZDliMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAkAABIALAAAAAAUABQAAAVAoCSOZGmeaKqmSeu+LRpEdG0Hsq1H+DnvtZ7pB+TlikYfMjlcCktE4JMU3U1HVd1VlL2hCIiweExYmc/otHoUAgAh+QQJAAASACwAAAAAFAAUAAAFWqAkjmRpnmgqEgyhnkykHNA7GlEePUXyJg6dzoFQDYTI1gnyQCIVC1PA6YySGlSkwEcCZIWGEu6bA5gSCwW5gWJlAy+EV6io/QrN3MA2ShwUW3wkBGyChocSIQAh+QQFAAASACwAAAAAFAAUAAAFXKAkjmRpnmhaJsuimoYQKcQrNkCkR8wLBbsgApUYKIJBR8LUcCCfBRPh+Aw+IKZDFXkwQR7bHc1UCO96q1yYUTMhtg6DioFUDJaq6S6AtUkWEQANfiMJcoSIiSUhADs=');
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap.hidden {
+  background: url('../../img/uv-shared-module/hidden_thumb.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap img {
+  max-width: 100%;
+  max-height: 100%;
+}
+.iiif-gallery-component .main .thumbs .thumb .wrap input {
+  position: absolute;
+  cursor: pointer;
+  top: 0px;
+  left: 0px;
+}
+.iiif-gallery-component .main .thumbs .thumb .info {
+  overflow: hidden;
+}
+.iiif-gallery-component .main .thumbs .thumb .info span {
+  font-size: 11px;
+  display: block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .index,
+.iiif-gallery-component .main .thumbs .thumb .info .label {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs .thumb .info .searchResults {
+  display: none;
+  float: right;
+  width: 32px;
+  padding-left: 14px;
+}
+.iiif-gallery-component .main .thumbs .thumb.placeholder .wrap {
+  background: url('../../img/uv-shared-module/unavailable.png') no-repeat 50% 50%;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected {
+  background: #14a4c3;
+}
+.iiif-gallery-component .main .thumbs.multiSelect .thumb .wrap.multiSelected .thumbImage {
+  opacity: 0.35;
+  filter: alpha(opacity=35);
+}
+.iiif-gallery-component .main .thumbs.left-to-right .thumb {
+  float: left;
+}
+.iiif-gallery-component .main .thumbs.right-to-left .thumb {
+  float: right;
+}
+.iiif-tree-component {
+  overflow: auto;
+  color: #fff;
+}
+.iiif-tree-component .toggle {
+  cursor: pointer;
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+  background-image: url('../../img/uv-shared-module/plus.png');
+}
+.iiif-tree-component .toggle.expanded {
+  background-image: url('../../img/uv-shared-module/minus.png');
+}
+.iiif-tree-component .toggle.multiSelect {
+  margin-left: 5px;
+}
+.iiif-tree-component .spacer {
+  margin-top: 3px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 10px;
+  width: 10px;
+}
+.iiif-tree-component input.multiSelect {
+  margin-top: 0px;
+  margin-right: 5px;
+  display: block;
+  float: left;
+  height: 13px;
+  width: 13px;
+}
+.iiif-tree-component ul.tree,
+.iiif-tree-component ul.tree ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.iiif-tree-component ul.tree ul {
+  margin-left: 15px;
+}
+.iiif-tree-component ul.tree li {
+  margin: 0;
+  padding: 2px 0 2px 0;
+  overflow: hidden;
+}
+.iiif-tree-component ul.tree li a {
+  display: block;
+  overflow: hidden;
+}
+.iiif-tree-component ul li a.selected {
+  color: #14a4c3 !important;
+}
+.iiif-metadata-component .groups .group .header {
+  font-weight: bold;
+}
+.iiif-metadata-component .groups .group .items .header {
+  color: #14a4c3;
+  border-bottom: 1px solid #14a4c3;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.iiif-metadata-component .groups .group .items .item .label {
+  color: #9a9a9a;
+  border-bottom: 1px solid #343434;
+  margin: 15px 10px 0 0;
+}
+.iiif-metadata-component .groups .group .items .item .label .copyText {
+  position: relative;
+  float: right;
+  display: none;
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  background-image: url('../../img/uv-shared-module/copy.png');
+}
+.iiif-metadata-component .groups .group .items .item .label .copiedText {
+  display: none;
+  position: absolute;
+  top: 18px;
+  right: -10px;
+  white-space: nowrap;
+  padding: 4px;
+  text-transform: none;
+  background-color: #343434;
+  z-index: 1;
+  border: 1px solid #9a9a9a;
+  border-radius: 2px;
+  color: #fff;
+}
+.iiif-metadata-component .groups .group .items .item .value {
+  color: #fff;
+  margin: 5px 10px 0 0;
+  overflow: hidden;
+  word-wrap: break-word;
+  line-height: 1.6em;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle {
+  color: #14a4c3;
+  font-weight: normal;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle:hover {
+  color: #22c5e8;
+}
+.iiif-metadata-component .groups .group .items .item .value a.toggle.more,
+.iiif-metadata-component .groups .group .items .item .value a.toggle.less {
+  font-variant: small-caps;
+}
+.iiif-metadata-component .groups .group .items .item .value img {
+  max-width: 100px;
+}
+.iiif-metadata-component .groups .group .items .item a.value {
+  display: block;
+  color: #26b5cc;
+}
+@media only screen and (min-width: 0px) and (max-width: 640px) {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+}
+#app {
+  background-color: #000;
+  position: relative;
+}
+#app .btn-default,
+#app .btn-primary,
+#app .btn-success,
+#app .btn-info,
+#app .btn-warning,
+#app .btn-danger {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+}
+#app .imageBtn {
+  cursor: pointer;
+}
+#app .action,
+#app a.action.black,
+#app input.action {
+  display: inline-block;
+  background: url('../../img/uv-shared-module/sprite.png') 0 -1000px no-repeat;
+  text-transform: none;
+  padding: 0 0 0 16px;
+  font-weight: bold;
+}
+#app #commsFrame {
+  width: 1px;
+  height: 1px;
+  border: none;
+}
+#app .headerPanel {
+  position: relative;
+  color: #fff;
+  height: 40px;
+}
+#app .mainPanel {
+  position: relative;
+  margin-top: 8px;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .leftPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .centerPanel {
+  position: absolute;
+}
+#app .rightPanel {
+  position: absolute;
+  background: #211f1f;
+  border: none;
+}
+#app .footerPanel {
+  position: relative;
+  margin-top: 0;
+  margin-right: 8px;
+  margin-bottom: 0px;
+  margin-left: 8px;
+}
+#app .footerPanel.mobile {
+  display: none;
+}
+@media print {
+  #app .headerPanel {
+    display: none;
+  }
+  #app .leftPanel {
+    display: none;
+  }
+  #app .rightPanel {
+    display: none;
+  }
+  #app .footerPanel {
+    display: none;
+  }
+  #app .mobileFooter {
+    display: none;
+  }
+}
+#app .headerPanel .options .centerOptions {
+  width: 390px;
+}
+#app .footerPanel .searchPager .controls .searchResultsInfo {
+  width: 337px;
+}
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/hamburger.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/hamburger.png
new file mode 100644
index 0000000000000000000000000000000000000000..5adabfc94863824b11616cd8d2cc7460140fc70b
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/hamburger.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-contentleftpanel-module/padlock.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-contentleftpanel-module/padlock.png
new file mode 100644
index 0000000000000000000000000000000000000000..42565c975d5819561bead967b34056a25bba3018
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-contentleftpanel-module/padlock.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-contentleftpanel-module/thumb_placeholder.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-contentleftpanel-module/thumb_placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..bacbc63c2f9e55b05148254295e1b12cda6d3125
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-contentleftpanel-module/thumb_placeholder.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/bigplay.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/bigplay.png
new file mode 100644
index 0000000000000000000000000000000000000000..694553e31c387188b6bde397a5200c212aff2dc5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/bigplay.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0ee90397b7401cc96f8544959855ac0dd69479c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome-bg.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome.png
new file mode 100644
index 0000000000000000000000000000000000000000..51dffb149211a97f914a093b3abbf5008ff955d9
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/controls-wellcome.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/loading.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/loading.gif
new file mode 100644
index 0000000000000000000000000000000000000000..612222be5e474c36c345042dd6f697fa1d16a6a0
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-mediaelementcenterpanel-module/loading.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-moreinforightpanel-module/copy.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-moreinforightpanel-module/copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e64490c4917f23ef4aba481a6f6661220268fa0
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-moreinforightpanel-module/copy.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/rotate_right.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/rotate_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcc50496d7e6bbbfcc4d6d426db70cec26ad0eea
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/rotate_right.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_in.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_in.png
new file mode 100644
index 0000000000000000000000000000000000000000..da5b7bd0ebebe46da09e5ae2fafea7eaaf37977a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_in.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_out.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_out.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc575c665beea1860ab7bac6ad6c54046ebe5600
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-osdmobilefooterpanel-module/zoom_out.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/first.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/first.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f0123a7655a11d2a112c1189c41cdf0a9a6f8d2
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/first.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/grid.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/grid.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c3d1026fea0f156d6580a98f08b0833d26a423d
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/grid.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/last.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/last.png
new file mode 100644
index 0000000000000000000000000000000000000000..be3b4952bdff32d3cc18594ba3128c5b9832ec13
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/last.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/next.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3de98023eaf24b13ad9e9ed56ef4d8cf3198309
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/next.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/one_up.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/one_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ca2f5a5909ed6db18462a5b861f1177f6535f65
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/one_up.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/prev.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..e70d135bcab57b10949230840291eca4e49f2f60
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/prev.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/settings.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7a02c6dfa64f4d2a0aece91d7bee0a0a26f5682
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/settings.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/two_up.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/two_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d8ac00607e87c07034199960351db235bb192ed
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pagingheaderpanel-module/two_up.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-check.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-check.svg
new file mode 100644
index 0000000000000000000000000000000000000000..71cd16df576f158da70e8007c946cf25ad25e397
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-check.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <path
+     d="M 1.5006714,23.536225 6.8925879,18.994244 14.585721,26.037937 34.019683,4.5410479 38.499329,9.2235032 14.585721,35.458952 z"
+     id="path4"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.25402856;stroke-opacity:1" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-comment.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-comment.svg
new file mode 100644
index 0000000000000000000000000000000000000000..86f1f17249f0a2e49e54a6610fa928c91815c2d7
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-comment.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   height="40"
+   width="40"
+   viewBox="0 0 40 40">
+  <rect
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915" />
+  <path
+     d="m 20.677967,8.54499 c -7.342801,0 -13.295293,4.954293 -13.295293,11.065751 0,2.088793 0.3647173,3.484376 1.575539,5.150563 L 6.0267418,31.45501 13.560595,29.011117 c 2.221262,1.387962 4.125932,1.665377 7.117372,1.665377 7.3428,0 13.295291,-4.954295 13.295291,-11.065753 0,-6.111458 -5.952491,-11.065751 -13.295291,-11.065751 z"
+     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93031836;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-help.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-help.svg
new file mode 100644
index 0000000000000000000000000000000000000000..00938fefe048b07fede7186d235179fe6ac2482c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-help.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <g
+     transform="translate(0,-60)"
+     id="layer1">
+    <rect
+       width="36.460953"
+       height="34.805603"
+       x="1.7695236"
+       y="62.597198"
+       style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.30826771;stroke-opacity:1" />
+    <g
+       transform="matrix(0.88763677,0,0,0.88763677,2.2472646,8.9890584)">
+      <path
+         d="M 20,64.526342 C 11.454135,64.526342 4.5263421,71.454135 4.5263421,80 4.5263421,88.545865 11.454135,95.473658 20,95.473658 28.545865,95.473658 35.473658,88.545865 35.473658,80 35.473658,71.454135 28.545865,64.526342 20,64.526342 z m -0.408738,9.488564 c 3.527079,0 6.393832,2.84061 6.393832,6.335441 0,3.494831 -2.866753,6.335441 -6.393832,6.335441 -3.527079,0 -6.393832,-2.84061 -6.393832,-6.335441 0,-3.494831 2.866753,-6.335441 6.393832,-6.335441 z"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.02768445;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         d="m 7.2335209,71.819938 4.9702591,4.161823 c -1.679956,2.581606 -1.443939,6.069592 0.159325,8.677725 l -5.1263071,3.424463 c 0.67516,1.231452 3.0166401,3.547686 4.2331971,4.194757 l 3.907728,-4.567277 c 2.541952,1.45975 5.730694,1.392161 8.438683,-0.12614 l 3.469517,6.108336 c 1.129779,-0.44367 4.742234,-3.449633 5.416358,-5.003859 l -5.46204,-4.415541 c 1.44319,-2.424098 1.651175,-5.267515 0.557303,-7.748623 l 5.903195,-3.833951 C 33.14257,71.704996 30.616217,69.018606 29.02952,67.99296 l -4.118813,4.981678 C 22.411934,71.205099 18.900853,70.937534 16.041319,72.32916 l -3.595408,-5.322091 c -1.345962,0.579488 -4.1293881,2.921233 -5.2123901,4.812869 z m 8.1010311,3.426672 c 2.75284,-2.446266 6.769149,-2.144694 9.048998,0.420874 2.279848,2.56557 2.113919,6.596919 -0.638924,9.043185 -2.752841,2.446267 -6.775754,2.13726 -9.055604,-0.428308 -2.279851,-2.565568 -2.107313,-6.589485 0.64553,-9.035751 z"
+         style="fill:#000000;fill-opacity:1;stroke:none" />
+    </g>
+  </g>
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-insert.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-insert.svg
new file mode 100644
index 0000000000000000000000000000000000000000..519ef6826e56b178cbad9d91adf0b7a870696602
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-insert.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,1.4044602 57.432701,62.632577 6.5672991,62.627924 z"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:1.00493038;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-key.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-key.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8d09d5378d5be7d1350e08c3ece3d87e2e711a96
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-key.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 25.470843,9.4933766 C 25.30219,12.141818 30.139101,14.445969 34.704831,13.529144 40.62635,12.541995 41.398833,7.3856498 35.97505,5.777863 31.400921,4.1549155 25.157674,6.5445892 25.470843,9.4933766 z M 4.5246282,17.652051 C 4.068249,11.832873 9.2742983,5.9270407 18.437379,3.0977088 29.751911,-0.87185184 45.495663,1.4008022 53.603953,7.1104009 c 9.275765,6.1889221 7.158128,16.2079421 -3.171076,21.5939521 -1.784316,1.635815 -6.380222,1.21421 -7.068351,3.186186 -1.04003,0.972427 -1.288046,2.050158 -1.232864,3.168203 1.015111,2.000108 -3.831548,1.633216 -3.270553,3.759574 0.589477,5.264544 -0.179276,10.53738 -0.362842,15.806257 -0.492006,2.184998 1.163456,4.574232 -0.734888,6.610642 -2.482919,2.325184 -7.30604,2.189143 -9.193497,-0.274767 -2.733688,-1.740626 -8.254447,-3.615254 -6.104247,-6.339626 3.468112,-1.708686 -2.116197,-3.449897 0.431242,-5.080274 5.058402,-1.39256 -2.393215,-2.304318 -0.146889,-4.334645 3.069198,-0.977415 2.056986,-2.518352 -0.219121,-3.540397 1.876567,-1.807151 1.484149,-4.868919 -2.565455,-5.942205 0.150866,-1.805474 2.905737,-4.136876 -1.679967,-5.20493 C 10.260902,27.882167 4.6872697,22.95045 4.5245945,17.652051 z"
+     id="path604"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.72665179;stroke-opacity:1" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-newparagraph.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-newparagraph.svg
new file mode 100644
index 0000000000000000000000000000000000000000..38d2497da9112076d3e88876d03aedbb1437a1a2
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-newparagraph.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,10.913072 57.432701,53.086929 6.567299,53.083723 z"
+     id="path2985"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:0.83403099;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-noicon.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-noicon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c07d1080832bebea22ad1cf45fe3bac16ca90642
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-noicon.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-note.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-note.svg
new file mode 100644
index 0000000000000000000000000000000000000000..70173651c7e2a3d53492f234e7444c9d775b3b2c
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-note.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="36.075428"
+     height="31.096582"
+     x="1.962286"
+     y="4.4517088"
+     id="rect4"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.23004246;stroke-opacity:1" />
+  <rect
+     width="27.96859"
+     height="1.5012145"
+     x="6.0157046"
+     y="10.285"
+     id="rect6"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157056"
+     y="23.21689"
+     id="rect8"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="5.8130345"
+     y="28.964394"
+     id="rect10"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157046"
+     y="17.426493"
+     id="rect12"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-paragraph.svg b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-paragraph.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6ae5212b75d6855aa2cf7964de2b27650a6a2b80
--- /dev/null
+++ b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/annotation-paragraph.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  <path
+     d="m 17.692678,34.50206 0,-16.182224 c -1.930515,-0.103225 -3.455824,-0.730383 -4.57593,-1.881473 -1.12011,-1.151067 -1.680164,-2.619596 -1.680164,-4.405591 0,-1.992435 0.621995,-3.5796849 1.865988,-4.7617553 1.243989,-1.1820288 3.06352,-1.7730536 5.458598,-1.7730764 l 9.802246,0 0,2.6789711 -2.229895,0 0,26.3251486 -2.632515,0 0,-26.3251486 -3.45324,0 0,26.3251486 z"
+     style="font-size:29.42051125px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07795751;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+</svg>
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..bef02743fc108697e14e0e5daab8181f7ef91dd8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next.png
new file mode 100644
index 0000000000000000000000000000000000000000..de1d0fc901c2d2369660026bd466d4c3f0a62eba
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0250307c0d10b0c0a38a8381361ec265ef3080c8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-next@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..de1d0fc901c2d2369660026bd466d4c3f0a62eba
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0250307c0d10b0c0a38a8381361ec265ef3080c8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous.png
new file mode 100644
index 0000000000000000000000000000000000000000..bef02743fc108697e14e0e5daab8181f7ef91dd8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/findbarButton-previous@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/grab.cur b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/grab.cur
new file mode 100644
index 0000000000000000000000000000000000000000..db7ad5aed3ef958aa13903afa769386382a87ad3
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/grab.cur differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/grabbing.cur b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/grabbing.cur
new file mode 100644
index 0000000000000000000000000000000000000000..e0dfd04e4d3fcbaa6588c8cbb9e9065609bcb862
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/grabbing.cur differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/loading-icon.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/loading-icon.gif
new file mode 100644
index 0000000000000000000000000000000000000000..1c72ebb554be018511ae972c3f2361dff02dce02
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/loading-icon.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/loading-small.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/loading-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..51848a70fe3928e0e22f65be8a70a593211c4a22
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/loading-small.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png
new file mode 100644
index 0000000000000000000000000000000000000000..40925e25ace9954a0e3092c1cd19a02eca82fd07
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..adb240eaad3c4cd7329cccd7af188e6472302a00
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-documentProperties@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png
new file mode 100644
index 0000000000000000000000000000000000000000..e68846aa5f609f48e89b25692abdd85c2de7ecb9
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ad8af5173850f4b645f9c94f4efe3379564b128
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-firstPage@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb85a841b18be0235fc6c6714223609e1097d1f4
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c13f77ff003460753a39d9e406c0020231cabda
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-handTool@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png
new file mode 100644
index 0000000000000000000000000000000000000000..be763e0c4a02cab5d7842c8999faade8c47059bf
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..8570984f2d9952ebb8543a6c8bbca2408be3fe90
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-lastPage@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png
new file mode 100644
index 0000000000000000000000000000000000000000..675d6da2c09cebd7e2375d94cbc43de49a28a6e8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9e74312270af04fa2b9b033675d8674faab64e6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCcw@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1c7598886bd49e194764015577b766aadd82288
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb257b41c537552a19f711ced5ec19cad5fc1c9f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/secondaryToolbarButton-rotateCw@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/shadow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/shadow.png
new file mode 100644
index 0000000000000000000000000000000000000000..31d3bdb14f1d67953d18dc04e73db834aaa200f2
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/shadow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/texture.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/texture.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb5ccb5ec3cdf7f20c344483958a2684e11e6df5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/texture.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..a187be6c9ba78003d9d2013e4cdc1c7f73bb8949
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4efbaa6758dce6ea82f9e03e81c0196cd806b266
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-bookmark@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download.png
new file mode 100644
index 0000000000000000000000000000000000000000..eaab35f09e12fed1a285ca765b38846f84ebbb91
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..896face455a605a86196bce9ad3b7d640468dd17
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-download@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png
new file mode 100644
index 0000000000000000000000000000000000000000..306eb43b86861ffd83ab17541d64a4e8d240c86a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7570bc0d30db3dafe54aa7c1fe92367690f5046
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-menuArrows@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5cf1bd06139d17c90cb6ab492221803f5047543
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..91ab76593eadd6280b2a554d8d3eb1430d7ef6ba
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-openFile@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..1957f79ab95a970cc93eaeadec532661c5a1ae55
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..16ebcb8ef1e923710574bb914e19526f2545abdb
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png
new file mode 100644
index 0000000000000000000000000000000000000000..8219ecf83c6bcf74acc8d0cf5935347a7937edb5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..758c01d8364c5597d7e9ead825cf4e7754c8d929
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageDown@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..98e7ce481c163c0d4221be87d262096c631f800e
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a01b02380b90e5ab32727ac5460eca3108a8f1e5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb9daa337656a75091ea00d4c5600ba4f557d834
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a5cfd755b0b400bc6b7790c0fd41e7aa70d8aa1c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-pageUp@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ac21244dff26830f46ec462f2dab36e1a18938c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cada9e7918da28bdf84af38c354dbf1e1c6fe31a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-presentationMode@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print.png
new file mode 100644
index 0000000000000000000000000000000000000000..51275e54bee695c76a455579262ad642efe7220c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..53d18daf7825ae12d99406068073d16ab682737e
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-print@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9b75579b1e058baada95941a4a7ff0c80edb5cb
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..456b133248fd5310857db3e2b174730f6488371b
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-search@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..8437095273c46e84b404dcdc1157240cfdd1b454
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d9bfa4f63d6a8ae5cbaafa2efadd2c16b48a3d8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f90f83da745ff2470745ecf1c0c276b7179b088
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b066fe5cb0ef03ceee653393df468690f382abdf
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-secondaryToolbarToggle@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f85ec061ea167b1718d2865cfc1e53370f11b7a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..291e006797fc7f0e84d297e952630c719fe6eeab
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png
new file mode 100644
index 0000000000000000000000000000000000000000..025dc9040e5073bfd18da3464566163456f72534
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f834df94000475b8edda3b062279b17277db9d8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-sidebarToggle@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcd0b268a475662d421e9144764a09d20faf4155
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewAttachments.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaa9430211e168a593f7e3bb486b3cac2be6556b
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3410f70dfa653e77cd7e6b9e2c69cb2e2869c7ef
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline-rtl@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png
new file mode 100644
index 0000000000000000000000000000000000000000..976365a50612903b56e307401195ad1159e91b3f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6a197fdf33da57ada4fec17e042708b1586fb29
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewOutline@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png
new file mode 100644
index 0000000000000000000000000000000000000000..584ba55881f9a192ddea645d6d8525bab205e289
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb7db9383669cf734685ca7422bbab1032f486fd
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-viewThumbnail@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png
new file mode 100644
index 0000000000000000000000000000000000000000..513d081bc2d2f3eb64801a5e8cde86ef4455829c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5d49d5ff107f01daa307bd0f89f98efc31eeec7
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomIn@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png
new file mode 100644
index 0000000000000000000000000000000000000000..156c26b941c12a13130e7a7c181d13300a85de89
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..959e1919d5a7a83a9c319de4d65ddaf6dc6c2763
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-pdfcenterpanel-module/toolbarButton-zoomOut@2x.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..4929fc767e1e11e26b921794dd1a282d319832f6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..351c44db9e4c5b05c8e9d48146905cbe1d41785c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/down_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/home.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/home.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1a07f89e2935b138fd883802c39cf5ddde3de74
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/home.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e0abf91bc86d94289ef4db411c80b18f23961a5
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..6734c847635965674930318b18b14638e6b43c8f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/left_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/pixel.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/pixel.gif
new file mode 100644
index 0000000000000000000000000000000000000000..9a4dbb4f0c821f79383053ea56c121a6c8ba1ce7
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/pixel.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..72e1dabb25e63afcbbbdfa41e6e09e7e48a4eebd
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2550de8b978a438813883d7c9935634abe40321
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/right_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/rotate_right.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/rotate_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcc50496d7e6bbbfcc4d6d426db70cec26ad0eea
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/rotate_right.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..634642273a509f1cf7ac7f19bb783cd8bbd4f212
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow_disabled.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow_disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c12f3037d1c0ad8e2dcb7135d2fa5d630bf9edf
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/up_arrow_disabled.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/zoom_in.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/zoom_in.png
new file mode 100644
index 0000000000000000000000000000000000000000..da5b7bd0ebebe46da09e5ae2fafea7eaaf37977a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/zoom_in.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/zoom_out.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/zoom_out.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc575c665beea1860ab7bac6ad6c54046ebe5600
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-seadragoncenterpanel-module/zoom_out.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/next.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3de98023eaf24b13ad9e9ed56ef4d8cf3198309
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/next.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_down.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..53497471bc5e7a43de2fb259f93a53adb40c06e6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_down.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_down_hover.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_down_hover.png
new file mode 100644
index 0000000000000000000000000000000000000000..4609c8672391b4b01526df69666f5931a57921f8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_down_hover.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_up.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..e518a82c3ab855e96bc43e529fea3d0a53632638
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/placemarker_up.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/prev.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..e70d135bcab57b10949230840291eca4e49f2f60
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/prev.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/search.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/search.png
new file mode 100644
index 0000000000000000000000000000000000000000..6494c2a46949bc7d6cb771a03857993680af2280
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/search.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/spinner.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/spinner.gif
new file mode 100644
index 0000000000000000000000000000000000000000..148005da279b97c0acc697d48a815645977dc723
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-searchfooterpanel-module/spinner.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/arrows_left.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/arrows_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..de3d0a7501dcc4cc9cc6853691a7593fe9c86514
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/arrows_left.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/arrows_right.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/arrows_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d6423a40ec7124da3a442f2deab8bc91dcfbd8c
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/arrows_right.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/bookmark.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/bookmark.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab1ada4ea0e39274c7d3d2df7f39546a6b7e1e82
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/bookmark.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close.png
new file mode 100644
index 0000000000000000000000000000000000000000..192c5b4174e23e17594e4344ebea854163a10769
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_attribution.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_attribution.png
new file mode 100644
index 0000000000000000000000000000000000000000..63d3b6aaca4b4d0cc1eb19f9e86d9912f5e84c4d
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_attribution.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_information_box.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_information_box.png
new file mode 100644
index 0000000000000000000000000000000000000000..624c69403b1af08ed1c877e56664de9d4e5dd0ad
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_information_box.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_message_box.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_message_box.png
new file mode 100644
index 0000000000000000000000000000000000000000..624c69403b1af08ed1c877e56664de9d4e5dd0ad
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/close_message_box.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/copy.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e64490c4917f23ef4aba481a6f6661220268fa0
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/copy.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/dialogue_arrow.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/dialogue_arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..63f4d420cc9c0934cb77de5e770c604d59fad09b
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/dialogue_arrow.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/download.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/download.png
new file mode 100644
index 0000000000000000000000000000000000000000..427949cce3d86032a32c9e4859fa5106ab06f38f
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/download.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/embed.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/embed.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eee1b8dab10de034fffbd298d1e2fb784104cb8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/embed.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/error.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/error.png
new file mode 100644
index 0000000000000000000000000000000000000000..b34622dc30abdd592adcb15be41fd70b23822de3
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/error.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/exit_fullscreen.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/exit_fullscreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ac59bea3a80eb42a0eb41dff27a129a8144c9dc
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/exit_fullscreen.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/feedback.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/feedback.png
new file mode 100644
index 0000000000000000000000000000000000000000..820b6b00d5b8cf0cb190eeba086ab79ba22cf7d6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/feedback.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/fullscreen.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/fullscreen.png
new file mode 100644
index 0000000000000000000000000000000000000000..a93a7fa75ecf8a870f63f65b0dfffd292ba00056
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/fullscreen.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/hidden_thumb.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/hidden_thumb.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f85f82c9301f39f36d8034643d616b7d57ef421
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/hidden_thumb.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/iiif.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/iiif.png
new file mode 100644
index 0000000000000000000000000000000000000000..78d17919024dc1dbbdcf02f7fa19055faec3dcf6
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/iiif.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/minus.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/minus.png
new file mode 100644
index 0000000000000000000000000000000000000000..bacbc63c2f9e55b05148254295e1b12cda6d3125
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/minus.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/modal_bg.gif b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/modal_bg.gif
new file mode 100644
index 0000000000000000000000000000000000000000..dfa72f9e5b0fc69771a008408ed04e6074894846
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/modal_bg.gif differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/moreinfo.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/moreinfo.png
new file mode 100644
index 0000000000000000000000000000000000000000..49f402d38d078c24d882dfa02330e6dfb5fec258
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/moreinfo.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/open.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/open.png
new file mode 100644
index 0000000000000000000000000000000000000000..a94f321e621f3efe14944fed3c18c3693c5efc4d
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/open.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/plus.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/plus.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ac754c5355708d4a5c2d67b202a6f4da2cc3882
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/plus.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/print.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/print.png
new file mode 100644
index 0000000000000000000000000000000000000000..cca841fb4afb6e0cbb1d72d87c764efc7d1b9928
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/print.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/search_result.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/search_result.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0fa494bf237c5efc74b71a822a0b43f5e2a8d1a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/search_result.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/settings.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..7949b5383a602198029463fd219258228c25d0ae
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/settings.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/share.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/share.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee982988b96c222cb002926649d0f006a2bfa1a8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/share.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/sprite.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/sprite.png
new file mode 100644
index 0000000000000000000000000000000000000000..53f3df4891a4ae318932eacf77745907e4059c22
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/sprite.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/unavailable.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/unavailable.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4ff2963a578d20c823a3cc35f9439c40cd6eef8
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-shared-module/unavailable.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-virtexcenterpanel-module/zoom_in.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-virtexcenterpanel-module/zoom_in.png
new file mode 100644
index 0000000000000000000000000000000000000000..da5b7bd0ebebe46da09e5ae2fafea7eaaf37977a
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-virtexcenterpanel-module/zoom_in.png differ
diff --git a/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-virtexcenterpanel-module/zoom_out.png b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-virtexcenterpanel-module/zoom_out.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc575c665beea1860ab7bac6ad6c54046ebe5600
Binary files /dev/null and b/public/opac/js/universalviewer-2.0.2/themes/uv-en-GB-theme/img/uv-virtexcenterpanel-module/zoom_out.png differ