diff --git a/.hgignore b/.hgignore index 19916357f47..619012cedad 100644 --- a/.hgignore +++ b/.hgignore @@ -81,3 +81,15 @@ GPATH # Git clone directory for updating web-platform-tests ^testing/web-platform/sync/ + +# Loop web client build/deploy dependencies +^browser/components/loop/standalone/bower_components + +# Loop legal content build/deploy artifacts + +# XXX Once a grunt contrib-clean command has been added (bug 1066491), or +# once legal has centralized their ToS and PP hosting infrastructure, +# (expected Q4 2014) the legal doc build stuff for Loop can be removed, +# including the following three lines +^browser/components/loop/standalone/content/legal/styles/.*\.css$ +^browser/components/loop/standalone/content/legal/terms/en_US\.html$ diff --git a/addon-sdk/source/test/addons/page-mod-debugger-post/main.js b/addon-sdk/source/test/addons/page-mod-debugger-post/main.js index d250697bae8..fc276fc09da 100644 --- a/addon-sdk/source/test/addons/page-mod-debugger-post/main.js +++ b/addon-sdk/source/test/addons/page-mod-debugger-post/main.js @@ -132,7 +132,4 @@ function closeConnection() { return deferred.promise; } -// bug 1042976 - temporary test disable -module.exports = {}; - require('sdk/test/runner').runTestsFromModule(module); diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index d4802edda4a..fe61d8e2688 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -292,7 +292,7 @@ pref("browser.slowStartup.maxSamples", 5); // This url, if changed, MUST continue to point to an https url. Pulling arbitrary content to inject into // this page over http opens us up to a man-in-the-middle attack that we'd rather not face. If you are a downstream // repackager of this code using an alternate snippet url, please keep your users safe -pref("browser.aboutHomeSnippets.updateUrl", "https://snippets.mozilla.com/%STARTPAGE_VERSION%/%NAME%/%VERSION%/%APPBUILDID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/"); +pref("browser.aboutHomeSnippets.updateUrl", "https://snippets.cdn.mozilla.net/%STARTPAGE_VERSION%/%NAME%/%VERSION%/%APPBUILDID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/"); pref("browser.enable_automatic_image_resizing", true); pref("browser.chrome.site_icons", true); @@ -1598,7 +1598,7 @@ pref("loop.throttled", false); pref("loop.enabled", true); pref("loop.throttled", true); pref("loop.soft_start_ticket_number", -1); -pref("loop.soft_start_hostname", "soft-start.loop-dev.stage.mozaws.net"); +pref("loop.soft_start_hostname", "soft-start.loop.services.mozilla.com"); #endif pref("loop.server", "https://loop.services.mozilla.com"); diff --git a/browser/base/content/browser-gestureSupport.js b/browser/base/content/browser-gestureSupport.js index 2b700dfd4c4..780bb69e4e2 100644 --- a/browser/base/content/browser-gestureSupport.js +++ b/browser/base/content/browser-gestureSupport.js @@ -189,12 +189,12 @@ let gGestureSupport = { let isVerticalSwipe = false; if (aEvent.direction == aEvent.DIRECTION_UP) { - if (content.pageYOffset > 0) { + if (gMultiProcessBrowser || content.pageYOffset > 0) { return false; } isVerticalSwipe = true; } else if (aEvent.direction == aEvent.DIRECTION_DOWN) { - if (content.pageYOffset < content.scrollMaxY) { + if (gMultiProcessBrowser || content.pageYOffset < content.scrollMaxY) { return false; } isVerticalSwipe = true; diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css index ffe38a0798d..540b0cbe8d8 100644 --- a/browser/base/content/browser.css +++ b/browser/base/content/browser.css @@ -393,7 +393,8 @@ panel[noactions] > richlistbox > richlistitem[type~="action"] > .ac-url-box > .a visibility: visible; } -#urlbar:not([actiontype]) > #urlbar-display-box { +#urlbar:not([actiontype]) > #urlbar-display-box, +#urlbar:not([actiontype="switchtab"]) > #urlbar-display-box > .urlbar-display-switchtab { display: none; } diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul index 7498528cb06..fc884adce6d 100644 --- a/browser/base/content/browser.xul +++ b/browser/base/content/browser.xul @@ -756,7 +756,7 @@ - @@ -910,13 +934,13 @@ var where = whereToOpenLink(aEvent, false, true); searchBar.doSearch(search, where); } - ]]> - - - + ]]> + + + - - + + 0 @@ -1677,10 +1701,12 @@ sizetopopup="none"> diff --git a/browser/components/loop/build-jsx b/browser/components/loop/build-jsx index 86324a08fce..941daad00d7 100755 --- a/browser/components/loop/build-jsx +++ b/browser/components/loop/build-jsx @@ -1,11 +1,25 @@ #! /usr/bin/env python import os +import re from distutils import spawn import subprocess from threading import Thread import argparse +def find_react_version(lib_dir): + "Finds the React library version number currently used." + for filename in os.listdir(lib_dir): + match = re.match(r"react-(.*)-prod\.js", filename) + if (match and match.group(1)): + return match.group(1) + print 'Unable to find the current react version used in content.' + print 'Please checked the %s directory.' % lib_dir + exit(1) + +SHARED_LIBS_DIR=os.path.join(os.path.dirname(__file__), "content", "shared", "libs") +REACT_VERSION=find_react_version(SHARED_LIBS_DIR) + src_files = [] # files to be compiled # search for react-tools install @@ -15,6 +29,17 @@ if jsx_path is None: print 'Please do $ npm install -g react-tools' exit(1) +p = subprocess.Popen([jsx_path, '-V'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) +for line in iter(p.stdout.readline, b''): + info = line.rstrip() + +if not info == REACT_VERSION: + print 'You have the wrong version of react-tools installed' + print 'Please use version %s' % REACT_VERSION + exit(1) + # parse the CLI arguments description = 'Loop build tool for JSX files. ' + \ 'Will scan entire loop directory and compile them in place. ' + \ diff --git a/browser/components/loop/content/js/conversation.js b/browser/components/loop/content/js/conversation.js index e181ec7231d..a1e5b0d9a59 100644 --- a/browser/components/loop/content/js/conversation.js +++ b/browser/components/loop/content/js/conversation.js @@ -284,6 +284,8 @@ loop.conversation = (function(OT, mozL10n) { this._handleSessionError(); return; }.bind(this)); + + this._websocket.on("progress", this._handleWebSocketProgress, this); }, /** @@ -298,6 +300,40 @@ loop.conversation = (function(OT, mozL10n) { } }, + /** + * Used to receive websocket progress and to determine how to handle + * it if appropraite. + * If we add more cases here, then we should refactor this function. + * + * @param {Object} progressData The progress data from the websocket. + * @param {String} previousState The previous state from the websocket. + */ + _handleWebSocketProgress: function(progressData, previousState) { + // We only care about the terminated state at the moment. + if (progressData.state !== "terminated") + return; + + if (progressData.reason === "cancel") { + this._abortIncomingCall(); + return; + } + + if (progressData.reason === "timeout" && + (previousState === "init" || previousState === "alerting")) { + this._abortIncomingCall(); + } + }, + + /** + * Silently aborts an incoming call - stops the alerting, and + * closes the websocket. + */ + _abortIncomingCall: function() { + navigator.mozLoop.stopAlerting(); + this._websocket.close(); + window.close(); + }, + /** * Accepts an incoming call. */ diff --git a/browser/components/loop/content/js/conversation.jsx b/browser/components/loop/content/js/conversation.jsx index 23ff1f3966c..4144ce824ea 100644 --- a/browser/components/loop/content/js/conversation.jsx +++ b/browser/components/loop/content/js/conversation.jsx @@ -284,6 +284,8 @@ loop.conversation = (function(OT, mozL10n) { this._handleSessionError(); return; }.bind(this)); + + this._websocket.on("progress", this._handleWebSocketProgress, this); }, /** @@ -298,6 +300,40 @@ loop.conversation = (function(OT, mozL10n) { } }, + /** + * Used to receive websocket progress and to determine how to handle + * it if appropraite. + * If we add more cases here, then we should refactor this function. + * + * @param {Object} progressData The progress data from the websocket. + * @param {String} previousState The previous state from the websocket. + */ + _handleWebSocketProgress: function(progressData, previousState) { + // We only care about the terminated state at the moment. + if (progressData.state !== "terminated") + return; + + if (progressData.reason === "cancel") { + this._abortIncomingCall(); + return; + } + + if (progressData.reason === "timeout" && + (previousState === "init" || previousState === "alerting")) { + this._abortIncomingCall(); + } + }, + + /** + * Silently aborts an incoming call - stops the alerting, and + * closes the websocket. + */ + _abortIncomingCall: function() { + navigator.mozLoop.stopAlerting(); + this._websocket.close(); + window.close(); + }, + /** * Accepts an incoming call. */ diff --git a/browser/components/loop/content/shared/js/websocket.js b/browser/components/loop/content/shared/js/websocket.js index d9c1435f0e1..82d8b03b05e 100644 --- a/browser/components/loop/content/shared/js/websocket.js +++ b/browser/components/loop/content/shared/js/websocket.js @@ -36,6 +36,8 @@ loop.CallConnectionWebSocket = (function() { throw new Error("No websocketToken in options"); } + this._lastServerState = "init"; + // Set loop.debug.sdk to true in the browser, or standalone: // localStorage.setItem("debug.websocket", true); this._debugWebSocket = @@ -78,6 +80,16 @@ loop.CallConnectionWebSocket = (function() { return promise; }, + /** + * Closes the websocket. This shouldn't be the normal action as the server + * will normally close the socket. Only in bad error cases, or where we need + * to close the socket just before closing the window (to avoid an error) + * should we call this. + */ + close: function() { + this.socket.close(); + }, + _clearConnectionFlags: function() { clearTimeout(this.connectDetails.timeout); delete this.connectDetails; @@ -210,6 +222,7 @@ loop.CallConnectionWebSocket = (function() { this._log("WS Receiving", event.data); + var previousState = this._lastServerState; this._lastServerState = msg.state; switch(msg.messageType) { @@ -218,7 +231,7 @@ loop.CallConnectionWebSocket = (function() { break; case "progress": this.trigger("progress:" + msg.state); - this.trigger("progress", msg); + this.trigger("progress", msg, previousState); break; } }, diff --git a/browser/components/loop/standalone/.gitignore b/browser/components/loop/standalone/.gitignore index a7605a5125a..eebe546eca5 100644 --- a/browser/components/loop/standalone/.gitignore +++ b/browser/components/loop/standalone/.gitignore @@ -1,5 +1,14 @@ .module-cache node_modules +bower_components *.pyc content/config.js content/VERSION.txt + +# XXX Once a grunt contrib-clean command has been added (bug 1066491), or +# once legal has centralized their ToS and PP hosting infrastructure, +# (expected Q4 2014) the legal doc build stuff for Loop can be removed, +# including the following three lines: +content/legal/styles/*.css +content/legal/terms/*.html +content/legal/terms/!index.html diff --git a/browser/components/loop/standalone/Gruntfile.js b/browser/components/loop/standalone/Gruntfile.js new file mode 100644 index 00000000000..ae7321d031d --- /dev/null +++ b/browser/components/loop/standalone/Gruntfile.js @@ -0,0 +1,21 @@ +#!/usr/bin/env node + +/* 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/. */ + +module.exports = function (grunt) { + 'use strict'; + + // show elapsed time at the end + require('time-grunt')(grunt); + + // load all grunt tasks + require('load-grunt-tasks')(grunt, {scope: 'devDependencies'}); + + grunt.initConfig({ + }); + + grunt.loadTasks('grunttasks'); +} +; diff --git a/browser/components/loop/standalone/Makefile b/browser/components/loop/standalone/Makefile index eab59b2ae34..7b8f2d84c2d 100644 --- a/browser/components/loop/standalone/Makefile +++ b/browser/components/loop/standalone/Makefile @@ -2,15 +2,31 @@ # 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/. +# Note that this Makefile is not invoked by the Mozilla build +# system, which is why it can have dependencies on things the +# build system at-large doesn't yet support. + +# XXX In the interest of making the build logic simpler and +# more maintainable, we should be trying to implement new +# functionality in Gruntfile.js rather than here. +# Bug 1066176 tracks moving all functionality currently here +# to the Gruntfile and getting rid of this Makefile entirely. + LOOP_SERVER_URL := $(shell echo $${LOOP_SERVER_URL-http://localhost:5000}) NODE_LOCAL_BIN=./node_modules/.bin -install: +install: npm_install tos + +npm_install: @npm install test: @echo "Not implemented yet." +tos: + @$(NODE_LOCAL_BIN)/grunt replace marked + @$(NODE_LOCAL_BIN)/grunt sass + lint: @$(NODE_LOCAL_BIN)/jshint *.js content test diff --git a/browser/components/loop/standalone/README.md b/browser/components/loop/standalone/README.md index ca4b1756e14..3766fe025cc 100644 --- a/browser/components/loop/standalone/README.md +++ b/browser/components/loop/standalone/README.md @@ -9,8 +9,13 @@ NodeJS and npm installed. Installation ------------ +Fetch and install/build any NPM and bower dependencies, as well as the +localized Terms-of-Service content: + $ make install +Some of the above is driven by Gruntfile.js. + Configuration ------------- diff --git a/browser/components/loop/standalone/bower.json b/browser/components/loop/standalone/bower.json new file mode 100644 index 00000000000..9a34ea77848 --- /dev/null +++ b/browser/components/loop/standalone/bower.json @@ -0,0 +1,7 @@ +{ + "name": "loop-client", + "dependencies": { + "tos-pp": "https://github.com/mozilla/legal-docs.git" + }, + "devDependencies": {} +} diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.eot b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.eot new file mode 100644 index 00000000000..04284b6f8b3 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.eot differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.svg b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.svg new file mode 100644 index 00000000000..6ed7ff2f491 --- /dev/null +++ b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.svg @@ -0,0 +1,28060 @@ + + + + +1.0 +Clear Sans +Monotype Imaging Inc. + +Fonts.com WebFonts +http://webfonts.fonts.com +Home of the Web fonts + + +http://webfonts.fonts.com/Legal + +Font software Copyright © 2012 Intel Corporation. Licensed under the Apache License, Version 2.0. http://www.apache.org/licenses/LICENSE-2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz AÁÀÂÄÅÃÆ CÇ DÐ EÉÈÊË I Í Ì Î Ï NÑ +OÓÒÔÖÕØŒ SŠ UÚÙÛÜ YÝŸ ZŽ Þ aáàâäåãæ cç dð eéèêë i ı í ì î ï nñ oóòôöõøœ sšß uúùûü yýÿ zž +þ 1234567890 ½ ¼ ¾ % ‰ $¢£¥ƒ€¤ † ‡ § ¶ # ^~µ +×± < = > ÷¬ !¡?¿ " & ' * ° . , : ; () [ \ ] {} / | +¦ _ ‚ „ … ‹› «» ‘ ’ “ ” • ­ - – — @ © ® ™ ªº ¹²³ ´ ` ˆ ˜ ¨ ¯ · ¸ + diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.ttf b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.ttf new file mode 100644 index 00000000000..dd15aa1aba3 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.ttf differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.woff b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.woff new file mode 100644 index 00000000000..f4aacf79dac Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/clearsans-regular.woff differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.eot b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.eot new file mode 100755 index 00000000000..b0d272fd2d6 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.eot differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.otf b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.otf new file mode 100755 index 00000000000..7282b576179 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.otf differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.svg b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.svg new file mode 100755 index 00000000000..37f5067db5e --- /dev/null +++ b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.svg @@ -0,0 +1,9762 @@ + + + + +Created by FontForge 20090914 at Tue Jul 23 15:34:56 2013 + By www-data +Digitized data copyright (c) 2012-2013, The Mozilla Corporation and Telefonica S.A. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.ttf b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.ttf new file mode 100755 index 00000000000..9dc6a161e84 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.ttf differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.woff b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.woff new file mode 100755 index 00000000000..e6232a8bcf8 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-light.woff differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.eot b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.eot new file mode 100755 index 00000000000..dd3123364c2 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.eot differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.otf b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.otf new file mode 100755 index 00000000000..c5d81f8e208 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.otf differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.svg b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.svg new file mode 100755 index 00000000000..397a7821338 --- /dev/null +++ b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.svg @@ -0,0 +1,9818 @@ + + + + +Created by FontForge 20090914 at Tue Jul 23 15:34:15 2013 + By www-data +Digitized data copyright (c) 2012-2013, The Mozilla Corporation and Telefonica S.A. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.ttf b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.ttf new file mode 100755 index 00000000000..93561ae5a2c Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.ttf differ diff --git a/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.woff b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.woff new file mode 100755 index 00000000000..4a142e45fad Binary files /dev/null and b/browser/components/loop/standalone/content/legal/fonts/latin/firasans-regular.woff differ diff --git a/browser/components/loop/standalone/content/legal/images/firefox.png b/browser/components/loop/standalone/content/legal/images/firefox.png new file mode 100644 index 00000000000..3f4d8d12ad4 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/images/firefox.png differ diff --git a/browser/components/loop/standalone/content/legal/images/mozilla.png b/browser/components/loop/standalone/content/legal/images/mozilla.png new file mode 100644 index 00000000000..f2c348d1356 Binary files /dev/null and b/browser/components/loop/standalone/content/legal/images/mozilla.png differ diff --git a/browser/components/loop/standalone/content/legal/js/loader.js b/browser/components/loop/standalone/content/legal/js/loader.js new file mode 100644 index 00000000000..284331cf295 --- /dev/null +++ b/browser/components/loop/standalone/content/legal/js/loader.js @@ -0,0 +1,33 @@ +/* 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/. */ + +// Set the current translation content +function setBody(data) { + $("#legal-copy").html(data); +} + +function normalizeLocale(lang) { + return lang.replace(/-/g, "_"); +} + +$(document).ready(function() { + // Get the favorite language + var lang, defaultLang = "en-US"; + $.get(loop.config.serverUrl, function(data) { + if (data.hasOwnProperty("i18n")) { + lang = normalizeLocale(data.i18n.lang); + defaultLang = normalizeLocale(data.i18n.defaultLang); + } + if (lang === undefined) { + lang = normalizeLocale(defaultLang); + } + + $.get(lang + ".html") + .done(setBody) + .fail(function() { + $.get(defaultLang + ".html") + .done(setBody); + }); + }); +}); diff --git a/browser/components/loop/standalone/content/legal/styles/main.scss b/browser/components/loop/standalone/content/legal/styles/main.scss new file mode 100644 index 00000000000..6403f5be61d --- /dev/null +++ b/browser/components/loop/standalone/content/legal/styles/main.scss @@ -0,0 +1,235 @@ +@font-face { font-family: 'Clear Sans'; font-style: normal; font-weight: 400; src: local(Clear Sans), local(ClearSans), url(/legal/fonts/latin/clearsans-regular.eot?#iefix) format(embedded-opentype), url(/legal/fonts/latin/clearsans-regular.woff) format(woff), url(/legal/fonts/latin/clearsans-regular.ttf) format(truetype), url(/legal/fonts/latin/clearsans-regular.svg#clearsans-regular) format(svg); } + +@font-face { font-family: 'Fira Sans'; font-style: normal; font-weight: 400; src: local(Fira Sans), local(FiraSans-Regular), url(/legal/fonts/latin/firasans-regular.eot?#iefix) format(embedded-opentype), url(/legal/fonts/latin/firasans-regular.woff) format(woff), url(/legal/fonts/latin/firasans-regular.ttf) format(truetype), url(/legal/fonts/latin/firasans-regular.svg#firasans-regular) format(svg); } + +@font-face { font-family: 'Fira Sans'; font-style: normal; font-weight: 300; src: local(Fira Sans Light), local(FiraSans-Light), url(/legal/fonts/latin/firasans-light.eot?#iefix) format(embedded-opentype), url(/legal/fonts/latin/firasans-light.woff) format(woff), url(/legal/fonts/latin/firasans-light.ttf) format(truetype), url(/legal/fonts/latin/firasans-light.svg#firasans-light) format(svg); } + +@media (min-width: 321px) and (max-width: 480px) { + #about-mozilla { + display: none; + } + + #main-content { + -webkit-box-shadow: rgb(138, 155, 168) 0px 1px 5px; + border-radius: 2px 2px; + box-shadow: rgb(138, 155, 168) 0px 1px 5px; + margin-top: 0px; + max-width: 360px; + min-height: 300px; + min-width: 300px; + padding-bottom: 10px; + padding-left: 20px; + padding-right: 20px; + padding-top: 45px; + position: relative; + top: -28px; + width: 94%; + } + + .static { + -webkit-background-size: 48px 51px; + background-position-x: 50%; + background-position-y: 0%; + background-repeat: no-repeat; + background-size: 48px 51px; + height: 51px; + margin-top: 10px; + top: 0px; + width: 100%; + } + + body { + padding-bottom: 20px; + } + + h1 { + font-size: 20px; + margin-bottom: 20px; + } + + html { + background-color: rgb(242, 242, 242); + } + +} + +@media (min-width: 481px) { + #main-content { + -webkit-box-shadow: rgb(138, 155, 168) 0px 1px 5px; + border-radius: 4px 4px; + box-shadow: rgb(138, 155, 168) 0px 1px 5px; + margin-top: -5px; + min-height: 450px; + padding-bottom: 40px; + padding-left: 40px; + padding-right: 40px; + padding-top: 60px; + width: 420px; + } + + .static { + -webkit-background-size: 80px 85px; + background-size: 80px 85px; + height: 85px; + margin-top: 0px; + top: 40px; + width: 80px; + } + + body { + padding-bottom: 20px; + } + + h1 { + font-size: 24px; + margin-bottom: 32px; + } + + html { + background-color: rgb(242, 242, 242); + } + +} + +@media (max-width: 319px) { + #about-mozilla { + display: none; + } + + #main-content { + -webkit-box-shadow: none; + background-position-x: 0px; + background-position-y: 0px; + border-radius: 2px 2px; + box-shadow: none; + margin-top: 10px; + max-width: 360px; + min-height: 0px; + min-width: 250px; + padding: 0px; + position: relative; + top: 0px; + width: 250px; + } + + .static { + -webkit-background-size: 48px 51px; + background-position-x: 50%; + background-position-y: 0%; + background-repeat: no-repeat; + background-size: 48px 51px; + display: none; + height: 51px; + margin-top: 10px; + top: 0px; + width: 100%; + } + + body { + margin: 0px; + padding: 0px; + } + + h1 { + font-size: 18px; + margin-bottom: 10px; + } + + html { + background-color: rgb(255, 255, 255); + } + +} + +#about-mozilla { + -webkit-background-size: 69px 19px; + -webkit-transition-duration: 150ms; + -webkit-transition-property: opacity; + background-image: url(/legal/images/mozilla.png); + background-size: 69px 19px; + height: 19px; + opacity: 0.5; + position: absolute; + right: 12px; + top: 12px; + width: 69px; +} + +#main-content { + background-color: rgb(255, 255, 255); + margin-bottom: 0px; + margin-left: auto; + margin-right: auto; + text-align: center; +} + +* { + box-sizing: border-box; +} + +.static { + background-image: url(/legal/images/firefox.png); + margin-bottom: 0px; + margin-left: auto; + margin-right: auto; + opacity: 1; + background-size: 102px 96px; + height: 102px; + width: 96px; + position: relative; + position: relative; + z-index: 999; +} + +a { + color: rgb(0, 149, 221); + cursor: pointer; +} + +article { + text-align: left; +} + +body { + color: rgb(66, 79, 89); + font-family: 'Clear Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 14px; +} + +h1, h2 { + font-family: 'Fira Sans', Helvetica, Arial, sans-serif; + font-weight: 200; + line-height: 1em; + margin-left: 0px; + margin-right: 0px; + margin-top: 0px; +} + +h3 { + font-family: 'Fira Sans', Helvetica, Arial, sans-serif; + font-size: 12px; + line-height: 1em; + margin: 0px; + padding-bottom: 10px; + padding-left: 0px; + padding-right: 0px; + padding-top: 5px; +} + +html { + height: 100%; +} + +ol { + margin-left: 0px; + padding-left: 20px; +} + +p { + font-size: 14px; +} + +ul { + margin-left: 0px; + padding-left: 20px; +} diff --git a/browser/components/loop/standalone/content/legal/terms/index.html b/browser/components/loop/standalone/content/legal/terms/index.html new file mode 100644 index 00000000000..b908acfa7b8 --- /dev/null +++ b/browser/components/loop/standalone/content/legal/terms/index.html @@ -0,0 +1,41 @@ + + + + + + + + + + WebRTC: Terms of Service + + + + + + + +
+
+ + + +
+ + +
+
+
+ + + + + + diff --git a/browser/components/loop/standalone/grunttasks/marked.js b/browser/components/loop/standalone/grunttasks/marked.js new file mode 100644 index 00000000000..727ca1e6b5d --- /dev/null +++ b/browser/components/loop/standalone/grunttasks/marked.js @@ -0,0 +1,36 @@ +/* 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/. */ + +var path = require('path'); +var i18n = require('i18n-abide'); + +module.exports = function (grunt) { + 'use strict'; + + // convert localized TOS agreement from markdown to html partials. + + function rename(destPath, srcFile) { + // Normalize the filenames to use the locale name. + var lang = srcFile.replace('.md', ''); + return path.join(destPath, i18n.localeFrom(lang) + '.html'); + } + + grunt.config('marked', { + options: { + sanitize: false, + gfm: true + }, + tos: { + files: [ + { + expand: true, + cwd: '<%= project_vars.tos_md_src %>', + src: ['**/*.md'], + dest: '<%= project_vars.tos_html_dest %>', + rename: rename + } + ] + } + }); +}; diff --git a/browser/components/loop/standalone/grunttasks/project_vars.js b/browser/components/loop/standalone/grunttasks/project_vars.js new file mode 100644 index 00000000000..b9a7c00c129 --- /dev/null +++ b/browser/components/loop/standalone/grunttasks/project_vars.js @@ -0,0 +1,18 @@ +/* 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/. */ + +module.exports = function (grunt) { + 'use strict'; + + var TEMPLATE_ROOT = 'content/legal'; + var TOS_PP_REPO_ROOT = 'bower_components/tos-pp'; + + grunt.config('project_vars', { + app: "content", + // Translated TOS/PP agreements. + tos_pp_repo_dest: TOS_PP_REPO_ROOT, + tos_md_src: TOS_PP_REPO_ROOT + '/WebRTC_ToS/', + tos_html_dest: TEMPLATE_ROOT + '/terms' + }); +}; diff --git a/browser/components/loop/standalone/grunttasks/replace.js b/browser/components/loop/standalone/grunttasks/replace.js new file mode 100644 index 00000000000..4d426204bcd --- /dev/null +++ b/browser/components/loop/standalone/grunttasks/replace.js @@ -0,0 +1,37 @@ +/* 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/. */ + +module.exports = function (grunt) { + 'use strict'; + + grunt.config('replace', { + tos: { + src: [ + '<%= project_vars.tos_md_src %>/*.md' + ], + overwrite: true, + replacements: [{ + // remove tags not handle by the markdown-to-HTML conversation + from: /{:\s.*?\s}/g, + to: '' + }, { + // remove unhandled comments + from: /^#\s.*?\n$/m, + to: '' + }, { + // fix "smart quotes" + from: /(“|”)/g, + to: """ + }, { + // fix "smart quotes" + from: /’/g, + to: "'" + }, { + from: /–/g, + to: "—" + } + ] + } + }); +}; diff --git a/browser/components/loop/standalone/grunttasks/sass.js b/browser/components/loop/standalone/grunttasks/sass.js new file mode 100644 index 00000000000..1d8b61ba488 --- /dev/null +++ b/browser/components/loop/standalone/grunttasks/sass.js @@ -0,0 +1,16 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +module.exports = function (grunt) { + 'use strict'; + + grunt.config('sass', { + styles: { + files: { + '<%= project_vars.app %>/legal/styles/main.css': + '<%= project_vars.app %>/legal/styles/main.scss' + } + } + }); +}; diff --git a/browser/components/loop/standalone/package.json b/browser/components/loop/standalone/package.json index 364ffab9549..dd461a05dad 100644 --- a/browser/components/loop/standalone/package.json +++ b/browser/components/loop/standalone/package.json @@ -1,19 +1,33 @@ { - "name": "Loop-client", - "description": "Video conferencing app powered by WebRTC.", + "name": "loop-client", + "description": "Video conferencing app powered by WebRTC", "version": "0.0.1", + "repository": { + "type": "git", + "url": "git@github.com:mozilla/loop-client.git" + }, "engines": { "node": "0.10.x", - "npm":"1.3.x" - }, - "dependencies": { - "express": "3.x" + "npm": "1.3.x" }, + "dependencies": {}, "devDependencies": { - "jshint": "2.x" + "bower": "1.3.9", + "express": "3.x", + "grunt": "0.4.5", + "grunt-cli": "0.1.13", + "grunt-marked": "0.1.1", + "grunt-sass": "0.14.1", + "grunt-text-replace": "0.3.12", + "i18n-abide": "0.0.22", + "jshint": "2.x", + "load-grunt-tasks": "0.6.0", + "time-grunt": "0.4.0" }, "scripts": { "test": "make test", - "start": "make runserver" - } + "start": "make runserver", + "prepublish": "bower install --config.interactive=false -s" + }, + "license": "MPL-2.0" } diff --git a/browser/components/loop/standalone/server.js b/browser/components/loop/standalone/server.js index d37fe4f9bd9..ba8fdfb93dc 100644 --- a/browser/components/loop/standalone/server.js +++ b/browser/components/loop/standalone/server.js @@ -8,20 +8,29 @@ var app = express(); var port = process.env.PORT || 3000; var loopServerPort = process.env.LOOP_SERVER_PORT || 5000; -app.get('/content/config.js', function (req, res) { +function getConfigFile(req, res) { "use strict"; res.set('Content-Type', 'text/javascript'); res.send( "var loop = loop || {};" + "loop.config = loop.config || {};" + - "loop.config.serverUrl = 'http://localhost:" + loopServerPort + "';" + "loop.config.serverUrl = 'http://localhost:" + loopServerPort + "';" + + "loop.config.pendingCallTimeout = 20000;" ); +} -}); +app.get('/content/config.js', getConfigFile); // This lets /test/ be mapped to the right place for running tests app.use('/', express.static(__dirname + '/../')); + +// Magic so that the legal content works both in the standalone server +// and as static content in the loop-client repo +app.use('/', express.static(__dirname + '/content/')); +app.use('/shared', express.static(__dirname + '/../content/shared/')); +app.get('/config.js', getConfigFile); + // This lets /content/ be mapped right for the static contents. app.use('/', express.static(__dirname + '/')); // This lets standalone components load images into the UI showcase diff --git a/browser/components/loop/test/desktop-local/conversation_test.js b/browser/components/loop/test/desktop-local/conversation_test.js index a0b3b6b95da..ea4270be4c0 100644 --- a/browser/components/loop/test/desktop-local/conversation_test.js +++ b/browser/components/loop/test/desktop-local/conversation_test.js @@ -223,7 +223,8 @@ describe("loop.conversation", function() { resolve(); }); return promise; - } + }, + on: sinon.spy() }); }); @@ -268,7 +269,8 @@ describe("loop.conversation", function() { reject(); }); return promise; - } + }, + on: sinon.spy() }); }); @@ -285,6 +287,102 @@ describe("loop.conversation", function() { }); }); }); + + describe("Events", function() { + describe("Call cancelled or timed out before acceptance", function() { + var promise; + + beforeEach(function() { + sandbox.stub(loop.CallConnectionWebSocket.prototype, "promiseConnect", function() { + promise = new Promise(function(resolve, reject) { + resolve(); + }); + return promise; + }); + sandbox.stub(loop.CallConnectionWebSocket.prototype, "close"); + sandbox.stub(navigator.mozLoop, "stopAlerting"); + sandbox.stub(window, "close"); + + router._setupWebSocketAndCallView(); + }); + + describe("progress - terminated - cancel", function() { + it("should stop alerting", function(done) { + promise.then(function() { + router._websocket.trigger("progress", { + state: "terminated", + reason: "cancel" + }); + + sinon.assert.calledOnce(navigator.mozLoop.stopAlerting); + done(); + }); + }); + + it("should close the websocket", function(done) { + promise.then(function() { + router._websocket.trigger("progress", { + state: "terminated", + reason: "cancel" + }); + + sinon.assert.calledOnce(router._websocket.close); + done(); + }); + }); + + it("should close the window", function(done) { + promise.then(function() { + router._websocket.trigger("progress", { + state: "terminated", + reason: "cancel" + }); + + sinon.assert.calledOnce(window.close); + done(); + }); + }); + }); + + describe("progress - terminated - timeout (previousState = alerting)", function() { + it("should stop alerting", function(done) { + promise.then(function() { + router._websocket.trigger("progress", { + state: "terminated", + reason: "timeout" + }, "alerting"); + + sinon.assert.calledOnce(navigator.mozLoop.stopAlerting); + done(); + }); + }); + + it("should close the websocket", function(done) { + promise.then(function() { + router._websocket.trigger("progress", { + state: "terminated", + reason: "timeout" + }, "alerting"); + + sinon.assert.calledOnce(router._websocket.close); + done(); + }); + }); + + it("should close the window", function(done) { + promise.then(function() { + router._websocket.trigger("progress", { + state: "terminated", + reason: "timeout" + }, "alerting"); + + sinon.assert.calledOnce(window.close); + done(); + }); + }); + }); + }); + }); }); }); diff --git a/browser/components/loop/test/functional/test_1_browser_call.py b/browser/components/loop/test/functional/test_1_browser_call.py index da140688413..952e4da3a78 100644 --- a/browser/components/loop/test/functional/test_1_browser_call.py +++ b/browser/components/loop/test/functional/test_1_browser_call.py @@ -99,9 +99,11 @@ class Test1BrowserCall(MarionetteTestCase): "btn-accept") call_button.click() - # expect a video container on standalone side - video = self.wait_for_element_displayed(By.CLASS_NAME, "media") - self.assertEqual(video.tag_name, "div", "expect a video container") + # make sure the standalone progresses to the pending state + pending_header = self.wait_for_element_displayed(By.CLASS_NAME, + "pending-header") + self.assertEqual(pending_header.tag_name, "header", + "expect a pending header") def accept_and_verify_incoming_call(self): self.marionette.set_context("chrome") diff --git a/browser/components/loop/test/mochitest/browser_mozLoop_softStart.js b/browser/components/loop/test/mochitest/browser_mozLoop_softStart.js index 5638e966c34..023e4fbe024 100644 --- a/browser/components/loop/test/mochitest/browser_mozLoop_softStart.js +++ b/browser/components/loop/test/mochitest/browser_mozLoop_softStart.js @@ -61,6 +61,13 @@ add_task(function* test_mozLoop_softStart() { Services.prefs.setCharPref("loop.soft_start_hostname", SOFT_START_HOSTNAME); Services.prefs.setIntPref("loop.soft_start_ticket_number", -1); + registerCleanupFunction(function () { + Services.prefs.clearUserPref("loop.throttled"); + Services.prefs.clearUserPref("loop.soft_start"); + Services.prefs.clearUserPref("loop.soft_start_hostname"); + Services.prefs.clearUserPref("loop.soft_start_ticket_number"); + }); + let throttled; let ticket; diff --git a/browser/components/loop/test/shared/websocket_test.js b/browser/components/loop/test/shared/websocket_test.js index 007bf919ce7..85ee5f1ad6c 100644 --- a/browser/components/loop/test/shared/websocket_test.js +++ b/browser/components/loop/test/shared/websocket_test.js @@ -17,6 +17,7 @@ describe("loop.CallConnectionWebSocket", function() { sandbox.useFakeTimers(); dummySocket = { + close: sinon.spy(), send: sinon.spy() }; sandbox.stub(window, 'WebSocket').returns(dummySocket); @@ -133,6 +134,16 @@ describe("loop.CallConnectionWebSocket", function() { }); }); + describe("#close", function() { + it("should close the socket", function() { + callWebSocket.promiseConnect(); + + callWebSocket.close(); + + sinon.assert.calledOnce(dummySocket.close); + }); + }); + describe("#decline", function() { it("should send a terminate message to the server", function() { callWebSocket.promiseConnect(); @@ -212,7 +223,35 @@ describe("loop.CallConnectionWebSocket", function() { }); sinon.assert.called(callWebSocket.trigger); - sinon.assert.calledWithExactly(callWebSocket.trigger, "progress", eventData); + sinon.assert.calledWithExactly(callWebSocket.trigger, "progress", + eventData, "init"); + }); + + it("should trigger a progress event with the previous state", function() { + var previousEventData = { + messageType: "progress", + state: "alerting" + }; + + // This first call is to set the previous state of the object + // ready for the main test below. + dummySocket.onmessage({ + data: JSON.stringify(previousEventData) + }); + + var currentEventData = { + messageType: "progress", + state: "terminate", + reason: "reject" + }; + + dummySocket.onmessage({ + data: JSON.stringify(currentEventData) + }); + + sinon.assert.called(callWebSocket.trigger); + sinon.assert.calledWithExactly(callWebSocket.trigger, "progress", + currentEventData, "alerting"); }); it("should trigger a progress: event on the callWebSocket", function() { diff --git a/browser/components/loop/ui/fake-mozLoop.js b/browser/components/loop/ui/fake-mozLoop.js index a5d49362c7a..d8b5b77cf92 100644 --- a/browser/components/loop/ui/fake-mozLoop.js +++ b/browser/components/loop/ui/fake-mozLoop.js @@ -7,5 +7,6 @@ * @type {Object} */ navigator.mozLoop = { - getLoopCharPref: function() {} + getLoopCharPref: function() {}, + getLoopBoolPref: function() {} }; diff --git a/browser/components/preferences/in-content/main.js b/browser/components/preferences/in-content/main.js index 7c516bf6272..37dfe6bbafd 100644 --- a/browser/components/preferences/in-content/main.js +++ b/browser/components/preferences/in-content/main.js @@ -93,7 +93,8 @@ var gMainPane = { gMainPane.enableE10SChange); let e10sCheckbox = document.getElementById("e10sAutoStart"); let e10sPref = document.getElementById("browser.tabs.remote.autostart"); - e10sCheckbox.checked = e10sPref.value; + let e10sTempPref = document.getElementById("e10sTempPref"); + e10sCheckbox.checked = e10sPref.value || e10sTempPref.value; #endif // Notify observers that the UI is now ready @@ -107,6 +108,19 @@ var gMainPane = { { let e10sCheckbox = document.getElementById("e10sAutoStart"); let e10sPref = document.getElementById("browser.tabs.remote.autostart"); + let e10sTempPref = document.getElementById("e10sTempPref"); + + let prefsToChange; + if (e10sCheckbox.checked) { + // Enabling e10s autostart + prefsToChange = [e10sPref]; + } else { + // Disabling e10s autostart + prefsToChange = [e10sPref]; + if (e10sTempPref.value) { + prefsToChange.push(e10sTempPref); + } + } const Cc = Components.classes, Ci = Components.interfaces; let brandName = document.getElementById("bundleBrand").getString("brandShortName"); @@ -124,13 +138,15 @@ var gMainPane = { shouldProceed = !cancelQuit.data; if (shouldProceed) { - e10sPref.value = e10sCheckbox.checked; + for (let prefToChange of prefsToChange) { + prefToChange.value = e10sCheckbox.checked; + } Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart); } } // Revert the checkbox in case we didn't quit - e10sCheckbox.checked = e10sPref.value; + e10sCheckbox.checked = e10sPref.value || e10sTempPref.value; }, #endif diff --git a/browser/components/preferences/in-content/main.xul b/browser/components/preferences/in-content/main.xul index 06989b1f6a4..78c4416fefb 100644 --- a/browser/components/preferences/in-content/main.xul +++ b/browser/components/preferences/in-content/main.xul @@ -13,6 +13,9 @@ + #endif diff --git a/browser/components/tabview/test/browser_tabview_bug715454.js b/browser/components/tabview/test/browser_tabview_bug715454.js index 7a8fb23e272..2e8d56de159 100644 --- a/browser/components/tabview/test/browser_tabview_bug715454.js +++ b/browser/components/tabview/test/browser_tabview_bug715454.js @@ -64,7 +64,7 @@ function switchToURL(groupItemOne, groupItemTwo) { * switch. The tab should be opened in group two and not in group one. */ // Set the urlbar to include the moz-action. - gURLBar.value = "moz-action:switchtab,about:mozilla"; + gURLBar.value = "moz-action:switchtab," + JSON.stringify({url: "about:mozilla"}); // Focus the urlbar so we can press enter. gURLBar.focus(); // Press enter. diff --git a/browser/components/tabview/test/browser_tabview_bug716880.js b/browser/components/tabview/test/browser_tabview_bug716880.js index 05831a497a6..ab1777ad1bf 100644 --- a/browser/components/tabview/test/browser_tabview_bug716880.js +++ b/browser/components/tabview/test/browser_tabview_bug716880.js @@ -67,7 +67,7 @@ function switchToURL(groupItemOne, groupItemTwo) { * switch. The selected group should be group one. */ // Set the urlbar to include the moz-action. - gURLBar.value = "moz-action:switchtab,about:mozilla"; + gURLBar.value = "moz-action:switchtab," + JSON.stringify({url: "about:mozilla"}); // Focus the urlbar so we can press enter. gURLBar.focus(); // Press enter. diff --git a/browser/devtools/scratchpad/scratchpad.xul b/browser/devtools/scratchpad/scratchpad.xul index 3800d2d3844..b155a6823ed 100644 --- a/browser/devtools/scratchpad/scratchpad.xul +++ b/browser/devtools/scratchpad/scratchpad.xul @@ -403,7 +403,7 @@
- + diff --git a/browser/devtools/webide/content/runtimedetails.js b/browser/devtools/webide/content/runtimedetails.js index 71288704201..b34e00137c6 100644 --- a/browser/devtools/webide/content/runtimedetails.js +++ b/browser/devtools/webide/content/runtimedetails.js @@ -83,8 +83,7 @@ function CheckLockState() { certCheckResult.textContent = sUnknown; if (AppManager.connection && - AppManager.connection.status == Connection.Status.CONNECTED && - AppManager.preferenceFront) { + AppManager.connection.status == Connection.Status.CONNECTED) { // ADB check if (AppManager.selectedRuntime instanceof USBRuntime) { diff --git a/browser/locales/en-US/chrome/browser/browser.dtd b/browser/locales/en-US/chrome/browser/browser.dtd index 95c2dc6f17f..1d9c5090435 100644 --- a/browser/locales/en-US/chrome/browser/browser.dtd +++ b/browser/locales/en-US/chrome/browser/browser.dtd @@ -732,15 +732,17 @@ just addresses the organization to follow, e.g. "This site is run by " --> - + - + + + diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css index 049112120ea..dd6337a12ec 100644 --- a/browser/themes/linux/browser.css +++ b/browser/themes/linux/browser.css @@ -901,7 +901,7 @@ toolbarbutton[sdk-button="true"][cui-areatype="toolbar"] > .toolbarbutton-icon { -moz-margin-end: 3px; } -#urlbar-display { +.urlbar-display { margin-top: 0; margin-bottom: 0; -moz-margin-start: 0; diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css index 29d01c2f582..c2956f6b67c 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -2147,7 +2147,7 @@ toolbarbutton[sdk-button="true"][cui-areatype="toolbar"] > .toolbarbutton-icon { -moz-margin-end: 3px; } -#urlbar-display { +.urlbar-display { margin-top: 0; margin-bottom: 0; color: GrayText; diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css index e580c801e60..f3ccb37c738 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -1247,7 +1247,7 @@ html|*.urlbar-input:-moz-lwtheme::-moz-placeholder, -moz-margin-end: 3px; } -#urlbar-display { +.urlbar-display { margin-top: 0; margin-bottom: 0; -moz-margin-start: 0; diff --git a/mobile/android/base/overlays/ui/ShareDialog.java b/mobile/android/base/overlays/ui/ShareDialog.java index b9e9b95e4ac..056c4a08adb 100644 --- a/mobile/android/base/overlays/ui/ShareDialog.java +++ b/mobile/android/base/overlays/ui/ShareDialog.java @@ -91,6 +91,19 @@ public class ShareDialog extends LocaleAware.LocaleAwareActivity implements Send super.onDestroy(); } + /** + * Show a toast indicating we were started with no URL, and then stop. + */ + private void abortDueToNoURL() { + Log.e(LOGTAG, "Unable to process shared intent. No URL found!"); + + // Display toast notifying the user of failure (most likely a developer who screwed up + // trying to send a share intent). + Toast toast = Toast.makeText(this, getResources().getText(R.string.overlay_share_no_url), Toast.LENGTH_SHORT); + toast.show(); + finish(); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -102,17 +115,14 @@ public class ShareDialog extends LocaleAware.LocaleAwareActivity implements Send // The URL is usually hiding somewhere in the extra text. Extract it. final String extraText = intent.getStringExtra(Intent.EXTRA_TEXT); + if (TextUtils.isEmpty(extraText)) { + abortDueToNoURL(); + return; + } + final String pageUrl = new WebURLFinder(extraText).bestWebURL(); - if (TextUtils.isEmpty(pageUrl)) { - Log.e(LOGTAG, "Unable to process shared intent. No URL found!"); - - // Display toast notifying the user of failure (most likely a developer who screwed up - // trying to send a share intent). - Toast toast = Toast.makeText(this, resources.getText(R.string.overlay_share_no_url), Toast.LENGTH_SHORT); - toast.show(); - finish(); - + abortDueToNoURL(); return; } diff --git a/mobile/android/base/resources/values-land/styles.xml b/mobile/android/base/resources/values-land/styles.xml index 8dcecccdc8e..739efa54d9a 100644 --- a/mobile/android/base/resources/values-land/styles.xml +++ b/mobile/android/base/resources/values-land/styles.xml @@ -72,9 +72,7 @@ diff --git a/mobile/android/base/resources/values-large-land-v11/styles.xml b/mobile/android/base/resources/values-large-land-v11/styles.xml index 304ec6ad913..b4c0aaa00e2 100644 --- a/mobile/android/base/resources/values-large-land-v11/styles.xml +++ b/mobile/android/base/resources/values-large-land-v11/styles.xml @@ -24,11 +24,7 @@ diff --git a/mobile/android/base/resources/values-xlarge-land-v11/styles.xml b/mobile/android/base/resources/values-xlarge-land-v11/styles.xml index a41a219eb63..6d531fb4e58 100644 --- a/mobile/android/base/resources/values-xlarge-land-v11/styles.xml +++ b/mobile/android/base/resources/values-xlarge-land-v11/styles.xml @@ -4,6 +4,12 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + diff --git a/mobile/android/base/resources/values-xlarge-v11/styles.xml b/mobile/android/base/resources/values-xlarge-v11/styles.xml index 6c4df3825dc..6cc11d80529 100644 --- a/mobile/android/base/resources/values-xlarge-v11/styles.xml +++ b/mobile/android/base/resources/values-xlarge-v11/styles.xml @@ -17,9 +17,6 @@ @@ -30,4 +27,11 @@ 212dp + + diff --git a/mobile/android/base/resources/values/styles.xml b/mobile/android/base/resources/values/styles.xml index 09a51fa560a..1234359bed4 100644 --- a/mobile/android/base/resources/values/styles.xml +++ b/mobile/android/base/resources/values/styles.xml @@ -63,8 +63,10 @@ diff --git a/mobile/android/base/tests/testBookmarkFolders.java b/mobile/android/base/tests/testBookmarkFolders.java index b47c2af877b..b584633bdd6 100644 --- a/mobile/android/base/tests/testBookmarkFolders.java +++ b/mobile/android/base/tests/testBookmarkFolders.java @@ -1,7 +1,7 @@ package org.mozilla.gecko.tests; -import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.home.HomePager; +import org.mozilla.gecko.sync.Utils; import android.content.ContentResolver; import android.content.ContentValues; @@ -32,11 +32,9 @@ public class testBookmarkFolders extends AboutHomeTest { // Verify the number of folders displayed in the Desktop Bookmarks folder is correct ListView desktopFolderContent = findListViewWithTag(HomePager.LIST_TAG_BOOKMARKS); ListAdapter adapter = desktopFolderContent.getAdapter(); - if (mDevice.type.equals("tablet")) { // On tablets it's 4 folders and 1 view for top padding - mAsserter.is(adapter.getCount(), 5, "Checking that the correct number of folders is displayed in the Desktop Bookmarks folder"); - } else { // On phones it's just the 4 folders - mAsserter.is(adapter.getCount(), 4, "Checking that the correct number of folders is displayed in the Desktop Bookmarks folder"); - } + + // Three folders and "Up to Bookmarks". + mAsserter.is(adapter.getCount(), 4, "Checking that the correct number of folders is displayed in the Desktop Bookmarks folder"); clickOnBookmarkFolder(StringHelper.TOOLBAR_FOLDER_LABEL); diff --git a/toolkit/components/places/UnifiedComplete.js b/toolkit/components/places/UnifiedComplete.js index 28cc2e1f754..ac57df2a735 100644 --- a/toolkit/components/places/UnifiedComplete.js +++ b/toolkit/components/places/UnifiedComplete.js @@ -492,6 +492,23 @@ function stripHttpAndTrim(spec) { return spec; } +/** + * Make a moz-action: URL for a given action and set of parameters. + * + * @param action + * Name of the action + * @param params + * Object, whose keys are parameter names and values are the + * corresponding parameter values. + * @return String representation of the built moz-action: URL + */ +function makeActionURL(action, params) { + let url = "moz-action:" + action + "," + JSON.stringify(params); + // Make a nsIURI out of this to ensure it's encoded properly. + return NetUtil.newURI(url).spec; +} + + //////////////////////////////////////////////////////////////////////////////// //// Search Class //// Manages a single instance of an autocomplete search. @@ -965,9 +982,12 @@ Search.prototype = { // If actions are enabled and the page is open, add only the switch-to-tab // result. Otherwise, add the normal result. - let [url, action] = this._enableActions && openPageCount > 0 ? - ["moz-action:switchtab," + escapedURL, "switchtab"] : - [escapedURL, null]; + let url = escapedURL; + let action = null; + if (this._enableActions && openPageCount > 0) { + url = makeActionURL("switchtab", {url: escapedURL}); + action = "switchtab"; + } // Always prefer the bookmark title unless it is empty let title = bookmarkTitle || historyTitle; @@ -1347,12 +1367,15 @@ UnifiedComplete.prototype = { let search = this._currentSearch; this.getDatabaseHandle().then(conn => search.execute(conn)) + .then(null, ex => { + dump(`Query failed: ${ex}\n`); + Cu.reportError(ex); + }) .then(() => { if (search == this._currentSearch) { this.finishSearch(true); } - }, ex => { dump("Query failed: " + ex + "\n"); - Cu.reportError(ex); }); + }); }, stopSearch: function () { diff --git a/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js b/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js index c1779be2358..07fe842ba99 100644 --- a/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js +++ b/toolkit/components/places/tests/unifiedcomplete/head_autocomplete.js @@ -281,3 +281,8 @@ function stripPrefix(spec) } return spec; } + +function makeActionURI(action, params) { + let url = "moz-action:" + action + "," + JSON.stringify(params); + return NetUtil.newURI(url); +} diff --git a/toolkit/components/places/tests/unifiedcomplete/test_tabmatches.js b/toolkit/components/places/tests/unifiedcomplete/test_tabmatches.js index f9aa14a7924..9aa5ad8c43e 100644 --- a/toolkit/components/places/tests/unifiedcomplete/test_tabmatches.js +++ b/toolkit/components/places/tests/unifiedcomplete/test_tabmatches.js @@ -22,14 +22,14 @@ add_task(function* test_tab_matches() { yield check_autocomplete({ search: "abc.com", searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,http://abc.com/"), title: "ABC rocks" } ] + matches: [ { uri: makeActionURI("switchtab", {url: "http://abc.com/"}), title: "ABC rocks" } ] }); do_log_info("two results, one tab match"); yield check_autocomplete({ search: "abc", searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,http://abc.com/"), title: "ABC rocks" }, + matches: [ { uri: makeActionURI("switchtab", {url: "http://abc.com/"}), title: "ABC rocks" }, { uri: uri2, title: "xyz.net - we're better than ABC" } ] }); @@ -38,8 +38,8 @@ add_task(function* test_tab_matches() { yield check_autocomplete({ search: "abc", searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,http://abc.com/"), title: "ABC rocks" }, - { uri: NetUtil.newURI("moz-action:switchtab,http://xyz.net/"), title: "xyz.net - we're better than ABC" } ] + matches: [ { uri: makeActionURI("switchtab", {url: "http://abc.com/"}), title: "ABC rocks" }, + { uri: makeActionURI("switchtab", {url: "http://xyz.net/"}), title: "xyz.net - we're better than ABC" } ] }); do_log_info("two results, both tab matches, one has multiple tabs"); @@ -47,8 +47,8 @@ add_task(function* test_tab_matches() { yield check_autocomplete({ search: "abc", searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,http://abc.com/"), title: "ABC rocks" }, - { uri: NetUtil.newURI("moz-action:switchtab,http://xyz.net/"), title: "xyz.net - we're better than ABC" } ] + matches: [ { uri: makeActionURI("switchtab", {url: "http://abc.com/"}), title: "ABC rocks" }, + { uri: makeActionURI("switchtab", {url: "http://xyz.net/"}), title: "xyz.net - we're better than ABC" } ] }); do_log_info("two results, no tab matches"); @@ -66,30 +66,30 @@ add_task(function* test_tab_matches() { yield check_autocomplete({ search: gTabRestrictChar + " abc", searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,http://abc.com/"), title: "ABC rocks" } ] + matches: [ { uri: makeActionURI("switchtab", {url: "http://abc.com/"}), title: "ABC rocks" } ] }); do_log_info("tab match with not-addable pages"); yield check_autocomplete({ search: "mozilla", searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,about:mozilla"), title: "about:mozilla" } ] + matches: [ { uri: makeActionURI("switchtab", {url: "about:mozilla"}), title: "about:mozilla" } ] }); do_log_info("tab match with not-addable pages and restriction character"); yield check_autocomplete({ search: gTabRestrictChar + " mozilla", searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,about:mozilla"), title: "about:mozilla" } ] + matches: [ { uri: makeActionURI("switchtab", {url: "about:mozilla"}), title: "about:mozilla" } ] }); do_log_info("tab match with not-addable pages and only restriction character"); yield check_autocomplete({ search: gTabRestrictChar, searchParam: "enable-actions", - matches: [ { uri: NetUtil.newURI("moz-action:switchtab,http://abc.com/"), title: "ABC rocks" }, - { uri: NetUtil.newURI("moz-action:switchtab,about:mozilla"), title: "about:mozilla" }, - { uri: NetUtil.newURI("moz-action:switchtab,data:text/html,test"), title: "data:text/html,test" } ] + matches: [ { uri: makeActionURI("switchtab", {url: "http://abc.com/"}), title: "ABC rocks" }, + { uri: makeActionURI("switchtab", {url: "about:mozilla"}), title: "about:mozilla" }, + { uri: makeActionURI("switchtab", {url: "data:text/html,test"}), title: "data:text/html,test" } ] }); yield cleanup(); diff --git a/toolkit/content/widgets/autocomplete.xml b/toolkit/content/widgets/autocomplete.xml index 0463768da09..36b22fad161 100644 --- a/toolkit/content/widgets/autocomplete.xml +++ b/toolkit/content/widgets/autocomplete.xml @@ -1445,9 +1445,17 @@ extends="chrome://global/content/bindings/popup.xml#popup"> // space when hidden. Setting the hidden property accomplishes that. this._titleOverflowEllipsis.hidden = false; + let types = new Set(type.split(/\s+/)); + // If the type includes an action, set up the item appropriately. - var types = type.split(/\s+/); - var actionIndex = types.indexOf("action"); - if (actionIndex >= 0) { - let [,action, param] = url.match(/^moz-action:([^,]+),(.*)$/); - this.setAttribute("actiontype", action); - url = param; - let desc = this._stringBundle.GetStringFromName("switchToTab"); - this._setUpDescription(this._action, desc, true); + if (types.has("action")) { + let action = this._parseActionUrl(url); + this.setAttribute("actiontype", action.type); + + if (action.type == "switchtab") { + url = action.params.url; + let desc = this._stringBundle.GetStringFromName("switchToTab"); + this._setUpDescription(this._action, desc, true); + } // Remove the "action" substring so that the correct style, if any, // is applied below. - types.splice(actionIndex, 1); - type = types.join(" "); + types.delete("action"); } // Check if we have a search engine name - let searchEngine = ""; - let searchIndex = types.indexOf("search"); - if (searchIndex >= 0) { + if (types.has("search")) { + emphasiseUrl = false; + const TITLE_SEARCH_ENGINE_SEPARATOR = " \u00B7\u2013\u00B7 "; [title, searchEngine] = title.split(TITLE_SEARCH_ENGINE_SEPARATOR); + url = this._stringBundle.formatStringFromName("searchWithEngine", [searchEngine], 1); // Remove the "search" substring so that the correct style, if any, // is applied below. - types.splice(searchIndex, 1); - type = types.join(" "); + types.delete("search"); } // If we have a tag match, show the tags and icon @@ -1531,10 +1541,6 @@ extends="chrome://global/content/bindings/popup.xml#popup"> // Don't emphasize keyword searches in the title or url this.setAttribute("text", ""); - } else { - // Hide the title's extra box if we don't need extra stuff - this._extraBox.hidden = true; - this._titleBox.flex = 1; } // Give the image the icon style and a special one for the type @@ -1546,15 +1552,8 @@ extends="chrome://global/content/bindings/popup.xml#popup"> title = url; // Emphasize the matching search terms for the description - this._setUpDescription(this._title, title); - if (!searchEngine) { - this._setUpDescription(this._url, url); - } else { - let desc = this._stringBundle.formatStringFromName("searchWithEngine", [searchEngine], 1); - - // The search engine name, when present, is not emphasized. - this._setUpDescription(this._url, desc, true); - } + this._setUpDescription(this._title, title, !emphasiseTitle); + this._setUpDescription(this._url, url, !emphasiseUrl); // Set up overflow on a timeout because the contents of the box // might not have a width yet even though we just changed them @@ -1564,6 +1563,37 @@ extends="chrome://global/content/bindings/popup.xml#popup"> + + + + + diff --git a/toolkit/devtools/server/actors/script.js b/toolkit/devtools/server/actors/script.js index 55e19427d4d..6f459075643 100644 --- a/toolkit/devtools/server/actors/script.js +++ b/toolkit/devtools/server/actors/script.js @@ -5433,6 +5433,11 @@ function getInnerId(window) { getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID; }; +function getInnerId(window) { + return window.QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID; +}; + const symbolProtoToString = typeof Symbol === "function" ? Symbol.prototype.toString : null; function getSymbolName(symbol) { diff --git a/toolkit/devtools/server/actors/webbrowser.js b/toolkit/devtools/server/actors/webbrowser.js index 1199f8f946f..a2e449bfa83 100644 --- a/toolkit/devtools/server/actors/webbrowser.js +++ b/toolkit/devtools/server/actors/webbrowser.js @@ -43,6 +43,11 @@ function getWindowID(window) { * Browser-specific actors. */ +function getInnerId(window) { + return window.QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID; +}; + /** * Yield all windows of type |aWindowType|, from the oldest window to the * youngest, using nsIWindowMediator::getEnumerator. We're usually diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index 29ec062ae03..6b08de89a6d 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -4539,7 +4539,8 @@ bool mozilla::BrowserTabsRemoteAutostart() { if (!gBrowserTabsRemoteAutostartInitialized) { - bool prefEnabled = Preferences::GetBool("browser.tabs.remote.autostart", false); + bool prefEnabled = Preferences::GetBool("browser.tabs.remote.autostart", false) || + Preferences::GetBool("browser.tabs.remote.autostart.1", false); bool disabledForA11y = Preferences::GetBool("browser.tabs.remote.autostart.disabled-because-using-a11y", false); gBrowserTabsRemoteAutostart = !gSafeMode && !disabledForA11y && prefEnabled; gBrowserTabsRemoteAutostartInitialized = true;