ubuntu-html5-theme-0.1.2+16.04.20160203/0000755000015600001650000000000012654470531017530 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/ubuntu-html5-container.qmlproject0000644000015600001650000000064512654470322026166 0ustar pbuserpbgroup00000000000000import QmlProject 1.1 Project { QmlFiles {} JavaScriptFiles {} ImageFiles {} Files { directory: "." filter: "CMakeLists.txt" } Files { directory: "src" filter: "*.h;*.h.in;*.cpp;qmldir" } Files { directory: "tests" filter: "*.h;*.cpp;*.py" } /* List of plugin directories passed to QML runtime */ importPaths: [ "src" ] } ubuntu-html5-theme-0.1.2+16.04.20160203/tests/0000755000015600001650000000000012654470531020672 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/0000755000015600001650000000000012654470530021602 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/0000755000015600001650000000000012654470531022547 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/test-tabs-in-app.html0000644000015600001650000000547612654470322026537 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Application Template
ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/apps/0000755000015600001650000000000012654470530023511 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/apps/rss-reader/0000755000015600001650000000000012654470531025561 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/apps/rss-reader/app.js0000644000015600001650000001053612654470322026702 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * */ var UI; $(document).ready(function () { UI = new UbuntuUI() UI.init(); UI.pagestack.push("main"); if (typeof localStorage["feeds"] == "undefined") { restoreDefault(); } //load local storage feeds var feeds = eval(localStorage["feeds"]); if (feeds !== null) { var feeds_list = UI.list('#yourfeeds'); feeds_list.removeAllItems(); feeds_list.setHeader('My feeds'); for (var i = 0; i < feeds.length; i++) { feeds_list.append(feeds[i], null, null, function (target, thisfeed) { console.log('load'); loadFeed(thisfeed); }, feeds[i]); } } UI.button('yes').click(function (e) { var url = $("#rssFeed").val(); if (url === "") { if (!$("#addfeeddialog section").hasClass("shake")) { $("#addfeeddialog section").addClass("shake"); } else { $('#addfeeddialog section').css('animation-name', 'none'); $('#addfeeddialog section').css('-moz-animation-name', 'none'); $('#addfeeddialog section').css('-webkit-animation-name', 'none'); setTimeout(function () { $('#addfeeddialog section').css('-webkit-animation-name', 'shake'); }, 0); } } else { var feeds = eval(localStorage["feeds"]); feeds.push(url); localStorage.setItem("feeds", JSON.stringify(feeds)); window.location.reload(); } }); UI.button('addfeed').click(function () { $('#addfeeddialog').show(); }); UI.button('no').click(function () { $('#addfeeddialog').hide(); }); }); //FUNCS function restoreDefault() { localStorage.clear(); var feeds = []; feeds.push("http://daker.me/feed.xml"); feeds.push("http://www.omgubuntu.co.uk/feed"); feeds.push("http://hespress.com/feed/index.rss"); feeds.push("http://rss.slashdot.org/Slashdot/slashdot"); feeds.push("http://www.reddit.com/.rss"); try { localStorage.setItem("feeds", JSON.stringify(feeds)); window.location.reload(); } catch (e) { if (e == QUOTA_EXCEEDED_ERR) { console.log("Error: Local Storage limit exceeds."); } else { console.log("Error: Saving to local storage."); } } } function loadFeed(url) { UI.pagestack.push("results"); UI.dialog("loading").show(); var feed = new google.feeds.Feed(url); feed.setNumEntries(30); feed.load(function (result) { if (!result.error) { UI.dialog("loading").hide(); var results_list = UI.list('#resultscontent'); console.log(results_list); results_list.removeAllItems(); results_list.setHeader(result.feed.title); for (var i = 0; i < result.feed.entries.length; i++) { results_list.append(result.feed.entries[i].title.replace(/"/g, "'"), null, null, function (target, result_infos) { showArticle.apply(null, result_infos); }, [escape(result.feed.entries[i].title), escape(result.feed.entries[i].link), escape(result.feed.entries[i].content)] ); } } else alert('feed error'); }); } function showArticle(title, url, desc) { UI.pagestack.push("article"); if (typeof desc == "undefined") desc = "(No description provided)"; $("#articleinfo").html("

" + unescape(title) + "

" + unescape(desc) + "

" + unescape(url) + "

"); } google.load("feeds", "1"); ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/apps/rss-reader/styles.css0000644000015600001650000000211512654470322027613 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ #articleinfo { padding: 10px; -webkit-box-sizing: border-box; box-sizing: border-box; } #articleinfo iframe { max-width: 100%; } #articleinfo p { margin: 7px 0; } #articleinfo a{ text-decoration: none; color: #787878; font-weight: bold; }ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/apps/rss-reader/index.html0000644000015600001650000001015512654470322027556 0ustar pbuserpbgroup00000000000000 RSS Mobile Reader - Ubuntu UI Example

Add a new feed

Type the url feed you want to add

ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/test-page-actions.html0000644000015600001650000001013212654470322026757 0ustar pbuserpbgroup00000000000000 Page Actions test
  • Tab 1
  • Tab 2
ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/test-nopagestack-in-app.html0000644000015600001650000000625012654470322030074 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Application Template
  • RSS Mobile Reader
  • RSS Feed
  • Article
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
ubuntu-html5-theme-0.1.2+16.04.20160203/tests/data/html/test-pagestack-in-app.html0000644000015600001650000000746112654470322027544 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Application Template
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/0000755000015600001650000000000012654470531022712 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/tools/0000755000015600001650000000000012654470530024051 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/tools/qml/0000755000015600001650000000000012654470531024643 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/tools/qml/message-server.js0000644000015600001650000000212412654470322030126 0ustar pbuserpbgroup00000000000000// Copyright (C) 2014 Canonical Ltd. // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA oxide.addMessageHandler("EVALUATE-CODE", function(msg) { var code = msg.args.code; if (msg.args.wrap) { code = "(function() {" + code + "})()"; } try { var result = eval(code); msg.reply({result: result}); } catch(e) { msg.error("Code threw exception: \"" + e + "\""); } }); ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/tools/qml/webview.qml0000644000015600001650000002010012654470322027015 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This file is part of ubuntu-html5-ui-toolkit. * * ubuntu-html5-ui-toolkit is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * webbrowser-app is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import QtTest 1.0 import com.canonical.Oxide 1.0 as Oxide Item { id: root objectName: "webviewContainer" width: 640 height: 640 property string url signal resultUpdated(string message) TestResult { id: qtest_testResult } function __gentid() { return Math.random() + ''; } function __wrapJsCommands(commands) { return '(function() { ' + commands + ' })();' } function __createResult(result, tid) { return JSON.stringify({result: result, tid: tid}); } function __dumpValue(v) { if (typeof(v) === "string") { return "'" + v + "'"; } return v; } function __setupClosedVariables(variables) { var variableDeclStatements = ''; for (var variable in variables) { if (variables.hasOwnProperty(variable)) { variableDeclStatements += 'var ' + variable + ' = ' + __dumpValue(variables[variable]) + ';'; } } return variableDeclStatements; } function clickElementById(id) { var tid = __gentid(); var statement = 'document.getElementById("' + id + '").click();'; var result = webview.evaluateCode(statement, true); root.resultUpdated(root.__createResult(result, tid)); } function evalInPageUnsafe(expr) { var result = webview.evaluateCode(expr, true); console.log('result: ' + result) root.resultUpdated(result ? result.toString() : result) } function clickAnyElementBySelector(selector) { var tid = __gentid(); var statement = 'document.querySelectorAll("' + selector + '")[0].click();'; var result = webview.evaluateCode(statement, true); root.resultUpdated(root.__createResult(result, tid)); } function elementWithIdHasAttribute(id,attribute,value) { var tid = __gentid(); var hasAttributeWithIdFunc = ' function __hasAttributeWithId() { try { return document.querySelector("#" + id).getAttribute(attribute) === value; } catch (e) {}; return false; };'; var statement = __setupClosedVariables({'id': id, 'attribute': attribute, 'value': value}); statement += hasAttributeWithIdFunc; statement += "; return __hasAttributeWithId(id,attribute,value); " var result = webview.evaluateCode(statement, true); root.resultUpdated(root.__createResult(result, tid)); } function isNodeWithIdVisible(id) { var tid = __gentid(); var isNodeWithIdVisibleFunc = ' function __isNodeWithIdVisible() { try { return document.getElementById(id).style.display !== "none"; } catch (e) { return e.toString(); }; return false; };'; var statement = __setupClosedVariables({'id': id}); statement += isNodeWithIdVisibleFunc; statement += "; return __isNodeWithIdVisible(id); " var result = webview.evaluateCode(statement, true); root.resultUpdated(root.__createResult(result, tid)); } function getAttributeForElementWithId(id,attribute) { var tid = __gentid(); var getAttributeWithIdFunc = ' function __getAttributeWithId() { try { var value = document.querySelector("#" + id).getAttribute(attribute); return value || ""; } catch (e) { return e.toString(); }; return ""; };'; var statement = __setupClosedVariables({'id': id, 'attribute': attribute}); statement += getAttributeWithIdFunc; statement += "; return __getAttributeWithId(); " var result = webview.evaluateCode(statement, true); root.resultUpdated(root.__createResult(result, tid)); } Oxide.WebView { objectName: "webview" id: webview url: parent.url width: parent.width height: parent.height - 100 anchors { top: parent.top bottom: addressbar.top right: parent.right left: parent.left } preferences.localStorageEnabled: true preferences.appCacheEnabled: true function evaluateCode(code, wrap) { var value = webview._waitForResult( webview.rootFrame.sendMessage( "oxide://main-world", "EVALUATE-CODE", { code: code, wrap: wrap === undefined ? false : wrap })); return value ? value.result : undefined; } function _waitForResult(req, timeout) { var result; var error; req.onreply = function(response) { result = response; error = 0; }; req.onerror = function(error_code, msg) { result = msg; error = error_code; }; webview._waitFor(function() { return error !== undefined; }, timeout); if (error > 0) { console.error('Error:' + error + ', result:' + result) } else if (error === 0) { return result; } else { throw new Error("Message call timed out"); } } function _waitFor(predicate, timeout) { timeout = timeout || 5000000; var end = Date.now() + timeout; var i = Date.now(); while (i < end && !predicate()) { qtest_testResult.wait(50); i = Date.now(); } return predicate(); } context: Oxide.WebContext { userScripts: [ Oxide.UserScript { context: "oxide://main-world" emulateGreasemonkey: true url: Qt.resolvedUrl("message-server.js") matchAllFrames: true } ] } onJavaScriptConsoleMessage: { var msg = "[JS] (%1:%2) %3".arg(sourceId).arg(lineNumber).arg(message) if (level === Oxide.WebView.LogSeverityVerbose) { console.log(msg) } else if (level === Oxide.WebView.LogSeverityInfo) { console.info(msg) } else if (level === Oxide.WebView.LogSeverityWarning) { console.warn(msg) } else if ((level === Oxide.WebView.LogSeverityError) || (level === Oxide.WebView.LogSeverityErrorReport) || (level === Oxide.WebView.LogSeverityFatal)) { console.error(msg) } } } TextInput { id: addressbar objectName: "addressbar" width: parent.width - 100 height: parent.height - 100 inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhUrlCharactersOnly focus: true enabled: true readOnly: false color: "red" anchors { top: webview.bottom bottom: parent.bottom left: parent.left } Rectangle { objectName: "browseButton" id: browseButton border.color: "black" border.width: 5 width: 100 height: 100 anchors { top: parent.top bottom: parent.bottom left: parent.right } MouseArea { anchors.fill: parent onClicked: { root.url = addressbar.text } } } } } ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/0000755000015600001650000000000012654470531027607 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/__init__.py0000644000015600001650000000053212654470322031716 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. """Tests for the Ubuntu HTML5 UI SDK package """ ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/0000755000015600001650000000000012654470531030751 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/__init__.py0000644000015600001650000002227212654470322033065 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. """Tests for the Ubuntu HTML5 package """ import os import json import http.server as http import threading import subprocess HTTP_SERVER_PORT = 8383 from testtools.matchers import Equals, GreaterThan from autopilot.matchers import Eventually from autopilot.testcase import AutopilotTestCase from autopilot.input import Mouse, Touch, Pointer from autopilot import platform # from autopilot.introspection.qt import QtIntrospectionTestMixin class RequestHandler(http.BaseHTTPRequestHandler): BASE_PATH_FOR_SERVED_APPS = {'rss-reader': "{}/{}".format( os.path.dirname(os.path.realpath(__file__)), '../../../../0.1/examples/apps/rss-reader')} def get_served_filename(self, appname, filename): if len(filename) == 0 or filename == '/': filename = 'autopilot.html' return os.path.join( self.BASE_PATH_FOR_SERVED_APPS[appname], filename) def serve_file(self, filename): import mimetypes content_type = mimetypes.guess_type(filename)[0] f = open(filename, 'rb') self.send_response(200) self.send_header('Content-length', os.fstat(f.fileno())[6]) self.send_header('Content-type', content_type) self.end_headers() self.wfile.write(f.read()) def do_GET(self): # FIXME: more generic & cleaner if self.path.startswith('/rss-reader'): filename = self.path[len('/rss-reader'):] self.send_response(200) self.serve_file( self.get_served_filename( 'rss-reader', filename)) else: self.send_error(404) class UbuntuHTML5HTTPServer(threading.Thread): def __init__(self, port): super(UbuntuHTML5HTTPServer, self).__init__() self.server = http.BaseHTTPServer.HTTPServer( ("", port), RequestHandler) self.server.allow_reuse_address = True def run(self): self.server.serve_forever() def shutdown(self): self.server.shutdown() self.server.server_close() class UbuntuHTML5TestCaseBase(AutopilotTestCase): BROWSER_CONTAINER_PATH = "{}/{}".format( os.path.dirname(os.path.realpath(__file__)), '../../tools/qml/webview.qml') INSTALLED_BROWSER_CONTAINER_PATH = \ '/usr/share/ubuntu-html5-ui-toolkit/tests/tools/qml/webview.qml' BROWSER_QML_APP_LAUNCHER = "/usr/lib/{}/qt5/bin/qmlscene".format( subprocess.check_output( ["dpkg-architecture", "-qDEB_HOST_MULTIARCH"]).strip().decode('utf-8')) # TODO: fix version LOCAL_HTML_EXAMPLES_PATH = os.path.abspath( "{}/{}".format( os.path.dirname(os.path.realpath(__file__)), '../../../../tests')) INSTALLED_HTML_EXAMPLES_PATH = \ '/usr/share/ubuntu-html5-ui-toolkit/tests/' APPS_SUBFOLDER_NAME = 'apps' BASE_PATH = '' def get_browser_container_path(self): if os.path.exists(self.BROWSER_CONTAINER_PATH): return self.BROWSER_CONTAINER_PATH return self.INSTALLED_BROWSER_CONTAINER_PATH def create_file_url_from(self, filepath): return 'file://' + filepath def setup_base_path(self): if os.path.exists(self.LOCAL_HTML_EXAMPLES_PATH): self.BASE_PATH = self.LOCAL_HTML_EXAMPLES_PATH else: self.BASE_PATH = self.INSTALLED_HTML_EXAMPLES_PATH def setUp(self): self.setup_base_path() if platform.model() == "Desktop": self.pointer = Pointer(Mouse.create()) else: self.pointer = Pointer(Touch.create()) params = [self.BROWSER_QML_APP_LAUNCHER, self.get_browser_container_path()] if (platform.model() != 'Desktop'): params.append( '--desktop_file_hint=/usr/share/" \ + "applications/unitywebappsqmllauncher.desktop') self.app = self.launch_test_application( *params, app_type='qt') self.webviewContainer = self.get_webviewContainer() self.watcher = self.webviewContainer.watch_signal( 'resultUpdated(QString)') super(UbuntuHTML5TestCaseBase, self).setUp() def tearDown(self): super(UbuntuHTML5TestCaseBase, self).tearDown() def pick_app_launcher(self, app_path): # force Qt app introspection: from autopilot.introspection.qt import QtApplicationLauncher return QtApplicationLauncher() def get_webviewContainer(self): return self.app.select_single(objectName="webviewContainer") def get_webview(self): return self.app.select_single(objectName="webview") def get_addressbar(self): return self.app.select_single(objectName="addressbar") def get_button(self): return self.app.select_single(objectName="browseButton") def get_title(self): return self.get_webview().title def assert_url_eventually_loaded(self, url): webview = self.get_webview() self.assertThat( webview.loadProgress, Eventually(Equals(100))) self.assertThat( webview.loading, Eventually(Equals(False))) self.assertThat( webview.url, Eventually(Equals(url))) def click_dom_node_with_id(self, id): webview = self.get_webviewContainer() webview.slots.clickElementById(id) self.assertThat( lambda: self.watcher.num_emissions, Eventually(Equals(1))) def click_any_dom_node_by_selector(self, selector): webview = self.get_webviewContainer() webview.slots.clickAnyElementBySelector(selector) self.assertThat( lambda: self.watcher.num_emissions, Eventually(Equals(1))) def is_dom_node_visible(self, id): webview = self.get_webviewContainer() prev_emissions = self.watcher.num_emissions webview.slots.isNodeWithIdVisible(id) self.assertThat( lambda: self.watcher.num_emissions, Eventually(GreaterThan(prev_emissions))) return json.loads( webview.get_signal_emissions( 'resultUpdated(QString)')[-1][0])['result'] def eval_expression_in_page_unsafe(self, expr): webview = self.get_webviewContainer() prev_emissions = self.watcher.num_emissions webview.slots.evalInPageUnsafe(expr) self.assertThat( lambda: self.watcher.num_emissions, Eventually(GreaterThan(prev_emissions))) return webview.get_signal_emissions('resultUpdated(QString)')[-1][0] def get_dom_node_id_attribute(self, id, attribute): webview = self.get_webviewContainer() prev_emissions = self.watcher.num_emissions webview.slots.getAttributeForElementWithId(id, attribute) self.assertThat( lambda: self.watcher.num_emissions, Eventually(GreaterThan(prev_emissions))) return json.loads( webview.get_signal_emissions( 'resultUpdated(QString)')[-1][0])['result'] def get_address_bar_action_button(self): addressbar = self.get_addressbar() return addressbar.select_single(objectName="browseButton") def browse_to_url(self, url): import time addressbar = self.get_addressbar() self.assertThat( addressbar.activeFocus, Eventually(Equals(True))) self.keyboard.type(url, 0.001) self.pointer.click_object(self.get_webview()) # XXX: very bad, but wont fix time.sleep(1) button = self.get_address_bar_action_button() self.pointer.move_to_object(button) self.pointer.press() # XXX: very bad, but wont fix time.sleep(1) self.pointer.release() self.assert_url_eventually_loaded(url) def browse_to_app(self, appname): appfilepath = os.path.abspath( self.BASE_PATH + '/data/html/' + self.APPS_SUBFOLDER_NAME + '/' + appname + '/index.html') APP_HTML_PATH = self.create_file_url_from(appfilepath) self.browse_to_url(APP_HTML_PATH) def browse_to_test_html(self, html_filename): self.browse_to_url( self.create_file_url_from( os.path.abspath( '{}/data/html/{}'.format( self.BASE_PATH, html_filename)))) class UbuntuThemeWithHttpServerTestCaseBase(UbuntuHTML5TestCaseBase): def setUp(self): self.server = UbuntuHTML5HTTPServer(HTTP_SERVER_PORT) self.server.start() super(UbuntuThemeWithHttpServerTestCaseBase, self).setUp() def tearDown(self): super(UbuntuThemeWithHttpServerTestCaseBase, self).tearDown() self.server.shutdown() class UbuntuThemeRemotePageTestCaseBase(UbuntuThemeWithHttpServerTestCaseBase): def setUp(self): super(UbuntuThemeRemotePageTestCaseBase, self).setUp() ././@LongLink0000000000000000000000000000015100000000000011212 Lustar 00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/test_rss_reader.pyubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/test_rss_reade0000644000015600001650000000260412654470322033702 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. from __future__ import absolute_import from testtools.matchers import Contains, Equals from autopilot.matchers import Eventually from ubuntu_html5_ui_toolkit.tests import UbuntuHTML5TestCaseBase class UbuntuThemeRSSReaderTestCase(UbuntuHTML5TestCaseBase): def setUp(self): super(UbuntuThemeRSSReaderTestCase, self).setUp() self.browse_to_app('rss-reader') def test_appDoesLoads(self): self.assertThat(self.get_title(), Contains("RSS Mobile Reader")) def test_initialState(self): self.assertThat(self.is_dom_node_visible('main'), Equals(True)) self.assertThat(self.is_dom_node_visible('article'), Equals(False)) self.assertThat(self.is_dom_node_visible('results'), Equals(False)) def test_switchToFeedView(self): self.click_any_dom_node_by_selector('#yourfeeds li a') self.assertThat( lambda: self.is_dom_node_visible('main'), Eventually(Equals(False))) self.assertThat(self.is_dom_node_visible('article'), Equals(False)) self.assertThat(self.is_dom_node_visible('results'), Equals(True)) ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/test_tabs.py0000644000015600001650000000300212654470322033304 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2014 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. from __future__ import absolute_import from testtools.matchers import Equals from autopilot.matchers import Eventually from ubuntu_html5_ui_toolkit.tests import UbuntuHTML5TestCaseBase class UbuntuUIToolkitTabsTestCase(UbuntuHTML5TestCaseBase): def setUp(self): super(UbuntuUIToolkitTabsTestCase, self).setUp() def test_programaticTabSelectIndex(self): self.browse_to_test_html('test-tabs-in-app.html') self.assertThat( lambda: self.eval_expression_in_page_unsafe( 'var UI = new UbuntuUI(); ' 'UI.init(); UI.tabs.selectedTabIndex = 1; ' 'return UI.tabs.selectedTabIndex;'), Eventually(Equals('1'))) self.assertThat( lambda: self.is_dom_node_visible('tab1'), Eventually(Equals(False))) self.assertThat( lambda: self.is_dom_node_visible('tab2'), Eventually(Equals(True))) self.assertThat( lambda: self.is_dom_node_visible('tab3'), Eventually(Equals(False))) self.assertThat( self.eval_expression_in_page_unsafe( 'return document.getElementById("tab2").style.display;'), Equals('block')) ././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/test_pagestack.pyubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/test_pagestack0000644000015600001650000000673112654470322033702 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. from __future__ import absolute_import from testtools.matchers import Equals from autopilot.matchers import Eventually from ubuntu_html5_ui_toolkit.tests import UbuntuHTML5TestCaseBase class UbuntuThemePageStackTestCase(UbuntuHTML5TestCaseBase): def setUp(self): super(UbuntuThemePageStackTestCase, self).setUp() def test_pageLoadsWithNoPageStacks(self): self.browse_to_test_html('test-nopagestack-in-app.html') self.assertThat( self.eval_expression_in_page_unsafe( 'var UI = new UbuntuUI(); UI.init(); return "ok";'), Equals('ok')) def test_pageLoadsWithPageStacks(self): self.browse_to_test_html('test-pagestack-in-app.html') self.assertThat( self.eval_expression_in_page_unsafe( 'var UI = new UbuntuUI(); UI.init(); return "ok";'), Equals('ok')) self.assertThat( self.is_dom_node_visible('main'), Equals(True)) def test_pageChangeWithPageStackPush(self): self.browse_to_test_html('test-pagestack-in-app.html') self.assertThat( self.eval_expression_in_page_unsafe( 'var UI = new UbuntuUI(); UI.init(); ' 'UI.pagestack.push("results"); return "ok";'), Equals('ok')) self.assertThat( self.is_dom_node_visible('main'), Equals(False)) self.assertThat( self.is_dom_node_visible('results'), Equals(True)) def test_pageChangeWithPageStackPopped(self): self.browse_to_test_html('test-pagestack-in-app.html') self.assertThat( self.eval_expression_in_page_unsafe( 'var UI = new UbuntuUI(); UI.init(); ' 'UI.pagestack.push("main"); ' 'UI.pagestack.push("results"); ' 'UI.pagestack.push("article"); ' 'UI.pagestack.pop(); return "ok";'), Equals('ok')) self.assertThat( self.is_dom_node_visible('main'), Equals(False)) self.assertThat( self.is_dom_node_visible('results'), Equals(True)) self.assertThat( self.is_dom_node_visible('article'), Equals(False)) def test_pagePushWithProperties(self): self.browse_to_test_html('test-pagestack-in-app.html') expression = """ var ui = new UbuntuUI(); ui.init(); ui.pagestack.push('main'); (new Page('results')).onactivated( function(properties) { document.getElementById('results').innerHTML = JSON.stringify(properties); }); ui.pagestack.push('results', 'WORKS'); return 'ok'; """ self.assertThat( self.eval_expression_in_page_unsafe(expression), Equals('ok')) self.assertThat( lambda: self.is_dom_node_visible('results'), Eventually(Equals(True))) results_html_content = \ "return document.getElementById('results').innerHTML;" self.assertThat( self.eval_expression_in_page_unsafe( results_html_content), Equals('"WORKS"')) ././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/test_page_actions.pyubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_ui_toolkit/tests/test_page_acti0000644000015600001650000000323312654470322033646 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2013 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. from __future__ import absolute_import from testtools.matchers import Equals, NotEquals from autopilot.matchers import Eventually from ubuntu_html5_ui_toolkit.tests import UbuntuHTML5TestCaseBase class UbuntuThemePageStackTestCase(UbuntuHTML5TestCaseBase): def setUp(self): super(UbuntuThemePageStackTestCase, self).setUp() def test_tabWithActions(self): self.browse_to_test_html('test-page-actions.html') self.eval_expression_in_page_unsafe( 'var UI = new UbuntuUI(); UI.init();'), self.assertThat( self.eval_expression_in_page_unsafe( 'return document.querySelector\ (\'[data-role="actions"]\') != null;'), Equals('true')) self.assertThat( lambda: self.eval_expression_in_page_unsafe( 'return document.getElementById\ ("addfeed").parentNode.style.display;'), Eventually(NotEquals('none'))) def test_noActions(self): self.browse_to_test_html('test-nopagestack-in-app.html') self.assertThat( self.eval_expression_in_page_unsafe( 'var UI = new UbuntuUI(); UI.init(); return "ok";'), Equals('ok')) self.assertThat( self.eval_expression_in_page_unsafe( 'return document.querySelector\ (\'[data-role="actions"]\') != null;'), Equals('false')) ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/CMakeLists.txt0000644000015600001650000000062312654470322025451 0ustar pbuserpbgroup00000000000000execute_process(COMMAND python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" OUTPUT_VARIABLE PYTHON_PACKAGE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) install(DIRECTORY ubuntu_html5_container ubuntu_html5_ui_toolkit DESTINATION ${PYTHON_PACKAGE_DIR} ) install(DIRECTORY tools DESTINATION ${CMAKE_INSTALL_DATADIR}/ubuntu-html5-ui-toolkit/tests ) ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_container/0000755000015600001650000000000012654470531027407 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_container/__init__.py0000644000015600001650000000053412654470322031520 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2014 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. """Tests for the Ubuntu HTML5 Launcher package """ ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_container/tests/0000755000015600001650000000000012654470531030551 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_container/tests/__init__.py0000644000015600001650000000254012654470322032661 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2014 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. """Tests for the Ubuntu HTML5 Launcher package """ import os from autopilot.testcase import AutopilotTestCase LAUNCHER_EXEC_NAME = 'ubuntu-html5-app-launcher' LOCAL_LAUNCHER_PATH = os.path.abspath( "{}/{}".format( os.path.dirname(os.path.realpath(__file__)), '../../../../src/ubuntu-html5-app-launcher/' + LAUNCHER_EXEC_NAME)) INSTALLED_LAUNCHER_PATH = '/usr/bin/' + LAUNCHER_EXEC_NAME class UbuntuHtml5LauncherTestCase (AutopilotTestCase): def setUp(self): self.app = None super(UbuntuHtml5LauncherTestCase, self).setUp() def tearDown(self): super(UbuntuHtml5LauncherTestCase, self).tearDown() def get_launcher_path(self): if os.path.exists(LOCAL_LAUNCHER_PATH): return LOCAL_LAUNCHER_PATH return INSTALLED_LAUNCHER_PATH def get_app(self): return self.app def launch_with_argument(self, args): try: self.app = self.launch_test_application( self.get_launcher_path(), args) except Exception: pass ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_container/tests/test_appLaunch.pyubuntu-html5-theme-0.1.2+16.04.20160203/tests/autopilot/ubuntu_html5_container/tests/test_appLaunch.0000644000015600001650000000136412654470322033526 0ustar pbuserpbgroup00000000000000# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright 2014 Canonical # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License version 3, as # published by the Free Software Foundation. from __future__ import absolute_import from testtools.matchers import NotEquals from ubuntu_html5_container.tests import UbuntuHtml5LauncherTestCase class UbuntuHtml5LauncherAppLaunchTestCase(UbuntuHtml5LauncherTestCase): def setUp(self): super(UbuntuHtml5LauncherAppLaunchTestCase, self).setUp() def test_launcher_succeeds_with_no_www(self): self.launch_with_argument('') self.assertThat(self.get_app(), NotEquals(None)) ubuntu-html5-theme-0.1.2+16.04.20160203/tests/CMakeLists.txt0000644000015600001650000000021112654470322023422 0ustar pbuserpbgroup00000000000000add_subdirectory(autopilot) install(DIRECTORY data DESTINATION ${CMAKE_INSTALL_DATADIR}/ubuntu-html5-ui-toolkit/tests ) ubuntu-html5-theme-0.1.2+16.04.20160203/src/0000755000015600001650000000000012654470531020317 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/0000755000015600001650000000000012654470531021615 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/Ubuntu/0000755000015600001650000000000012654470531023077 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/Ubuntu/WebApps/0000755000015600001650000000000012654470531024440 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/Ubuntu/WebApps/WebAppContainer.qml0000644000015600001650000000745612654470322030206 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This file is part of ubuntu-html5-container. * * ubuntu-html5-container is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * webbrowser-app is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.UnityWebApps 0.1 import com.canonical.Oxide 1.0 as Oxide import Ubuntu.Web 0.2 /*! \qmltype WebAppContainer \inqmlmodule Ubuntu.WebApps 0.1 \ingroup ubuntu \brief WebAppContainer is the root element that should be used for all HTML5 applications. */ MainView { id: root objectName: "root" anchorToKeyboard: true automaticOrientation: true /*! \preliminary The property holds the path to the filesystem location where the 'index.html' file can be found (root of the HTML5 application). The path is absolute or relative to the current dir. */ property string htmlIndexDirectory: "" /*! \preliminary The properties hold whether the remote debugging interface should be enabled for the Web View. The host ip and port for accessing the remote interface should be provided. */ property bool remoteInspectorEnabled: false Page { id: mainPage anchors.fill: parent /*! \internal */ function _getAppStartupIndexFileUri() { return 'file://' + root.htmlIndexDirectory + '/index.html'; } /*! \internal */ Loader { id: webviewComponentLoader anchors.fill: parent onLoaded: { webappBindingsLoader.sourceComponent = webappBindingsComponent } } Component { id: webviewComponent WebView { id: webview preferences.allowUniversalAccessFromFileUrls: true preferences.allowFileAccessFromFileUrls: true preferences.appCacheEnabled: true preferences.localStorageEnabled: true function navigationRequestedDelegate(request) { var url = request.url.toString() if (url.indexOf("file://") !== 0) { request.action = Oxide.NavigationRequest.ActionReject Qt.openUrlExternally(url) return } } } } Component.onCompleted: { webviewComponentLoader.sourceComponent = webviewComponent; } /*! \internal */ function getUnityWebappsProxies() { return UnityWebAppsUtils.makeProxiesForWebViewBindee(webviewComponentLoader.item); } /*! \internal */ Loader { id: webappBindingsLoader visible: false anchors.fill: parent } function userScriptInjected() { webviewComponentLoader.item.url = mainPage._getAppStartupIndexFileUri(); } /*! \internal */ Component { id: webappBindingsComponent UnityWebApps { bindee: mainPage injectExtraUbuntuApis: true requiresInit: false onUserScriptsInjected: mainPage.userScriptInjected() } } } } ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/Ubuntu/WebApps/qmldir0000644000015600001650000000007612654470322025654 0ustar pbuserpbgroup00000000000000module Ubuntu.WebApps WebAppContainer 0.1 WebAppContainer.qml ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/Ubuntu/WebApps/CMakeLists.txt0000644000015600001650000000201712654470322027176 0ustar pbuserpbgroup00000000000000project(ubuntu-html5-container) # setup install location execute_process( COMMAND qmake -query QT_INSTALL_QML OUTPUT_VARIABLE QT_INSTALL_QML OUTPUT_STRIP_TRAILING_WHITESPACE ) set(HTML5_CONTAINER_IMPORTS_DIR "${QT_INSTALL_QML}/Ubuntu/WebApps") # setup install for local component files file(GLOB QML_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.qml qmldir) install(FILES ${QML_FILES} DESTINATION ${HTML5_CONTAINER_IMPORTS_DIR}) # make sure that we have all the files in the right place if we test locally # & have a specific build dir if(NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) foreach(_qmlfile ${QML_FILES}) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_qmlfile} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_qmlfile} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${_qmlfile} ${CMAKE_CURRENT_BINARY_DIR}/${_qmlfile}) endforeach(_qmlfile) add_custom_target(copy_to_build_dir DEPENDS ${QML_FILES}) endif() ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/Ubuntu/CMakeLists.txt0000644000015600001650000000003212654470322025630 0ustar pbuserpbgroup00000000000000add_subdirectory(WebApps) ubuntu-html5-theme-0.1.2+16.04.20160203/src/plugin/CMakeLists.txt0000644000015600001650000000003112654470322024345 0ustar pbuserpbgroup00000000000000add_subdirectory(Ubuntu) ubuntu-html5-theme-0.1.2+16.04.20160203/src/CMakeLists.txt0000644000015600001650000000010512654470322023051 0ustar pbuserpbgroup00000000000000add_subdirectory(ubuntu-html5-app-launcher) add_subdirectory(plugin) ubuntu-html5-theme-0.1.2+16.04.20160203/src/ubuntu-html5-app-launcher/0000755000015600001650000000000012654470531025245 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/src/ubuntu-html5-app-launcher/main.cpp0000644000015600001650000001576512654470322026711 0ustar pbuserpbgroup00000000000000/* * Copyright 2013-2015 Canonical Ltd. * * This file is part of ubuntu-html5-ui-toolkit. * * ubuntu-html5-ui-toolkit is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * ubuntu-html5-ui-toolkit is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include #include #include #include #include #include #include #include #include #include namespace { void loadQtTestability(const QStringList & arguments) { // The testability driver is only loaded // by QApplication but not by QGuiApplication. // However, QApplication depends on QWidget which // would add some unneeded overhead => Let's load the testability driver on our own. if (arguments.contains(QLatin1String("-testability"))) { QLibrary testLib(QLatin1String("qttestability")); if (testLib.load()) { typedef void (*TasInitialize)(void); TasInitialize initFunction = (TasInitialize)testLib.resolve("qt_testability_init"); if (initFunction) { initFunction(); } else { qCritical("Library qttestability resolve failed!"); } } else { qCritical("Library qttestability load failed!"); } } } } // namespace void addPathToQmlImport(const QString & importPath) { QString existingImportPath (qgetenv("QML2_IMPORT_PATH")); existingImportPath = existingImportPath.trimmed(); if ( ! existingImportPath.trimmed().isEmpty()) existingImportPath.append(":"); existingImportPath.append(importPath); qputenv("QML2_IMPORT_PATH", existingImportPath.toLatin1()); } void setUpQmlImportPathIfNecessary() { QString importPath = Webapp::Config::getContainerImportPath(); if ( !importPath.isEmpty()) { addPathToQmlImport(importPath); } qDebug() << "Setting import path to: " << qgetenv("QML2_IMPORT_PATH").data(); } void usage() { QTextStream out(stdout); QString command = QFileInfo(QCoreApplication::applicationFilePath()).fileName(); out << "Usage: " << command << " [-h|--help] [--www=] [--inspector]" << endl; out << "Options:" << endl; out << " -h, --help display this help message and exit" << endl; out << " --www=PATH relative or absolute path to the 'index.html' root file" << endl; out << " --maximized maximize the app window at startup time" << endl; out << " --inspector run a remote inspector on port " << REMOTE_INSPECTOR_PORT << endl; } int main(int argc, char *argv[]) { // Enable compositing in oxide QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); QGuiApplication app(argc, argv); if (!app.arguments().count()) { qCritical() << "Invalid inputs args"; usage(); return EXIT_FAILURE; } loadQtTestability(app.arguments()); const QString WWW_LOCATION_ARG_HEADER = "--www="; const QString MAXIMIZED_ARG_HEADER = "--maximized"; const QString ARG_HEADER = "--"; const QString VALUE_HEADER = "="; const QString INSPECTOR = "--inspector"; QString wwwfolderArg; bool maximized = false; QString remoteInspectorHost = ""; QString remoteInspectorPort = QString::number(REMOTE_INSPECTOR_PORT); bool remoteInspectorEnabled = false; QStringList arguments = app.arguments(); arguments.pop_front(); Q_FOREACH(QString argument, arguments) { if (argument.contains(WWW_LOCATION_ARG_HEADER)) { wwwfolderArg = argument.split(WWW_LOCATION_ARG_HEADER)[1]; } else if (argument.contains(MAXIMIZED_ARG_HEADER)) { maximized = true; } else if (argument.contains(INSPECTOR)) { remoteInspectorEnabled = true; Q_FOREACH(QHostAddress address, QNetworkInterface::allAddresses()) { if (!address.isLoopback() && (address.protocol() == QAbstractSocket::IPv4Protocol)) { remoteInspectorHost = address.toString(); break; } } if (argument.startsWith(INSPECTOR + "=")) { remoteInspectorPort = argument.split(INSPECTOR + "=")[1]; } } else { qDebug() << "Ignoring argument: " << argument; } } if (wwwfolderArg.isEmpty()) { wwwfolderArg = QDir::currentPath(); qDebug() << "No (or empty) WWW folder path specified." << endl << "Defaulting to the current directory:" << wwwfolderArg; } QFileInfo wwwFolder(wwwfolderArg); if (wwwFolder.isRelative()) { wwwFolder.makeAbsolute(); } if (!wwwFolder.exists() || !wwwFolder.isDir()) { qCritical() << "WWW folder not found or not a proper directory: " << wwwFolder.absoluteFilePath(); return EXIT_FAILURE; } // set the current directory to the project/application folder // to help use relative paths for the embedded js components as well QDir::setCurrent(wwwFolder.absoluteFilePath()); // Ensure that application-specific data is written where it ought to. if (qgetenv("APP_ID").data() != NULL) { QString appPkgName = qgetenv("APP_ID").split('_').first(); QCoreApplication::setApplicationName(appPkgName); } setUpQmlImportPathIfNecessary(); QQuickView view; QQmlEngine* engine = view.engine(); if (remoteInspectorEnabled) { qputenv("UBUNTU_WEBVIEW_DEVTOOLS_HOST", remoteInspectorHost.toUtf8()); qputenv("UBUNTU_WEBVIEW_DEVTOOLS_PORT", remoteInspectorPort.toUtf8()); } engine->rootContext()->setContextProperty("inspector", remoteInspectorEnabled); engine->rootContext()->setContextProperty("wwwFolder", wwwFolder.absoluteFilePath()); view.setSource(QUrl::fromLocalFile(Webapp::Config::getContainerMainQmlPath() + "/main.qml")); if (view.status() != QQuickView::Ready) { qCritical() << "Main application component cannot be loaded."; return EXIT_FAILURE; } view.setTitle(QCoreApplication::applicationName()); view.setResizeMode(QQuickView::SizeRootObjectToView); QObject::connect(view.engine(), SIGNAL(quit()), &app, SLOT(quit())); if (maximized) view.showMaximized(); else view.show(); return app.exec(); } ubuntu-html5-theme-0.1.2+16.04.20160203/src/ubuntu-html5-app-launcher/config.h.in0000644000015600001650000000307612654470322027274 0ustar pbuserpbgroup00000000000000/* * Copyright 2013 Canonical Ltd. * * This file is part of ubuntu-html5-ui-toolkit. * * ubuntu-html5-ui-toolkit is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * ubuntu-html5-ui-toolkit is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __CONFIG_H__ #define __CONFIG_H__ #include #include #include #define REMOTE_INSPECTOR_PORT 9221 namespace Webapp { namespace Config { bool isRunningInstalled() { static bool installed = (QCoreApplication::applicationDirPath() == QDir("@CMAKE_INSTALL_FULL_BINDIR@").canonicalPath()); return installed; } QString getContainerMainQmlPath() { static QString mainQml = isRunningInstalled() ? QString("@CMAKE_INSTALL_FULL_DATADIR@/ubuntu-html5-app-launcher/qml") : QString("@CMAKE_SOURCE_DIR@/src/ubuntu-html5-app-launcher"); return mainQml; } QString getContainerImportPath() { static QString mainQml = ! isRunningInstalled() ? QString("@CMAKE_SOURCE_DIR@/src/plugin") : QString(); return mainQml; } } // namespace Config } // namespace Webapp #endif // __CONFIG_H__ ubuntu-html5-theme-0.1.2+16.04.20160203/src/ubuntu-html5-app-launcher/main.qml0000644000015600001650000000162612654470322026707 0ustar pbuserpbgroup00000000000000/* * Copyright 2014 Canonical Ltd. * * This file is part of ubuntu-html5-ui-toolkit. * * ubuntu-html5-ui-toolkit is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * ubuntu-html5-ui-toolkit is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.0 import Ubuntu.Components 0.1 import Ubuntu.WebApps 0.1 WebAppContainer { width: units.gu(100) height: units.gu(75) remoteInspectorEnabled: inspector htmlIndexDirectory: wwwFolder } ubuntu-html5-theme-0.1.2+16.04.20160203/src/ubuntu-html5-app-launcher/CMakeLists.txt0000644000015600001650000000122412654470322030002 0ustar pbuserpbgroup00000000000000project(ubuntu-html5-app-launcher) configure_file( config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) # ubuntu-html5-app binary set(HTML5_LAUNCHER ubuntu-html5-app-launcher) set(HTML5_LAUNCHER_SRC main.cpp ) add_executable(${HTML5_LAUNCHER} ${HTML5_LAUNCHER_SRC} ) qt5_use_modules(${HTML5_LAUNCHER} Core Gui Widgets Quick) # install qml files file(GLOB QML_FILES *.qml) install(FILES ${QML_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/ubuntu-html5-app-launcher/qml) # install bin files install(TARGETS ${HTML5_LAUNCHER} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) ubuntu-html5-theme-0.1.2+16.04.20160203/README0000644000015600001650000000235212654470322020410 0ustar pbuserpbgroup00000000000000====== README ====== Ubuntu HTML5 UI SDK for Html5 apps that brings a collection of HTML5 widgets and js runtime support for HTML5 apps along with the HTML5 WebRuntime that is meant to host those apps. ======= HACKING ======= Here is how to develop on this code base. Install SASS ============ Complete the steps in globally install SASS if you currently do not have it installed: http://sass-lang.com/install Running SASS ============ Once you have SASS installed. Open terminal (CTRL+Alt+T) and cd into your branch folder. Then enter this command to begin watching your scss files: $ sass --watch 0.1/ambiance/css/sass/default.scss:0.1/ambiance/css/appTemplate.css --style expanded Automated UI tests ================== The ubuntu-html5 container and the ubuntu-ui-toolkit both use autopilot (https://launchpad.net/autopilot) to test its functional elements. To run the tests, you will need to install python3-autopilot and libautopilot-qt. Then do the following: $ cd tests/autopilot/ $ autopilot3 run ubuntu_html5_ui_toolkit $ autopilot3 run ubuntu_html5_container You can get a list of all available tests with the following commands: $ autopilot3 list ubuntu_html5_ui_toolkit $ autopilot3 list ubuntu_html5_container ubuntu-html5-theme-0.1.2+16.04.20160203/ubuntu-html5-theme0000755000015600001650000000277112654470322023134 0ustar pbuserpbgroup00000000000000#! /bin/sh OUTDIR="$(pwd)" WORKDIR=$(mktemp -d) cleanup() { rm -rf $WORKDIR rm -f .ubuntu-html5-theme.releases-list } trap cleanup EXIT INT QUIT ILL KILL SEGV TERM list_releases() { wget -q -O ./.ubuntu-html5-theme.releases-list https://code.launchpad.net/ubuntu-html5-theme cat .ubuntu-html5-theme.releases-list | \ grep lp:ubuntu | \ grep ~ubuntu-html5-theme-devs | \ awk '{match($0, /~ubuntu-html5-theme-devs\/ubuntu-html5-theme\/([^\"]*)/, releases); print releases[1]}' } download() { rel=$1 echo "Downloading release $rel..." bzr branch https://code.launchpad.net/~ubuntu-html5-theme-devs/ubuntu-html5-theme/$1 $WORKDIR/$rel if [ "$?" -ne 0 ]; then echo "Unable to download release $rel" exit 1 fi } do_install_theme() { if [ ! -d $OUTDIR/www ]; then echo "No 'www' folder found in the current directory" echo "Exiting..." exit 1 fi if [ -d $OUTDIR/ambiance ]; then echo "There is already an 'ambiance' folder in the project directory" echo "Exiting..." exit 1 fi download $1 mv $WORKDIR/$1/0.1/ambiance $OUTDIR/www } do_convert_project() { if [ ! -e $OUTDIR/www/index.html ]; then echo "No index.html found in the 'www' folder" echo "Exiting..." exit 1 fi sed -i 's:/usr/share/ubuntu-html5-ui-toolkit/0.1/::' $OUTDIR/www/index.html } case "$1" in install) do_install_theme $2 ;; convert) do_convert_project ;; list) list_releases ;; update) echo "Not implemented..." exit 1 ;; *) echo "Usage: $0 {list|install |convert|update}" exit 1 esac ubuntu-html5-theme-0.1.2+16.04.20160203/package.json0000644000015600001650000000060512654470322022015 0ustar pbuserpbgroup00000000000000{ "author": "Adnane Belmadiaf", "name": "ubuntu-html5-theme", "version": "0.0.1", "homepage": "https://launchpad.net/ubuntu-html5-theme", "devDependencies": { "grunt": "~0.4.0", "grunt-contrib-concat": "~0.1.3", "grunt-contrib-uglify": "~0.1.1", "grunt-contrib-cssmin": "~0.4.1", "grunt-contrib-jshint": "~0.1.0", "grunt-contrib-compress": "~0.3.3" } } ubuntu-html5-theme-0.1.2+16.04.20160203/cmake_uninstall.cmake.in0000644000015600001650000000211712654470322024307 0ustar pbuserpbgroup00000000000000# Source: http://www.cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) string(REGEX REPLACE "\n" ";" files "${files}") list(REVERSE files) foreach (file ${files}) message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") if (EXISTS "$ENV{DESTDIR}${file}") execute_process( COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}" OUTPUT_VARIABLE rm_out RESULT_VARIABLE rm_retval ) if(NOT ${rm_retval} EQUAL 0) message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") endif (NOT ${rm_retval} EQUAL 0) else (EXISTS "$ENV{DESTDIR}${file}") message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") endif (EXISTS "$ENV{DESTDIR}${file}") endforeach(file) ubuntu-html5-theme-0.1.2+16.04.20160203/COPYING0000644000015600001650000001674312654470322020574 0ustar pbuserpbgroup00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ubuntu-html5-theme-0.1.2+16.04.20160203/Gruntfile.js0000644000015600001650000000526712654470322022035 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * Licese granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /*global module:false*/ module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), meta: { banner: '/*!\n' + ' * app.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + ' * https://launchpad.net/ubuntu-html5-theme\n' + ' * GNU LGPL v3\n' + ' */' }, jshint: { options: { curly: false, eqeqeq: true, immed: true, latedef: true, newcap: true, noarg: true, sub: true, undef: true, eqnull: true, browser: true, expr: true, globals: { head: false, module: false, console: false } }, files: [ 'Gruntfile.js', 'js/app.js' ] }, concat: { options:{ separator: ';' }, js: { src: ['ambiance/js/*.js'], dest: 'build/app.js' }, css:{ src: ['ambiance/css/*.css'], dest: 'build/app.css' } }, uglify: { options: { banner: '<%= meta.banner %>\n' }, build: { src: '<%= concat.js.dest %>', dest: 'build/app.min.js' } }, cssmin: { options: { banner: '/*!\n' + ' * app.min.css <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + ' * https://launchpad.net/ubuntu-html5-theme\n' + ' * GNU LGPL v3\n' + ' */' }, compress: { files: { 'build/app.min.css': [ '<%= concat.css.dest %>' ] } } } }); grunt.loadNpmTasks( 'grunt-contrib-jshint' ); grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); grunt.loadNpmTasks( 'grunt-contrib-uglify' ); grunt.loadNpmTasks( 'grunt-contrib-concat' ); // Default task. grunt.registerTask( 'default', [ 'jshint', 'concat', 'cssmin', 'uglify' ] ); }; ubuntu-html5-theme-0.1.2+16.04.20160203/update-docs0000755000015600001650000000030612654470322021663 0ustar pbuserpbgroup00000000000000#!/bin/sh if [ ! $(which yuidoc) ]; then echo "Please install yuidocjs: sudo apt-get install npm nodejs-legacy && sudo npm -g install yuidocjs" exit 1 fi cd 0.1/ambiance/js && ./yuidoc-build.sh ubuntu-html5-theme-0.1.2+16.04.20160203/CMakeLists.txt0000644000015600001650000000210112654470322022260 0ustar pbuserpbgroup00000000000000cmake_minimum_required(VERSION 2.8.9) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") # Standard install paths include(GNUInstallDirs) string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower) # enable QML debugging if(CMAKE_BUILD_TYPE MATCHES DEBUG OR CMAKE_BUILD_TYPE MATCHES "Debug") add_definitions(-DQT_QML_DEBUG) endif() find_package(Qt5Core REQUIRED) find_package(Qt5Gui REQUIRED) find_package(Qt5Widgets REQUIRED) find_package(Qt5Quick REQUIRED) set(CMAKE_INCLUDE_CURRENT_DIR ON) # uninstall target configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) # make non compiled files (QML, JS, images, etc.) visible in QtCreator file(GLOB_RECURSE NON_COMPILED_FILES *.qml *.js *.png *.py *.pot *.po *.qdoc *.qdocconf *.css *.html) add_custom_target(NON_COMPILED_TARGET ALL SOURCES ${NON_COMPILED_FILES}) add_subdirectory(src) add_subdirectory(tests) ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/0000755000015600001650000000000012654470530020025 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/0000755000015600001650000000000012654470530021564 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/0000755000015600001650000000000012654470531022201 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc.json0000644000015600001650000000042512654470322024367 0ustar pbuserpbgroup00000000000000{ "description": "Ubuntu HTML5 API: JavaScript for HTML5 Ubuntu Apps", "majorversion": "HTML-14.04-dev", "options": { "themedir": "yuidoc-theme", "outdir": "./docsbuild" }, "name": "Ubuntu HTML5 API", "version": "HTML-14.04-dev~bzr202" }ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/fast-buttons.js0000644000015600001650000001473712654470322025202 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ (function () { /** * From: http://code.this.com/mobile/articles/fast_buttons.html * Also see: http://stackoverflow.com/questions/6300136/trying-to-implement-googles-fast-button */ /** For IE8 and earlier compatibility: https://developer.mozilla.org/en/DOM/element.addEventListener */ function addListener(el, type, listener, useCapture) { if (el.addEventListener) { el.addEventListener(type, listener, useCapture); return { destroy: function () { el.removeEventListener(type, listener, useCapture); } }; } else { // see: http://stackoverflow.com/questions/5198845/javascript-this-losing-context-in-ie var handler = function (e) { listener.handleEvent(window.event, listener); }; el.attachEvent('on' + type, handler); return { destroy: function () { el.detachEvent('on' + type, handler); } }; } } var isTouch = "ontouchstart" in window; /* Construct the FastButton with a reference to the element and click handler. */ this.FastButton = function (element, handler, useCapture) { // collect functions to call to cleanup events this.events = []; this.touchEvents = []; this.element = element; this.handler = handler; this.useCapture = useCapture; if (isTouch) this.events.push(addListener(element, 'touchstart', this, this.useCapture)); this.events.push(addListener(element, 'click', this, this.useCapture)); }; /* Remove event handling when no longer needed for this button */ this.FastButton.prototype.destroy = function () { for (var i = this.events.length - 1; i >= 0; i -= 1) this.events[i].destroy(); this.events = this.touchEvents = this.element = this.handler = this.fastButton = null; }; /* acts as an event dispatcher */ this.FastButton.prototype.handleEvent = function (event) { switch (event.type) { case 'touchstart': this.onTouchStart(event); break; case 'touchmove': this.onTouchMove(event); break; case 'touchend': this.onClick(event); break; case 'click': this.onClick(event); break; } }; /* Save a reference to the touchstart coordinate and start listening to touchmove and touchend events. Calling stopPropagation guarantees that other behaviors don’t get a chance to handle the same click event. This is executed at the beginning of touch. */ this.FastButton.prototype.onTouchStart = function (event) { event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true); this.touchEvents.push(addListener(this.element, 'touchend', this, this.useCapture)); this.touchEvents.push(addListener(document.body, 'touchmove', this, this.useCapture)); this.startX = event.touches[0].clientX; this.startY = event.touches[0].clientY; }; /* When /if touchmove event is invoked, check if the user has dragged past the threshold of 10px. */ this.FastButton.prototype.onTouchMove = function (event) { if (Math.abs(event.touches[0].clientX - this.startX) > 10 || Math.abs(event.touches[0].clientY - this.startY) > 10) { this.reset(); //if he did, then cancel the touch event } }; /* Invoke the actual click handler and prevent ghost clicks if this was a touchend event. */ this.FastButton.prototype.onClick = function (event) { event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true); this.reset(); // Use .call to call the method so that we have the correct "this": https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call var result = this.handler.call(this.element, event); if (event.type == 'touchend') clickbuster.preventGhostClick(this.startX, this.startY); return result; }; this.FastButton.prototype.reset = function () { for (var i = this.touchEvents.length - 1; i >= 0; i -= 1) this.touchEvents[i].destroy(); this.touchEvents = []; }; this.clickbuster = function () {}; /* Call preventGhostClick to bust all click events that happen within 25px of the provided x, y coordinates in the next 2.5s. */ this.clickbuster.preventGhostClick = function (x, y) { clickbuster.coordinates.push(x, y); window.setTimeout(clickbuster.pop, 2500); }; this.clickbuster.pop = function () { clickbuster.coordinates.splice(0, 2); }; /* If we catch a click event inside the given radius and time threshold then we call stopPropagation and preventDefault. Calling preventDefault will stop links from being activated. */ this.clickbuster.onClick = function (event) { for (var i = 0; i < clickbuster.coordinates.length; i += 2) { var x = clickbuster.coordinates[i]; var y = clickbuster.coordinates[i + 1]; if (Math.abs(event.clientX - x) < 25 && Math.abs(event.clientY - y) < 25) { event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true); event.preventDefault ? event.preventDefault() : (event.returnValue = false); } } }; if (isTouch) { // Don't need to use our custom addListener function since we only bust clicks on touch devices document.addEventListener('click', clickbuster.onClick, true); clickbuster.coordinates = []; } })(this); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/fix_copyright_header.py0000755000015600001650000000510712654470322026745 0ustar pbuserpbgroup00000000000000#!/usr/bin/python3 # # Copyright 2015 Canonical Ltd # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /** * An Ubuntu Header wraps the general Tabs definitions and interaction in the case of a Tab navigation pattern or is used to display the title of the current page when using a PageStack navigation pattern. In the case of a Tab navigation pattern, declare the Header and its Tabs in HTML as a direct child of the top level MainView as a sibling to the content div. In the case of a PageStack navigation pattern, the Ubuntu Header HTML element should be present and can be left empty. It will be automatically updated to hold the Title of the current Page being visited. The value of such a title is taken from the data-title attribute of the currently visited Page as it is being pushed at the top of the stack (see PageStack.push()). ######Contained list provides Page navigation A contained unordered list has list items, each of which has "data-page" data attribute whose value of a Page ID that it targets. Clicking the Header/Tabs allows the user to navigate to the Pages identified by these IDs. * @class Header * @constructor * @namespace UbuntuUI * @example
  • Main
  • Two
[...]
[...]
JavaScript access: var header = UI.header("headerID"); */ var Header= function (id) { this.id = id; }; Header.prototype = { /** * Returns the DOM element associated with the id this widget is bind to. * @method element * @return {DOMElement} * @example var myheader = UI.header("headerid").element(); */ element: function () { return document.getElementById(this.id); } }; ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/dialogs.js0000644000015600001650000000450612654470322024164 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /** * Dialogs are modal full-screen popups that prevent other GUI interactions with the application until dismissed. Dialogs wrap arbitrary markup. Dialogs are declared at the top level inside the content div. * @class Dialog * @constructor * @namespace UbuntuUI * @example
[...]
[...]
JavaScript access: var dialog = UI.dialog("dialogID"); */ var Dialog = function (id) { this.id = id; this.dialog = document.getElementById(id); }; Dialog.prototype = { /** * Display a dialog by adding 'active' CSS class * @method show */ show: function () { this.dialog.classList.add('active'); }, /** * Hide a dialog by removing 'active' class * @method hide */ hide: function () { this.dialog.classList.remove('active'); }, /** * Toggle a dialog, which means removing its 'active' class if it has one, or adding the 'active' class if it does not have one * @method toggle */ toggle: function () { this.dialog.classList.toggle('active'); }, /** * Returns the DOM element associated with the id this widget is bind to. * @method element * @return {DOMElement} * @example var mydialog = UI.dialog("dialogid").element(); */ element: function () { return document.getElementById(this.id); } }; ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/popovers.js0000644000015600001650000001761112654470322024420 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /** * A Popover is a div containng markup that can pop up and disappear. (Unlike a Dialog, Popovers are not full screen.) A Popoves often contain a List whose items are connected to useful JavaScript functions. ######Popover Position The Popover's position is set relative to a specified base element with the data-gravity="LETTER" attribute. LETTER values: - 'n': the base element is above the Popover - 's': the base element is below the Popover - 'e': the base element is to the east of (to the right of) the Popover (in right-to-left locales) - 'w': the base element is to the west of (to the left of) the Popover (in right-to-left locale) * @class Popover * @constructor * @namespace UbuntuUI * @param {String} elem - The element to which the Popover's position is relative * @param {ID} id - The id attribute of the Popover in HTML * @example

Text

Javascript: var popBase = document.getElementById("popoverBase"); var popover = UI.popover(popBase, "popover"); */ var Popover = function (elem, id) { this.id = id; this.popover = document.getElementById(id); this.elem = elem; this.parent = elem.parentNode.parentNode.parentNode.parentNode; this.is_parent_footer = (this.parent.nodeName.toLowerCase() === "footer"); }; Popover.prototype = { /** * Display a Popover * @method show */ show: function () { if (this.popover === null) { console.error('The popover with the ID #' + this.id + ' doesn\'t exist'); return; } var de = document.documentElement, w = (de&&de.clientWidth) || document.body.clientWidth, ot = 0, ol = 0, gravity = "s", pos_top = 0, pos_left = 0, pos_right = 0; this.popover.classList.add('active'); popoverWidth = this.popover.offsetWidth; popoverHeight = this.popover.offsetHeight; gravity = this.popover.getAttribute("data-gravity"); if (this.is_parent_footer) { ot = this.parent.offsetTop; ol = this.elem.offsetLeft; } else { ot = this.elem.offsetTop; ol = this.elem.offsetLeft; } switch (gravity) { case 'n': pos_top = this.elem.offsetTop + this.elem.offsetHeight + 10; pos_left = this.elem.offsetLeft + this.elem.offsetWidth / 2 - popoverWidth / 2; break; case 's': if (this.is_parent_footer) { pos_top = ot - popoverHeight - 90; pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2; if (pos_left < 0) pos_left = 5; else { if (pos_left + popoverWidth > w) { pos_left = -1; pos_right = 5; } } } else { pos_top = ot - popoverHeight - 10; pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2; } break; case 'e': pos_top = this.elem.offsetTop + this.elem.offsetHeight / 2 - popoverHeight / 2; pos_left = this.elem.offsetLeft - popoverWidth - 10; break; case 'w': pos_top = this.elem.offsetTop + this.elem.offsetHeight / 2 - popoverHeight / 2; pos_left = this.elem.offsetLeft + this.elem.offsetWidth + 10; break; } this.popover.style.top = pos_top + 'px'; if (pos_left === -1) { this.popover.style.left = 'auto'; this.popover.style.right = pos_right+ 'px'; } else this.popover.style.left = pos_left+ 'px'; return this.popover; }, /** * Hide a Popover * @method hide */ hide: function () { this.popover.classList.remove('active'); this.popover.style.top = '0px'; this.popover.style.left = '0px'; return this.popover; }, /** * Toggle show/hide status of a Popover * @method toggle */ toggle: function () { if (this.popover === null) { console.error('The popover with the ID #' + this.id + ' doesn\'t exist'); return; } var de = document.documentElement, w = (de&&de.clientWidth) || document.body.clientWidth, ot = 0, ol = 0, gravity = "s", pos_top = 0, pos_left = 0, pos_right = 0; this.popover.classList.toggle('active'); popoverWidth = this.popover.offsetWidth; popoverHeight = this.popover.offsetHeight; gravity = this.popover.getAttribute("data-gravity"); if (this.is_parent_footer) { ot = this.parent.offsetTop; ol = this.elem.offsetLeft; } else { ot = this.elem.offsetTop; ol = this.elem.offsetLeft; } switch (gravity) { case 'n': pos_top = ot + this.elem.offsetHeight + 10; pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2; break; case 's': if (this.is_parent_footer) { pos_top = ot - popoverHeight - 90; pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2; if (pos_left < 0) pos_left = 5; else { if (pos_left + popoverWidth > w) { pos_left = -1; pos_right = 5; } } } else { pos_top = ot - popoverHeight - 10; pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2; } break; case 'e': pos_top = ot + this.elem.offsetHeight / 2 - popoverHeight / 2; pos_left = ol - popoverWidth - 10; break; case 'w': pos_top = ot + this.elem.offsetHeight / 2 - popoverHeight / 2; pos_left = ol + this.elem.offsetWidth + 10; break; } this.popover.style.top = pos_top + 'px'; if (pos_left === -1) { this.popover.style.left = 'auto'; this.popover.style.right = pos_right+ 'px'; } else this.popover.style.left = pos_left+ 'px'; return this.popover; }, /** * Returns the DOM element associated with the id this widget is bind to. * @method element * @example var mypopover = UI.popover("popoverid").element(); */ element: function () { return this.popover; } }; ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-build.sh0000755000015600001650000000136212654470322025131 0ustar pbuserpbgroup00000000000000#!/bin/bash # # Copyright 2014 Canonical Ltd # Authors: # Kyle Nitzsche # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /** * A Button. Note the Ubuntu CSS style classes: positive, information, secondary, and negative * @class Button * @constructor * @namespace UbuntuUI * @example Javascript access: var button = UI.button("buttonID"); */ var Button = function (id) { this.id = id; }; Button.prototype = { /** * Associate a function with the button's Click event * @method click * @param {Function} callback - The function to execute on click * @example UI.button("buttonid").click(function(){ console.log("clicked"); }); */ click: function (callback) { if ( ! document.getElementById(this.id)) { throw "Invalid button ID: " + String(this.id); } new FastButton(document.getElementById(this.id), callback); }, /** * Returns the DOM element associated with the id this widget is bind to. * @method element * @return {DOMElement} * @example var mybutton = UI.button("buttonid").element(); */ element: function() { return document.getElementById(this.id); } }; ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/tabs.js0000755000015600001650000002364112654470322023477 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * */ /** * One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application. Tabs are defined from within the Header part of your application HTML. See the Header class for more information. Declare the Header and Tabs in HTML as a direct child of the top level Page as a sibling to the content div. * @class Tabs * @constructor * @namespace UbuntuUI * @example
  • Main
  • Two
[...]
[...]
JavaScript access: UI.tabs.METHOD(); */ var Tabs = (function () { var activeTab; function Tabs(tabs) { if (tabs == null) { return; } this._tabs = tabs; this._header = this._tabs.parentNode; this._tabsitems = this.tabChildren; [].forEach.call(this._tabsitems, function (elm) { elm.addEventListener('click', this.__onClicked.bind(this, elm), false); }.bind(this)); // initialize default page this.__setupInitialTabVisibility(); }; Tabs.prototype = { /** * Return the index of the selected tab * @property selectedTabIndex * @return {Integer} - The zero based index of the element in the list of tabs or -1 */ get selectedTabIndex() { return Array.prototype.slice.call(this._tabs.querySelectorAll('li')).indexOf(activeTab); }, /** * Sets the index of the selected tab * @property selectedTabIndex * @param {Integer} - The zero based index of the element in the list of tabs */ set selectedTabIndex(index) { var tabs = Array.prototype.slice.call(this._tabs.querySelectorAll('li')); if (index < 0 || index >= tabs.length) return; this.__doSelectTab(tabs[index]); }, /** * Return the page associated with the currently selected tab * * @deprecated * * @property currentPage * @return {Element} - Page DOM element associated with the currently selected tab or null */ get currentPage() { return this.selectedTab ? this.selectedTab.querySelector('page') : null; }, /** * Return the currently selected tab element * * @property selectedTab * @return {Element} - The currently selected element or null */ get selectedTab() { var selected = null; if (activeTab) { try { selected = document.getElementBydId(activeTab.getAttribute('data-page')); } catch (e) {}; } return selected; }, /** * Return the number of tab elements in the header * @property count * @return {Integer} - Number of tab elements */ get count() { return this.tabChildren.length; }, /** * Return the list of DOM elements of the tab * * @deprecated * * @property tabChildren * @return {Elements} - List of DOM elements in the tab */ get tabChildren() { return this._tabs.querySelectorAll('li'); }, /** * @private */ __setupInitialTabVisibility: function () { this._firstrun = true; PAGESTACK_BACK_ID = 'ubuntu-pagestack-back'; TAB_BTN_ID = 'ubuntu-tabs-btn'; var backbtn = document.createElement('button'); backbtn.setAttribute('data-role', 'back-btn'); backbtn.setAttribute('id', PAGESTACK_BACK_ID + '-' + Math.floor(Math.random())); backbtn.disabled = true; if(this._tabs.childElementCount > 1) { this._tabsbtn = document.createElement('button'); this._tabsbtn.setAttribute('data-role', 'tabs-btn'); this._tabsbtn.setAttribute('id', TAB_BTN_ID + '-' + Math.floor(Math.random())); this._tabsbtn.style.display = 'block'; } this._content = document.querySelector('[data-role="content"]'); this._overlay = document.createElement('div'); this._overlay.setAttribute('data-role', 'overlay'); this._content.appendChild(this._overlay); this._tabtitle = document.createElement('div'); this._tabtitle.setAttribute('data-role', 'tabtitle'); var tabtitle_value = document.createTextNode('Main'); this._tabtitle.appendChild(tabtitle_value); var tab = this._tabs.querySelector('[data-role="tabitem"]:first-child'); tab.classList.remove('inactive'); tab.classList.add('active'); this._header.innerHTML = ''; this._header.appendChild(backbtn); if(this._tabs.childElementCount > 1) { this._header.appendChild(this._tabsbtn); this._header.appendChild(this._tabs); var self = this; this._tabsbtn.onclick = function (e) { self.__toggleTabs(); e.preventDefault(); }; } else { this._tabtitle.style.marginLeft = '16px'; } this._header.appendChild(this._tabtitle); var self = this; this._overlay.onclick = function (e) { self.__hideMenus(); var elm = document.elementFromPoint(e.pageX, e.pageY); e.preventDefault(); }; tab.click(); }, /** * @private */ __onClicked: function (selectedTab, e) { if (selectedTab == null) return; this.__doSelectTab(selectedTab); e.preventDefault(); }, /** * @private */ __updateActiveTabContent: function (newActiveTab) { this._tabtitle.textContent = newActiveTab.innerHTML; }, /** * @private */ __dispatchTabChangedEvent: function (tabId) { this._evt = document.createEvent('Event'); this._evt.initEvent('tabchanged', true, true); this._evt.infos = { tabId: tabId }; this._tabs.dispatchEvent(this._evt); }, /** * @private */ __doSelectTab: function (tabElement) { if (!tabElement) return; if (tabElement.getAttribute("data-role") !== 'tabitem') return; this.__updateActiveTabContent(tabElement); var targetPageId = tabElement.getAttribute('data-page'); this.__activate(targetPageId); this.__dispatchTabChangedEvent(targetPageId); if (this._firstrun) { this._firstrun = false; } else { this.__toggleTabs(); } }, /** * @private */ __activate: function (id) { if (!id || typeof (id) !== 'string') return; activeTab = this._tabs.querySelector('[data-page="' + id + '"]'); if (!activeTab) return; [].forEach.call(this._tabs.querySelectorAll('[data-role="tabitem"]'), function (e) { e.classList.remove('active'); e.classList.remove('inactive'); }); activeTab.classList.add('active'); }, /** * @private */ onTabChanged: function (callback) { this._tabs.addEventListener("tabchanged", callback); }, /** * @private */ __toggleTabs: function () { this._tabs.classList.toggle('opened'); this._overlay.classList.toggle('active'); var tabsActions = document.querySelector('[data-role="actions"]'); if (tabsActions && tabsActions.querySelector('.opened') !== null) tabsActions.querySelector('.opened').classList.remove('opened'); }, /** * @private */ __hideMenus: function () { this._tabs.classList.remove('opened'); this._overlay.classList.remove('active'); var tabsActions = document.querySelector('[data-role="actions"]'); if (tabsActions && tabsActions.querySelector('.opened') !== null) tabsActions.querySelector('.opened').classList.remove('opened'); } }; return Tabs; })(); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/tab.js0000755000015600001650000001030412654470322023304 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2014 Canonical Ltd * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /** * One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application. A Tab represents the UI element that hosts your tab content. This UI element is being activated by the user selecting it as part of the Header element. * @class Tab * @constructor * @namespace UbuntuUI * @example
  • Main
  • Two
[...]
[...]
JavaScript access: var tab = UI.tab("tabID"); */ var Tab = function (id) { this.id = id; }; Tab.prototype = { /** * Returns the DOM element associated with the selector this widget is bind to. * @method element * @return {DOMElement} * @example var mytab = UI.tab("tabid").element(); */ element: function () { return document.getElementById(this.id); }, /** * Deactivates the current tab. * @method {} deactivate */ deactivate: function () { this.__updateVisibleState('none'); }, /** * Activates the current tab. * @method {} activate */ activate: function (id) { this.__hideVisibleSibling(); this.__updateVisibleState('block'); }, /** * Validates that a given DOM node element is a Ubuntu UI Tab. * @method {DOM Element} isTab * @return {Boolean} if the DOM element is a tab */ isTab: function (element) { return element.tagName.toLowerCase() === 'div' && element.hasAttribute('data-role') && element.getAttribute('data-role') === 'tab'; }, /** * @private */ __updateVisibleState: function (displayStyle) { if (!this.__isValidId(this.id)) return; var tab = document.getElementById(this.id); if (!this.isTab(tab)) { return; } tab.style.display = displayStyle; [].forEach.call( document.querySelectorAll('[data-role="actions-wrapper"]'), function(el) { el.style.display = 'none'; }); var tab_actions = document.getElementById("actions_" + this.id); if (tab_actions !== null) { tab_actions.style.display = 'block'; } }, /** * @private */ __hideVisibleSibling: function () { if (!this.__isValidId(this.id)) return; var tab = document.getElementById(this.id); if (!this.isTab(tab)) { return; } var children = tab.parentNode.children; for (var idx = 0; idx < children.length; ++idx) { if (this.isTab(children[idx])) { children[idx].style.display = 'none'; } } }, /** * @private */ __isValidId: function (id) { return id && typeof (id) === 'string'; }, /** * @private */ get __thisSelector() { return "#" + this.id; } };ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/pagestacks.js0000644000015600001650000001537012654470322024670 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /** * The Pagestack manages all Pages in a stack data structure. Initially, the Pagestack contains no Pages. The push() method is normally executed on load to display the app starting page. UI.pagestack.push("pageID") The topmost Page on the Pagestack is always displayed. The Pagestack is declared as a direct child of the content div. #####Default application wide footer The Pagestack contains a default footer (represented in JavaScript as a Toolbar), even if you do not declare one in HTML. The footer has a single Back button. #####Customized application wide footer This application-wide footer can be customized (for example, you can add Buttons) by declaring a footer as a direct child of the pagestack div (see example). ######Page specific footers A page may declare a page-specific footer as a child element. * @class Pagestack * @namespace UbuntuUI * @constructor * @example
[...]
[...]
[...]
JavaScript access: UI.pagestack.METHOD(); */ var Pagestack = (function () { function __safeCall(f, args, errorfunc) { if (typeof (f) !== 'function') return; try { f.apply(null, args); } catch (e) { if (errorfunc && typeof (errorfunc) === 'function') errorfunc(e) } }; function Pagestack(pageStack) { this._pages = []; this._pageStack = pageStack; this._backBtn = document.querySelector('[data-role="back-btn"]'); }; Pagestack.prototype = { /** * Push a page to the top of this pagestack * @method push * @param {String} id - The id attribute of the page element to be pushed * @param {Object} properties - A list of properties passed down to the page that is to be activated */ push: function (id, properties) { try { __safeCall(this.__setAllPagesVisibility.bind(this), [false]); (new Page(id)).activate(properties); this._pages.push(id); this.__dispatchPageChanged(this.currentPage()); } catch (e) {} }, /** * Checks for zero pages in this pagestack * @method isEmpty * @return {Boolean} - True when this pagestack has no pages, else false */ isEmpty: function () { return this._pages.length === 0; }, /** * Gets the id attribute of the page element on top of this pagestack * @method currentPage * @return {PageID|Null} - The topmost page's id attribute, else null when there are no pages on this pagestack */ currentPage: function () { return this.isEmpty() ? null : this._pages[this._pages.length - 1]; }, /** * Gets the number of pages in this pagestack * @method depth * @return {Number} - The number of pages in this pagestack */ depth: function () { return this._pages.length; }, /** * Clears the whole page stack * @method clear */ clear: function () { if (this.isEmpty()) return; __safeCall(Page.prototype.deactivate.bind(new Page(this.currentPage())), []); this._pages = []; }, /** * Pops the current page off this pagestack, which causes the next page to become the top page and to display * @method pop */ pop: function () { if (this.isEmpty()) return; __safeCall(Page.prototype.deactivate.bind(new Page(this.currentPage())), []); this._pages.pop(); __safeCall(Page.prototype.activate.bind(new Page(this.currentPage())), []); this.__dispatchPageChanged(this.currentPage()); }, onPageChanged : function(callback){ this._pageStack.addEventListener("pagechanged", callback); }, /** * @private */ __setAllPagesVisibility: function (visible) { var visibility = visible ? "block" : "none"; var children = [].slice.call(this._pageStack.children); children.forEach(function(element) { var pageHelper = new Page(); if (pageHelper.isPage(element)) { element.style.display = visibility; } }); }, /** * @private */ __isPage: function (element) { return element.getAttribute('data-role') === 'page'; }, /** * @private */ __dispatchPageChanged: function (page) { this._backBtn.disabled = (this.depth() == 1); [].forEach.call( document.querySelectorAll('[data-role="actions-wrapper"]'), function(el) { el.style.display = 'none'; }); var pageActions = document.getElementById("actions_" + page); if (pageActions !== null) { pageActions.style.display = 'block'; } var event = document.createEvent('Event'); event.initEvent('pagechanged',true,true); event.page = page; this._pageStack.dispatchEvent(event); }, }; return Pagestack; })(); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/progress.js0000644000015600001650000000615412654470322024407 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ /** * A Progress. Note the Ubuntu CSS style classes: infinite * @class Progress * @constructor * @namespace UbuntuUI * @example Javascript access: var pre = UI.progress("progressID"); */ var Progress = (function () { function Progress(id) { this.id = id; this.max = 1; this.ele = this.element(); this.__setupMessage(); } Progress.prototype = { /** * Returns the DOM element associated with the id this widget is bind to. * @method element * @example var myprogress = UI.progress("progressid").element(); */ element: function() { if(document.getElementById(this.id)) { return document.getElementById(this.id); } }, /** * Updates the value of the progress bar * @method update * @example myprogress.update(30); */ update: function(value) { if(value != null && this.__IsNumeric(value)) { this.ele.value = value; this.__updateMessage(value); }else{ console.error('Progress bar value element is NaN - ID:', this.id); } }, /** * @private */ __setupMessage: function() { if(this.ele) { if(this.ele.getAttribute("max") && this.__IsNumeric(this.ele.getAttribute("max"))) { this.max = this.ele.getAttribute("max"); }else{ console.error('Progress bar max element is NaN - ID:', this.id); } if(this.ele.getAttribute("value")) { this.update(this.ele.getAttribute("value")); } }else{ console.error('Progress bar missing - ID:', this.id); } }, /** * @private */ __updateMessage: function(value) { this.ele.setAttribute('data-percentage', Math.max(0, Math.min(100, Math.floor((100 / this.max) * value))) + '%'); }, /** * @private */ __IsNumeric: function(n) { return !isNaN(parseFloat(n)) && isFinite(n); }, }; return Progress; })(); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/DOCSREADME.txt0000644000015600001650000000072012654470322024345 0ustar pbuserpbgroup00000000000000The docs build systems is yudocjs. Info: http://yui.github.io/yuidoc/syntax/ Yuidocjs is installed via npm, globally: # install npm sudo apt-get install npm nodejs-legacy # use npm to install yuidocjs globally sudo npm -g install yuidocjs # get ubuntu-html5-theme source branch bzr branch lp:ubuntu-html5-theme # move to the js dir cd ubuntu-html5-theme/0.1/ambiance/js # generate the docs from source ./yuidoc-build.sh # docs are in new ./docsbuild/ dir ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/0000755000015600001650000000000012654470531024575 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/0000755000015600001650000000000012654470531026414 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/events.handlebars0000644000015600001650000000234412654470322031746 0ustar pbuserpbgroup00000000000000
`{{name}}` {{#if type}}<{{#crossLink type}}{{/crossLink}}>{{/if}} {{#if extended_from}}`/* Extended from {{extended_from}} */`{{/if}} {{#if overwritten_from}}`/* Overwritten from {{name}} */`{{/if}}
`{{file}}:{{line}}` {{{eventDescription}}} {{#if params}} Extra event object properties:
    {{#params}}
  • {{#if optional}} `[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]` <{{#crossLink type}}{{/crossLink}}> {{else}} `{{name}}` <{{#crossLink type}}{{/crossLink}}> {{/if}} {{#if multiple}} (*..n) {{/if}} {{{description}}} {{#if props}}
      {{#props}}
    • `{{name}}` <{{#crossLink type}}{{/crossLink}}> {{{description}}} {{/props}}
    {{/if}}
  • {{/params}}
{{/if}}
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/sidebar.handlebars0000644000015600001650000000474212654470322032057 0ustar pbuserpbgroup00000000000000 {{#if methods}} {{/if}} {{#if events}} {{/if}} {{#if props}} {{/if}} {{#if attributes}} {{/if}} {{#if fileTree}} {{/if}} ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/props.handlebars0000644000015600001650000000062712654470322031607 0ustar pbuserpbgroup00000000000000
`{{name}}` <{{#crossLink type}}{{/crossLink}}>{{#if final}} (final){{/if}}{{#if static}} (static){{/if}}
`{{file}}:{{line}}` {{{propertyDescription}}} {{#if example}}
Example
{{{example}}} {{/if}}
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/module.handlebars0000644000015600001650000000155012654470322031725 0ustar pbuserpbgroup00000000000000

{{moduleName}}

{{{moduleDescription}}}
{{#if moduleClasses}}

This module has the following classes:

{{/if}}
{{#if subModules}}

This module has the following submodules:

{{/if}}


Module description found: `{{file}}:{{line}}` ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/attrs.handlebars0000644000015600001650000000257512654470322031605 0ustar pbuserpbgroup00000000000000
`{{name}}` {{#if type}}<{{#crossLink type}}{{/crossLink}}>{{/if}} {{#if extended_from}}`/* Extended from {{extended_from}} */`{{/if}} {{#if overwritten_from}}`/* Overwritten from {{name}} */`{{/if}}
`{{file}}:{{line}}` {{{attrDescription}}} {{#if emit}}
Fires: `{{name}}Change(e)`

Fires when the value for the configuration attribute `{{name}}` is changed. You can listen for the event using the `on` method if you wish to be notified before the attribute's value has changed, or using the `after` method if you wish to be notified after the attribute's value has changed.

Parameters:
`e` <EventFacade> An Event Facade object with the following attribute specific properties added:
  • `prevVal` The value of the attribute, prior to it being set
  • `newVal` The value the attribute is to be set to
  • `attrName` The name of the attribute being set
  • `subAttrName` If setting a property within the attribute's value, the name of the sub-attribute property being set
{{/if}}
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/files.handlebars0000644000015600001650000000012412654470322031536 0ustar pbuserpbgroup00000000000000

{{fileName}}

{{fileData}}
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/index.handlebars0000644000015600001650000000756012654470322031556 0ustar pbuserpbgroup00000000000000

Welcome to Ubuntu HTML5 API Docs version 0.1

These pages provide reference docs for the Ubunbtu HTML5 framework.

See developer.ubuntu.com for more information on writing Ubuntu HTML5 apps, including: using the Ubuntu SDK, creating HTML5 app projects, importing Ubuntu HTML5 CSS and JavaScript into your app, and more.

Ubuntu HTML5 widgets

The Ubuntun HTML5 framework provides a set of "widgets" you use to build an application in the Ubuntu style (see design.ubuntu.com for descriptions of Ubuntu app "building blocks" with links to APIs for each supported implementation toolkit). For example, an Ubuntu HTML5 app has a dynamic Header with Tabs that together provide navigation through the app's Pages. Pages may contain Lists, Popovers, Buttons, Shapes, and a lot more. The app has a Footer (also called a Toolbar) to which you can add Buttons. There are many options and the list keeps growing!

Each widget has its HTML part, a corresponding JavaScript object (many of which provide additional methods), and CSS styles.

What you need to know

To write Ubuntu HTML5 apps, you need to know:

  • How to declare each widget type in HTML
  • How to acces the JavaScript widget objects and use their methods
  • How to initialize the Ubuntu HTML5 framework at app load time

These topics are introduced here and explained in the class documentation.

Elements and special attributes

Ubuntu HTML5 apps use normal HTML/HTML5 elements (like <div>, <section>, <ul>, and so on). However, special attributes are added to some key elements to declare them as Ubuntu HTML5 elements. This connects them with the Ubuntu HTML5 JavaScript framework. The data-role attribute is often used. Its value indicates the type of Ubuntu HTML5 element. For example, here's a button: <button data-role="button">.

Making correct HTML declarations is necessary to connect your DOM elements to the Ubuntu HTML5 JavaScript framework and to Ubuntu HTML CSS styles. See the JavaScript class docs for sample HTML declarations.

id attributes

You can declare most Ubuntu HTML5 elements without id attributes. They will pick up the CSS styles and look fine. But, you generally need an id attribute to access the corresponding JavaScript objects. So it's a good idea to add them.

JavaScript classes and methods

Almost every Ubuntu HTML5 DOM element has a corresponding Ubuntu HTML5 JavaScript object. These are created automatically when you create an UbuntuUI object and execute its init() method. (This is usually done at startup, for example in the window.onload function).

Many of these classes/objects have additional methods. For example, the List class provides methods to add items to the list, remove an item, apply a function to all items, and more.

How these docs are organized

These pages or organized by the Ubuntu HTML5 JavaScript classes. Each class has an example showing how the corresponding HTML is declared (as needed). And of course each class has API documentation explaining usage of all (public) methods.

The single most important class is UbuntuUI, so start there.

Then, an Ubuntu HTML5 app is structured as a PageStack of Pages, so be sure to visit those classes.

Ubuntu HTML5 CSS

Be sure to check out the Ubuntu HTML5 CSS files you import into your app. They provide a set of styles that theme the HTML5 widgets to the Ubuntu app design and style.

Let's grow this!

Let's work together to keep HTML5 as a top-notch app development framework on Ubuntu. Everyone can help by filing bugs, triaging them, and of course, fixing them. So let's get to work writing apps!

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/classes.handlebars0000644000015600001650000000324112654470322032074 0ustar pbuserpbgroup00000000000000

Class {{moduleName}}

{{#if uses}} Uses: {{#each uses}} {{this}} {{/each}}
{{/if}} {{#if extension_for}} Extension For: {{#each extension_for}} {{this}} {{/each}}
{{/if}} {{#if extends}} Extends: {{#crossLink extends}}{{/crossLink}}
{{/if}} Class defined in: `{{file}}:{{line}}`
{{{classDescription}}}
{{#if is_constructor}} {{#is_constructor}} {{>method}} {{/is_constructor}} {{/if}}
{{#if methods}}
{{#methods}} {{>method}} {{/methods}}
{{/if}} {{#if properties}}
{{#properties}} {{>props}} {{/properties}}
{{/if}} {{#if attrs}}
{{#attrs}} {{>attrs}} {{/attrs}}
{{/if}} {{#if events}}
{{#events}} {{>events}} {{/events}}
{{/if}}
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/partials/method.handlebars0000644000015600001650000000423412654470322031722 0ustar pbuserpbgroup00000000000000
{{#if final}}final {{/if}}{{#if returnType}}{{#crossLink returnType}}{{/crossLink}} {{/if}}`{{name}}`( `{{paramsList}} ` ) {{#if access}}`/* {{access}} method */`{{/if}}
{{#if overwritten_from}} Defined in {{overwritten_from/class}} but overwritten locally: {{else}} {{#if extended_from}} Defined in {{extended_from}}: {{/if}} {{/if}} `{{file}}:{{line}}`
{{{methodDescription}}} {{#if params}} Parameters:
    {{#params}}
  • {{#if optional}} `[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]` <{{#crossLink type}}{{/crossLink}}> {{else}} `{{name}}` <{{#crossLink type}}{{/crossLink}}> {{/if}} {{#if multiple}} (*..n) {{/if}} {{{description}}} {{#if props}}
      {{#props}}
    • `{{name}}` <{{#crossLink type}}{{/crossLink}}> {{{description}}} {{#if props}}
        {{#props}}
      • `{{name}}` <{{#crossLink type}}{{/crossLink}}> {{{description}}}
      • {{/props}}
      {{/if}}
    • {{/props}}
    {{/if}}
  • {{/params}}
{{/if}} {{#if return}} {{#return}}
Returns: {{#if type}}<{{#crossLink type}}{{/crossLink}}> {{/if}}{{{description}}}
{{/return}} {{/if}} {{#if example}}
Example
{{{example}}} {{/if}}
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/layouts/0000755000015600001650000000000012654470531026275 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/layouts/main.handlebars0000644000015600001650000000227612654470322031253 0ustar pbuserpbgroup00000000000000 {{htmlTitle}}
API Docs for: {{projectVersion}}
{{>layout_content}}
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/theme.json0000644000015600001650000000025512654470322026572 0ustar pbuserpbgroup00000000000000{ "yuiGridsUrl": "http://yui.yahooapis.com/3.8.0pr2/build/cssgrids/cssgrids-min.css", "yuiSeedUrl": "http://yui.yahooapis.com/combo?3.8.0pr2/build/yui/yui-min.js" } ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/0000755000015600001650000000000012654470530026076 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/js/0000755000015600001650000000000012654470531026513 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/js/tabs.js0000644000015600001650000000537412654470322030011 0ustar pbuserpbgroup00000000000000/* * Copyright 2011 Yahoo! Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI({ insertBefore: 'site_styles' }).use('tabview', function(Y) { var classdocs = Y.one('#classdocs'), tabviewIndexTable = {}; if (classdocs) { if (classdocs.all('li').size()) { var tabview = new Y.TabView({ srcNode: classdocs }); tabview.render(); classdocs.all('li a').each(function (item, index) { var hash = item.get(['hash']); type = hash.substring(1); if (!tabviewIndexTable[type]) { tabviewIndexTable[type] = index; } }) Y.all('.sidebox.on-page').each(function (item, index) { var children = item.all('li a'); children.each(function (cItem, cIndex) { return function () { var handleClick = function (e) { var node = Y.one(this), hash = node.get(['hash']), hashValue = hash.substring(1).split('_'), type = hashValue.shift(), ogKey = hashValue.join('_'); // in case the hash had other underscores if (tabviewIndexTable[type] > -1 && tabviewIndexTable[type] !== currentTab) { currentTab = tabviewIndexTable[type]; tabview.selectChild(tabviewIndexTable[type]); } } Y.on('click', handleClick, cItem) }() }) }); } } }); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/js/yui-prettify.js0000644000015600001650000000377512654470322031535 0ustar pbuserpbgroup00000000000000/* * Copyright 2011 Yahoo! Inc. * All rights reserved. *- * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. *- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI().use('node', function(Y) { var code = Y.all('.prettyprint.linenums'); if (code.size()) { code.each(function(c) { var lis = c.all('ol li'), l = 1; lis.each(function(n) { n.prepend(''); l++; }); }); var h = location.hash; location.hash = ''; h = h.replace('LINE_', 'LINENUM_'); location.hash = h; } }); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/css/0000755000015600001650000000000012654470531026667 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/css/main.css0000644000015600001650000002421212654470322030324 0ustar pbuserpbgroup00000000000000/* Font sizes for all selectors other than the body are given in percentages, with 100% equal to 13px. To calculate a font size percentage, multiply the desired size in pixels by 7.6923076923. Here's a quick lookup table: 10px - 76.923% 11px - 84.615% 12px - 92.308% 13px - 100% 14px - 107.692% 15px - 115.385% 16px - 123.077% 17px - 130.769% 18px - 138.462% 19px - 146.154% 20px - 153.846% */ html { background: #fff; color: #333; overflow-y: scroll; } body { font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif; margin: 0; padding: 0; } /* -- Links ----------------------------------------------------------------- */ a { color: #DD4814; text-decoration: none; } a:hover { text-decoration: underline; } /* "Jump to Table of Contents" link is shown to assistive tools, but hidden from sight until it's focused. */ .jump { position: absolute; padding: 3px 6px; left: -99999px; top: 0; } .jump:focus { left: 40%; } /* -- Paragraphs ------------------------------------------------------------ */ p { margin: 1.3em 0; } dd p, td p { margin-bottom: 0; } dd p:first-child, td p:first-child { margin-top: 0; } /* -- Headings -------------------------------------------------------------- */ h1, h2, h3, h4, h5, h6 { color: #DD4814 font-family: 'Ubuntu', sans-serif; font-weight: bold; line-height: 1.1; margin: 1.1em 0 0.5em; } h1 { font-size: 184.6%; color: #30418C; margin: 0.75em 0 0.5em; } h2 { font-size: 153.846%; color: #E48A2B; } h3 { font-size: 138.462%; } h4 { border-bottom: 1px solid #DBDFEA; color: #E48A2B; font-size: 115.385%; font-weight: normal; padding-bottom: 2px; } h5, h6 { font-size: 107.692%; } /* -- Code and examples ----------------------------------------------------- */ code, kbd, pre, samp { font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 92.308%; line-height: 1.35; } p code, p kbd, p samp { background: #FCFBFA; border: 1px solid #EFEEED; padding: 0 3px; } a code, a kbd, a samp, pre code, pre kbd, pre samp, table code, table kbd, table samp, .intro code, .intro kbd, .intro samp, .toc code, .toc kbd, .toc samp { background: none; border: none; padding: 0; } pre.code, pre.terminal, pre.cmd { overflow-x: auto; *overflow-x: scroll; padding: 0.3em 0.6em; } pre.code { background: #FCFBFA; border: 1px solid #EFEEED; border-left-width: 5px; } pre.terminal, pre.cmd { background: #F0EFFC; border: 1px solid #D0CBFB; border-left: 5px solid #D0CBFB; } /* Don't reduce the font size of // elements inside
   blocks. */
pre code, pre kbd, pre samp { font-size: 100%; }

/* Used to denote text that shouldn't be selectable, such as line numbers or
   shell prompts. Guess which browser this doesn't work in. */
.noselect {
    -moz-user-select: -moz-none;
    -khtml-user-select: none;
    -webkit-user-select: none;
    -o-user-select: none;
    user-select: none;
}

/* -- Lists ----------------------------------------------------------------- */
dd { margin: 0.2em 0 0.7em 1em; }
dl { margin: 1em 0; }
dt { font-weight: bold; }

/* -- Tables ---------------------------------------------------------------- */
caption, th { text-align: left; }

table {
    border-collapse: collapse;
    width: 100%;
}

td, th {
    border: 1px solid #fff;
    padding: 5px 12px;
    vertical-align: top;
}

td { background: #E6E9F5; }
td dl { margin: 0; }
td dl dl { margin: 1em 0; }
td pre:first-child { margin-top: 0; }

th {
    background: #D2D7E6;/*#97A0BF*/
    border-bottom: none;
    border-top: none;
    color: #000;/*#FFF1D5*/
    font-family: 'Trebuchet MS', sans-serif;
    font-weight: bold;
    line-height: 1.3;
    white-space: nowrap;
}


/* -- Layout and Content ---------------------------------------------------- */
#doc {
    margin: auto;
    min-width: 1024px;
}

#main { width: 754px; }
#sidebar { width: 270px; margin: 0 15px; }

.content { padding: 0 20px 0 25px; }

/* -- Sidebar --------------------------------------------------------------- */
.sidebox {
    background: #F9F9FC;/*E6E9F5*/
    border: 1px solid #D4D8EB;

    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    border-radius: 4px;
    -moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
    -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
    box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Helvetica', 'Arial', sans-serif;
    margin: 0 0 15px 0;
    padding-bottom: 1px;
}

.sidebox h2 {
    background: #E5E6F1;
    -moz-border-radius: 4px 4px 0 0;
    -webkit-border-radius: 4px 4px 0 0;
    border-radius: 4px 4px 0 0;
    color: #5E6BA4;
    font-weight: bold;
    font-size: 107.692%;
    margin: 0;
    padding: 4px 7px 5px;
}

.sidebox .bd {
    font-size: 84.615%;
    padding: 0 5px 0 8px;
}

.sidebox li { list-style-type: disc; color:#D4D5E3; }

.sidebox ol, .sidebox ul {
    margin-left: 0;
    padding-left: 16px;
}

.sidebox ol ol, .sidebox ol ul,
.sidebox ul ol, .sidebox ul ul {
    margin: 0;
    padding-left: 16px;
}

/* -- Table of Contents ----------------------------------------------------- */

/* The #toc id refers to the single global table of contents, while the .toc
   class refers to generic TOC lists that could be used throughout the page. */

.toc code, .toc kbd, .toc samp { font-size: 100%; }
.toc li { font-weight: bold; }
.toc li li { font-weight: normal; }

/* -- Intro and Example Boxes ----------------------------------------------- */
.intro, .example { margin-bottom: 2em; }

.example {
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    border-radius: 4px;
    -moz-box-shadow: 0 0 5px #bfbfbf;
    -webkit-box-shadow: 0 0 5px #bfbfbf;
    box-shadow: 0 0 5px #bfbfbf;
    padding: 1em;
}

.intro {
    background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
}

/* -- Other Styles ---------------------------------------------------------- */

/* These are probably YUI-specific, and should be moved out of Selleck's default
   theme. */

.button {
    border: 1px solid #dadada;
    -moz-border-radius: 3px;
    -webkit-border-radius: 3px;
    border-radius: 3px;
    color: #444;
    display: inline-block;
    font-family: Helvetica, Arial, sans-serif;
    font-size: 92.308%;
    font-weight: bold;
    padding: 4px 13px 3px;
    -moz-text-shadow: 1px 1px 0 #fff;
    -webkit-text-shadow: 1px 1px 0 #fff;
    text-shadow: 1px 1px 0 #fff;
    white-space: nowrap;

    background: #EFEFEF; /* old browsers */
    background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
}

.button:hover {
    border-color: #466899;
    color: #fff;
    text-decoration: none;
    -moz-text-shadow: 1px 1px 0 #222;
    -webkit-text-shadow: 1px 1px 0 #222;
    text-shadow: 1px 1px 0 #222;

    background: #6396D8; /* old browsers */
    background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
}

.newwindow { text-align: center; }

.header .version em {
    display: block;
    text-align: right;
}

.yui3-skin-sam #classdocs .yui3-tabview-panel {
    background-color: transparent;
}

.yui3-skin-sam #classdocs .yui3-tabview-panel {
    border: none;
}

.yui3-skin-sam .yui3-tabview .yui3-tab,
.yui3-skin-sam .yui3-tabview .yui3-tab-selected,
.yui3-skin-sam .yui3-tabview .yui3-tab-hover {
    background: -moz-linear-gradient(center top , #F4F0EC 0%, #D6D2CE 100%) repeat scroll 0 0 transparent;
    border-bottom: 1px solid #DEDCD9;
    border-right: 1px solid #CDCBC8;
    border-left: 1px solid #CDCBC8;
    border-top: 1px solid #DADADA;
    color: #333333;
    text-decoration: none;
}
.yui3-skin-sam .yui3-tabview .yui3-tab-label,
.yui3-skin-sam .yui3-tabview .yui3-tab-selected .yui3-tab-label {
    border: none;
    background: none;
    font-size: 100%;
    color: #000;
}

.yui3-skin-sam .yui3-tabview .yui3-tab-selected,
.yui3-skin-sam .yui3-tabview .yui3-tab-hover {
    background: none;
    background-color: #fff;
    border-bottom-color: #FFFFFF;
    border-top: 2px solid #8193C9;
    font-weight: bold;
    color: #000;

}

.yui3-skin-sam .yui3-tabview-list {
    border-color: #DFDFDF;
    border-width: 0 0 1px; 
}


a.external {
    background-image: url(external-small.png);
    background-repeat: no-repeat;
    background-position: 0 0;
    padding-left: 16px;
}

#classdocs .item {
    border-bottom: 1px solid #466899;
    margin: 1em 0;
    padding: 1.5em;
}

#classdocs .item .params p,
    #classdocs .item .returns p,{
    display: inline;
}

#classdocs .item em code, #classdocs .item em.comment {
    color: green;
}

#classdocs .item em.comment a {
    color: green;
    text-decoration: underline;
}

#classdocs .foundat {
    font-size: 11px;
    font-style: normal;
}

.attrs .emits {
    margin-left: 2em;
    padding: .5em;
    border-left: 1px dashed #ccc;
}

abbr {
    border-bottom: 1px dashed #ccc;
    font-size: 80%;
    cursor: help;
}

.prettyprint li.L0, 
.prettyprint li.L1, 
.prettyprint li.L2, 
.prettyprint li.L3, 
.prettyprint li.L5, 
.prettyprint li.L6, 
.prettyprint li.L7, 
.prettyprint li.L8 {
    list-style: decimal;
}

ul li p {
    margin-top: 0;
}

.method .name {
    font-size: 110%;
}

#hd {
    background: -moz-linear-gradient(center top , #DCDBD9 0%, #F6F5F3 100%) repeat scroll 0 0 transparent;
    border-bottom: 1px solid #DFDFDF;
    padding: 0 15px 1px 20px;
    margin-bottom: 15px;
}

#hd img {
    margin-right: 10px;
    vertical-align: middle;
}

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/css/logo.png0000644000015600001650000000135512654470322030337 0ustar  pbuserpbgroup00000000000000PNG


IHDR=29PLTEvO_1S#ƶl{]j@H9	pHYstIME
&	fEGIDAThv eQ;,.i]	9=Ï	QxBHB$$!	IȿTobH
L,LAJ!z2@{}q%>D*()29zfv0v'xY|~2ܾHIȔdY.Ҭ$FH[62MT%a>$XmSUhiKY.kUdYps6#È+ټV`HU2z/[Y
̷]PT&[o^|ߗuǞl 5e]6UǶEu<*5d+BoIHB$$!	JnɒőIENDB`ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/css/external-small.png0000644000015600001650000000075312654470322032330 0ustar  pbuserpbgroup00000000000000PNG


IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%B@,0]VVV0affȊ=8JOy %pJջ+30¿}sʋ`n|dx
mXa |ȹWpA+ca|u=zϰp-l\w01nCy?*Yr%cfxÿ8
`g2ȉ0!GA[EV66>Ӏ'E]AOCAY^#.S>>#񶉝
"ÏOv%w@FX^`ddR|8 wX
	 OƓIENDB`ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/0000755000015600001650000000000012654470530027373 5ustar  pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/0000755000015600001650000000000012654470531031242 5ustar  pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/COPYING0000644000015600001650000002613612654470322032303 0ustar  pbuserpbgroup00000000000000
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
././@LongLink0000000000000000000000000000015400000000000011215 Lustar  00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/prettify-min.jsubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/prettify0000644000015600001650000004564712654470322033051 0ustar  pbuserpbgroup00000000000000/*
 * Copyright 2011 Yahoo! Inc.
 * All rights reserved.
 *-
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Yahoo! Inc. nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *-
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;atau[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
././@LongLink0000000000000000000000000000015500000000000011216 Lustar  00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/prettify-min.cssubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/prettify0000644000015600001650000000124312654470322033031 0ustar  pbuserpbgroup00000000000000.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}././@LongLink0000000000000000000000000000015100000000000011212 Lustar  00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/CHANGES.htmlubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/CHANGES.0000644000015600001650000001370412654470322032316 0ustar  pbuserpbgroup00000000000000
  
    
    Change Log
  
  
    README

    

Known Issues

  • Perl formatting is really crappy. Partly because the author is lazy and partly because Perl is hard to parse.
  • On some browsers, <code> elements with newlines in the text which use CSS to specify white-space:pre will have the newlines improperly stripped if the element is not attached to the document at the time the stripping is done. Also, on IE 6, all newlines will be stripped from <code> elements because of the way IE6 produces innerHTML. Workaround: use <pre> for code with newlines.

Change Log

29 March 2007

  • Added tests for PHP support to address issue 3.
  • Fixed bug: prettyPrintOne was not halting. This was not reachable through the normal entry point.
  • Fixed bug: recursing into a script block or PHP tag that was not properly closed would not silently drop the content. (test)
  • Fixed bug: was eating tabs (test)
  • Fixed entity handling so that the caveat

    Caveats: please properly escape less-thans. x&lt;y instead of x<y, and use " instead of &quot; for string delimiters.

    is no longer applicable.
  • Added noisefree's C# patch
  • Added a distribution that has comments and whitespace removed to reduce download size from 45.5kB to 12.8kB.

4 Jul 2008

  • Added language specific formatters that are triggered by the presence of a lang-<language-file-extension>
  • Fixed bug: python handling of '''string'''
  • Fixed bug: / in regex [charsets] should not end regex

5 Jul 2008

  • Defined language extensions for Lisp and Lua

14 Jul 2008

  • Language handlers for F#, OCAML, SQL
  • Support for nocode spans to allow embedding of line numbers and code annotations which should not be styled or otherwise affect the tokenization of prettified code. See the issue 22 testcase.

6 Jan 2009

  • Language handlers for Visual Basic, Haskell, CSS, and WikiText
  • Added .mxml extension to the markup style handler for Flex MXML files. See issue 37.
  • Added .m extension to the C style handler so that Objective C source files properly highlight. See issue 58.
  • Changed HTML lexer to use the same embedded source mechanism as the wiki language handler, and changed to use the registered CSS handler for STYLE element content.

21 May 2009

  • Rewrote to improve performance on large files. See benchmarks.
  • Fixed bugs with highlighting of Haskell line comments, Lisp number literals, Lua strings, C preprocessor directives, newlines in Wiki code on Windows, and newlines in IE6.

14 August 2009

  • Fixed prettifying of <code> blocks with embedded newlines.

3 October 2009

  • Fixed prettifying of XML/HTML tags that contain uppercase letters.

19 July 2010

  • Added support for line numbers. Bug 22
  • Added YAML support. Bug 123
  • Added VHDL support courtesy Le Poussin.
  • IE performance improvements. Bug 102 courtesy jacobly.
  • A variety of markup formatting fixes courtesy smain and thezbyg.
  • Fixed copy and paste in IE[678].
  • Changed output to use &#160; instead of &nbsp; so that the output works when embedded in XML. Bug 108.
././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/README.htmlubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/yuidoc-theme/assets/vendor/prettify/README.h0000644000015600001650000001735012654470322032354 0ustar pbuserpbgroup00000000000000 Javascript code prettifier Languages : CH

Javascript code prettifier

Setup

  1. Download a distribution
  2. Include the script and stylesheets in your document (you will need to make sure the css and js file are on your server, and adjust the paths in the script and link tag)
    <link href="prettify.css" type="text/css" rel="stylesheet" />
    <script type="text/javascript" src="prettify.js"></script>
  3. Add onload="prettyPrint()" to your document's body tag.
  4. Modify the stylesheet to get the coloring you prefer

Usage

Put code snippets in <pre class="prettyprint">...</pre> or <code class="prettyprint">...</code> and it will automatically be pretty printed.
The original Prettier
class Voila {
public:
  // Voila
  static const string VOILA = "Voila";

  // will not interfere with embedded tags.
}
class Voila {
public:
  // Voila
  static const string VOILA = "Voila";

  // will not interfere with embedded tags.
}

FAQ

Which languages does it work for?

The comments in prettify.js are authoritative but the lexer should work on a number of languages including C and friends, Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl and Ruby, but, because of commenting conventions, doesn't work on Smalltalk, or CAML-like languages.

LISPy languages are supported via an extension: lang-lisp.js.

And similarly for CSS, Haskell, Lua, OCAML, SML, F#, Visual Basic, SQL, Protocol Buffers, and WikiText..

If you'd like to add an extension for your favorite language, please look at src/lang-lisp.js and file an issue including your language extension, and a testcase.

How do I specify which language my code is in?

You don't need to specify the language since prettyprint() will guess. You can specify a language by specifying the language extension along with the prettyprint class like so:

<pre class="prettyprint lang-html">
  The lang-* class specifies the language file extensions.
  File extensions supported by default include
    "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
    "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
    "xhtml", "xml", "xsl".
</pre>

It doesn't work on <obfuscated code sample>?

Yes. Prettifying obfuscated code is like putting lipstick on a pig — i.e. outside the scope of this tool.

Which browsers does it work with?

It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. Look at the test page to see if it works in your browser.

What's changed?

See the change log

Why doesn't Prettyprinting of strings work on WordPress?

Apparently wordpress does "smart quoting" which changes close quotes. This causes end quotes to not match up with open quotes.

This breaks prettifying as well as copying and pasting of code samples. See WordPress's help center for info on how to stop smart quoting of code snippets.

How do I put line numbers in my code?

You can use the linenums class to turn on line numbering. If your code doesn't start at line number 1, you can add a colon and a line number to the end of that class as in linenums:52.

For example

<pre class="prettyprint linenums:4"
>// This is line 4.
foo();
bar();
baz();
boo();
far();
faz();
<pre>
produces
// This is line 4.
foo();
bar();
baz();
boo();
far();
faz();

How do I prevent a portion of markup from being marked as code?

You can use the nocode class to identify a span of markup that is not code.

<pre class=prettyprint>
int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
  Continuation of comment */
int y = bar();
</pre>
produces
int x = foo();  /* This is a comment  This is not code
  Continuation of comment */
int y = bar();

For a more complete example see the issue22 testcase.

I get an error message "a is not a function" or "opt_whenDone is not a function"

If you are calling prettyPrint via an event handler, wrap it in a function. Instead of doing

addEventListener('load', prettyPrint, false);
wrap it in a closure like
addEventListener('load', function (event) { prettyPrint() }, false);
so that the browser does not pass an event object to prettyPrint which will confuse it.


ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docslib.py0000755000015600001650000000222712654470322024176 0ustar pbuserpbgroup00000000000000#!/usr/bin/python3 # # Copyright 2014 Canonical Ltd # Authors: # Kyle Nitzsche # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * */ /** * OptionSelector is a component displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically. * @class OptionSelector * @constructor * @namespace UbuntuUI * @example
  • Label 1

  • Label 2

  • Label 3

JavaScript access: Expanded: UI.optionselector("OptionSelectorID", true); Expanded and multi selection: UI.optionselector("OptionSelectorID", true, true); Multi selection: UI.optionselector("OptionSelectorID", false, true); */ var OptionSelector = (function () { var __values = ""; function OptionSelector (id, expanded, multiSelection) { this.currentIndex = 0; this.currentlyExpanded = false; this.expanded = typeof expanded !== 'undefined' ? expanded : false; this.multiSelection = typeof multiSelection !== 'undefined' ? multiSelection : false; if (this.multiSelection) this.expanded = true; this.optionselector = document.getElementById(id); if (this.optionselector == null) { console.error('The OptionSelector with the ID #' + this.id + ' doesn\'t exist'); return; } this.optionselector_ul = this.optionselector.querySelectorAll('ul')[0]; if (this.optionselector_ul == null) return; if (this.optionselector_ul.length == 0) return; this.optionselector_ul_li = this.optionselector.querySelectorAll('li'); if (this.optionselector_ul == null) return; if (this.optionselector_ul_li.length == 0) return; [].forEach.call(this.optionselector_ul_li, function (elm) { elm.addEventListener('click', this.__onClicked.bind(this, elm), false); }.bind(this)); if (this.expanded) { this.__open(); this.optionselector_ul_li[0].classList.add('active'); } else { if (this.currentlyExpanded) { this.__open(); this.optionselector_ul_li[0].classList.add('active'); } else { this.__close(this.currentIndex); this.optionselector_ul_li[0].classList.add('closed'); } } } OptionSelector.prototype = { /** * @private */ __onClicked: function (elm, e) { __values = ""; this.currentIndex = 0; if (this.expanded) { if (!this.multiSelection) { [].forEach.call(this.optionselector_ul_li, function (elm) { elm.classList.remove('active'); }); elm.classList.toggle('active'); } else { elm.classList.toggle('active'); } } else { for(i = 0, max = this.optionselector_ul_li.length; i < max; i++) { if (this.optionselector_ul_li[i]==elm) break; this.currentIndex++; } if (this.currentlyExpanded) { this.__close(this.currentIndex); elm.classList.add('active'); elm.classList.add('closed'); elm.style.borderTop = '0'; } else { elm.classList.add('active'); elm.classList.remove('closed'); this.__open(); elm.style.borderTop = '1px solid #C7C7C7'; } } k = 0; for (i = 0, max = this.optionselector_ul_li.length; i < max; i++) { var li = this.optionselector_ul_li[i]; if ((li.className).indexOf('active') > -1) { if (k === 0) { __values = li.getAttribute("data-value"); } else { __values = __values + ", " + li.getAttribute("data-value"); } k++; } } if (!this.currentlyExpanded && !this.expanded) { this.__ClickEvent(elm); } else { if (this.expanded) { this.__ClickEvent(elm); } } e.preventDefault(); }, /** * @private */ __ClickEvent: function (elm) { elm._evt = document.createEvent('Event'); elm._evt.initEvent('onclicked', true, true); elm._evt.values = __values; elm.dispatchEvent(elm._evt); }, /** * @private */ __open: function () { this.optionselector_ul.style['-webkit-transition-duration'] = '.4s'; this.optionselector_ul.style.webkitTransform = 'translate3d(0, 0rem,0)'; this.optionselector.style.height = 3.07*this.optionselector_ul_li.length + 'rem'; this.currentlyExpanded = true; }, /** * @private */ __close: function (currentIndex) { this.optionselector_ul.style['-webkit-transition-duration'] = '.4s'; this.optionselector_ul.style.webkitTransform = 'translate3d(0,' + -3*currentIndex + 'rem,0)'; this.optionselector.style.height = '3rem'; [].forEach.call(this.optionselector_ul_li, function (elm) { elm.classList.remove('active'); }); this.currentlyExpanded = false; }, onClicked : function(callback){ this.optionselector_ul.addEventListener("onclicked", callback); } }; return OptionSelector; })(); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/0000755000015600001650000000000012654470531024151 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/data.json0000644000015600001650000021503412654470322025760 0ustar pbuserpbgroup00000000000000{ "project": { "description": "Ubuntu HTML5 API: JavaScript for HTML5 Ubuntu Apps", "majorversion": "HTML-14.04-dev", "name": "Ubuntu HTML5 API", "version": "HTML-14.04-dev~bzr202" }, "files": { "buttons.js": { "name": "buttons.js", "modules": {}, "classes": { "UbuntuUI.Button": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "core.js": { "name": "core.js", "modules": { "UbuntuUI": 1 }, "classes": { "UbuntuUI": 1 }, "fors": {}, "namespaces": {} }, "dialogs.js": { "name": "dialogs.js", "modules": {}, "classes": { "UbuntuUI.Dialog": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "fast-buttons.js": { "name": "fast-buttons.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "header.js": { "name": "header.js", "modules": {}, "classes": { "UbuntuUI.Header": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "list.js": { "name": "list.js", "modules": {}, "classes": { "UbuntuUI.List": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "option-selector.js": { "name": "option-selector.js", "modules": {}, "classes": { "UbuntuUI.OptionSelector": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "page.js": { "name": "page.js", "modules": {}, "classes": { "UbuntuUI.Page": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "pagestacks.js": { "name": "pagestacks.js", "modules": {}, "classes": { "UbuntuUI.Pagestack": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "popovers.js": { "name": "popovers.js", "modules": {}, "classes": { "UbuntuUI.Popover": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "progress.js": { "name": "progress.js", "modules": {}, "classes": { "UbuntuUI.Progress": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "shape.js": { "name": "shape.js", "modules": {}, "classes": { "UbuntuUI.Shape": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "tab.js": { "name": "tab.js", "modules": {}, "classes": { "UbuntuUI.Tab": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "tabs.js": { "name": "tabs.js", "modules": {}, "classes": { "UbuntuUI.Tabs": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } }, "toolbars.js": { "name": "toolbars.js", "modules": {}, "classes": { "UbuntuUI.Toolbar": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 } } }, "modules": { "UbuntuUI": { "name": "UbuntuUI", "submodules": {}, "classes": { "UbuntuUI.Button": 1, "UbuntuUI": 1, "UbuntuUI.Dialog": 1, "UbuntuUI.Header": 1, "UbuntuUI.List": 1, "UbuntuUI.OptionSelector": 1, "UbuntuUI.Page": 1, "UbuntuUI.Pagestack": 1, "UbuntuUI.Popover": 1, "UbuntuUI.Progress": 1, "UbuntuUI.Shape": 1, "UbuntuUI.Tab": 1, "UbuntuUI.Tabs": 1, "UbuntuUI.Toolbar": 1 }, "fors": {}, "namespaces": { "UbuntuUI": 1 }, "tag": "module", "file": "toolbars.js", "line": 23 } }, "classes": { "UbuntuUI.Button": { "name": "UbuntuUI.Button", "shortname": "UbuntuUI.Button", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "buttons.js", "line": 23, "description": "A Button.\n\nNote the Ubuntu CSS style classes: positive, information, secondary, and negative", "is_constructor": 1, "example": [ "\n \n\n Javascript access:\n var button = UI.button(\"buttonID\");" ] }, "UbuntuUI": { "name": "UbuntuUI", "shortname": "UbuntuUI", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "", "file": "core.js", "line": 27, "description": "UbuntuUI is the critical Ubuntu HTML5 framework class. You need to construct an UbuntuUI object and initialize it to have an Ubuntu HTML5 app. You then use this object to access Ubuntu HTML5 objects (and object methods) that correspond to the Ubuntu HTML5 DOM elements.\n\nNote: The UbuntuUI object is \"UI\" in all API doc examples.", "is_constructor": 1, "example": [ "\n var UI = new UbuntuUI();\n window.onload = function () {\n UI.init();\n UI.pagestack.push('pageid');\n [...]\n };" ] }, "UbuntuUI.Dialog": { "name": "UbuntuUI.Dialog", "shortname": "UbuntuUI.Dialog", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "dialogs.js", "line": 23, "description": "Dialogs are modal full-screen popups that prevent other GUI interactions with the application until dismissed.\n\nDialogs wrap arbitrary markup.\n\nDialogs are declared at the top level inside the content div.", "is_constructor": 1, "example": [ "\n
\n
\n [...]\n
\n
\n [...]\n
\n
\n\n JavaScript access:\n var dialog = UI.dialog(\"dialogID\");\n" ] }, "UbuntuUI.Header": { "name": "UbuntuUI.Header", "shortname": "UbuntuUI.Header", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "header.js", "line": 23, "description": "An Ubuntu Header wraps the general Tabs definitions and interaction in the case of a Tab\n navigation pattern or is used to display the title of the current page when using a PageStack navigation pattern.\n\nIn the case of a Tab navigation pattern, declare the Header and its Tabs in HTML as a direct child\nof the top level MainView as a sibling to the content div.\n\nIn the case of a PageStack navigation pattern, the Ubuntu Header HTML element should be present\nand can be left empty. It will be automatically updated to hold the Title of the current Page being\nvisited. The value of such a title is taken from the data-title attribute of the currently visited\nPage as it is being pushed at the top of the stack (see PageStack.push()).\n\n######Contained list provides Page navigation\nA contained unordered list has list items, each of which has \"data-page\" data attribute whose value of a Page ID that it targets. Clicking the Header/Tabs allows the user to navigate to the Pages identified by these IDs.", "is_constructor": 1, "example": [ "\n \n
\n\n
\n
    \n
  • Main
  • \n
  • Two
  • \n
\n
\n\n
\n
\n [...]\n
\n
\n [...]\n
\n
\n\n
\n \n\n JavaScript access:\n var header = UI.header(\"headerID\");" ] }, "UbuntuUI.List": { "name": "UbuntuUI.List", "shortname": "UbuntuUI.List", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "list.js", "line": 23, "description": "A List comes with various options, including: a header, main text (pushed left), an icon (pushed left), and a secondary label (pushed right).", "is_constructor": 1, "example": [ "\n
\n
My header text
\n \n
\n\n JavaScript access:\n var list = UI.list('[id=\"testlist\"]');" ] }, "UbuntuUI.OptionSelector": { "name": "UbuntuUI.OptionSelector", "shortname": "UbuntuUI.OptionSelector", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "option-selector.js", "line": 23, "description": "OptionSelector is a component displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a\n listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically.", "is_constructor": 1, "example": [ "\n
\n
    \n
  • \n

    Label 1

    \n
  • \n
  • \n

    Label 2

    \n
  • \n
  • \n

    Label 3

    \n
  • \n
\n
\n\n JavaScript access:\n\n Expanded:\n UI.optionselector(\"OptionSelectorID\", true);\n Expanded and multi selection:\n UI.optionselector(\"OptionSelectorID\", true, true);\n Multi selection:\n UI.optionselector(\"OptionSelectorID\", false, true);" ] }, "UbuntuUI.Page": { "name": "UbuntuUI.Page", "shortname": "UbuntuUI.Page", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "page.js", "line": 23, "description": "One of the navigation pattern that can be used within an Ubuntu App is the deep navigation. This\npattern is implemented by the Pagestack. A Pagestack contains one or more Pages. Each page displays full-screen. See the Pagestack class.\n\nEach Page must have id and data-title attributes. The id attribute is used a unique reference to push the Page to the top of the Pagestack (see the Pagestack class). The data-title attribute is used to update the Header title as pages are pushed and poped.", "is_constructor": 1, "example": [ "\n \n
\n\n
\n
\n\n
\n
\n
\n [...]\n
\n
\n [...]\n
\n
\n
\n\n
\n \n\n JavaScript access:\n var page = UI.page(\"pageID\");" ] }, "UbuntuUI.Pagestack": { "name": "UbuntuUI.Pagestack", "shortname": "UbuntuUI.Pagestack", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "pagestacks.js", "line": 23, "description": "The Pagestack manages all Pages in a stack data structure. Initially, the Pagestack contains no Pages. The push() method is normally executed on load to display the app starting page.\n\n UI.pagestack.push(\"pageID\")\n\nThe topmost Page on the Pagestack is always displayed.\n\nThe Pagestack is declared as a direct child of the content div.\n\n#####Default application wide footer\nThe Pagestack contains a default footer (represented in JavaScript as a Toolbar), even if you do not declare one in HTML. The footer has a single Back button.\n#####Customized application wide footer\nThis application-wide footer can be customized (for example, you can add Buttons) by declaring a footer as a direct child of the pagestack div (see example).\n######Page specific footers\nA page may declare a page-specific footer as a child element.", "is_constructor": 1, "example": [ "\n\n
\n\n
\n
\n\n
\n\n
\n\n
\n
\n\n
\n [...]\n
\n [...]\n
\n
\n\n
\n [...]\n
\n\n
\n\n
\n\n
\n\n JavaScript access:\n UI.pagestack.METHOD();\n" ] }, "UbuntuUI.Popover": { "name": "UbuntuUI.Popover", "shortname": "UbuntuUI.Popover", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "popovers.js", "line": 23, "description": "A Popover is a div containng markup that can pop up and disappear. (Unlike a Dialog, Popovers are not full screen.)\n\nA Popoves often contain a List whose items are connected to useful JavaScript functions.\n\n\n######Popover Position\nThe Popover's position is set relative to a specified base element with the data-gravity=\"LETTER\" attribute. LETTER values:\n\n- 'n': the base element is above the Popover\n- 's': the base element is below the Popover\n- 'e': the base element is to the east of (to the right of) the Popover (in right-to-left locales)\n- 'w': the base element is to the west of (to the left of) the Popover (in right-to-left locale)", "is_constructor": 1, "params": [ { "name": "elem", "description": "- The element to which the Popover's position is relative", "type": "String" }, { "name": "id", "description": "- The id attribute of the Popover in HTML", "type": "ID" } ], "example": [ "\n\n

Text

\n
\n \n
\n\n Javascript:\n var popBase = document.getElementById(\"popoverBase\");\n var popover = UI.popover(popBase, \"popover\");" ] }, "UbuntuUI.Progress": { "name": "UbuntuUI.Progress", "shortname": "UbuntuUI.Progress", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "progress.js", "line": 23, "description": "A Progress.\n\nNote the Ubuntu CSS style classes: infinite", "is_constructor": 1, "example": [ "\n \n\n Javascript access:\n var pre = UI.progress(\"progressID\");" ] }, "UbuntuUI.Shape": { "name": "UbuntuUI.Shape", "shortname": "UbuntuUI.Shape", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "shape.js", "line": 23, "description": "An Ubuntu Shape contains and decorates (with CSS styles) some markup, often an img.", "is_constructor": 1, "example": [ "\n
\n \n
\n\n JavaScript access:\n var shape = UI.shape(\"shapeID\");\n" ] }, "UbuntuUI.Tab": { "name": "UbuntuUI.Tab", "shortname": "UbuntuUI.Tab", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "tab.js", "line": 22, "description": "One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application.\n\nA Tab represents the UI element that hosts your tab content. This UI element is being activated by the user selecting it as part of the Header element.", "is_constructor": 1, "example": [ "\n \n\n
\n
\n
    \n
  • \n Main\n
  • \n
  • \n Two\n
  • \n
\n
\n\n
\n
\n [...]\n
\n
\n [...]\n
\n
\n\n
\n \n\n JavaScript access:\n var tab = UI.tab(\"tabID\");" ] }, "UbuntuUI.Tabs": { "name": "UbuntuUI.Tabs", "shortname": "UbuntuUI.Tabs", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "tabs.js", "line": 23, "description": "One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application.\n\nTabs are defined from within the Header part of your application HTML. See the Header class for more information.\n\nDeclare the Header and Tabs in HTML as a direct child of the top level Page as a sibling to the content div.", "is_constructor": 1, "example": [ "\n \n
\n\n
\n
    \n
  • \n Main\n
  • \n
  • \n Two\n
  • \n
\n
\n\n
\n
\n [...]\n
\n\n
\n [...]\n
\n
\n\n
\n \n\n JavaScript access:\n UI.tabs.METHOD();" ] }, "UbuntuUI.Toolbar": { "name": "UbuntuUI.Toolbar", "shortname": "UbuntuUI.Toolbar", "classitems": [], "plugins": [], "extensions": [], "plugin_for": [], "extension_for": [], "module": "UbuntuUI", "namespace": "UbuntuUI", "file": "toolbars.js", "line": 23, "description": "A Toolbar is the JavaScript representation of an Ubuntu HTML5 app footer.\n\n######Contained List provides buttons\nThe Toolbar contains a List, where each list item is treated as a Button (see below). List items (Buttons) are pushed to the right. The default Back button always exists to the left and does not need to be declared.\n\n#####Default and custom footers\nSee the Pagestack class documentation for information about the default application-wide Footer, customizing it, and adding Page-specific Footers.", "is_constructor": 1, "example": [ "\n
\n \n
\n\n JavaScript access:\n var toolbar = UI.toolbar(\"toolbarID\");\n UI.button('home').click(function () {\n UI.pagestack.push(\"main\");\n });\n" ] } }, "classitems": [ { "file": "buttons.js", "line": 42, "description": "Associate a function with the button's Click event", "itemtype": "method", "name": "click", "params": [ { "name": "callback", "description": "- The function to execute on click", "type": "Function" } ], "example": [ "\n UI.button(\"buttonid\").click(function(){\n console.log(\"clicked\");\n });" ], "class": "UbuntuUI.Button", "namespace": "UbuntuUI" }, { "file": "buttons.js", "line": 57, "description": "Returns the DOM element associated with the id this widget is bind to.", "itemtype": "method", "name": "element", "return": { "description": "", "type": "DOMElement" }, "example": [ "\n var mybutton = UI.button(\"buttonid\").element();" ], "class": "UbuntuUI.Button", "namespace": "UbuntuUI" }, { "file": "core.js", "line": 424, "description": "Required call that initializes the UbuntuUI object", "itemtype": "method", "name": "init", "type": "", "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 434, "description": "Gets an Ubuntu Page object", "itemtype": "method", "name": "page", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Page with the specified id", "type": "Page" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 448, "description": "Gets an Ubuntu Tab object", "itemtype": "method", "name": "tab", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Tab with the specified id", "type": "Tab" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 462, "description": "Gets an Ubuntu Shape object", "itemtype": "method", "name": "shape", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Shape with the specified id", "type": "Shape" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 476, "description": "Gets an Ubuntu Button object", "itemtype": "method", "name": "button", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Button with the specified id", "type": "Button" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 490, "description": "Gets an Ubuntu Progress object", "itemtype": "method", "name": "progress", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Progress with the specified id", "type": "Progress" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 502, "description": "Gets an Ubuntu Dialog object", "itemtype": "method", "name": "dialog", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Dialog with the specified id", "type": "Dialog" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 516, "description": "Gets an Ubuntu Popover object", "itemtype": "method", "name": "popover", "params": [ { "name": "el", "description": "- The element to which the Popover's position is relative", "type": "Element" }, { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Popover with the specified id", "type": "Popover" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 531, "description": "Gets an Ubuntu Header object", "itemtype": "method", "name": "header", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Header with the specified id", "type": "Header" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 545, "description": "Gets an Ubuntu Toolbar object", "itemtype": "method", "name": "toolbar", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" } ], "return": { "description": "- The Toolbar with the specified id", "type": "Toolbar" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 559, "description": "Gets an Ubuntu List", "itemtype": "method", "name": "list", "params": [ { "name": "selector", "description": "- A selector that JavaScript querySelector method understands", "type": "Selector" } ], "return": { "description": "", "type": "List" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 573, "description": "Gets an Ubuntu Option Selector", "itemtype": "method", "name": "optionselector", "params": [ { "name": "id", "description": "- The element's id attribute", "type": "ID" }, { "name": "expanded", "description": "- Specifies whether the list is always expanded", "type": "Boolean" }, { "name": "multiSelection", "description": "- If multiple choice selection is enabled the list is always expanded.", "type": "Boolean" } ], "return": { "description": "", "type": "OptionSelector" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 589, "description": "Gets the DOM element from a given selector", "itemtype": "method", "name": "element", "return": { "description": "- The DOM element\nGets the HTML element associated with an Ubuntu HTML5 JavaScript object", "type": "Element" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 599, "description": "Gets this UbuntuUI's single Pagestack object", "itemtype": "method", "name": "pagestack", "return": { "description": "- The Pagestack", "type": "Pagestack" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "core.js", "line": 608, "description": "Gets this UbuntuUI's single Tabs object", "itemtype": "method", "name": "tabs", "return": { "description": "- The Tabs", "type": "Tabs" }, "class": "UbuntuUI", "module": "UbuntuUI" }, { "file": "dialogs.js", "line": 52, "description": "Display a dialog by adding 'active' CSS class", "itemtype": "method", "name": "show", "class": "UbuntuUI.Dialog", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "dialogs.js", "line": 59, "description": "Hide a dialog by removing 'active' class", "itemtype": "method", "name": "hide", "class": "UbuntuUI.Dialog", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "dialogs.js", "line": 66, "description": "Toggle a dialog, which means removing its 'active' class if it has one, or adding the 'active' class if it does not have one", "itemtype": "method", "name": "toggle", "class": "UbuntuUI.Dialog", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "dialogs.js", "line": 73, "description": "Returns the DOM element associated with the id this widget is bind to.", "itemtype": "method", "name": "element", "return": { "description": "", "type": "DOMElement" }, "example": [ "\n var mydialog = UI.dialog(\"dialogid\").element();" ], "class": "UbuntuUI.Dialog", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "fast-buttons.js", "line": 24, "description": "From: http://code.this.com/mobile/articles/fast_buttons.html\nAlso see: http://stackoverflow.com/questions/6300136/trying-to-implement-googles-fast-button", "class": "UbuntuUI.Header", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "fast-buttons.js", "line": 29, "class": "UbuntuUI.Header", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "header.js", "line": 72, "description": "Returns the DOM element associated with the id this widget is bind to.", "itemtype": "method", "name": "element", "return": { "description": "", "type": "DOMElement" }, "example": [ "\n var myheader = UI.header(\"headerid\").element();" ], "class": "UbuntuUI.Header", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "list.js", "line": 77, "description": "Add or Set the List Header", "itemtype": "method", "name": "setHeader", "params": [ { "name": "text", "description": "- The header text", "type": "String" } ], "class": "UbuntuUI.List", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "list.js", "line": 104, "description": "Append an item to a list", "itemtype": "method", "name": "append", "params": [ { "name": "text", "description": "- The main text, flushed left (no markup)", "type": "String" }, { "name": "label", "description": "- Additional text, flushed right (no markup)", "type": "[String]" }, { "name": "id", "description": "- An id attribute value set for the new list item (must be unique in DOM)", "type": "[ID]" }, { "name": "onclick", "description": "- The click callback function", "type": "[Function]" }, { "name": "user_data", "description": "- Additional data that is passed to the click callback", "type": "[Object*]" } ], "return": { "description": "- The created list item, or null on failure ot create", "type": "Element" }, "class": "UbuntuUI.List", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "list.js", "line": 144, "description": "Gets a list item <li> by its index, where index counting starts from 1", "itemtype": "method", "name": "at", "params": [ { "name": "index", "description": "", "type": "Number" } ], "return": { "description": "The list item, or null on failure" }, "class": "UbuntuUI.List", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "list.js", "line": 155, "description": "Removes a list item <li> by its index, where index counting starts from 1", "itemtype": "method", "name": "remove", "params": [ { "name": "index", "description": "", "type": "Number" } ], "class": "UbuntuUI.List", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "list.js", "line": 166, "description": "Removes all items from a list", "itemtype": "method", "name": "removeAllItems", "class": "UbuntuUI.List", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "list.js", "line": 174, "description": "Iterates over all list items and runs a provided function on each", "itemtype": "method", "name": "forEach", "params": [ { "name": "func", "description": "- The function to run on each list item", "type": "Function" } ], "class": "UbuntuUI.List", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "list.js", "line": 187, "description": "Returns the DOM element associated with the selector this widget is bind to.", "itemtype": "method", "name": "element", "return": { "description": "", "type": "DOMElement" }, "example": [ "\n var mylist = UI.list(\"#listid\").element();" ], "class": "UbuntuUI.List", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "option-selector.js", "line": 109, "access": "private", "tagname": "", "class": "UbuntuUI.OptionSelector", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "option-selector.js", "line": 173, "access": "private", "tagname": "", "class": "UbuntuUI.OptionSelector", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "option-selector.js", "line": 183, "access": "private", "tagname": "", "class": "UbuntuUI.OptionSelector", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "option-selector.js", "line": 193, "access": "private", "tagname": "", "class": "UbuntuUI.OptionSelector", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 67, "description": "Returns the DOM element associated with the selector this widget is bind to.", "itemtype": "method", "name": "element", "example": [ "\n var mypage = UI.page(\"pageid\").element();" ], "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 77, "description": "actions property.", "itemtype": "property", "name": "actions", "type": "List", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 89, "description": "title property.", "itemtype": "property", "name": "title", "type": "String", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 101, "description": "Deactivates the current page.", "itemtype": "method", "name": "deactivate", "type": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 109, "description": "Activates the current page.", "itemtype": "method", "name": "activate", "type": "", "params": [ { "name": "properties", "description": "- Data to be passed down to any activation callback listening for the page activation (see Page.onactivated)", "type": "Object" } ], "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 121, "description": "Activates the current page.", "itemtype": "method", "name": "onactivated", "type": "", "params": [ { "name": "callback", "description": "- Callback function called with activation properties (from Pagestack.push) when the page is activated", "type": "Function" } ], "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 131, "access": "private", "tagname": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 150, "access": "private", "tagname": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 162, "access": "private", "tagname": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 182, "description": "Validates that a given DOM node element is a Ubuntu UI Page.", "itemtype": "method", "name": "isPage", "type": "DOM Element", "return": { "description": "if the DOM element is a page", "type": "Boolean" }, "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 193, "access": "private", "tagname": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 206, "access": "private", "tagname": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 224, "access": "private", "tagname": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "page.js", "line": 231, "access": "private", "tagname": "", "class": "UbuntuUI.Page", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 96, "description": "Push a page to the top of this pagestack", "itemtype": "method", "name": "push", "params": [ { "name": "id", "description": "- The id attribute of the page element to be pushed", "type": "String" }, { "name": "properties", "description": "- A list of properties passed down to the page that is to be activated", "type": "Object" } ], "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 112, "description": "Checks for zero pages in this pagestack", "itemtype": "method", "name": "isEmpty", "return": { "description": "- True when this pagestack has no pages, else false", "type": "Boolean" }, "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 121, "description": "Gets the id attribute of the page element on top of this pagestack", "itemtype": "method", "name": "currentPage", "return": { "description": "- The topmost page's id attribute, else null when there are no pages on this pagestack", "type": "PageID|Null" }, "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 130, "description": "Gets the number of pages in this pagestack", "itemtype": "method", "name": "depth", "return": { "description": "- The number of pages in this pagestack", "type": "Number" }, "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 139, "description": "Clears the whole page stack", "itemtype": "method", "name": "clear", "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 150, "description": "Pops the current page off this pagestack, which causes the next page to become the top page and to display", "itemtype": "method", "name": "pop", "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 168, "access": "private", "tagname": "", "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 183, "access": "private", "tagname": "", "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "pagestacks.js", "line": 190, "access": "private", "tagname": "", "class": "UbuntuUI.Pagestack", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "popovers.js", "line": 66, "description": "Display a Popover", "itemtype": "method", "name": "show", "class": "UbuntuUI.Popover", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "popovers.js", "line": 143, "description": "Hide a Popover", "itemtype": "method", "name": "hide", "class": "UbuntuUI.Popover", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "popovers.js", "line": 153, "description": "Toggle show/hide status of a Popover", "itemtype": "method", "name": "toggle", "class": "UbuntuUI.Popover", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "popovers.js", "line": 230, "description": "Returns the DOM element associated with the id this widget is bind to.", "itemtype": "method", "name": "element", "example": [ "\n var mypopover = UI.popover(\"popoverid\").element();" ], "class": "UbuntuUI.Popover", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "progress.js", "line": 47, "description": "Returns the DOM element associated with the id this widget is bind to.", "itemtype": "method", "name": "element", "example": [ "\n var myprogress = UI.progress(\"progressid\").element();" ], "class": "UbuntuUI.Progress", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "progress.js", "line": 59, "description": "Updates the value of the progress bar", "itemtype": "method", "name": "update", "example": [ "\n myprogress.update(30);" ], "class": "UbuntuUI.Progress", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "progress.js", "line": 74, "access": "private", "tagname": "", "class": "UbuntuUI.Progress", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "progress.js", "line": 92, "access": "private", "tagname": "", "class": "UbuntuUI.Progress", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "progress.js", "line": 99, "access": "private", "tagname": "", "class": "UbuntuUI.Progress", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "shape.js", "line": 42, "description": "Associate a function with the Click event", "itemtype": "method", "name": "click", "params": [ { "name": "-", "description": "The function to execute on click", "type": "Function" } ], "example": [ "\n UI.shape(\"id\").click(function(){\n console.log(\"Clicked\");\n });" ], "class": "UbuntuUI.Shape", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "shape.js", "line": 59, "description": "Returns the DOM element associated with the id this widget is bind to.", "itemtype": "method", "name": "element", "example": [ "\n var myshape = UI.shape(\"shapeid\").element();" ], "class": "UbuntuUI.Shape", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 65, "description": "Returns the DOM element associated with the selector this widget is bind to.", "itemtype": "method", "name": "element", "return": { "description": "", "type": "DOMElement" }, "example": [ "\n var mytab = UI.tab(\"tabid\").element();" ], "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 76, "description": "Deactivates the current tab.", "itemtype": "method", "name": "deactivate", "type": "", "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 84, "description": "Activates the current tab.", "itemtype": "method", "name": "activate", "type": "", "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 94, "description": "Validates that a given DOM node element is a Ubuntu UI Tab.", "itemtype": "method", "name": "isTab", "type": "DOM Element", "return": { "description": "if the DOM element is a tab", "type": "Boolean" }, "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 105, "access": "private", "tagname": "", "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 128, "access": "private", "tagname": "", "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 146, "access": "private", "tagname": "", "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tab.js", "line": 153, "access": "private", "tagname": "", "class": "UbuntuUI.Tab", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 86, "description": "Return the index of the selected tab", "itemtype": "property", "name": "selectedTabIndex", "return": { "description": "- The zero based index of the element in the list of tabs or -1", "type": "Integer" }, "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 95, "description": "Sets the index of the selected tab", "itemtype": "property", "name": "selectedTabIndex", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI", "subprops": [ { "name": "-", "description": "The zero based index of the element in the list of tabs", "type": "Integer" } ] }, { "file": "tabs.js", "line": 108, "description": "Return the page associated with the currently selected tab", "deprecated": true, "itemtype": "property", "name": "currentPage", "return": { "description": "- Page DOM element associated with the currently selected tab or null", "type": "Element" }, "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 120, "description": "Return the currently selected tab element", "itemtype": "property", "name": "selectedTab", "return": { "description": "- The currently selected element or null", "type": "Element" }, "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 136, "description": "Return the number of tab elements in the header", "itemtype": "property", "name": "count", "return": { "description": "- Number of tab elements", "type": "Integer" }, "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 145, "description": "Return the list of DOM elements of the tab", "deprecated": true, "itemtype": "property", "name": "tabChildren", "return": { "description": "- List of DOM elements in the tab", "type": "Elements" }, "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 157, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 223, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 233, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 244, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 257, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 287, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 305, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 312, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "tabs.js", "line": 322, "access": "private", "tagname": "", "class": "UbuntuUI.Tabs", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 160, "description": "Display a Toolbar", "itemtype": "method", "name": "show", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 168, "description": "Hide a Toolbar", "itemtype": "method", "name": "hide", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 176, "description": "Toggle show/hide status of a Toolbar", "itemtype": "method", "name": "toggle", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 184, "description": "Returns the DOM element associated with the id this widget is bind to.", "itemtype": "method", "name": "element", "example": [ "\n var mytoolbar = UI.toolbar(\"toolbarid\").element();" ], "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 194, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 213, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 255, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 263, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 271, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 280, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 299, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" }, { "file": "toolbars.js", "line": 310, "access": "private", "tagname": "", "class": "UbuntuUI.Toolbar", "module": "UbuntuUI", "namespace": "UbuntuUI" } ], "warnings": [ { "message": "Missing item type\nFrom: http://code.this.com/mobile/articles/fast_buttons.html\nAlso see: http://stackoverflow.com/questions/6300136/trying-to-implement-googles-fast-button", "line": " fast-buttons.js:24" }, { "message": "Missing item type", "line": " fast-buttons.js:29" }, { "message": "Missing item type", "line": " option-selector.js:109" }, { "message": "Missing item type", "line": " option-selector.js:173" }, { "message": "Missing item type", "line": " option-selector.js:183" }, { "message": "Missing item type", "line": " option-selector.js:193" }, { "message": "Missing item type", "line": " page.js:131" }, { "message": "Missing item type", "line": " page.js:150" }, { "message": "Missing item type", "line": " page.js:162" }, { "message": "Missing item type", "line": " page.js:193" }, { "message": "Missing item type", "line": " page.js:206" }, { "message": "Missing item type", "line": " page.js:224" }, { "message": "Missing item type", "line": " page.js:231" }, { "message": "Missing item type", "line": " pagestacks.js:168" }, { "message": "Missing item type", "line": " pagestacks.js:183" }, { "message": "Missing item type", "line": " pagestacks.js:190" }, { "message": "Missing item type", "line": " progress.js:74" }, { "message": "Missing item type", "line": " progress.js:92" }, { "message": "Missing item type", "line": " progress.js:99" }, { "message": "Missing item type", "line": " tab.js:105" }, { "message": "Missing item type", "line": " tab.js:128" }, { "message": "Missing item type", "line": " tab.js:146" }, { "message": "Missing item type", "line": " tab.js:153" }, { "message": "Missing item type", "line": " tabs.js:157" }, { "message": "Missing item type", "line": " tabs.js:223" }, { "message": "Missing item type", "line": " tabs.js:233" }, { "message": "Missing item type", "line": " tabs.js:244" }, { "message": "Missing item type", "line": " tabs.js:257" }, { "message": "Missing item type", "line": " tabs.js:287" }, { "message": "Missing item type", "line": " tabs.js:305" }, { "message": "Missing item type", "line": " tabs.js:312" }, { "message": "Missing item type", "line": " tabs.js:322" }, { "message": "Missing item type", "line": " toolbars.js:194" }, { "message": "Missing item type", "line": " toolbars.js:213" }, { "message": "Missing item type", "line": " toolbars.js:255" }, { "message": "Missing item type", "line": " toolbars.js:263" }, { "message": "Missing item type", "line": " toolbars.js:271" }, { "message": "Missing item type", "line": " toolbars.js:280" }, { "message": "Missing item type", "line": " toolbars.js:299" }, { "message": "Missing item type", "line": " toolbars.js:310" } ] }ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/modules/0000755000015600001650000000000012654470531025621 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/modules/UbuntuUI.html0000644000015600001650000001275712654470322030241 0ustar pbuserpbgroup00000000000000 UbuntuUI - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/0000755000015600001650000000000012654470531025253 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/header.js.html0000644000015600001650000001627512654470322030015 0ustar pbuserpbgroup00000000000000 header.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

header.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * An Ubuntu Header wraps the general Tabs definitions and interaction in the case of a Tab
   navigation pattern or is used to display the title of the current page when using a PageStack navigation pattern.

In the case of a Tab navigation pattern, declare the Header and its Tabs in HTML as a direct child
of the top level MainView as a sibling to the <em>content</em> div.

In the case of a PageStack navigation pattern, the Ubuntu Header HTML element should be present
and can be left empty. It will be automatically updated to hold the Title of the current Page being
visited. The value of such a title is taken from the data-title attribute of the currently visited
Page as it is being pushed at the top of the stack (see PageStack.push()).

######Contained list provides Page navigation
A contained unordered list has list items, each of which has "data-page" data attribute whose value of a Page ID that it targets. Clicking the Header/Tabs allows the user to navigate to the Pages identified by these IDs.

 * @class Header
 * @constructor
 * @namespace UbuntuUI
 * @example
      <body>
        <div data-role="mainview">

          <header data-role="header" id="headerID">
            <ul data-role="tabs">
              <li data-role="tabitem" data-page="main">Main</li>
              <li data-role="tabitem" data-page="two">Two</li>
            </ul>
          </header>

          <div data-role="content">
            <div data-role="tab" id="main">
                [...]
            </div>
            <div data-role="tab" id="two">
                [...]
            </div>
          </div>

        </div>
      </body>

      JavaScript access:
      var header = UI.header("headerID");
 */
var Header= function (id) {
    this.id =  id;
};

Header.prototype = {
    /**
     * Returns the DOM element associated with the id this widget is bind to.
     * @method element
     * @return {DOMElement}
     * @example
        var myheader = UI.header("headerid").element();
     */
    element: function () {
        return document.getElementById(this.id);
    }
};

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/tabs.js.html0000644000015600001650000003653512654470322027517 0ustar pbuserpbgroup00000000000000 tabs.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

tabs.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>
 */

/**
 * One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application.

Tabs are defined from within the Header part of your application HTML. See the Header class for more information.

Declare the Header and Tabs in HTML as a direct child of the top level Page as a sibling to the content div.

 * @class Tabs
 * @constructor
 * @namespace UbuntuUI
 * @example
      <body>
        <div data-role="mainview">

          <header data-role="header">
            <ul data-role="tabs">
              <li data-role="tabitem" data-page="main">
                Main
              </li>
              <li data-role="tabitem" data-page="page2">
                Two
              </li>
            </ul>
          </header>

          <div data-role="content">
            <div data-role="tab" id="main">
              [...]
            </div>

            <div data-role="tab" id="page2">
              [...]
            </div>
          </div>

        </div>
      </body>

      JavaScript access:
      UI.tabs.METHOD();
*/
var Tabs = (function () {
    var activeTab;

    function Tabs(tabs) {
        if (tabs == null) {
            return;
        }

        this._tabs = tabs;
        this._header = this._tabs.parentNode;

        this._tabsitems = this.tabChildren;

        [].forEach.call(this._tabsitems, function (elm) {
            elm.addEventListener('click', this.__onClicked.bind(this, elm), false);
        }.bind(this));

        // initialize default page
        this.__setupInitialTabVisibility();
    };

    Tabs.prototype = {
        /**
         * Return the index of the selected tab
         * @property selectedTabIndex
         * @return {Integer} - The zero based index of the element in the list of tabs or -1
         */
        get selectedTabIndex() {
            return Array.prototype.slice.call(this._tabs.querySelectorAll('li')).indexOf(activeTab);
        },

        /**
         * Sets the index of the selected tab
         * @property selectedTabIndex
         * @param {Integer} - The zero based index of the element in the list of tabs
         */
        set selectedTabIndex(index) {
            var tabs = Array.prototype.slice.call(this._tabs.querySelectorAll('li'));
            if (index < 0 || index >= tabs.length)
                return;

            this.__doSelectTab(tabs[index]);
        },

        /**
         * Return the page associated with the currently selected tab
         *
         * @deprecated
         *
         * @property currentPage
         * @return {Element} - Page DOM element associated with the currently selected tab or null
         */
        get currentPage() {
            return this.selectedTab ? this.selectedTab.querySelector('page') : null;
        },

        /**
         * Return the currently selected tab element
         *
         * @property selectedTab
         * @return {Element} - The currently selected element or null
         */
        get selectedTab() {
            var selected = null;
            if (activeTab) {
                try {
                    selected = document.getElementBydId(activeTab.getAttribute('data-page'));
                } catch (e) {};
            }
            return selected;
        },

        /**
         * Return the number of tab elements in the header
         * @property count
         * @return {Integer} - Number of tab elements
         */
        get count() {
            return this.tabChildren.length;
        },

        /**
         * Return the list of DOM elements of the tab
         *
         * @deprecated
         *
         * @property tabChildren
         * @return {Elements} - List of DOM elements in the tab
         */
        get tabChildren() {
            return this._tabs.querySelectorAll('li');
        },

        /**
         * @private
         */
        __setupInitialTabVisibility: function () {

            this._firstrun = true;

            PAGESTACK_BACK_ID = 'ubuntu-pagestack-back';
            TAB_BTN_ID = 'ubuntu-tabs-btn';

            var backbtn = document.createElement('button');
            backbtn.setAttribute('data-role', 'back-btn');
            backbtn.setAttribute('id', PAGESTACK_BACK_ID + '-' + Math.floor(Math.random()));
            backbtn.disabled = true;

            if(this._tabs.childElementCount > 1) {
                this._tabsbtn = document.createElement('button');
                this._tabsbtn.setAttribute('data-role', 'tabs-btn');
                this._tabsbtn.setAttribute('id', TAB_BTN_ID + '-' + Math.floor(Math.random()));
                this._tabsbtn.style.display = 'block';
            }

            this._content = document.querySelector('[data-role="content"]');

            this._overlay = document.createElement('div');
            this._overlay.setAttribute('data-role', 'overlay');
            this._content.appendChild(this._overlay);

            this._tabtitle = document.createElement('div');
            this._tabtitle.setAttribute('data-role', 'tabtitle');

            var tabtitle_value = document.createTextNode('Main');
            this._tabtitle.appendChild(tabtitle_value);

            this._tabsactions = document.createElement('div');
            this._tabsactions.setAttribute('data-role', 'actions');

            var tab = this._tabs.querySelector('[data-role="tabitem"]:first-child');
            /*tab.classList.remove('inactive');
            tab.classList.add('active');*/

            this._header.innerHTML = '';
            this._header.appendChild(backbtn);
            if(this._tabs.childElementCount > 1) {
                this._header.appendChild(this._tabsbtn);
                this._header.appendChild(this._tabs);

                var self = this;
                this._tabsbtn.onclick = function (e) {
                    self.__toggleTabs();
                    e.preventDefault();
                };
            } else { this._tabtitle.style.marginLeft = '16px'; }
            this._header.appendChild(this._tabtitle);
            this._header.appendChild(this._tabsactions);

            var self = this;
            this._overlay.onclick = function (e) {
                self.__hideMenus();
                var elm = document.elementFromPoint(e.pageX, e.pageY);
                e.preventDefault();
            };

            tab.click();
        },

        /**
         * @private
         */
        __onClicked: function (selectedTab, e) {
            if (selectedTab == null)
                return;
            this.__doSelectTab(selectedTab);
            e.preventDefault();
        },

        /**
         * @private
         */
        __updateActiveTab: function (newActiveTab) {
            //oldActiveTab.classList.remove('inactive');
            //oldActiveTab.classList.remove('active');
            //newActiveTab.classList.remove('inactive');
            //newActiveTab.classList.add('active');
            this._tabtitle.textContent = newActiveTab.innerHTML;
        },

        /**
         * @private
         */
        __dispatchTabChangedEvent: function (tabId) {

            this._evt = document.createEvent('Event');
            this._evt.initEvent('tabchanged', true, true);
            this._evt.infos = {
                tabId: tabId
            };
            this._tabs.dispatchEvent(this._evt);
        },

        /**
         * @private
         */
        __doSelectTab: function (tabElement) {
            if (!tabElement)
                return;

            if (tabElement.getAttribute("data-role") !== 'tabitem')
                return;

            this.__updateActiveTab(tabElement);

            /*activeTab = this._tabs.querySelector('[data-role="tabitem"].active');
            [].forEach.call(this._tabs.querySelectorAll('[data-role="tabitem"]:not(.active)'), function (e) {
                e.classList.remove('inactive');
            });*/

            var targetPageId = tabElement.getAttribute('data-page');

            //this.__activate(targetPageId);

            this.__dispatchTabChangedEvent(targetPageId);
            if (this._firstrun) {
                this._firstrun = false;
            }
            else {
                this.__toggleTabs();
            }
        },

        /**
         * @private
         */
        __activate: function (id) {
            if (!id || typeof (id) !== 'string')
                return;
            activeTab = this._tabs.querySelector('[data-page="' + id + '"]');
            if (!activeTab)
                return;

            [].forEach.call(this._tabs.querySelectorAll('[data-role="tabitem"]'), function (e) {
                e.classList.remove('active');
                e.classList.remove('inactive');
            });

            activeTab.classList.add('active');
        },

        /**
         * @private
         */
        onTabChanged: function (callback) {
            this._tabs.addEventListener("tabchanged", callback);
        },

        /**
         * @private
         */
        __toggleTabs: function () {
            this._tabs.classList.toggle('opened');
            this._overlay.classList.toggle('active');
            if (this._tabsactions.querySelector('.opened') !== null)
                this._tabsactions.querySelector('.opened').classList.remove('opened');
        },

        /**
         * @private
         */
        __hideMenus: function () {
            this._tabs.classList.remove('opened');
            this._overlay.classList.remove('active');
            if (this._tabsactions.querySelector('.opened') !== null)
                this._tabsactions.querySelector('.opened').classList.remove('opened');
        }
    };


    return Tabs;
})();

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/page.js.html0000644000015600001650000002621712654470322027476 0ustar pbuserpbgroup00000000000000 page.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

page.js

/*
 * Copyright (C) 2013, 2014 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * One of the navigation pattern that can be used within an Ubuntu App is the deep navigation. This
 pattern is implemented by the Pagestack. A Pagestack contains one or more Pages. Each page displays full-screen. See the Pagestack class.

Each Page must have <em>id</em> and <em>data-title</em> attributes. The <em>id</em> attribute is used a unique reference to push the Page to the top of the Pagestack (see the Pagestack class). The <em>data-title</em> attribute is used to update the Header title as pages are pushed and poped.

 * @class Page
 * @constructor
 * @namespace UbuntuUI
 * @example
      </body>
        <div data-role="mainview">

          <header data-role="header">
          </header>

          <div data-role="content">
            <div data-role="pagestack">
              <div data-role="page" data-title="Main" id="main">
                [...]
              </div>
              <div data-role="page" data-title="My Data" id="data">
                [...]
              </div>
            </div>
          </div>

        </div>
      </body>

      JavaScript access:
      var page = UI.page("pageID");
 */
var Page = function (id) {
    this.id = id;
    this.onActivatedCallbacks = [];

    this._header = document.querySelector('div[data-role="mainview"] header');
    this._tabTitle = this._header.querySelector('[data-role="tabtitle"]');
    this.__setup();
};
Page.PAGE_ACTIVATED_EVENT = 'ubuntu-html5-on-page-activated';

Page.prototype = {
    /**
     * Returns the DOM element associated with the selector this widget is bind to.
     * @method element
     * @example
       var mypage = UI.page("pageid").element();
    */
    element: function () {
        return document.getElementById(this.id);
    },

    /**
     * actions property.
     * @property {List} actions
     */
    get actions() {
        // TODO: Not implemented yet
        return [];
    },
    set actions(value) {
        // TODO: Not implemented yet
    },

    /**
     * title property.
     * @property {String} title
     */
    get title() {
        // TODO: Not implemented yet
        return "";
    },
    set title(value) {
        // TODO: Not implemented yet
    },

    /**
     * Deactivates the current page.
     * @method {} deactivate
     */
    deactivate: function () {
        this.__updateVisibleState('none');
    },

    /**
     * Activates the current page.
     * @method {} activate
     * @param {Object} properties - Data to be passed down to any activation callback listening for the page activation (see Page.onactivated)
     */
    activate: function (properties) {
        this.__hideVisibleSibling();
        this.__updateVisibleState('block');
        this.__updateHeaderTitle();
        this.__dispatchActivatedEvent(properties);
    },

    /**
     * Activates the current page.
     * @method {} onactivated
     * @param {Function} callback - Callback function called with activation properties (from Pagestack.push) when the page is activated
     */
    onactivated: function(callback) {
        if (callback && typeof callback === 'function')
            this.onActivatedCallbacks.push(callback);
    },

    /**
     * @private
     */
    __setup: function() {
        var self = this;
        if (this.id && this.element() != null) {
            this.element().addEventListener(
                Page.PAGE_ACTIVATED_EVENT,
                function(event) {
                    if (! event.target || self.onActivatedCallbacks.length === 0)
                        return;
                    self.onActivatedCallbacks.forEach(
                        function(callback) {
                            callback(event.data);
                        });
                });
        }
    },

    /**
     * @private
     */
    __dispatchActivatedEvent: function (data) {
        if ( ! this.element())
            return;
        var event = document.createEvent('Event');
        event.initEvent(Page.PAGE_ACTIVATED_EVENT,true,true);
        event.data = data;
        this.element().dispatchEvent(event);
    },

    /**
     * @private
     */
    __updateHeaderTitle: function () {
        if (!this.element().getAttribute('data-title'))
            return;

        if (!this._header)
            return;

        var DEFAULT_TITLE = 'Unknown';
        var title = DEFAULT_TITLE;
        try {
            title = this.element().getAttribute('data-title');
        } catch (e) {}

        title = title || DEFAULT_TITLE;
        this._tabTitle.textContent= title;
    },

    /**
     * Validates that a given DOM node element is a Ubuntu UI Page.
     * @method {DOM Element} isPage
     * @return {Boolean} if the DOM element is a page
     */
    isPage: function (element) {
        return element.tagName === 'DIV' &&
            element.hasAttribute('data-role') &&
            element.getAttribute('data-role') === 'page';
    },

    /**
     * @private
     */
    __updateVisibleState: function (displayStyle) {
        if (!this.__isValidId(this.id))
            return;
        var page = document.getElementById(this.id);
        if (!this.isPage(page)) {
            return;
        }
        page.style.display = displayStyle;
    },

    /**
     * @private
     */
    __hideVisibleSibling: function () {
        if (!this.__isValidId(this.id))
            return;
        var page = document.getElementById(this.id);
        if (!this.isPage(page)) {
            return;
        }
        var children = page.parentNode.children;
        for (var idx = 0; idx < children.length; ++idx) {
            if (this.isPage(children[idx])) {
                children[idx].style.display = 'none';
            }
        }
    },

    /**
     * @private
     */
    __isValidId: function (id) {
        return id && typeof (id) === 'string';
    },

    /**
     * @private
     */
    get __thisSelector() {
        return "#" + this.id;
    }
};

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/progress.js.html0000644000015600001650000001656412654470322030432 0ustar pbuserpbgroup00000000000000 progress.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

progress.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * A Progress.

 Note the Ubuntu CSS style classes: <em>infinite</em>

 * @class Progress
 * @constructor
 * @namespace UbuntuUI
 * @example
      <progress value="80" max="100"></progress>

      Javascript access:
      var pre = UI.progress("progressID");
 */
var Progress = (function () {

    function Progress(id) {
        this.id = id;
        this.max = 1;
        this.ele = this.element();
        this.__setupMessage();
    }

    Progress.prototype = {
        /**
         * Returns the DOM element associated with the id this widget is bind to.
         * @method element
         * @example
            var myprogress = UI.progress("progressid").element();
         */
        element: function() {
            if(document.getElementById(this.id)) {
                return document.getElementById(this.id);
            }
        },

        /**
         * Updates the value of the progress bar
         * @method update
         * @example
            myprogress.update(30);
         */
        update: function(value) {
            if(value != null && this.__IsNumeric(value)) {
                this.ele.value = value;
                this.__updateMessage(value);
            }else{
                console.error('Progress bar value element is NaN - ID:', this.id);
            }
        },

        /**
         * @private
         */
        __setupMessage: function() {
            if(this.ele) {
                if(this.ele.getAttribute("max") && this.__IsNumeric(this.ele.getAttribute("max"))) {
                    this.max = this.ele.getAttribute("max");
                }else{
                console.error('Progress bar max element is NaN - ID:', this.id);
            }
                if(this.ele.getAttribute("value")) {
                    this.update(this.ele.getAttribute("value"));
                }
            }else{
                console.error('Progress bar missing - ID:', this.id);
            }
        },

        /**
         * @private
         */
        __updateMessage: function(value) {
            this.ele.setAttribute('data-percentage', Math.max(0, Math.min(100, Math.floor((100 / this.max) * value))) + '%');
        },

        /**
         * @private
         */
        __IsNumeric: function(n) {
            return !isNaN(parseFloat(n)) && isFinite(n);
        },
    };
    return Progress;
})();

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/option-selector.js.html0000644000015600001650000002713412654470322031707 0ustar pbuserpbgroup00000000000000 option-selector.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

option-selector.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>
 */

/**
 * OptionSelector is a component displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a
    listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically.

 * @class OptionSelector
 * @constructor
 * @namespace UbuntuUI
 * @example
      <section data-role="option-selector" id="OptionSelectorID">
        <ul>
          <li data-value="0">
            <p>Label 1</p>
          </li>
          <li data-value="1">
            <p>Label 2</p>
          </li>
          <li data-value="3">
            <p>Label 3</p>
          </li>
        </ul>
      </section>

      JavaScript access:

      Expanded:
        UI.optionselector("OptionSelectorID", true);
      Expanded and multi selection:
        UI.optionselector("OptionSelectorID", true, true);
      Multi selection:
        UI.optionselector("OptionSelectorID", false, true);
*/
var OptionSelector = (function () {

    var  __values = "";

    function OptionSelector (id, expanded, multiSelection) {
        this.currentIndex = 0;
        this.currentlyExpanded = false;
        this.expanded = typeof expanded !== 'undefined' ? expanded : false;
        this.multiSelection = typeof multiSelection !== 'undefined' ? multiSelection : false;

        if (this.multiSelection)
            this.expanded = true;

        this.optionselector = document.getElementById(id);

        if (this.optionselector == null) {
            console.error('The OptionSelector with the ID #' + this.id + ' doesn\'t exist');
            return;
        }

        this.optionselector_ul = this.optionselector.querySelectorAll('ul')[0];
        if (this.optionselector_ul == null)
            return;

        if (this.optionselector_ul.length == 0)
            return;


        this.optionselector_ul_li = this.optionselector.querySelectorAll('li');
        if (this.optionselector_ul == null)
            return;
        if (this.optionselector_ul_li.length == 0)
            return;

        [].forEach.call(this.optionselector_ul_li, function (elm) {
            elm.addEventListener('click', this.__onClicked.bind(this, elm), false);
        }.bind(this));

        if (this.expanded) {
            this.__open();
            this.optionselector_ul_li[0].classList.add('active');
        }
        else {
            if (this.currentlyExpanded) {
                this.__open();
                this.optionselector_ul_li[0].classList.add('active');
            } else {
                this.__close(this.currentIndex);
                this.optionselector_ul_li[0].classList.add('closed');
            }
        }
    }

    OptionSelector.prototype = {

        /**
         * @private
         */
        __onClicked: function (elm, e) {
            __values = "";
            this.currentIndex = 0;

            if (this.expanded) {
                if (!this.multiSelection) {
                    [].forEach.call(this.optionselector_ul_li, function (elm) {
                        elm.classList.remove('active');
                    });
                    elm.classList.toggle('active');
                }
                else {
                    elm.classList.toggle('active');
                }
            }
            else {

                for(i = 0, max = this.optionselector_ul_li.length; i < max; i++) {
                    if (this.optionselector_ul_li[i]==elm) break;
                    this.currentIndex++;
                }

                if (this.currentlyExpanded) {
                    this.__close(this.currentIndex);
                    elm.classList.add('active');
                    elm.classList.add('closed');
                    elm.style.borderTop = '0';
                }
                else {
                    elm.classList.add('active');
                    elm.classList.remove('closed');
                    this.__open();
                    elm.style.borderTop = '1px solid #C7C7C7';
                }
            }

            k = 0;
            for (i = 0, max = this.optionselector_ul_li.length; i < max; i++) {
                var li = this.optionselector_ul_li[i];
                if ((li.className).indexOf('active') > -1) {
                    if (k === 0) {
                        __values = li.getAttribute("data-value");
                    } else {
                        __values = __values + ", " + li.getAttribute("data-value");
                    }
                    k++;
                }
            }

            if (!this.currentlyExpanded && !this.expanded) {
                this.__ClickEvent(elm);
            }
            else {
                if (this.expanded) {
                    this.__ClickEvent(elm);
                }
            }

            e.preventDefault();
        },

        /**
         * @private
         */
        __ClickEvent: function (elm) {
            elm._evt = document.createEvent('Event');
            elm._evt.initEvent('onclicked', true, true);
            elm._evt.values = __values;
            elm.dispatchEvent(elm._evt);
        },

        /**
         * @private
         */
        __open: function () {
            this.optionselector_ul.style['-webkit-transition-duration'] = '.4s';
            this.optionselector_ul.style.webkitTransform = 'translate3d(0, 0rem,0)';
            this.optionselector.style.height = 3.07*this.optionselector_ul_li.length + 'rem';
            this.currentlyExpanded = true;
        },

        /**
         * @private
         */
        __close: function (currentIndex) {
            this.optionselector_ul.style['-webkit-transition-duration'] = '.4s';
            this.optionselector_ul.style.webkitTransform = 'translate3d(0,' + -3*currentIndex + 'rem,0)';
            this.optionselector.style.height = '3rem';
            [].forEach.call(this.optionselector_ul_li, function (elm) {
                elm.classList.remove('active');
            });
            this.currentlyExpanded = false;
        },

        onClicked : function(callback){
            this.optionselector_ul.addEventListener("onclicked", callback);
        }
    };
    return OptionSelector;
})();

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/buttons.js.html0000644000015600001650000001430412654470322030252 0ustar pbuserpbgroup00000000000000 buttons.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

buttons.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * A Button.

 Note the Ubuntu CSS style classes: <em>positive</em>, <em>information</em>, <em>secondary</em>, and <em>negative</em>

 * @class Button
 * @constructor
 * @namespace UbuntuUI
 * @example
      <button data-role="button" id="buttonID">text</button>

      Javascript access:
      var button = UI.button("buttonID");
 */
var Button = function (id) {
    this.id =  id;
};

Button.prototype = {
    /**
     * Associate a function with the button's Click event
     * @method click
     * @param {Function} callback - The function to execute on click
     * @example
        UI.button("buttonid").click(function(){
         console.log("clicked");
        });
     */
    click: function (callback) {
        if ( ! document.getElementById(this.id)) {
            throw "Invalid button ID: " + String(this.id);
        }
        new FastButton(document.getElementById(this.id), callback);
    },
    /**
     * Returns the DOM element associated with the id this widget is bind to.
     * @method element
     * @return {DOMElement}
     * @example
        var mybutton = UI.button("buttonid").element();
     */
    element: function() {
        return document.getElementById(this.id);
    }
};

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/fast-buttons.js.html0000644000015600001650000002534512654470322031214 0ustar pbuserpbgroup00000000000000 fast-buttons.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

fast-buttons.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

(function () {
    /**
     * From: http://code.this.com/mobile/articles/fast_buttons.html
     * Also see: http://stackoverflow.com/questions/6300136/trying-to-implement-googles-fast-button
     */

    /** For IE8 and earlier compatibility: https://developer.mozilla.org/en/DOM/element.addEventListener */

    function addListener(el, type, listener, useCapture) {
        if (el.addEventListener) {
            el.addEventListener(type, listener, useCapture);
            return {
                destroy: function () {
                    el.removeEventListener(type, listener, useCapture);
                }
            };
        } else {
            // see: http://stackoverflow.com/questions/5198845/javascript-this-losing-context-in-ie
            var handler = function (e) {
                listener.handleEvent(window.event, listener);
            };
            el.attachEvent('on' + type, handler);

            return {
                destroy: function () {
                    el.detachEvent('on' + type, handler);
                }
            };
        }
    }

    var isTouch = "ontouchstart" in window;

    /* Construct the FastButton with a reference to the element and click handler. */
    this.FastButton = function (element, handler, useCapture) {
        // collect functions to call to cleanup events
        this.events = [];
        this.touchEvents = [];
        this.element = element;
        this.handler = handler;
        this.useCapture = useCapture;
        if (isTouch)
            this.events.push(addListener(element, 'touchstart', this, this.useCapture));
        this.events.push(addListener(element, 'click', this, this.useCapture));
    };

    /* Remove event handling when no longer needed for this button */
    this.FastButton.prototype.destroy = function () {
        for (var i = this.events.length - 1; i >= 0; i -= 1)
            this.events[i].destroy();
        this.events = this.touchEvents = this.element = this.handler = this.fastButton = null;
    };

    /* acts as an event dispatcher */
    this.FastButton.prototype.handleEvent = function (event) {
        switch (event.type) {
        case 'touchstart':
            this.onTouchStart(event);
            break;
        case 'touchmove':
            this.onTouchMove(event);
            break;
        case 'touchend':
            this.onClick(event);
            break;
        case 'click':
            this.onClick(event);
            break;
        }
    };

    /* Save a reference to the touchstart coordinate and start listening to touchmove and
    touchend events. Calling stopPropagation guarantees that other behaviors don’t get a
    chance to handle the same click event. This is executed at the beginning of touch. */
    this.FastButton.prototype.onTouchStart = function (event) {
        event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);
        this.touchEvents.push(addListener(this.element, 'touchend', this, this.useCapture));
        this.touchEvents.push(addListener(document.body, 'touchmove', this, this.useCapture));
        this.startX = event.touches[0].clientX;
        this.startY = event.touches[0].clientY;
    };

    /* When /if touchmove event is invoked, check if the user has dragged past the threshold of 10px. */
    this.FastButton.prototype.onTouchMove = function (event) {
        if (Math.abs(event.touches[0].clientX - this.startX) > 10 || Math.abs(event.touches[0].clientY - this.startY) > 10) {
            this.reset(); //if he did, then cancel the touch event
        }
    };

    /* Invoke the actual click handler and prevent ghost clicks if this was a touchend event. */
    this.FastButton.prototype.onClick = function (event) {
        event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);
        this.reset();
        // Use .call to call the method so that we have the correct "this": https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
        var result = this.handler.call(this.element, event);
        if (event.type == 'touchend')
            clickbuster.preventGhostClick(this.startX, this.startY);
        return result;
    };

    this.FastButton.prototype.reset = function () {
        for (var i = this.touchEvents.length - 1; i >= 0; i -= 1)
            this.touchEvents[i].destroy();
        this.touchEvents = [];
    };

    this.clickbuster = function () {};

    /* Call preventGhostClick to bust all click events that happen within 25px of
   the provided x, y coordinates in the next 2.5s. */
    this.clickbuster.preventGhostClick = function (x, y) {
        clickbuster.coordinates.push(x, y);
        window.setTimeout(clickbuster.pop, 2500);
    };

    this.clickbuster.pop = function () {
        clickbuster.coordinates.splice(0, 2);
    };

    /* If we catch a click event inside the given radius and time threshold then we call
   stopPropagation and preventDefault. Calling preventDefault will stop links
   from being activated. */
    this.clickbuster.onClick = function (event) {
        for (var i = 0; i < clickbuster.coordinates.length; i += 2) {
            var x = clickbuster.coordinates[i];
            var y = clickbuster.coordinates[i + 1];
            if (Math.abs(event.clientX - x) < 25 && Math.abs(event.clientY - y) < 25) {
                event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);
                event.preventDefault ? event.preventDefault() : (event.returnValue = false);
            }
        }
    };

    if (isTouch) {
        // Don't need to use our custom addListener function since we only bust clicks on touch devices
        document.addEventListener('click', clickbuster.onClick, true);
        clickbuster.coordinates = [];
    }
})(this);

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/shape.js.html0000644000015600001650000001426412654470322027661 0ustar pbuserpbgroup00000000000000 shape.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

shape.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation; either version 3 of the 
 * License, or
 * (at your option) any later version.
 
 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this program. If not, see 
 * <http://www.gnu.org/licenses/>.
 */

/**
 * An Ubuntu Shape contains and decorates (with CSS styles) some markup, often an <em>img</em>.
 * @class Shape
 * @constructor
 * @namespace UbuntuUI
 * @example
      <div data-role="shape" id="shapeID">
        <img src="URI"/>
      </div>

      JavaScript access:
      var shape = UI.shape("shapeID");

 */
var Shape = function (id) {
    this.id =  id;
};

Shape.prototype = {
    /**
     * Associate a function with the Click event
     * @method click
     * @param {Function} - The function to execute on click
     * @example
        UI.shape("id").click(function(){
         console.log("Clicked");
        });
     */
    click: function (callback) {
      if ( ! document.getElementById(this.id)) {
        throw "Error. id attribute: " + String(this.id) + " is not present in DOM";
      } else {
        var el = document.getElementById(this.id);
        el.addEventListener('click', callback);
      }
    },
    /**
     * Returns the DOM element associated with the id this widget is bind to.
     * @method element
     * @example
        var myshape = UI.shape("shapeid").element();
     */
    element: function () {
        return document.getElementById(this.id);
    }
};

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/core.js.html0000644000015600001650000007627412654470322027522 0ustar pbuserpbgroup00000000000000 core.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

core.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>
 */

/**
 * @module UbuntuUI
 */

/**
 * UbuntuUI is the critical Ubuntu HTML5 framework class. You need to construct an UbuntuUI object and initialize it to have an Ubuntu HTML5 app. You then use this object to access Ubuntu HTML5 objects (and object methods) that correspond to the Ubuntu HTML5 DOM elements.

Note: The UbuntuUI object is "UI" in all API doc examples.
 * @class UbuntuUI
 * @constructor
 * @example
      var UI = new UbuntuUI();
      window.onload = function () {
        UI.init();
        UI.pagestack.push('pageid');
        [...]
      };
 */
var UbuntuUI = (function() {

    PAGESTACK_BACK_ID = 'ubuntu-pagestack-back';

    function __hasPageStack(document) {
        return document.querySelectorAll("[data-role='pagestack']").length >= 1;
    };

    function __hasTabs(document) {
        return document.querySelectorAll("[data-role='tabs']").length >= 1;
    };

    function __createBackButtonListItem() {
        var backBtn = document.createElement('button');
        backBtn.setAttribute('data-role', 'back-btn');
        backBtn.setAttribute('id', PAGESTACK_BACK_ID + '-' + Math.floor(Math.random()));
        backBtn.disabled = true;
        return backBtn;
    };

    function UbuntuUI() {
        var U = this;
        U.isTouch = "ontouchstart" in window;
        U.touchEvents = {
            touchStart: ['touchstart', 'mousedown'],
            touchMove: ['touchmove', 'mousemove'],
            touchEnd: ['touchend', 'mouseup'],
            touchLeave: ['mouseleave'],
        };

        this._prevScrollTop = this._y = 0;

        this._header = document.querySelector('[data-role="header"]');
        this._content = document.querySelector('[data-role="content"]');
        this._headerHeight = this._header.offsetHeight + 17;
        this._content.style.paddingTop = this._headerHeight + "px";

        var self = this;
        window.onscroll = function(event) {
            var scrollTop = window.pageYOffset;
            var y = Math.min(self._headerHeight, Math.max(0, (self._y + scrollTop - self._prevScrollTop)));

            if (self._prevScrollTop > scrollTop && scrollTop > 0) {
                y = Math.max(y, 0);
            }

            if (y !== self._y) {
                requestAnimationFrame(self.__transformHeader.bind(self, y));
            }

            self._prevScrollTop = scrollTop;
            self._y = y;
        };
    };

    UbuntuUI.prototype = {
        __setupPageStack: function(d) {

            var header = d.querySelector("[data-role='header']");

            this._tabTitle = document.createElement('div');
            this._tabTitle.setAttribute('data-role', 'tabtitle');

            var tabTitleValue = document.createTextNode('');
            this._tabTitle.appendChild(tabTitleValue);

            var backBtn = __createBackButtonListItem();
            header.insertBefore(backBtn, header.firstChild);

            var self = this;
            backBtn.onclick = function(e) {
                if (self._pageStack.depth() > 1) {
                    self._pageStack.pop();
                }
                e.preventDefault();
            };

            this._content = document.querySelector('[data-role="content"]');
            this._overlay = document.createElement('div');
            this._overlay.setAttribute('data-role', 'overlay');
            this._content.appendChild(this._overlay);

            // FIXME: support multiple page stack & complex docs?
            var pagestacks = d.querySelectorAll("[data-role='pagestack']");
            if (pagestacks.length == 0)
                return;
            var pagestack = pagestacks[0];

            this._pageStack = new Pagestack(pagestack);

            var pages = pagestack.querySelectorAll("[data-role='page']");
            if (pages.length > 0) {
                this._pageStack.push(pages[0].getAttribute('id'));
            }

            this._pageActions = d.createElement('div');
            this._pageActions.setAttribute('data-role', 'actions');

            header.appendChild(this._tabTitle);
            header.appendChild(this._pageActions);
        },

        __transformHeader: function(y) {
            var s = this._header.style;
            this.__translateY(s, -y);
        },

        __translateY: function(s, y) {
            s.webkitTransform = s.transform = 'translate3d(0, ' + y + 'px, 0)';
        },

        __setupPage: function(document) {
            if (this._pageStack != null)
                return;
            if (__hasPageStack(document)) {
                this.__setupPageStack(document);
            }
        },

        __setupActionsBar: function(document) {

            var actionBar;

            var apptabsElements = document.querySelectorAll('[data-role=tab]');
            if (apptabsElements.length >= 0) {
                for (var idx = 0; idx < apptabsElements.length; ++idx) {
                    var footers = apptabsElements[idx].querySelectorAll("[data-role='footer']");
                    if (footers.length >= 0) {
                        // TODO: validate footer count: should be 1 footer
                        actionBar = this.__setupTabAction(footers[0], apptabsElements[idx]);
                        if (footers[0] != null) footers[0].remove();
                    }
                }
            }

            var apppagesElements = document.querySelectorAll('[data-role=page]');
            if (apppagesElements.length >= 0) {
                for (var idx = 0; idx < apppagesElements.length; ++idx) {
                    var footers = apppagesElements[idx].querySelectorAll("[data-role='footer']");
                    if (footers.length >= 0) {
                        // TODO: validate footer count: should be 1 footer
                        actionBar = this.__setupPageAction(footers[0], apppagesElements[idx]);
                        if (footers[0] != null) footers[0].remove();
                    }
                }
            }
        },

        __setupTabs: function(document) {
            if (this._tabs != null)
                return;
            if (__hasTabs(document)) {
                if (typeof Tabs != 'undefined' && Tabs) {
                    var apptabsElements = document.querySelectorAll('[data-role=tabs]');
                    if (apptabsElements.length == 0)
                        return;
                    this._tabs = new Tabs(apptabsElements[0]);
                    this._tabs.onTabChanged(function(e) {
                        if (!e || !e.infos)
                            return;
                        if (e.infos.tabId) {
                            (new Tab(e.infos.tabId)).activate();
                        }
                    }.bind(this));
                }
            }
        },


        __setupTabAction: function(oldFooter, parent) {
            this._oldFooter = oldFooter;
            this._oldFooterParent = parent;

            this._overlay = document.querySelector('[data-role="overlay"]');

            var newActionsBar = document.querySelector('[data-role="actions"]');

            if (!this._oldFooter)
                return;

            var actionBar = this._oldFooter,
                actions = actionBar.querySelector('ul'),
                actionButtons = actionBar.querySelectorAll('ul li'),
                i = actionButtons.length;
            newActionsBarWrapper = document.createElement('div');
            newActionsBarWrapper.setAttribute("data-role", "actions-wrapper");
            newActionsBarWrapper.setAttribute("id", "actions_" + this._oldFooterParent.id);

            if (actionButtons.length > 2) {
                // Maintain the first item then replace the rest with an action overflow
                var firstAction = actionButtons[0],
                    overflowList = document.createElement('ul'),
                    /* Action Button */
                    firstButton = document.createElement('button'),
                    overflowButton = document.createElement('button'),
                    /* Icon */
                    firstIcon = firstAction.querySelector('img').getAttribute('src'),
                    /* ID*/
                    firstId = firstAction.querySelector('a').getAttribute('id'),
                    k = 1;

                if (this._tabs != 'undefined' && this._tabs) {
                    if (this._tabs._tabsItems.length == 1) {
                        k = 2;
                        this._tabs._tabTitle.style.width = "calc(100% - 155px)";

                        // Maintain the second item
                        var secondAction = actionButtons[1],
                            /* Action Button */
                            secondButton = document.createElement('button'),
                            /* Icon */
                            secondIcon = secondAction.querySelector('img').getAttribute('src'),
                            /* ID*/
                            secondId = secondAction.querySelector('a').getAttribute('id');
                    }
                }

                overflowList.setAttribute('data-role', 'actions-overflow-list');

                // Hide the overflow
                for (var x = k; x < i; x++) {
                    var li = document.createElement('li'),
                        a_id = actionButtons[x].querySelector('a').getAttribute('id'),
                        lbl = actionButtons[x].querySelector('span').innerHTML,
                        icon = actionButtons[x].querySelector('img').getAttribute('src');

                    li.innerHTML = lbl;
                    li.setAttribute('id', a_id);

                    li.style.backgroundImage = 'url( ' + icon + ' )';
                    overflowList.appendChild(li);

                    li.onclick = function(e) {
                        overflowList.classList.toggle('opened');
                        self._overlay.classList.toggle('active');
                        e.preventDefault();
                    };
                }

                // Add the action overflow button
                overflowButton.setAttribute('data-role', 'actions-overflow-icon');

                //firstButton.style.backgroundImage = 'url( ' + firstIcon + ' )';
                firstButton.setAttribute('id', firstId);
                document.styleSheets[0].addRule('#' + firstId + ':after', 'background-image: url("' + firstIcon + '");');

                newActionsBarWrapper.appendChild(firstButton);
                if (this._tabs != 'undefined' && this._tabs) {
                    if (this._tabs._tabsItems.length == 1) {
                        secondButton.setAttribute('id', secondId);
                        document.styleSheets[0].addRule('#' + secondId + ':after', 'background-image: url("' + secondIcon + '");');
                        newActionsBarWrapper.appendChild(secondButton);
                    }
                }
                newActionsBarWrapper.appendChild(overflowButton);
                newActionsBarWrapper.appendChild(overflowList);

                self = this;
                overflowButton.onclick = function(e) {
                    overflowList.classList.toggle('opened');
                    self._overlay.classList.toggle('active');
                    self._tabs._tabs.classList.remove('opened');
                    e.preventDefault();
                };
            } else {

                for (var y = 0; y < i; y++) {
                    var actionButton = document.createElement('button'),
                        actionButton_lbl = actionButtons[y].querySelector('span').innerHTML,
                        actionButton_icon = actionButtons[y].querySelector('img').getAttribute('src'),
                        actionButton_id = actionButtons[y].querySelector('a').getAttribute('id');

                    actionButton.setAttribute('id', actionButton_id);
                    document.styleSheets[0].addRule('#' + actionButton_id + ':after', 'background-image: url("' + actionButton_icon + '");');
                    newActionsBarWrapper.appendChild(actionButton);
                }
            }

            newActionsBar.appendChild(newActionsBarWrapper);
        },


        __setupPageAction: function(oldFooter, parent) {
            this._oldFooter = oldFooter;
            this._oldFooterParent = parent;
            this._overlay = document.querySelector('[data-role="overlay"]');

            var newActionsBar = document.querySelector('[data-role="actions"]');

            if (!this._oldFooter)
                return;

            var actionBar = this._oldFooter,
                actions = actionBar.querySelector('ul'),
                actionButtons = actionBar.querySelectorAll('ul li'),
                i = actionButtons.length;

            newActionsBarWrapper = document.createElement('div');
            newActionsBarWrapper.setAttribute("data-role", "actions-wrapper");
            newActionsBarWrapper.setAttribute("id", "actions_" + this._oldFooterParent.id);

            if (actionButtons.length > 2) {
                // Maintain the first then replace the rest with an action overflow
                var firstAction = actionButtons[0],
                    overflowList = document.createElement('ul'),
                    /* Actions Button */
                    firstButton = document.createElement('button'),
                    overflowButton = document.createElement('button'),
                    /* Icon */
                    firstIcon = firstAction.querySelector('img').getAttribute('src'),
                    /* ID*/
                    firstId = firstAction.querySelector('a').getAttribute('id'),
                    k = 2;

                this._tabTitle.style.width = "calc(100% - 155px)";

                // Maintain the second item
                var secondAction = actionButtons[1],
                    /* Action Button */
                    secondButton = document.createElement('button'),
                    /* Icon */
                    secondIcon = secondAction.querySelector('img').getAttribute('src'),
                    /* ID*/
                    secondId = secondAction.querySelector('a').getAttribute('id');

                overflowList.setAttribute('data-role', 'actions-overflow-list');

                // Hide the overflow
                for (var x = k; x < i; x++) {
                    var li = document.createElement('li'),
                        a_id = actionButtons[x].querySelector('a').getAttribute('id'),
                        lbl = actionButtons[x].querySelector('span').innerHTML,
                        icon = actionButtons[x].querySelector('img').getAttribute('src');

                    li.innerHTML = lbl;
                    li.setAttribute('id', a_id);

                    li.style.backgroundImage = 'url( ' + icon + ' )';
                    overflowList.appendChild(li);

                    li.onclick = function(e) {
                        overflowList.classList.toggle('opened');
                        self._overlay.classList.toggle('active');
                        e.preventDefault();
                    };
                }

                // Add the action overflow button
                overflowButton.setAttribute('data-role', 'actions-overflow-icon');

                firstButton.setAttribute('id', firstId);
                document.styleSheets[0].addRule('#' + firstId + ':after', 'background-image: url("' + firstIcon + '");');

                newActionsBarWrapper.appendChild(firstButton);
                secondButton.setAttribute('id', secondId);
                document.styleSheets[0].addRule('#' + secondId + ':after', 'background-image: url("' + secondIcon + '");');
                newActionsBarWrapper.appendChild(secondButton);
                newActionsBarWrapper.appendChild(overflowButton);
                newActionsBarWrapper.appendChild(overflowList);

                self = this;
                overflowButton.onclick = function(e) {
                    overflowList.classList.toggle('opened');
                    self._overlay.classList.toggle('active');
                    e.preventDefault();
                };
            } else {

                for (var y = 0; y < i; y++) {
                    var actionButton = document.createElement('button'),
                        actionButton_lbl = actionButtons[y].querySelector('span').innerHTML,
                        actionButton_icon = actionButtons[y].querySelector('img').getAttribute('src'),
                        actionButton_id = actionButtons[y].querySelector('a').getAttribute('id');

                    actionButton.setAttribute('id', actionButton_id);
                    document.styleSheets[0].addRule('#' + actionButton_id + ':after', 'background-image: url("' + actionButton_icon + '");');
                    newActionsBarWrapper.appendChild(actionButton);
                }
            }

            newActionsBar.appendChild(newActionsBarWrapper);
        },

        /**
         * Required call that initializes the UbuntuUI object
         * @method {} init
         */
        init: function() {
            this.__setupTabs(document);
            this.__setupPage(document);
            this.__setupActionsBar(document);
        },

        /**
         * Gets an Ubuntu Page object
         * @method page
         * @param {ID} id - The element's id attribute
         * @return {Page} - The Page with the specified id
         */
        page: function(id) {
            if (typeof Page != 'undefined' && Page) {
                return new Page(id);
            } else {
                console.error('Could not find the Page element. You might be missing the "page.js" Page definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Tab object
         * @method tab
         * @param {ID} id - The element's id attribute
         * @return {Tab} - The Tab with the specified id
         */
        tab: function(id) {
            if (typeof Tab != 'undefined' && Tab) {
                return new Tab(id);
            } else {
                console.error('Could not find the Tab element. You might be missing the "tab.js" Tab definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Shape object
         * @method shape
         * @param {ID} id - The element's id attribute
         * @return {Shape} - The Shape with the specified id
         */
        shape: function(id) {
            if (typeof Shape != 'undefined' && Shape) {
                return new Shape(id);
            } else {
                console.error('Could not find the Shape element. You might be missing the "shape.js" Shape definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Button object
         * @method button
         * @param {ID} id - The element's id attribute
         * @return {Button} - The Button with the specified id
         */
        button: function(id) {
            if (typeof Button != 'undefined' && Button) {
                return new Button(id);
            } else {
                console.error('Could not find the Button element. You might be missing the "button.js" Button definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Progress object
         * @method progress
         * @param {ID} id - The element's id attribute
         * @return {Progress} - The Progress with the specified id
         */
        progress: function(id) {
            if (typeof Progress != 'undefined' && Progress) {
                return new Progress(id);
            }
        },

        /**
         * Gets an Ubuntu Dialog object
         * @method dialog
         * @param {ID} id - The element's id attribute
         * @return {Dialog} - The Dialog with the specified id
         */
        dialog: function(id) {
            if (typeof Dialog != 'undefined' && Dialog) {
                return new Dialog(id);
            } else {
                console.error('Could not find the Dialog element. You might be missing the "dialog.js" Dialog definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Popover object
         * @method popover
         * @param {Element} el - The element to which the Popover's position is relative
         * @param {ID} id - The element's id attribute
         * @return {Popover} - The Popover with the specified id
         */
        popover: function(elem, id) {
            if (typeof Popover != 'undefined' && Popover) {
                return new Popover(elem, id);
            } else {
                console.error('Could not find the Popover element. You might be missing the "popover.js" Popover definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Header object
         * @method header
         * @param {ID} id - The element's id attribute
         * @return {Header} - The Header with the specified id
         */
        header: function(id) {
            if (typeof Header != 'undefined' && Header) {
                return new Header(id);
            } else {
                console.error('Could not find the Header element. You might be missing the "header.js" Header definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Toolbar object
         * @method toolbar
         * @param {ID} id - The element's id attribute
         * @return {Toolbar} - The Toolbar with the specified id
         */
        toolbar: function(id) {
            if (typeof Toolbar != 'undefined' && Toolbar) {
                return new Toolbar(id, this.__getTabInfosDelegate());
            } else {
                console.error('Could not find the Toolbar element. You might be missing the "toolbar.js" Toolbar definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu List
         * @method list
         * @param {Selector} selector - A selector that JavaScript querySelector method understands
         * @return {List}
         */
        list: function(selector) {
            if (typeof List != 'undefined' && List) {
                return new List(selector);
            } else {
                console.error('Could not find the List element. You might be missing the "list.js" List definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets an Ubuntu Option Selector
         * @method optionselector
         * @param {ID} id - The element's id attribute
         * @param {Boolean} expanded - Specifies whether the list is always expanded
         * @param {Boolean} multiSelection - If multiple choice selection is enabled the list is always expanded.
         * @return {OptionSelector}
         */
        optionselector: function(id, expanded, multiSelection) {
            if (typeof OptionSelector != 'undefined' && OptionSelector) {
                return new OptionSelector(id, expanded, multiSelection);
            } else {
                console.error('Could not find the OptionSelector element. You might be missing the "option-selector.js" OptionSelector definition script. Please add a <script> declaration to include it.');
            }
        },

        /**
         * Gets the DOM element from a given selector
         * @method element
         * @return {Element} - The DOM element
         * Gets the HTML element associated with an Ubuntu HTML5 JavaScript object
         */
        element: function(selector) {
            return document.querySelector(selector);
        },

        /**
         * Gets this UbuntuUI's single Pagestack object
         * @method pagestack
         * @return {Pagestack} - The Pagestack
         */
        get pagestack() {
            return this._pageStack;
        },

        /**
         * Gets this UbuntuUI's single Tabs object
         * @method tabs
         * @return {Tabs} - The Tabs
         */
        get tabs() {
            return this._tabs;
        },

    };

    return UbuntuUI;

})();

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/popovers.js.html0000644000015600001650000003106112654470322030430 0ustar pbuserpbgroup00000000000000 popovers.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

popovers.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * A Popover is a div containng markup that can pop up and disappear. (Unlike a Dialog, Popovers are not full screen.)

A Popoves often contain a List whose items are connected to useful JavaScript functions.


######Popover Position
The Popover's position is set relative to a specified base element with the <em>data-gravity="LETTER"</em> attribute. LETTER values:

 - 'n': the base element is above the Popover
 - 's': the base element is below the Popover
 - 'e': the base element is to the east of (to the right of) the Popover (in right-to-left locales)
 - 'w': the base element is to the west of (to the left of) the Popover (in right-to-left locale)

 * @class Popover
 * @constructor
 * @namespace UbuntuUI
 * @param {String} elem - The element to which the Popover's position is relative
 * @param {ID} id - The id attribute of the Popover in HTML
 * @example

      <p id="popoverBase">Text</p>
      <div class="popover active" data-gravity="n" id="popover">
        <ul class="list">
          <li class="active"><a href="#">Item1</a></li>
          <li><a href="#">Item2</a></li>
        </ul>
      </div>

      Javascript:
      var popBase = document.getElementById("popoverBase");
      var popover = UI.popover(popBase, "popover");
 */

var Popover = function (elem, id) {
    this.id = id;
    this.popover = document.getElementById(id);
    this.elem = elem;
    this.parent = elem.parentNode.parentNode.parentNode.parentNode;
    this.is_parent_footer = (this.parent.nodeName.toLowerCase() === "footer");
};

Popover.prototype = {
    /** 
     * Display a Popover
     * @method show
     */
    show: function () {
        if (this.popover === null) {
            console.error('The popover with the ID #' + this.id + ' doesn\'t exist');
            return;
        }
        var de = document.documentElement,
            w = (de&&de.clientWidth) || document.body.clientWidth,
            ot = 0,
            ol = 0,
            gravity = "s",
            pos_top = 0,
            pos_left = 0,
            pos_right = 0;

        this.popover.classList.add('active');
        popoverWidth = this.popover.offsetWidth;
        popoverHeight = this.popover.offsetHeight;

        gravity = this.popover.getAttribute("data-gravity");

        if (this.is_parent_footer) {
            ot = this.parent.offsetTop;
            ol = this.elem.offsetLeft;
        }
        else {
            ot = this.elem.offsetTop;
            ol = this.elem.offsetLeft;
        }

        switch (gravity) {
            case 'n':
                pos_top = this.elem.offsetTop + this.elem.offsetHeight + 10;
                pos_left = this.elem.offsetLeft + this.elem.offsetWidth / 2 - popoverWidth / 2;
                break;
            case 's':
                if (this.is_parent_footer) {
                    pos_top = ot - popoverHeight - 90;
                    pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2;
                    if (pos_left < 0)
                        pos_left = 5;
                    else {
                        if (pos_left + popoverWidth > w) {
                            pos_left = -1;
                            pos_right = 5;
                        }
                    }

                }
                else {
                    pos_top = ot - popoverHeight - 10;
                    pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2;
                }
                break;
            case 'e':
                pos_top = this.elem.offsetTop + this.elem.offsetHeight / 2 - popoverHeight / 2;
                pos_left = this.elem.offsetLeft - popoverWidth - 10;
                break;
            case 'w':
                pos_top = this.elem.offsetTop + this.elem.offsetHeight / 2 - popoverHeight / 2;
                pos_left = this.elem.offsetLeft + this.elem.offsetWidth + 10;
                break;
        }

        this.popover.style.top = pos_top + 'px';
        if (pos_left === -1) {
            this.popover.style.left = 'auto';
            this.popover.style.right = pos_right+ 'px';
        }
        else
            this.popover.style.left = pos_left+ 'px';

        return this.popover;
    },
    /**
     * Hide a Popover
     * @method hide
     */
    hide: function () {
        this.popover.classList.remove('active');
        this.popover.style.top = '0px';
        this.popover.style.left = '0px';
        return this.popover;
    },
    /**
     * Toggle show/hide status of a Popover
     * @method toggle
     */
    toggle: function () {
        if (this.popover === null) {
            console.error('The popover with the ID #' + this.id + ' doesn\'t exist');
            return;
        }
        var de = document.documentElement,
            w = (de&&de.clientWidth) || document.body.clientWidth,
            ot = 0,
            ol = 0,
            gravity = "s",
            pos_top = 0,
            pos_left = 0,
            pos_right = 0;

        this.popover.classList.toggle('active');
        popoverWidth = this.popover.offsetWidth;
        popoverHeight = this.popover.offsetHeight;

        gravity = this.popover.getAttribute("data-gravity");

        if (this.is_parent_footer) {
            ot = this.parent.offsetTop;
            ol = this.elem.offsetLeft;
        }
        else {
            ot = this.elem.offsetTop;
            ol = this.elem.offsetLeft;
        }

        switch (gravity) {
            case 'n':
                pos_top = ot + this.elem.offsetHeight + 10;
                pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2;
                break;
            case 's':
                if (this.is_parent_footer) {
                    pos_top = ot - popoverHeight - 90;
                    pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2;
                    if (pos_left < 0)
                        pos_left = 5;
                    else {
                        if (pos_left + popoverWidth > w) {
                            pos_left = -1;
                            pos_right = 5;
                        }
                    }

                }
                else {
                    pos_top = ot - popoverHeight - 10;
                    pos_left = ol + this.elem.offsetWidth / 2 - popoverWidth / 2;
                }
                break;
            case 'e':
                pos_top = ot + this.elem.offsetHeight / 2 - popoverHeight / 2;
                pos_left = ol - popoverWidth - 10;
                break;
            case 'w':
                pos_top = ot + this.elem.offsetHeight / 2 - popoverHeight / 2;
                pos_left = ol + this.elem.offsetWidth + 10;
                break;
        }

        this.popover.style.top = pos_top + 'px';
        if (pos_left === -1) {
            this.popover.style.left = 'auto';
            this.popover.style.right = pos_right+ 'px';
        }
        else
            this.popover.style.left = pos_left+ 'px';

        return this.popover;
    },
    /**
     * Returns the DOM element associated with the id this widget is bind to.
     * @method element
     * @example
        var mypopover = UI.popover("popoverid").element();
     */
    element: function () {
        return this.popover;
    }
};

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/dialogs.js.html0000644000015600001650000001510112654470322030172 0ustar pbuserpbgroup00000000000000 dialogs.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

dialogs.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation; either version 3 of the 
 * License, or
 * (at your option) any later version.
 
 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this program. If not, see 
 * <http://www.gnu.org/licenses/>.
 */

/**
 * Dialogs are modal full-screen popups that prevent other GUI interactions with the application until dismissed.

Dialogs wrap arbitrary markup.

Dialogs are declared at the top level inside the <em>content</em> div.
 * @class Dialog
 * @constructor
 * @namespace UbuntuUI
 * @example
      <div data-role="content">
        <div data-role="pagestack">
          [...]
        </div>
        <div data-role="dialog" id="dialogID">
          [...]
        </div>
      </div>

      JavaScript access:
      var dialog = UI.dialog("dialogID");

 */
var Dialog = function (id) {
    this.id = id;
    this.dialog = document.getElementById(id);
};

Dialog.prototype = {
    /**
     * Display a dialog by adding 'active' CSS class
     * @method show
     */
    show: function () {
        this.dialog.classList.add('active');
    },
    /**
     * Hide a dialog by removing 'active' class
     * @method hide
     */
    hide: function () {
        this.dialog.classList.remove('active');
    },
    /**
     * Toggle a dialog, which means removing its 'active' class if it has one, or adding the 'active' class if it does not have one
     * @method toggle
     */
    toggle: function () {
        this.dialog.classList.toggle('active');
    },
    /**
     * Returns the DOM element associated with the id this widget is bind to.
     * @method element
     * @return {DOMElement}
     * @example
        var mydialog = UI.dialog("dialogid").element();
     */
    element: function () {
	return document.getElementById(this.id);
    }
};

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/pagestacks.js.html0000644000015600001650000002656312654470322030713 0ustar pbuserpbgroup00000000000000 pagestacks.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

pagestacks.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * The Pagestack manages all Pages in a stack data structure. Initially, the Pagestack contains no Pages. The <em>push()</em> method is normally executed on load to display the app starting page.

      UI.pagestack.push("pageID")

The topmost Page on the Pagestack is always displayed.

The Pagestack is declared as a direct child of the <em>content</em> div.

#####Default application wide footer
The Pagestack contains a default <em>footer</em> (represented in JavaScript as a Toolbar), even if you do not declare one in HTML. The <em>footer</em> has a single Back button.
#####Customized application wide footer
This application-wide <em>footer</em> can be customized (for example, you can add Buttons) by declaring a <em>footer</em> as a direct child of the <em>pagestack</em> div (see example).
######Page specific footers
A <em>page</em> may declare a page-specific <em>footer</em> as a child element.

 * @class Pagestack
 * @namespace UbuntuUI
 * @constructor
 * @example

     <div data-role="mainview">

        <header data-role="header">
        </header>

        <div data-role="content">

          <div data-role="pagestack">

            <div data-role="page" id="main" data-title="Page 1">
            </div>

            <div data-role="page" id="page2" data-title="Page 2">
              [...]
              <footer data-role="footer" class="revealed" id="footerPage2">
                [...]
              </footer>
            </div>

            <footer data-role="footer" class="revealed" id="footerAppWide">
              [...]
            </footer>

          </div>  <!-- end of Pagestack div -->

        </div>

      </div>

      JavaScript access:
      UI.pagestack.METHOD();

 */
var Pagestack = (function () {

    function __safeCall(f, args, errorfunc) {
        if (typeof (f) !== 'function')
            return;
        try {
            f.apply(null, args);
        } catch (e) {
            if (errorfunc && typeof (errorfunc) === 'function') errorfunc(e)
        }
    };

    function Pagestack(pageStack) {
        this._pages = [];
        this._pageStack = pageStack;
        this._backBtn = document.querySelector('[data-role="back-btn"]');
    };

    Pagestack.prototype = {
        /**
         * Push a page to the top of this pagestack
         * @method push
         * @param {String} id - The id attribute of the page element to be pushed
         * @param {Object} properties - A list of properties passed down to the page that is to be activated
         */
        push: function (id, properties) {
            try {
                __safeCall(this.__setAllPagesVisibility.bind(this), [false]);
                (new Page(id)).activate(properties);
                this._pages.push(id);

                this.__dispatchPageChanged(this.currentPage());
            } catch (e) {}
        },

        /**
         * Checks for zero pages in this pagestack
         * @method isEmpty
         * @return {Boolean} - True when this pagestack has no pages, else false
         */
        isEmpty: function () {
            return this._pages.length === 0;
        },

        /**
         * Gets the id attribute of the page element on top of this pagestack
         * @method currentPage
         * @return {PageID|Null} - The topmost page's id attribute, else null when there are no pages on this pagestack
         */
        currentPage: function () {
            return this.isEmpty() ? null : this._pages[this._pages.length - 1];
        },

        /**
         * Gets the number of pages in this pagestack
         * @method depth
         * @return {Number} - The number of pages in this pagestack
         */
        depth: function () {
            return this._pages.length;
        },

        /**
         * Clears the whole page stack
         * @method clear
         */
        clear: function () {
            if (this.isEmpty())
                return;
            __safeCall(Page.prototype.deactivate.bind(new Page(this.currentPage())), []);
            this._pages = [];
        },

        /**
         * Pops the current page off this pagestack, which causes the next page to become the top page and to display
         * @method pop
         */
        pop: function () {
            if (this.isEmpty())
                return;
            __safeCall(Page.prototype.deactivate.bind(new Page(this.currentPage())), []);
            this._pages.pop();
            __safeCall(Page.prototype.activate.bind(new Page(this.currentPage())), []);

            this.__dispatchPageChanged(this.currentPage());
        },

        onPageChanged : function(callback){
            this._pageStack.addEventListener("pagechanged", callback);
        },

        /**
         * @private
         */
        __setAllPagesVisibility: function (visible) {
            var visibility = visible ? "block" : "none";

            var children = [].slice.call(this._pageStack.children);
            children.forEach(function(element) {
                var pageHelper = new Page();
                if (pageHelper.isPage(element)) {
                    element.style.display = visibility;
                }
            });
        },

        /**
         * @private
         */
        __isPage: function (element) {
            return element.getAttribute('data-role') === 'page';
        },

        /**
         * @private
         */
        __dispatchPageChanged: function (page) {
            this._backBtn.disabled = (this.depth() ==  1);

            [].forEach.call( document.querySelectorAll('[data-role="actions-wrapper"]'), function(el) {
                el.style.display = 'none';
            });

            var pageActions = document.getElementById("actions_" + page);
            if (pageActions !== null) {
                pageActions.style.display = 'block';
            }

            var event = document.createEvent('Event');
            event.initEvent('pagechanged',true,true);
            event.page = page;
            this._pageStack.dispatchEvent(event);
        },
    };

    return Pagestack;
})();

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/toolbars.js.html0000644000015600001650000003427312654470322030410 0ustar pbuserpbgroup00000000000000 toolbars.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

toolbars.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * A Toolbar is the JavaScript representation of an Ubuntu HTML5 app <em>footer</em>.

######Contained List provides buttons
The Toolbar contains a List, where each list item is treated as a Button (see below). List items (Buttons) are pushed to the right. The default Back button always exists to the left and does not need to be declared.

#####Default and custom footers
See the Pagestack class documentation for information about the default application-wide Footer, customizing it, and adding Page-specific Footers.
 * @class Toolbar
 * @constructor
 * @namespace UbuntuUI
 * @example
      <footer data-role="footer" class="revealed" id="footerID">
        <nav>
          <ul>
            <li>
              <a href="#" id="home">Home</a>
            </li>
          </ul>
        </nav>
      </footer>

      JavaScript access:
      var toolbar = UI.toolbar("toolbarID");
      UI.button('home').click(function () {
        UI.pagestack.push("main");
      });

 */

var Toolbar = (function () {

    function ToolbarListener(id) {
        this._id = id;
        this._onChangedCallbacks = [];
        this._listen();
    };

    ToolbarListener.prototype = {
        onchanged: function (callback) {
            if (callback && typeof callback === 'function')
                this._onChangedCallbacks.push(callback);
        },
        _listen: function () {
            var mutationObserverClass =
                this._getNativeMutationObserverClass();
            if (!mutationObserverClass) {
                console.error(
                    'Could not listen to toolbar changes: no mutation observer found');
                return;
            }
            var toolbar = document.getElementById(this._id);
            if (toolbar) {
                var observer = new mutationObserverClass(
                    this._onMutated.bind(this));
                observer.observe(toolbar, {
                    attributes: true
                });
            }
        },
        _onMutated: function (mutations, observer) {
            for (var i = 0; i < this._onChangedCallbacks.length; ++i) {
                this._onChangedCallbacks[i](mutations);
            }
        },
        _getNativeMutationObserverClass: function () {
            return window.MutationObserver || window.WebKitMutationObserver;
        },
    };


    function Toolbar(id, touchInfoDelegate) {

        this.PHASE_START = "start";
        this.PHASE_MOVE = "move";
        this.PHASE_END = "end";
        this.PHASE_CANCEL = "cancel";

        this.phase = null;

        this.toolbar = document.getElementById(id);
        if ( ! this.toolbar)
            throw "Invalid toolbar id";

        this._touchDown = false;
        this._touchInfoDelegate = touchInfoDelegate;

        this.fingerData = [];
        this.fingerData.push({
            start: {
                x: 0,
                y: 0
            },
            end: {
                x: 0,
                y: 0
            },
            identifier: 0
        });

        var touchEvents = touchInfoDelegate.touchEvents;
        touchInfoDelegate.registerTouchEvent(
            touchEvents.touchStart, this.toolbar, this.__onTouchStart.bind(this));
        touchInfoDelegate.registerTouchEvent(
            touchEvents.touchEnd, this.toolbar, this.__onTouchEnd.bind(this));
        touchInfoDelegate.registerTouchEvent(
            touchEvents.touchMove, this.toolbar, this.__onTouchMove.bind(this));
        touchInfoDelegate.registerTouchEvent(
            touchEvents.touchLeave, this.toolbar, this.__onTouchLeave.bind(this));

        this._timer = null;

        var listener = new ToolbarListener(id);
        var self = this;
        listener.onchanged(function () {
            var toolbar = self.toolbar;

            function __isToolbarVisible() {
                return Array.prototype.slice.call(toolbar.classList)
                    .indexOf('revealed') >= 0;
            }
            if (__isToolbarVisible()) {
                self._timer = window.setTimeout(
                    function () {
                        self.hide();
                    },
                    5000);
            } else {
                if (self._timer) {
                    window.clearTimeout(self._timer);
                    self._timer = null;
                }
            }
        });
    };

    Toolbar.prototype = {
        /**-
         * Display a Toolbar
         * @method show
         */
        show: function () {
            this.toolbar.classList.add('revealed');
        },

        /**-
         * Hide a Toolbar
         * @method hide
         */
        hide: function () {
            this.toolbar.classList.remove('revealed');
        },

        /**
         * Toggle show/hide status of a Toolbar
         * @method toggle
         */
        toggle: function () {
            this.toolbar.classList.toggle('revealed');
        },

        /**
         * Returns the DOM element associated with the id this widget is bind to.
         * @method element
         * @example
            var mytoolbar = UI.toolbar("toolbarid").element();
         */
        element: function () {
            return this.toolbar;
        },

        /**
         * @private
         */
        __onTouchStart: function (evt) {
            this._touchDown = true;

            this.phase = this.PHASE_START;
            var identifier = evt.identifier !== undefined ? evt.identifier : 0;

            var touchEvent =
                this._touchInfoDelegate.translateTouchEvent(evt);

            this.fingerData[0].identifier = identifier;
            this.fingerData[0].start.x =
                this.fingerData[0].end.x = touchEvent.touches[0].pageX;
            this.fingerData[0].start.y =
                this.fingerData[0].end.y = touchEvent.touches[0].pageY;
        },

        /**
         * @private
         */
        __onTouchMove: function (evt) {
            if ( ! this._touchDown)
                return;

            if (this.phase === this.PHASE_END || this.phase === this.PHASE_CANCEL)
                return;

            if (this.phase == this.PHASE_START) {
                var touchEvent =
                    this._touchInfoDelegate.translateTouchEvent(evt);

                var identifier = evt.identifier !== undefined ? evt.identifier : 0;
                var f = this.__getFingerData(identifier);

                f.end.x = touchEvent.touches[0].pageX;
                f.end.y = touchEvent.touches[0].pageY;

		// Validate that the movement has a big enough amplitude
		// before considering it as a 'move'. The 0.4 is a value
		// that was setup after some experimentation on touch.
		var amplitude = this.__norm(f.start, f.end);
		if ((amplitude / this.toolbar.offsetHeight) < 0.4)
			return;

                evt.preventDefault();

                direction = this.__calculateDirection(f.start, f.end);
                if (direction == "DOWN") {
                    this.hide();
                }

                if (direction == "UP") {
                    this.show();
                }

                phase = this.PHASE_MOVE;
            }
        },

        /**
         * @private
         */
        __onTouchEnd: function (e) {
            this._touchDown = false;
            phase = this.PHASE_END;
        },

        /**
         * @private
         */
        __onTouchLeave: function (e) {
            this._touchDown = false;
            phase = this.PHASE_CANCEL;
        },

        /**
         * @private
         */
        __norm: function (p1, p2) {
	    var vx = p2.x - p1.x;
	    var vy = p2.y - p1.y;
	    return Math.sqrt(vx * vx + vy * vy);
	},

        /**
         * @private
         */
        __calculateDirection: function (startPoint, endPoint) {
            var angle = this.__calculateAngle(startPoint, endPoint);

            if ((angle <= 45) && (angle >= 0)) {
                return "LEFT";
            } else if ((angle <= 360) && (angle >= 315)) {
                return "LEFT";
            } else if ((angle >= 135) && (angle <= 225)) {
                return "RIGHT";
            } else if ((angle > 45) && (angle < 135)) {
                return "DOWN";
            } else {
                return "UP";
            }
        },

        /**
         * @private
         */
        __getFingerData: function (id) {
            for (var i = 0; i < this.fingerData.length; i++) {
                if (this.fingerData[i].identifier == id) {
                    return this.fingerData[i];
                }
            }
        },

        /**
         * @private
         */
        __calculateAngle: function (startPoint, endPoint) {
            var x = startPoint.x - endPoint.x;
            var y = endPoint.y - startPoint.y;
            var r = Math.atan2(y, x); //radians
            var angle = Math.round(r * 180 / Math.PI); //degrees

            //ensure value is positive
            if (angle < 0) {
                angle = 360 - Math.abs(angle);
            }

            return angle;
        }
    };
    return Toolbar;
})();

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/tab.js.html0000644000015600001650000002124412654470322027323 0ustar pbuserpbgroup00000000000000 tab.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

tab.js

/*
 * Copyright (C) 2014 Canonical Ltd
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application.

A Tab represents the UI element that hosts your tab content. This UI element is being activated by the user selecting it as part of the Header element.

 * @class Tab
 * @constructor
 * @namespace UbuntuUI
 * @example
      </body>

        <div data-role="mainview">
          <header data-role="header" id="headerID">
            <ul data-role="tabs">
              <li data-role="tabitem" data-page="tabID">
                Main
              </li>
              <li data-role="tabitem" data-page="page2">
                Two
              </li>
            </ul>
          </header>

          <div data-role="content">
              <div data-role="tab" id="tabID">
                [...]
              </div>
              <div data-role="tab" id="page2">
                [...]
              </div>
          </div>

        </div>
      </body>

      JavaScript access:
      var tab = UI.tab("tabID");
 */
var Tab = function (id) {
    this.id = id;
};

Tab.prototype = {
    /**
     * Returns the DOM element associated with the selector this widget is bind to.
     * @method element
     * @return {DOMElement}
     * @example
       var mytab = UI.tab("tabid").element();
    */
    element: function () {
        return document.getElementById(this.id);
    },

    /**
     * Deactivates the current tab.
     * @method {} deactivate
     */
    deactivate: function () {
        this.__updateVisibleState('none');
    },

    /**
     * Activates the current tab.
     * @method {} activate
     */
    activate: function (id) {
        this.__hideVisibleSibling();
        this.__updateVisibleState('block');

    },

    /**
     * Validates that a given DOM node element is a Ubuntu UI Tab.
     * @method {DOM Element} isTab
     * @return {Boolean} if the DOM element is a tab
     */
    isTab: function (element) {
        return element.tagName.toLowerCase() === 'div' &&
            element.hasAttribute('data-role') &&
            element.getAttribute('data-role') === 'tab';
    },

    /**
     * @private
     */
    __updateVisibleState: function (displayStyle) {
        if (!this.__isValidId(this.id))
            return;
        var tab = document.getElementById(this.id);
        if (!this.isTab(tab)) {
            return;
        }
        tab.style.display = displayStyle;

        [].forEach.call( document.querySelectorAll('[data-role="actions-wrapper"]'), function(el) {
           el.style.display = 'none';
        });

        var tab_actions = document.getElementById("actions_" + this.id);

        if (tab_actions !== null) {
            tab_actions.style.display = 'block';
        }
    },

    /**
     * @private
     */
    __hideVisibleSibling: function () {
        if (!this.__isValidId(this.id))
            return;
        var tab = document.getElementById(this.id);
        if (!this.isTab(tab)) {
            return;
        }
        var children = tab.parentNode.children;
        for (var idx = 0; idx < children.length; ++idx) {
            if (this.isTab(children[idx])) {
                children[idx].style.display = 'none';
            }
        }
    },

    /**
     * @private
     */
    __isValidId: function (id) {
        return id && typeof (id) === 'string';
    },

    /**
     * @private
     */
    get __thisSelector() {
        return "#" + this.id;
    }
};
ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/files/list.js.html0000644000015600001650000002703512654470322027534 0ustar pbuserpbgroup00000000000000 list.js - Ubuntu HTML5 API
API Docs for: HTML-14.04-dev~bzr202

list.js

/*
 * Copyright (C) 2013 Adnane Belmadiaf <daker@ubuntu.com>
 * License granted by Canonical Limited
 *
 * This file is part of ubuntu-html5-ui-toolkit.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or
 * (at your option) any later version.

 * This package is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */

/**
 * A List comes with various options, including: a <em>header</em>, main text (pushed left), an icon (pushed left), and a secondary label (pushed right).
 * @class List
 * @constructor
 * @namespace UbuntuUI
 * @example
     <section data-role="list" id="testlist">
       <header>My header text</header>
       <ul>
         <li>
           <a href="#">Main text, to the left</a>
         </li>
         <li>
           <a href="#">Main text</a>
           <label>Right text</label>
         </li>
         <li>
           <aside>
             <img src="someicon.png">
           </aside>
           <a href="#">Main text</a>
           <label>Right</label>
         </li>
       </ul>
      </section>

      JavaScript access:
        var list = UI.list('[id="testlist"]');
 */
var List = (function () {
    var LIST_DATA_ROLE = 'list';

    var __addUlIfNotFound = function (list) {
        if (list) {
            var uls = list.querySelectorAll('ul');
            if (uls == null || uls.length == 0) {
                var ul = document.createElement('ul');
                list.appendChild(ul);
            }
        }
    };

    var List = function (selector) {
        var list = document.querySelector(selector);
        if (list == null || list.nodeName.toLowerCase() !== 'section' || list.getAttribute('data-role') != LIST_DATA_ROLE) {
            throw new Error('Element with selector "' + selector + '" does not exist or not declared as a "list" <section>');
        }
        this._selector = selector;
        this._list = list;

        __addUlIfNotFound(this._list);
    };

    List.prototype = {
        /**
         * Add or Set the List Header
         * @method setHeader
         * @param {String} text - The header text
         */
        setHeader: function (text) {
            if (typeof (text) == 'string') {
                var header = this._list.querySelectorAll('header');
                if (header) {
                    if (header.length > 1) {
                        // more than one <header> detected
                        throw new Error("More than one <header> tag detected");
                    }
                    if (header.length == 1)
                        header = header[0];
                    else
                        header = null;
                }

                if (!header) {
                    header = document.createElement('header');
                    this._list.insertBefore(header, this._list.firstChild);
                }

                header.textContent = text;
            }
        },
            /**
         * Append an item to a list
         * @method append
         * @param {String} text - The main text, flushed left (no markup)
         * @param {[String]} label - Additional text, flushed right (no markup)
         * @param {[ID]} id - An id attribute value set for the new list item (must be unique in DOM)
         * @param {[Function]} onclick - The click callback function
         * @param {[Object*]} user_data - Additional data that is passed to the click callback
         * @return {Element} - The created list item, or null on failure ot create
         */
        append: function (text, label, id, onclick, user_data) {
            var li = document.createElement('li');
            var a = document.createElement('a');

            a.setAttribute('href', '#');
            if (onclick && typeof (onclick) == 'function') {
                li.addEventListener('click', function (event) {
                    onclick(event ? event.target : null, user_data);
                    if (event)
                        event.preventDefault();
                });
            }
            //FIXME: no real checks on text content
            a.textContent = text;
            li.appendChild(a);

            if (label && typeof (label) == 'string') {
                var n = document.createElement('label');
                n.textContent = label;
                li.appendChild(n);
            }

            if (id && typeof (id) == 'string') {
                if (!document.getElementById(id))
                    li.setAttribute('id', id);
            }
            this._list.querySelector('ul').appendChild(li);

            return li;
        },
        /**
         * Gets a list item &lt;li&gt; by its index, where index counting starts from 1
         * @method at
         * @param {Number} index
         * @return The list item, or null on failure
         */
        at: function (index) {
            if (typeof (index) != 'number')
                return null;
            return this._list.querySelector('ul').querySelector('li:nth-child(' + index + ')');
        },
        /**
         * Removes a list item &lt;li&gt; by its index, where index counting starts from 1
         * @method remove
         * @param {Number} index
         */
        remove: function (index) {
            var item = this.at(index);
            if (item) {
                item.parentNode.removeChild(item);
            }
        },
        /**
         * Removes all items from a list
         * @method removeAllItems
         */
        removeAllItems: function () {
            if (this._list.querySelector('ul'))
                this._list.querySelector('ul').innerHTML = '';
        },
        /**
         * Iterates over all list items and runs a provided function on each
         * @method forEach
         * @param {Function} func - The function to run on each list item
         */
        forEach: function (func) {
            if (typeof (func) !== 'function')
                return;
            var items = this._list.querySelector('ul').querySelectorAll('li');
            Array.prototype.forEach.call(items, function (element, index) {
                func(element, index);
            });
        },
        /**
         * Returns the DOM element associated with the selector this widget is bind to.
         * @method element
         * @return {DOMElement}
         * @example
            var mylist = UI.list("#listid").element();
        */
        element: function () {
            return this._list;
        }
    };

    return List;
})();

ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/0000755000015600001650000000000012654470531025453 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/favicon.ico0000644000015600001650000001246612654470322027603 0ustar pbuserpbgroup00000000000000 h&  (  !Юmrf<0SKVhQK6>,1"}2'ɤ`FaKQ=A1y)ԻO1vjv;-dKjR[FK8/|mVK7D6Q>mSdNTA?.QD|gĠ\BVCG8aJlS_IN;7'B˜>,]AbITBN=iOhQXD=*vڷoU=S@M9aCbISBUAkRcMO;I9-jѪ]EZFS=aDaISAXDjR]H?+šÊu_D_IWB_DaHSAYEgOR=SCҦeJ_G[F\D_GSBVD`JD/ÜEnɭ`FZCYCZESAP?S?Q>ź\ˆsícLR;N9I7F6>+u.ڸp‘raΜ\KK<@1ϳ^#+$?( @ ־E*ҵZyUJ}2'i~xĽNsP>9'2!}. y+qZRݽa|hͤXAP:N;I7B1:+3%v(8-fLcJeO]HUAM:F5>/7)|/"s#=ŋvdJiRcLZER>K8C2<-5&r zνIjYѳhMjRgP_IWCO.3$8,I8~@/{A3q8-XCmRjQiQaKYDQ=I7B1;+x(ѶT(q[ӖQ;UCO>H9y?2D5jOjQjRfP^HVBN;F5?/|,xo(bE^E\HVDO>H9x>2WClRiQiRcMZFS?K8D38(D7ټd]>`H\HVCO>G8D5eMkQjRgP_JWCPE7O=kQjQjReN\GT@M:E44#qf}q3"B0cDdH`H\HVCO>E7ZElQjRhRbLYDQ>J8@/>/|D/K8B2K6gFdG`H\HVCN=H9bKkQiRgP^IVBN;G63"yҫzSgGcG`H\HUCL,eYٵlbFgNhQcL\GVBOJ8:)C޿]gLfKjRfO`JYEQ?W?eFdG_H[GUCK,oc@rXbGjQhQcL\GUAV@bEdG_H[GUCL;VCjReN[FT@K8>,<q`DhOjRfO`JXDU@^CdG`H[GUCK;TAhQbLXDQ>@-naԫ}fKcHjQhQcM\GUBYBaFaH[HUCK;P?cM_IUAN:=*J7maDfLjRfO`JXDVA\C`H\HUCKO.|7)s0">01 $49:9???ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/js/0000755000015600001650000000000012654470531026067 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/js/api-list.js0000644000015600001650000001770412654470322030156 0ustar pbuserpbgroup00000000000000 /* * Copyright 2011 Yahoo! Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI.add('api-list', function (Y) { var Lang = Y.Lang, YArray = Y.Array, APIList = Y.namespace('APIList'), classesNode = Y.one('#api-classes'), inputNode = Y.one('#api-filter'), modulesNode = Y.one('#api-modules'), tabviewNode = Y.one('#api-tabview'), tabs = APIList.tabs = {}, filter = APIList.filter = new Y.APIFilter({ inputNode : inputNode, maxResults: 1000, on: { results: onFilterResults } }), search = APIList.search = new Y.APISearch({ inputNode : inputNode, maxResults: 100, on: { clear : onSearchClear, results: onSearchResults } }), tabview = APIList.tabview = new Y.TabView({ srcNode : tabviewNode, panelNode: '#api-tabview-panel', render : true, on: { selectionChange: onTabSelectionChange } }), focusManager = APIList.focusManager = tabviewNode.plug(Y.Plugin.NodeFocusManager, { circular : true, descendants: '#api-filter, .yui3-tab-panel-selected .api-list-item a, .yui3-tab-panel-selected .result a', keys : {next: 'down:40', previous: 'down:38'} }).focusManager, LIST_ITEM_TEMPLATE = '
  • ' + '{displayName}' + '
  • '; // -- Init --------------------------------------------------------------------- // Duckpunch FocusManager's key event handling to prevent it from handling key // events when a modifier is pressed. Y.before(function (e, activeDescendant) { if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return new Y.Do.Prevent(); } }, focusManager, '_focusPrevious', focusManager); Y.before(function (e, activeDescendant) { if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return new Y.Do.Prevent(); } }, focusManager, '_focusNext', focusManager); // Create a mapping of tabs in the tabview so we can refer to them easily later. tabview.each(function (tab, index) { var name = tab.get('label').toLowerCase(); tabs[name] = { index: index, name : name, tab : tab }; }); // Switch tabs on Ctrl/Cmd-Left/Right arrows. tabviewNode.on('key', onTabSwitchKey, 'down:37,39'); // Focus the filter input when the `/` key is pressed. Y.one(Y.config.doc).on('key', onSearchKey, 'down:83'); // Keep the Focus Manager up to date. inputNode.on('focus', function () { focusManager.set('activeDescendant', inputNode); }); // Update all tabview links to resolved URLs. tabview.get('panelNode').all('a').each(function (link) { link.setAttribute('href', link.get('href')); }); // -- Private Functions -------------------------------------------------------- function getFilterResultNode() { return filter.get('queryType') === 'classes' ? classesNode : modulesNode; } // -- Event Handlers ----------------------------------------------------------- function onFilterResults(e) { var frag = Y.one(Y.config.doc.createDocumentFragment()), resultNode = getFilterResultNode(), typePlural = filter.get('queryType'), typeSingular = typePlural === 'classes' ? 'class' : 'module'; if (e.results.length) { YArray.each(e.results, function (result) { frag.append(Lang.sub(LIST_ITEM_TEMPLATE, { rootPath : APIList.rootPath, displayName : filter.getDisplayName(result.highlighted), name : result.text, typePlural : typePlural, typeSingular: typeSingular })); }); } else { frag.append( '
  • ' + 'No ' + typePlural + ' found.' + '
  • ' ); } resultNode.empty(true); resultNode.append(frag); focusManager.refresh(); } function onSearchClear(e) { focusManager.refresh(); } function onSearchKey(e) { var target = e.target; if (target.test('input,select,textarea') || target.get('isContentEditable')) { return; } e.preventDefault(); inputNode.focus(); focusManager.refresh(); } function onSearchResults(e) { var frag = Y.one(Y.config.doc.createDocumentFragment()); if (e.results.length) { YArray.each(e.results, function (result) { frag.append(result.display); }); } else { frag.append( '
  • ' + 'No results found. Maybe you\'ll have better luck with a ' + 'different query?' + '
  • ' ); } focusManager.refresh(); } function onTabSelectionChange(e) { var tab = e.newVal, name = tab.get('label').toLowerCase(); tabs.selected = { index: tab.get('index'), name : name, tab : tab }; switch (name) { case 'classes': // fallthru case 'modules': filter.setAttrs({ minQueryLength: 0, queryType : name }); search.set('minQueryLength', -1); // Only send a request if this isn't the initially-selected tab. if (e.prevVal) { filter.sendRequest(filter.get('value')); } break; case 'everything': filter.set('minQueryLength', -1); search.set('minQueryLength', 1); if (search.get('value')) { search.sendRequest(search.get('value')); } else { inputNode.focus(); } break; default: // WTF? We shouldn't be here! filter.set('minQueryLength', -1); search.set('minQueryLength', -1); } if (focusManager) { setTimeout(function () { focusManager.refresh(); }, 1); } } function onTabSwitchKey(e) { var currentTabIndex = tabs.selected.index; if (!(e.ctrlKey || e.metaKey)) { return; } e.preventDefault(); switch (e.keyCode) { case 37: // left arrow if (currentTabIndex > 0) { tabview.selectChild(currentTabIndex - 1); inputNode.focus(); } break; case 39: // right arrow if (currentTabIndex < (Y.Object.size(tabs) - 2)) { tabview.selectChild(currentTabIndex + 1); inputNode.focus(); } break; } } }, '3.4.0', {requires: [ 'api-filter', 'api-search', 'event-key', 'node-focusmanager', 'tabview' ]}); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/js/apidocs.js0000644000015600001650000002712512654470322030054 0ustar pbuserpbgroup00000000000000 /* * Copyright 2011 Yahoo! Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI().use( 'yuidoc-meta', 'api-list', 'history-hash', 'node-screen', 'node-style', 'pjax', function (Y) { var win = Y.config.win, localStorage = win.localStorage, bdNode = Y.one('#bd'), pjax, defaultRoute, classTabView, selectedTab; // Kill pjax functionality unless serving over HTTP. if (!Y.getLocation().protocol.match(/^https?\:/)) { Y.Router.html5 = false; } // Create the default route with middleware which enables syntax highlighting // on the loaded content. defaultRoute = Y.Pjax.defaultRoute.concat(function (req, res, next) { prettyPrint(); bdNode.removeClass('loading'); next(); }); pjax = new Y.Pjax({ container : '#docs-main', contentSelector: '#docs-main > .content', linkSelector : '#bd a', titleSelector : '#xhr-title', navigateOnHash: true, root : '/', routes : [ // -- / ---------------------------------------------------------------- { path : '/(index.html)?', callbacks: defaultRoute }, // -- /classes/* ------------------------------------------------------- { path : '/classes/:class.html*', callbacks: [defaultRoute, 'handleClasses'] }, // -- /files/* --------------------------------------------------------- { path : '/files/*file', callbacks: [defaultRoute, 'handleFiles'] }, // -- /modules/* ------------------------------------------------------- { path : '/modules/:module.html*', callbacks: defaultRoute } ] }); // -- Utility Functions -------------------------------------------------------- pjax.checkVisibility = function (tab) { tab || (tab = selectedTab); if (!tab) { return; } var panelNode = tab.get('panelNode'), visibleItems; // If no items are visible in the tab panel due to the current visibility // settings, display a message to that effect. visibleItems = panelNode.all('.item,.index-item').some(function (itemNode) { if (itemNode.getComputedStyle('display') !== 'none') { return true; } }); panelNode.all('.no-visible-items').remove(); if (!visibleItems) { if (Y.one('#index .index-item')) { panelNode.append( '
    ' + '

    ' + 'Some items are not shown due to the current visibility ' + 'settings. Use the checkboxes at the upper right of this ' + 'page to change the visibility settings.' + '

    ' + '
    ' ); } else { panelNode.append( '
    ' + '

    ' + 'This class doesn\'t provide any methods, properties, ' + 'attributes, or events.' + '

    ' + '
    ' ); } } // Hide index sections without any visible items. Y.all('.index-section').each(function (section) { var items = 0, visibleItems = 0; section.all('.index-item').each(function (itemNode) { items += 1; if (itemNode.getComputedStyle('display') !== 'none') { visibleItems += 1; } }); section.toggleClass('hidden', !visibleItems); section.toggleClass('no-columns', visibleItems < 4); }); }; pjax.initClassTabView = function () { if (!Y.all('#classdocs .api-class-tab').size()) { return; } if (classTabView) { classTabView.destroy(); selectedTab = null; } classTabView = new Y.TabView({ srcNode: '#classdocs', on: { selectionChange: pjax.onTabSelectionChange } }); pjax.updateTabState(); classTabView.render(); }; pjax.initLineNumbers = function () { var hash = win.location.hash.substring(1), container = pjax.get('container'), hasLines, node; // Add ids for each line number in the file source view. container.all('.linenums>li').each(function (lineNode, index) { lineNode.set('id', 'l' + (index + 1)); lineNode.addClass('file-line'); hasLines = true; }); // Scroll to the desired line. if (hasLines && /^l\d+$/.test(hash)) { if ((node = container.getById(hash))) { win.scroll(0, node.getY()); } } }; pjax.initRoot = function () { var terminators = /^(?:classes|files|modules)$/, parts = pjax._getPathRoot().split('/'), root = [], i, len, part; for (i = 0, len = parts.length; i < len; i += 1) { part = parts[i]; if (part.match(terminators)) { // Makes sure the path will end with a "/". root.push(''); break; } root.push(part); } pjax.set('root', root.join('/')); }; pjax.updateTabState = function (src) { var hash = win.location.hash.substring(1), defaultTab, node, tab, tabPanel; function scrollToNode() { if (node.hasClass('protected')) { Y.one('#api-show-protected').set('checked', true); pjax.updateVisibility(); } if (node.hasClass('private')) { Y.one('#api-show-private').set('checked', true); pjax.updateVisibility(); } setTimeout(function () { // For some reason, unless we re-get the node instance here, // getY() always returns 0. var node = Y.one('#classdocs').getById(hash); win.scrollTo(0, node.getY() - 70); }, 1); } if (!classTabView) { return; } if (src === 'hashchange' && !hash) { defaultTab = 'index'; } else { if (localStorage) { defaultTab = localStorage.getItem('tab_' + pjax.getPath()) || 'index'; } else { defaultTab = 'index'; } } if (hash && (node = Y.one('#classdocs').getById(hash))) { if ((tabPanel = node.ancestor('.api-class-tabpanel', true))) { if ((tab = Y.one('#classdocs .api-class-tab.' + tabPanel.get('id')))) { if (classTabView.get('rendered')) { Y.Widget.getByNode(tab).set('selected', 1); } else { tab.addClass('yui3-tab-selected'); } } } // Scroll to the desired element if this is a hash URL. if (node) { if (classTabView.get('rendered')) { scrollToNode(); } else { classTabView.once('renderedChange', scrollToNode); } } } else { tab = Y.one('#classdocs .api-class-tab.' + defaultTab); // When the `defaultTab` node isn't found, `localStorage` is stale. if (!tab && defaultTab !== 'index') { tab = Y.one('#classdocs .api-class-tab.index'); } if (classTabView.get('rendered')) { Y.Widget.getByNode(tab).set('selected', 1); } else { tab.addClass('yui3-tab-selected'); } } }; pjax.updateVisibility = function () { var container = pjax.get('container'); container.toggleClass('hide-inherited', !Y.one('#api-show-inherited').get('checked')); container.toggleClass('show-deprecated', Y.one('#api-show-deprecated').get('checked')); container.toggleClass('show-protected', Y.one('#api-show-protected').get('checked')); container.toggleClass('show-private', Y.one('#api-show-private').get('checked')); pjax.checkVisibility(); }; // -- Route Handlers ----------------------------------------------------------- pjax.handleClasses = function (req, res, next) { var status = res.ioResponse.status; // Handles success and local filesystem XHRs. if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) { pjax.initClassTabView(); } next(); }; pjax.handleFiles = function (req, res, next) { var status = res.ioResponse.status; // Handles success and local filesystem XHRs. if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) { pjax.initLineNumbers(); } next(); }; // -- Event Handlers ----------------------------------------------------------- pjax.onNavigate = function (e) { var hash = e.hash, originTarget = e.originEvent && e.originEvent.target, tab; if (hash) { tab = originTarget && originTarget.ancestor('.yui3-tab', true); if (hash === win.location.hash) { pjax.updateTabState('hashchange'); } else if (!tab) { win.location.hash = hash; } e.preventDefault(); return; } // Only scroll to the top of the page when the URL doesn't have a hash. this.set('scrollToTop', !e.url.match(/#.+$/)); bdNode.addClass('loading'); }; pjax.onOptionClick = function (e) { pjax.updateVisibility(); }; pjax.onTabSelectionChange = function (e) { var tab = e.newVal, tabId = tab.get('contentBox').getAttribute('href').substring(1); selectedTab = tab; // If switching from a previous tab (i.e., this is not the default tab), // replace the history entry with a hash URL that will cause this tab to // be selected if the user navigates away and then returns using the back // or forward buttons. if (e.prevVal && localStorage) { localStorage.setItem('tab_' + pjax.getPath(), tabId); } pjax.checkVisibility(tab); }; // -- Init --------------------------------------------------------------------- pjax.on('navigate', pjax.onNavigate); pjax.initRoot(); pjax.upgrade(); pjax.initClassTabView(); pjax.initLineNumbers(); pjax.updateVisibility(); Y.APIList.rootPath = pjax.get('root'); Y.one('#api-options').delegate('click', pjax.onOptionClick, 'input'); Y.on('hashchange', function (e) { pjax.updateTabState('hashchange'); }, win); }); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/js/tabs.js0000644000015600001650000000537412654470322027365 0ustar pbuserpbgroup00000000000000/* * Copyright 2011 Yahoo! Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI({ insertBefore: 'site_styles' }).use('tabview', function(Y) { var classdocs = Y.one('#classdocs'), tabviewIndexTable = {}; if (classdocs) { if (classdocs.all('li').size()) { var tabview = new Y.TabView({ srcNode: classdocs }); tabview.render(); classdocs.all('li a').each(function (item, index) { var hash = item.get(['hash']); type = hash.substring(1); if (!tabviewIndexTable[type]) { tabviewIndexTable[type] = index; } }) Y.all('.sidebox.on-page').each(function (item, index) { var children = item.all('li a'); children.each(function (cItem, cIndex) { return function () { var handleClick = function (e) { var node = Y.one(this), hash = node.get(['hash']), hashValue = hash.substring(1).split('_'), type = hashValue.shift(), ogKey = hashValue.join('_'); // in case the hash had other underscores if (tabviewIndexTable[type] > -1 && tabviewIndexTable[type] !== currentTab) { currentTab = tabviewIndexTable[type]; tabview.selectChild(tabviewIndexTable[type]); } } Y.on('click', handleClick, cItem) }() }) }); } } }); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/js/yui-prettify.js0000644000015600001650000000377512654470322031111 0ustar pbuserpbgroup00000000000000/* * Copyright 2011 Yahoo! Inc. * All rights reserved. *- * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. *- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI().use('node', function(Y) { var code = Y.all('.prettyprint.linenums'); if (code.size()) { code.each(function(c) { var lis = c.all('ol li'), l = 1; lis.each(function(n) { n.prepend(''); l++; }); }); var h = location.hash; location.hash = ''; h = h.replace('LINE_', 'LINENUM_'); location.hash = h; } }); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/js/api-search.js0000644000015600001650000001061012654470322030435 0ustar pbuserpbgroup00000000000000 /* * Copyright 2011 Yahoo! Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI.add('api-search', function (Y) { var Lang = Y.Lang, Node = Y.Node, YArray = Y.Array; Y.APISearch = Y.Base.create('apiSearch', Y.Base, [Y.AutoCompleteBase], { // -- Public Properties ---------------------------------------------------- RESULT_TEMPLATE: '
  • ' + '' + '

    {name}

    ' + '{resultType}' + '
    {description}
    ' + '{class}' + '
    ' + '
  • ', // -- Initializer ---------------------------------------------------------- initializer: function () { this._bindUIACBase(); this._syncUIACBase(); }, // -- Protected Methods ---------------------------------------------------- _apiResultFilter: function (query, results) { // Filter components out of the results. return YArray.filter(results, function (result) { return result.raw.resultType === 'component' ? false : result; }); }, _apiResultFormatter: function (query, results) { return YArray.map(results, function (result) { var raw = Y.merge(result.raw), // create a copy desc = raw.description || ''; // Convert description to text and truncate it if necessary. desc = Node.create('
    ' + desc + '
    ').get('text'); if (desc.length > 65) { desc = Y.Escape.html(desc.substr(0, 65)) + ' …'; } else { desc = Y.Escape.html(desc); } raw['class'] || (raw['class'] = ''); raw.description = desc; // Use the highlighted result name. raw.name = result.highlighted; return Lang.sub(this.RESULT_TEMPLATE, raw); }, this); }, _apiTextLocator: function (result) { return result.displayName || result.name; } }, { // -- Attributes ----------------------------------------------------------- ATTRS: { resultFormatter: { valueFn: function () { return this._apiResultFormatter; } }, resultFilters: { valueFn: function () { return this._apiResultFilter; } }, resultHighlighter: { value: 'phraseMatch' }, resultListLocator: { value: 'data.results' }, resultTextLocator: { valueFn: function () { return this._apiTextLocator; } }, source: { value: '/api/v1/search?q={query}&count={maxResults}' } } }); }, '3.4.0', {requires: [ 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources', 'escape' ]}); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/js/api-filter.js0000644000015600001650000000570112654470322030462 0ustar pbuserpbgroup00000000000000 /* * Copyright 2011 Yahoo! Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Yahoo! Inc. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ YUI.add('api-filter', function (Y) { Y.APIFilter = Y.Base.create('apiFilter', Y.Base, [Y.AutoCompleteBase], { // -- Initializer ---------------------------------------------------------- initializer: function () { this._bindUIACBase(); this._syncUIACBase(); }, getDisplayName: function(name) { Y.each(Y.YUIDoc.meta.allModules, function(i) { if (i.name === name && i.displayName) { name = i.displayName; } }); return name; } }, { // -- Attributes ----------------------------------------------------------- ATTRS: { resultHighlighter: { value: 'phraseMatch' }, // May be set to "classes" or "modules". queryType: { value: 'classes' }, source: { valueFn: function() { var self = this; return function(q) { var data = Y.YUIDoc.meta[self.get('queryType')], out = []; Y.each(data, function(v) { if (v.toLowerCase().indexOf(q.toLowerCase()) > -1) { out.push(v); } }); return out; }; } } } }); }, '3.4.0', {requires: [ 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources' ]}); ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/css/0000755000015600001650000000000012654470531026243 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/css/main.css0000644000015600001650000002421212654470322027700 0ustar pbuserpbgroup00000000000000/* Font sizes for all selectors other than the body are given in percentages, with 100% equal to 13px. To calculate a font size percentage, multiply the desired size in pixels by 7.6923076923. Here's a quick lookup table: 10px - 76.923% 11px - 84.615% 12px - 92.308% 13px - 100% 14px - 107.692% 15px - 115.385% 16px - 123.077% 17px - 130.769% 18px - 138.462% 19px - 146.154% 20px - 153.846% */ html { background: #fff; color: #333; overflow-y: scroll; } body { font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif; margin: 0; padding: 0; } /* -- Links ----------------------------------------------------------------- */ a { color: #DD4814; text-decoration: none; } a:hover { text-decoration: underline; } /* "Jump to Table of Contents" link is shown to assistive tools, but hidden from sight until it's focused. */ .jump { position: absolute; padding: 3px 6px; left: -99999px; top: 0; } .jump:focus { left: 40%; } /* -- Paragraphs ------------------------------------------------------------ */ p { margin: 1.3em 0; } dd p, td p { margin-bottom: 0; } dd p:first-child, td p:first-child { margin-top: 0; } /* -- Headings -------------------------------------------------------------- */ h1, h2, h3, h4, h5, h6 { color: #DD4814 font-family: 'Ubuntu', sans-serif; font-weight: bold; line-height: 1.1; margin: 1.1em 0 0.5em; } h1 { font-size: 184.6%; color: #30418C; margin: 0.75em 0 0.5em; } h2 { font-size: 153.846%; color: #E48A2B; } h3 { font-size: 138.462%; } h4 { border-bottom: 1px solid #DBDFEA; color: #E48A2B; font-size: 115.385%; font-weight: normal; padding-bottom: 2px; } h5, h6 { font-size: 107.692%; } /* -- Code and examples ----------------------------------------------------- */ code, kbd, pre, samp { font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 92.308%; line-height: 1.35; } p code, p kbd, p samp { background: #FCFBFA; border: 1px solid #EFEEED; padding: 0 3px; } a code, a kbd, a samp, pre code, pre kbd, pre samp, table code, table kbd, table samp, .intro code, .intro kbd, .intro samp, .toc code, .toc kbd, .toc samp { background: none; border: none; padding: 0; } pre.code, pre.terminal, pre.cmd { overflow-x: auto; *overflow-x: scroll; padding: 0.3em 0.6em; } pre.code { background: #FCFBFA; border: 1px solid #EFEEED; border-left-width: 5px; } pre.terminal, pre.cmd { background: #F0EFFC; border: 1px solid #D0CBFB; border-left: 5px solid #D0CBFB; } /* Don't reduce the font size of // elements inside
       blocks. */
    pre code, pre kbd, pre samp { font-size: 100%; }
    
    /* Used to denote text that shouldn't be selectable, such as line numbers or
       shell prompts. Guess which browser this doesn't work in. */
    .noselect {
        -moz-user-select: -moz-none;
        -khtml-user-select: none;
        -webkit-user-select: none;
        -o-user-select: none;
        user-select: none;
    }
    
    /* -- Lists ----------------------------------------------------------------- */
    dd { margin: 0.2em 0 0.7em 1em; }
    dl { margin: 1em 0; }
    dt { font-weight: bold; }
    
    /* -- Tables ---------------------------------------------------------------- */
    caption, th { text-align: left; }
    
    table {
        border-collapse: collapse;
        width: 100%;
    }
    
    td, th {
        border: 1px solid #fff;
        padding: 5px 12px;
        vertical-align: top;
    }
    
    td { background: #E6E9F5; }
    td dl { margin: 0; }
    td dl dl { margin: 1em 0; }
    td pre:first-child { margin-top: 0; }
    
    th {
        background: #D2D7E6;/*#97A0BF*/
        border-bottom: none;
        border-top: none;
        color: #000;/*#FFF1D5*/
        font-family: 'Trebuchet MS', sans-serif;
        font-weight: bold;
        line-height: 1.3;
        white-space: nowrap;
    }
    
    
    /* -- Layout and Content ---------------------------------------------------- */
    #doc {
        margin: auto;
        min-width: 1024px;
    }
    
    #main { width: 754px; }
    #sidebar { width: 270px; margin: 0 15px; }
    
    .content { padding: 0 20px 0 25px; }
    
    /* -- Sidebar --------------------------------------------------------------- */
    .sidebox {
        background: #F9F9FC;/*E6E9F5*/
        border: 1px solid #D4D8EB;
    
        -moz-border-radius: 4px;
        -webkit-border-radius: 4px;
        border-radius: 4px;
        -moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
        -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
        box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
        font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Helvetica', 'Arial', sans-serif;
        margin: 0 0 15px 0;
        padding-bottom: 1px;
    }
    
    .sidebox h2 {
        background: #E5E6F1;
        -moz-border-radius: 4px 4px 0 0;
        -webkit-border-radius: 4px 4px 0 0;
        border-radius: 4px 4px 0 0;
        color: #5E6BA4;
        font-weight: bold;
        font-size: 107.692%;
        margin: 0;
        padding: 4px 7px 5px;
    }
    
    .sidebox .bd {
        font-size: 84.615%;
        padding: 0 5px 0 8px;
    }
    
    .sidebox li { list-style-type: disc; color:#D4D5E3; }
    
    .sidebox ol, .sidebox ul {
        margin-left: 0;
        padding-left: 16px;
    }
    
    .sidebox ol ol, .sidebox ol ul,
    .sidebox ul ol, .sidebox ul ul {
        margin: 0;
        padding-left: 16px;
    }
    
    /* -- Table of Contents ----------------------------------------------------- */
    
    /* The #toc id refers to the single global table of contents, while the .toc
       class refers to generic TOC lists that could be used throughout the page. */
    
    .toc code, .toc kbd, .toc samp { font-size: 100%; }
    .toc li { font-weight: bold; }
    .toc li li { font-weight: normal; }
    
    /* -- Intro and Example Boxes ----------------------------------------------- */
    .intro, .example { margin-bottom: 2em; }
    
    .example {
        -moz-border-radius: 4px;
        -webkit-border-radius: 4px;
        border-radius: 4px;
        -moz-box-shadow: 0 0 5px #bfbfbf;
        -webkit-box-shadow: 0 0 5px #bfbfbf;
        box-shadow: 0 0 5px #bfbfbf;
        padding: 1em;
    }
    
    .intro {
        background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
    }
    
    /* -- Other Styles ---------------------------------------------------------- */
    
    /* These are probably YUI-specific, and should be moved out of Selleck's default
       theme. */
    
    .button {
        border: 1px solid #dadada;
        -moz-border-radius: 3px;
        -webkit-border-radius: 3px;
        border-radius: 3px;
        color: #444;
        display: inline-block;
        font-family: Helvetica, Arial, sans-serif;
        font-size: 92.308%;
        font-weight: bold;
        padding: 4px 13px 3px;
        -moz-text-shadow: 1px 1px 0 #fff;
        -webkit-text-shadow: 1px 1px 0 #fff;
        text-shadow: 1px 1px 0 #fff;
        white-space: nowrap;
    
        background: #EFEFEF; /* old browsers */
        background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
        background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
    }
    
    .button:hover {
        border-color: #466899;
        color: #fff;
        text-decoration: none;
        -moz-text-shadow: 1px 1px 0 #222;
        -webkit-text-shadow: 1px 1px 0 #222;
        text-shadow: 1px 1px 0 #222;
    
        background: #6396D8; /* old browsers */
        background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
        background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
    }
    
    .newwindow { text-align: center; }
    
    .header .version em {
        display: block;
        text-align: right;
    }
    
    .yui3-skin-sam #classdocs .yui3-tabview-panel {
        background-color: transparent;
    }
    
    .yui3-skin-sam #classdocs .yui3-tabview-panel {
        border: none;
    }
    
    .yui3-skin-sam .yui3-tabview .yui3-tab,
    .yui3-skin-sam .yui3-tabview .yui3-tab-selected,
    .yui3-skin-sam .yui3-tabview .yui3-tab-hover {
        background: -moz-linear-gradient(center top , #F4F0EC 0%, #D6D2CE 100%) repeat scroll 0 0 transparent;
        border-bottom: 1px solid #DEDCD9;
        border-right: 1px solid #CDCBC8;
        border-left: 1px solid #CDCBC8;
        border-top: 1px solid #DADADA;
        color: #333333;
        text-decoration: none;
    }
    .yui3-skin-sam .yui3-tabview .yui3-tab-label,
    .yui3-skin-sam .yui3-tabview .yui3-tab-selected .yui3-tab-label {
        border: none;
        background: none;
        font-size: 100%;
        color: #000;
    }
    
    .yui3-skin-sam .yui3-tabview .yui3-tab-selected,
    .yui3-skin-sam .yui3-tabview .yui3-tab-hover {
        background: none;
        background-color: #fff;
        border-bottom-color: #FFFFFF;
        border-top: 2px solid #8193C9;
        font-weight: bold;
        color: #000;
    
    }
    
    .yui3-skin-sam .yui3-tabview-list {
        border-color: #DFDFDF;
        border-width: 0 0 1px; 
    }
    
    
    a.external {
        background-image: url(external-small.png);
        background-repeat: no-repeat;
        background-position: 0 0;
        padding-left: 16px;
    }
    
    #classdocs .item {
        border-bottom: 1px solid #466899;
        margin: 1em 0;
        padding: 1.5em;
    }
    
    #classdocs .item .params p,
        #classdocs .item .returns p,{
        display: inline;
    }
    
    #classdocs .item em code, #classdocs .item em.comment {
        color: green;
    }
    
    #classdocs .item em.comment a {
        color: green;
        text-decoration: underline;
    }
    
    #classdocs .foundat {
        font-size: 11px;
        font-style: normal;
    }
    
    .attrs .emits {
        margin-left: 2em;
        padding: .5em;
        border-left: 1px dashed #ccc;
    }
    
    abbr {
        border-bottom: 1px dashed #ccc;
        font-size: 80%;
        cursor: help;
    }
    
    .prettyprint li.L0, 
    .prettyprint li.L1, 
    .prettyprint li.L2, 
    .prettyprint li.L3, 
    .prettyprint li.L5, 
    .prettyprint li.L6, 
    .prettyprint li.L7, 
    .prettyprint li.L8 {
        list-style: decimal;
    }
    
    ul li p {
        margin-top: 0;
    }
    
    .method .name {
        font-size: 110%;
    }
    
    #hd {
        background: -moz-linear-gradient(center top , #DCDBD9 0%, #F6F5F3 100%) repeat scroll 0 0 transparent;
        border-bottom: 1px solid #DFDFDF;
        padding: 0 15px 1px 20px;
        margin-bottom: 15px;
    }
    
    #hd img {
        margin-right: 10px;
        vertical-align: middle;
    }
    
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/css/logo.png0000644000015600001650000000135512654470322027713 0ustar  pbuserpbgroup00000000000000PNG
    
    
    IHDR=29PLTEvO_1S#ƶl{]j@H9	pHYstIME
    &	fEGIDAThv eQ;,.i]	9=Ï	QxBHB$$!	IȿTobH
    L,LAJ!z2@{}q%>D*()29zfv0v'xY|~2ܾHIȔdY.Ҭ$FH[62MT%a>$XmSUhiKY.kUdYps6#È+ټV`HU2z/[Y
    ̷]PT&[o^|ߗuǞl 5e]6UǶEu<*5d+BoIHB$$!	JnɒőIENDB`ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/css/external-small.png0000644000015600001650000000075312654470322031704 0ustar  pbuserpbgroup00000000000000PNG
    
    
    IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%B@,0]VVV0affȊ=8JOy %pJջ+30¿}sʋ`n|dx
    mXa |ȹWpA+ca|u=zϰp-l\w01nCy?*Yr%cfxÿ8
    `g2ȉ0!GA[EV66>Ӏ'E]AOCAY^#.S>>#񶉝
    "ÏOv%w@FX^`ddR|8 wX
    	 OƓIENDB`ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/index.html0000644000015600001650000000033012654470322027442 0ustar  pbuserpbgroup00000000000000
    
        
            Redirector
            
        
        
            Click here to redirect
        
    
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/0000755000015600001650000000000012654470530026747 5ustar  pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/0000755000015600001650000000000012654470531030616 5ustar  pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/COPYING0000644000015600001650000002613612654470322031657 0ustar  pbuserpbgroup00000000000000
                                     Apache License
                               Version 2.0, January 2004
                            http://www.apache.org/licenses/
    
       TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    
       1. Definitions.
    
          "License" shall mean the terms and conditions for use, reproduction,
          and distribution as defined by Sections 1 through 9 of this document.
    
          "Licensor" shall mean the copyright owner or entity authorized by
          the copyright owner that is granting the License.
    
          "Legal Entity" shall mean the union of the acting entity and all
          other entities that control, are controlled by, or are under common
          control with that entity. For the purposes of this definition,
          "control" means (i) the power, direct or indirect, to cause the
          direction or management of such entity, whether by contract or
          otherwise, or (ii) ownership of fifty percent (50%) or more of the
          outstanding shares, or (iii) beneficial ownership of such entity.
    
          "You" (or "Your") shall mean an individual or Legal Entity
          exercising permissions granted by this License.
    
          "Source" form shall mean the preferred form for making modifications,
          including but not limited to software source code, documentation
          source, and configuration files.
    
          "Object" form shall mean any form resulting from mechanical
          transformation or translation of a Source form, including but
          not limited to compiled object code, generated documentation,
          and conversions to other media types.
    
          "Work" shall mean the work of authorship, whether in Source or
          Object form, made available under the License, as indicated by a
          copyright notice that is included in or attached to the work
          (an example is provided in the Appendix below).
    
          "Derivative Works" shall mean any work, whether in Source or Object
          form, that is based on (or derived from) the Work and for which the
          editorial revisions, annotations, elaborations, or other modifications
          represent, as a whole, an original work of authorship. For the purposes
          of this License, Derivative Works shall not include works that remain
          separable from, or merely link (or bind by name) to the interfaces of,
          the Work and Derivative Works thereof.
    
          "Contribution" shall mean any work of authorship, including
          the original version of the Work and any modifications or additions
          to that Work or Derivative Works thereof, that is intentionally
          submitted to Licensor for inclusion in the Work by the copyright owner
          or by an individual or Legal Entity authorized to submit on behalf of
          the copyright owner. For the purposes of this definition, "submitted"
          means any form of electronic, verbal, or written communication sent
          to the Licensor or its representatives, including but not limited to
          communication on electronic mailing lists, source code control systems,
          and issue tracking systems that are managed by, or on behalf of, the
          Licensor for the purpose of discussing and improving the Work, but
          excluding communication that is conspicuously marked or otherwise
          designated in writing by the copyright owner as "Not a Contribution."
    
          "Contributor" shall mean Licensor and any individual or Legal Entity
          on behalf of whom a Contribution has been received by Licensor and
          subsequently incorporated within the Work.
    
       2. Grant of Copyright License. Subject to the terms and conditions of
          this License, each Contributor hereby grants to You a perpetual,
          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
          copyright license to reproduce, prepare Derivative Works of,
          publicly display, publicly perform, sublicense, and distribute the
          Work and such Derivative Works in Source or Object form.
    
       3. Grant of Patent License. Subject to the terms and conditions of
          this License, each Contributor hereby grants to You a perpetual,
          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
          (except as stated in this section) patent license to make, have made,
          use, offer to sell, sell, import, and otherwise transfer the Work,
          where such license applies only to those patent claims licensable
          by such Contributor that are necessarily infringed by their
          Contribution(s) alone or by combination of their Contribution(s)
          with the Work to which such Contribution(s) was submitted. If You
          institute patent litigation against any entity (including a
          cross-claim or counterclaim in a lawsuit) alleging that the Work
          or a Contribution incorporated within the Work constitutes direct
          or contributory patent infringement, then any patent licenses
          granted to You under this License for that Work shall terminate
          as of the date such litigation is filed.
    
       4. Redistribution. You may reproduce and distribute copies of the
          Work or Derivative Works thereof in any medium, with or without
          modifications, and in Source or Object form, provided that You
          meet the following conditions:
    
          (a) You must give any other recipients of the Work or
              Derivative Works a copy of this License; and
    
          (b) You must cause any modified files to carry prominent notices
              stating that You changed the files; and
    
          (c) You must retain, in the Source form of any Derivative Works
              that You distribute, all copyright, patent, trademark, and
              attribution notices from the Source form of the Work,
              excluding those notices that do not pertain to any part of
              the Derivative Works; and
    
          (d) If the Work includes a "NOTICE" text file as part of its
              distribution, then any Derivative Works that You distribute must
              include a readable copy of the attribution notices contained
              within such NOTICE file, excluding those notices that do not
              pertain to any part of the Derivative Works, in at least one
              of the following places: within a NOTICE text file distributed
              as part of the Derivative Works; within the Source form or
              documentation, if provided along with the Derivative Works; or,
              within a display generated by the Derivative Works, if and
              wherever such third-party notices normally appear. The contents
              of the NOTICE file are for informational purposes only and
              do not modify the License. You may add Your own attribution
              notices within Derivative Works that You distribute, alongside
              or as an addendum to the NOTICE text from the Work, provided
              that such additional attribution notices cannot be construed
              as modifying the License.
    
          You may add Your own copyright statement to Your modifications and
          may provide additional or different license terms and conditions
          for use, reproduction, or distribution of Your modifications, or
          for any such Derivative Works as a whole, provided Your use,
          reproduction, and distribution of the Work otherwise complies with
          the conditions stated in this License.
    
       5. Submission of Contributions. Unless You explicitly state otherwise,
          any Contribution intentionally submitted for inclusion in the Work
          by You to the Licensor shall be under the terms and conditions of
          this License, without any additional terms or conditions.
          Notwithstanding the above, nothing herein shall supersede or modify
          the terms of any separate license agreement you may have executed
          with Licensor regarding such Contributions.
    
       6. Trademarks. This License does not grant permission to use the trade
          names, trademarks, service marks, or product names of the Licensor,
          except as required for reasonable and customary use in describing the
          origin of the Work and reproducing the content of the NOTICE file.
    
       7. Disclaimer of Warranty. Unless required by applicable law or
          agreed to in writing, Licensor provides the Work (and each
          Contributor provides its Contributions) on an "AS IS" BASIS,
          WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
          implied, including, without limitation, any warranties or conditions
          of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
          PARTICULAR PURPOSE. You are solely responsible for determining the
          appropriateness of using or redistributing the Work and assume any
          risks associated with Your exercise of permissions under this License.
    
       8. Limitation of Liability. In no event and under no legal theory,
          whether in tort (including negligence), contract, or otherwise,
          unless required by applicable law (such as deliberate and grossly
          negligent acts) or agreed to in writing, shall any Contributor be
          liable to You for damages, including any direct, indirect, special,
          incidental, or consequential damages of any character arising as a
          result of this License or out of the use or inability to use the
          Work (including but not limited to damages for loss of goodwill,
          work stoppage, computer failure or malfunction, or any and all
          other commercial damages or losses), even if such Contributor
          has been advised of the possibility of such damages.
    
       9. Accepting Warranty or Additional Liability. While redistributing
          the Work or Derivative Works thereof, You may choose to offer,
          and charge a fee for, acceptance of support, warranty, indemnity,
          or other liability obligations and/or rights consistent with this
          License. However, in accepting such obligations, You may act only
          on Your own behalf and on Your sole responsibility, not on behalf
          of any other Contributor, and only if You agree to indemnify,
          defend, and hold each Contributor harmless for any liability
          incurred by, or claims asserted against, such Contributor by reason
          of your accepting any such warranty or additional liability.
    
       END OF TERMS AND CONDITIONS
    
       APPENDIX: How to apply the Apache License to your work.
    
          To apply the Apache License to your work, attach the following
          boilerplate notice, with the fields enclosed by brackets "[]"
          replaced with your own identifying information. (Don't include
          the brackets!)  The text should be enclosed in the appropriate
          comment syntax for the file format. We also recommend that a
          file or class name and description of purpose be included on the
          same "printed page" as the copyright notice for easier
          identification within third-party archives.
    
       Copyright [yyyy] [name of copyright owner]
    
       Licensed under the Apache License, Version 2.0 (the "License");
       you may not use this file except in compliance with the License.
       You may obtain a copy of the License at
    
           http://www.apache.org/licenses/LICENSE-2.0
    
       Unless required by applicable law or agreed to in writing, software
       distributed under the License is distributed on an "AS IS" BASIS,
       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       See the License for the specific language governing permissions and
       limitations under the License.
    ././@LongLink0000000000000000000000000000015100000000000011212 Lustar  00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/prettify-min.jsubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/prettify-mi0000644000015600001650000004564712654470322033030 0ustar  pbuserpbgroup00000000000000/*
     * Copyright 2011 Yahoo! Inc.
     * All rights reserved.
     *-
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions are met:
     *     * Redistributions of source code must retain the above copyright
     *       notice, this list of conditions and the following disclaimer.
     *     * Redistributions in binary form must reproduce the above copyright
     *       notice, this list of conditions and the following disclaimer in the
     *       documentation and/or other materials provided with the distribution.
     *     * Neither the name of the Yahoo! Inc. nor the
     *       names of its contributors may be used to endorse or promote products
     *       derived from this software without specific prior written permission.
     *-
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY
     * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;atau[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
    ././@LongLink0000000000000000000000000000015200000000000011213 Lustar  00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/prettify-min.cssubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/prettify-mi0000644000015600001650000000124312654470322033010 0ustar  pbuserpbgroup00000000000000.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}././@LongLink0000000000000000000000000000014600000000000011216 Lustar  00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/CHANGES.htmlubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/CHANGES.htm0000644000015600001650000001370412654470322032403 0ustar  pbuserpbgroup00000000000000
      
        
        Change Log
      
      
        README
    
        

    Known Issues

    • Perl formatting is really crappy. Partly because the author is lazy and partly because Perl is hard to parse.
    • On some browsers, <code> elements with newlines in the text which use CSS to specify white-space:pre will have the newlines improperly stripped if the element is not attached to the document at the time the stripping is done. Also, on IE 6, all newlines will be stripped from <code> elements because of the way IE6 produces innerHTML. Workaround: use <pre> for code with newlines.

    Change Log

    29 March 2007

    • Added tests for PHP support to address issue 3.
    • Fixed bug: prettyPrintOne was not halting. This was not reachable through the normal entry point.
    • Fixed bug: recursing into a script block or PHP tag that was not properly closed would not silently drop the content. (test)
    • Fixed bug: was eating tabs (test)
    • Fixed entity handling so that the caveat

      Caveats: please properly escape less-thans. x&lt;y instead of x<y, and use " instead of &quot; for string delimiters.

      is no longer applicable.
    • Added noisefree's C# patch
    • Added a distribution that has comments and whitespace removed to reduce download size from 45.5kB to 12.8kB.

    4 Jul 2008

    • Added language specific formatters that are triggered by the presence of a lang-<language-file-extension>
    • Fixed bug: python handling of '''string'''
    • Fixed bug: / in regex [charsets] should not end regex

    5 Jul 2008

    • Defined language extensions for Lisp and Lua

    14 Jul 2008

    • Language handlers for F#, OCAML, SQL
    • Support for nocode spans to allow embedding of line numbers and code annotations which should not be styled or otherwise affect the tokenization of prettified code. See the issue 22 testcase.

    6 Jan 2009

    • Language handlers for Visual Basic, Haskell, CSS, and WikiText
    • Added .mxml extension to the markup style handler for Flex MXML files. See issue 37.
    • Added .m extension to the C style handler so that Objective C source files properly highlight. See issue 58.
    • Changed HTML lexer to use the same embedded source mechanism as the wiki language handler, and changed to use the registered CSS handler for STYLE element content.

    21 May 2009

    • Rewrote to improve performance on large files. See benchmarks.
    • Fixed bugs with highlighting of Haskell line comments, Lisp number literals, Lua strings, C preprocessor directives, newlines in Wiki code on Windows, and newlines in IE6.

    14 August 2009

    • Fixed prettifying of <code> blocks with embedded newlines.

    3 October 2009

    • Fixed prettifying of XML/HTML tags that contain uppercase letters.

    19 July 2010

    • Added support for line numbers. Bug 22
    • Added YAML support. Bug 123
    • Added VHDL support courtesy Le Poussin.
    • IE performance improvements. Bug 102 courtesy jacobly.
    • A variety of markup formatting fixes courtesy smain and thezbyg.
    • Fixed copy and paste in IE[678].
    • Changed output to use &#160; instead of &nbsp; so that the output works when embedded in XML. Bug 108.
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/vendor/prettify/README.html0000644000015600001650000001735012654470322032445 0ustar pbuserpbgroup00000000000000 Javascript code prettifier Languages : CH

    Javascript code prettifier

    Setup

    1. Download a distribution
    2. Include the script and stylesheets in your document (you will need to make sure the css and js file are on your server, and adjust the paths in the script and link tag)
      <link href="prettify.css" type="text/css" rel="stylesheet" />
      <script type="text/javascript" src="prettify.js"></script>
    3. Add onload="prettyPrint()" to your document's body tag.
    4. Modify the stylesheet to get the coloring you prefer

    Usage

    Put code snippets in <pre class="prettyprint">...</pre> or <code class="prettyprint">...</code> and it will automatically be pretty printed.
    The original Prettier
    class Voila {
    public:
      // Voila
      static const string VOILA = "Voila";
    
      // will not interfere with embedded tags.
    }
    class Voila {
    public:
      // Voila
      static const string VOILA = "Voila";
    
      // will not interfere with embedded tags.
    }

    FAQ

    Which languages does it work for?

    The comments in prettify.js are authoritative but the lexer should work on a number of languages including C and friends, Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl and Ruby, but, because of commenting conventions, doesn't work on Smalltalk, or CAML-like languages.

    LISPy languages are supported via an extension: lang-lisp.js.

    And similarly for CSS, Haskell, Lua, OCAML, SML, F#, Visual Basic, SQL, Protocol Buffers, and WikiText..

    If you'd like to add an extension for your favorite language, please look at src/lang-lisp.js and file an issue including your language extension, and a testcase.

    How do I specify which language my code is in?

    You don't need to specify the language since prettyprint() will guess. You can specify a language by specifying the language extension along with the prettyprint class like so:

    <pre class="prettyprint lang-html">
      The lang-* class specifies the language file extensions.
      File extensions supported by default include
        "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
        "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
        "xhtml", "xml", "xsl".
    </pre>

    It doesn't work on <obfuscated code sample>?

    Yes. Prettifying obfuscated code is like putting lipstick on a pig — i.e. outside the scope of this tool.

    Which browsers does it work with?

    It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. Look at the test page to see if it works in your browser.

    What's changed?

    See the change log

    Why doesn't Prettyprinting of strings work on WordPress?

    Apparently wordpress does "smart quoting" which changes close quotes. This causes end quotes to not match up with open quotes.

    This breaks prettifying as well as copying and pasting of code samples. See WordPress's help center for info on how to stop smart quoting of code snippets.

    How do I put line numbers in my code?

    You can use the linenums class to turn on line numbering. If your code doesn't start at line number 1, you can add a colon and a line number to the end of that class as in linenums:52.

    For example

    <pre class="prettyprint linenums:4"
    >// This is line 4.
    foo();
    bar();
    baz();
    boo();
    far();
    faz();
    <pre>
    produces
    // This is line 4.
    foo();
    bar();
    baz();
    boo();
    far();
    faz();
    

    How do I prevent a portion of markup from being marked as code?

    You can use the nocode class to identify a span of markup that is not code.

    <pre class=prettyprint>
    int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
      Continuation of comment */
    int y = bar();
    </pre>
    produces
    int x = foo();  /* This is a comment  This is not code
      Continuation of comment */
    int y = bar();
    

    For a more complete example see the issue22 testcase.

    I get an error message "a is not a function" or "opt_whenDone is not a function"

    If you are calling prettyPrint via an event handler, wrap it in a function. Instead of doing

    addEventListener('load', prettyPrint, false);
    wrap it in a closure like
    addEventListener('load', function (event) { prettyPrint() }, false);
    so that the browser does not pass an event object to prettyPrint which will confuse it.


    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/img/0000755000015600001650000000000012654470531026227 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/assets/img/spinner.gif0000644000015600001650000000517512654470322030402 0ustar pbuserpbgroup00000000000000GIF89a333555666[[[^^^oooppprrr777KKKMMMbbbcccsssuuuzzzجmmm]]]\\\! NETSCAPE2.0! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB! ICCRGBG1012H HLinomntrRGB XYZ  1acspMSFTIEC sRGB!-Made by Krasimira Nejcheva (www.loadinfo.net)! ,`'dif&EꊙG[u0(02n#S`lXtd ÈTC٤q{$9c+{"}  vxz{q";BY+-ist!! ,pH,2C:3`j>5+k: BRJ ˊkΖHrNFHnNdDȑ+rSݎKP/j~iD?.tq?//V:} '>GD2%&+D+CC4:" ^ $#Ϳ !<$ _lA! ,EE--D?EE2?9B?-E99EA66̻-66ǂ69ۚӻE A ƌ 2DF~ 2ACА iȐ$;! ,??D./H=-/D-.2D2/=/?+GD)/?GDD&" *?$ 6 )D#?++26 ؅ %F%T$bZ# 6Z(DBx封0 p$9rX(! , Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Welcome to Ubuntu HTML5 API Docs version 0.1

    These pages provide reference docs for the Ubunbtu HTML5 framework.

    See developer.ubuntu.com for more information on writing Ubuntu HTML5 apps, including: using the Ubuntu SDK, creating HTML5 app projects, importing Ubuntu HTML5 CSS and JavaScript into your app, and more.

    Ubuntu HTML5 widgets

    The Ubuntun HTML5 framework provides a set of "widgets" you use to build an application in the Ubuntu style (see design.ubuntu.com for descriptions of Ubuntu app "building blocks" with links to APIs for each supported implementation toolkit). For example, an Ubuntu HTML5 app has a dynamic Header with Tabs that together provide navigation through the app's Pages. Pages may contain Lists, Popovers, Buttons, Shapes, and a lot more. The app has a Footer (also called a Toolbar) to which you can add Buttons. There are many options and the list keeps growing!

    Each widget has its HTML part, a corresponding JavaScript object (many of which provide additional methods), and CSS styles.

    What you need to know

    To write Ubuntu HTML5 apps, you need to know:

    • How to declare each widget type in HTML
    • How to acces the JavaScript widget objects and use their methods
    • How to initialize the Ubuntu HTML5 framework at app load time

    These topics are introduced here and explained in the class documentation.

    Elements and special attributes

    Ubuntu HTML5 apps use normal HTML/HTML5 elements (like <div>, <section>, <ul>, and so on). However, special attributes are added to some key elements to declare them as Ubuntu HTML5 elements. This connects them with the Ubuntu HTML5 JavaScript framework. The data-role attribute is often used. Its value indicates the type of Ubuntu HTML5 element. For example, here's a button: <button data-role="button">.

    Making correct HTML declarations is necessary to connect your DOM elements to the Ubuntu HTML5 JavaScript framework and to Ubuntu HTML CSS styles. See the JavaScript class docs for sample HTML declarations.

    id attributes

    You can declare most Ubuntu HTML5 elements without id attributes. They will pick up the CSS styles and look fine. But, you generally need an id attribute to access the corresponding JavaScript objects. So it's a good idea to add them.

    JavaScript classes and methods

    Almost every Ubuntu HTML5 DOM element has a corresponding Ubuntu HTML5 JavaScript object. These are created automatically when you create an UbuntuUI object and execute its init() method. (This is usually done at startup, for example in the window.onload function).

    Many of these classes/objects have additional methods. For example, the List class provides methods to add items to the list, remove an item, apply a function to all items, and more.

    How these docs are organized

    These pages or organized by the Ubuntu HTML5 JavaScript classes. Each class has an example showing how the corresponding HTML is declared (as needed). And of course each class has API documentation explaining usage of all (public) methods.

    The single most important class is UbuntuUI, so start there.

    Then, an Ubuntu HTML5 app is structured as a PageStack of Pages, so be sure to visit those classes.

    Ubuntu HTML5 CSS

    Be sure to check out the Ubuntu HTML5 CSS files you import into your app. They provide a set of styles that theme the HTML5 widgets to the Ubuntu app design and style.

    Let's grow this!

    Let's work together to keep HTML5 as a top-notch app development framework on Ubuntu. Everyone can help by filing bugs, triaging them, and of course, fixing them. So let's get to work writing apps!

    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/0000755000015600001650000000000012654470531025606 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.List.html0000644000015600001650000003272612654470322031136 0ustar pbuserpbgroup00000000000000 UbuntuUI.List - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.List

    Class defined in: list.js:23

    A List comes with various options, including: a <em>header</em>, main text (pushed left), an icon (pushed left), and a secondary label (pushed right).

    UbuntuUI.List( )
    list.js:23
    Example
    <section data-role="list" id="testlist">
          <header>My header text</header>
          <ul>
            <li>
              <a href="#">Main text, to the left</a>
            </li>
            <li>
              <a href="#">Main text</a>
              <label>Right text</label>
            </li>
            <li>
              <aside>
                <img src="someicon.png">
              </aside>
              <a href="#">Main text</a>
              <label>Right</label>
            </li>
          </ul>
         </section>
        
         JavaScript access:
           var list = UI.list('[id="testlist"]');
    Element append( text, label, id, onclick, user_data )
    list.js:104

    Append an item to a list

    Parameters:
    • text <String>
      • The main text, flushed left (no markup)
    • label <String>
      • Additional text, flushed right (no markup)
    • id <ID>
      • An id attribute value set for the new list item (must be unique in DOM)
    • onclick <Function>
      • The click callback function
    • user_data <Object>
      • Additional data that is passed to the click callback

    Returns: <Element>
    • The created list item, or null on failure ot create
    at( index )
    list.js:144

    Gets a list item <li> by its index, where index counting starts from 1

    Parameters:
    • index <Number>

    Returns:

    The list item, or null on failure

    DOMElement element( )
    list.js:187

    Returns the DOM element associated with the selector this widget is bind to.


    Returns: <DOMElement>
    Example
           var mylist = UI.list("#listid").element();
    forEach( func )
    list.js:174

    Iterates over all list items and runs a provided function on each

    Parameters:
    • func <Function>
      • The function to run on each list item
    remove( index )
    list.js:155

    Removes a list item <li> by its index, where index counting starts from 1

    Parameters:
    • index <Number>
    removeAllItems( )
    list.js:166

    Removes all items from a list

    setHeader( text )
    list.js:77

    Add or Set the List Header

    Parameters:
    • text <String>
      • The header text
    ././@LongLink0000000000000000000000000000014700000000000011217 Lustar 00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.OptionSelector.htmlubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.OptionSelector.ht0000644000015600001650000001352412654470322032636 0ustar pbuserpbgroup00000000000000 UbuntuUI.OptionSelector - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.OptionSelector

    Class defined in: option-selector.js:23

    OptionSelector is a component displaying either a single selected value or expanded multiple choice with an optional image and subtext when not expanded, when expanding it opens a listing of all the possible values for selection with an additional option of always being expanded. If multiple choice is selected the list is expanded automatically.

    UbuntuUI.OptionSelector( )
    option-selector.js:23
    Example
     <section data-role="option-selector" id="OptionSelectorID">
           <ul>
             <li data-value="0">
               <p>Label 1</p>
             </li>
             <li data-value="1">
               <p>Label 2</p>
             </li>
             <li data-value="3">
               <p>Label 3</p>
             </li>
           </ul>
         </section>
        
         JavaScript access:
        
         Expanded:
           UI.optionselector("OptionSelectorID", true);
         Expanded and multi selection:
           UI.optionselector("OptionSelectorID", true, true);
         Multi selection:
           UI.optionselector("OptionSelectorID", false, true);
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Tabs.html0000644000015600001650000002057312654470322031111 0ustar pbuserpbgroup00000000000000 UbuntuUI.Tabs - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Tabs

    Class defined in: tabs.js:23

    One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application.

    Tabs are defined from within the Header part of your application HTML. See the Header class for more information.

    Declare the Header and Tabs in HTML as a direct child of the top level Page as a sibling to the content div.

    UbuntuUI.Tabs( )
    tabs.js:23
    Example
     <body>
           <div data-role="mainview">
        
             <header data-role="header">
               <ul data-role="tabs">
                 <li data-role="tabitem" data-page="main">
                   Main
                 </li>
                 <li data-role="tabitem" data-page="page2">
                   Two
                 </li>
               </ul>
             </header>
        
             <div data-role="content">
               <div data-role="tab" id="main">
                 [...]
               </div>
        
               <div data-role="tab" id="page2">
                 [...]
               </div>
             </div>
        
           </div>
         </body>
        
         JavaScript access:
         UI.tabs.METHOD();
    count <Unknown>
    tabs.js:136

    Return the number of tab elements in the header

    currentPage <Unknown>
    tabs.js:108

    Return the page associated with the currently selected tab

    selectedTab <Unknown>
    tabs.js:120

    Return the currently selected tab element

    selectedTabIndex <Unknown>
    tabs.js:86

    Return the index of the selected tab

    selectedTabIndex <Unknown>
    tabs.js:95

    Sets the index of the selected tab

    tabChildren <Unknown>
    tabs.js:145

    Return the list of DOM elements of the tab

    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Tab.html0000644000015600001650000002201312654470322030715 0ustar pbuserpbgroup00000000000000 UbuntuUI.Tab - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Tab

    Class defined in: tab.js:22

    One of the navigation pattern that can be used within an Ubuntu App is the flat navigation. Tabs are the standard way to provide such a navigation pattern from within your application.

    A Tab represents the UI element that hosts your tab content. This UI element is being activated by the user selecting it as part of the Header element.

    UbuntuUI.Tab( )
    tab.js:22
    Example
     </body>
        
           <div data-role="mainview">
             <header data-role="header" id="headerID">
               <ul data-role="tabs">
                 <li data-role="tabitem" data-page="tabID">
                   Main
                 </li>
                 <li data-role="tabitem" data-page="page2">
                   Two
                 </li>
               </ul>
             </header>
        
             <div data-role="content">
                 <div data-role="tab" id="tabID">
                   [...]
                 </div>
                 <div data-role="tab" id="page2">
                   [...]
                 </div>
             </div>
        
           </div>
         </body>
        
         JavaScript access:
         var tab = UI.tab("tabID");
    activate( )
    tab.js:84

    Activates the current tab.

    deactivate( )
    tab.js:76

    Deactivates the current tab.

    DOMElement element( )
    tab.js:65

    Returns the DOM element associated with the selector this widget is bind to.


    Returns: <DOMElement>
    Example
      var mytab = UI.tab("tabid").element();
    Boolean isTab( )
    tab.js:94

    Validates that a given DOM node element is a Ubuntu UI Tab.


    Returns: <Boolean>

    if the DOM element is a tab

    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Toolbar.html0000644000015600001650000002106512654470322031617 0ustar pbuserpbgroup00000000000000 UbuntuUI.Toolbar - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Toolbar

    Class defined in: toolbars.js:23

    A Toolbar is the JavaScript representation of an Ubuntu HTML5 app <em>footer</em>.

    ######Contained List provides buttons The Toolbar contains a List, where each list item is treated as a Button (see below). List items (Buttons) are pushed to the right. The default Back button always exists to the left and does not need to be declared.

    #####Default and custom footers See the Pagestack class documentation for information about the default application-wide Footer, customizing it, and adding Page-specific Footers.

    UbuntuUI.Toolbar( )
    toolbars.js:23
    Example
     <footer data-role="footer" class="revealed" id="footerID">
           <nav>
             <ul>
               <li>
                 <a href="#" id="home">Home</a>
               </li>
             </ul>
           </nav>
         </footer>
        
         JavaScript access:
         var toolbar = UI.toolbar("toolbarID");
         UI.button('home').click(function () {
           UI.pagestack.push("main");
         });
        
    element( )
    toolbars.js:184

    Returns the DOM element associated with the id this widget is bind to.

    Example
           var mytoolbar = UI.toolbar("toolbarid").element();
    hide( )
    toolbars.js:168

    Hide a Toolbar

    show( )
    toolbars.js:160

    Display a Toolbar

    toggle( )
    toolbars.js:176

    Toggle show/hide status of a Toolbar

    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Page.html0000644000015600001650000002637212654470322031077 0ustar pbuserpbgroup00000000000000 UbuntuUI.Page - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Page

    Class defined in: page.js:23

    One of the navigation pattern that can be used within an Ubuntu App is the deep navigation. This pattern is implemented by the Pagestack. A Pagestack contains one or more Pages. Each page displays full-screen. See the Pagestack class.

    Each Page must have <em>id</em> and <em>data-title</em> attributes. The <em>id</em> attribute is used a unique reference to push the Page to the top of the Pagestack (see the Pagestack class). The <em>data-title</em> attribute is used to update the Header title as pages are pushed and poped.

    UbuntuUI.Page( )
    page.js:23
    Example
     </body>
           <div data-role="mainview">
        
             <header data-role="header">
             </header>
        
             <div data-role="content">
               <div data-role="pagestack">
                 <div data-role="page" data-title="Main" id="main">
                   [...]
                 </div>
                 <div data-role="page" data-title="My Data" id="data">
                   [...]
                 </div>
               </div>
             </div>
        
           </div>
         </body>
        
         JavaScript access:
         var page = UI.page("pageID");
    activate( properties )
    page.js:109

    Activates the current page.

    Parameters:
    • properties <Object>
      • Data to be passed down to any activation callback listening for the page activation (see Page.onactivated)
    deactivate( )
    page.js:101

    Deactivates the current page.

    element( )
    page.js:67

    Returns the DOM element associated with the selector this widget is bind to.

    Example
      var mypage = UI.page("pageid").element();
    Boolean isPage( )
    page.js:182

    Validates that a given DOM node element is a Ubuntu UI Page.


    Returns: <Boolean>

    if the DOM element is a page

    onactivated( callback )
    page.js:121

    Activates the current page.

    Parameters:
    • callback <Function>
      • Callback function called with activation properties (from Pagestack.push) when the page is activated
    actions <List>
    page.js:77

    actions property.

    title <String>
    page.js:89

    title property.

    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Header.html0000644000015600001650000001751612654470322031413 0ustar pbuserpbgroup00000000000000 UbuntuUI.Header - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Header

    Class defined in: header.js:23

    An Ubuntu Header wraps the general Tabs definitions and interaction in the case of a Tab navigation pattern or is used to display the title of the current page when using a PageStack navigation pattern.

    In the case of a Tab navigation pattern, declare the Header and its Tabs in HTML as a direct child of the top level MainView as a sibling to the <em>content</em> div.

    In the case of a PageStack navigation pattern, the Ubuntu Header HTML element should be present and can be left empty. It will be automatically updated to hold the Title of the current Page being visited. The value of such a title is taken from the data-title attribute of the currently visited Page as it is being pushed at the top of the stack (see PageStack.push()).

    ######Contained list provides Page navigation A contained unordered list has list items, each of which has "data-page" data attribute whose value of a Page ID that it targets. Clicking the Header/Tabs allows the user to navigate to the Pages identified by these IDs.

    UbuntuUI.Header( )
    header.js:23
    Example
     <body>
           <div data-role="mainview">
        
             <header data-role="header" id="headerID">
               <ul data-role="tabs">
                 <li data-role="tabitem" data-page="main">Main</li>
                 <li data-role="tabitem" data-page="two">Two</li>
               </ul>
             </header>
        
             <div data-role="content">
               <div data-role="tab" id="main">
                   [...]
               </div>
               <div data-role="tab" id="two">
                   [...]
               </div>
             </div>
        
           </div>
         </body>
        
         JavaScript access:
         var header = UI.header("headerID");
    DOMElement element( )
    header.js:72

    Returns the DOM element associated with the id this widget is bind to.


    Returns: <DOMElement>
    Example
       var myheader = UI.header("headerid").element();
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Popover.html0000644000015600001650000002235412654470322031651 0ustar pbuserpbgroup00000000000000 UbuntuUI.Popover - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Popover

    Class defined in: popovers.js:23

    A Popover is a div containng markup that can pop up and disappear. (Unlike a Dialog, Popovers are not full screen.)

    A Popoves often contain a List whose items are connected to useful JavaScript functions.

    ######Popover Position The Popover's position is set relative to a specified base element with the <em>data-gravity="LETTER"</em> attribute. LETTER values:

    • 'n': the base element is above the Popover
    • 's': the base element is below the Popover
    • 'e': the base element is to the east of (to the right of) the Popover (in right-to-left locales)
    • 'w': the base element is to the west of (to the left of) the Popover (in right-to-left locale)
    UbuntuUI.Popover( elem, id )
    popovers.js:23
    Parameters:
    • elem <String>
      • The element to which the Popover's position is relative
    • id <ID>
      • The id attribute of the Popover in HTML
    Example
     <p id="popoverBase">Text</p>
         <div class="popover active" data-gravity="n" id="popover">
           <ul class="list">
             <li class="active"><a href="#">Item1</a></li>
             <li><a href="#">Item2</a></li>
           </ul>
         </div>
        
         Javascript:
         var popBase = document.getElementById("popoverBase");
         var popover = UI.popover(popBase, "popover");
    element( )
    popovers.js:230

    Returns the DOM element associated with the id this widget is bind to.

    Example
       var mypopover = UI.popover("popoverid").element();
    hide( )
    popovers.js:143

    Hide a Popover

    show( )
    popovers.js:66

    Display a Popover

    toggle( )
    popovers.js:153

    Toggle show/hide status of a Popover

    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Button.html0000644000015600001650000001702412654470322031470 0ustar pbuserpbgroup00000000000000 UbuntuUI.Button - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Button

    Class defined in: buttons.js:23

    A Button.

    Note the Ubuntu CSS style classes: <em>positive</em>, <em>information</em>, <em>secondary</em>, and <em>negative</em>

    UbuntuUI.Button( )
    buttons.js:23
    Example
     <button data-role="button" id="buttonID">text</button>
        
         Javascript access:
         var button = UI.button("buttonID");
    click( callback )
    buttons.js:42

    Associate a function with the button's Click event

    Parameters:
    • callback <Function>
      • The function to execute on click
    Example
       UI.button("buttonid").click(function(){
                        console.log("clicked");
                       });
    DOMElement element( )
    buttons.js:57

    Returns the DOM element associated with the id this widget is bind to.


    Returns: <DOMElement>
    Example
       var mybutton = UI.button("buttonid").element();
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Shape.html0000644000015600001650000001643412654470322031261 0ustar pbuserpbgroup00000000000000 UbuntuUI.Shape - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Shape

    Class defined in: shape.js:23

    An Ubuntu Shape contains and decorates (with CSS styles) some markup, often an <em>img</em>.

    UbuntuUI.Shape( )
    shape.js:23
    Example
     <div data-role="shape" id="shapeID">
           <img src="URI"/>
         </div>
        
         JavaScript access:
         var shape = UI.shape("shapeID");
        
    click( - )
    shape.js:42

    Associate a function with the Click event

    Parameters:
    • - <Function>

      The function to execute on click

    Example
       UI.shape("id").click(function(){
                        console.log("Clicked");
                       });
    element( )
    shape.js:59

    Returns the DOM element associated with the id this widget is bind to.

    Example
       var myshape = UI.shape("shapeid").element();
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Dialog.html0000644000015600001650000002047412654470322031417 0ustar pbuserpbgroup00000000000000 UbuntuUI.Dialog - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Dialog

    Class defined in: dialogs.js:23

    Dialogs are modal full-screen popups that prevent other GUI interactions with the application until dismissed.

    Dialogs wrap arbitrary markup.

    Dialogs are declared at the top level inside the <em>content</em> div.

    UbuntuUI.Dialog( )
    dialogs.js:23
    Example
     <div data-role="content">
           <div data-role="pagestack">
             [...]
           </div>
           <div data-role="dialog" id="dialogID">
             [...]
           </div>
         </div>
        
         JavaScript access:
         var dialog = UI.dialog("dialogID");
        
    DOMElement element( )
    dialogs.js:73

    Returns the DOM element associated with the id this widget is bind to.


    Returns: <DOMElement>
    Example
       var mydialog = UI.dialog("dialogid").element();
    hide( )
    dialogs.js:59

    Hide a dialog by removing 'active' class

    show( )
    dialogs.js:52

    Display a dialog by adding 'active' CSS class

    toggle( )
    dialogs.js:66

    Toggle a dialog, which means removing its 'active' class if it has one, or adding the 'active' class if it does not have one

    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Progress.html0000644000015600001650000001554312654470322032025 0ustar pbuserpbgroup00000000000000 UbuntuUI.Progress - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Progress

    Class defined in: progress.js:23

    A Progress.

    Note the Ubuntu CSS style classes: <em>infinite</em>

    UbuntuUI.Progress( )
    progress.js:23
    Example
     <progress value="80" max="100"></progress>
        
         Javascript access:
         var pre = UI.progress("progressID");
    element( )
    progress.js:47

    Returns the DOM element associated with the id this widget is bind to.

    Example
           var myprogress = UI.progress("progressid").element();
    update( )
    progress.js:59

    Updates the value of the progress bar

    Example
           myprogress.update(30);
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.html0000644000015600001650000005251012654470322030215 0ustar pbuserpbgroup00000000000000 UbuntuUI - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI

    Class defined in: core.js:27

    UbuntuUI is the critical Ubuntu HTML5 framework class. You need to construct an UbuntuUI object and initialize it to have an Ubuntu HTML5 app. You then use this object to access Ubuntu HTML5 objects (and object methods) that correspond to the Ubuntu HTML5 DOM elements.

    Note: The UbuntuUI object is "UI" in all API doc examples.

    UbuntuUI( )
    core.js:27
    Example
     var UI = new UbuntuUI();
         window.onload = function () {
           UI.init();
           UI.pagestack.push('pageid');
           [...]
         };
    Button button( id )
    core.js:476

    Gets an Ubuntu Button object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Button>
    • The Button with the specified id
    Dialog dialog( id )
    core.js:502

    Gets an Ubuntu Dialog object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Dialog>
    • The Dialog with the specified id
    Element element( )
    core.js:589

    Gets the DOM element from a given selector


    Returns: <Element>
    • The DOM element Gets the HTML element associated with an Ubuntu HTML5 JavaScript object
    Header header( id )
    core.js:531

    Gets an Ubuntu Header object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Header>
    • The Header with the specified id
    init( )
    core.js:424

    Required call that initializes the UbuntuUI object

    List list( selector )
    core.js:559

    Gets an Ubuntu List

    Parameters:
    • selector <Selector>
      • A selector that JavaScript querySelector method understands

    Returns: <List>
    OptionSelector optionselector( id, expanded, multiSelection )
    core.js:573

    Gets an Ubuntu Option Selector

    Parameters:
    • id <ID>
      • The element's id attribute
    • expanded <Boolean>
      • Specifies whether the list is always expanded
    • multiSelection <Boolean>
      • If multiple choice selection is enabled the list is always expanded.

    Returns: <OptionSelector>
    Page page( id )
    core.js:434

    Gets an Ubuntu Page object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Page>
    • The Page with the specified id
    Pagestack pagestack( )
    core.js:599

    Gets this UbuntuUI's single Pagestack object


    Returns: <Pagestack>
    • The Pagestack
    Popover popover( el, id )
    core.js:516

    Gets an Ubuntu Popover object

    Parameters:
    • el <Element>
      • The element to which the Popover's position is relative
    • id <ID>
      • The element's id attribute

    Returns: <Popover>
    • The Popover with the specified id
    Progress progress( id )
    core.js:490

    Gets an Ubuntu Progress object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Progress>
    • The Progress with the specified id
    Shape shape( id )
    core.js:462

    Gets an Ubuntu Shape object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Shape>
    • The Shape with the specified id
    Tab tab( id )
    core.js:448

    Gets an Ubuntu Tab object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Tab>
    • The Tab with the specified id
    Tabs tabs( )
    core.js:608

    Gets this UbuntuUI's single Tabs object


    Returns: <Tabs>
    • The Tabs
    Toolbar toolbar( id )
    core.js:545

    Gets an Ubuntu Toolbar object

    Parameters:
    • id <ID>
      • The element's id attribute

    Returns: <Toolbar>
    • The Toolbar with the specified id
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/docsbuild/classes/UbuntuUI.Pagestack.html0000644000015600001650000003005712654470322032120 0ustar pbuserpbgroup00000000000000 UbuntuUI.Pagestack - Ubuntu HTML5 API
    API Docs for: HTML-14.04-dev~bzr202

    Class UbuntuUI.Pagestack

    Class defined in: pagestacks.js:23

    The Pagestack manages all Pages in a stack data structure. Initially, the Pagestack contains no Pages. The <em>push()</em> method is normally executed on load to display the app starting page.

     UI.pagestack.push("pageID")
    

    The topmost Page on the Pagestack is always displayed.

    The Pagestack is declared as a direct child of the <em>content</em> div.

    #####Default application wide footer The Pagestack contains a default <em>footer</em> (represented in JavaScript as a Toolbar), even if you do not declare one in HTML. The <em>footer</em> has a single Back button. #####Customized application wide footer This application-wide <em>footer</em> can be customized (for example, you can add Buttons) by declaring a <em>footer</em> as a direct child of the <em>pagestack</em> div (see example). ######Page specific footers A <em>page</em> may declare a page-specific <em>footer</em> as a child element.

    UbuntuUI.Pagestack( )
    pagestacks.js:23
    Example
    <div data-role="mainview">
        
           <header data-role="header">
           </header>
        
           <div data-role="content">
        
             <div data-role="pagestack">
        
               <div data-role="page" id="main" data-title="Page 1">
               </div>
        
               <div data-role="page" id="page2" data-title="Page 2">
                 [...]
                 <footer data-role="footer" class="revealed" id="footerPage2">
                   [...]
                 </footer>
               </div>
        
               <footer data-role="footer" class="revealed" id="footerAppWide">
                 [...]
               </footer>
        
             </div>  <!-- end of Pagestack div -->
        
           </div>
        
         </div>
        
         JavaScript access:
         UI.pagestack.METHOD();
        
    clear( )
    pagestacks.js:139

    Clears the whole page stack

    PageID | Null currentPage( )
    pagestacks.js:121

    Gets the id attribute of the page element on top of this pagestack


    Returns: <PageID | Null>
    • The topmost page's id attribute, else null when there are no pages on this pagestack
    Number depth( )
    pagestacks.js:130

    Gets the number of pages in this pagestack


    Returns: <Number>
    • The number of pages in this pagestack
    Boolean isEmpty( )
    pagestacks.js:112

    Checks for zero pages in this pagestack


    Returns: <Boolean>
    • True when this pagestack has no pages, else false
    pop( )
    pagestacks.js:150

    Pops the current page off this pagestack, which causes the next page to become the top page and to display

    push( id, properties )
    pagestacks.js:96

    Push a page to the top of this pagestack

    Parameters:
    • id <String>
      • The id attribute of the page element to be pushed
    • properties <Object>
      • A list of properties passed down to the page that is to be activated
    ubuntu-html5-theme-0.1.2+16.04.20160203/0.1/ambiance/js/core.js0000755000015600001650000006212712654470322023500 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * */ /** * @module UbuntuUI */ /** * UbuntuUI is the critical Ubuntu HTML5 framework class. You need to construct an UbuntuUI object and initialize it to have an Ubuntu HTML5 app. You then use this object to access Ubuntu HTML5 objects (and object methods) that correspond to the Ubuntu HTML5 DOM elements. Note: The UbuntuUI object is "UI" in all API doc examples. * @class UbuntuUI * @constructor * @example var UI = new UbuntuUI(); window.onload = function () { UI.init(); UI.pagestack.push('pageid'); [...] }; */ var UbuntuUI = (function() { PAGESTACK_BACK_ID = 'ubuntu-pagestack-back'; function __hasPageStack(document) { return document.querySelectorAll("[data-role='pagestack']").length >= 1; }; function __hasTabs(document) { return document.querySelectorAll("[data-role='tabs']").length >= 1; }; function __createBackButtonListItem() { var backBtn = document.createElement('button'); backBtn.setAttribute('data-role', 'back-btn'); backBtn.setAttribute('id', PAGESTACK_BACK_ID + '-' + Math.floor(Math.random())); backBtn.disabled = true; return backBtn; }; function UbuntuUI() { var U = this; U.isTouch = "ontouchstart" in window; U.touchEvents = { touchStart: ['touchstart', 'mousedown'], touchMove: ['touchmove', 'mousemove'], touchEnd: ['touchend', 'mouseup'], touchLeave: ['mouseleave'], }; this._prevScrollTop = this._y = 0; this._header = document.querySelector('[data-role="header"]'); if ( ! this._header) { return; } this._content = document.querySelector('[data-role="content"]'); this._headerHeight = this._header.offsetHeight + 17; this._content.style.paddingTop = this._headerHeight + "px"; var self = this; window.onscroll = function(event) { var scrollTop = window.pageYOffset; var y = Math.min(self._headerHeight, Math.max(0, (self._y + scrollTop - self._prevScrollTop))); if (self._prevScrollTop > scrollTop && scrollTop > 0) { y = Math.max(y, 0); } if (y !== self._y) { requestAnimationFrame(self.__transformHeader.bind(self, y)); } self._prevScrollTop = scrollTop; self._y = y; }; }; UbuntuUI.prototype = { __setupPageStack: function(d) { var header = d.querySelector("[data-role='header']"); this._tabTitle = document.createElement('div'); this._tabTitle.setAttribute('data-role', 'tabtitle'); var tabTitleValue = document.createTextNode(''); this._tabTitle.appendChild(tabTitleValue); var backBtn = __createBackButtonListItem(); header.insertBefore(backBtn, header.firstChild); var self = this; backBtn.onclick = function(e) { if (self._pageStack.depth() > 1) { self._pageStack.pop(); } e.preventDefault(); }; this._content = document.querySelector('[data-role="content"]'); this._overlay = document.createElement('div'); this._overlay.setAttribute('data-role', 'overlay'); this._content.appendChild(this._overlay); // FIXME: support multiple page stack & complex docs? var pagestacks = d.querySelectorAll("[data-role='pagestack']"); if (pagestacks.length == 0) return; var pagestack = pagestacks[0]; this._pageStack = new Pagestack(pagestack); var pages = pagestack.querySelectorAll("[data-role='page']"); if (pages.length > 0) { this._pageStack.push(pages[0].getAttribute('id')); } this._pageActions = null; header.appendChild(this._tabTitle); }, __createPageActions: function() { if ( ! this._pageActions) { this._pageActions = document.createElement('div'); this._pageActions.setAttribute('data-role', 'actions'); var header = document.querySelector("[data-role='header']"); header.appendChild(this._pageActions); } }, __transformHeader: function(y) { var s = this._header.style; this.__translateY(s, -y); }, __translateY: function(s, y) { s.webkitTransform = s.transform = 'translate3d(0, ' + y + 'px, 0)'; }, __setupPage: function(document) { if (this._pageStack != null) return; if (__hasPageStack(document)) { this.__setupPageStack(document); } }, __setupActionsBar: function(document) { var actionBar; var apptabsElements = document.querySelectorAll('[data-role=tab]'); if (apptabsElements.length > 0) { for (var idx = 0; idx < apptabsElements.length; ++idx) { var footers = apptabsElements[idx].querySelectorAll("[data-role='footer']"); if (footers.length > 0) { // TODO: validate footer count: should be 1 footer actionBar = this.__setupTabAction(footers[0], apptabsElements[idx]); if (footers[0] != null) footers[0].remove(); } } } var apppagesElements = document.querySelectorAll('[data-role=page]'); if (apppagesElements.length > 0) { for (var idx = 0; idx < apppagesElements.length; ++idx) { var footers = apppagesElements[idx].querySelectorAll("[data-role='footer']"); if (footers.length > 0) { // TODO: validate footer count: should be 1 footer actionBar = this.__setupPageAction(footers[0], apppagesElements[idx]); if (footers[0] != null) footers[0].remove(); } } } }, __setupTabs: function(document) { if (this._tabs != null) return; if (__hasTabs(document)) { if (typeof Tabs != 'undefined' && Tabs) { var apptabsElements = document.querySelectorAll('[data-role=tabs]'); if (apptabsElements.length == 0) return; this._tabs = new Tabs(apptabsElements[0]); this._tabs.onTabChanged(function(e) { if (!e || !e.infos) return; if (e.infos.tabId) { (new Tab(e.infos.tabId)).activate(); } }.bind(this)); } } }, __setupTabAction: function(oldFooter, parent) { this._oldFooter = oldFooter; this._oldFooterParent = parent; this._overlay = document.querySelector('[data-role="overlay"]'); this.__createPageActions(); var newActionsBar = document.querySelector('[data-role="actions"]'); if ( ! newActionsBar) return; if (!this._oldFooter) return; var actionBar = this._oldFooter, actions = actionBar.querySelector('ul'), actionButtons = actionBar.querySelectorAll('ul li'), i = actionButtons.length; newActionsBarWrapper = document.createElement('div'); newActionsBarWrapper.setAttribute("data-role", "actions-wrapper"); newActionsBarWrapper.setAttribute("id", "actions_" + this._oldFooterParent.id); if (actionButtons.length > 2) { // Maintain the first item then replace the rest with an action overflow var firstAction = actionButtons[0], overflowList = document.createElement('ul'), /* Action Button */ firstButton = document.createElement('button'), overflowButton = document.createElement('button'), /* Icon */ firstIcon = firstAction.querySelector('img').getAttribute('src'), /* ID*/ firstId = firstAction.querySelector('a').getAttribute('id'), k = 1; if (this._tabs && this._tabs._tabsitems.length == 1) { k = 2; this._tabs._tabTitle.style.width = "calc(100% - 155px)"; // Maintain the second item var secondAction = actionButtons[1], /* Action Button */ secondButton = document.createElement('button'), /* Icon */ secondIcon = secondAction.querySelector('img').getAttribute('src'), /* ID*/ secondId = secondAction.querySelector('a').getAttribute('id'); } overflowList.setAttribute('data-role', 'actions-overflow-list'); // Hide the overflow for (var x = k; x < i; x++) { var li = document.createElement('li'), a_id = actionButtons[x].querySelector('a').getAttribute('id'), lbl = actionButtons[x].querySelector('span').innerHTML, icon = actionButtons[x].querySelector('img').getAttribute('src'); li.innerHTML = lbl; li.setAttribute('id', a_id); li.style.backgroundImage = 'url( ' + icon + ' )'; overflowList.appendChild(li); li.onclick = function(e) { overflowList.classList.toggle('opened'); self._overlay.classList.toggle('active'); e.preventDefault(); }; } // Add the action overflow button overflowButton.setAttribute('data-role', 'actions-overflow-icon'); //firstButton.style.backgroundImage = 'url( ' + firstIcon + ' )'; firstButton.setAttribute('id', firstId); document.styleSheets[0].addRule('#' + firstId + ':after', 'background-image: url("' + firstIcon + '");'); newActionsBarWrapper.appendChild(firstButton); if (this._tabs != 'undefined' && this._tabs) { if (this._tabs._tabsitems && this._tabs._tabsitems.length == 1) { secondButton.setAttribute('id', secondId); document.styleSheets[0].addRule('#' + secondId + ':after', 'background-image: url("' + secondIcon + '");'); newActionsBarWrapper.appendChild(secondButton); } } newActionsBarWrapper.appendChild(overflowButton); newActionsBarWrapper.appendChild(overflowList); self = this; overflowButton.onclick = function(e) { overflowList.classList.toggle('opened'); self._overlay.classList.toggle('active'); self._tabs._tabs.classList.remove('opened'); e.preventDefault(); }; } else { for (var y = 0; y < i; y++) { var actionButton = document.createElement('button'), actionButton_lbl = actionButtons[y].querySelector('span').innerHTML, actionButton_icon = actionButtons[y].querySelector('img').getAttribute('src'), actionButton_id = actionButtons[y].querySelector('a').getAttribute('id'); actionButton.setAttribute('id', actionButton_id); document.styleSheets[0].addRule('#' + actionButton_id + ':after', 'background-image: url("' + actionButton_icon + '");'); newActionsBarWrapper.appendChild(actionButton); } } newActionsBar.appendChild(newActionsBarWrapper); }, __setupPageAction: function(oldFooter, parent) { this._oldFooter = oldFooter; this._oldFooterParent = parent; this._overlay = document.querySelector('[data-role="overlay"]'); this.__createPageActions(); var newActionsBar = document.querySelector('[data-role="actions"]'); if (! newActionsBar) return; if (!this._oldFooter) return; var actionBar = this._oldFooter, actions = actionBar.querySelector('ul'), actionButtons = actionBar.querySelectorAll('ul li'), i = actionButtons.length; newActionsBarWrapper = document.createElement('div'); newActionsBarWrapper.setAttribute("data-role", "actions-wrapper"); newActionsBarWrapper.setAttribute("id", "actions_" + this._oldFooterParent.id); if (actionButtons.length > 2) { // Maintain the first then replace the rest with an action overflow var firstAction = actionButtons[0], overflowList = document.createElement('ul'), /* Actions Button */ firstButton = document.createElement('button'), overflowButton = document.createElement('button'), /* Icon */ firstIcon = firstAction.querySelector('img').getAttribute('src'), /* ID*/ firstId = firstAction.querySelector('a').getAttribute('id'), k = 2; this._tabTitle.style.width = "calc(100% - 155px)"; // Maintain the second item var secondAction = actionButtons[1], /* Action Button */ secondButton = document.createElement('button'), /* Icon */ secondIcon = secondAction.querySelector('img').getAttribute('src'), /* ID*/ secondId = secondAction.querySelector('a').getAttribute('id'); overflowList.setAttribute('data-role', 'actions-overflow-list'); // Hide the overflow for (var x = k; x < i; x++) { var li = document.createElement('li'), a_id = actionButtons[x].querySelector('a').getAttribute('id'), lbl = actionButtons[x].querySelector('span').innerHTML, icon = actionButtons[x].querySelector('img').getAttribute('src'); li.innerHTML = lbl; li.setAttribute('id', a_id); li.style.backgroundImage = 'url( ' + icon + ' )'; overflowList.appendChild(li); li.onclick = function(e) { overflowList.classList.toggle('opened'); self._overlay.classList.toggle('active'); e.preventDefault(); }; } // Add the action overflow button overflowButton.setAttribute('data-role', 'actions-overflow-icon'); firstButton.setAttribute('id', firstId); document.styleSheets[0].addRule('#' + firstId + ':after', 'background-image: url("' + firstIcon + '");'); newActionsBarWrapper.appendChild(firstButton); secondButton.setAttribute('id', secondId); document.styleSheets[0].addRule('#' + secondId + ':after', 'background-image: url("' + secondIcon + '");'); newActionsBarWrapper.appendChild(secondButton); newActionsBarWrapper.appendChild(overflowButton); newActionsBarWrapper.appendChild(overflowList); self = this; overflowButton.onclick = function(e) { overflowList.classList.toggle('opened'); self._overlay.classList.toggle('active'); e.preventDefault(); }; } else { for (var y = 0; y < i; y++) { var actionButton = document.createElement('button'), actionButton_lbl = actionButtons[y].querySelector('span').innerHTML, actionButton_icon = actionButtons[y].querySelector('img').getAttribute('src'), actionButton_id = actionButtons[y].querySelector('a').getAttribute('id'); actionButton.setAttribute('id', actionButton_id); document.styleSheets[0].addRule('#' + actionButton_id + ':after', 'background-image: url("' + actionButton_icon + '");'); newActionsBarWrapper.appendChild(actionButton); } } newActionsBar.appendChild(newActionsBarWrapper); }, /** * Required call that initializes the UbuntuUI object * @method {} init */ init: function() { this.__setupTabs(document); this.__setupPage(document); this.__setupActionsBar(document); }, /** * Gets an Ubuntu Page object * @method page * @param {ID} id - The element's id attribute * @return {Page} - The Page with the specified id */ page: function(id) { if (typeof Page != 'undefined' && Page) { return new Page(id); } else { console.error('Could not find the Page element. You might be missing the "page.js" Page definition script. Please add a ubuntu-html5-theme-0.1.2+16.04.20160203/examples/container/simple/www/img/0000755000015600001650000000000012654470531026221 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/examples/container/simple/www/img/logo.png0000644000015600001650000005246612654470322027702 0ustar pbuserpbgroup00000000000000PNG  IHDRxJz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FJaIDATxi%uo6X`XC$-;H*L+d;d "eX *) )$,ٺrnիʘ~Kf̼=wǨ|;8۫a3zmV E{lPDT;'̌ \YVR_8a~~~uݳi OzB>iC鐵oٱe`[u& (vgnng8 9s.*x?%O `Exςd%"(<\W82׎p 8-Xψ0m۶Ϛd=s@e掔rSJ/Wg 0~ʕ+p.Q<+rs XC{Mr}Y`/D6k}2yosfQR^R} uf8eY̲sT/H)v?UJytʕ7Yx{LJs6`6`ef1!_= 9@UJ='YIskvF_^g@埑RvAlVxדgRR n3,۬RJcaazg=3_98οnZn_@eU;XgRJ,,,g~ï}`}PW6Q) Bݟ6,W?1~ZOz~`Viހ.lDQ((P`%fgYךO?+R iҥKϞN?ා;p3 -XS|9p=o$R B4kyߪbxlgZ$PU> 2Ozw.L#5 `˸t„dMKG qJVUf ?[X]b ؿO3T8®5*Hh4BGGZ4y,:{>b UO?RÈSr6nCPP~V  j`S0._X:qg"I,/-e<&{>} m mgX)4M\<%'!dN3>A#W\yNQatC*VIHP*<)f 6Xu A\.,bqa~NA}5 h5h6[V2, ?ހO~OA~lgi =؟X}/q7nAzN4}ؔKɿt],--`~l)Z} m]jf@w%6>93`"1>B)A'JK`V޾p !)' D(^}%7y@Fӆ!"ɷ6x`U1{%%~;|$Xgsso*Ѵ Y1U|N=PL<4JDrlf9TV cƯq?(` 묂hGQ!*DÌ&Q$kr N+Qtu7m4.齇'V}aA3NAfHaV-Iɩ; %Dƅmx {`ڐMI̲dnplvZy>~♧龔Z>/߲O{@y4@^^`dʶcP9s_2%Ԅ.MigT BIJw$)]}ZtҷU?#x'wtYˬ&}Ϗc$%<_;-iUzN^m?I[3cz5&yH;M8sn M͖ј3)|kM|3gyd%GCNi4'gw> ! pl@^poTSO {;xU0 9DFM2T2*P%B4`h*awPfJ!MgG V2Q FYRBrx!y\w2>g}xO^"1ثFx< -_^mt;0x̟D  y@Q?}+@NR542=&gl$d8 nJNVD_@5H]TZ*ء o)D봰?N&Uo`0 'r?;M<ċmp&iis@(˰ 4YEB(ms&.9ot *M¦,F5 is ʼnjvju2jYcUJتz bbw !v~/xikw!ڭVvX(Jzع$e9TEh22Ge(Y٫H&HIxh *ߋ$Nw@IUxw øQ|i9@W cG}*sA61JSp|zPɨ eƹ@  J!_Rq|83E~u\؎3?/.G*:wNe]aυaE-"_[ Gw>wgމÂo~dk (l6?h4ޟL+"{p&ݽwñN('n.!a 2~Ll'# 2 PX+?FL *TA>j,w?B߽mqp(qnV6u(,W8'quU=m|_=h''2!;k UrggGR)Оc׈Nf#&k $ f#&|%T\IZ9$(C, Mƒ1)] uq=KE53BL#9# v(UUf2" +wOz}BE \, ji],_DԚT4! P*XQ9)9ir`%W 0Mp6ZMˏ Ł# "X.WBˋ 24yOuVL)Wӂ2Ýaf"j`6 8%U"Ȯ&MKlipPMAō 4:-7g!P.T'wbZA)\ ( nTK4 ^"L8i4Yv ZBF``Em5Ԃ?䗘X{8p$սkhW*p?6pK`Vj0Z:ʄ(N@%…D@t*x}=hL!Y JˋD?ʀw ˌ j!{nX"!4$iB"i?&~$؏)p{Gڭ[0 :^7eZ~sd8qr˪zu0 ND)jVhZS~9˂T}ʼ iGK+#4V+{ 0vL &2A5JQSo!)]uqB9ֶ_/NLȴ@DoO=)`OA mi]T muannCi$jٺV&بemC)?Ud$6Mрh}|߻L՗`] =ǧ8b"COHƭS^ze焓_i6}4`^*ZV3X ?p@c`^|B\\:{kZ>*)Ti (G8T@t';X ːO=',?Os€RrQ7)N٨C$As6?K a-pw♧T x xH ;On4: 3َ9tm@pYMLJT !VN>_!dI.`6a?q{0w o|#ېbvO%baǪ(TiIȦk&=~gYpgi {!`4K1+nV/Ͱ{ mx"tT X^ZF!%5z/zalfmT(V< O XAhZ0MOz>7EM=k"0pa op )7(/WF=lg*NN`CZ +b)Tl&KX2yOG/,bl SruTI%"hB<4l63/tI4I#1zZC%&l<NJiAvh{X#b׃cA-*i)peI(6uUvNFWS= ,0ho,307 F0,&-Qĥ K0 RZKtտE3EDJu5F+"Th6L+a)qwC % QAv{-hS tZ9a@ ϕ@dNI(}.H]]] LIAh X-4zX4Epρ4B\y,\u>ج%>j+ץo9"Ve&8ig*Odh#ŜhZz\4N Aw0i3еtPF*N|NdkTTRg"30JKPn! 0Me`90UP+Tqqaqslۮ2&ڮsv&4UM_eYZ  :4IFQ}XF n5@S3l!GdTORq4\7+m麤4wF{{?8iPR%hH j%_[k^0iҀԾbyy rt-ζ<-S CD+@=@'ԍean QeFOpaK^( (N2@ݐA@<H@)R՝,%D'J퇻RlGZ*0 iB5h4h#d@eTG>=c{&Q!C~n7FR뺹>dr33 @K驉ael2Y'g#T7MH!!gSSbYwaVp*0qxt}7q>d!ՀahjbjZf5ՠDJ,-.ٰ00NauհsU:JiA2%tTÅ <@QZ3,wX;R E..I_uROD6 >lAKIv!LZ(~!Hu\XZ[H̾Em)m).' Pf xi·A2ȷg-ZFf BH \P$ .1ORi0d_7Yƶݽ} N:# 0 3uľbϦgǎ+Ѱ,(%gfVEXUJwO @\*0հ7ֆi EGāo 3 ^*TmTN(!L_e=x4iYZ!>ZsKʨiOy+<ÅEHp'R?Ono{꬏aXLm*{K ,%.Kd)E R )UDE`dri|bo?3:JaQ%0p(ȩO~ Z$Z6p]ϯZWA8_G TKfBՄԑ;}sQ 4$hWwu2cW Ho(dFX,4qxx LطH'ugKD9KE&%'%..aax8ӟ+VXC˲04o[&:3?̩`)A@]h+` o8cAz^`8*+K?Kn)a`x43v 26N Gp`\ ?_(%J鑍Kl4 =6}Rʕ2ageFŒ iL-v݀0p8`d$ˉ]ja 8PHcp=t}A0dPȜL3֊b;]x RFJ(09tSץX)9 B"PJNd b*&DU)janԬ)igzJ@ȍ YBDƝ{[,#*` #XF%kUp5幀|C>d Hf)"\gj cF;/Oٰ& &("(蔒v[X^\뺥ѨL@-VڨkDdh΂7;FK],1g 4)l%d ]KkpbzIjC`<N`z8 J mpbJY<_;T՟8Ȓ)qQUJfBׁ<(D݂z5BF%ۄ|Rx DfTՏ D'Ҵk6$2@Zzyw:p\p|!e!J[9ӏ;>|v Apl%HJTjvifJT~ '#ae@apifLfbⱥE4 8[ۃ, ޯT-6fRטG"TtaE\"@ʙ}Yi=T*:RR[;YXpW }cqB<UŇOB@ /^@{x+nT*ק'Y< C,` BT'{SK**R Ẹ\O2M7 {Eظnq:R5Zf8qFvB݂em԰.&c.~"=Ur=ĝU|NAj_M{P_d$Cx`@'+Juhpa lo8_Z0df#to.@R~̿DׁRgK-b:.c_!j6077۬qh+L\3MT&[b H0??Vֱa. [DãRm۵B gtD灄h;ij9N_NLc%6M:d g'SwYvft غ:)FRuc]yye٠ڻ3OJc?dէ~y:kPԅqή8WAqM&W@ӫfL5-ЋY4vkGup813QZ~^NruK%@Zw߲jX}O=Ե5PZU;3JʎKWt| s *Ql9MZfYF͏~'ƭwrg9VfuҤ*Pvq8.~BqZ |2>Oʯڪ"Ze*]Litqz\踀>@uIOD))}G677o6tW_>}wY]C9GD*:O-;_rY$"clnn^F%Qikk _WV*pA =W޵ڎ i^w P`0{ӘfinND2faVe LfĴ:öS]T, զilZQf]02Ul4@HY؄'vz^|΁_wz4JP)|kU2}U4 :]f3Y_Ƕ?Ƿ핕's1<7-˺5 ^4h4N[zVU3s0@D+,4ޞw[~떦,iAg4x: 7uu:@-Ŵ_>V_Dz,4̵CbB,AVz\gk ;o0 E?Z "NEB`a~uG4 j>;4 _ܽ{7j;]4Mܼy _tW9?ܽ}8[ƭ[0LY2 E6wWh_bs'xAׯm۸x7b0meaoon]o?R}s7GQn4ϋBo\JVytmt:onnzfi6tXUg^&g[V.Z&ZaYCјrTq8ڽ^+++7nܸJFE$ _m4rs*e0 c"l`}}8{`q`FT~RqHa`0 5nݺuӱu<Ͷgf]J~X~H>UB:w677odcsO0 c™oZh@>|hMiUU8߭XSkׯmTf0ڰT&0p)Q)͸z*^~~6@RXRJ-ۧcc}:n0@fԍ g<{YJDU9GB`ww7=7=p3V/`Qf0"?[5 jV$ʴEE4afBaC^}#$@cssarg!v0& 뷌T`F.HgP80ƭVk=nj*8͛7Wu*||M0-Jqlyq݀#}9d_Ut3r= QLN> >pL XNREw޽[5U(0E*,}DZ{`VbO0poH p'QRt/}yqxu1 45k@eZ<1[ͫW:)S*ЙS ü#h0dHaZaƍ:2\'5DuGu]:D5SOG)j“4c4&XX&*~Ty*?뷶6YyRC5~5MkWn@5R`5`6Mz"UNZM!pkk{{7|XŅh4nPRjjznܸq3/:KRLH"?t"n @O nᡝV NKWR.m۬shKlnmnZhX=f G9/#e#._ꍬYq 0oWWV(#5Pޞy^RYD}t+:g>uYjdP|HT Fٝju륗^J]/Q Id+ Df7o{JZ[7Q]u]! ZXu/CCL `޵m?ߡh 1Wο\_7#{_s+"YMgIiX)4,+w Qălq*W'jT ,:"Jy9QYo޼;0,u:9N7״nϩBOַtul:V:4nX(c۶zH9uttdeq؉o|a4XYaTnR4)׊8|%,WP\"]Uƿ&MK**pήd>5Oa Gf{Nq}d2d;e*ʌ"[XyU&}*&8&gԑe@crJMoV!0 `֑Uzz*#r"h:-TY;M~A9CKd7QQ/WTxUmVHҪpISyi@RC)Xߡ s /v?"M5(9HUBy@f,(b Phr3UHO;SYʡ9Ku/W1>eq#Ԭ(P狖ٞUj$.*<%`X(Z䔁)Eρ:=PڮU[PeeU{*jNGr 2]X`5ZT6@S74[@ T/|"]QU<ӛeVHrrRVk`cuw/m -u䫀0it!愮Baq/sc')=_@gV4 97 fmU%4q9ғ?N\8>椉1fYf3ͤ650>=n=_ ηzg;ISNMOh@;w~A{bW!}vAwbpNo r6v3sО5s@L[xEZmIENDB`ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/0000755000015600001650000000000012654470531023477 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/ui-gallery/0000755000015600001650000000000012654470531025551 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/ui-gallery/qml/0000755000015600001650000000000012654470531026342 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/ui-gallery/qml/main.qml0000644000015600001650000000165512654470322030006 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Canonical * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ import QtQuick 2.0 import com.canonical.Oxide 1.0 Item { width: 800 height: 600 WebView { anchors.fill: parent url: '../index.html' } }ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/ui-gallery/widgets.html0000644000015600001650000000623312654470326030113 0ustar pbuserpbgroup00000000000000 Ubuntu HTML5 SDK ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/ui-gallery/index.html0000644000015600001650000000366212654470326027557 0ustar pbuserpbgroup00000000000000 Ubuntu HTML5 SDK: UI Gallery
    • Ubuntu HTML5 UI Toolkit
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/apps/0000755000015600001650000000000012654470530024441 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/apps/rss-reader/0000755000015600001650000000000012654470531026511 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/apps/rss-reader/app.js0000644000015600001650000001111212654470322027621 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * */ var UI; document.addEventListener('deviceready', function () { console.log('device ready'); }, true); $(document).ready(function () { UI = new UbuntuUI() UI.init(); UI.pagestack.push("main"); if (typeof localStorage["feeds"] == "undefined") { restoreDefault(); } //load local storage feeds var feeds = eval(localStorage["feeds"]); if (feeds !== null) { var feeds_list = UI.list('#yourfeeds'); feeds_list.removeAllItems(); feeds_list.setHeader('My feeds'); for (var i = 0; i < feeds.length; i++) { feeds_list.append(feeds[i], null, null, function (target, thisfeed) { loadFeed(thisfeed); }, feeds[i]); } } UI.button('yes').click(function (e) { var url = $("#rssFeed").val(); if (url === "") { if (!$("#addfeeddialog section").hasClass("shake")) { $("#addfeeddialog section").addClass("shake"); } else { $('#addfeeddialog section').css('animation-name', 'none'); $('#addfeeddialog section').css('-moz-animation-name', 'none'); $('#addfeeddialog section').css('-webkit-animation-name', 'none'); setTimeout(function () { $('#addfeeddialog section').css('-webkit-animation-name', 'shake'); }, 0); } } else { var feeds = eval(localStorage["feeds"]); feeds.push(url); localStorage.setItem("feeds", JSON.stringify(feeds)); window.location.reload(); } }); UI.button('addfeed').click(function () { $('#addfeeddialog').show(); }); UI.button('no').click(function () { $('#addfeeddialog').hide(); }); }); //FUNCS function restoreDefault() { localStorage.clear(); var feeds = []; feeds.push("http://daker.me/feed.xml"); feeds.push("http://www.omgubuntu.co.uk/feed"); feeds.push("http://hespress.com/feed/index.rss"); feeds.push("http://rss.slashdot.org/Slashdot/slashdot"); feeds.push("http://www.reddit.com/.rss"); try { localStorage.setItem("feeds", JSON.stringify(feeds)); window.location.reload(); } catch (e) { if (e == QUOTA_EXCEEDED_ERR) { console.log("Error: Local Storage limit exceeds."); } else { console.log("Error: Saving to local storage."); } } } function loadFeed(url) { UI.pagestack.push("results"); UI.dialog("loading").show(); var feed = new google.feeds.Feed(url); feed.setNumEntries(30); feed.load(function (result) { if (!result.error) { UI.dialog("loading").hide(); var results_list = UI.list('#resultscontent'); results_list.removeAllItems(); results_list.setHeader(result.feed.title); for (var i = 0; i < result.feed.entries.length; i++) { results_list.append(result.feed.entries[i].title.replace(/"/g, "'"), null, null, function (target, result_infos) { showArticle.apply(null, result_infos); }, [escape(result.feed.entries[i].title), escape(result.feed.entries[i].link), escape(result.feed.entries[i].content)]); } } else alert('feed error'); }); } function showArticle(title, url, desc) { UI.pagestack.push("article"); if (typeof desc == "undefined") desc = "(No description provided)"; $("#articleinfo").html("

    " + unescape(title) + "

    " + unescape(desc) + "

    " + unescape(url) + "

    "); } google.load("feeds", "1"); ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/apps/rss-reader/styles.css0000644000015600001650000000211512654470322030543 0ustar pbuserpbgroup00000000000000/* * Copyright (C) 2013 Adnane Belmadiaf * License granted by Canonical Limited * * This file is part of ubuntu-html5-ui-toolkit. * * This package is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or * (at your option) any later version. * This package is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * . */ #articleinfo { padding: 10px; -webkit-box-sizing: border-box; box-sizing: border-box; } #articleinfo iframe { max-width: 100%; } #articleinfo p { margin: 7px 0; } #articleinfo a{ text-decoration: none; color: #787878; font-weight: bold; }ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/apps/rss-reader/index.html0000644000015600001650000001031612654470322030505 0ustar pbuserpbgroup00000000000000 RSS Mobile Reader - Ubuntu UI Example

    Add a new feed

    Type the url feed you want to add

    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/0000755000015600001650000000000012654470531025145 5ustar pbuserpbgroup00000000000000ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Dialog-Spinner.html0000644000015600001650000000322012654470322030641 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Dialog + Spinner
    • Ubuntu HTML5 UI Toolkit
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Dialog.html0000644000015600001650000000364612654470322027241 0ustar pbuserpbgroup00000000000000 Ubuntu HTML5 UI SDK: Dialogs

    Simple Dialog

    Are you sure you want to delete this file?

    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Tabs.html0000755000015600001650000002307712654470322026736 0ustar pbuserpbgroup00000000000000 Tabs ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Toggles.html0000644000015600001650000001016012654470326027437 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Toggles
    Checkbox
    Unchecked
    Checked
    Disabled
    Switch
    Unchecked
    Checked
    Disabled
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/OptionSelector.html0000644000015600001650000001343012654470322031003 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: ListItems

    Collapsed

    • Label 1

    • Label 2

    • Label 3

    • Label 4

    • Label 5

    Expanded with a multiple selections

    • Label 1

      Subtext 1

    • Label 2

      Subtext 2

    • Label 3

      Subtext 3

    • Label 4

      Subtext 4

    • Label 5

      Subtext 5

    Expanded with a unique selection

    • Label 1

    • Label 2

    • Label 3

    • Label 4

    • Label 5

    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Toolbar.html0000644000015600001650000000542012654470322027434 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Toolbars
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/nav2.png0000644000015600001650000042757012654470326026542 0ustar pbuserpbgroup00000000000000PNG  IHDRNش pHYs   cHRMz%u0`:o_F.IDATx}wfUuZk> 0 V5cMh55,H600>{^4~f#~3S^Yz'"(ˆ((( E "BBb>E@P|Hl( (`~e>GQDľټB@~@dd@D@9lyhaBb@`D1+EDD`Ds.Pr@03$@ОbBs2ŝ sb Exhxhk$`B@(,(BlY<  ""(sD2d[fY=H=ƈ@ hCkNhk`*ACk؝AټFͦ%b'*``rMc[p d!g-f9xhxhk$3LЖ^iYO܆G%#@PD8:I!qh?n&2k-7240+! ,n#b>I=h,vc K۴G2Hj&&,@DjP P6m/, )G=rOA70 6#uZ5Z5a̴0 "`ܶ ,G! +,"$v[oD F;l\qna2;)/e&ڭ 4/>7 X7j< ˆd&2r>dHD,KHZ)CLG C6Kr} 2]; ,LB@2f;Ckp* J-ɐa9ɔuO֦wv,T/h`4k<. igP ~ ڡCkD,Ғ+և"SB4[up AB2:6Ć 5qef[#DA!@6Uaχxhxhk$ "&u)cGV  3:VlXYBf$dF`3&ʘ!͆g kzùgۼ>Ckgy_WW~عMu׽a ao} _xk!K.x?k$ .\w)GQtᅯ~{7H򲗽dɲ_҄7;7}[[n?餓8K/{J-o;;*F%Dlͣ:Up Sӈ hdd%/?n6m7"QS|bO0 ߜ62obzKm-}/O "+Y#s ;wn_bGg=Yo~[gXh.g'O-\c.O>5m||E\s1Eŏ~#K.vO?׾wOu(Wř}xŅK,pu?_?>`l|^.h||MozC/{K (%__w WWeϻ| J'x?|#ffwx.ݸFc( DE =Ff @yyP"V=wy?[nnPƦ {y_&;EB$a_]sN;ܰ~Ú5kx"$I~=3>r]ukh4yU9MSV{""ZU^'-Zk6ERT.ٳ@J}CCÓ"yyIDX0P(7y(hpll5ũiY`ALI"5' 徱׼r7n[(BD R)0r_M6Ql BT?9>! Y_.3իv?+pڋ݇M[.;vk3>"d^R_j׮WK/9.{޷ ^TD$T/~_=ïg/~y/y?~5kuN;' (,  Jtu3x_Wt۶QTnyBa<<nj/{oǻ_HzdH 0CB܁"{cMdaXbN")qBYP,!5>vV_ FSJN8vm.l]9K2>`\9k"l ;3Y|eK):XkTJ@)+J)}#"@`]HAQs gd=7oKIs}Hw&<ړi@dM[7m2px`?ˇ<"'T(E_b>FQӟ*Z{Z[l#`Eg}fZ #GZ+.|̓?ӟWq{=Jo}Uo~v}5[5ן$.|+<3SWAoDTm4=}@ꪫo(Mڷw'ڱcgP([>Y~ӟo}CDvlu/X8}g]*/2<˾ _{btt P&~<|G<@\{fӸF13gDH b__R+Ap|߄gsJvRdr݀c #b(.ZǃbmlXg=Ktf$Zճt\ KYpemtPxl۾An[wgX>'-[t֭]_K.=uv6l۟ nrs;=[uݟ޶[~QYϓjͅYi"^}W??WW xHʅё{$F6===0Z}k \@`r +Fx(ڷo|< A833S|8N-_?b1}!DXxs=O v1+8*ټ,{\dЕJ%I9 Z7/[7/[hgzz#Rjcs`}L"4 -$q Ĺ2نi-eyB>eud7e*Rtʡi$PV(Riʨ$aZF⚬y֌L3DŜ͗ߘ= tC(vsN[r{3I]؍R`rj}[ã#_N(\0|SJuhht$MQ99NJbJoAuº23?Qkܶ}GK Y#Pd"pm8:4(aTZЈF EOR Rܴi  )?Y  ! h@dWJBR(%4*BLD,Ə Qyxt4!QtfX@m}qZe.f4ղ* †"\=brNNNR @+OHd='M\SWVˍ5Vb$DlzIL<-Ķ搜nlDqctpP&#X(p׈'SSӜV5^aX*z:)ł1UcI TW&I;Ĥ |+>cl9l8G23@*w6sh;(7^F}_GAXO ya"@Ak4 %&$@a͢R}s ڵ+Z1@R B P,Fks|:N;oQF`2BIWOlnK<" :*y0!#֡*ڟ[7o)hv.sUrp9W3kCb+^g$E}w0{ȏ{="gxHlHDT#v8Ճ>h5wڌ=_6j dB&/6E\J4^4bQBY]kY5ؖDvh0(Ε(隿^B<&wlb5}ʭNH/Imyt#ZFm2|]}L~{"@Nʐ> K/T*A W_qR9 z^9vHvSuZ.ff֞GGYk dP4sB`V"& #Ȱ󙙄wa)Ѹmvl)(hHТtd$)m{F9(kSȑs{f$=V kUl`iXgBk\:9̖z%ezҝ!drRHfDT;[J[͵-9$0ϖ5OeT&-)$+AJ C]RNVY`wQ<_!"J*:EФSICL S)@Ly{ :|B,NcfH(ذa# bD ST@(1Uvh*+ v =sxBr# `0β3]L֔6_8Zvd=f}NPUXH;O2L 1QY9kkM !&q ;XˠB/Id6/0znr 盜Д+ pKŐCD } 3.uHUC?BL].Y7⌦j|_ʕ+gfHyf@Hd@BC'Y$ "ye.>V#:O\+2vjXd'D0D{sTWD|):lfىzLd/gV=2Ce4cݥ3Tuo 37];DkMZ}O-&&mk3|2;"{7{;\OhGy쇰MbKs -AA kac3$.H|O}X,`4f0ZkF9dA5&' dRY\@|?KR]S df@C;du׺B򸊍";9q{tS7?vq15D; g4Z)U*kNDi ER%~-sttD2ZAw &he,qmPl] m! }& nӊԳ"(jd  OJ$I֠k)5,(E32jSF7+|a@_:d\){HN|H hDTsreZ>Z|@f~wa7-/;Jf23yA op߾}&"A +32%dɱs-XQ;jn &lQbW棹ga+ĄcC+w'@3k qv/ps"J)Diu}%Q!4:tD; #@=@j= H@9m`~4/B=޻,'&&9]'a1QGK`3Ntfmf6C<dD?M Ze?؁,0 *`cΝMnZC&1fPm!0$ZVທ@, F+ʴRM42.v 0 V)"` TQ*@,,"Lͮ@, B4<}cDrSyF+<_%X  # u a6NQ2uHG@&f˶<j F8†%3fF fh SakBQ x H,ݎG!"1Y]CqeIyL)7+JS8gqPݭ\Qpn1B:<q0^^?G ?XsRο<'fx /1iCCe&(5{qq]kmlS}cCKÖ)MDD\ߐ@qC4jYB"Q7{ш$ ;*q[1nn Hkz*#( 2tcN%VE\z5""*Iu $Ebd?~DalY\xLۙuzƬ\HKnˎs;8O:s1 %g&s x\띧+mx-l]DI)탯 ?yNŁO<%!hDmP'#%e(Oi #;cM4hBG';/ gΖM{iĖ"@ڒ3ċSu$"({+5 ?'Wݲ]Rv\݅Ot9#1٢IZw b_*X{q(lprs+/7 A(/J l6]gfʬ͑ -RC!侥9gL7Oc8= snQ[lĹXA0lih`1i~Hz||T@DƱȓD'670>9 cK|@4d.ĸVtyJCG.P+.!gfxAGF6ʎO?O`PmkS׭%jng:4g\r=ΐ!|>d l SZu~w$wT C:2l;NKótԸ#u݄uW@>2d ev\[fV굗;=*ݮ dQ(z"Z(q{EQ ddapҦi{9`؜:![l$غ9mX Ug r6c@'ny.FBQr=1n3i=@[Ì{xPhRXp]PfQu;od6er""ѳ3B'"CK3>d9DڰbL}d(ovJ2rGvr.,N`d LmdT@\3`NX,gvh$Q)@P 672"-X,UKxc=[yϘ{b2Q@x=;Ր;.^N3֣rej}[W;$"v}?faj^1܍*SݽQцu!X]vne`ə^IVޕ:^vrWRr-o.璊$B l$I^A`\Y\P.h X8Ȋ6sOdʳFJe&t,e7n ڠJF%3# )o8%9A^#p:::M&s dlmE("{8&s a{4BF.c# L#m>q( _Ry}H ==tR0G3ߝDwmhP;n^r`ncS[m.b,Jbd/ nm6=/Ni[-u:`wq;avs\lE:,]t`ڙKqik;g]Yyv' `b( >bf}fv< RdK3ζT=2v$|@F$ r> aW 0X۩Ϣk8n77,HgXS"b9X3ÉF Mr0Hl6Zf  Y҂0HLb1;4[o\lMIe`rd+BJ@q tuQ9{TCDښEf|WY:xrNDz:Ѓ>,v}Zg2"6(Ca$alkj2#Ba}) ܵCpub8F%_XFdZ,<O,&TY*d.""j'uW"NXY}l^m=Y$4!BPGA [vk縩݌@@6H8#v ڎ̅3诵6N݊fk$ԏV:FYzrՕR38ŧD̴ nPw9mLkj]G]s̔u,Ljo̼Ti7u 'w^t02q8p[Ew%'A45:ctPk"h?[)OΕsZMqbMr3sT:[& A&s ZlcW 1FlQ ! AkdF4AZ]NQ;Iݷ53{ʦ9Q *ZclkI3d-629jU~۶M @T,2f{a aPLMBDv@ 4 )BʣTIo4 7v_sz:P@mttt}_wv[1"Fמ|E@hn(N4'&!ubSRO{<7ӯ|ˣxLjOGiV`l#F^XT_?UA 9 mLC r;TUV}ӟx_VZ#۶mg?-RĜfUK6<9:dz ؊-6'2kXs#:MY)W4{LdWJ3@:g h]nol~(Sγ%;APIƞG* eb@nB-; J`.Y'iP\O/D&CɈ*a`0SHZҒ`4ںj0ޝ4ĩm]F"Dl4"T6Y>#fI}#%G:+=b2\Gvl۽i1  Z7Nz#N=<7_^8PfgzE}IzG#49mj iN9mLM߾ֵǟW.FMPz9WuYJ)Uo&bIm!4MO;i'o[fX,68MS <Li[I4@%\ԧnݺrlu"f=<Ğ9*;"$D }0;;/fi' "zZdf 2;6N6=|JTkѓ0l6<#+OHr\~s{O|So̺^J I6ͥA$M֞R16"A>kADa"zu*j8fS蝌9M1CXgSTZd"Ns&\wmQ$SfR@ (;EȢ]G-ZKk>=er]aI)"l6wAKŽ=fm&_~/j3?5tTG R+&3S a`q,}QTiXF%DI2̅RPAz؂!b|)OVJ 3d(ێ h4[h䷾J}hpwMQ#fgg IDł̼p(&W(jՂr<91cǎ8qɩ=v+X(^/^dtd+jRYreP޺}FG%0<+^:yZ `4 c@%"q#BTROLkWvX;wj6^i4˖-+;vػwؘ Z-IᡡAf޹sh> %KhnZTFFFR4͡ᑑZ655jmzv|ҾCo6̻ S Ҫ|K1ڶvhF눵I W\vEpsID*H$)~ zEt @T6u.6rʶ% .ZCkl[@ 4:V@E-Q2FTzR"Q%hLGl(ڂI*ʪ :hUȁPR/o<2x OM1ر-wm,(O}E*T*UjZet<64KTʘL0?o4HVJCUKOMM]։8Qj#.( #m^{ٺaRnMf(,h}Jab 1A1g/JuqG{ߊA/_?Fc:kll90W~O{7\[Ht)O{_ᄌc G?Yx>ڳo3]vBSc48NQ Dfr+??Cӟ~'㣿??~Od?7Xg}Oҗplg=x%p wO|ltlPD<5 VfjF""3;Nۿcy2mx?񙫮AUǏ>/Z^GW]Շ> g^vkM}càOxlQ !/~7m^ 'vWiZVMA:lV%C4>,"j/jg8sրdZY,w,O\.#WKGJ|B`R (S l0[r[8vCvӄc azYz* BVA]@93HF;=%K݄^l iV5z@ob1 R5͚4*3ThQH3h79"(FMP'U|~at՘=wA}Тj{*4682htdt)'raUÃC։Te63]T!l?19[k%쏎,LkaX"ԊH%Ic L?e0,lp2q=憝[bB@-Lz7bxdprj*^zm^h@!axaRYG7mZ]OOGep`SO[]-ůzի77^uϽ/९ܹc>i+v򥋏$Oq}ïʍ7ћ_j|߾[oT*r'/a-' Naev<::kw_Q;AE̒G~_ۼzf^o4jKw`ouM/z>,]dժ?|߯~?˗/}_O|jߞ[ouhh BP(sBF]ZuK"Xtη]%W_ɛrOׯ_wϻ/i3O-ƞ򔓯A9Y|Qm޼~v=p 8ygmztGyɧlݺ>ozw_~'viIE9v!ܞL ^:3Sfdqόe$g1|݆ԭTLff4 '"l]?(@ЌX †GXrB ¶1qaYμus'2?RkZl|mμQ)ul6oH!"^ AIMɭo=gD@ӴX'6/YT޳}:ޘIBH0\0c~>Aa2Sړt3` "i?O$n?}[-[y-۲i뚣M'=im#Cw]V.'?k_zٷ^<)k|Z @PY8w>}\|wCXz:qYw)s6WEGM!r_t`[ TgVD+?ZE#ֈFQf+ HN/P=H6i35֔]8`: +>q-dG dPZDF+gf7.n4cvf q Q|EQݻ&32^EfB;HFRǕVHb[ ]t+А ynQ;֏X7o{jxE"k.=o臡RJ8 )QC?_U a!M1>Kn B{@\OMi9YʖitAP:]r?{ﻒf?^XpalQJifȩe!B0+_Ҏm;'vATV?w?|+s܂۷7GF|?uDH駟a?\*Qo~RDXcɟWLJ{ɒEW_}˛>׊{qݰcR{ܚk~xeWw+38~/\4t~]gv횇77zbC+[E{_`¶\}RDl6.Xpyi rӚO.ɚ5Q銟_~̚UGyحnkrdtlh; 8(K덪\wcٻwE%DH׷r%ܵL//k'gfJ3;KUtsmEbJ@b;e$w;7#@5xYz"OT+~hF `Rۍt6eBaafMSVmt\љ5*+*"9,#0spVF.@-aYZ5'IbR'XAb3#"Υj~)7j#;&wOoyhVkm@u9X[yEJL_HHb{$ѥ*6SwGƗ.߸t8~J^)is=ML%}AgyxqoƂ-w.3CrMhJ\*@6C|_[nxYg ޵G$A2,4K<־@Xy ðC9!_yQ{(4SlR<^#ѮzY7=ipҥ~O9c+u}|_^xy~ÿUB(VQXN],yS\KTa4'RIlQ‰ߴibY)T*O}ʉZ}QLMM( $ FG.JJoox'=/wq{憛t*-—>y+ ,8A+F'VHW Bd:L9ݫMU6a^vm|Սeo^|5ߛuĠc2YthhP__P "?+xRCJQRk/ }4^o^|.o3MNLuD 5Q+wѥ.|Ѫ#TQOEԫ)Ika!=1Q${nF<;SHȻZcߩvIg<QTDD`шBX:1B4'Ρ@y\NOWJx{ cלtܱOyX$R_z#W~1G 0jG_/y :LJQgϞ7m=i03o۶ _hd2k8`R.wMh]L}}ԑG^uUG>jAwL"<;*gW\͛7޷K^viOr2qۺE/>OE -[a\1pс)],`ZoN9nٲ},]~{٫(:ǭ(pG+O|ڱ<|?5TB $lU&CK)U>o{\H䤓Nj&3oX?08ɩ8N뵄9ϩ<͜NI8mOHr.51@"};c4˖0t*D7lзGG⊫fg-?s>t㞴x~_|Caã}{k==%'W OyW];wz!e޷o^TjIZ3 'Y,E_wPū^ىz 4rv2p[ɜD~k1Q_ QcxAT0=`/cd@ŒL`p6 I R'eV$(㶬nԼV r \:NbXF帘X2dptKZ8]Рv Z(* N9H^ =D 4(fYfS$< +;4bR-i4tԇq![dI֌7-hj],}H7oru>=ۄrt+ °ͽ͞aTv/P҈ld_^pSSSc#+_ʮ{gWE/xw//U#R)FbpxiC*~zy7t+/_?yM7^*DRD3 "ضm7w/RZ=I'|;۶={v-ZxْSs9^|Wص{q+Fa(df |Bā,<4M=言q:Tohh%?}xK^sOgg?%*/җ]k˿Woz]b)*?/?k_waefz͚5ak3Z. \P.6m?,IvBnҥ=hq`l\9D{[槝vZ[]r>jKy`NRD9Ck㛖iw~F2P:h[4$r6cD832 ZbM$l(Y" 9pr6Wxav ?xk|tƍn^ёz~C?^jund ћi #ܿ+- g$aThLU K5f<8QK>B}Y^h=:IS] m{ zul왩o]x_Co9dDMdgEP0i&Rٿ10LNNoܸijj*s06L֭Z T?Cg.Z|y.r- g<`ǶmMšx*|dou Bp;X(w5צI7b!VgokZ*Y@)_uu!# S7f|捏>CC%DbUwzpp\ηSM-\M7u޹tBXoAD믻~G Da( 7pӃ<i(L aZ "I왆=vJ@tZ #/R E( K5h@ĺVj7W8 #"4I3_fm*&:U3 a$TZ2|h:C3݉ڵ/Zi.yf1V*;v0bJ+W$l67>9#i4DQGߗ45kAMqcjC=QWq񉉣:\.#87oQ2s6|AckʟzGQtQA^kƇoyC7%jfffMbTk9|aQ BǛ6mTDWՑEs޽7o^bŒ%KLGGF?p5T*# fl( Wf󪳕-[Dڒˆ6*bz@D:(8^~=^Z)`ǎ3rkڲeK/Zcǎ-[,ZD=Ԗm[gff8I#J'2)" hxhVulSg$D0>>>_LSmzY!!뮻(Bzf%k5Ѩ4BjT8׫}{m*m|凭XlMm}pѢŞ!6aGcֲ46Ybmk_HJn,Œ<&!3Iywځb\R2b95*f3}_oVTՈh^ÌdKa(sMw(`N=HTDަWI!_#a$FS)?$HdV}a?PTV .X847^k$R4aLE!J޳T<% *UԒ˛2l|-_t:d7ֺX,s̱F\ež2"ZD<;c8#Jy:ǮYc4R4'ǬNŌ,x"4+W:p:Mc"|\}J͐& BOD"QRGO:dќRJ4LLL%/'뮹βK5k׮(Is1qj3-\PD8Fr|SN8nhBp'3JҤT*tI:MS)S׉Ȱ$I"E8NMfZ3a‚K-\" Č}~ZmtttѢEi6M7$Z/_yqǦgKg)ʷL̈f̭x1&gk;"ڵ}ÜUD]|yٰM{ ~W^y : {L^@mBaf X9m4k)(41o4b$-;Hjaj';TR,y+r>?dZ9fyAˈӈ>}5G$ib͙H 1I V%-u\9_&!h N)[w!  ~)Qx*}奬WJ٩IoЛ j_,^` nW X'XCjI–L 3MSQD ̉ReJDQ’{NRSXe fDzL(1ҸtUAfMDHbm`;4M1bÏ.t %+߁7hNrQXR+fmUٱn9t[f{ȍ6 -yj?\=Ė37 )9IH1"P_l":?-&h"\B=JD[n=|+_ADçܽ{S}(qS)+?kժUa@Q(jw(Bͩt `f| ZfҞ97+ę X ̤MǦOؠFJűQli]!=;_ FU3vm)4B樬>!ټl P2M@׫[`z #f: $~ZMj ys}⳾_ܹ~SHj"4 K4}? B"1cJZLJL߷d -I))r7]^աVm cT%aNQy@!4BXaP+BlENn{>W֘qIN1ܜvNLˉDJcj#V%̢c%?S,ܜf8"J__߆G6#Ex(*eK { ͑**5ܬ6'-a"7hL^bfYcRsZ uU#d[jn=Tkr.-nq㠝v|5;Q۶xjzPhh)~MhTX{û&^wOPXEãac B5So^MЊEKF;vl{p]G\58<<4podi6 ^"S#SpDi#TXڝrFȪ✽@{#w{9W,(&3&e+" -v&"%H+Fe,ZDͅff H@9ÉVHnIf 5PWm-ِqaL"0kj7SˋθAYO3 ,ϜZQ>L$bdkM;Ai.1mc@'(oΌ(۴iӫ^"RVBoxkw޽c&o>tرoܲe g[x}{ ȱ!hA^x^eDtE'6xksdtp<2 V\ Fhָ B f~3lC&B`ȂրKQ\T%'~Hh$Qء9kTHi†_* Y}fWS!31aLf,{Di5g^{m>bȱ͏}q j-&t1% j޷?(ZbQkR1Gm7o|'>@4%mԛ=_4B L(# 6R`{T@:1]ĝL2 ¶Ft@&bdX@,Ō93NE\"%f^ֲPH("3):kXT"e<6 } Q`qǬܡr;"ΈKprIsSlSS NJ >nB$Ծ5o,JX lT9bi 猼~ntNU.sL$74eyĬ{VڛX|zډ2eX"/۸w5L96^/-C=D1@ voQzٕʖ=fH[rwJ/__v( ÿۿx1Gl+GR[ɺXRaTk^3FǼZ " D k(*bG^;mlgA@!B3cI"ݶh9YD9 0 o<6)'gc7ǜ#HS2CA fh{ (0ȋZ{)4( \:3d$a|VȈ g|Jt%@ȫW} +ܱ<(/<)O۰usٌBPPjUR-ߺoܷ=~mɽ[3' =5/SN;zUJ#b@#xxJπ e& 5ڦiӑ{$;|51rl6klaG2&`"|`8yJ6͟ӕ]Ic;L, Jf_ܲ!֮ Gb!i6gEa֡Z3蹢M+#I̬5Mr3/Y9M᳃(qdʐ.hW'7[mhG3D뗜lXfE(73Z8kt]BaY"zi˂C7Yk-ƨX9]eEؤF0UFSY;lsqSRմV *dIi]7!RXHBat_ >PD} e:ه0C\hǜw9ϺyĵI$IYr!Cpp q9LF#{\4bNZRp&ˈʔƖdRG׷M"hlc| $&eh6i˒mHy,u'q]Dn0vmuOm6mR9C[  ]v}[{4;{ِK~ 19Dw#~XiZ2hhwn?EE#yFI){ gjB6V$Ph B@Ha-2LIY޲`J-l ]Ҍ XCQf[[ 9쎰K| ̔!f&-=\#RN zkjjNx޾o߾ l۶sٻw'RJɱA-ۧn?QZvKvgmtSf!NY@g?PfǍ]d;/v<ߖ<};t$C(M`gwI5 ]%t&Z1[2عRimw5K~H4X?!ې5>hk4VTOZ~um^_XD0RqR_{}zR!0IٰkAcil "f$,9UL4*4zX,$If(Vz}݁;Xz9~z"P"Ouǡ:K gfftI}s788Wrb||ڵqȟLr!Ӧ^Ennc 0 TDQTVhfՀC-GMnblxtbc;f 01B4 mlTEDI˲QץL=+sn#e N#9]j4XJ ĩVaM"ZiEB$BDĒM֙ezj0 U64{$qҨ4uHB廓t fg4?TYY0@dRzcHmQ2mzw5P!FV$BCDP7кp<{U|ZN;k=f/^xhd{?Ư 'uFѱkٺu̥?ry`M7>t;{={~}}}Rm;SFG&ǧ]6!r+wscoi݉O:n%_bc/P< FfnlMDN9婥renݺJmvvvs}Vw}D__3Zn,]sѣ"p뭷mڼuO}Ү]7Kx BT6;vZ|'s=:՚% 59c#85Y vI0ҙy+B.Vjuڹ18r\y䝈Xk"wyfzy{Mp7-z2웸u߽ Y\mi H;ڼAB$P,fVc'2(' @ hS,*1O3EfHD0fe} fVўHZ>h[#XË,E&PQ|RN*XXe/#(V" >F# R*"MY1ՒSHlZx }ha౫lٽVZY:* W'qxpeG]z؂A<9C*=TyM 9ֶd )x* :$%,(? ]tw~QVr<==mndd .XdI,^hldWXtG}4 0 ,Y߯>Q`oF*w H|V_{uvO?;\r˺ ^vK` X4,tVk%uH,dN=k!8&--YІ7 Q j3'y[^N!RY!bnS) ._05՜S@!Lz-c˖-[dq<>wÖp<8`$ңQor@ c7gTHT+o#_owy]&sE<Fb;oݸᗼ7+q-7?^J"45~/߽{w=2(.^ޡln([mTMndF׭[wGV_{hV=j}]7M6tmQyzŅ/ۺuwЏz%K0 `{wq睫V7nxGlܰWpSc3*vm]6SoՂ/D=;3+Ïyzr2f7;wf̀WX.e}~%^r-~… 5kh4k{i06o"<__?~/~ fH R7P*jѱEwq׶mx`={PS]*V,[Z(%ǷJRR78 0`(J+ucccb1ѱc[0dhhRB_'>3x`? ڱcf樜Z/hoH6͇iΤ_u4$G0y>w F}ɲ}}}{Qux0p`g'0/%FapJfD-!;gR0(H/b F`KK]dtq˚r "!4k V<8m+@!-27]GG-%b,"dA^c "#,D%<;ŒڂٮΒY-Jj=]bĔpT,vW]Sh`ԋ<_Ly"VOj xX_}ǑP*<5R߾ I 0DD;u45J1BFf6 R/IJl6 1 ZrjW׿rSv^uHi֩ f+޺oJW2y5/ 5 &FT/ڳgwEJ?3/_hȞ={p;:;b2*Hk]c'vG +fx:C1cccjKD(l6E"njZm!*dl"xKtf2j *Iшպi\ϒm!AjRfν:/8dA~Ti1 HF5錛e1ljU,z!X ҂@A^i.733<ϧ41VL-i5{D9@ -k1 V[vQ#0HOʃw萛qeoZ,FIޙٱj33+[V^hhv|f53힚Z0D?ŕG*Cˋ{f넺#bI3Ml%{ϤfrbX"3S3?w*-,"B<00uE@@+Oi7O{/~B5T(,"yM7˯XbEV>6_^p2{瞶.@&RnH&Fb(K1w^ " c{6d1c$&V4z#H,>=Ir fQwH%|EbAJ~:@)Um.E%.Z:J3xXG FL~^K30Vu2,Eyitq|4祷 YsRNa;\֪8W M>zdQH]8b5|6Z#I\׬٣;;;@KFO?w{+^ ^)KΑիl߾ o|m*RJmڴG62Cdf6j+Ī5KwqDz}Gb.O9唭۷~QJ=C'|I,]pÆ |6}\>uq6.Y۹|[ے~xΉ'xްa^p#<{zz׿:z=zfF>fZب؄z``p팼YҖ@v}So馗w֭[ti'v`4']MfEs((mhKxbieC~bQ6ZJWɉ ۬&'׸@bt`Vv/J$q;+o+[1lYpP6n|hL>Z1DVhɧ b8,85 M 4-BnsM3鬏Zԫ=%R 4Q! UkŐ*TR4>ҹt(٧mϔk|4VHUQKs%\/FޓGjub-Rٰ^vZK'牚<c[ [T~oL*WZɧBQDsssSeV5.Kzmjrjny''jB]Ooygn244499sω]wYTzz '&&}/TJm~T**ϧ(wuGEC;t&wתw=>KoOfB-^u#z{{ldL#$"22Ϥd|7 z}4kdqTV) +qNlU mdi2%hJ83SBTXEḡarĚQG QT3\& զ%QD#\?񉧏8z&VҠYEzãMNO>OEZaXRjA_ŨڗQlt&xeJaŇr|VjBL<6G!WlIj[2 |߿r\OW ̣=Y)s… CQT~900P(x(b1ÃJܦ<рJDL__n<ۑ &z@P&6L&z׿iddVG!a>돢oG7>53 jNT^uS!uQ4"SAf\1Dwt0~@*dY'1̙uO .+8JI'02WĖ\j&bc-%}3APGmhGj0 MވC@C uk)OKZdڞ%=g""`'t 6!; ([x\ 2V%2cT2Cՙ9AZQYlF$FJ EDψ$1+j-̤әtR*GR*0d9'7,@*#.ՋٌNNa4%I՗,- l:R(`y+1EiCֿ촓}/S/eRG/U=bDNtZp.d$w}m'E:<& @Z<~Y 먣&6 uLXgDz\-N)O0i3OotU)TE=U,*JF{.b\imONl'fPaTOMMh tjc_/Ꝝ=üTFX)@Tbl+3O-eYjwh-!rΟ蒚|_l+ئzO6TD)%M}k2$OAbTl`l$T1pm6ac`‡ɁFd^v1"*oll,[{R`d`V( 5 hRlfY̑ncW:Da`|r]֟ɑSY5أ%P=T E=;a)L/^p%Kj\jRtS2׭슧t#zzJQ@u^$J9 uEKOMMyw-!ݞD;,U8P"Ftk׻[7M|'En:nPnu71V;*;x%aU&MC%"XqCdʀ]xFLQuWvWBcە죻@tG[#٩Y(kPcOS0W/ c}}L*MHA3sٺ3lY;oT6X.\QGcj#^gm-h6鹙}[h 6d9-'X`KziRٜ|`Ů}Kvz_7v(6z^Wܼy)mIaZr*lv6†tMqpKa򵿳c:1*} uc 亅]BW&y&î'@ϣZ9 CcfOvHeA" F.C9cVP,dlhfnmA!2ݵ=l63!lj!Z']4 2u[e9-f/yK1rv!qM4SY @_iЌh"{9`6!҂K$E$,O9cOV1;U GW{pI'.쎩"T({*쎔4WKaFI'wl9ȣ^+ .p&L!Ԧ:䫄Q!xnhCJ-`({1gck[tH_pͶspL,6Vٕ:p XQPYԕ2I zC%$Q T\*@Gu`fJD# PW *PI>2`:t2 t3ض隿8c떽ֻ\bɭz~whQ2;wnGAEs 6ZәTʫ{#DYx=ιU?pV^s=HmdmcdsL!(L6G7v 1f&qoiɊҮvc"D2"jYFZ%5ʄ^t%t9dDR-b>̌ MlQI+D择M! Hi9ˏXC1S)N:HHZ3K5EP\ 2Lwkteb?]۲%V/k;d}___>=t$")< #ϣ'm* " q̋:2r3}Sju,\<19=1[nٲu{&1985(Օ(Bb8&Na{JwLEƒPt##QJ]sZQ$$C-k[+&ށqm9&X33k}'d8hnMmJHJkt] -8 A HV.DAArBA$SٲQc ,ukE-QD1Jhr'CZ-Fb+#T$ೄ]/c-P]1D >a:0 wG-3҄(X:}$@& Bd @DPR*bSm3]ny#?~f݊ :)SJBUZalMӾ`33;hm)b}QD\Y$96(4όAD}Y8BlD :qDxOBN5a(Jↁvww^n~<󼁾\u$34Ji A l2andU DV)ⶇ*(fJ q'"x[BU$SDC%bڵLjZ3ԡ)Ba$$@L}6:hA$Dp>f.x>@Z hrq`lUv@DRǠk}L-8Ltʅف@IZlI>%Eyx-4;*T!MI38{4ZDZ'4'6MO/<:nT_Nw0B;5kE`qbؚpP]gv*€E4ת"H=HsDJ5|Ð`d(mm`m%_!h!{LBaK`A -0惖L_-kj(7 ՞XbLK0kaTcA"-55hAF;Js.b0h&A (@Q4)_iD-} C@LBD9g `Z 5A7{UKS]\ eM 0-&lvl%M&핺tڥB븳i7@S2BKH݉jyMJDLuЬiGZ(RЬP/:bɈRݵYCQDfvVBI !( %4>Bv+j.h#i Ȁ $F7d6Ƈeܱ@1v=|lw6P=rtfZ^IPMٱ5NO TSwCGHs&>qB-<ju4'mXBty^ i N;7_Voq2l@Oژ a$!4eFG74l\I1 i{݂q" $/!1n\*1NsBkjntһeB#@B@"6< =P#]0Zg60٢W_̩LNFZ\`F"OfȰ#n_-""lpn[p[uZX0&e;T7`ShN PM}%"4`,1tS$YKR Lw+ -y7$G(^$DQW7՜&π$s?a8% Ozs a8ɋ(m&I% ƈzX <}I.!mߵSF f~JЬ<)UB\\Anh `,"HL!A:ER*τZ"sQV_c3Nc8,R CG&>!289YQݛ>qBi(#JL4![څ( Mj55AdZHP#ODkd"f:r0ɤ!15ZbZ6SGt&uni- ]!-Cοoo, b[ cG.LmԢMMKtq'LblupTYǡ.4Dg-#tG3:űML$euaihk4|s?ED(l gJr]p@=a-]n*L Ve6{CZcCko$S ϔ_sQ[_ 3GŻ ժQ Dŭ("*,&PF3)@W -=漼צmkŢ#JLdBG 47EݪhHCi@'ϖ,sk'o#qsjNt͆O~ҋ1⵨C;KM`^2lp:|V<}%M5 .4}YmPN)" ^ڭ.dn$_y2 a`w ]pr(2kE:OɢrI oIoD6D.Y`!G!qGbl֒a6X-&9tڈ:K]?!1c$"$2٠^!R ("a@ @l"- ny~Y7:bSÀF85EqӍjx&#KSBт&S79CdyvNG'v-rum1&l1m= #ql oe;Dzw|J5Ϛk:LV"|Zpw#a~"V:Z/qJ;"!86 H@9i'h{t;&1G8*N1̱:; 5zW9>-L<^-hI*@66=`pKc`ͨ1vyh;:6y]pq.>&NiɇZЯfے:CbimxcŷBZH c=oGg'"~Si#sK:-`fa6Y ql 2y{Hs}pHoNmtE݅%`P?NR)t:mOp֊7333h6UQA1m3 Z8OQZǍ-=[SxY]uDo>W7$H#VkD ~˖l4>ia%EUAwVYxɎSwZKNٛײW°cy^#yV7w"VKig3:b:8[f ڣi: nVnb_MvU5l$[Oif6/vleZV.1,[lҏKi6A0`i$0nњ: l2Sbm¶ZOt!@7+ކ4K鋮b}DWc<v1(OQV%1_1ؔBQ(FS-v}М:߂3Ņ1[ iO#);Wq'p#2Kmx ݖx֙,%lumA7j08 'cb+f⬛dtn%P8JGFjٰ/C'+`¥魚ê$y̿Zʝ{i~䤭щ2/mCo0)yU'!aVE!+4sDZCh. H]vVHcs'P#A>ؘwF8ځdL5so.sYĺ:[3xbST/]~EQ-҂|SJD4X R$#Ј2$cm9aq}I;$.vPQ3ti.EcQӠtG& n4^kqLxr>Pc 1ᾔh[G`LŞ6 W6H\HN,xw: /֓x/@ [֦F?oYۛ-D %ZcR{Ai%a'Msdlf͉`27<6[P)kEB],aF9=J%I|=֔>m0SAƼþY65L`S+w/͐ƻ? lѥRivv,ƅ!bzf[Vr33)Bwc F*Rg8g2DA"JsZ0h5/@Rĵ>08x{144b„ImTC-$&;<a@<m8oIuR[ޞw,V 3 , s(0@I5"͌b\%df/2u13.D$#u”AZlJIbK/aFaV% .?RFP0!+!99Jeڵ}}}a@;ő@Djz:?>YR>#Ic'QD}h#aW.XH H3 iן@&6Nj ÿfS# [Ͷ g\E3[aU,׮] WV͍h4],5R6Rgj:i<3oϬGF$z?^{Y,V-TɉZ(V6ufe.}&ݸZy$t{``Ł׽$ZWzj@dEffX=0B#ǖ:Z9*CH_Ɲb״0 o1 ۷ sH"#"uhiHӰ_EM.>ƘB |gfPD&Q@EAt! .flvoc:E'!aY`WX hoG悘R !Vˆ*sLEbD|>̌YD۬(ʄN]bQ@(RxvAnݡ6 AXN3/C I F"$me8KTӏxkD^ +I-d23 ֚ЫVB|~\es̒/rLsos&'&NzbbNiEӲ$,zaJ0b"r2g1AlMfY (I ݑ1;. ;6<4҉1 GDJ)ɤ]3mh, †ccJc:8 6V BmCmFKr`"cpJw[ 1Ek5$\*eɠHԯP:y=' )zh]`)3jeB`QTV:zvvVu Lvgpz=*èb뢐< =} E:,JaFQR|`zj:;7700`E;s\>S0 \*TʳZX u"?ϧ3-I{sa(σBS\qFk?ht<\>cڽjٮi@t.f+*G:ϧ>ֶd[D 4"0MMZ 2IV/3OOOgl6+"895ezjT___"IQq<7WJA메_(L4ruBA{{{3[(jE9S|! \3}L6q۷ܱcgܢZfվc6B B+ӓ3̑||D$ Z5֑mC>\-GgFtWY[MmN.Oc5 ĘʂL( U F.m8843!0U9e rlzljXY`Å ] (,&NE ĸ{l+y"˵Ilh3!#}m]"rZz^Czzr[?<Ȇ0/_|kロ7lxOܜe񙧮 ssQ%#gf&+_u5{ԫ 6<&''=ϫu8{I'n蠃XvpEwym;ߓe˗~_zz;%؆x*=1}ddzч;/=~dtRO_1F&@&pvvRozӛ>+C..\SEBd2yͫx 6("-_8}!+f`^^pw@Xko>Ã֮>/^˯- yDW[n玉_@r}oœfxk?y۶m}w㼡۷]ټh"ofvVDuRwUXgXweKC7^s%L&UEtPwZN;#yǯɩ l;v%t@j7Q.j_3OlD.!\U(#@ h9uaZo1lho{];OZKL"6M70`f}# A‘ְwش@ Z0p"gb@iq"eb#9YQk>I6h1GBQHe& @3gvDtdVsoD\*Ξ7ϚG}N>7yw}O.78<E) N=.]0XsS}g}_uFTʤsO'ٱCz0P}ֹ/}<{}[:|[uE_!c=[C)"_{;o_z뭳DWE}/{.ԦMN9 K_Z){?>ӓ3ymxhzf%_QGw}9<ᄗw/:;wA`/~K_첛o9*ҥ}[WW=W^fK@nx[zwmZV87͏|[=T*n1 wA`A*-U[}g@Ds٭X*1kI.9,-_ݢG[yRlmMޞR塣-N $LHb9~+LKeKfFeøXa r@1,4J1`]~撧iC?P("A`=$`5Hh$@^d'`mא[f(M-$gRg{S|[*0 G?-z|Ћn汱}E}k,YuYg10 ~ #F-k k|+O= o8\t}˻~ssL#Cw{׭[W.Ţ#a jX.yF}% F~}hjrGz?f};^O|Ԭh6T\~ t䑇W*R6MJ V-~wmێᡅ'E wc|:80`lк_vꕲCa-^ŋ/Zc_vaCC~?r3J$X"slRT*G}uq'—y2ae3fIF/ˣ<𨾁/ۓҢ}˖w,Z/\Z[ /:Cgnۍ^kזKr `gQ•JI)B/⊟ -^{… %?PJm5^{n:.}h`|īO?yff(*-}p;ᥧY߶\+uQ,1ImssK@2-xNR4R2Ƥt^3Nlآ&jPdaq&޹8ޥ]blab2% 9!1a;8DJ1BCskE:w1z^a\R^*͢,V<@ELv F hHrNұѱc&)l']KBkW\yѕry`o5+fgU%"Zj7'\X[a -;+VU˕(V7{t_z}?rŋzG vX5&P25*-@ݔZ>_r۾^Yg}3WX~kooSNV#7mzM%Hzv,\cl.>|a:2fQGjժ_u\s5kuK.ew~~=66^\<5VJjL$Q8夥Kf2?"at#rbgo!#^ӧF! Ɩw;n~ckZ/G?#ھޡ|# W\. G U39[02::80TD!ᑑѱ , OX"K-ÕlpGE艤87'R9f\.H)%D ҖpIYn~Bpٓ>+AW;:ih/9SI>MЂ'P2`N8[R&j$‰"vf IPST5x<%c3  '܀ӸS .,bS-[G0щi:*xL fŒٹ)成 1BbhUǨX;{0nFؐ 8x "Os`T.ELGx |||xmyv+ H@wm@/}"9Z<_qcUZc6#zX^b7@x/\ l~vˆYdQ6[ښ!i'"0qͯ]~[?mV̤a׽utR3;Ţ(}}#58ػoeK']CÅɩK.@SaE )c "*H֡l!~ bd2T*Je|{DD; /y?鏾:?I(b=Ot3mN{hohGmId@('e.oI0ED[RC8=5#TeF<;bz[lH^dp{q&%jTA8Yc邆@>Vm,mq.Y)lUdjƠQi uRJR ]c:ju뎾dwy^Q$R̀!2DRO %J2 ;> ( wl/Cw;薿ޒύRsdz|;?ysJ9|':ꨯ~[~E4[}8sm ["UN#]GDI*ˤSu'M)'>^y{u>O9wܱ#9⋾tMW.Vw/{KbEDk](%V+"NeM,xI*gz |8DɟThL 0*ףYP.%aN2f- )o~^|׽浯=Z7&#Mo4O/c;xvĦwAgy. 1&bn ʤR~]sZD%&_41,D5o.I5MAqvXGdqiL24AH"`>f$ :"$i&Xv1a(/8hHЍؐkǎmm8Fż;%L5P#ˆ@GmEN<|rX7ja$Dr# %l }] 7G-WsT/ z~jf3O/[EZk0-pY g!! O>dOOO V y:b,.*pÆGO9omr~27: R\Da;#y?N:|~=[$T uksSO=e1?/GZJTD:wvnR.y^gN*JA~G:?u>]fnKW/7W" {j`Z+2'DplllMg/?׿Nz 7ҩ, tt_W j^W+AX^t pn˳;t]!??ߐ˦wl_TM6>NӠT4@ZRz6%DSiÐuM3H. a]}3ޏσo9. )2dSm^7xK~4a1.+LNML.;EP(+PSlz^߬F^D5\ׇ$F``de7Ԡy'Uٶqf,itJ ak`H7 Wn[), @7}WRČpjr\z R&!!dc܋Z Pb `JaTݸqnמv)|>4FS¥冶;h$A03<.҉'|M}?|uWOOJw??}XvA1uǝxtaѱOJy̦?$kAEr?sÏ^|Q/[U~i"T*Б/<4)l6C|fl?a~۝wO}}ۗrŊU'x(O?SG +U* p/>|{<5ozDj/"-\4v?x{׬YNe.\Nt}fhh`HSO=挓.\8z! ^s{;O?DϾkKՕ ,λ .`ɒ%|ja}bbG?c\.})D6ODe>UI&N3ѣRL:g(r^ =H, .⋟zvαǼ73UP7wuC^r=;7 /~n󦗿""zTy^*o޼=k]v?o:04HLOz*8LgrLA p*<#"Q.s}~7 X{GuBz'&M7n^%W\vbaa!R_J}g>kvq̧w>Q--2 ==;no/޲ehl}>-ןyE nݲܷ?4>y`` 73]-}g4-Zoͯ[".7W{^mZ/YZ- h"Tj"~wrz(|+_Eca}vٷf[ ҂O?}Wo[FD]zW_^{4JNVTFF|-|?>/]pց}n?|ԙt}SĂ jbqU۾e3)֜jqy Ҏ0XݤutbFJgkg;z\5B J Ok#I*ƍ&@pbr4Z& 1&$#ჃMPcs.͐" Y3,O,I#yJjPZ8;C@صok{֫ws~əC=|htzdjaC2pT"#Mvw@D jղ"80Jx Y`AXmzvsm .\$ CR7o92yRd}۶C=4bl]HWL ,~|Æ~:AP)NDE4Cjf2_:ٹc7ݚyCcZk@vfN]efKdI_̫]bߒ "R-dEZ/qQ]3H:+f^6ĆGz{۶>u|+q[DNe i8lͿ>to9;++avCVЃ55٪vlsvBFiFd–.yh2,ض7nz+_lڵ/z-fv࠱RZ1gHcH"M k$lvm.o]2ٔ3$)VLOT.e,bt7^%J` 毕Rg29(TN?537<"o8uzk?W OT9z*ןf X˕je&R)J~ZDH3+?)ds"_*墈=@R.W9͚/Wz>WPJԉR;E}i'&f KmvIꓟ{;zuZ xL6;0s _}=ꫯUFNϕ˳z =3蛚+c>_卂"xvv:ˤR ̸yCCCl6"ELMM1QOOO.L2 LKɰR~= gfŢfYj87UBƾxMLSGSAu8;[A7 ADt_ ZBkΉZ-+Rsss u)#b6EJ9G:@q23; =4؟ 2,uCt9d]E-L3[nԝH⯭9N/O`X3=q,# G0lwnf7}'}008߻u-=w}rѯMj%("F4q, aǝ9c;j8ц <&?ècˆ@&(ȓ] #Mcd"{Kađ D4zI$l# |!mL"$f FMbLO`4)( *a… !{kzFʢL&7/":K::"&>Uc>袋?_rlt֢ht&tim88Ҿoƽ'yRR -t`6USQ1K*,^$ "(o|%w+/_΢^k^~pW᪫Phxi1,88?4 "!Gu_Dʀ^" 2 uְFB{ӱ99 cZD'GpyksE$!C GN_Up4φ 3K!_'iqW 0KġKP'5RNa#i"lK$֎d1h5484'ѿ76$vA#۷mCĞ|~tdUu0eAF렫C|͆q5o4kkZJty+V0I9r\QCZ@;YKrț$ ;/C{x98#$wXvVN:fQ v*M"= ~yǡh+~e=18QM#" 4¸{2<)  ~=DO(f d"e=;sablQ\lUrj?B3϶l1uݕhD RAX+vTXlϵ(@PU"t;% UqPhq)$6m祼?4 OhˆDD]l@hxg,U zVG@y&,hZDKٖ Cx?l0HC3V;Ps`-;;-#4^1gL;A@7x<\nVҶb i1-&h"ظ.I1'V텦IH' eh>-MK`" -Tm%ejif[ [HuMoIV>Ҳ1jvG9?/ud˴' twMԙ#8$!"唲  06:1eC3QF5RP>Nήgj!F@z! 0T"]LJ phO#L=F izRϤB-Z0j@ЀLKؐɴmX=Y#$:ῬTc;ve"rKc]?ұ=;P8"CQ3hLbqΝdXyc%lk-QܐS#'/҂n'{&U䵣z{ yɏ*\d[t:y)gDIBEӑRb6KuBXGj9\mΈ.|˗gH'ƶa޸ 1EPA <aƾ# M -Mg~A$fm,hvh%n cFb) o8'rs8C6 cDDB0k\O>13 #kŠu F/VΈF.lbcl7=Eէ{-U՝;wFQ"RVG^GQO~NuOZ°&R`lӎE|.8{Z+OZ%DV*p_z"X75F$yiqh׭z:1nˣiR QV3&Kf`Keo9i[UN^؅mޖJ=-̳Wn%3k9I6fT[@[7d^d;]K۟3x{ɤ'(rѸreƉAP=,Ğ a$e9NfVH(6Ri#4C,(Qkl~HhԌ\:b֚C"b$P!PC(L ZkDlr})C񃝔!FZJիW5-Ȉ>`f>+WTUiǎ|;cxx\ٞk]?꼷vJ<FP~˟WDQTȐDdvvSNg>jة!%)|K܌>Ý-( y.w06m!/%TZ1l{Ioe}ЦK&]+CA,0COl`[v'C7׊:M_u}m;7]BDR &%b-r}P055(ׂ ٮIlkgeG[yIQ@X0eTZkY)=X-"i)~Zbh!2qa-.? %Ak595 F`{ ;́ED$0#Q"DH~zhhRKD;'&O9?^}e:QdY".WfCv&zV!j@Ee1Bju\*y @\@B0zZ̷Sӳ&Пq$l 0GbAFHʁ $I)n4* ` JM77f.Ad0I[! BN Ŋ6#YA֖SC &~B4^>\A,'"Gu^-8voJ6ز~qu0^"l(= nhю568 5v]EFbD\q4[d!弳| XL˳HG( k| |ȧ3\ B#ǀďB۪cC#ĸ5 Mk|QKT1wjJ =7ؚؒoRGT G]}.HRaPX_ [1 h‚ ljq{|j C1q褐Z HVSJ\)NO)^L@/Qɤ̳J% 3|__RMT&ۛMgX"Dܱca:-=Tooоfffʵ(DfNB.bQSSrydx<v@#QI(8jK5NJT}XڊhI"~[.(Ƶ6V<5)3y MщA%3[XN& GU+R~ xVih PVxk^h$[c&6X+ە֐W bʠ /bӐyNlu2# mỲI2$$mֶT+&j@3ʘ4_0'bD ) #3XVeڹsBG=V>ÿů7xcE?33s3m\@̬|*a_ړ9L߲mswUs^/zk+sKv[A+?^󧾁Z%\b%w˾Y)H!SO=e?]s]_o/0GJ3BO擟G])x.o2tAE'Yj*ȏg3s=֞"=}ŻMMM]=/'>|ϯ }=ٹ.0)/?`}v[o_GxE_{O~Q,MS Jemo|_w?80c;fYr~SWz+~˕WglE\df8GOicLH}˸Q<tAbx10jtHD< Hl,ө 2&Q65 ifyF*F lW oȎHBHi-r@.*HXFʼXk[bÐM,40Kdg"l.=F0뫮JFDJ)`f!]I,=p`FlwC75Gfyo/e#\z^{^vmEd8uQG|A[?]rRynzzzx۶8c?ɏޞG/_t%_>137}RΝVo~7<<|mA`gff׿፯B!>kk/+ ǭBOto/d'~+{{3k>#;rz੧6gcQE\{( 3T*o-o9G?|R.֪ޡ~yͫl>~yƫ =r587;>{Wzzϧ&-Z\_z+_yߩo|gSȤxu466sޞ[rkT&}zŊRz;**M.Nˁ1oȯSϹAM@v`coami ނܶb"ke+  WkZy zbfB|^X=G{~@4&<WCDW$@ T86Zq\ # P9"+/a\((O%1d]!D6X0ޏc)ϥr'ODbZp\ 6yZ@0!U jhzzzvظȤpoP(p ];b zO |_ ҩ<w_@QXEC'tƧ׿v%o}{mذ!Eĝ;&V|:ӆGSֆ}<LOϖJs;;e}-[J ǿR RK|~=ARp>?>>>NNNQ'?~wVstUTՊo8?O9n/]}} &*g/ Ȼ'-o~÷7 F?uї ^O׽_ů#DKW Ѻt*T*_ZX]vm[/&TE=/~O}g8?a7_vٷ_x!^{c_11Z-[y[o )I_|'?K } s9ا暏~CGuS {^uUTJyS-6^>' esNR±*W(ކ?V6E%- ic50vN0˦[X5EFV1;;;4ܛLDxd#+'13$1D+6P7 ,(P,<( ca#v3s+ILur`iyA@v1FfEJ%ϳ̬Bx`n\LIĹ"!qǽ,K#dә[o#V#$~?iW)RY=c֭%ŀHcv[FFFzSo}VzGs\.s5W16Л:vHysy\.{ fcjZr_}Ǿo?nT*BP{{^Sy =ܳV+BTa*tddX, to~k+V.=fQ3=( [n|>Ck \rxxX8ݖo=G~~?+_}~c*{챪=w! y3=i䇆lU܄'$Μ|c1C1dn) ZVxi"4b2`&!$ķupk;]zbzreX,zJ$ F&cĆ$nbm"z;!PR)^ē߁WݸqcZQHRQX!3 BODtzztAQ6OWD)ZA*S)"'TeLO!&XTeH6tUA4ݤ*G>~o}{ێgx׮l&O@V ?/(B׫G,50k|^Z3A :H3N/d:'GZUb}a5D- >ۗV!ʓOl{r0@$0Cjɚl.Porw~OOWFG[v UkEKƟ~ѱA7% ZJTro_(ʦsr-HaRַ~ w?-7 }asy? C D穫pǾl=[XOR\[$.jEWz䆠E)/)XM+qmŵ XPI1<3#m26 Ǎ+9KHbߍ68mQ =ܐ˙F1[Z#dGdihbd@[ .?F; |>k)5(1Ցq|_+W, S3JeɒEaʕ(!(ϣ '?Oi&e_]wz{.1q7P<6u!l%6~jvvBBSjp'VZ%#ÀyT(#*! |Cs|xkgfͥ'͛79?UL叚hSHBGPO}#{:=O6W8uzp`X<.[wRI::7wKҬIN#9t+y1Y f~ŀy*P3D2mH@TT@˳E`ARm@JJ}& 8 "K av.X&,&2!$ C 'wzM P"!r_i\[s{g|hB d ?Q򹡝Q鮻ci-ag-= @H fV6QWI AɚX28TDQ߿ҥKvmɒEKw[dݖ-Y|io! iIEPٻV׀75=155UT@LB+#(@v[&㜠0""×% 6ڌ4>gw5g>۶}Й1&0 C:+jifFj$Ȃ;G{_|9oš™59}ћ:=3xbtbUP"` ΕƏ/XPO򕯜~n`߾[~{gF{(!*2 1Ud!m:55D-`D6Y"f_~K{(Row5j6qn.IGX cSûNI4š%k8ЩgXlX4dT^ۏK97Zp6ә^ ؎(}Y- $sZKeKF *м Dl [Ĺ#M[z-$bv,qѮМZv/;`{9r{1;[TJI=K/mpKYtUͩafH/| ;7Ky~x*za_dl5 {vӖmO-1G|A'tRRad(KfϕG}Л5Ȓ,D#"T*ΊhEdA/ē[t^۾m겯}#^Kt/I?ӳ[ `fChL Ey$N(Ҿ{;|[,]a_-y(l*P:N,@PUoLbqs 7ܰbŊ\Ŷ`!42ZuT~B'^nc%ƞM@IAm/ٹXLc;qi 1y!Љ#L CA:##E?dHޱv6 5aָe 88 _y /8 Þ]QCU! yќ:WK3rY)H, L&NjA<cv-t|m|q[ITR u:c۾ykNg+Zٙ`Jsrb?#Zqbbjf^[q>Dy855S.Q`؂/kE#?(Rox{_Φ;'6*O|̨tzC=mCz]AoT*|3X06]/z1NjTrW^?\yg6o7|͟X ,<59>0=?/~W_uM6&c ?A/^rK_ v<y晧.f*JXfD459S|3,&"V֭{>{xݾojG>s~ <}j.۫uHJ= M冀.fkШɘÉaT ώ.e hH{UjNR З{zo~{~W\qe677Ҳe BEQ$I樴ͰIǸd\\;MLNOMdc=<ر"٩k\Ixl6k2Nmۖ.]_y\6`lYiȫխ[vߦ#]_WN=}*˙cb]|ڸqcV['',X@D su*<)W-[{M6%\l| rG7d3E x ASelS#Cq ر#/^8 yWe˖ xSO>900jꩩG~lxxpppom{{{9׷m#Z<;08<5cUk kM6p۶m==!!"ܹ]GƆggg>qkБEQVfbP(HF _%3iy=&&s_$߱DQv>l3ev][t=E4[{SO<>2`hONLL|\ELfP!3CJ)m&_ӴFאu) qk&LHa,Y i[7qS+u>y%5+7u ]~>0hAffǬS`N@f҈mvӨFP޲ qIiنM>װlnGy$>OLSLQ6f@L (FGGw"tB>lք "7oȅL&sϱ===TJ؎۷o.\dj||i|-kvnz}zι_ "ё{UA||Ŋr-8<< ђ%K3_ #ЪUsxjݕBCCݎKy###A*UוRXDG)¨R(m)?CLDCCC>!"7 ayѵZmC>o;\D!IRQMMMv涇~=֛,m˦\zQ~kUGPH@KvAϛMfZY.Y-bUhC͠Ue(_D3*׫j%Q3<6YobE xa@8[S- -]QI-Cl@4o`Ƶll)l&dB06kzZU*o=M[H ^1kF@0o.W|_6f.\&aCJEZt:k81: q)dfTob (Peip?n0t:!iT^/|޾A|_YT`REQGF}tI"TfHL&ɻED# `x$"]xlo!An%9I"$ `$dDA@I% PHE b@F5EaCt# 4N-@0^M}$}gBǒHx'e,b(`uĆ,1Af~J}À\(oN6Xh0@D]x@\oi&x;ZHꂊiNw)RuT+AUZQ〜N[M6cd/<fn."(# B "Fd;A ^4;t"Qr'Dy$%d?ktj`QMGͱ>5B 5VC;ѿ'& gYU "sHG⥆ sfܘ0 Dtq,؀0k _h+>nu j ]tꪩOnAp&sY_z "#Kޭ'0kҹCπT C&&zk= l00 %$[^#jSl4uSN`U*U ׃sQ99J(Dϧ05""BzSI[H~c:,T# (]? 3'.En%ItVӎNJ$Эa0$ZV呮4M$fx&ÈnAD`mƦ,SHUk`8- Ib J|lĺ9Q몹KXoݖЈ8CDo.pHrbcSq2RSJ´+E .—2F!V#6'Ǥ2 -ףFޯI'p&qmW+( ==}33%D0Bۨb-A SF)ɂXbYl 2kXJ`WCgTCg"4 J5d`,&{$mCMSD0N$^bYN%n%%$ 2Oit`N,#Ik} )=f0;4X u8D 7*UX58]!U,3FDS[}ݷ1H G%p!Xa6D<15^9GB()l*c8H2aU#VcccCYn] 4$H3‰frI@n $yLZV2 dZ+Pؘ6YV0VwT:*LNqiUCvgĆ9b8BroPM 6R঻}ʜr(#" 1D,Wff&JjUtV䧸h!Ѫ=,N u;Ĉ˂s.ّYe!ݤ>{N(zmh3&cJL 4 YmNw9"BV%DAؙO$k*5Lf#€,$[u?hT 6 m޸i>fjNӜku`A(V;cJH]luUL BOA8ɩqI-4w`\.Qt`n*)C(/D#j.9) vک_n݊<2˻50RRK 9$ҚUJTc^rٟ )na`%4zǧX7Bv!'lcfk$&@UK]mW]uA|:*#H>Tyinq=w{ ==i)WcӚ{*+@4;$⣀ ,\j_0= ˼nh̽@Ioskso4wCbcwmp* K dBDVhxwGС\7FNKD5 dj~(EESԒثW!wS)sVEwކgD$u%  5vX+.%zA!VaVRH9?;/{vAF,J;-\>dɒ1w?;nu`6ƂhѺC/y}8HXS0]ڨ*6F0yT]DvFFF_˕j}uRlDi(.2;Fg&٪E8Oe &Fb QlUPD4lK紣.:QhիWu睛6mRBe|fM@!'!&dLW^ 3+⬂t썢(| sA9@Z1b#Q7EqE$-*( ԧ%xEEH{O=~u#['Hc,w+ffK;=O.YlFlfyabkscA!PmlU>,ְa 1鷓KgeŽE:+{EG)z8"zCFn=v9"A`ı1)-24$V]-& a ̆8f~{|`ܹW_s˗xblR LOO#s: h[[G 2Sj)}DEd6t&&Ʀ\f36>YVA!dK3S@QT''F'&&"}J]]]###D$Tqffftt|z8:6<19R,NMLMLLh'l`bblff*Uձ(("42mzfTRnpmuhx8"̝PwDTJc3CC#33S333##cődGۇ9N=wL5m/S3řɩ6lx5>`(4fǦF33SSSq8mFBndtt=mAIcy@Qjcc#|608:24=3DH@$`edd,cfffcbmCRerrzffPV{GggWuݽm[&'>2:46>PΚS9%ek/Nx"jt)Y7F=&>[tj94Iɰ%]c΄95Qo] ]vJpV韫Ȧ7x#8Qr"P~ZY5 cʉzK/ (` ceΤvzzZ2]wW_sŵ]391]Nyͷ^u5F' |g{_Omk`%^7ntth82ߏ8QFQg[^p衇NOML}no?ɱ:_}1fxxo{u_y7u~J1~>~rrQ&z>|[nff>ܿs,g>um=}gULc[n?wǝ73c-8']}E>tݫo{ Cw衇nشok.WMN͜|w?٣&''3S<ƛx7x]wS}7r]r266FH؍o{vLjT'0ZuEg5_krrR!ELjK/=w͚s˯~e0|G}qߗaNOOX'|288ͅǟs?cݷw3jxd$(Lu⩻Фp;4*)zKfFVzr6e͖IY7 $0% Pou5u۴WPtTjg9xvNTYs$ Xj$#CeZRh!8OCA283|eϑI,Af"XBP8!ABAL@@Cht '{8=2 o<5QTd4޻{]kJr%?'?_?i">w}d.~+;s_~}qYbLil:8w^Q"S~ppphh7t[o??_S`B  oܴi'<ꌿ1~mxxZWMoVa\;^0ȗ+ : .o>ګ[_Z=-PDNex[@ɑ7/|g˹\a^=gn_4Rn=_=gRe(~g߽+xbb~c=_vΓgX6̿rA?{g-{%ΛTvldMoy<7ȘNו+wC 2 ߫/9sp{} |n Lc^E_uܷ}ŗ͆ӓ3}gu72<:BX(\m_=S*vvt3_) {y]rnw=vF"Yс:58f2GLSRfj5ssxl20w=HSRq2%)A``z7[g%."2u24WkIz['0)ʨ&i*uAjw]0$r .HQn=L:SpZk;ڌ cV0fKHXq΋X'O $JP~湷йsnܸ\EyLO`KX,mo}[7͛3n30*am_я~ ({n׼5Q@`TT XlLAu"1ݽ9}\{a@wq>u'!ʟto~{@5]vONL;syx;? HX)U?|FַqzfVwcOW|\>k׾vEWxXA&lO. c׿vOuSScI1T*X`FМ?uCqߎ9/*믿ƛ7uY}) ,J"(_-[ BOOϊ+R@0P(&D>Jl&}z=W=cp}}?r`ct1_tV*8*]u͕=NX-o|ۧ&gJի=9G?1Mo|tRO}S~+ꗧvwvϟ0c@\Uvǿrٿ~w| #f}܂,DnK ." k֬7o}nݶ1;99/cxxX ,;w`jj_.+"1QPˮOɉB!'bw]/wGJ1FzzzVOC>ۿmhppx… F`@DUR@⅝]a"Xv4^(ڀd-Zf2Dț аvb%ʨ^R7on_ ʕ+ӥs꼺\+wWE=w\}I?vJ%Z|+/RʽvaK=g{xo{!tuuX[ooUIkuCREĞ]v٭k۶m>t﮻EKl<2͹6E,4JM2OoaSSW SS ed(Q,ϔ6 ]uNvpE1`@R AXyF/U2'Ω 3#"SpgEť6.Yast9EgBfoΧIw+8'8Em]ĆPTF41._ <4-0D,lYJ6 uW}I>ۿUgd }OM[v+qr,Qrg7ƀd ܈DJC{0@7o~1*b$˞mMD*)V\[.u~Lڸd 8 U "% H$vpo(`P2b"@0@fa6#Ͽ˄lBw׀ Q\`W{zmC[ڳq,όxA{{H-P{{.\c% UUat <#"^Zؘ ۛ-]lm&SZt5Q0Rgt"pIV$L& C"Uvcat%NLğ8Lҭ:ӏEx30W^\wZ4y3C@K9_a,U̥ 9XI>G ji5Z! fIA%eI xI!%@S߸{.d/x{챇_|+W6T~)Vq\rj~o_FooIQOG❖^w GqxX\j5kV޺sE hu%(l4S.cΨZe1ed:MH:bWP|, j9g_]7nzkoF~߸;{zz|Ֆ޶|;aCMC_ DE==]&"ҔNDi7CA0BPADMXrADnVBe u J4ƈ!l,cczS-yqTf }  Ayxl+,83CXatq7wna/FUt,X0ob|zzJFK0<<}j (diᢁjz4-V&',ŝeaB&T˩i9[)OGX`Oζ0,"RУFaDL&(BH".jA  $31T$ܻȊ/i@Gj5$ "`%ı{'|SY8""(M5($w9꧒|A3LjO,NӬt:AA"0 *Ʃy 5yqu/D'511uЦM[֯_7.8utv l{^ťۆK3, !! NN?/<НzpWgB{6.m86:1?Z<97833<4mP\Dty)f زe˶mCfDRRJ96%Tn#A%!~cN=?v Tg>qTKB H6r<1>&@km6‹ >=15ibr/^=}ov$t_QA(FD߯pٕS81'7o,׌lٶmZeCY0:Ivy9s; [Q\TG һu?|m۶?ᄳ<;n^W+f!$R'/N |ý&o{Gm{i.ݲyxec⊜?w:owqg{{_͛1ˬޯ|i|xß|ig<쳝 ̷wgdc֑5C(b`2S応~1ǜ8]{{_?=~ ^sSZyxǝ\{-q/<ÏZʺ.<ˑ!@)g;Ϻhbbv3KWWy^q/T* aaE aq;wv GiZ˶e-e9Ec,QLfxx̿]#ӣ|=vݲe KՊ m|{lz>3~;'|{}v~76:f6!so\sꩿs ͢P&\uյzxz@7qE;-Xv-?WpoO:[~op?o}݀ vOl8JaqeN-ߩP8S:5ft%qa0NoH:Ӓל"ȩYg+=Ī3H}!۶ng]+V,ocm/O> | scQԁo>@n+2a;J7n|f===mF vvt>}' ~nO~^<>W֭#nݼ9H1\uk7A^>srH !TC=ˮ36 ?oܸqGq50ïS^., {3w΢oN78oN mO<'?| 'gm499~ysr&dݿy\P5~Ռ@-|YsODž\~ӦM?p,!jcd2]]w*9q$Q-1s¦o駞}˛_<3K3{3O?f;rxC='?I?8>k. ?dMO?yNO??m @cVyPjзclVfsQ:c;[Pڅ1#eͣȤ*+ޓGqdx9oH\FayG@gX }:^,&P7Iܪ*8NFHڤ+3FVv9NONl5W]u+U wZT*lԀJl*eg%qRgg/X*_Cb l^ٰ>www^ҥK1ׯ j3o޼ΎfVsAPTFFGhmm]=Qђ%;W^]]ÅM6 (FFF͝[hkxڵ,"k׮U.h"U :::,\(ًȆ뉨m100 "#i6"nܸ10 GGGEdQc6lXX\ti&)֭;wn /r__ߜ9sBa֪068826%\nxddpppK٬SLl]mmmq  Fijjj%νK"wwwwttT*E :[nȄL8222wΜ0 7oT*ϛW*{zlcoPTΙ)"[n)͛UCCCstwwqڵsւ"CTT֮[7jK/+Y~=-]6YlbSP6lHpl/Mp5e9Օ&Ό{X.Z#k 8m5CDžg>Jybݺu}}=}}ϽطO<~ŋqddv^J@ ֥%<tC@tH6x_A q "@BNO >ET?IÑ MAB]j;gfɋ-Y~|K7nx]0QZ$b"lt1OcCV;&!cժe2DLDeIp1RTU@rlR(LC=rǙ0r+Orq\NcK˥>x\EYRU|> C-BrU^ǓZ4Ov9H*\R},C4-!C)!77Y?+M FҊt6 #Z_(Jl6fSHj/"r#lma&Oukm6Ʉq& oǐTs-a;Wvi$Z#z]uioo| W\Фs?Pмl=S("DrLQWWq㨫lcBy|/%V8+cYai}WaQC m&r~qz^TAh+\)%sZ$>,yeΛ. yuu+JBzfbRw5R|Bc՛v7I'a` QUZZHǛ$hY4!K9 B/dTBHi৙RH6҈ZQ3Z-;!)&rӺ軰9sKLEƄʴb#XL&MD!aXbQH =7w>)ϠZ cU6%0Qպ!l:Hc5lэ>1 9ϧ&E)Kt(9r!!5b21qkpM%WYv_q wf}hVϱ|*ih:vTWI77a߼yH>!f.J:v< Ilh/}lLDSOj{?=dvkUϮ/w3 r# Bg2+UdǬX8w'$7@m.Ye|Q $AHQW%p-%gW!D I>Ӌ- D քb#l4-"|^n*:*%ՠ 8r\.Ǧkxv'1gX\NtKTat܀4RjJ u E8, W:z[ b 0HI'/Z^C[GwYu8aWD \833tҟ'x80 ǤVs`pp bw%0Tϋ` 8og@ rl3{"Qh(j\r@Z,%"H"El9=΃>55 ^f hpUI.'htuM}p[GV?>;{&'&^>WE10A# t엊j ^`$ G=˒q Jsb%IV06&D$ E,.@.Er,8K@Mْܒ$QfX toT 3ڳ (S3LP.:m,&u+GxpOzXW%aI$~ yD N'rWM{rI T hze z3D4ynZCc6%d-Y+`*K 2Z'!Bd,eXDq)"k-`  gE08Vmi^Z[pl b *b XRKXFU^8g?|ߡ;Ru ad º|O;ڄqH)i^ #YEbe[pXAakmdĒQ H[8Aû [8B"@Ɋ4¦[=Xyⷿ;gj`ZK\XYdm\D;Qu&@`biTA-vA4"hh D ºmjK D yk̯~gcccr_׿呑j%!kdj4S.Yk 3j\rA=HSr1* UyOPƙbZMm[WGUD@"@HX5 K `h,Pޔ1G-*Qz 7"Q ,Y h0]"-g\3gA6c(  qSISQaEmpkD&ND05SqBdv3W_j(Qs͓} vIZQ2 $; CE1`3f6, h4+’-rI,-Wfc \RjW>99>91`=ܓGȉLL!\.֖Vⱱ  #LƬ}qgq̣#DU;2?'߻׬Y| 6ub|v=7}_?T6G?t{Ysυ791O|'r\}]w_?™aV *=ßFFƪ7E{Ͻ߽[n׋Hfz_엿Dq o髟[ġ}Ygq\x{W}N9: DX,rkdbR!sSO}~+˭^{]|]wqg|bXCyO<|LLm9կ+.++.Xh`bbEAMNZj;o8"Mzlu^w^tmett^xvppG|;o,W333;/[q_~ LNOut{n/8λn:E)[?3k'??CCCG'ƿog??X, ѱms9gn<폿pff $`U wg͚7|> 4::8Tkfff{߫zKgJZDcA4"g}=kʫ.ҋ~#:2JYEM N M,,B  d4&Xbx{"*RjRoƊY(qUq%U-i,dפOhDbo@cj&;*=&ĊܹryǞTI f29E U't ,}iX.!HvF=o;= /<Ѓ_zy}k{{>q˺8}_=eî.=!ߖ׾?O?=5]ַ䲋ww}_R6FZ}k/䢓/?22Z,rGy7ڵ^ʿӟ9_B̛;wEYbfc`6&3>1VE*O~rG|S|'?E] 4:8‹k 68jWp%G]dr9bCGGʕ+ H)hjrCk=կOz՞7魇l6;X ?ʐ[bܹ^o=s]]=<ܹs+S~n}O /ܚ{ uwGN}sFGGz޹ߵC+zϻ֚0i{ x;nޞ~>re|Vџ?C={G6ZheKA\0<4cYH( E_ymټq)?~S_?VtR?pq?w檛wY30#'}G~wwν8>"LTT ??>O& 8CrrxΜ9G69 aYwDaT|{{bcSNy啵O>LEQx~Һ9@*oe[7eocW5*k3k]V&Y@<\B? љT=DDSd "js \,NU*8y^9DEЪٍf<4xHG}瘣?'te׾/G_v%^ws3>fͽs7z?ycK>$4 <ή< >#9r/W\y:3&'jӟΘ;weZk,cc \vɥX<ќ ZG*Bh㨴f͚:gW_y͓|e\!jP}は;KP_"wyOOOWZ-D:Z43p?K lmg= …\_|ɥGq'`}H,Jr՘;g5mB_GwwwT=?J5{{|Ítm/<.rap17{[ٖ(ߵz͛kE9xgs:S~215ӒESO݆~ۯ.YtM\??Ї>{FjE˕rI@|061zιϙ3ϟK#22m_v^j>O'?+zU{lٺK/޼a7k} 8 M dsoNwOw{YgZOoS?;o~߭o7zp?qG?.8.W:+6H85Dn>O l019_ay׽{y=tE-YD.xP!"6r1f @3S< 9H8$^i\VAt? JDA!#$޶6N $_PCjqZ/(nBѹEQXDr#~.>: ]!q>"HV' .]8316iNs˕_jjz˱}AJ1f= ì ,]b|ZR]3a58g`…;g-[GNsxA__{xvz6gU-\Q|l}sd˖!Ʋ K.\(l2X$eMD Lu8nZ96=A`d;:ۆ^<}\?p]o[6d9`Y. 4{a.^4.^2]T$LysVLJÜ9 QU&'>|__DD&QvuuyXn/ߴiN;3|.Be_bD!,u\vٕmƛ9wfn^ '|R.a3C[uOQK.sf׾fbqo|LOOwuucy/guNG~_߽AR.+<Ͽoy||Xc= ygOBR)/\ Zd^ZSlId.]׳m?~H+ c @qD5% @<99?C}lKX8:[;Ͳ]4V(B,a0 㨒@`gK5gGtkZ5P$8U+9S $}( kVtH٢{ 8N[t=׋;T<E*т`UM#fbqddO~^xtK }ո$$qSY1FZ}O?Sg; wv'sk=#?DGg1&}Va(Y}߽es@ӭlCC֊ R5Y&oB Ve{~4ʫϟ3N?uOx'oxktw㟟;/4ߖ.[[OZo桑0]Eȣl-[ Bh#3(B`] &8+cc#8_ϿcsŮ;lUbԚmh lЊߐuO 0ǡ 0v`B)J gTڦ1 ;@=Vص̎:.E츅8@Ɔ)&dzg!m D,hC #Ȳxl#alijqbQj` qT"(8 0=_^}.8U'&Db&",q.&Ҽ&D!o ܸ~3,yYiH}aNO[nK/r9xl>׉ Ԇqݓj\ƕbV>DT }LDe"=}_vGַvESɩqP((GEV)$#D!@& ck޵pܗ^P*Ce2qtd 8֎\)wqwq{acL.>?C̐|DLnhp y@^(z0nܺ/~aj׾uw|{mjrjrGrȻ?̹BVmmm&@Veե HP a"#,aNMOLNNåL.V8N|7mWWDxk%bK>1;y:hfGE"QrYHh#UDJPF:XTQu|'7VпhܝJL^'9xD\r/?ӏtwׅrm˷Bq!F A gzꩶ^[FGƧf|ěKT3r &Rl۶5޶<[bť>xŊR)k5)&Jwwn,-UH :bhZ {JD4$U@:#H!IsTO@.pZDQ9* ٣88߬KށT^lX(10D d(Dو ,(!6'@UgJK]CC\!b1qGܮގ5^w\o~?~?ٹמ|K_rX&D;P-[Άo~[n[oˆ{_F)mݲ_\}Պן{s7 h㸭04;N8.7g뮻 !N'cXD:;?"C*e tw匳.R肫{zM\}E L&B\O<]|'>~7:==p7|>00w'< wZםu%>3wZ9'CcsϾs?}V^|e|V(< m}} mfK9.˖C;/[S~qo: nk׮X G7vi#c +η{ =HW{/|irr򙧟l~]vU=} mlrW]}K.{=?5'g[!]{%o_;~?տ=ӿ).{<'׾pz7?opÍwsW\1::׼>唟 H{{8ҫ?Ϟ}]v^w@@DLvm^9Zw<7yHm]/|mܾ/of:s[Swڦz& T^GhI Z2 xie jRNTA*%hs̷O٦Qt,S9k2ɈNI[Z(cRE>|&%Dc 6Ѓe 6sϽ{^{=8[f`6{lٚ sЃ_) {'4ƀK)7l뮽bL6ܸ뮽v{ ^|:駞3Cwq{_|X믻7{E|sm ouzzbժ-[ͅ7t\S. cax7m<|ӍUSy+X9oޜ|{+Ӣŏ<裏>\,VsU]tg"sw>ԳA hQ^zeD:̿1d.8mVs睗On /yǚRPLp%_i˗䓏yޑo}g \u5'pwv_۪]bc?/~u-x\pa{Gv>{/iɛne AIb)\6n:Ʉ`y'g}rbKosϽ-Z096s?pCAdK7ps׭{^5][n}nfWz{{7|snnGy,{+hF0L[f\4i'ar"wG4x&GR>`ddZođԐevx0'٘ 5gYApz4TY]3jע^\q$ ґ(Dšےl(ԾJw9FQ|Y0>^e~]qeCc{Z5wj 1%"f[K "2͛G` mL`$-^8==/xqww/Q}ήҥK\YfmRi2\*=s;-^7UDK/av]Uf0,W+bq睗t_|q]hlloo 'Aĵkׂ˖$388848lٲ\.Glܸy8V蘚Q?y XB[f]b[6Afݺ̊{x |Z Bamlkkr(Khl2<<Ӣ%J2gΜm{G@P./^PhőoFc0-=smۆ tfsTZnc\.UtOW#kndwZP(LMOlظ5 ϗJDya!Xm6o޼t➞j5V{ [Yʹ\.\.]4` .xu333)F ־0rS /j(UD:bƗ9\.gmT,-[־1BW z7n815ўL339=̱1|>T}ѢE#,zgz-\*~cZmq6/CreZw^$ en7z:-Z055aL.ys_0wbbb˖-Ap+P:l5l3m|Hpd^ 3Xlr}o=c.;nON5 EHBkc%9Mq$QL?$(1C!KUSEP$mw; aЗ0 %FȪCM[%KÌ 5CW3ƄJE;6a:6&X4AI?o2331ZA ÈhcD ")OĖ#]-1Uo5 4 %&fp~^d53AV]zD0M'4@D21& [Ѕ ysH2KDLbOrqdl,,1AGN<(2&c&*9)@(Q 1GTQ%wD@H#Qk M)* h\V5P5eqarbrEϧ k {Fchktٯ<#r<0on{!|Kw{@1>ah$M@8Ɗ*A!N"] ) EĎ"@֑=8.Sq{$(< '>d a(8 q~ @}nIr )anqH7 8euacbh\ G\A5`P0@B?ƬyH mfj>בHC"#AUXx3bF{ŐQBZ ,3"2,e #k C1K5Ū?2&Ou񍭤-M|:WԞ[D4ٺc @Y>rH6Q8qI0wutH9>R2RfwiNo pWoN/!&wH}O%Sd/)i"^>% B}4JCNî`b$d""`pH& e2AL&hjβ*8xz DN- >`٩U$B|D4Jw#f֋E Cgzym`]CإwbԖ֒KQOׅH$6yoje4b&Šx]w-(-Дev_A$-pUbY-j2r;6/&>QDi]Fex5?GNʦR4Ѻ^ksCb'zzn%k̒JZ>¥Y:۳Hu¢ėZҊ$(J˶a&@DĞQ"Nc=B ;ѥ ;Jb7}辡!^$~QPQ-gy  [E=;rdeX8$fOVעDSmݼAMƼX_cp}?/i WCWskڷ Y-#"a/ӆvU{˶_Z|f꬚>0}ys-?v i-?&ؤelI#57VHQέ%9 u>s]j(Jc`IX -ijiڬoD*0ƘLZmM./[FA0]_=D_& ̱Z|?BL$@JևD{Fa?pIaV*e ¤+4@5Vh̒EMfwkڒ tN丷X9R~h\Z?cBNK"DkW,5c9;ٮnh Xjl%+cgrk _rZ[oV%8)X͇:U~2˝&e7wrG2T[-mfKҚ;j౤$N@[U|, @Vmm"fMtG⏈lPI? w%ydte븐yi^+Ro#194",`ä G95hqL͹5g`jKI 8= s46\diݍxs(j+2T+ MkFZjPkXJJۺnCNDHd0,i;u9Ӫn+o̤o`ֵmz%k¿jxiլiXEjMְau"B՛ס4(t?H[5^'h!?֕@$fʕBGx[r;ukes|qZoU^駕q:u4N$}pq g(\t  f|y nzz0 G]5>`N* cMP SOl6:3؞>ai,L>CAk'i^i<][BW4ޭ7#ibMVI4kR P=g UkyjBWZZf{ Li1 4<"3ղwVg'j꽒,]٥>ZW?a* ekm6SȘv}X$ZUKMArAN/ G gLQ?Ԛۍk;z2DP" H|j+n3i/qEJ=g%B0c42Lj=Xře쿄 Uh-k jzh8+R]WCg$?n:]e.ԛjJK/I"sNqX6! 71-uez-vv6h@iN͓֜iU5 MaTzE SL]"!aP( 6!Cç(D}k (J"ڨs'OI%P[c‹{@THQq 8E,ᒈ\W5Lzzs"866^.V !mF\!S/VRAnF\",j7Q Vs1_ ;bMT9t"H WT>QrFoɚʉW^H_ƺ]yP42=  44 2mk4 q*Vlpj?Vr;(&z6C۹g7ۙ&ݫZM iEK0VEVl6 Q6.X Gv~&ڽx:`tY38 úGo_ip,@O챜S\L~JUZsTETRec+j `QRYoC_ VRцԽ83l[2okVAmP;yMM`Md)GWv+7JP 33ՄQRQt@~ZcRM[4͆f<z!II}O(ؽqCEFQIC8`&@cSVddL>MdGOqIŎǂQbTMQ("E*XgxxI2pW(ҍ(M_z-M)PlnDΰOHw^Fh@y*A@VIJrAfT Sh% ݇D>N,WZl
Ny%9-2w}F Fp-X;iSw9tQq*A@ %MD1di4H'xLoIK8uxH `M4D`]ĔUnɓkfK8k_LL"%RHh5t~sLWA ֯+۩& v`j| a& _TnGX7?{~H^2dI.-#bD^B`ŪIDB^/! bgV:Fx@eg4Y!51,iz ?w֪S*1,uS84zIb ^ "9a&8Dc "y*k9)ܛ'yД* t"/ Q,;̢ٵjbmLDHD@Ȝxf/ `ؑL&Ti#tnc'd8$bf ntlrRGꋩlmC<""Jpk$%FiBSv#ڣ~tX RT\[*}SQu,f}r1т Ն]4׽!Rc vB0N>[eNLZ0+\;am HhɒXTIz! vWBuռ HsxYqD 8Hv} c6,twz.>Pjr4V %A:eK``Au*$D|nf#cl,A`*Qt,"C\v~X&L (~K66< X^YzM6RsVBiH9iH~ݼ&A+Y jGO7NrdzWleJݖ^͛Nm =Լ.ݸh9}Зp3yfdQ1G8X "6c1 $_ l]Dt C`PHM'9KPtgm \ʮU!Yh!kW bZNݚi$Ltmp>0ǓO-⌯jyL.~cԵMd(h$#OK ]@ qe;0ZPʛDc D`t]1wk+@\"%4z;tPw_!h4M#z6n3Ym밋YL٨"$\a} B筇~Q}CHD2 BMbˆ#if,Q5{+-irIs1Le!q<0TYuAnDg6^sg*5(Mm1Vw w6x6$(NA1q\F1A $HMe5 NSiu Z=o˵6c]mc\K7i߹"#~52mH˸QЍ\,N5ElbX[խ)Ӵy6>?+jYQV-a:pĥk$ԫd  @rYut +2D*[8d"Sa"\H6u=îfT|;tuG(VD 0mn zOܼwp{VYiWB>MNOGq*3`iPQoAȇ [?.i? A/kTy*3Ku_F[6UPJ*;GI ҆ "6BqHXILm@iԐXLZT*l6ѕflP38xC|!Ʀ>e[M4sMij`vGP`DN5l?:Z (7MLTݪKMCLˆfyzUE%+6cdNeCERL>ڽ@@ZbqjrfjfZdrlzTJ4 [29Vda"sqH/0e)Y{}ZcܔtWlLL}Ұ]`"9K&4i_5=T*b) ⫱$^^#"E*SA]uivDqzUy!zddU$qV:\|lsjb9j9DFBXZlkPw9znAJ)dA` [F FDCn udFBJ$"33Ƙg=XdIoo; 3(}DˡvHMǬq MqK it},hZ ,Vť1:#"clXv[я~trAa("aA`َoeCuh.-?6Kvy6ds'υhIIf=gV@[-45n&Z*0 ӱGR~V,YŖ1|l}[2::z}]py333m̲<I,>y3 &@0WO[R-a8u%qVq2c%LoL<s\%DQm!ͫAa LLP|W\F$؂Hfg*1I>A`k#̈́DoY$ H ا9τpg`| _ܒlx5F#ЌkO_˞Jv9P v2 $A@0[E4IӠ6l1NNLNZ裏?~Pf J ?IgmO,&-dF pv#:R?J~ovi^NRZKCC'  $btnlNW-9-r'y@ˆϥX+Іҫ̮O'O'hqZ`%K~UՄ۴P9RN;J[PSmm KmցudIZ;&y5 D6!#NOOaWXr(dp/[l4DK\ԇu;g% )V*)'ćƞ<0\APpQ)##aBII%ؠpN:dI֜uE3Urth bm̰qnDYByћ8rAVsI>6&fKKQͺ[0Gf,Iu jcC y3IDDAO Yw ^APOښ ݰQR:2LB]f(tC>΁0KY$8$yiu"v9 [)W+SSq aǺD! tAHH tu#7Mw@[[fCۚ iQF1k0hYh`܃i ; #Nsז<ܿC/-v&[x׻޵|يb#>: W93#e,"0( =95<3[6R楉]I~_6uZۏ# bfDcm]fQR0W΢*~`:B`D$ɶwaau O!HV4?L! Z\.nbGAzT^E$ך'ዉ畚*P\qJ߇s 9(JT*PC/v52VDl ʕ3[򶶶6HEH7D *%@ZM[ ?>eDcjv~QZD4T,_eՆ&iy/Wٮ@96\괹|B%Ku+-yD>̱!H BP$DDhPck(~@Dؠ_1 u91 $Aa5!`4&yTe/UD!C0rX,Bw0 ڰKnU@BV[vAOtIn,L_Ԓ-*a$ ]\Q]z˘e.+% VXEB!dfIPhd&ilQ͟7o劍(f2CR)_o%_ŷrl93l("5hL n,&i{\Glη嘡'AnG,۹Dmu}rB2Q{dy`ewQ(k:?d~Z*6`G)j+E-ipXFzZL%aJQBAY H T vL! ˄\aL%Iy>{B\idrX$\͆V8\0|5;q@QeIQKYOp+2y`>Ek)PKqq^C’ ҭp+ЋUSsyYP'DHMX#J\Ք )ZΝ;w``jH$g-RԿ&ol2k6r(nl;i!I_rݶ̹,!RRN6_xv|YP6!V%9ձRbcY\%"@Ȁ.DRE(MrA!fl1e1EmLHbޖUhn ƄL^ k Rk A A."('/d@ŒLJDªkRA4.DQڶcuSBG'ei!kkK :u~x{]ǔMD<.cĈQ@Lg{O.!?``f#dp$!Zߟ畺0FQɋ:،lSQGRFQ{&SPޥ=냈A*I7Ujvj;#@),),: DR`MU0Ji!"4]*3Ƥ֖ 6v+ҧ6.@[1*6"(ӜR?͢$fEwFA vww@G4Q)(1%[UFbU(]H8 `!BV#LH-2U$ca84(aՂAMAqUՁ[R蟐BjǕ<ֆ҈ $(+ fT{tڪgDql|\LUiT֠K#GKD" Hm h]pG~D1 Bϔ&J0@,٘lՈ! F2sߜiѐ !"ܲeˋ/8::a>P<vũ2!1L&g?N;-ɤq ؚŲ;BZ2t.Y䒞ڴX˶sAÓN@,$}<W!&ɿmq4xI vWF^9up1AusJz:?t%kkin %Dd-=}q Z+8e`1L~G@TElБ CJ H H6kAM{ooUԉW w|s&B !@àZY@~Nt#?E[ۏ h+:2"L"APQ2#2ws^Qg|%їN}vwZU T~+IIyAwOQhB!*MV]%U"d-X#4k4F,z/Ӆ@ڪ+6@sOVP5(4Ok| L$yı 9,:QFtMK͝ob ѪrCSVR"MSbd8%ibBŔArm5Ғumw^Wzvs~3>wiqik{kb-I&eɔM_4kg!:.{FsxBEPP;iȤ ,d䭊NSC8$ԉ˚쁍@uis'[gRבxM sN '1;JBQ^'Oh(%BB( dBP"UdX6aU>}Vw߰Tƪ֮߯O~ 1$J/ٴ+ & %HJD-*ڶ%? ˩% b F7$ #s`;P‰ \{9u]/\> {nCeLTM+6ΔGz Q[U@L> əٵ{wTIIF daNcTBxcaҊYˌ>pb:;`Y.ُ9_8q]z^ˇzK^RH12bw!x[[[Fnw!z3,C.{^D7A3jw8x~Iu&&~vzS;nO*hq3掸BN p\W*q=_ǞG=G{6$ TUғu1r[!!2L$|{u ۰HE!݅v^ZZ eZĊpO~˲gК # "v#6M͍=yW^y3 .8{]wV>3,"x[(K.ٿvsM7:t\v,..r-7|^t"T3f$ NOdl lquyTkfF00M4KngLZNKg5E\9$nlO'.ehvG !&( \.XԬ;$J 0uEvӍo+,,%)Q(Y͵[׺EP"ڒ.AA VYַmsUP92fɓډa>A絊 DUU7>!2/3;fA\cЋ\q6fDҞ=oʗ-3t<9ృ #4p,(B쬼MؽWBzzcd(9|p'"ȍK" hڛg)':NY5رcwvx#>яz\pAz^;;v{0t׽u|#_ū^mn\YYyы^?#yꫯ~ ^?o{}C++ & #[$5?NoN R6̗˭[R̿LcǦ$I`ͦB-P19Iy2GI FiϹG ~faxS?`ҥhv1EJ\n5)F bQ̑J"%I1ȝTtV@Zqse[7^;(Va3|BB%Og2\']>ZG[\%m0+㛿 %OFmD杋*7HN0vZ{= 8!>V/pĞ=_I+0H9or:Z;s3$ [ g v%JF͏!@> wgQU9rbhHjlm$BLT6fjZ^*W/{|N|h{qeO.nS, -7n]wb^?#K⛇]q_mX~IPκ1 E+  $-;M&m뭭uVT1)Ix6뎋Sah%\_s(GdO2 gB{9S3=uŝM׫^z&0&xUa|a6H1Fk[Ņ})8BUR%U DVsX{( op-,,,կ~sCD:rݻ~ikkjYm~ȑ|̭-A<1y~ՕOyS/W\O/2C4Ⱥ'yf4sgSGw`'Sdx;#f\+Dk)qɠFץEtS_{Ygwn*CY/GKۃbjK{ĊZ"B['h}jǰ{po)%Q%0R w"%0e,j9ѦbIC> ּ28 "]y. g01@G`U!LBe{Y2>ɐe0y4d/K>OTWeu|cޔ.)~׹Xj>K#QYV:ގ*)A3J0CQiG ۻ%]Ea0;Ē~~pgo~+^˽Ayu嬳$38K/⋛lõ Ƙ=}#y+>O\|}*ģwS!kĘbDe}}vji(f*]h a Ș8Mw?"4ξҦ$ F`(P{*9Rgy]hmon~KxʓWsoPUTiE'zG>ۛZRJ́J1#.NdQTE@%\D($%$<4>ى 80HHH3k;pM8QLY>~,[aխ-\D( g jM--Xr?5b4'a&-`S s]&b){&<'M]d@8eƴY{*DDʎ"R CK MG)FfI4 lzdJDXYY>K_ү?xЃ.[/~=KKK6]s5=MüigᗿOUUODQ{AA FH.4jB֖Yil<BHy*$kN%85(C,Z{2H-2Noa@2UDH g2Bqk|eI}ngejE$I{C= ;1kٓJpE\-n=~ֱ뿶K-v{G|(X+ B! A+BQwx0X<3{DۅqAOUv1abUTD+6"f.Wb0WDnB;T$ 5I4v eVV?j2 Mof.`WJt/7&m cg "㩩C řٺB4!0 1Ӯ\(J"RE Q4`ZeMs 11\/}__'v< B3O~o|?/Ç@t9y_㓟qV6ɩG7iؤB1)8 +Er )X4=RZd0D +7i>՜G&~"bR!\-236"RziS6Sg40.T1 Ess/Zk^'`ĜPHQ>KZbF ]_\ZEٹg<2[?upp_ԇl>pR!@aI2bv+nF&m̓Ǿ /81r(hTJ!Dn@>%;B$#ӣ m9=0c]UVU`,)ܤ4}@戜1U'zL{\;|MFA)Mab Qb&e͝x$ZbC~B^QM3.//+H$sW(AxxLdm$Ço&]vE/zskkk+__7gqWK.+LPK_|+ wdj}W`2T p&x@Ⱥ#sچ11˸0Rs{Q''j6mf$g2-8sjc8Qhd|RQlo>fw5Rdo( QO"R8Xu/y]Ǐ R孯~R||3o?1:{~뫘i/GVT]/U~kC BT$SR$2E/$z֘WS `JYDvy2I@ba~W 9%Ζ WF1\,j]]()F؍F֞&$!)THƤM |4jo,<܉ bD$!`c}}(`Bi QQDQUm!o)O"mnn2B>n7QB?|ӟ^[[{G?~Bx+_yGUUZ-{t:1__˞'YXTTHDAj8K(PEL1Brf g!VmL"ֆa?U7PBk+#5Lb?5O M:7 7f&`ۙo uc ̤IFc7Jsq]+~@ 8 bb7AM$=2М [~zM"W["v4 T n?] - E$=oްo0}+ae]\.A5-,/6~W ZK L,%KPfYi Mk3cn?kYD+dG)ZcmnQw<s,%MϑiIdZ>n¤N7NwOw5WxH48xkV12l$(0Okp4Cu)t-=a}B@#PF% %d[aR%o ommJ9b)^\6*P)] 1 -AA2&|TOl^SW5REu%WK^#ܬp{ήCgM!QF31z}LJO`{f%Z[-++UIͩui9q>hP FZ{3{w?d +++|;o&.{ϝ6l9e~QH]ܼkV% p "tdz͑•O=*qdfB`Zhoq%U.˛՘dwfpwiRzݗ*]Ȫ$?0ܔY%$ Qk#l`wh! u(w$rE4*+6g'/vZcr߷5)y]l s#x 92:e03L*Nx#D;0Mo~yۭV}cLE'>}Jۃv!HB>v= KYũG&VH^b5K +YVETx9&6BWT(jAAry'j t-bnYʍdhu [9U:&9CTZܛ杮Qh_7̈]3h>oKwVvƃh @5a kٳgϻ^/~Ѱͺ^]̝8yOκ~75LNc#\7L9N{#55ޮ\8~zG4l~|S&s0D< C{= qJQ5LR$0J c$RcmI@!BAMVD,DjZ-777O8FlNZА9g#?Ǵ?_u.|Ze͎eTOe1 7l(uL\2|"kͦN.)XZ SݷoTx8}Z.vYc|MZq)'gm4kQ%RVk!AVD ^k+bO?A! ޖ< Je(qRAZ>dx<TWl5r3X'5+Lɜeuҳ>i3\4KHRŻF.J.[ V5*Fl"sfjHٺrߤ#C+΀ 4&\WfГ{j9$5[lQL Th鍑 nZ"Q)I$s$0EF>TŰdZs"l#a$gF3 diIcw4Ϻ) gbFU9LY'ƽf$MžpU8dvGh9Pck{]5oba]Fn&O8N l>h@nF(!s14.IpΚ8Z䏦j7Icu"sC2YxF>O F@eYZ+%Sm۽ٞYY%CT eQnX'2+N4>yƶ5=Su(L9*5mcvHJwc~sm*B; ,`)`6!g,=OXrDAsOLd7$bR.UasfY5^dXyXWg48S`Hm8mU"gf72z'Qu',|@B3#Ô2weed=2t4cetDD,Z,0ێ1Gјl&iY kM/řx1>===҆Jei 5(GsHׁk%jx{}ujw2vIBc<؜po$R0)*BfU-Z%Ƀ`l[eսg6h$ɬ`.šcxfHD[Ē!k8r#LռmF'Uġg(I8j2;1ZBooVQ1u7WI4iׅE8ŔXN)G6 n4ggGh3Iu(ܺgEHOPK=Md,cO\g/i֪:;Xxtb߹4!FΩ~o#ʗDb>vL~x$$ȞK6$ ,YUeYvׯ:(4]HY֡~05>tr^R >r(*]\rݟju}WTOJ_*}'1!&.)ڭJH)& Wb0Bm8 !yaS^.~ZS{bke2Ѳ7Vjjªi'#{}dT&EӋ8x|8PrLXHx-a+!Ğsst*j|<փ2ZM$6&B-o&Mɞ9M*2iDԎoiGh.HM07Т5qs&Æ&xq1,RB*RZ, Ch8H  =%@u6:,˶6 `mSj%EHjB*>@sG7'hSZnUorDE"땹& hI)prB80émo'Y*ݒ6I5ԗ,FXQSn0D5)͍jדGP;ltRE~L\]?j7 ?C@iy2rGnoSV @S:#/_0#\r8nG{O3;gbtsb#?T5F/]!fckkK4cA֟gG{9Iפ0GlrV:I]ldD&ih\{azlQL`;aQԢD#s$rli1oVUeц2 U5((&B0+ ?rnlGzm#hS̊8<Fh\w&E"a' %Q `,bIUU&S4)~8ߑg5Sl7m#|`Ne2TS'S&39qȚ/@GB!3srP(1F'NX#' @qAr7nR>-ne}6HM6 HN YhmAmNtdebXDiZI67#v>1**I_*spgT9ߡL>1WFQO#Mu*d\Rp$9puDOEpD)j$'RI6Qz#kȮǂnxAO< .@4P-f.MT8&삸RP*OZ0ISW&3S( ]˔[¼*qf7 T^k ]vʲ oPTp4%o6Mc3TDSÊglp9a>I”K>2[yG8ss7FNt(BEQtZR-f&֨d(_Pa4k96FyuV$ʢ+"Cg|ONO׸1vu#tI4SuX 1Wف"X={H+&h4ـ85P\mD ɋæ7(?ǴgTk|yJ:FUOd'gf|Ǻ YIt29^'*|%yL6\;h7ݞd͵4g=l?өIz>)sEV୯jj5"{7.`L1a IEƒS+%Z~*H^o@0GI t&j|u7fawdR}FaܡiŬ9գ,rɍfcFP.p[dl6s٩~WݡNsq/eic'=e IcOa 8n?͌0;r7Ζ_DP0:ps38m&BqZ t}\$.L"d|KB$69tݽU rc-gPkBNNIGoc&M33sLlHhbr9Ƥ\"1X`j @7zکq҈RZ!|3>o5 3Y0CcT/rbQ5_j8.M{\HB4H*r)'|ͮԌ#x< >M9jbP/EI ώt5y}s )40#zk|7 Oԏr֦G \ ٷh1p*!]{W9TT!~#є]e 僙 *5 bkzBĴVK"$7 tNf39YLwE e*YQ6B90 3hfQC$iWd:TeLZO9@/̥oT+B czEgg[7' E#ÀFu~0AMʇVI`;S[sgjgwh6)ebVOύ2U(BvJ%j4h@m2}2(@@e37U翾1+-a]OkML,r>xD,=Z{vrNaaH$8oaqoޟoi|I?ɝ5ԚM6a1Of̾>͈Ɣ;G3.fjr_>qIa;OfzDBPEQ0~цC@4D1R 0 |A#5)j]V]N9ֶiddSdwa!I!l[39F%775Rh0lHqA@ *mUjOK#@3i<Ng#m6䬌Ig pv*y7|N8߽.ө1`!oi'n =h{&L9""MjEQVmZe+b(Pז&EaW]Գ&cI\: mLфn,%#2~s 0VsG䓉᣻4N{U?.Jp u5`H$i ~TGC2Ku-iγ}6a&}ɴI ;O2cqawFwkAմW3V=iTilDwu~.9d\?f6Fm/ UvX;@Yf;1pfN&bMIǓ#opO_ fA%zBVSvJ{gfSrP,3)Ow{Lm`c pa$ (8QfEP@EÌ44$FR[K{#O!@3.2dX!xFVuO7ySW(qǤ-$DqS)^"R 48 9FgQ1đ`AP\ڳ<, ^#qu.RRӧLhT#lD]$4VHl|;c9rp3Ӧi:,BS# CGl21Jj.T B8RB"bC=C0Ny$qpiBF9'?M z`W$76 "8)XC5 1"ʵxw`LBPBDK!>GR*@EXDLAD"8j!S1mﴭh#x6UHNc $, j p@defhJMG09rƟ}m 3a; 'Q$ 0Y"i0b'9 vc*4IE"Ii(Sk挷f]?GoNMF(y#ZaV+iwBz^ycWU$ EAE앓lOi5합N\Os9ۊnzĨ39mG4R`d}p'vq׮]n!Eؤ[ot'FRѡ-=T<)8&J>OC$VkL#bda@DIqB&g>U<2UЂ+SlI}yWa_&b'>#ÌT>dJ49ze~7JWr h諝'y##za;.NL'bۀy3uO5^J. F\rz=SP(vB(EDc49^!Fw 6Yav.h#,odb>M۴l("aJ툾`p؉^m`GZVDRҢ3oddpo2[͍k6W-Pt͘v+휣Ξ̾C7m6fgxF*(VhMc,$Ijx.(74$CO*3DɆs.JZԲfpdbGh99Ȟ[1hi.[5ͭUQ"4ŝI@^S  F}( I}cѮI` Zo/x$Ljb6@}ZI"4[';$ 8Z, YY)Bi-uz5hӮF&~#T̔gﯮ<졏;[ y`jGZgE WV``ch$5Ů̌^)[KK+9߾}/4S}tpzJ^;D߆ >cK9a#ƙ|)03OXU]vr41X0 Z[>u.Khl?qx`XL0|V ;ҍIxi]4dYN\y?.Hb%'(@(Ti 1 $V\5hD;Z**Ml} x[ý~\G{;,VݼOY^=;K'w>grVzV|v Zn-V:u`^VI݃cE væ\O8$ cIݻw~Lknvgc!~C`bl/o/\87y:neҫ$deM?vh8'\Sno:p0$۱)Xݟ*`ʌn+Ifh:Ȉ:Åe94ك(E1X`Ea2ma(Z{qda3wٷwo*BEՠ(B"jIInw⠒"`PE@D.B(ETժ77N:tرo.wkgb6t Q׷~Ͻ}Ճ|[]vPl`ָ ?xǟO̮]@}fz{u#?cU{Vw);XՈgEF)-,,V7yĢk݅oGk\"_Wo~8ٳH8z^g?/zы7}DzБ>G^ۿ7VW¹xH~s>DdasMH\xa> ƴq=BayR'8O6$T VobvbI'&"٪3lHpo/RO&g&ÀNO̤5,X>dOidxʉAe2$Ctzc$?VQDD6vWs@>YŐѡ@$en٦]<ྗ޷7E(8@ʃjSq$(qb)XcYERR+k3`cU)펄 ʮy@U|_-R+<4 ! zUu?WtA.[[oOC̴.pg߳w=Kȭ~]FDsϪR氹HڝNªr7̺w"jmm-m:y0Bׅ7^쓟'>ipG]NۭnUWWW~w:wsα vX[۰]WU}o}[vf#qaᝏNIGLks4JhJgVx#8 ?aE/TXU>yc H,>cը'rC bϷaH<L+u'm.@;[RkFq;C̥* *P*V7@DAh@B92$DH !Ut3TbAZ5 %!( \r\qh%NJ8ĨąB2340E0q[c{GV؋\1ZEJ=y?OmmoX)i] AU~oZ_uUb@  t P>?ݻ'\oB׹yg>o|{`]^j}7?ƕsKǏs9{ډkV#rlo^x%_?~+;x5x_}' ն?zп~[ jQp8z섀{~k?яHܥ}u׿njf( S)-#̓*4Y&i';ϿFdlY4yg{Ǝa4ԃKЈzьcԭ 1/-Ab%)9L> ^1 Gw 1d 'R\6+p <ĪDMԬ.Ɂ{Q +D&ScR3("V+2[i B("0 ]h|B2q YqP&${μ.*-̖e{Pi(x{k6*\?qn/=Y\VYAu`-b~hqiePс) !DBBZ-N L1@>666я~;gy޾q-*GôC?zoṠ=>/}~=>}K?G'v,/\oLT]x{w}{~B'?Z%9g=9$_oxs͟{K_rɃ']u\qœXXؘ)}{oz*B𦟆guƟ?fO}o_^__? /{ٯoWss^'2stH:Y{Gy6 VڟTy ,U̢*!DZ]sl}3'$= ɥ#X}칩xtAiKwjj| c3vķU'OPS␸tR19$ipsfr"^o{<#~̢ ڔЧ2ٰǵ"br\yK t;ހ4Z? eޠwbފ{ rkt?}-koC[ǎlo8\miauNoip񄇟s}V[mhՏJ#T1!f_X^:{ V¼0nll=ukkk+++7:PE``EYk_GD/{=x o#Fkuuw(X?y~%{+WvY^xA//^ckZ [=&?Ukum\ve/Wq~ڽx퇈䑏z ߺeccYlۯzի}/[=EY&[v.}xg=|.+_[?g1B3B8)e6'+ӾsYEM8Wyr3w#]6G"=} 3v[_mooAiQ$"k23RbXɎ^vʾ쪃ፍDR jLu= &h b >0sN*^!ldwj3h٧(Zb_% W \)T&.J<086](TD\Uׁ{O\XtJo766g{ՍՏ6OtWE~u߾[o>zEՖh)20 Uhw` TIF1677ϺǙW|o?~R$t]rd[An*fPhO|9: ^ӟ4QܵwQXXXxx;;?ϻҋo|D2ĭ#XPVQ2OgXz'>{X 1[nH]uBoBY((*LU"ϿO[C s8z_y/x!S^^_W^ȚS=jlf@ȟڡˈ2OoZ~'+ :ɐbv+0M/L9\UUEtZ!U.Ψ$CRc]MܤU<3K0+(V 6 s#󟀑=.Y|␄r3*C;A\U֖Us%w舱ô{T\*h!E]ٳO*m_C' b=\^?Na@*6}%睻\X^X;zRQ:\xKM$k[ K|7SB%X UaaY^:Ճm0U?}Qk~Y?ƸoVubc{k?~#]veDtx WVEhmm{?}=rD% %#wj)%à+/%䢋bYbDLI"%"UU.o!D~]y^.R" ?_t77{n8ɄSqvL CWIصFb r2L/U" dwx;%8fVbCvh d3vS2j`5~v䫂\JT{ܟ V\UWe(˒j5*PЪ){P0 #'"$[ BhЏQ%8P{<[]\H֑A[^Y^eq 7;|B(D ([4V.w: [''ݿkW[_e%34R~^H(s}`0ؽ{}οp{{V|+ͬ#4elQբjkص~E/zv?x}׮]k'~?qP nw{oWpN {~q76x0UN믉qEw޹~(*u:>DO_ S2esH@oG?r҆2ɹ}xG=>}+틩N '%+}iYNxlQ;$ߝtN*v{ g8\YQ1V1F!dHaPaqC #KIC]>I,Ȇ(׭?˓\ߚS&Hk69ٳR~0qr8q<ƻA@MPV0p8aI'+8fĕGV AIYKs,Y7OSi& R P5q?eMYlCk!lr`&3_8kfS=+:s2yѓEI W0{Zḅ}H~UʶpABo-iLrZKx5owN:Yn,nNyk+'!J}1cx*`U?҆P$r$WWg"%Mš }Qd$ (9Ov=B2R`1kbip![R W`K~fGOBG#Ħ MNaMDTl3$uJLs My1cQČA\/\^&y brCulsƻqDm3IB$KN9+)H*]GFɈ +gY$6q`m4MiqL'O4mrk3`ؐζ:y@c8q]=F>tpm_a:i%Wi3?r/ʧ#>\HBfV<ݞ ?T2(iDmqJ˱Mc8q]>Ƃ)$3S6L5%)]5z'7@'f&&]Ǖ^Hiue:;qirZUkl:#8SLI!M<8q<ƻCbew 5[EfbC5pv&X%OHRaňRPbkgx'aA4- BD*H3ΝH L yngp~[-gy afy1c[xSHb `D|0ee!DֿO8{fA3'؂dU8K ܸ) M:4qF}I~|O6}e)TJ&V-u+!RC,f&ZƮIiWz7@̺[Ĥʤ"*L|gMm&c8q]7F14ژ+quZ\fɧ o9i}7J$ꑭn Op&SZ2?y1cK(A8*_,*$= Ҫ-*BvR4`;=)!,Ya:<IHj}gUy1c(Lp5FNcLJ &-(eLzO8l}R neF 1GoM3Iz;1cxWH3 yG!p>_5Sw䣁jPT sC3sZ76md# b:Z҇>&R;;8q<ƻ~¬SOm[a*duƷD⁋u"_Z٭%xu&v#]yؐ4:HŬ4mSnSP:1"Fxw1cTQ4wIENDB`ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/TextInputs.html0000644000015600001650000000443712654470322030170 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: TextInputs
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/ProgressBars.html0000644000015600001650000000447112654470322030453 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: ProgressBars

    Progress Bar

    Standard

    Infinite

    Activity indicator

    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/nav3.png0000644000015600001650000065233712654470326026544 0ustar pbuserpbgroup00000000000000PNG  IHDR71 pHYs   cHRMz%u0`:o_FTeIDATxieU9ާ.3#3+*IUԁd $-˖/\6B1la{ wlw6 @CFi-T%Tj36"8qޏ9;F)޵TdEsΞ;bϵ7 b%" ADPAD a(H@LD_L`2ۗ2SX`D12 @,H R'"b 31s15kuP b !3@ &RA !bfOڻ2Į 1RDL`!b!^Y]x}DW')X0y5kzQM%ľ̀RD`"e { 0lK*7vIImU%#/Ď&zRba38q^ƯvDDJ( .W'} vDV-&NҐ,ɖ0bt!&!TR"D$j-+VUy5~(ľW {K>w(/ lJ`&fdKTH9$, @8 3}cg{'2mr@S^2P? P8q^Ư 1 K"X@"9PYǠ`fT+*q&0W;I, GǠjS8q^ƯmCS[\Ђ`yfV8٫2HyL@>) ̿@`ѼߑHԦ Rbd,pzy,ed_ИYl0q^y_5ښL[: 0ޏDdgp^FY%nawSЎ&liG0˦G3S25k8F1=/\Alkt'"Ţ6t?7e2}pYhbXx~j,|}YR_ƴ!85k8FA4%fFe+Hu'KL53:#;I"ˍw\kN Bk (w^yjuevlXu[(}q#>fK_~kLv2aiV¤J,\`+ù$bD 8C5k8|Q@|`YÈe"PxNvE 2pe4K۲>`&BT,ݒ|3}՜8q^?5VĒG1 \Fyav,v$q.}d K̶@ )f݈ D1q ba+AՔW>ž8q^Ư;Ә8 j^oe53x?pт;.hNv&Vl$ Qb٭]15k8FƓ,nC8ŴYL` uIWSqr?I1+xμRi+Q ]tAy5kf]MD%AT" UKC[9ᅓSl!@`A~$peW6Z We_^}lYPk8q^<$[G#Bs(L$}pѫ'/-Q4 kΎr-E%1A[C<sT{#s+(E%9W>i^yNj.Ȍ9La)HҚ, 12Ȋ(ay=rss'Wf5ݞ!b,O-& 5k8ƊrFcuSJ{>VfmkNb&kp_uX˒ۂ5cy:qD"RO'P1С,+ռy H,Fk4buH%OU &@@ITUB5IT-<5vr`&R@B,"B%",Affaa;߄*K (I~&?"'Yyʂ׼Lw&ww0[[Цr keIb%S⯃OfLR!-SaJy5kJ5Z䤧+ -s,4b̦M8Nifd<ޞLx{<O&d2Nf6bR#.U?RdE( ~--.ť`0 K Å~{U?WW׽'",*L8q/WwE#b.n[mˆyuΙPB/y0-~HM14RR9;ݴyhbLMOh|n셋ϯpK666t6NSJ1Ɣ2􈨪p B ú!P^]WU=g16Z M^MgU`Qͬ`pP^U7l6kXX&l:U՘b51Ilf8M1鬙ihc1N#MS`w={_ݿg`iqi0uUA5z0>1%0&<&)ToY6BgLGkl/:[L:[l#EE>Glhh5'OvnDf[.?vO>̙3gΜ=;'l6 7,ť`gpayy?/.,9rteyo]׋! "Bf_UXUf4MbM4fL76:4,Ř,[Ml94ARfUe¡HaDO) xeREMĨJ2\DUIĈx:ooln&NŭlGtǣԨpeee>xȑÇ=ouʞ`,"I9+!$OF^__9K҉8(lyR6nub0{z|Qa3'ʼn4V0Lծ里3)w׸kTF(5%ܔYik4>uO?SO<1`0X\Xܳw:ouu߾}^m8t4M'K[[[/lnmmb3vq6'㦉)Ngbj3̢TAl#g8ގ rn ךPJ)PjA5^B !{BU u]u~cU0 A{ЫcL =uFA0oomm5٬^yid1k&ziyᦛy]wq\sՁ JfsL. ?V#W-\MlnTFY Ol*JݕI\DъA5apoR,T۵D~֘i:O<#?xG\s]/ֻ^zlssҥKO8ԉΞ=}ܥsΦ8k666 %'^ W{pT~]׃ HU%4PN>$e%J)1: P5U"$LU]`!ɺV@Ĥ]))q bնbkGU55Rl&JO1fl2c16)5Fޮ~׫B[ZY>tU+ ...VU5Mǣ{z'_ ȑCbyӭʺU|Z8)^Avg*y29ߎ~& 9ac@E#f}9&h^.1k~|8X o&"G;顇_~d0~]vC]R j-&*@0B]*ARKRm؅~W wGe[Ӥ"RV%EB;6]4@J XA 2eUp:U&aI*bj{ګ΁-0q18Tq66/\:vJ)z]7xEM՞~b(yUwo T]p_7/?+?n_%/yqqIj*SA":aU%$@o$ 5 LԟlUkwXED!ՈP:\=JDJMVjH H,;6xyDUԆDSR+5J2EdD=$7디RBl@*3YPT b>Pdf0o=䗇 +z{K?f?@Jb~inV] 8#9 ć ݎ`7 7~S1'<.oBֵ'q}b8:qk}5pkso׿?#??/|w].^m!'ꜧ3틋/2B6L"8gpѧ?q%/{ۣw--Qv 4 M3Sj$i"N SIYQ`UBHJJ:I/]j߫Jh2^/2Q"%%!a(DJNxuzkN>ӧgU,.yZj\[_im @Ki\HaQhpf吋X[WQF Mʞ? 36s; %C/@;yFo&.|&~ws~~w|7}ӫN=\ARD NG؃W9*|P!V?@v:\(\M%U"zit#O:0ԚfG.lf= u:cxJ*)foBU5Mg4JRIuT0%T}%M t4% V**99rp FǟA37b`!"I0ql*͋O?7Ew_xS_soLaXAPaSDms:Y%Ē>ƵOl@&650-J$\TV&t򯣒Y'9U_vhwKb<=gw}ë;}l qڰJ.3/dFT*y}gj^.Ѯ1{Ν|^[…i@ EPCH`w4Y[b!3eJyQ F7= Re[UbWI9 WĔHŧJA{5B(@Ymv3) eP))W/eۓgN~0錈FJGp=ՙp80h{{D[[d6j2BiT&$M6&,態ǎ»_z=XIg=XUg,@ &.C) yDH"ĊHA4SRRW +{7H4NT5ԕiqkWŢanAz}|G^Wz}ϟ+ʇJd[@{ jŠƊ?ʴ]pflv5[|H6e2q6%v/vE;qWh#?Mn?on֗K.(@2?Sb %cl t$%I&MFK#u'q{)D7L PRJʟ olo39KT j%Q$:)m 2E"szi<3+FM9ĞU?Krg F۠Jd#&$6l0™S'cu]YAD^14AՌPϟ?#:rM]{;YT=F0R #K_g!XS'5OS,8Gu\t^7zq/79BI,¼9ħ2jG-%мVc_◿/?"N'.Ԗ0obf Dknqnm((bx]0A[3k5BYN-6z˭85Fzef"QjyT5 T5NH hT1j^Yj`+O3TL|ŤpD $ƳY%f$QXQ%WJ@NL06M*v|18t^5rTb]"YURjqq_7/3[w[! sPnQo$Bڹ/p8x'XM2#7nUaKF) 32n3alz6/eYK(v|'lsyFb4q4 ~M&ebF]f[P#Л;mZV/N$h']5]U Jvj $ `WښaZn܆/8xL`٠}2A >nc̅t[S& Չ9ʠtGF aa&!6Ȭpmw]ډt\rlvnWWu]:uj<~5Z8r2ArU6Je[bp6;g/\]nRɲVw`bM9'+F .6Fyx{iaqkk駟 e8+r'Q& B62 >H5 D)B?OQkg5T#΁_VHEJDJ@ ʤBJ1 %cZԜĤ,(^3@ A2H(6$V">- eLA F`F:3<‰1#kij]\_Aė.]&kQ Ѵf2ef7K/h=n8!|K1([+Q)ij)3i~#L$d VdY:e*%h=%JDPX+r -,{8SUBDPP(+.DIX ` װgX! 6#!Y`A̢ݔ$?1TJ5ɀz2g 7)Q"#y"eV.3"nhd!TXܡ1*%2qD ȳlK!J01r ̚BUUɖI d<~-5J6)uKQ"_8GnZb &sN.Q A\Mm2λi&-S%1(V\2Nd//6ICc oK:{UގdRt M>* G]T#3M&ť-YN@gؼ͝F cEPJ"ۡ[U{5I90FﱠZҐ4Fs%J>WP4~(sV*%B |Oytt+ig&I]^a%0"2{~|S^2IDuJ *F[kQѲ]2b\Km>tAGCD=6׸jj=1`nPiK4/3)8+slIgl# QaAI…жΩ$_Vt.-v;ܩE$?%& odo ʰM8ADLR3 T J6wkǣ%b!<$ʣ]Cm!vtL;zW(HJI@Rx2Οǯq9W FɃf}[Bݚ}L數7VuXvƎX:Wɫ&÷MXl73q՘4 lUro fJVı]rȻXm1I,#Y) HwbzqVX3!߻K,nf֔~IԄ%mlzy8uIʋwۖQRr{V@kwLl=pLUwg.wYԦ1sl "t CX{~" _60ٛ;mw=ė}Ck,-ռˆ2v7PȖjlr]T#TItf9 !FcSf2r=yĈ#Nђye0˜;8Y !UۖgdJQGV IRJ@5 \Z!21NɄ;{+Q2 3_gGՎMqIiNbb7cv(vRRAf r'JP`ʚ2M-j<^YUq&VvdvZ5>愯`,46ϓ5lYEN!ofP+mü-MO-9@hòe'd^nФ@错PF\cbXj _.Z\LӷV\R$+ePyIN7( moʮ-'d+sæ<%jɋ@Awsfh geŀד$ 5/in^ YJ %$M':u6Y?WVOM6:E3¤|X vU˘\vn)Il-wC| _g\9S6#ʬe *(C6 wOjVyrnuڼ]T"ffξOUaRsH"j;;"i4F?WVc|bqt3(Q`t7_t{^˴51YH: :3dVNiO?l~8'+{<#fS}lv4Db4*T#q]!4j7y2zOؑM,,yh49)ChL/4Fc'pn"E;s![DD Fp 1&͟+rv9 J,&R6X5a:&R熌ʰAsY2m+ g"B&B${Q]R.lg[A˭0B:eD#1Jz3(bR>O JJCgaN`侰ըPfX vܞ[U۞%'K*%ey”<8zv@JS+AM g23iZ51q~CmRҖ~b3."aN\ba8b0z4I;FHLgDJR.W!6ibBp>Lw#c3:T'~HSۙ2;fx5bT"c9MHH*ـB$,(x0cv&-E3@.'5אظ4۝ؠ dypB@ɕBTGKBQr]D*"2c8-I458J9< &$!@X-/DFvu 4jDnO2;0"\s PJ:D3f llGfONpUmޙt m@WhtJK<6>~I<.9Ħ k]56imTR̕)i%Lfl+]LgRPbndf[lcԭȄܪ頼 l':x͋7dUlI)6;C'*`)'P(̤7曥[ ?/Z|bBmȫc<:%+8=RK:2 7S[$S9=b93_~wr'r6o#8{RTYZ4Qk5*l."ĚZmࠐ]AEٿ*MP  &Քz ojz4IDxՖ͗@̂-Uk:Mޞt,;jȉ. PR̦É$v1.*DoB=ۮ6ۂŌ&hT/'Z[ kG= j:ooox18j 2fAv;$憑=P qM=ЁQL#UCSpT# aABpDs; &uLHzqnc%. SrI1 M,6)!o2Gv] V}vO%*"%d3cEL<;v<(,(Qf$*b{3CW$%Q~ 6ZY4?W^c%D6yPb23YU;gASAyl&'X6O^R+^;۬= =V͉>T:Ԥmc^Ѿ5ڐ"^UJ}{\|OW3pr R!D x$5yAyo79䰯Wg3neqƚ@9]Rnb9Dh[Lu$Yę "$ΩV5`P:ڏh"%$0sϊId{aW&aؑY]q*DE_NU?ȠBNJL$◕-p{*>q5er!-&IZ&" I y hDvnqZ]T&0P3!%8 *Q[513R"YbT:h8ńKTD&YmP*l(9=]R6b?vD$R qD%2g͓Ea`oӊh$~?W^cLc!rwY,+31oI_bPQ\az~Npo- ]1Iˉ"~l_T;np|0qWH^ "a[M"U G=}~փ?ۯe?|+tyS]՚>woK/:Ljȱ[Tuaq!T!59d:m0T7HCw;qN3wQ.Χ7`). ج+H1<DE:( ut3q7ը@:+8ŸH"͖t}p  !i;4;,awL>wͮw}nE@ !,^{-.wBtew *-"^|zmjCR <ɤi̟ǯ*{1Ñ܉agxSL8ԾiCh#EOЀh;jj~r[ nd3q*b BρQ/kE5B5d#\TB筥^{F|''SJ~ oxg>{weeٳg_~ _ oo^\\׼57x߿q̙뮻n6>} K"wÛD0~g~fss3Rwދ/߿?CÑp8|駷cG/..cJ}{ߙ3gn\tȑ#sӧ[[[Dr~K_z ^җO~}{W_c?c_Wʯ?G~x<~K^o>y7|77}7o_4MDCzYW=/˧iqaa|3)Z]]w]kkW]uٳgC[_={|?drq[?zM7mnnMo̷~_ U}k^w{0lll| _?ND{7ݿwϟ??[C׿/}Ko|Ç_;'UeN񴙁GGgW_E@drG"5>WXL`O!2~_0Hb2̎EA4|sHpd*k ᑰY>qWH̡ UW<502_TU&NɅw{^"N??W>LӛnҥK +++׾~ի^gϞ}yK^?z=Wj}}о\̠믿~}}~'|{SO;v>ַ_MD??pȑp8WWW80oinmM~_Ň~pY27xg/\pԩ|s?^Ï<ɓ'O|ҥK/;淳رcϟg>CDGۚ%//~|p8dzٌt:ɓa tWVVbu]e{{mnn-oGZZZZ[[W"bXM q{P izU-<C?n6QKTy0o6ڎ _| D<Ʊ'xd b\6)jhLX;VR1`bkE5>sS'{+^"3Uuӟ9"2׿~~~K_w׽駟~=z;O&k~>qiǏ?#!gygc;lv?~֘ymmWWGу>c$?)t^Uٟd5\og慅__8u3?cZ]]%}moo?666lʺc\XXX[[{ ^o߾Ǐk_?w|^XXj&8!*ß7?c_2-}۷}k_'N|ЇVVV^YYZNvqqqqq1Bf֗WX~ꪪ?n檪b{7]ZZڿh4!UUmFDܴ_pߏ1hM,7vͷܱ=Y*Fgϟ_>ph'=*(` U2s>ԇ @nstjLŔS]Xp68u3 KnM',Нީ_uk5"}<35F$^ *dɜ&'}Cj{󞥕ef. FQ!}]| zUFrU>l#3}衇[[[|ektܹ?Hcmy_IITQLD uy,9XkI.@rb; h#a'9R>Ŗ9z^yE(65siFIփ"1[l[d1? `w.'r*{aD l0PMu!HMj<^qq+6flWHeJpv܎,ڭ8/f2 )ż="P!AmB1K ԆMk=5VUĆPafw\{d{b!1R)5}+dX1<4I)jk9RkF`攛k!E5kmұ7*}LJDdUU훪jrB &j#ef"bNX UUkcݔunBJOM87?~!I"<`251VU)Ɣ j:NBl6,1Owi+I̥ IV,ga%;yV*] -,O|=,`bY2h k-5F E(X$&`z~3nMǜH_"ҒJnBUqt oolM:=OK%YӴW3Tƕu]V2m)rYB M̳-\^5 ݫv?b_Q**jKj7kQ &BJ,j K+w癆s5Bp<ۛn&Zũhkg8iHv"g\*% 0]TcWATBUB L 1sLF40HMC qCHm6r2!KO"Lk;P7Mci*'XEeh j wpfe1B +?a鐒 Y lֵ㘂y#kRU 2F)c}-qڱljïI T?x2y-F)G8udz[=:8b-;;x׸jTxyA9 ʁ!%h,/t!OS1K6XfK5;7W!,[ڲ#Oɠiw4Ϙ^-znVJvRP 彬?OB1e3DZh`b %D⚈153$̚d<^q L >6evjZf㜉E9J&y"cٸ%m3T-iliꔉr^C\^UƭvȈ5.MbY-ֶ׶;20˚TnB9t: b^ Z얢UuyݫU(sn!W̟+*L;&U*g:yZ$nKBuC iL0QCr/| m}! .&yFҘQBbE" S [dZ޽{?_f~[o꫻B(Ag3eYi˽^K1\D )vƎ9d6B v [lEJ ]9 EvnpV:5ѾƶcM1.\94حݼ,d816u8ΟǯF) SfW}r-Mgc䆐%V') ]VKҜAnTL垁AsD?-e׸jTW{*&6qZLڐoOO<#/^|衇>lmmY D] emI͝?~竪ZXX21c0`p8\YYZZZá~ۆ@|tlyF׵+,T]eSX.@=v@tHteI\dlwnEu.&S.(ǥST31o<^a(T"QҬk^9[P2 PFS+/Q#J9=v2+=/cL*O .`"ѕ ^3.׸{jdbO|pͣvҨmK-\ƽ{~_}+_RfgϞz4ݻw6:u.\0ssMӕMN=m9B0iCѮ,!Ϝ9gϞK.=6Yx<6 %wY._SpwS4M#Tb6u2e~eXl!lE4ٰr<^qU(w8gSAنmQKńYTƴr'*է] |r|lQ%%bWڍ pnyFb& XHJR+ MgSMTj)?O?]i?o57/{666677?;k_׼5fOs?s/|O}Sao}wܱ{{l7߸/^?ؾg?Yٷo{nooPX`.r>_zZeeXEBcR"1; Qʔ tSC;p2D{ {J)̈4i%2ƪ2KjcE9mdK+s} n-Y? sS:(9Z}QxnryFwJ)qZN [\{'fK^w;={x≟o3ϊk___?x' ׿1ƥWUU{-o~}{>|77}|u]wԩp׾v:^{|g]gϞ1yM[, Lm;GτBgwXjݹ_lc]GEWpX@>5?˼%P{w`T.mRꘒĒY񫯱'C˰`FQx^k^ YȁTvA@6)$7seYl)TO)h5U=/ 56|mmmaaaqqq:_Ї^}w~s;cmmk_ڪUU}ݟ|7Mlyy%/y>lllr-p4o'O߿ַo>}ѣG:޻p暛ni}}ԩSo)5n~EӱBJCK/B.RUt:-<łMuj(Cڔwwk=Q* ÎYqW{뺐 [ȒOપǓQKǞ?_}W)@%a22_.bpTlH c`d/9Ÿ́"%VBBNmk,>$ ɠU6( ]^.9Ą&NNHCW1Bq2,//nsνotVUU~c=n|NjPM}M&borҥ~?Lo9O>Rϝ;7L̈ϟN3gws=o|: MbC>vt?v?kF,ԔBaeml!?ˎdK[g.s qRx$yUȦFWVlhT}_U1DbSa1sWJ1OꯄxGژӜYdM)!25TE$gKh766Ν;w){U?xۉ #暿ҽkMצ42I5 x;gW_= AfRGͮɾpr4,|W.t#{4{{7{6Jd1mw]NSBd $UqR(&(ϟ+Q;ؙ7L@M20#1.{e!,d(F> G <ժR e!׸jޡ`FMU6Z:|K^__LJڳgϾ}ٳ#G|?x>X/] kxaaauuȑ#=x7}7۷ŋG]ZZ*{^g^wUW-//<׽<~p0|x:UJ)KC٬3~'鶼r~>bg`{b5_X; ;^t76:Tw/_yb٥IdB ,mMs?WVcnvcӜWmq-dgɷýa,Ř=A*; "@ZKp%cO2'd6kĦ#<$k%59K++_z聇y잻_2kW(ipW>|0%R7~7<~n喫/xg?x`2|~ҥiؿ5\}#׽u]w?|mm; 7pu}c{ϟ? 7qԧ|ɥ~|G?W[[JiQ~pGX/.4JbOVwV KK1_}y@a{1]CD{'>[Zjں뮻ۻRW"p?WVcNYVr^GHB5g72ri Vȃ]. 7*O $\rN4;$XYD2Ģn`yʤyD*"rZӷGnwf]xz5B9]KqZ?qٵfղ-LNy|]AC(R~<^AUCIuR92:zd˚3l%IRѯ[b(w3<6(@ŋUqMkXb؎`1,Jzc" )wi^3g%XKq 2*d;2@p"^e 1dpiFh{̟+Q4 e' (]4艳`J3Q!vreGreC,Օl mne֐R$(F9$e3mRF {9q7h{STjt+C!­um醅ѵz%)@z0p)4bӕqbvawnIc6.Q0_H]Lw;8ݶR\Y_3rH]FqW $ܵo{eȒPPG_?W\ rF2e&̖Wݕƺ ,ݬƿ)>3nlQVns=NBvGbDVcSRvv?ew(yFW;&"E-E'v7; wXpEr^bhwD bwvXv u:;oK,F=Z/q&BW4uq:KWƍNv% MЅ42ຒASդ'XQN U7}mrdS叓p۳Ϙf^,FS<݆A:nj[+m9'"UCx2E_}r ׸[j4+]ߌ;E*C?J3Ɔ~;Dԋ–r6Jc2:Q߷o ]S`ͷ[,E1dDI (;2wഛ +܁_Uwm[R]E>EO{6\.PTbTYH)x5V$$lLsrVG^&} ratLEQr}۸MVȺ)Nn;8+|&mLRqVjmeK5CABbf/nmm'33Vng#&P OK58:clo1&F" .PB0;ãK+M3|̆\O\`00x^^@ {YiXוnibF@Ug:&Mp<UMDk6kzs-Vue MK̈-v)[e\\H)Yngvr M"Dd<^qw|LZjUcYli0%kd!b;D27®U#~Ym&,vՓ>Lŵsqbs _4L5/jBA&:#<=LuIӬ*kejB f0ƫA8&, lX@e Pe.Z݅Cgpyuvٗ!z;.[_v'E̪a&Q!CTӥQk5̎¾)`Gfa{\H0 3@KU+[J!"fJk|={=r#*$B&r=D&"`Q5NXd>ptE,ً, Ap ʶ i/8qhL1d cLfG)&f"$"! U9(Q֔LO)11P${%ᾪ&MŅ{AI]4>BR,0̖AD,%5Ha샖m&6xd0 T)E&X&XE\bLU̵r"7kf#I5ULai܏̔TCRU݋51*DBR%R1H uyieDLc9 P(yxSIF4ICpGs$_0if%>^fd,lA՝YfVdꧏ拢Lxw^.9I Er^뺪T!TlƼ9:4%,RW`B~Y KJ Z*Ty& $*iACc"b , ]j=2*$.1F@P!TRa !0 D$S(PI4),HyP!pR @M6B4 sR**7rE(XB~vrblX W?W\q"15vv+ 9/kߞw)~^{0~rfj 3WL>[rb "Gٓx^㮩)_|(5{8Ih(,̢A0RJQ#R"^,PB%,@ҨW!XAJP$51*bp rnbR 5Mm3s.UA 4;C'U`DMfqf̔AFU d aՔ4/HU U]H Zբ@jR "N,TU:&r'X$T"4ah!UU5FŶT IQS:F$ 뙃9yŦڈ(64~H]"16ZW!ATUԾk8N%&/ĮXel@`W*1*DU׳H;F4*sRw?rH7H1:'w=Lx5VΜtor2ffOb L `DLeKB䛝Loʉ}nv򩂘 fڤmF  J.% 2׸kjTv"1J5qVĜP,..ٳzEXNl(Rԕkn8Okh ָwx ._k8vuCZULk결Co%#Yvcaߵl,j&^f(M9 ɮ%nWYcD%iӌIQU;?WScE:t_H?pe3X?m7Xml١B7mOm LxKN'eLPg#)1(8>`5eKϳ+3H ٬f]X)5)ETMvSFYt<ͺ1;R)쥺We))[40agqDlҵ~u ʻ)E%vܽn 1E]Dz(kdvfR:Ú+r\'ykl &meoKs^L:hFzL"9O :P>Pz sF)Ed'^T*+WM\~N.2s4#kM5JG ̢\ێ&Ci~f+O]|xI7>\v6ˎ k]g7 +vEZj3#njעGUh8b^Ο+Q|ը6sz6 Ӥ6"7񈱖˟F$n #uyDl _G-xPЦr+cN`6qwh !cs$ʂNKvM_M$Y^l!nZ&vz%T{ԥRݔ*WZR16(4;;⍊&MNŽ`ڥה»&0; WVMYy )β jtV,fr&cujgK{3uH=T|fg^ȢqV(UAƙ"Bvtum@1]=ݨg^(qnGjSU< >W}6z_1*˾PLz˗#P6䴏ط[۵- e7[o/B!"5Obc R9t,ݛc{s52``fu*{n:Gg-_qu.vըi<^q;'Cv-Tc$8, 'n3҇~n;qD߿b0Ilk[T))e: /onn/hXp`SO?~;`'Nfoŋ=M7TUӧy䑫СCO=l6뮻N8q7;vɓǏظGƱc.]tԩG>vtMid*S|lmӌ-ED K 6]^[]r*^eQ,YiX!B I@.57c:AHemSk+ Wѻ)Gr4ʀW6q>DwU!h.UJw1.//o_666n&6{nYXX|o݌139s@4ɓ|umnn>]wh4Z\\ܷoɓ''N{」gٻwoϝ;g nee{ysߞ{{ss瞻WVV9bw~3g,;̙SN=w-7ruxFÕ#>,]*Kak~i+G2,".oͦl͚?WT-BTV a0\PKdqt,EiB2ۅM-runqqP.̀-e7IwSDDT()  ]||<[ÇcW_}?~ŋO<U}sp}m-;L(ԕ6!s˃$H<( HMk-"EUDjk3("mS Chfj}!raCd{@ئ!9[̢B@ A6[5Ou;V# %+"\^%0qw@`@ɅqU B>zra:^xqee=٧ 9ٳguzjkký{ݻZŋG͕Fk?N777<@accc4:tHUחV!F#"Z^裏~ݻwO?O}ʺG>M5O&kܹsxeee<?쳽^ȑ#gΜ1~:`ėЉ).be7iAR(׺BJJ _y2X Bv+3Xz)pYTBe)3FE(9o`-'f>f~ \ec]IGQ\qq44e Yd @SkU52R U`& ZhYnH::,_}]\sMq4r-ۛW]u򲪎F#GAUUO=lwD^UUu꺾馛ynoƅK.]w p2d2YZZ;/zыt-ܲi cǎٳg^;3Lŋ;l2oYD_W7Mc-iR78xpҋ_R"2ؽ7tFѾ}92N9r.\gϞGnooQelnСCMӌFn!8N=*"^7ͦiѣu]z$͟+2⼶u%%s{Ix3A@ Pz\P@J.&ǝɇX.>n,95*VNRv.4Ll: RJ٬GQيvaCB?"I)]xAk%Y2fXӴɭ] ]);UF#Qhe;5'f7ڻ)oݤ}儙m$`΂t&v ",a<^qB.i݀mAQ,iε6Cv J“Ih30YDicjQ)S{(kvt7~>4h[X``odRD&V&/Ƅlheș@ήHiRe/Y6([Y#+>_=r)Uw8temP*YHݏwz^Иjg݈niێR->N;%Zt-4c<^aQ ˈL$/b'"30 eg9YWiv&oʭJpr[2d9Ӝ--I2q5&Mci8:kûmf D`0qҋ++ݡ{67Ig[*F'S<ڑ\r/٬+/w)Jm,#Vlwhrۻr+C!u.\?W\cqife@X/=wع<„|XH<)m)Z0+ۃ1P?<@}LE8 &f )uC1 ty "T!ANf˕6>0j1uk55 C*6+ I{s߫ r7HD4F!U\QY(Cw fXe{/sB1Kl+w*SJEki#!u㬮*kECObVf!B]خ(n 6~_иgQJU mQc0+7Z gpТ|M)A^»g<^A 9Yda3.] S*CpjI^Uנė?9Ȏ:%?ʷۼPcU @jJrG @3kTٛ,3%Ĩ^cl0(Kbw쫧&hAe3ǨY')^DݔThdfM;MFH9hFNګx2# )َH)5崑AjsӤ̩`DP| dy/ dd^UQR2t8 a<^q7xo.L}oTlYs&4'ⶥs'RO%,L ŸYe@˧<6yߔ&m (ѱǙ׸;j AvQ%8_X9hɥQ?Om9w4iIPr=u/ep(hPN e 5)OUUMwa]M}"j}pp$̣4řI/RQ.#˚YyklE(NKGǗfm.r lMhej,p_hSKDΘrhWS.nH|\XsJ׸KjJT8v#%— ./ԧ>upxg׶/yQUC!deST_Mt!lEL$ԷgY͝Q8Oݏ` y@4v?Y bUƒ\-&|zqqgpB{9y>x]wN>}->}zss[nٻwmmm٣󒗼ƛ)%6I[٩H,06D{iYK |7QR yy(Nvh- D&@6cfQ`9fB G YN7W[ -JpQbp;:(y^㮪q=F&5.N HU%<E'.]Tc>2lzճ>Oرcfe+[[[;_8q^\ZaTl/5B#o,Dꪒlf#qhGn+^w KJkZnj 8#(l8>yȆ&ģn(o)߼l&$Hiÿ@LJdr5Šb]b\:7NHPTX,2pK74dkiKK,kM,\qfUly0SY& k\/W.V6<X9.`B* &umAR&ctղ(B B65`Q+f6l%J^!XI9oQ <"ʓkK߼S p$v PE( f!P6M|yLf!S]!$cQL@ه 1F}. JDI5MEHɶ<Ţ{g!d6:S2H;,z PE?]2?+jZ5"< T=Q;UU)"M|Zߣ13%bPO;U4;OVe^GvPp}[%/ 7!!bR"R0D yk51+Uv j>Uf6 ni CM~-9#YKx[y9ϒ)R[Yu;Dv-nEq5Fk iCLYEficAqbn.-rfR|i96v"gR &G5nVDR,ZFgHU OURL*±xvzI 2B#Z0w; MX 6:OTK`A Dm9gysO!D"u&T5%H &akM07uU@TY*4^B *Dy!v D P׵~˭c("6WQo%Ab̟U9`! l{My~9h|]NWUU4f^YYY__lv. \cAH&VUUJɴ%EhK$n9H=5 chbn Td\QvQD8 mDIfYzIꁶ|UYHDq7g1jV[GZPE, l1`" 1il@JYyIEV-Gʋm6*6@'D2@2DP'2qC@6IIPR”C@QTű^zc&vˎ;&vk_ڶg3}(`s:N饗^;hhjfꍷO}//MOOyyyyrrzͫ!ıi;.}[:{]~Wڵk?я~~ 76l7xSM0֢:EĀ_<5O̪@Dn,"[DĜ҈6u !X{;H:AL4)%憆@vjw*ϐ 8&)HdB@ 7&fUUm5Ⳑ34ƍUbnnÂQ徲IgwHL@/9p ]2Ϩ-T:Ȗy&f ZU"|G~'~Skbf^| sݱ|vzjI8~vsMBetǞ/zowyꫧN:q>W^yԩS:466|W_?o}K_?l{"^xO}Sϟ|;W^yx{guuB0h%}VUZaA;af$e05w0٫mR]&m Hb$E&%!VNWMV)y4vƜIQpbQaia1%II3dvoo\~߿O?;xW??v7~W_}g~p̙Y8dych MhzgBfUE u\l\Q:eaЃm1ڐCBhBdo/!T(oTb%mDrŋ# /--_|{6NC}`_|wyO~QUw?p f?{7\\\\[[+EmAH @u{j vѤYK s4e BJdk])Ȭ^oBEDF,$+]QXAF&k%3]ʪEGx!PUXE9P}Kg _8{XhYUr=Q`%{W~aA}lbH(1 (HRΠAh "!ZW"!T3o?> I܀3;e_6t;?PC.ad<@1? b O|ܹs'"^z;vۏ=ӟ{Ǫz׏?'?s-..ݿww/>}ݓ'O>أǏ5==]>:555 @>@i 3" ,gITYB1gP EM|Yh %-Y@!+hX\zʄD ,. !ITf@q5"gid[v-uixM{3㴨 ]Cft'gFdiU݉V*LUC! @`IEе@33D.qF;K?y}۟1quCF]{{#<|߿_D>v옭}wygJiϞ=""7.f^__T"I+Y[JPW;:6!㶷{O79}…Θ%w61ռE:i|t:YM[ܬK/!b@{ q5kWދbf .GqNh/I>PPAx6?A!O{6Ɔ[IYF&7Ty~YոEjÝA,B]Q3HH)>x+xŕK&gv|}N~Oz1 i%v&Wl(]X^Z1ZŖ!~_"\]]^]]I XY!SumI&o2KEUɀe) *(bp[MRx 6,`8>m3{54J~j 6f$ERJ!_ǜ! Q48Gj4uOO9O?뛁jJ6f M&@0wx4)h8sض+@aΈfa{,64j5uH/vhil2j%hl.{Ⅻ.`:×[^6KX.UvAD7h1C69lKz*S+.( 7|dF! fJɴD_6 0#ǪXϺ !jip8sc̓U_̠`*~K0cԅ>d&*o4u#,2z:5)##A!`@SgN?Eށ< >m^AsHbΡx~VƘ{F*eT@%^[ha{<>jT֩у!/C%5 "pl۶ҍ›RM<((tk +"+ y;>4)Cؚk^oa\ŷY~=/}[DACs7iVW0g~A zD(["25vm)ԤdN* =j7@En_UUGx@r_Bd= Uw;)l V'ˀvP )نkW7LT Y;V4ggոUj* 5=n+MUUH@x'w=ᇞMڗR}ӳ;w-6"5'J*;>דU"P⯱-^MSzOZl f99B?Z|Z|.{-Faf$ ūY!Z w,(^e/rr=}FCzT̮-,uc*nQ#a K+gjg)&J,J V=O10A*9EE˷q2`Y`Rl k,sHƭQe%DK센 KDC&o_GnwC_?uͿ6Tj3#D\StIP5Z^"̎_Τ\V@NJ(T?ɺMhkZ4v2 {eD@dR-|a,ɺ1̝*"2-z{(|U$F*}22&@HXytCEU U W_46d7 9\udX3@}CCxص}?lCQ N a:i|!UB`T0(匎1" Pbfn>qZc| ' $cUHMw"7 Pnv-xkK'n7Q!^+M0,ۨ-/6˖߇gh-!䎐-eYoMj[93/F}A0"ȘL~v<]0++\Ӊ>p&rB;,r.Ea1CZ"iT㖨(w-!D %@d:"2PR^PHv9q{۹kێNdYCzKޝܵMD$o14\ 7`9 3mEffcĔ^[gFI0lk qYS_|SX5bD;37BB)$Y-JT-9c󹪪06 EHwkmIs^ُ4lNEQHϣqs5Ɩn=)hHޚoi"@tH!gw8=ծ:G iLU:XAn!q+*YΓzL &6qkB@nՉ1jREjvNJL^}vjjgqK1<_=ǏM3N—>qߓPt'&6u5#A-@RRteӽXȶ6tׅ&[$HK:Ev945R8|E-׹Y(+*QCc/Aqdd}KMM5do O-'O(f屺$43= #e1?T 'FV,ʐ#agT`3oll Gd%9p'C3q }'ܻw}uM/..O܃ KKK r޷\ӫ)4]vuU#17>{$lԶ.Ϲr~%'?KDu-[Cy%c_>-[O"ѫr/)egyE^dMSf!"aʟp%XJHMH̳*мDVtc 5b);JDsk$99AJ _b̭%HFdsQ[FD$Su "O]"*۴뽄APhw7C{~ǡ6n6 vIÀϩ yL`֤ƯEno&xvmʬ=cG9HXTbM2 $ = S~fŧ! m3.""rb3WYl,vmd_JvA J#J/"f099tʕXU?o۝Z]~,lj^ ;㱉{׺ʻ۶5*!{=!(4/K2'uumiVBmdeصC IM4J?h~*eE5M][߮ D4*U>V}ط5*؛f`_@b1YcvEMӈxKfޛ0tSnol9Fޤiavq'٩: @4B(B;VxX%'ps7U5<ݐŚѫLY׍j=D5 "@.& aU"~Z߸vo{7 64Y^ ʂ;Tl1Tر{,C(n;e=e4``&]2x M?ܚwiS>J@ kgs)w0Dr}@)qyoLW4]w|[y 3ŶӇHeryds* d-\¥'Ά,H\?Y9jX @A{w1 !H&;l$D5;ƺKQ[Ff\-} *X7Zt$^;@5 JB$!DP!% 5RiCC#b Tb4ٛX+UD;BXys ̵"i*jj ]bRDK<:J*6jDr'Qg&TIHH4MA7KZڦЎ$a* aU Ÿ4B$D0Ψ RV jRUytN$9e\t޶C&$>&R2ayL[v%ttAB1>ڂ:F(TGEyոjDBN,E!OV@_TDQq{K*cNf5E]גElGM I! ADBlhŋ=F1r`0zC䑿!&@A!RAaVd%"mUBMh@$N5m~1C cHkFsPJ4=Qs†2hjkx_hQdڥi %1m[V6F`X< s[cA2y\u`.4/xҝXD$T@2OTn[)|1@,GJrHY$#Hb_y |˖*7q tU$7G7X; k [hK*&aU .KҰ jlcˑ-EJ#2j+-vKAW[U-Q#W/U! 0  DN)fd@SUUbc@dw"D RH*E@blFMyqGrv;HÀԠ%"EH1{dumZ ֻݷ%%z 4( ;:$D$,oDN5Q@Im'" BTג,xEDl{ l"2E-`Q Q"B2QUЀ\)RV.":vo!P-ɠƣR:bPH8@ (*#Sť'ۯ;/7fi~p}WvW//@|Oz |џz* WOOOz~vן{Ç/--u]ebb?s̑#G٣ϟ|gA<611qժaDܹswT/7nطoXG̙3'rř˗/w}O<ƥK~3<կ~_ʅ gWnomWYJ$os'ݷ~b}'W^}}nO?-"oƟNLLvD\馌n/뾠P$! f-%kjBOSb/|0d3䏞ǟFlI\A1 UJAPǶ%A4rH 'Gs X6hH)."Cɉ}B8TY|NQQ[cqc}=5cII$f6Kpob|܅S(Z'pNiACUglrMM=wL5ϿjeeNg||[Ǘbׯ____χ;{ﭭ}C_/}K_CN:{?={NŴZ1PW`@R~dQ/߽~mlPE{ԩSDz7]fܛV^\ɔpi2 J-a?Y;oL-xMR%,Ϩq5Z^V5Nc8.$Tu7̙Zⳳ]P0JP_Z@d2K CjȹޣP ͖q*/:PHJi|7]0=5{#N^}& _.7Z{P{f'$1E=4/_XXؽ{*"VU666/}iaau]?#_yҥ;dUUMM΂©*J#"Vx't=+s~??سgFi#$` 뼛?S<_otfNdvUj!vm;MhA&j457# oQ>'Y248GϸpL%i{[JC[E)Y BB.*]C`ɁҸ}MJNunY81iƪU(TW4u?mϿ{ɟNݯ~G>G7֗zcu{k?s{j}gzG}իsΣG{ǎӧO޽{yuuk_~3voV4vı{=PHI#U@ 4 @Єx{rr7\7?p:z+W&''ggg\@i/޲Fn :h,dwޓV8jNB=1)2) d 050&T$m-YrMQ V'(򦗗̂b`SќmJRR4MZxXftghOոej U@&PQ*Dݜ ,D]Y\mkc.B|8|3cn?~wuJ =k S.ק_|\ݵi__|'''O>v:x`aǎ/_޵kg?Yf޽{wm۶n;< vݽ~f+2v;L9UPP +E 0 vO~z͏Ï}#O>Km6994 & VYNličnnB4!xqz-SÒ֡(h4DL2z7_c>_Tr^F# m Ts:}%f"ߤv㜬ECRS ef{Gb4 Q[F"AX؞3n $&Ԇe}iucte~ιkS{Е3gkk<wǷL~Q;jE8NL~o-ڂREҮ]Ȝ첼cnj*wQ 19YSRA90SWӱah} U@{- 7PD’:duaQK~(mC9OHƿTs8vHy4mK^X9ډ1χ*F iq^Ȯfq35R. r%` jA":ݠ@Qd ۨ9,h}L.T㌾qY)'2ոjLRJ (v BBiuuueGH1 HR7HUU1vlOƆ[ VRc"I]|=&#'7YvEɨPyL]C;`KZ΍u#U)SK< 3, ](U&靨5ړt^-u mױ1>bdjyT-ǧZW!'~jB5_4֍쫷mc;BUsM]X!z\X'upfoPcr(v:=ْd+-$?vR& ;nGh(?1%I<9Yda40D`,b;,(dN'Ք-irSθm;3#xeO u\i 6P%JCT^]8?urϡ>/9nmx+w}pc6fg3/;7l=Ԉ* BKަ4hM_#>h#\ D9 ?9A1b}D;U,0h꺮M_XN֪l˷YHѨZnr;9Q{n;:C- 4"`k /0CK8z7Q#5f0:{so1m["[}LJsľtm󋌪 uG񏖊IeRaeu$aIoEZ1&D + 7Vg/^]{<8gĿw~;y9z  T#0&BhA?xqo;`O~ҵo]ޝv;ΥkW/6i,Pae*ru 1+b`NH D ̉023 DO7W 0 *zr2~:@eAd~nmŦAk*C'BJ6 e m]E|0UU$&?z3bLvɘQ"AbU,>驢jjc@er<5v,JȒ7#_@PnT $jLSdjn=DA4_ I*TT@NT5dw0Ri{:gT֩md MӐtx6pҳW~m4ݛyo7:pO{KcC{]!Zt J}F!qϞ,;o[yqPTL] 8m#QߥC "SULtc$mnr\ۺ)/)M^fE oN[JE%ц4o"Xh4Zj# SJ)6'.}(H(w'E?S5<Ĝfbytn96gvk恰@ &/1NZ4ᰉ\n!~T㖪 xPp ;>;vtU$ݽMHumzeΘ uD k9t⍔OڊRIA(aߏ=FCapW??睷 h(Ht(2!پ*}F M3-VҪ |Ddjn#b"k厖"FDaV%vut:UU0qq5Fp&@ۢ*w7"`;Ť_JƓ6sf4T2Lקd,Dޚ7VT(jp+x-UJָE@,Oi1FPd `me-XE2w:Q%FAeJm127Rb*0DiXciB$hDaPCM?G??}=FA* ҌO<#VRݥTs'HM!!sGgҒ}ƨ)tmo4dڗefSC9}zōΦ֞az߲?i:=?{Tahw Q) ` kTr8Ԓ]+yP~W.$, rC ՌB$aFCP٨-S#QԤJȐ *yX*B(('D@ ((ZuYXbE {M@<]ç!2ƊAz.ƠHˆ!FB(Տm{5,D ǣ 2*&uz5c_AOa| _ M^ة97̤-8رbIVdl&BeRJ}ܔ#S-*nQV& eH)_$ рZxS 7I1z$=9Z  BQGCII,eɨ-T+H[ٲ(PMmg&*֢AHlV Muu FE"*6u?Ս%BxA(ڲE7*`rf, TA \_ި$E!$vh"&Dd)SV"7816MvJH٩qs*VKGjf0e2T"Hb*):"NJcccv=1)Kx4_%r) *%`zڟÇĸDڮG&R1,|)d D17͢daTVQ_nd#!(aXtH $Tfz rj+,*Tw/1(a7DBu= ,AUB@bhABʜX"Rfjlޘ@?@9 t^T =[UɔDɺb4SȽ/u X5Mn"V:I`kH#juK#]k` QZ^c^R'OxQ5*QSs-Q#+ sb U*!;0DD"$IC%bTI)DFKAE,}'eK}~ЩzEbz_`e @+Wv (wmEǙަ0lKCDÔEoةyCT:3YV+٢7m4u:Pj!h( D,:76V^%F&kjFY;:HU7)Xh̸6m(<{Vlry"Z%E@g|$G5nAk&FDBV0RjN A- 9c0T]( ]?@!`TSrӨX̢F0eJJ^!`Ub۬QWCɋ/yE3c7NYtE(UT)qY(EYSJ1b=ƈH*)11/D4 e"KI,nv"oMbIC- :2|q ]+B$ =1ST@$6#ztX @j5D[4m3s{ȣVÄ߇h$xfp4UBTF Jy1qԈBħO&bͺ Q:u:zӓkkk-\QUn&R " ;wLZU(kݬ}LY~Ä@AA ~}mA'UA6D(N3KC <ˉ[JdK|9P5 j @dHAMjd`x۽s?p&iY]]5)TSd햤fȍ扉N3==d?E=11QUzK^m9n( fNoY6񳲄$T V2 Jkf3biXUU͵do? l5b vVFgBJyT@NIoY`곃l_>oRw|p %i\,U}84dZBq°+Bs.[L`TڨƭS#E'UUū @hlb굹³8qt]Sc=?|nB]1>yG?4w~4|"L)-..?~G]ӽ^oiiyc4=z޶m`eeE5UUu}={n'cccu]OhA|~v yLdHXAΫոejTpc1iw@ ,( DTu=?/Ooبd/t@j m:csO>ꫯ^rѣ_W3g={_Yԧ>e=z633o KKKkΜ9SOMMM|'>1 ^|ŵ^y]v=s/>;羍ZD)lrD0H_$Q4|#*!bȸ`Bkw*!f,t1  QdfĈ9|N}+^z(UhRU`$f=- jo `+*]{Ie$ZrPгmkL2Δ`Bf}wiIܰwɾ-'PUaT㖪(d]]JaGn?p`_U"OO @Vй+o~70mٟs;'⤔bzwN:c'|ɓ g?я曽^Ɔ<>4͉':oo۷W^z_>}5斃iwxQvМׁko\ 4UdmT1Z(1S|2] „VQ4c_\1Q$ Զ+W,2zi?|~+kKoo/_Y^zϼ__?C_/<;;{w;w_3g;Bziig}333ˋw4mqo˗n/nk3UӃ+v:DXn҉PE#ZH/ŗΜ,fW)N2F,pydjه !DBf%Olozcn]ӷ==;u[O<1x}wv ?{C?> Ξ={ѣG׭Brʁ>ۛ4͡Cz|㏫=4g? 7n ;fl'N0CizSO=mk׮ر㓟}LY#6-LsfU,|._Ʉ?<梭ڈ3&2wPtǛ"rvҬD=U3b,c73k,u6gŶdD`7I, f}̯9:rEJW-jTV15Mlwza; )Px ׯJ>}dgw걇O{}{v?r}3+/w,,_iur}}~2 r A$"U릪* if`F3c!Ħ)-(G`?l&=gϞÇ&P `=U&I[XUU.б]BGuKl*˺1u x .V y|yE)_w} +`DɷcD AeL zؒژ3!|Wu×W{j~;3PQ[FBIT}ds:|Յת];5=hR;=p]yvl>MFh[m*rQ$17 ZA SeDM6 ?Y}[3' tdi-fޱcǑ#G666 ,&c^A-" ([ D! lG) %;LBZi¶3ƽ [`S Mf2z7ScĜ/-y:J<60y< pF`SS & *y^4TУ ଅjQ1u0 Amٛ<ոej@l˨bEqxuk1 ǎ<ٓ?w>r6NٽmF8{]}mRτvFD[ !+mm=۝bml[[JDʂ HdlD$ꨪC1:1&R9gizI6K.mr|.R!X],B 㕬+¨!"eYK ]eЛRO4*$a=n"-КOCzǧ(<Tfݤ<(<pc[2XVH  r1\B`T㖪B02ZǑ@FHDR3@ZZ kfan֚z"T8vO_~7wzk7vپU)7 !aC rߟ 9AkFm[tx3]4lDRemʖ"c6H &9; 奖Dߧ]l5:)$z\HE 9 +2~3kr$؇kyuڰg&=1zhY߯asTL+[AHwkMQG!.lz{Q1uQ/K2$`R×xoLl~T%3ոej Ml]υar;8V]f&b7n}Ngo,zki}s㳝&v+_Yf>n3,I[9Bĭ7,~yu$D )KWU! p(KNWpJt!s -B <0^HHa vqFR,sMLmqQ&P(TUײެ1z7Wco;܏>Uk(ہ[|Eq0z2J sK-9,|~f~ɌeܫႱ0IF5nATiw 4ƘQA19z¥ŕJ_==<4qp8dyn@Hm)݉a2*/fRUHlJn)ˮR`K:Ѹim]Y8â@7y9jkYrBCKI3/3njJ+b1 @L&]#9ܺS;(M@P7jĥY3 jB@flVJ>Y# HݏWR e][iSF5nMΆD!!84OH]32hPjr_LV!MVc;9|h<*n=M 1oe+Hg-ͪv tmcq! k5$螝(6t1Gpb9ʼnH!],ublQڭ d>05G-( @ht:F*,!C S/өBDDdGS Ǟ9jt2̷CX޹vydaϖIcYctCY8CL |,^+B ,d񭸝׿F5nNj- eBYrk|g,vgo?"]GXH.Z>9{m3W0ӟ*&նD,p,&js<|9~ōmC* $DMJ866Vؿţ_͒D <(0{r_}@n(ni'.ݒa;_)-Rł.w P rydPD 3FLjgʏ]@J FTS}y> u2ͿU- Ȥ[Z&ٮ?>8(gKjR5"<D)B"ب|Nx3{{wر;W*2{MӘ<(*oYH) )E0& 9*&1mHnp;0Fy[cs˪]m ]f%qIU)ۉ&L䅛c%efWy6c+'AuK}3ZZ3H:3Bjwnjk SKNW3*IR<^o8R9:03?`Xg>XqƭS@1hfK BP btsάs?VarG'BDh ;N-+]۫IDK ! +M^z 4S[@6sZ#(Z:-p1LrH Đ73W!l^ʚ?"t돶:Tڝvh[@Ncׯ,]j^_qa+ ?>{+'=uQj3| bCkQ1 y;ζA+̙-Ӛ;U Jt,%ڈcE,^Dr+v*+Sم;ޙ5uP&W 7 N,3ytb{ MIed{ɅgVZ &&ToL6\],N 9LC)J98mjIn=F9q  K~blZFEQQTT+3'RMN ^:౏<ʩ/^~owo|6V_R'}]fl;Ժ rn g P!nĚ?-; k"T AĺN[QzI*Qb aUQ,+kL^U~*'-Dʠ\jˮMJ:<'fz7D,=]pn-I{Mbf+!6A-oۉY*X6NbfnXGk]X(i%]#r@ JXj%jpf4j3vsHB~y습lo)j,VG5nSJv>g1Q!Rp=95v}*OQ;z]g-]}lͫ:55Sc1P!N#Z9FQ,c'IR Q%F9BjIEB P],NmfXj0Q@")\hQېHV0"Mc#D4~Ta<(6" !Փiü@p<5vue~n.H15!pfjQk1|6j.t|4!XXL Y/nB`"ոjDHC[ܤ X07 !Vk1}Ic$r#w?͒C5 }6[4y&Ӻu$rnE$`]άDl[Q+BTD@ՎI11rnYou6 P9JfN7ME(f嘮NeKikN]1Ʀ1pX*b|SH70-tX!D0z7[#eO.jKTT=%ŇX |#^jl2Ņ=D'*Z<6:خ/"IGNv V ]L(!` (H1Tn "@u!*St 0Yi:$OD 9CVG3u:YՍ-+k~bɢEhID!b$RC@hZCdn+djk1Yh)ֳ`"׷lo9{t NlA !VUeA$QUT1RLua5RP7PZE^@]šE,?Yح&!`BDw:f;rd6k XʑYbSeiL.|B@D NTŭ௪j0o",Br+0lU  5{A5oHd`+ERE0̽36y\r蒝}dbwʷ䔧*]f0 &O>g &q iͷެ$`A-!4fŨƭQ1]4kCRcE &f~ぽ, !6PG̖-QHXKUw46E(@%bc@UMm !ulz͢)%37:<6 MIr,GmU .R4eimuu~AEYcP "Mfg +V#W7B'S"#4M#uca qs5kWmx} sklrvIM2M(iƵ &fOJEU$S3ސ7Jw)*edKL](bոj Jʠ*̪1:*!CI"HvT!q@Pq*RGECa 1X8cR0gNI,nTU( v6P@fMINa{dEAj=k_x P@TdGr$쳼(3+EbeM9*k#) `,M"ǀ"&)[HQ $d"@UNUUnk ǤXVyt1#2FM%P"TɌJՀg@-R4>2RI=j! ujR?f,Aml)Pg.eu&W'H!|AÜ'8ؾ~@BQ;F5nQAA5h,(#"[:11GG'O*Km|Z؄y8vJD-mt ,ׂML2Y)RbV;Jm7)_WZ6ںbݮge|3ݔ!޾4Xdo b0Ms$MHE(ÅK_%@J5 ƱjkK۝.%۳6msYĜv@@-7,EbM Q[FPutcdd֠z/9sfeeBdZ [1TV͒|FDI" McB*liB>UK^PZLz[CmV,0ԭf`Σla 6M"t2c7YKbe)hހf!>1l%i g&"B=m.m?slB-k%|+P̒WbQ|jM(vɡXUכ >XL&k-S#!ASr.f nm̸OJbǎ<›o9>>nG˦in^>h 4Gs߹w])2"QPiQs!vzņ;qN4R@M`q @"L͠TۂT1V%6ڄ1Vech"[?ZH1f䡖"0/ѹy" ́٤ `./L2N1qJߎv#i3 0ӱt6D3R2'0> A3In!i4(bcѶijA$%9W,l b/Tcn?JM,υQsC߶\oc)Qn`"2ո%jDV0 ,CI !cq!l)yט(`dp9v,k-;B1B ҩ[ֳ;ڢxI : 3 RR-櫍UGEϠm-Φ2% l1IH U HU1@,cH))H@Ꟁc[j,!"QP.ydUgxVAʭKmO=dT7n}!Z"$`)@wq P"gwPE ӠígլRHH9 !BfUmjJu0'f[`Иd83˩SDh ޖAdiޥvn{,"(fD a؉딅+~JkʄYr2F]2e e'n!ݪ.BR!K -@DMSŷĩhUu~qy\;6-{-G"%- HKJIK%4>gS۰X'+" l͠xa\ PKFxjR5߈eGV*F  ̂SD"AXjjDQ" TOбri'3l2!K) B123v{[(U sw!@栊pşl~%/dTbj;6&"$3T**?"B$]rADSEU`D[j 휓ylh2-#j+@[\^0y7@(m C0xƗs(ڱGs5jAۈmo6gN.$DɢяjJ5nߕXR{ )BzkU5VrmLʼߗNCzm]Rt,qVA]f1ƊʑS9s&*s2@DxrB_,|`fJ#xh"`3C_ ġc_G"sZ ?b ?{F&~({< @"">Mm#hLL6L+í`X2>oCyo5 TA%@"8{ XJa/Y?k(LPRj:(RK|ҦXCRrյ%}BLNE֐1wR)1B0Ue&FxۭaG2ش~Li"2))TPۋ~^)vV(GZ4gj%RmD1/^Dĩ)f^^^K]5Q dB?Y*mp"Z__g@ ` B\Qy/|p)yv tVWKZw'4XY^XZz=we 7_y~3}ӯLlܕ a쾉}bEMJccν;~?G?gff><Ӄ`Ν :tǯ_o޸qcyyYUznOON>O}??}s׮]wsݻ駟VO}S_]].d.c؊m[KYqd"".mĘUPlSB0}r666==mG܇~xuufa||݈L@d~tD{wx} _?]ϵ➣'Zy~慹)qakי EF}"rOqvvVD^}vo|cqqquuɓNb[ZZZZZG>GGJ9u2[_7ߜNX^^'?9;;{x߾wciiI%N9ITű)rx] 3h[9x;&v5QH&ʎ]CڤX EފucPHMz;rM#jx`<^iSRbIjXH)æj6J6IݖS7pH$bP$d Ʃ'8FU&3>A;jfyP5oR.Q@@:&BD!goZ/>~zu7/׾o>x%3{:egRlll=K\nyfX8]8 P@"53=|s?sԧn߿8q犢;[[[ O=>o}[SSSι{ZW_}?Ox|`O~͹;sFBSΙ:u~/lQZHv~'A.7(avV/LoIYusL_irkuYȂdChZaZй;X'o] &A $mLDQ"JdZ(SR94; HE9GC@QOF+(G |'5H@B 9%%v4G䜫w;Gy w~;8٩u+S+eW귾?>ew|[nٷoG?ѧ~z߾}sssSSS~-޽{˲ں.^8;;}l~~zٳg 7v>\?'O* vŋ߿ӃHiA9'QЅuiB`ペ)f/cDy!(-)U;! Q3o"SOdi&V?;ΈaH8yFo(d[lIP}!cD,1QoGHybg5 ݠpZh u#AdWC@YE IK&50X2b$2k@:²p2WW~~ρXm=S{76GF,^9n.nml_A\] Fw@UU]pazz}/",F^o[ޮaz4y߻w~8VUuQf~B";ܜj~_nass6+@!gCd "JGPl?D%4,뺎QS^711Αp8̀~TsփG=jɪQD,l${RbR1}̰CUwڔ옑\ؼvPWɗcf@Q&ɪrRɤ]R#""mu("š7VϽQ/,vxck~k|a܅DXzXU1Z*sp#js= 7VUjey~艙{^o喻u: eن$AƨVYNi-#Ets,,"iuUujr9 QѨ&"I$ZX\ǡu|1"O)'L+b($'衱EhrkFs Nf0ьgI E99f9i4w[Hs⛛ޖD0$*afDf̄蜓dEڨeH֬nUDo4GAyIY/=u Ȏ8Hd.4 (2ju3@)BE6d ɘI\{^Q9jݮnN=*f8F*K,B]gs"yUBeYU;,a 堌f§QTuUK3̍CMI$t d H!r樾"4)ƨ9'"&(1q 54"+-kҧ*r6iPu[.1]5vcJd%Y~bZ eј9O']kYzK7Mj'50m 㥋QGrQ/ݿO}W N?r\,-#]\_z76ڝ?;۽5X8@!T9At!Xt0C"!=U f"Pe'}fѣB! Q<;uq` LPBKHcR9<˜K&cf5J:nl!yj9"L+cJ5KX֞!PXP=D&23b @i=K5YT!+JH&[&EY;q !DHu6"ցa]3/|cu7ܘ3V*h~|Ւ=Zaco|opq拏=.d(#vjɲDJѦz&k5.(ۯ03&]LvXkF;qyOYT׵^ P\F<8+A_Td8{#NF#m%is D˲tEޖ1ݤ6Uzy%gCvgG֜.x@U{*,Ѹv$/&RH-Î5h;M)%8Ow*@QYhؤ]R#GQNB4j8hoow]{b¹^=pyt*zj{s }% gV6 ?5x KkaF#PEr{6'u]{A%Ƙ]Y];AwMbxj]p $|G Qj1H0s*1ߑsEQ$K%(50IDȉ8/PǠY"R6N9N+0b DˁL@itkc7lƋH` IRT*A>@7/Gc#% A$Ըj\%,vJ00S3_}͋k{+Km78y󡲵Ek677mfr_/T QY7EQXEkH_%$6 [Y7rHw2ThLQ RW(@ϑrIuPot!ʲlZ1JL9iVey*a]E8d]eܧI5!p]fe<]`9Nw`<^qd3K3F$ඪD 2Pq!:jAmk6 : hpTArǵ(TB/MES\!1T ^M7*cPB~"CH1F `f7ЌN|7Θv a<^q$i _ҽayf2~FcOI#bЂ 9DBF蔁W2%1-& (s !nr ԸjUz@_TW#%6{tHv{7^;?8ō#?ZS_kx7\r==u5z嗞yՙnyp~O [!(!T A"28_9G(̂<`DVU$1*eatJv %YRc+'p ΔC`W-obK "M#kB$DETW(¬1 f`NG _"QNI Lļ(QDx<^y:\fJ1c6 cJPH: GHږ*d1YǼ8QD}-1^r-c`}IF:9&NuB9N]-̶1ʼnFbLݬJNj%5J4 2( `?A $yXM/\ÿ:~pa9r3ԋ-ם?|w {W\1 g;~k8G?}(p"Iil$wPDdKe4jb4s=4NFHdoDC=ĺuYʺ((4aw$1j ,C Jq6 oMi0ꎍmё̦c1h3͏F1ȑm5ayk[j3Q 0?<$"%Y&.l>l(>&> 0 lLd~݂ 6@c (8qH9KQwo}7ݗ_ٻO磧F85ӽN2}`a|o +ro?WW/#1X"b ,%)O=Uœ#se=ڞOWYU??_dxk-q3[ IL+Ȳ[gn{4OP-)a5ӥq>Faɢ"&mЄ&Yf Yo{;)_}i)+ Xp%2AAlƘޘ%͂G@IYsO|#&5ULA$y[%MX>x ?o\}w޵zaSs?x~ox7ZǮwhQ_n馫6 6˲[UEAD!D}]l 4;#1ptb"p`'&Ws-"̺&:Cq Cƫm@gh ]T42+::P{dB&䆺itle0KS1D Bd2yMG"sQl&c#M,Km)]ѼL 1*9gbR#3$O*L\4H髓wM.n貁砝s$-w?\XqbY\n[tmEQ,ZVoFvu S@0uLh*J';q-V,ՆqVaYWۉ^8/[&I1T6GD)pyꝈm29R}Qbfrh>yFINJWJ c(IC2 1DABj.ilXy)]00+Qq@&(IƔ/ z;yna $:>a 8D\c LRuH!. x18@On4EFeY69xQ>sk*{ kJFhDYaBQ}* jNH1yoYMW/mSҩTs{2e;0rsY7eaIŔ k$ n tٯ (@"yt`ޔF{7'€l԰1@ʷȎ1GUDԅ8)P\$#BP9qW(T^sc=%XC# aIP :B(H>c!!D 1 P1 Sx7V;DġWR4f c>9W(%^D`A !ޗ@RJ.Q{D @EС`" @Q"{2y$r6I 03E(P8mZӼ#f, 9ĺ&aZxE5z5(CKee,z%X>S`|g7 6U Nb'!DC"؜FCi:1h%8^dR.njiFGD(!Fp(;t5BQ :0* {'P TRyDbWK_kRгj23LjC `7Q,KB{p5,X C`&D R+D˜;t}UluH?uwf%Jz!*1mx4Q)9S4wS:n3p:9se}oO ӱ&T*6yZ #L }hI1fSBaY3Xsµ)k!HɤN敓U6 I.٫äfwUluuLGpjx_e9vBKf PzmFl > X@UE F.ێ8*kxB/"R3AH9`H]psEti:ZtDjq%䝺9]MҺPhvN1;LG$l&|!e˧&ڪ:CP-P%d5n)ۍ)osrUx<5z:A ms/DXЂT b-IY1k|0pNg5eB6 h!L`זd5>ӗ,x8d٤S 0` 4; ѥE}[HC遐"9*E|TXF`vx@e P  2BdT"O("C wa($z`tTx{^ۀDk@ f!"W!6?Hẻ#Oq!l" '/PWJ^9c*ղÁQsKZXx5zTjdr5ȚF~B5 ʞ=,Ę%I4z +:7Gh#oԡmزޛޒIFg$ Q>1uGN$Hd޳/ q8bhc5ZJbBpӝvz}=zOm` 9TR;.h4RtJ],̒b1z"]n:3J`FQXbTEDt!D kگgF|NklR,L1U5bMκYS& c4$/$GY$ ڳ1~}2Ȟ֓k }(T)CS.:Z5:P*Gal_! -|$HFbAև50 "xГ(68q7Ԩo$(B"+W뤑 GAu E] 6«rj/. b~rݙSn^z女j+_>~BQ[t`09 &ȎȠk095W'zh4"k%Fy`0HPv"89jphrV(b#fkvECw՞\vS8Z=v9nFE< DR(dATcUŊu AcQp̓;NYNzGg__x馛DdiiOzP]b􋮰y)6#sA9#ZPX,TJ~oMf6;t6Bz&{?L+u={舕 IiN VJN+pZ3(Jt,$p[\XJ+@JB 4qW il_Ff&DWxA9tC(n E#0ͭ-mVW",—_ޅt^'>W^yjzpnGE˹¹BQ:LQFzk\Qvo=gZh4Z[HDeY*xjuʲ=VTm)5,e4?ASgn7سg3<;v OG[4$2L.gj'xT1Ms~Z#-gp2DQ"JcIFǢцH̑8d"GR a=Pmnq°Z^aěk?ۻP~ٳ+*D"L;o{Xv '?s7·?OM9A_uwLkvfj=3v̿WɓGt5ݻ7x…3gΜ^||g?z_c秧}smnn^x*СCW_}BKpOzr:"-]]xgѯ b>cWVV? ۳O>0 W ZhP7wԩS7tӑ#Gonnɟ 3?~{K/w}?3?sĉ{n0LMMmll,,,TUbH˲_ecc_h4{:â(Z;~/}7xSO=uM7}[ߪVk8*Pɠ\#q'QUF_gXJ&+1C]gC6Cj4 !y=*/5"2 W^.( Y,"QшX,O,CAKYA`%Hݧda[O*wRw̜Ϝz"(^|o?nki᫏;>s3[qZaozxm_s{#Nx{zv 3\[Y~ϻ .}#h}gq---z׻n7޸cuםӃAkڷo777~9777;vLMMy9""Ng48qBu@8;;ɓ{ٿ={Ο? 7zPUv&r:&Ì?@]G}Q'%enS/#>!`2P*֕Jzc`}:@Hс k" v -3 ǀS΂XFpdM7ϱthvڼwv_U[a$ GPI_ѺŤu< 7E9L;d9R&j/l$3Fst.d"ysiNE~SB`u9(9V5NlFz(q<^Y>May3A&l@ia6z)؎gH}~L+ +QYM_ۼ41K)'VƦcc,!VwW@5컒QM eg}݃gF[G?xX־No 9WѰGt+DIFG) 2paOjA =;0HFq>xSvѰ>?Kþ\֮bYBt#H8mKR!3&Ez\\):1AMW,PWSj] z&VasYHcEͱg.'ENCk=x_6wՎ6)5UENMrYOk$UI~b!WPV t"3J'DD8%neJĈ5הYl*ɲmv@J/ 3q91bJ#:y3G&9O:V5?6,BoSP:~Qh/ [-# EpӬL1c&=:S+ "bޗe4rV*j^BEtBkhH7/95;KT.Y^ǞڼΑuH]׉e#\"RH9ɑ-oQU]mc Q%K!e&D9`!Y+/5A$ʷg̹X- :R&LءK+M],K44EɁ;kf+eo!hRnQ%4{"(*ҚڤQU:W[sιz^`zVZW}UW@ @cڳb_h Qs:-sN%!dž'¡&!s{Im3=o9Kʚ2N:H-rȹ2A"jZy*_!6(@7x5$N~c)w89 x6K9<#iN98^a%qp~VʴٝJ2IFBÖ숄kpe{bs0lmǯ}ޛ<|t[^ =({\k~ʳU~5DMC$"59WC ;I3 2D`Mu!{X3B$y("yZu+c,&uj3Ln1 r"F΀]e(yډipJlqDVQ7~.qkVSrD"} s3K9C#"̄&k4I,# %/6n*O=L45|1&]-%r B@d)ɘ&5ARz|&5"s4Ȃy#9*@tuCAX6D8 zR;$e#aDf_b鳛紙R,d]ZC*EHt?@t!{;1vg^阹(\cB+`"sΥS?2)H]H8LnL w#n XZ9@9PJ#ˍ15mg"yH6 K(of"19*OF7#*n$ʨQ'3F#څiX5Q؎4i Ŏ$Mڜs CE9G96_.i9lrn.Jd 684-mFjjb=zFjcpRn3jK/q6+DsXWR @D6Ey3 $p@_IQs7UG#ׄʽ!@ïJ|:[Ǎ "1Je+ !-yeU H+D(&/yj&!+QX jJ&LMJOQFM]"סh,KwGDmu1͡k$63}| UO+[`ZI_Z 4_Pڌ S2˔o՗it3$ݔR]IrIҫRq1M*ewGU]ut"t:9\. "%PL#e-@HHi`@&q68qCeMɜ8Dq9:PL&EJ}/Tre6GɭuDJg1("y9QTzkXF_$ͻ,U\\]tLLAtuJj9RP(IR7 `qScr(_ro8McUXB* C;Mɼulk#ҁta EDbOwW =,`sEN@ Qmcd#r.2JdDE1b<Z-$;/9n{BtՐE+]9Mg25E{AkZ_!b]z ^+r1zf.y7X4^yl.9DMHw2pnE$Q"YY:vR$ҊwcG1nQ  KWx kpxJƸj듆30GXW穩)m62\c, _8lH5=.Fu6(\jw~U,N MRj`ǘէ x6m$s\FD$i~iƴ%J"Zs̎ǭcAX293QeZ)KJEɔ'-NH n ,KXs70 6SdkgJXQJ6 !0aKlR㮪s RH^@嚅h<ס;uR|3_OJdj;X?ؓC7t% aonω /}K1J{ウΝ_~7tW_[[[OMu{9"뷶ۿСCι`$"NG7"u:mfjsoK'N{X! U=77wȑN'3?afovvZhPh4Z]] RTj8;?wͷ/SS{߃f] IǿWb "&D=Tg;:j1Eb:3c<5諄 Xy2e/4<9!ߒ?(# AaM o$J"H*"HsvyvY0q"c] '@G Ȁ 1z_ڝѰ~7a0?vʖHUUst=/ozۭuʺaSQ>zϞ}__zGŋ?~|jj +v~(O©Sy䑳g:WnoΊH׻[uDɛ:?E1x≲,666nv=55~0>Ϟt]w|{י~nn>|xcklVV><J(fcEZ-esR SG{Ȍ9'>x2O+'5urhݼ]';J5SHL8Ц̒G0d$9vgUgM$`sAS=> d^~'5,2>sGIvH}Jg~>أ?ء__[[13_`ee~Ҿco!QQT~WUU?|̙nϗ|3eY=ztuu|+=P}Gwç~zjj3Ԕ̬<#[[[SSS5U#/}?AULg}(j=sL7^x~ _^Ї>4==}̙^{}{s=䓏?C=/ٳ/^w(Ȕ+D!{_zʉLpbizkrJ!e^;$jʝ`*'H*($K#1 J_NIPca(߻rɲ8[At:FH661O<Ͷ[փ'[dsԸ[jT.%$^ۤ,$ Dt<33k_w.p™#wB+rח _X_uSi{՜9 h4G?z7|_ϟ?y"ڻwgGy^}{?-?طo߅ KKKΝ{s߽'N|wlmme\meٶpHnY5Lam2Л^;mÆhhyjYmr2S0u@H *f6|)UK~)} XT,n2ZИ'ۡX$M0rn#"2M- #dwMSljYYKvw?C~޵oh4O?>;ymq3_~O?xWw%֠mjŋɓ'}|;eYNOO;lnn֋/ovm /3g|_ gϞWrIx,-;6667777O8q̙o^yht~_A/w`0X[ۨ@DUU}_|7?'Çe9;;s}][[ pqqU==}{`qEQ0a  3e0KL$]Q213s~ttlCa|{C=Èx{;rUW]5???O8?;v=LMMo^uձ|N\ru>%_/cΑ"d܌cQnc=633Tg5\777N+qeeY\7T픽hp\XYd-jS"d^qa:ȘXo)Dao"V'5Yxss7aO~3 s!Ĉ\z~?S++!570ž=7oڣ>zm;w(eeez /0Էq?sWN({F!ٍnKGqkkknWnٳg>aG{^]BSF!`^733v3Oa,áF#"袭~ObWIQQ^O/UVVVG`0==g`*|R׵ؕ B(x+l!7;%\[l8|ȑ_C Nwz._뱣G&MGyb:`*!e>AITBz|!6,,`F :E'rtӼ I,z]yXNj-5"!D l"R{N uPv8L/,w˿xq35=55uu]ͱV=3?30T[B8u𮵹ٛLQ766KE"ȣ u7Y1H0\j^.`0Ph4Rǫ&[RFjRk"!|#.FEjBpv&ֹxOY wl=z9@zM%KD4nU!%רj32(U'F&E^ٖ_rz!岢kF픆 (d(lr.=qr$G&5Ą2!.#ZU}C &_l\ ?QؓO,//s=<|ҍ7t:gϞ>xh/<759qVo#`3(JNmuJZyٕbH`R#sGlUꃈ11P72W?*h2CBA- JȬ!sM:yC*aTl]kSbMX.4y'Dx5ND#|uWiTv|iȼG&HDf]tURGHp8lyť姞~033s} {~ӭ߷w`P3p0?hsdѕTW(՚PzLf,MO>0h564EWR6Uu!^l̢xNm2,8*C5kA-ef_02mÛ62͸FB d<^a>s#Y@#84!0'CoD5ْPv .Y!Hq{38ȣbF8F65zĴ)?(SRC !Tuh{ d Jz^4|s?i?~q[n{O~7pgW_9T˔199Di7.* VS&:<­یyoI=D ')oxC1Fm~y@+t}ωz̡61Sfqڀ;v6j^̡_Ywk?zxY&RRͦhlii{h1~n!K@;O gٹP$%# jGH${{@V+"ma6IFTe)pM?) #2@t~č';|czpM:o`>7߹n+2D OrG/tWiיI lmM.`uBsD췐odZqvuR_-R[[1QtQ])`jNvѿDk=0U"*\ql沞ј&jPl ;PVh_ k !T~L ~M1;gv* Zj_vK1rcN6uό 3LKgR㮪QhiAOX  |T:W6C:q {oVzv[oyꉧnw$=luQ,>ӈ/G܍R-TNCAN Btqf K-vĢtUU:G=v؋|k*f:Oڍ sUUϼ|1J8g?W_}}R\5z_ALNbpc8K*l]rD& 1o0!ma۞RakO!hOɏ)mG2|T$tpD R,ջG$2..!! = S6]S%Q@Bd@:zc"G=ԓgnl.-G:3ŰnMOwAc*iɑ+xAP"Gn&2]{ʲTpȾ( ]So,ʻ_e]2DǼx 6ƚV:x5|Ewa"rD ^8 3;T C"o%ұ5ƴA&|gWqSp* 01b6&o9z"Q[DJC xT[YG4q@MAAPF2[+`}*2ɸṪ`cIF":wx1 Q !z煑f꺮G.ۮ.$ Ǐ ȵZιVkw|(ʶb ƽ!QEJ!OSާ^U ڠ)Q}XD{di y0ts΅PUU% cl91F"=u8M4}sygqkcKɑYm 9:Ij`#YvRq8^yo[#&'_׼UlH1% #[4R"#P4?mMl Iɉ?6?5V{iVdIٚAM'51"GDԯq_?T@}DwThAjJ"2SL33)1V1윫두D Gr$igz n #1EskMr"Cfvi}hzc)OVkôRjBvz;aCrӒ-DcVwá!dcr.F5U!B# /c3"0$ `<^ik :&SI UJY+t [1i:lLA@OB.@FDZ9r1(:dŲC"Nj55]-k!:j 1T@:`X&b Qݯ cuKEu=ue.cT]d/#C"8Cb #'"BV6yz;ҩ FNL"큟1@(!&Cԍ!S$3'GG{a&̰=i:(]8"5(FQ-b2v >'Ԙ38qeLH/)9Xm -f{+{v;aq2/0F݁@j#I@B: B6PA ngc(jƟXh [RQu\aKW N"ꗫҢzXI 4@shOt9ry"y0!HT."[N$:ta(!^=eQ7д$K:&;YT"8#"9!z_y"\Z z'r(#z1:P9^e5 "":'@uaAЏy@ɑ,3 ( H SpG!`F$LRݠpMӦ@ENv5d!#Đ_h8˿dR㮪Q829U@3.@w.ڂ!141)!)VPiJ\S*/:P툃.: Ͳ#%6 ^:Ri0fVSedMӁR-Y5Ji R!OSs1\^ Ta3wʶYxN_q #4uj!Bѳo{. 6L+ѣY5 SL5MՌ HJqX?2jtv]J:v`5b@'u><MUd;IF$rJ(Ɇe"zWx痫j$$i*c,Bh4eu]Xs~8)BHDEXUa($hz(g#;rbLC$BA*AP+Y#b<3wTV",L!˖.1ƢlZ@#ODnfGvHvN- ,1F$T(UXjBBf9̬!r7pq*FH9 8 b; k" 95I&7HinRXM5IF&O$adLS$!ӔI!OYbϫ-ԸjD FVO>|2H nkq_25^r״nз!'?n79&bGOg6)ۉFD=Gӂ|DžHa|)Uv 0z EޑYsnX4{mI,{ 4C*^Hd4UQBvY4f eN= $)R3K7&59_x]H!ٰi.n$ kW_$GEښV1̜lK]JoO9Zt>&zz " QHG8%(HD!Nc\?Q`( .7CDk4B0kyCM{U-@x5zL۴\-:9Z3$i&yX7PE/" R(!Q66g^s8{R.Es& IQJQ$S`P4.M3'V< %@\ZX)4(şy@mv(1>,ƯIDT M 69 #9= cTg뱱ӎ#3L}-XX ke+hfYK 0Q*w9DJ@XX蔢7yFf~0EQ!a+;e 7wwVl LJ(b[*X)/=ut0Nm,vPNj-5"x*:75BNuS"{m̠bF؆dT(ok8CW4tW96PI\+j]p"XHD<.ubԋk Ƿ&*}]y_(H ؜ (> u]Ny jq@V@ ѱy#!lB6dC2yĠWʿ~0ՙX^Szӣc&)5yѫLAFA5TlRi;ʲi(mӓY+`$aMX (m"+1"pY)D65Rfv饦d0YT1Nf2.'Q. oK}PFsm,,o5NoǒpE/.jNh@A!j 333xE5fwCAD.ɊL@lkFgҳ5!POlH)~ U*)\%U(6c yR㮩1A/"\.UDU3cY6./. N7vd6׹]WH [m5%i6Wm"Jposhn;MY^?aayIjT_X(*2j%W= A(L8΁g$RT)dJb1?=؉ߎccZ(-Mj-5xzROMM af!0뿜)X|!/zJ. `f& /_z\ւnkAUHU#c[mQJPzη9pa<^y篼!I؀Ä doSmUMĜ"~0Ҩ$ص)ZL/MN㹵iԸkjӱcjjSףr$ 7\ Y1͌ dTWGp hڰIJ\D4_6g;^.a>Lߺ̻#\"oosK,Y;[[rt+83lo!v==ݍ:yIj$@1ޕkcKF#S/B i#|`JXB?ڋO562lr@ݝrqF[K[jp$kR.Q /"|NcFMg3B -^'LV%_[˶݀Mԅ70.\_v3T /\ 1! aY[V8xeڰ 3Di=!`~2f%%l4/r8:L~?;77yA.ĮĴg@3 ";3cG!z=aC8Ɠ#0<$Ք=ul+3A!Lju5.YX[ߜtWG'@<"&i{#F3Qxt:~YmMv yoh*_9SNo WTh6"uYlG-8rHιHdԨas+j|v"% Ho’>0ºǻ&uׄd{(,8Ics8A[ghSDewUs#KKK.kQ6Elu٫4%H<8K2C.'b`s(L͟m;Ҝeg҃BwHDҘ^)Y5T q Hzz( }._u3S'4Bhr3W͓N /TX㳕Bdvl*- fęϙ?*|e>82LM xTҤ]WtM7lnn?~CU=GŘ1aD#rI.3=FV7皗miʗ;إ/-=o=&90:7A//݇@͛AȗyCK; ڸ./-Fz97yR YYV5| "Q h Zk F*#CmLlŒ}9Y'gAɜ^I8Njm5Μ;}ӳSξvc 8fˢ%M:ݛ ls˝/n7:c/㥈 iR[\xBxyhLWH&!TUuB=X_ur-'$_Eüg8C,$D`h:ҮA,}6o:/8r+MZL Nzg0PgPt#%)ԸjQD:yÍzaOÀtIR䟻^>֌m #\ Gܥ.+vbRnDi4y⎍Pr:͛oرk^}}:r8L+t-w|:Pjޒs"Xyil! ~Gߤ1$^XaRIT@ I%]T#?/;}: S%2-(b"v<%xl{Y7ycBq)5Rh̠4nx;؂Ms4DXjuk+UU}gVXũr<^Qe dG}[ M3d L:&Ehln! Y'- Jj; +LwuO:fȤ]T=, dwӧr۝3nrFނ$fkO We7j ?|uH~R޴ +gfu^ZZy{o<4{ȟ l[*,(|/_4ي9."PFQ?sp`'xzf!H,JG3Hƶ"Ȓ?{$(, j-MAA5j<5f50ggGaHiA2/wIVЂb !^ZqgVl 1rzqXS䶟RR6F Brr'5=w\w;o{湧9KS/=;ӝqI*gwa:ReIR[k4 /#g;73ҺSxYΥąJ0M6fZbXPӔ̂}l&#aUܰ#:D9W>g adAӇJy @"ֿUcGFgA}H,,E$5c1q!FvDQN4ư/V3E6Ojܝ52K]7ÿvލoS=d GEumEp3oz &n4Ѹ#'Qe;0N2[|ۛUpzq7$טkg*]Jh6glH)FKFUW~OF;r4y7WR!IZxOn#8v4)Re/)0de/^$%TJ̈d>c^Ɇ>%Nj 5F)'B(莻ySo~tv*[AJma$tEt^ f+*Uu{GM|Q*\ߖƜślr˽dEq: } @dk1^z_[l P@~<5JYآZXAi.e& [ҍ Te'ҥ|tL&(G2s7ĴU*oWҜD`'4XMj5,B(&(V歷l~?ҩڣGfX'i )g %H2m`L hltMϽymH/? 1z9k:4KO ;LvKLW؎_Ɠas!Dii`0XZZb?~gXʗ>)>- #YvZ(yj۔aLl>D%a+Kj88_u:ɸFba#IO\sR,4>eK­Px|ǭ/Ը{jdqZYė|׮G_Zرc{u΅cYp&I%/e@vCkv4@mn,-0-˴ampp j؊m;p)]~7 B1ff^LD|}z? VC'hBy"g5R&]#,t Oi˄Gr0ElLY䤠=# $cjN ^3Q4&`,7j_X@;k;@&5YXDp G@G"9)Gtas=~'ӳN{~vρ[EQǸ~[~mcu0F#,ۅw%u:SeY"RYDٕdaX"ҁ8Ƹ!(kJ2n(9ݘIRkk7aGb'WU! }aݞjffڭn3{UomueiiiK;,U_3I7QcLF\^YɆ51P.lg s#geD@Y,LlIǧ ۪\[όO,*t6\L/4MfFR]Q0[ɺDHdu0K %JCNuV3=K/tً76Vwf~nzftݩ)D,?U?nz~? !5DW9s9GdZtF[ٞ$ T fA]|1鐙sNn0$6 "j-,,!jݲl aY`mz[fk,̉'o'="A9BDrBJ@YHU4-yWVVX$dV2.934Ԝf"ǽLL ȓ`&ы莌!=UrE(\MmڶC{#u m&59<#REAF!v` 1 k] _8ӧϜ9sՕ^7cYff3sSSSS3]*[6b ~8{pX֖@zhUUUUUIF]oSCK=8KQV]NY.-S`L:sUQm*!ee{zz,˲,[eEQst:(N _pqe5pq}meei۪st޿;v͵^{߻Wz[[U!TFDO53@!$:h~Vyqey9~Q҆-0{A:&gڮ=),St˰~h,&4z5$8 dϣatԸKjd\#g!+(9!#G,,c]923P*fc3@K+Wֶ6.DhML"s{_vtڳseQz$@!u]0 !A553PWUUյ1Fƚz AQPfE:W8P(V˲Uj+ޑ+VIDEQB`(J7hz[1ڨ?pΕvZSSSVADlOOOOMuYܿ:p@݉ cL>+8日KԸ jL>jkȅA0CP8:\u#cu p8 G\WUz`0zVo8FhT`02QNkZV۵ޗE/ʢt;H*o-"Ĩg p 5:g9C]jDx"T{bqQ R H˒|QkʼnQ0 : p8FcȱN{o(:V.|,vn:nt:"y4 rH#<WewjxNe7Y0n#M+/.L/Q'jNCXn)%a1bOXˀy:)BiF!PJ*4pc_@1DE=Usլ蜋?ez-seejZM_esH1HF=sYpRVw!2 F6;K "#pQ9@H񻊄 Hxy5fPmmR}8 ਓ K*eEfKYh d(8X@HFF)]BRRTvPqB,n! 4ȓ'jY}Q,5\e^<eɾ,ٗg"KfLL\=;tŚ̞ň:D qb婑2+C+_Y)2GD˜s&$fM$B"k:ZVCSVoꍆs9Qnr :ђAɠ&f9}wI缰%xqffh|y)4]=cN`#H`{b?d Y{Pr~V B́ujʎ"IbK"VJj \-XXG,) /2I{z_E왹,g+^zަo duzV x.ٛ!G<`'CPgh!S'j`ZMf` 2,@9Bt.StCȑF,je@](# 9Bt@NhBr!&̎eR$@i 6 eԈ33,uWC@Ue|9uP2Hg,y%a1yƉ+*pLR+takF5*'=|dӛok :3#sY<{.A2^x̪璙Y%:#FL͆ x&& U7 kFoiP;`\nNyL` D-FcbM4e k\S5Rdi@B& zn@8j8@wf" f@l: DGnF2 `ȶ"m{O݅YrV +U4 5ul8/FַנZ۟-*6~!m#͕KW gR6DP!S^c!M7QakFQa£(Wc, 9Pu/\bUu5O͗M;j A 5*Xiy`ԷX&T1Q;6Њ.bX7X% !ԩٔ>_lCˇHDЅoPR#^!Ո3ӬCZXiBuC D~uIbL0T۰Gf#a!g-,,S+@3Y%dz9"jhs: Ո33cXuINjE{vmh䈎3 M!°0 Z磖º_`YT 2 i+V. LtX㚭Qü%VIf{mf:Ffo>eی-myIL@/ F`_saE`t;#x I\X%$W&8b'jh>9RHvSas$ {iLEQPFxqzzVՐOA&Ɂ/-BӀ2Ƃs Jb2 'qX\D?L:ר) 0yG5k8-H'ϤnO) nZTZ?!r흤WWǚCq1x͐k8qX߅,#<˗p2'(Fc8:X[kRcRy@PCDe‘$N-aN9b [98\b 8qXƿ 5̌'W-ڂU6j$wڛhWi+n*@{՛(+RXS(j8OTLˡ"Kڃ#wF="E"xʸj (}cd !¡ۋ/Y#H#6B>ǘؿ,&ַiL1dD SՈӪ#MX>tl9a]KIT5q ^"(Ȋ[!ʆ0;qƈ:TG[KD-E.Ƽ5ԕY$FVKIj-;Qe5BWxq6ёE?0Tm^CD>*e9BT7OטU@MYTbi.Z6H0NCU)y ,枬d 5*NJwý\55JnՈ{RWh$jtk`!q.QQՔ/s%,Y7W4Gt@H "Sp )_kt)3+( -[Cx@# CVcJ)y9pfz"M2&'`A Ͱ՜DV- e "لFfg ȪKCކ51Awޞ,yQeYzGQտ3nH8F 0WEtf'Q%lğ4{]Ё+XLfjxUʄ*.jPGdrwtV/LO-,tV:nӔ P%"Z末jZVo4ȹz>n#QZ_9ZefC}mu!ՊVe\9u{BΕEY ;f@{EQeQz˼(ngzn)g|Qݢ,, {`M=E lfnɩɉɩSSFlV CGs4y~b1޴J333M v-9 kPlTCb7Iߗ+(; 1 cBW@P:9* b jak8ӳ=~ٓN̬t:_Q^o4Ffcdt]k6vkݺS&4'H'""P( MSt}@eeY"RYse4j-Ͼjehgf2j e~huzdY:+--/--,tnqqytV󥕕^^fnbbltlj-7mܸc7mΑ6 տqzfBz]09A&!IbYBbKb"h$XpEhdɜ-0zSAd atAwF|G=zx "-͢]a֭[711uv9yQy/,.,,..,w:~tv;^Ȼ~t:,=8i /ޗDC )G&z_RB9daBzV DtliE^wTkZzFl4ۣcefC՛8??KNgqingafziqqaazŢ(9"۷_wf]۶o~WVjT͑mَj .l%bBa8_<-"[2[ "XUDTtP mm1DCKvtb5S]  X5?{ك>ﱓ'tub+6ursNgyss-/.--,/wV:KKE~Y<С#rYeYF(Y#˲aViFP2$aHQXB "Bt~b@=~Q!R< yY؋g9sϥdgE)I{#xIԛFިV՞lZV5>:Fjcv}~~~qy!W;3NLO_,5ks]w޹s;#Ec85JsDÐoF%#R^ 0*d2T)g^yQ ]dk}~9̀METq] :)VDakFloF]Bȋٙ'z\={_t6oذf?~sϟ>sfii,//e{P_jYj۵Zh5jz^7zejQof3e}D,6xEusDF`Ѯ{f(^$f#YXP# gpqk(97nKR|^EY /KWc2lZhht{jԦ[[cdssss3Ǐ>~'.;W?x/%$ 5?FgZF . li"l* RL&t,߀H1>D퓬81EzpnkK H2aP>; k_Fǎfgf_׽/>~'N...-//-=fv՛F٨ZHj#zee!9A$% 13s)L}})RjR) $NT}Uqލr=" x 0I36{Nd^T:B"R D=StFTJiv^j ZhSY"(ˢ_E/E8 [c#cc6mٲqؘ/ȑ|ⱣGm|g[mVxTt` U{5 6fԵ T#<EO x@rhQa^B@B#*Dz-FLtF‚D?sM7_.WgFG'FFƛVjj.uY ї%"2 h{O@dDCM@H+A-ªNfskx,^@ͿG/fo( ptlDfJ @GA^!)ZEŃQJpZ(3{F(!$9/ƬDWI2Cؼ%  \6 Smgb!9b=s3 }`1H+ ,# k\5Z̃|?W>O.-صkݶmM^dfa,}t,"6!8azejLFO BjH$ uED5j3:  -gQ#Ԗ=C0?bl*"ޖfѨ?) d{Q\)Y[P_uf/r"9d;+K 3]wjӦO>3==C?p<g<La(,ubI@F%zbTTdP1[e:!d/Jn),cބ pQNxfb mKk\5 fzƉ~ov {]ͩ\x@]FFD^8 m,j:m: !Dt qd $Jx0(TE, ,@LZ³{@I ڶd3GE.X3RGQ.Z- @ pc gbyeg?~t۶-94p<ըKwc h$m‹z˻ bn{,> sALD[b[D+oa ګ\$$޼5yXZыH^ݻO瞟<7-y&E#xR|0&Dj0A5eDNqVRݿnU X܆~pw}db)ٳICڤlk)Ŧc RJsd"D bK(eMU"!B g!KÐm 0&9rXH̼0ssW]~O?ġC7j" oƙi`Nd,aeȧؐ$2lbh[Py$Xr Ԓ "8Ikʊ(.  k$1WakF_ykw|-vOؕW^5=s'SEl|J)~A2BfH ##@Iަrpk(;Wϖ:Y<l!FL$ڽ䚠$ V E ̐ "T;ſi9E0ʤ LEK JD{f`̾3x.O=&\?}z96:65c, UX"ƈp*nrIr4=,JvQ=a#PS#jUՇx Z$akF65護ڿWw-|qiζ)Q)sѐB0uZ%ʉ0y P[N&zLDs1=0`n`Yxm,ކ+;*^ EuƢ/,l0<yA̞HųjN!0("^JA`a@yBysL#^UJ<3x)(Y@ =[" ;v7]%ǎ<ĉF/ů4]c8/FlHpIImt-FȂI{F@W5!4ĸF׏`Wi6_v+I2q ֨O|^G>GsnL!JB"!d8&?UF60F ]²a[`pY}C?>|G:s( $DN``${gXE|uH<!^̆Plk]JppaЃ:rP-kԳFQW]ȗ%R@1-:"s˲D1v9W%wEcq,ܯa9Jc)ZD2aJ U7{.K޴y-[Q\\?zB3s@"tUnE@<>5%Pɟ|Grԉ~O޻Ap<^~YΈN!II6PXZ ež)&Z!N*n/ #ip"3U T)Udžd`@4Q<ָj$gxgxۿ ɿ{o~={6ϻufHXcKD@j]X|!  Ecf;}A ,9}>vvKYD^]EGDʲEȊ 9H6yXYZ-u*9uYYF"ŕs>Ćz]9j!Ԑ@;[L@|}8%c{`[{eƭWm3AmrjgeyI^95FV)6ib ble!2A΢]Kf5fqf5:o~o{;*/[kԛflML3[ܾsG͛E99MN6[ZV_~CQ6m*byرY6m2>>Vu;w2w7Ϝ9y񱱼\md & K\ &qsYRBF;'MveިȋjaV25h]ݜ} n5xzKx3AD`DCIB6^lbh,-NJ2WdX~S5D((\ÚD!Zb\ EjDE;qmHēyM^g~d>02XII؇ Yfd0PO`2fT + 7sal5ؾ㏿u릶m~ɚvj5n7stgsegVLkfh4uP,FΗk@Xy/T.3s5I=#6Q ={"(znt=ݢ5rXEݚ̲,buѥH;q([;vtwsͷGF+<Yc]R-F%(r0oX!W޴O"$x x=!>$IotPld _g>?/~6p~ZA"vWM}N'LfM=mWB֫9vuD9pBep’ 8G$ss@Dne Yy{?"J_dYl,DYQgfDDfffMNz:,bY$su'˄u'~L.2K Ě@4"JY`T7&Yҋx$d(#&A$ l2r+jMb۶7H82jܜ*;?DRH+PT#ᾢ!0 ,)*"Y,ÉJW.a#Q3jz` b k\C5:LmvoWuםK K"HC!z RP|r]D,U ˇ"<:A&/ѝ=039reuc[Y^)c kvu; 0+K,.$D>SH(%5pJ;d_E D(YOs aɀtJߙ]XvӖe˲hsg}TXE@zOĞ`ll|uS|ӧeU:~9\",'T^M?~g=|6-D˫1 ȑb^(2śICofш@>XUVoNF# 09sD]Nbc)II X@;`Oy ם9w^v8 Ad t)U]X-QKI4R5\(ī/p$8 x+ănKVPdtd(&+:DP5B3@5qJ#/•/,KF= N@QkUVfQVK_<`xYֺ,_)fD%֕ū|IQs'O[uj4ǎ^ eH! #2t@R,iLuGN IBm ٗŤ"h(F"${5C F:\ѣ=^q/b)U& "eH̍+0Wv}+v#Hm4&]lDP/&O+$De)^#eM*QVAU7z Qa9ƶY%ebbyh>LbK362(mjznՈZ/p$3CS4b8nL[Vu1xkԈAwag{!2 2:! 3`cm2цYҦ(?LM<36?q՘EC=419an$fUzS-qWR^z Lpz)lf1N,JTOXb.qxڣSCDV8 x*J#=hhwP oIR1EY]2Bk8!0m~ IBOIo'[0!2*!6&3\~>22rn~A13P&}jKFk`@*-,ama:+c!z@d9L⒁UL FCV\ Wܨua@EjWBC,2Hm['/.$^̆*ͻ|e0`@\pN^Yc" N(\$N)Dkn{p<^v$ȱُ B4b>bG*Z:GX^ЇV]) a ]g6 Gt`g b D5VcYF}a< M)($DmJp6Hj"^I2Rt I`a&1Tr' P*rɄrzBF=. K!#Q#JQ$*]EB^eV&dp`$R! HRʀFHo5Ko4s~YA/т"=" oxB7A֍#\mM Odċ|)Eny8/,|5& * ~/b;Uh`^D@} iւQFNZ%}5b,ZDlkʲlָfjT^y!h Fˢ`F" ]0IFhgy1&PHtL$81e'T얖=-$&tAh%M&3ՏZي4NH@ b +YghMV?\GB&"B swp<^F8?Dq(4;8PDx>% 5 6!_@π*1$'!'F% |#1r]9=gɰƵWzς(yA+UNQ3f ,*S0[BXW*EO$bhqj"BD߆WR"ָvjԫXT6Bfb :jf 9rV^t1XPp 3"3Ł^ty "$:!GrOڏ%RFI;,BJ(a%Qɢ\Û2_\XWXrJbl3(Db^ 5%#y4)Pd,YH;POLV֞" #GNp<^^}i-5O鷑opf26A Re6ѣ(Ĭl9H`k`dV YJa  (8qX8LP8Ԝ`t9QEjIQEU"1 z $xc3 *F`]g@R%֭18A2ڹ SUD,Bųbb$_[[ 57 CY33ė !!v쪺IX]JU ٍvAOlrQFq쥢 Ri!T w@VA<}XK{$'0>I8Qeҫ ē 3 QeH˒tF˨t&drfaRlY Dz4/#*>虁lJ1|1M8# 9QE!}uXZQ/ϞϳSe8 D432SX!ꧪ-ϰT u.&' (^,JNef4Sc"2BfWgޖ WiXԙ+^M=E)*pUo,QAn"驙UY0U?~XګQڊ9N,]  v# :+CP3vamQ;NG$ c-&Y )2d"!kcvX8{Ef[9X8%D@): d"2W#@ *%x͠ח8"%#8!23$23xNb"BYf\Q{8_xx \-@eoF+gF:ʟiSEnCӆ͆l+[`$'8K8Hew>k\5ZHADik}YS%D\:JE2M7qpV$XD_BDvafec퇈0$>RJ]UbTσM@g(5n-dLE;`*A"`vv: \@&=W0i©` f-U,œm˨1SnE-yu#Q@Q'>ƶ\#ASLhk+n$}_HDoRQ!X@jmAָvjdf*A{M:2կ}v˪8WFטyA`RK. v(5ɗ^J\K6< )rI=:$u9X^ceyK`!-)(D3B`.f"eq b&v{hD\[OƴV~V*BU2ek\[5RȲRYWh~+Jv;ePe\#UDaƽbVbve6 (;B6^fYc)+&CH L$ED 3֞*)BP Zk\s5}2fȐ32#0>>sM`u֑+@ %i %XG,9VAYzYaO{(Fև.rm8A":4R5T#34E]8ZEQt ~ll~}O~{wuWY7lذo߾-[={^򒗴o|eY^^{#<~zf?~'''{4Nsv:>&,<߷oۯ=ztddȑ#eYzl޼yeeVeY633/|aiiIm۶͛7///OLLٳgddz[l9sW_}7>qdddttfUzՃ>qgG<3 3'x3ʵG$ M T[ ee_c$]Z,s!Z,Y L TE &Hܸ\LZ%qadXڪїtmiҋʇ>k~/]~~;뮻^722я~T[{>tл~x׮]^{>WUιOs+D`ӦMe+++"2::3$3;w\}۟o6wgffDd]w݋^G-ѣ__^{gϞp_|G۷ok^Sř3g7Ok›|7??h4 6|s+~o_-[~ \|!D$BK%˫ u־!pT"s8°19#%Y+2\lO cbw?h١fQV,+Qh °5Wc^\MXAI4Ldߞe?q ̌He{-JՊ]nB+<ɓ'?"r᧞zjox:twdYh4.vONNN.//ܵk$szzﯹ暣G~n{WGѣ>`9t^ՊЧ XeqyyytttdddkBl6yS(4'N(riiկ~^ƍ9箼Zvc-d(.]YFs)*4˪1 ,QTL""dĤQlÌm?F,4+ v"m**Cl="9Z_~ X㚪0L*\d`Nyg<___e[_= {;v~3y~u{O=.?C?cǎg}Ç|Afd6OgCyv}wك>|;7nܲesܹs"2??/|a_'?={?~ݻ{V~~o}[wuɓ'z̼wZsΝ;w=ӳy?s.D2&@xqzz&,j`3.]QE&0xa6 +_n1Ao5ټd8!, A "?#VQ< Kk\[5>wOmWk[^Je|ӱ+x=vmgΜyW򕫮ԩSyZ~h,+R̜eٶmΝ;d?OGĭ[NLLEt?~I 5\S՞yf?t;wܴi";wĉGGG7nXev[s `nQY̬\} 6LOOŻw_Y܍^;7;-[Ϟ>j~~2j̬#  THbTlpdV8 \ 8Bc6=I}"Tb/6ZP'XYĠDeDSt@1qXgo*j._KA&9rDuyyYq =BYǎ[#S"r̙ӧOL8tPt]x&>.iǏO't-!AА6!V7B =%'S޻4m>/ bb 5E]^=Cu!c'B$V qa<1F0h6U2͌ o1F?akF!,< =zpD%[J&R 77od+_{=uRs\Ҿm.BED !dK$A_sY.tSu;eԘJH7#-3[WݧƔ JTϚ y KXCt* 5 ClAl˖nC k\K5pe5r(ڴ2H(\zƍ+ZW ft&qPLɍ-%dY`ǯs/oZnTq/MpS`_AeS~ޖ EHewΑ#p<^fe>~-LVbsZ bz^!;PQi I"6T0Ȣ*M *x>b}ht%5{_pꏈN 2f+~/`Ɖï<ɯ65 RrͻEQԜ.K)ex5f"u; R{~U"}5)1I8 E3@i0DG}h~ }]PVPDx$W۱~QIUdZ5jy@һGG;b8ރhAq0,2j .\cV_V>b/c30}7+HvO\QJ9GtΙOqq8/ 4@k8@`^q} "Qg욛k RX4xux9X}E p 22-dk\s5 #v$,Y{+|YF 3>v윋d)t~0V7^dHWxЊVfZQ|cf9=N@~Wlg&'aH(r͘` t,)x|5']8n@"FD$2H5Fhː BO6FHPah 1!BB 5 i`Vxy@%#.TzbxuPQHm5DD+Ս+Y Lg):."ч+}b| D !Y ^-nS{Of["kOS64 X"g P_X@<eטyK]5ӆ<uNNXXrl%"hy`3d&.Fn\7$Ȗ<mb7m1 o~akF_(gށgvtR3Ptz D {甙'Q|}z) 9N":swkeR"'[*;@uo= _YjJ`>j 423fh8/F6D'Qd@`!ceVi2 ,iB| C j2sԏ 5 `\s4,7ˠ &ָjD t,QE|)Mt:[ ious0i7B=q#qVDa.:J'*R`} =}́w3);{+?xџ6㽊~; S9@&e Rx|5fs2'(.YZqڧpz (9!GE z2ZCN^[!ѐ2(RհƵR#3 #6My)J %z" ,uZ H +VkdN굦e@I{{#Q3n "/ˢW@%Kg2B&!MgOMz\!BSсi"JU']$'UxNsYjdKeY'=dI3 hdbXDmט#,B@x5 0 U M{HT+"K䍴JM@+fo) J8Ա]Ɛ*yEakF@DHAh3ϲ!^O/ա6FG<@)WEV  #֘ϋFFFZo.A\"TxbpE7Q)q V}\lDD/s|z0A5K` ߯>g5 OԚ~W2;bEa`l8/,Vڈѩ$.,:=~ʔģB5n^0?`~ 4Vؑ^j8xPy@MDakF)Kھn,F#>R׿g>r_xWPt߇=z…C򼃍և~tKZ_kǶ~c^نBZ~DQqml_:##8} 49ӟ_uH ]uKK|@q%_˲Tx([xߖAy8/ 4,` sƬQDV ]a( #Ku Kَ\9`Rv DNBD٢"Z>FQkaw7tDj?rϾf{ו;>CW~a^/3{sloBqW&|E[|paF50{pox:+s _ow޵]"΀xPjsH+DQȮRe"%z'_a=iBlָj$t=DtLD<\wsvmcwnj=pkڣF!췍eMlr|o~nܼaWmܼ󇋢h4 Xs.˲x19zVTNscccf3˲z:fY ׭KMHy ?` r<,wNiu+ΞrJ3 װxI:)'rm<'4:6TQݚe^R_]LO.f>H !~Yv:}"FDy8/FdT>a5#S*aJ~@GeJbm TaMɹݓ Pj@b$_|IJ RQU3 ָ͖j,R؛7:^ O}:z斖z.l앯yl.Y2 M}G?de7ѤcV䣏<3V (EjE9say^=C_Wno .zeٱcl۶o&}}cַ566H41NO-֙=ȮV]E,^y/v}k]`Jz Үi3%ds ˲МPp<^^Dk *hj% +K vcpT(hKc>L(BG?vK a8D0Q=Ab{|R 0ƵUc^PJ!Z%K5YTQ=cϝpTVttO̽g_WVVfJ _cccSSSwf911ַvO9*:?F;$I5)>Fn GUQt}@{)\n~7!|@+H5ЮgF ѩop<^^d~Adt((ld UpC#q`RHQw g eZs .GA-Kxf@֦:Z ,,5K_ׄk2GEҋwrӦM"d]vMMMEQ=F}^S^ݚҡCS⾸2Kvhk.=ݭǻM G.)@C&ݰ׸6(³*+LȞ/ 8W# +O!h+XJJPA_R􈙁A,ð&M>gaV+2B`y) } (pXڪQeEvH5J!Z./--tY(+q,f/C7_?yM5G--wm=v't _mUW_=07xHUaݺuFl[DC ~C_j5T؁g:5pOQx)0)"i; `_S|΄Ci~HE3Hfne ,}`RN|0, AȌ /Q!{Ank6:xk9QL0k3 ָ͋jt \00Gq^ӂ@1gy07}(?u/CX7eԱwkoso~g_7>Ҫ863<7{xvWonҗ7F^ꪫ?~… F{<<_XX`nmݺuNGJ\mvɽ<ύIЁ_Vh!3`? _cYN!SY ՘kT!};V_8@j/1O1F|Jx H ci^H4نTSE<쳉|~1| akFauD(юV@VDtKBܗnWs_tmoڽ7|ooΗLmyƳe汑'O?pKD<{H^Jz 9z{jW_{vc رc>[Vxӛ/}ȑ#W]u޽{+ ke6 mW-anx/>Rˉv(di).G0H^lyti{WH߿pu]w7F177gϞݻwԹ~ne.6'LJO'HL0`09n_McsRhx)T`\0H)l[^[G G(rX^J<!:MksQx!?|FcuJ RPƵV# 30 i)bmuT ?qjȒw;Z巼G7:)rqщGNyK͑noS;ujvy&Fvo=Y\Ȳ }( E<^z=NGDfggnVv<".--u^EQw:ģ(t#P1`;јԭ%5犓~< _2dug5׿1ޟ SV.y_~oHa{sd`b7_!\ &RFRR5c/4*Oxdw*Wa$!!pc5Y'r|KL"ELѲC=%Ey,>ٲ#3'ϟ:q;raf¹={Lg%7F#{-epyE Zn)zՕ@[i&N)A{{Q:gE;*nSt=bʈVj7{tڊbڋC!s%Dj ը^,{5F=l&bֶ1!,͸ !nMqi"H4Ս@/-P(X"݊akF2#23?@"D D /vGjnvEW?a^7?/?_={rBb O?{sG -aWL5O5|wEC.m#\PG"`ReV,etttiijѕnO'fyIm۔b#8559e,˥ft>k.]9NЩ{SpJ\m3uKHlg$:{mqg\Yp<^V%D`2npq%J|rcRӐ+2[Z㞌/vM&ji8$VG Ea akFԵ[^(]n/JJܹ S[pM]eqx{2?yóJvΜ~py~WϞp jY^j-oٸqnWz=GݴiΝ;gggEj@in{Df922SOOXQ~_f_ oxCϏ9r-?3?K:5ZVI/2aRj$JF6}*"jgE$p<^^h_UWnQXUG UGJX>??w""6m۽ǙZԩS<.QrۡqZiDW1W1'5bĚs¥x3 &ApQ$񐡶dgakҢ0lbzoeV#ZGmWh)OA]ū8@/ F&"?qMy$Q@3,2ϜK+e/߰vnٙ-z˕7aO|~?NVNY*z;֯r<7ם>uJdjd-AQO_++8|3gn׼5G̍7^۷V o{{(n׼5'hrrrjjl6̓W\#UO}S"Wnҩ)󉉉׼5կ~x8zȏ=zǏ>|z[9G!=33\0p}{/z{e7n|ʲ|{s=߿ɓvu{;|;=//xCݻ]zWz/~[nW###>7ZO嗼%~?я2NR{׮]gϞ]ZZ:}͛oKxZr,(䎗*oxnO}S'vܩNnwcccN<}nn7m 7:Mq7chFƯfU^IǠ=}5͕EDp#xI̅RҐ@"[]-!FnUSJ)FAK_`8/ k 5Ƙ;]ffC*eC!xaL\bvhv!b* -&E%+(dZDT5 NleDl]IM4xjp1=7~jc?tS?9coFϋV9rgOHxbYcƦ~ʆϜ;oH`!;RU\^?4Ͳ,gv߾}ۿ]͛GGGl+b۶mfe/{ٟ韞={|oo2k_ګzޞ={T*"z׻3g^W/=xoo|k,O?Vuܹ7zرc[n^W|_ܹs'-oWΝ[Trt<`>`#3 Uwc`?z~!9GP> hd8_xB4 G+S & +Q:1mT!jPFX`*kw;[ 72E(ocg EE1D"k\S52^s( XzqQP˰{?N_~ye?/ؖ x[<^1sXtӳ9ؐ~KVzˮnT/LH Uꎵ,K*o\~+_ʩ)f޳g"'NַUDn .dY׽nƍYݻw~~nXXX&''y֭?#?Ou]۶m[YYy{s ;+e˖׾gϞ뮻ٳm6E?ݻ'&&k͋;b)#1UTF"͉Ke0+껠zND!p7!VĎ+$EiVvOD͑6+@$!m8_XYp ~6!Z$_{ޮ3k"/%>a 2Lk:; h|F7Ka O}u7akF`lF`˄([>h/g5Υl@Aeť^1N==7ٺFsH>yz)sV䞥Y=_غd: }t׊Pj{N2,+R1轥WXYY_U9Q'<ϵ&_bXY軧G$oPN#Rz4: D3EEY=3 R(Vc`DhS2TM`mat?}T4̎buH#]i#=7sWb\D@!ATJE;D+Ҋ^Tk\;5/ü\DvfHL{O\쏁sQ4YR?tM#bẁJ\oR0=}Xjv1 jJGw)[N(ˈJU 1b @ݡZVMĢ* Vmm `PQ}Bc!t2썹1g4E'5#luʰ5T# :PFٳ/bs E¾(,_XE7_37'htz/Obێ-[|dlqi2X^^#RVkR@7_펗ĉ@p~`"I%9); wT;'RӕܒN)xN<5>]me"7FEW%G"|qHUp<3kpjLV#BjSJ@bױ%BStzdU1,dC mtk\C5hޫ8B$x=f=tbu7xM/~?[\$/eFVmb~dvH EdY 7mye\'ҹ8 2: EX&1?]bg|d<4y<1,v#L^|?lׁh"T&"R(gx|5fv8B F MaH 5 U%XKxm2Gg]gYddVиO_+ ,ɠD;$ƵS#2,HNaf ݹ5{2DʄBnGD21"D,B(9WX\/3z۰T!Žā-jꄕs_uBWH[lxScIxH: x1Յd"v "45 nt( 1 % $GʰDR44AD^&"W1"TE.TMk$!Z -BDW7akFRadAXd'6RK!" FBuW`cRցU 9ݜ3 }%jgdNKOqdO:ۮSj<݉yqC=@+L:9GZ}wӥD:eE(N̑6lp'H h2+EJeT|EBZvdJc f[tMc$z0S5T9DA<#Ţ,L {LH4_"a{6"Itўt]I爌q:r-UDE)tc2T ZAJ`BʓTEHb]88䄦Po%НELg+Ra`D$C"C%f C/,KE:TA3Ǩe@SfN#WsZ' iO2Yi+ןNpz)K`jQtM Oaʚo*LDj^cD˷8L|فghuj] ƍgY\ paa^2jԛk`0_DtLvnFrgL `bȞ6{-$^,]@#BQ ySׄZ2k\c5 0sYx\h4nx]MhHRڬ)KXv"C8)ee`Ex}ՇKY04^Y-VP^5 _uhh5>qt8/LVd#\kހM%hYh%;$Uw! 09 U[4.J/WB;äꪧ$55ָj$G.sΑL$vB"cYEyY-ؤ 0#B)S\Oar$X ȋ`pɗR.c|)1 y,E._ &ƌ{}"?,y8_`(m>cXGHST|aPV`)Uތ"X:A q<CB",3%!8CaАָvj,˒=xod(@1&uN55%٩SU,ę:RJRfH:Sjqj#LDxaQ_%O= V{Dhc : 8~wffe{p<^fAt*2vE#_Rb[H^ @mfq0/02TukՓv*(z=} Y!tf 5)s̅L19a;2j8F-v_D>SWm0ZȦK@s`KJ։--EӉx` B/ zM3Sw70Uҍިz4M%"ӵƓXJ$!re,j$ Pʡd  :RF.a">9R,0-Y6 \َ3 ATh1z+fakFs:YWþ 3݄ƉfU M܈xD:7N`FFz|@[\~ՓLM)ps'%Pј`1(0Jdӭo,¯9r8] $T y3J7", &~@LO7ӭĠ&= FdjiHJoc"XWU[\akFK^yaaٖDODBFFtNIan,)TyI%ӓ-wkF C1W+TSa{|ʣFt@9OO/ ]V3RER!E"z&"?W#l2[2ْ^!\h裙ߤ{Ȫ"0H)b[ʷ@'ոjy]?"0`Oa0CdԐؘ4k\s5*ZjAǺ%*#)-WѣG[V{#G&&&qzzçNZnTV^Jg7@㔝>+^- i\TiĽ(JSS*Z<ܬ3.{T&p<^^$X}|֠J+u ~a`!}iT%DxhD/Io9p̦B!K쬁@l=ָjղ:lPVeZV׾>#0>c9|ɯNso6tRHFv~Rn>u=Lg4= кWw\HuuEt6O)#sfOorzYFFћ"%@csYՀs8/L%$13܆I\m*2!> B$K&q'*22?HSO\1ZZb6y62[S(~#5Q0km8hDՆ( 5u}Q|v-"=܎;'s^Ԡ) 1Oc']]΋v`Vy3iI߻hBS{&$˨1@_Wc6}p+ ` U;*sDVeȶ^nP.HEIK0Bn߰ƵTSO>\\͹LΔbW*֥Tx5ffa `KI3n=@1#30N7EE8A=1'UdNvUaزOELa}akV=5niiIS&IQ~&E7zqʈR#R>bc"]"zL't I[ROH8Jޣ?b*G+Mj8@o6KKK~h\2G8pwV 7/iSqULx|5f*$9îȒ3X= ur(tnտF6D3.f:XL{E ?1 WE͢!ָj\FQL)YEvx/4NR)yԝ,taPXJՕ rZnݺVjƑ#Gt>|LNNFG1x]>@_ʣGh$ä/!"s~~~aqqiiiyeeqqq~~~qq1FZĬ,.x5fRD-jo"~(n@Ʋz`1FKx fYcWi\H2XJָjTS='HQVzNf^#k~GtvvvrrC=(vc}k_u<_~ԧfffs>رC3x…[uk~wĉcccozӛn}s>֭[oŝNgjj//xݻҗDD7~~=>;w~?uTQoxف9SӛՆQ[av?D^c*/ry/ܪ7Ǚ}-/W FZLx|!5fW<EN*%CHF`"BV/w:gcg9nAIQQ@. X}P(8qMȾ`摑."VQ(VuFm۶(FFFާ~z}}_o6 #\}۷o{>>?gl߾}{={OLL| _XYYٺukm4?YiufnMvgΜ_򒗜;wko7GyӧO/}_< _Ÿɟvm: ]|ňۤ&pt3JX#e[\\}z˖-:Wzn;99911qW:t_V]yǏ+;XZZ:yҗΝ;=ZMLgT::E`RjQccc;w\ZZ:sɓ'Ϟ=N;vmh3pG5[H-"Ո$Ȳ(>[^[8虁X}|dUrhj A0DWGhg  RъOH_ָfjzvG5G:錌;w_9Rnᆿ'|R1~{}_+~^ˏ?vx_} ttt޽3337ngϣ,r-AEEyHdH92q}?9872X벪>x9_K_k֬ꪫy/~^{͛=3Otemٲebbbٲe^xO?駟g>s1vm{y~xꩧ9r9oH__U5*!DRD0[f<.|w}/F%Kh@|P[Nye͖<}n~0df,Mt,oª h;r Y<q{F@{Ŕ(g ?Qb 08)LJ}tj\X5B&8Gn(u.]B`aHt``@.]gϞ'ٻwk~w۶m۶m۲eK(O[ouɒ%-jgYn333jK.KWsry7tӭ޺yN;N{_y晈8<<|ࢋ.ھ}{WW9ݻw?˖-C 7SV`llo^d1e$Y޶q2'oͺc:S><:$Iz^@6 g$5md+l6G<뜞V-*aPHq;qL:Qטy '9yj%F6@f&} ; b$Y2TYi ʤٯؕ01~+8tIJ?CƅTcyI$iNkPl33oٲ%IQ"ZvmPx>66$I__߲eqŊµh4{lww6ͧz_G?iӦ<Ϸl-fa،=ӧz{W_}x|{>hѢcWWO?|%\RC{}{E|ӟ:pO>o^wu6l\m\vUK0vvFAYr,nњds!xH@,sɞ<ΣT PR,M2C YL"y"Q80*_Hn]: 5P 3`8|:5. I Mt9p^ "P)gٲe9i4SSSy[$jB /G|ttTw\uUy>|,YbŊmZO\r ~+VȲX,^s5˗/'4M7nx f^v'=99933S*> 4M/ŋA'pvkxŋV6ծW+(YU9sXpHD.,wyUc> ˢXa'=o=3H/D&m} djµp?ߌXy=uDrT[%Q[S( `O/^:aѩqa(`A7E18c}"Opp=]e*nGAVi`&fGɟg BeEMx(ziEQmrW[KaUD]O7 3Udf tyԘ*F}QBT!ڃ=?@5DG+FB:OTHz;? e1zbpd.z 6 թqX(h e9z#:b#zTm%9u}#owǑޤDI+ !uq HRTG)(ιbm.VeWՅj4l}O-ڷA1dFΜ;$"O/;jLߐo^vIx9ߛIz\,F"oo |O#]Zyz=ZR?VB1Nqrg؉_fVYޙCfשq<9I!!v\**(c?&JlZpujB66[Fٝf$b1ˆ-iD׆(YBr1Ja5SԬgۯM솬@ԾEѠIXVVEQ,,ncAmdkc`7D)pH>.%F"):jLh00ʆ @>IS .7 >0:a"8J)FhC'H` !C.G$ yޡߠ|֩q՘73vKE2b̌-t1mԦhZeDq?Y[B;bta^6>߳ȃ.6zP|)r}OmF+YG{z̜`n;6 5<ϓ$<1 2N"ߝ"B|$j$*}pl@Xmĥ!${pPK $I"QLst gtj\@5i(>EQ˙P(Edhf}:`'&]3+"rHiڵFpث!vI'o1nQ%h7v~ET4Ģ[3"q@h6gMsqyG(tZN,MM Rf<l<5Wٞ=G~-A!f4u~( # N0:5.;y!m>ۣ1Mkn&ٍyuTd-ۮlU2ye`Y'*a;~ڋƒvjã>& )+=kXJC]眬Q6SL8i'a(WySc 3ف~([I"w).arv YB}@3'\ ͊t;!Sォ1sᲡ߮:tVg@\I#"QGYKMFi[$nI-栤JAښ[MļwK5TO i! Gb=T%=DZ N3r}Ȇsq5Rxk9w Hh8;*}ӳ3Y[@Ɯ:S ̶w2V_ އȝ'1qA(|"`p. _PQ}KzkE=ڢ;ܳmiՌ$o& ,Pciev[dY/ɾa6j`ƲJ4DxDQP;nHqN쪣xW\gG=x(T?*5Tt:jDQjR_EZ@9 ^2Щq!XL b)IH>. .sPv?X.iP IFVOOOXgiLuUUm@cccy3B"V'LLL)\.jr ZmrrR-Z$$tTz_RVfsbbB:lww73ڬg]>ŸH65x<4`Y-  P(WzrÃrX(_\8ʌ:9 X2c㓓.4o_;Q֘2CN U-?ԸjtEiIA)c̲% F,ZZ666&mZ4۷ر /뛜gyȑ'xbffX,.[LbgϞ_P(صk̉'|#G<쳵Zm͚5K.]|__?~ȑ.(˲^ *y睧rq733e~u֝zޫ`u+}Y?zATk\Kʅ,#j4TN"9ͼ8Ĉgvx5r_JѲ)Ca6 6sQJݯُ~%r`9h_Q[;!DsPodw $BGܩqA՘ܱrv.nj6FG NLLQ?:m۶dss=b_'>tMJ^z<_~_4m4v[eCCCW.J~D5k4{o~\2˲JPx7Xx 7|fddzÆ wy۶mo_~%D~sZͨTs*a}ke١C#"ӟR;d|~S(y9FH *.a!y11 4Y 绠<$N{H5ZZNXۄF9ٟwٮԿ(# -թqAHD)K<90>j {֭jur뭷QWWW^xիW7rh4+VO<188_šCo޼CPR4]jDZݻwoT?Sd_?888999>>><<я~tÆ ӵZX,:tG?UV_?|_qo{߻woX?;۳gρwݏ/8bD9Qxy ;S<-SAIdYV,4ݷoĄMѨKRIN}J(6OcH00bŊɑm۶m[lYZ]vmݻ+ʁmOBo߾~z__sV}_߶m[wwHl~V%Ih4+ÇСCjudddah6fy!{U D DFNvdjc}etl6KXbeW\P@UVm޼\.u%OKJ2<<ΣƔ{ ;@0|ʆaNl%|%)KF>ф'?v@/=8N FO򌼽C "sŘO]]][}ٗ_~9˲SN9O?m۶Mf7|ŋݻ'&&F__ȗ /pÆ ՋŢLM瞥K]ȑ#«?m۶o|O9唏|#/·x>^z[oݻwW^yE]uUwq믿k׮.N~pȑ~՗^z/o|I\qSSS_<OVn<2LtOvx@|o;ItWvuu5s|/rizzZG5163f$4yƔ!@ˉT<@UNWN͂[ɨ;\į CO ȭW 9P ֶNFQw$ufy^Tlos9~uZwZ_zǎ;w*F㦛n:2ؘcFݻkR^ٴiӦM&''SN9eÆ 6l(˿/u֭[nʕַwiz /x]w׷xk~ _ou;xll+_ʪU$G>299o}kժUjUtKl7_Ȉ%/4FӚll6 @Kq‰+W\li(QY׃Z&93ry_OCo @N䍫`OD 3B :MG9E좵ЩIZH ^oO2apބSª+r1,䆅wDmYfS7.Zhҥw hw+V\{DK/޽Nh6j??|9z6l8~_x'n/_#-o~s 'T*<{;vlݺ=yڵk_y啗_~駟>N;C=s/BZkm/NOOZ}{$Rխ֥+24kډVjFN)'S d#'"9Iy<Ӡv a L,/9ZѠ_{4)2Gx'-y&FHsB`MMfR>1xcƅUc8ϳfr1J(@-[ LrYgMMMMMMy^,JeƍsÇWX_mV,ԧ]J~j^[GW^yV]q[lٱcݻ_ys=={vڵm۶5k\y333G߿cƍgϞK/3ϜХ^uСiz/^xllZ=hjO5V;޶+3 GxM,?tlqi!D=fz5F~=$_x5!QW'Jsc60, mH]$ŗ1s$"+7s! KĢ,Ky4睋9ԸjLh2-JuxeDa$7˲1!&I255UT:QmذanZ˗/>'ڵkMNNr)vZ,+W?z^*FFFh > .^0'x7MW*O~0>>>::Z,*#GԦjDAvL56k;]!"nn UJBvG})!cvq>5Nc=ǭbOB5;-!L!9[\}ݷU |O4׼ 3@$W/L#LOq)!:5.cD$ %'u9!A̐9y2:=-Z$ #+4}PzhhsϫV5 YEpQCsƱ11䚚䤐^FFF_ 6Ǚ 9bo\'R'5XWSi($ѿ7lߛ[i5Ɖe| Ӿgd< FYuyHasJ$ 4&,](iluD!~?@1U [P)%8$xd G*ILL#aCLlƅR㼙BHV`[sw& JW Cڶ.Q<&jӌbUcUȖ@Zy[g!lK$0nuaa}PRf9f6E_6c˴csNJ'I Nx5Jcta1X:݋0S+uM@ IлL 8?eRCȀLᵠi*!8' 2(L8$K?tj\85&IbN0Cr bb{oٔ^lJ*rZۙYd5j%*[\hg ] XxRD՞\Uy=XX<C=T&PX,jn_$D^n5lR;9'rhMzHyW!a;{ν 'lVd@$A6ȅyD<1{sCVH5ᆳIk=˝L;ES̹g!)I(!rmY׭ֈ 4h*iه9[PHΓl9H~;]l8fas˃34=Î rk*Fauj\(5Z5$ffDg;6H =ڐZ@ƚXJ-*qERI{$h(/k`LD4R";}KQ* QE3t2!hʒr fg9)\J6#k845 afJ)!ewǣ1 H1Bb%H$䀝"; :{;JEEwgCD-2ͱVE{_z>%MFQ,y4`DD$ՔO 2:MF!5$d_V`gS᭲4[Gђ wOUHD!n輡SªGFվcΐ;$GL\ITc?h9l'-O{fDpD; 6Cz~tdZbMӓddטpj#YK4 MFy ڋԃ3& 1t:rfƄL\\[%;*? c YG tv9̲LQyُQW x !\I ƕWZһD2p+\٧{#-\cG@y8d a8`B:5.?=<|\( %#1MAemVT)12n]տP1AK˲L}Vi.{Z[7O !]MnruS_ F3uww)ꂤx,w3$Lv)}o08)خ˖ W 0Na}bR*)y#́ B^v6d@cs<̣"N`,ȴ%SBQ5\=11$6[+o?1dO)gl6#2mU&̬TG.jkp!]UIsH"'vcTeR Zv; ;ȧGv)/30q~5R%B « H$K@x(%a˦$$'I <(0'oOt00N 4.l~*\.j#/Y)4,}]HQ GtL +ir,yWȦ `}U&%+LQ~Y &_ TՊr!OAO9>ٸHFxDD[N Ffp0I ,Nzavz4Z&LT*BNӴ\.LMMj(|GѫUG},-9@ʠ" ˌڜnRU/6TV|Bo.q*k?-F9$-xt5<O_G?u-! g?`!˚T"!QrsKEjmrG|Q*g  93ɨiTU#R4I&BbrСCJOOϚ5k-mСCK,jw\OOrENFX1hA%(U6[*zKTZEi&UҵpK}~8UJڗښ=0oSv!Yx5ʍ dyI$<0 gPN'oz=HՊV'4eH >6lxCtH&QirC&1ҩqaՈiseMDLszE"[(MMM۷oѢEsύiZTN9唝;w8p```@t8XXYm\= 5F9_[Q凴{qP 'B~,eZiLzّ]&+3]=%J(-_9A*S]H_<eiCfFz5o0mw>   jN%9(sTxHZ Yr7GOuj\`5%.1!8GR^ն㞞e˖jr===Z/ ' F6[\zQYegG֩*rz d Z;޴@U gY)jġ̮ vB[9FIVeQj5Œ[hj 񧥴Rʿt Z>dO;\* Q TE@M!hL.@i܊ dF'1`OR$ cfu28c6M:x$jT*􌌌ڵP(MOOWd}D251KR/K0ESabhU?8uwƧVv9Dv9# ֈ-cǞtGߎD)\.%B<蜒khݶ1Y&-D͵:qd/3GdkY"+x#H8ijkie#$d/j9U)|!NDӒJzmdm²uP,E;B.JކJ{%V?ێ|MYl*FnzdlݰRh(!^CHl$feyRL\wyԘ-CFJ(QqMT3_an)`eɑ@(rN2<Cݹ 5( fcVvpS[ѩqa蘳:pѸ""Jzn :QWWԔusj)G4BPӢѲ,+je!)J(yfѢE*pR] n繐alX$XfI[=R63>.0uɱYH&!&sWӔ* B"r8 #@bp#zQ#9ЫU14 d_d YN&`J~G.,οjah63)4")X Q*2,^L,ܳgF+=00p}=cy?VBAGb(=NJV:$@|GGG-\tb$IWWWVᄒ>"]v'Jm۶'?馛񾾾bڅBm]w+ž`bqffo[:d4~RCApk)<VMLG?Z>e03S3uHMm<`HzNqgxyK?R ^ I 0!f=n(Λ0#wdEԸjDb,Ͻ3:=FJ+є={ _\.3LOOQR)J]]]2==MIP*۷g?>̽ T*ZV*7Fq}~rY^o_tp RBXj===%ѢE; h4bZZo=" j52殮B033300#U~zfatK 9i9v8S&Od,<7"C '~2/H 938P +]('!գB>$^|120 Q hRkBKwj\05 ZHS/p 1(2.Th===[n- z#3<̟۶m[z>,~__|qVSOtM]vٞ={{u]۷om۶۷/~_ꫯ~묳w w}we˖-+/ҦM.irD-sTv_ˣo$3E$4x5 )Gf#Сq32rBa`\V(AND,둬>1q/y945 Q9A@ $tSBQ%i|i"{sa/J#QԻP(TՇ~xǎu֧z\.9r[ny79kc{nʕ+8믿_~ٳ{ÇJK~'xc]wuzq?oذaΝWf%KT*W_}u˖-\s Oկ~8p'?ɕW^otM'|~_~7/^.С+W~^r/~Fq-U*_|n:s?rψxWs=?SO=uO~wߛo}讻zꩧ#ʑdNSu?ĸEd(j;j`rdPذaŋw/]~gu]{v:c/^R####V2l6~|3y{4{W^gӦMk֬j6mڸqyw1lٲehhhdddzkV՜sB[QTyO<.:S80==}O n:00iӦ-[{'pI'o \e9B/_2#gvJ?Mfpyy_f9T̻2o@1 V8OD@A =s_6:pXrŚ-UoP0#:YϯhXBEHC\@9ƙ9R&F/˽bq||\}Plfǟs9ZO0::oowu?~饗[N4irzzZ`|||ttmo{ٟ۟e>>55hѢ(,Ih0]]]<9SO!ի<(6 9|@Vȍ7x'߫: Y.ͦ"Ž|!7=#mYQBHMc;bcY1猝q5Bذ!CFbDTo 3 P q qw֌8 ؁!E1.{Ri9گާ/Ըj䜁;:8L2ۖJ{g||ι+V|?dP(<#v /~+_\pip k׮}?WoT@%\֢=2PZ7QR"iI (9oy?]iC?R H :޿2HÆZ D?I!SB 8͙zzrQdrr!A^Z\kDS/zg}oK,9餓o>==wP(l߾wm޼Z>s̹ݽf͚RT*֬Yjժ]v-Y3\t:.lddd퓓W]u՚5k;~O+jZѐKVι7wg_tEryjjSNYjU^>ӏ;8իWi*300vj:88j*pEHLkrkmd1/Ѓ=Cv۞>33S*w[R.NL_p8q?b3Z·⁷V IzD(&"x:P+3998a I" bׁ\,w<*bPCN m<4&/;6gBSu<::oȮjSSSi˿NLLdY600055%ŸR-6Y ^OLL&'H0JrdtDOO bOO$===揎f\.J1Hn<:묳>^gYv}j{p ]vpzz^b#, 9GbxAPfK[411_}cv+.խwdeŋ?zr//sehPyG)cNL!0u˔"4dS 8e%3K\g/<̌3Z`{rp_B,4N FJ'Q̇:BVtV}79bmu833#R(0 M}l6$ 8RȈ*gff,h4#~_Y[m޼yϞ=gue=o;I׳,ZYYMD$TZʗ$ X,NMM)g||\AcMƨ@x؝ʹ`73pY"<1u!+D]W:DrC071HTC(VN%Щk J?4Lؚ!:5.̚D 7R={ՋƢڹX0!i (XzB9K#I֭[W>lT3|id1,[0!ߟhAEER&0?b$ |ծTuî=.2ڜP۴rS;*e 60'փW1]?/jWHR snyA`Qʝ*9mizyblGxT&ؽ51؁<mQ83j # u#d=} 8l ;)6bnY}; bKBSカ<ϝ:2$v΁mLf16^A2F)(Mi?6zG=oIĸ!`w!-zFFֵ؞ eY\HRuuhT>R9I9^yƔ[Jܰ3HWB-]a{kC6yƾψwgV3`8s߃Z@" OʁqVH|$DGݝ^H` (G>S. f4l߉۶J}PJm0iFّUFo;_t}}Sm-ԎK@mԑ~N)l-xkincΥIJ,yQ#:6E(b!U8̄,6!PL |ڇPWU^Kc#)[g vTĎCU-m]?6rSmURQ7r?3AH7HOO6uIAm׬%.{as\g:j$І@&qaa(`_ ! cICMU|~L5,r)k-4ҩqHZt/Qԡ Iy)ɫk47| ؞HH6FM#65h|>;T8#vf?]L(X:fX޹s 'P(n*'x]]]?"Kw$LLL+gqE#]ivHLh H`Nr}eG(۽[oKzEs52U.fLٱ:€ ,i{2mAElO@B)(Q+ğ]+LPYrP73cԸkty."ieٶRtW]vm߾}Æ '|SO=x:ry>lWWӊ*0A b)U5'A[h i]ZJB7US?˷7skuzD%ֳ9KBsyO$>1sA VH@C^FHDWcd;U_yZ_YEuNod (c{=-3"H*PX|+tj\X5'#!'8y%b`SwUTN?tݹsD?۷綾^AJ288l69昁^zIZ+Jd v{EjOڌx{V#t.ng~ZO3[`GvFA5Uh;zudUѰf^"buyԘ"3'N\W~r;5!cyQ0y7c'tIy $d" ml_CҔw*,L?Ըj$4Xf oWKիO<ľAD<|0\r߾}Fcҥ:+^xaRT*K,* AAdz hZ}56l6n_DҠշ2֨Z(QV+=#negЕ^X.]'DJKE:Ӧi*SGQZ*EtPUGGY{+KZ e,.1}&W~05?>ԸjoI I\2퀘ˬrH<xh۶mb'ȲG\*s{>O׿+Jywuu ѥRIZ-"vwwK_[hC=tݻwgYcRj^rhTU===yŁ{;l7O>%K>OU՟Dtip rIJ宻>W*^x{'˲}k֬[x D|}i=Ï?ŋ/u wu1ɒ%[n;mo{͛_{|;s_|=<\sЭꫯNOO};Sԥ-IuS6@&g%e9ySc@`.^`!oUd*& ?E!tj\h52F#k֙'C̃`/D?O;+/XI/yg&Ts[΁_%|{[x?~zǎRiݺuy{~|P}صk֬Ys9y~wo޼K.o~}??۷o߯^zG?$I~^3fɒ%_Ws-\tE\rɍ7?c?n7x+n喱[ԧ>:|ۿ<z衉e˖~'to;kя~455Cs9gy !!z$Xuj%\'[BYy>NyQ#8;\eblo~ׯ_~zLN:J8p޶mO>nݺO<}{0[l{?00 ~djuƍK.=:toܸs9/_>99}>-[6nO~߭_~Æ _~yOOݻ.`=R lfQD<gjS:1yUc*z}7r </X!HžD@t ,e HLDEށ!’2P (d%Iթqab0s@5@ e˖=C?|OO??:cܴiE]$;vqpppdddjjV 7|||dh+V\7|O?~zzZfs|||ŊhѢk~C:U/]Nя~$ߢ\s'/|// † xÇk?]w3s_TWXQVҥK6lذtK/toFOO6?+,Y288[tn[CvQ{S{"|̲׷h1!޾8`ݪb7Q 9諈)"x s{> % 424"r(NÝV7~c\\i0:rͬh }#Gl,Vι%Kz2D411"F=33C8p`lllp⫯:dfffzz7)5zdd$ŋpef#GV{RIq#_OLL$ISׅk(LT&J2==/tuu I9'yR9x}ogwhe|\:|gffzpj]hT|ɈKD,E~R]zoysVXs/g;_ŪCq5JXHly3&E"zk-?ޘWMKЊFf+.8 (LyEJPrk!g5G<"I}P!f9>D455%Hw#ؘ )(>99)FfS>^wuuq۲eի%C$IdebbBFy?X]2[ƆZ; ķ{Kfe.'r@yQc%rH!; s*+G#F": ܕ2>#b[+#+PXui[ySHS=nB7;tj\H5 N$BVvϔ2YXC%V#,BAz&f .h4c#@w?he=2m˧J EJj&J;!+9h4V^}j5KXJ:}`*Rۃ>zb90эr^w%Qg>%30 o@1T5S$= 2xS0G B2a#C4y,N <$M =!]fB[y.u``@uZCJ%gff岎m2&T\_ZY㶾+_Z'"P«W5Eb7M6z=O EYctɯ:]ŘՑ}jSQ'Lt/@)9<1d- x%2!> I:I ɃHڅ(JQUQ4ˆLe$2'i>SォBF<+SxD;w_>aÆm۶=쳥R;Qlݺnk_/|}5J~W/^x߾}W]uՇ?3<>|#}hJZǚX)Z(C-!X_X^{+RMt/G{_F%6[Ũ듘(R#f-<aۍF#R# +Nc SӉ0\ EQVR}x- ٰ i7: yx'KWMJ*F;5.f)z< Sfz>00022"4!Ƽˏ>t![ŋ/^7xcƍ8PWWZbŊ??jJdAQـ!A! 4m-EupGIIS 6I"*N;m =%E6 kf`'PywE^.̃>HjRpÉpvaU<LJrdQvq DZO@@ d9H:5.噄:5h=I֤[`⑑ .K.׿/yjjꤓNܳgOTG?njj˖-g>38C|hwED;v{nhhh׮]7|_]h0OnWvo^]J2<ηFbï:jB@L2dx ~A8,{ޚu! )~ϭW1/2ʲ޼̬yzW#b4b.NBɲlttT`|;SSS^xyMͷS0.6պmc4b"9jX89RW̜uQTi,<˲,<Ҭ,x51a x=]r`D]WWPtnYmN: (ٺyvucn_qL^ՙTCK/\:kZ9rkItÆ ZcEēO>ytttڵpUW?{W_=99\sۿ-'A+Xn7rLDDclmm/ [bd\no}]NdgN+h"9Jҷmu-vѝnC i"u" jL 'v CHcr' S`oY5y B0yl+ {J@#GXbʕG/z>==}yyr)K,>Ţvuu}x֬YhѢZGG7O۽{w\^~}m v/MfymX>KTQ{Rv+-kͽțE>yo{`]^e9:' <eiFħ0Ava '&Ž='}؏)ϼ$pLeєIJJ$A?t oϥaX̭N Frl6Z,z'Nz򆆆֬Y$!}S8-ZlYٜ.Y׉SNg,_\Qei]V4>"bivjmS%NSh-r1Ҏ-nۮ[}+=UDWѶЊ^HzOoi6ц}Ȕ ;r.Gx5;<# 1^H8>#<#{aLS&Td0עw )AWE  ,D8#`vb,b_o@^OQN FGHEpQղuيWUvez]ŊJ;$Cz:(N*ZshӌX.VBE3"lZ|叅BAnA[$ҸFkjˎ%QK]>"Nbٟ';ߐB I!f\<ηT þ<@NUY_3I8]<FIfC (TBӅNe-pUXrys9tj\P51%[`+@ˎ`zz=.gݴZt`\Y$I266FDr9Mz^T.AKiN&6Rҥ@zE[\nzņD[t6qK1XWKglʶݪX-ž98i&-By< ű(U2I' @, t @.p3 E!ɻ$bNM(䓽ڂ-Ţ`$Ç曕JE:}ͦ|ŋꫯvm}d m>es` Ox4x#&) P`t5R甿Fu@HA $IR!<󫑼@/y8햫gI'x J(f3qT*"SR o۶'?Iwww__/_zxx?K/XF.[f |qAoŨֳE$Wh*GM:"?.6]VPj2Z)JVr<1.l|`>IN#~AdvYPNvF,yƟ@;Aѳ}an 0b& ,iJ~ ,ɝVHR7&q s-tѩ.X,M7ݴcǎC?w ]t͛_{;P('|2"s==XUW]544t-ڵl^z7nTt`W_}o7mta5m~`Vg$lqjKX#݆ DpaZܞ=C쪸.C2(>'BfjN Fa;p$Ru)%K p$ը^%IW䟤Ey}Vk4jU&''T*U.Zmڵ^xn}}/a5IVj4s\t0cͲxtko+U[_uu*W؎#Rv*6z(N90iR&\7q^5PIpHOYB70Aa˙=OGq?wE91; $.(A Mb12#!DZƅW#P%rUtX|o|;y';[ng?OӷrYDιnڴi_gy&Mw]۷o[/^@\⪉7ͫZV'&&=R?{ .|MD닸MF"uaY`f2T‚&bGM9}z6Vj?{h[,<Pc?sd0bQy ϨSC3gaF$Nd WNu"6wj\(5jw駶vUJ9sfL.`UeDz{{]./䒮{.:1ۛ5kN=FK/}٧z8 lݺN+<_jբE+ ?я6mڴlٲJq]vܹ/?XX,V* 6`@2CH-懴]ړ,RZH;&,h4? ^f"ʖlZ.x_Ruh4ˇV^}c_tqOwwyGi 2icմp\D4![|;ު_,٠`?FH=9+{J0yf+"g:!&Щq՘$T,FC|Gsgi%/lPfȒ`?KvƅWF֔GCjI=Wz[/kd9Z$?nU|N.-ON7r`L,=z#'d'YΉ:ZƙΡjϵyu ݉GrP]`l-4Br4ggQtyH^*#2aˁ[$0`ϧt>!AXcChC JF@` U ;̳\=ictj\X54sdOŐ3SlRKh~(SkEX +Y;9]3sRγ /? ~5 ~ #eiQE666/']{yh]ji5v ;;QKJ|&p'OThY2R&i7H:@9߳02}vN2 >NdnjMĴSªQH@)"Y,bΙpXZ"oڰ/hI~ٯзvĄy p H,9HIi'_Jf2O:]Hy"a(퐷=Dc}Zut.QȔ 5FD$4I:kLCZïUzzZ`ϓ'\Ȑ"c {TYP,!:Dp=3P8hBR1d/2KRN F!'Aʐ!Kz"t=Qeґ]N/Psm ڶ%|knA@5 9p2u g!adN8Mn5S*%i˲ZϢD#HTF $I"_~hk;FZx5<`~ Z^1=h.\NhґQO+LCG~@W7F 1ҩqAH1˳<ϑO>gPʦ20ZѼehX8t-)qPBі%SH2jO$-#\VO?ZVIRdG2l%tM6?߰g)"2&E{mڸ@DKQ.Ş"9c`N+Mfs*vԘP=٩Wr&o~Czj{[{ `(~2 vr\cl$4=ȜpWp=۩q!)0snTR*B!,C["*ѽ֣d!YW XƦ,iSY%]ƅB\%W<жGsJvI)cVtM޶w~t;) ;߈[PCv[~Euݬsb8 4k""R˖<M)(TrbI~S9Hʣq~$A" %nТX'd}Gs<}0C9@`Ğ~8Щqa(z>(ո1*]"Dm{X7D)FbY"iF:RE̕צy9吺̥e ۾:嘥BY&n^n<ճ Doٓ?NM#Ǝ#b蒌b*NT R|&ٟ1h .wq^5RRc$Ak(ɲ#XVAkIQ ,$)~ᒍsz{1DLeDz'RLbJ:5.9GQw;+ ꍥSDj%2y$JR%l<%ZIXY 1r8nxk3fPpKy2dΥ9`U3i-%&G\uӈQl&] >W2GJ"A'-;QH)FRӲ 1^`D$Uy^>B)FV`ǯ 04v^g"Ik֍ 䃤6I~F I D5Z9w $%sZ++0\}WZn%)V 'RP"&"24C1o01% )'Md~5_sto!`$`UZbbDC!j;eb 4 ]vgmZ_2c1 )q^5KsQYXQJ s CLnU&d IɊLT1$^kr^P,vA)OnԸ`j vs7vw}g0#peTۀKTGa㊽DlH63s'RƚN8+|ٟs#;"ŠU>aN @26h8֛h_ݿ=NjG-\;LvG:1϶ւh4h=C$ĤO*#{[1ug'߷t?$DFLI,RR;5.)<8l0Y7A8T(@ݸ2C|eXFUTq |mW9B9W1k*ϘrʨFfY9m9Rr w+h`$%!ROŪ&$9AxN{^e:!M@6FFpN|9?VQ1S=! ԩq2I&Վn6iڶr/] $tvYk+pgEftFr8ّ,_opI}f%*.̂;5.)$!FJGdv3r2,Uj,>0xFb(2ǿ2f҄9OC$I@@Ɋ  ̌$\t 貵F; 5*Kmt#U&@W2fgl-cicGsy_' Y7b`5<k[ZYDa:E ,#K:-x RIQN F]Z48BuVtZ4Tԑm.: ~-bhO*X1-s\”RB] gƅXc̠3ff Cd06BqBdjj- #M;M{NG0![9p3h4Ks>;PHIku Euʲ&zNQ:c$P9 ",Zr+S"6YeȉcRimv#mαvo?"rѾlI8# bvC!SrN Emzn.+jF151B463g&>;jLޯxԇX4ozH:襰b#?D[+ ebbt=?:Cx-t*|G:5.%^FU9Q;9lrIQB@c@TVIeW%ޭK?+!h hPj[q<ΫF͖5³VB\! ̢k:#YH""] 5_,F+9~;O'#c b[&0uj\p5R&I!!Uã9pHc-"`6>K}Pce=Z;sNe B{n1_m׶`Qd;܎8E`NdCa55fXl;E7<5JafgFS;0?D&TU1R pN~SԄ&3= /J1A'8=ޛX2ǧQֿN Fγ9/ a"i["uh(3h}MR8DRb/YmQ}l&=2>cO<89ys5D$tx5R oYDM:wO pglv0Sq["Cd\+;?^F I&drCp?s_d(!TYKcf{ƅT#DI,gwu.l6^ղ_5]jeh#CB.֘4PBv$SHy YbgYX"s]{gbvb:o-,ݓ$]Νq~5Se~d q"n w~AA$)A+~:L l#gZd$ N ,RG[&;5.ӴP(L !7]EoWɆTwĺO,qUF$Q$G]M!&B Ap;DN1X8noI )r|9B ^"s眣D($:Di gq UED~sک+~H)9?8*ɛb@ѳ"e7-`$0*zy3?S?Fr"ApqwvF ú5rƅWcYuڟ6H>Iz;/4 5nQmtָ=9Ȓ !.d$eLNs&Ձ8g@HyzAd|hZ!ѡ^,Բ?mDF=Yn#D$^@BKm~P\FjK˔KY`paJ0wy 3$֧ m6Atݎ2{+DYkY8S@-XSd2f4&/Dڊft2XdXo&<@ER٢7@gԸjxy.LDH" G`lۦkVLFwfN)g:`7I'Xro6v]d `#q(Jd oC 8Ք J $*+iKZ,N^]N(>| 8!Jr1iz:5.7T.-ꪶ;^]i7V 6ע=i;MzPg1o)arb`)7)x"'&M8EdO׻ 3A6!hSUTK_]Ydgely^J4w.3ft<П%dD2)cH{e2B8oc_ < Č8 @}d=boN > av& өqH}b$v9#CH˔DE!sz "(*]nArZ9L蕇oP`HBc/_@T%#`FS`Ȕ DgF Ӝ9V:4;~nAdy)E$vHAK| qX4b m<>Xlu3n{Y Xo ˍy/zΑfk2(]fԸj9'Tz(nn=Z5ibĶY۽|4Y34 _S;dG_C?F̳P`Lψ. GHi(JTh獴UV끊(#4MUyQ# ߕ[`z B:DPW,d)vA@[չa0p S},Nt`&Y:5.L}:3" I- Ane՞ګ2H+[ם~HD)TT#!4)s@9uOe3ZsDlp>vYH*K<"J{EZHeOEe,rg9!ay_$e `ʰ:y9B..9D"by=XɧH̬ (\'Xd:&שq՘JY*h݉ѩ޲u@G`Q32E9CC(h qralq'TYȟE"KUG:=J1b|l@`qN F%iR(Z7&82o%U Z0^#Ao5U_j0tY' #WOO#N3/.'OVdas02A+j2OFZ,]ʈ-CyOetC7<ޡ:1;)-iI> Ʌe2NRDŽ_Iο-0Bjwcm?3y2̜;SBMB#+VGReN\"75KW 5JӔAI9tҝ3WH(5Vl⨕Zr}D1R6XòmŨP( {ig;%ҧ<γFr$̤Hj@<!Ȥ0X p@F d$y #YqݤKܒpp]#$M ;5. 4Mؕ$ sjm]E1֣H KvÀHci-ڠ_'HXfΐ] 5LOgF1ΝCsFNvuDdqϣgb,Kַ9.}9p.EH%^-@e#@ AH%v yԋ` ("Ǻ$RDp\9{럇ַTuwqd88TWs>gSRhidMQ4܏*R.ڛ@B%fFlhP,Oe=P?m Wڪs2n 2L>8 1%Y5R=[ߝyiu瀲V4/Kܥe]\_o:i^T% C{gऍfNUBE3jeAS{:_Bfisid)Z׶yO+ZBAw5kN;Es J$ngCҝ6B46bR(*ʔL OfيS e!4dDe SկH;HV.X;^iGܟӹhxz$eIʧ2fX D ^ &Ȥgx/xP}HZגRbek.af(P= \gebIzZV&0~ օ`%9 XߖB&v&̍M!L{{ r㙋16%ۅV%~r ksY,i9.Bk>ejjj$i_J ךЄ=l& I, * V9(UP2ޯf?-UGXgս4ebJ~~لVgJhmY164'6sI'7lo" 2;g?`I@m!2qM\+UT34T"貲 c%D_}*C)98bAD- )cbkz 18-!dJ+*IsEg4|O%ԕFN,^ݫd' G)2rq-C,&DMPг!Ƴm_Pu&"_FU%Ȓ璊q@-IVZGps"y`žAZId eJq-.>>4jz`Vh:Պf}\ fڅ& b jiPP~(C4kKDegq,:s_X2qISJ)h/SbA{̙zYf TIEBRe2iՀ0r*%K]YB>|q e"2܏Z HXƞ$A\FAn8spl 3"V$GլyKmIwv vq h*l9+A8ӨS'\+r)ђA]߿/._R{_Rn!ʪ#V̏A/\n'<4%G T8mNTJ#k8tr.N1Zb.![ڽ*_77&sB̮BUux1VlJw35$x)l'  sY$<օp@0D> 4{e)R "u$@żIbWܓj WxRu㓾sdBDu=k]R-:|lqYډ`ZH23OT p\"{O٘GP3[y%*i@y,l $lC`ىQD8I!@\ Ɗvfzk9q(vv@! G( s&A6/jWdQ V 0ɤ4>:Lb荬C^}wy7=z'H`8xc\9FO6}7HW/qtD-*x%>1[ԕd [ !*eW)FWrɢ)Qbis`#61 YX 7%5&R٣1Wˠt!ƳILA?a-wܼÂWU|yݱ+DM3~p?.Ҁ6:KwD$իJLY&(Y:Rr_>#Sĩ ?ZWq-Զ̆CUo0xbmyE{޾}_[o?[[[lccgFB/M| _x嗿կ^z3il6NxHF*Տ 60cxU,'w%u2[ek:p+re͔;\8i!Ƴi {-qh64M4"gg _ouSO=s[sUUMTD0܏*jyI!1!bt~t^AeTlиhYI9F[I|lO HX $L 8v8Ӳj19+Cg(FI,}bIs/wGyy饗%9o+2Ly䑟ٟ]e}aVS1JƸV䦀E&-ؐn$N> TN+3F8 JgbDs㝏RF{㙋QiIywaCUG!_*~}{g}ʕ+U fTxEEt1V.~ Sʦ1Q 8lus29.x|Wcl`Z?X+tΞDPOCg)FE4Il2]9Hr7Kk/}i{{cؒZ7.3|=÷o~뭷xTW'#_u1u p?{PiQR>0J uB\A`gD>,& T_e-2nXfbYޡ t9~h 2"JIoQЍ$t}g}vz>Y\fJiggO|7޸v +t7Ya"4M̳*Ubx1VVB27 "8PcV0 nRCF Ctp/ eJЖt>P\.1n db Z09 8y-OX,/d2q{[Ν;'Ĝdɥn9dkskvx|gOcE [@ ӷF& Hv {ܐfht6]k-3H*rWC7thxO% Cg/FVu1~YR)1]r|msnYRLEp?"F*DlhsɦZ;=1peX&a-R>$8&_wtI]#Z/DNIaO$AŖ,㙋1l-[k{i5MsppT{Nfol6lz /N)%u#bNxyDL2;L$3[;ILoY)Em_C!$pp'7 Yk%#x2Y軾!|Ґԡm} .ݓϙ1S V͠:(0p̳^Wk1^xV+׽V˥{oi:~_~뭷^~ SJĤf1(X)v5{B|9 J( g*?=~jsQ%-*P&ó `A]y ›,B .!3#|R}#cu t:۫{3L/w}&~yc[m{g̽!+0TJiO0@U(}$` gT24(׮W@ʄQ&5 tJ艨n>F)KCg)F:bl;GN}QM)ݺuq<u}۷o ;af{{{onoo۳ ,MR bb5{%.]ԣ_3Y'uS>hBʈpkLH0% fŃ]BJo*D!3iY츬6ԭ{}l:]|+W^d}m.a'uC=sЇ>Rz7_~ҥcruYёmEBp2܏cie:H~ !"ęU@D)#Wqh|"Ɋ-$Τ#f!  )0sU'w!Ƴfͬ,IY`t0bR_}_^zSO$a?? ~;Yz$daQzhT@41VD1*T0Ov^fb@dow#S g'"?'DL>7eah )hȑ@j))^Cg%$b8/̈M*0*׵vߍ^e\.g16PM  ""U:{Q"I?Z|`)R|iXd{39:>.OR@}FL0_U :*Ex䞁,DP) klhj'G~~m;FPV_Osʕ??ڲ+mΛ b ϚbĪ$ɋUf;]lJ$6꧇ñnpo.6fG,. Eto`g>YPU{!3#$_)5+} T_bn٢P|Jm(kJY5C>[+.->zs amVprD^']N hm맜kt{-戴u}fsy%9v>l{x=* g'S*O`bg2Hԛ U8#n?{DߦN[Mq6Q!ďI.bdkI6e4 ҧigq($Ѩf=֡71Q2M'Y`$"#73Q&Y\S/U}Nje"TX)7k 0sd%ҚnE!#+6&^V*瞨=krD;D䜗zB,/^`nAiOx cgFHSle_kK#>9d]w$E/G4-D$%y&t;bAj+qZ[0!Ƴx<,4NTjv`, .Q[;cKq~-) {ۛGE=-v?{mdTPINv zt4=Ҷt8 b Q@轼ǪӒ|~}lomf~Nj+jNAll kzA`Cg(F";ׯ_|rUUu]GK rs4^[7PO+ "xͬTT~]J^h'vʌU9(񇏓e>`6=#q=kfm. c) p3CJ: g{T6";~û(Rk2HGH4g\Ovc`kuTC戝Б2 *-0NDLٚǽ!3c'>>Ù$|-)jhf!bq"}DQ7KzO'(Wruğ-:Q[]x|օÓ}+lu1"xΥ7|>TDp?.F)HkIٸ"m` ]R.0`O{a'؞6sG!π5 1ȇ}O#nll%vHa}]ĚCb>bnC]v%w z_)^2){JՋ”N^/2Y=B g*{hEDDp |1LEUoݺ?$uqC>f&Z6܏2p`bj6|U 028THgaCJBD)Jq~`6f7VBxvq>?=۠ !w冿>p,?}ǟo|D Myr_=5]8\ߥ[۪̫Օ5֊RV*'E 'l8% 縮eyR ~=9E"ag"9?㏿W>͞|~~b4h7ij?|O()lʑ uQ =3:$!)@`ͻ >|KdŘ23oom/ŏ}7_Ʀ@ xuU2H "of2~TK tnw:aoIWm9w ADO)]*HWI}L mӶg>Bx%JJv)>k(V.b{6CKGǒHNG, y7뀝߈9-S8TbX PxQe(Q>#?4M7&[?c?/Nd fZb\AN.Un%]|1}͵-c[+Pkۤ=qTI.Ҽ眉hww#}>_:}駟x )co!tO_Ň~U3~6' s^bs([EP^,2u/Uyq_Dqb"K-t:_~?}ݛ7o\/+RP6܏c_oՐ:ܻ 6 8s8Fܶe(J+3>VQ%qQika|/)qdHCg(FO2#o}u?xra6shPV6jWqq:C G5뚝( _PW7}[s%7GW.%вZu}U=r:Y-PLL]ڈ,ͳ7og>s_| }ǘ~W~[~T^` Os@,`uD1kĵA})!N}V`68M B坥 [J"T"lH5xFb4YƠLm=ȏ>oMO~u]BZR1q3@@Stwwm%G)_r5쿋 Ұ&X}RV_| kǑrTuk/"e,-ĻԞLʔNa⣣7xU_'>ǿy<胿裏p?c1)}piܪfJs~U. 쯺 +z\npj83?Ķsα(݄Y1JPuBQ[|W~~_:}im4̈́ (۶I)L}t,R^[ZEcgۛ/K/1Fzߑyow DY= !G@pDO/)4kՔNN D ĵɍ59W"݆3>$SȻ{{fwkHYnJ!*9~hA ӄC84$#=A̺;9Kv 15爒U!VPǤ7ZI}sovtt4ܸ[RJmfEXE]CmqյA˝K`ɶi hrt\Dܣʬ/@*^{UٚXTׯ_'z'?c=G׾W_}eTɿq(3%xp?s{{)0 Pi-qXwGwXGHc6<':d}khGJ$inoHJK bjڬ[ۛP~o˯R&}\nGƫ~[7oȨ]8?l KWJQ._ԓNa͚MY|mXRX./攒;GGGm۔x<_pG{~^wcG?L$MӰ$&HEʎYup?k{{oƉqa֨Brp (,3+F"Qֲ=0'?5Bo.1̘\!$)`)&1 !ƳB nCR߭nsěMb?~o@=K׮o{޾~l6d<ިz4F*%)ʡTXju~9~Qw6޾xMuWI"Hܶy"/Ƒ$H sPDJ,l{ԯtwz.(% 70U"Sn?oEfܶmdcck{<oll\8i{ds{6if7o\ݾ}77'O?'?O=cT0Q21+Na/G0 ,<܏wv$>).ӱSmJQKaiBY0gTe Юb 2>V,!(b<1ܳbV *226v.^[\WI") l)g1W@hZNaYc1AX܇rT䴰d*~gvL&MJbKtŴe(K 3:BHL,Q%9g(2چi3'N"z2oη_{嗾W_{k׮ݺuPxs::ڿyvzttttt:=<ۄldR լ9j֌6P䜛j6mDu=RM3kopzumooO6666*T%Ӹ>=tDUMgmn$GGfG٬ώGy;Mw9綝k|8m~! jk5ff1JKJuJi<jF榈FuTUu=Guq=ؘMV)Mƛ!mGM_?8M3gdc4+a;\p/]|}}=أW\QUf̚|֊HJ,,$SD Hgj~yo8~6F쉥*9||љA)K. rXp'} @[߱F.TF0xb wenCVnfͪ ͹%mrmnsJYg|6WH2f۷o޼yxxxxx[iۉf3T3O&IUU]GdIR]8GFcIRW펛y3o,mB_ãújY\DM"&q[5r2h4&4QUU`:mlfi|>=:8<<<GsU͹Mx\WFxpPۇtƥqbv4msVsoVet41%U*FU]UV|je!d;6uMVC kӴdK9m۴i^^g2I[vqUYSUUѨGu]O&㔪Ƹhcb_.lln A*ID$0%*%fIITU) p!bBUU8JYU'RpHSȻ{%oq4zP t?(DQ%Ʒau8;ݗiJqFZ  A&60vǿ!Ƴ#V&P*|4ۤhnU@5眛UUo(6i|~pv۶ɛ7Mvu j RmrPh65msv>gEΰTՖܶRJ /ѴUQ fΞP[s:?SU R|IJUUUU"=fڍ0QR5Nx\qU*Ux<%IU5*Q"!SjƄY꺖$LIYPU$aIݹ]U0D(Y~‚ )'S41]cx]9|AX t$솳,L@- t O|KH\EY両4N7 a+1 h.{&ZQU@VV6[fB33дj&hirnt6˪l Vis`R 7e,B#@ԊjjUU"f5=!k&=*$]bdeu0YE*&b'cTUTUUף*=4*F{`:~~R])%adzsp%[DR%'CX$2a%tI0H )bk&fw$"?(tv~sCNpCXptVسAgTbŏFCVCg(FŨI\ {m#5k6LkԬ9mڴ9lskmn@`{| RGv}d=ge/8.2{]"KoEpվ@ҕ{E!*$/Cb*UUU(IjIRzTו\TU#ěR3?rğI8qW)@X@B>e+i$1=-{C ٫xiIz#OCQlN!0>z |d*>3/[Aw!Ƴc; M4 *"Ԙ)#)9[%R[srΰ{mnѪŠfUU{ []Xc瀜'^Bj%;*8 AUեWx(B#؎yV`fO±O9-JITuBIDDY% Rž` ;"QV\g`X Y"c~lj %UMPu&%xeu V`T&7#QYJ*3DlYEÍޯ$uCH|\ԍAJUD_&0H2W_>ٍ}S]ٜM_ o\W.`򍻵 K"! yѓWl/bR n>xbdVb49sO-@#&FHX։BeլjKj m[P(o:C J}oVN5p^L* TT|-gl?G1 nY㒬 "#HR~ cN`zP ^tMnXR{pw ! T7Y4m{zޠ8q t`!pI[tܯ A5vEMW,G!Ƴc6H06 A0kV*)X)Q&2c^R&ek}*x&8%8m#67AVƳ.mQH}'pU^b p,X+dfUgCư-"Vd' m3nZW`Է|+ɪ08oIϓzBKU~<]oﱔ'բ}S<5˜,5HPI.JR H1!ݽk%wsf**|33'-^)#'Q=o%;DdF&1ݵ.Pbx4;݅}VDb =_({YՎ#p 1111`(1D^*̸͜Yb笽o@TLTC~A\ꡞ's?E/w AE e&f 6~%Pb{RKFpSnkEx"WD76G:|+kr7VW'-8{CCCC?1b cFZN$ebm6pǸFXA0yfRT`#pٴcEH-5/F!Ú f'feEPCCCC+n'IF-΁i ߔAaGaQB2`1rrx a!^ ;2gUyσmJF %U!!!!j@`b|&"l狞/=hE!Ɗ̎X % g8ZzKDU?d,1O{Q/] ))B- (%R*j7j2888c=r1YQ3-kiKQĔ&!(Au݉ XGLF2o0#0y`JB?888qooϧ|q ek`nʓXlE1$h~Y\HX,J2]`e0L̤,٪1111 bg-ٟ<IENDB`ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Pagestack.html0000644000015600001650000001401212654470322027731 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: PageStack
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/nav1.png0000644000015600001650000044632612654470326026541 0ustar pbuserpbgroup00000000000000PNG  IHDRAr pHYs   cHRMz%u0`:o_FL\IDATxyeQ go5Ym!,, [` 1q1NBބΛx1{ L<S,Y`v {綍M6HWϰkV tje @ *ٿ PP (PB UH"HDd!&UDID %" ĪJjo)P(+D ؓ@ "f!!]KhvW%j<4ROJD9ăP1c8s ˪º/ hj_H*.?uҨW(Asb"XZa0|Ta#D"eRL~YԲM1c8#)S'Cv|,;8qBbSOA2,*JCF{Ç;i\LFl?4O\f!;]iǃՄ'\%1Ⱦ-bdn'uOcmM3W&" 6dj1[Z1l|j*{Q!2> Ǯ^XPрӯm규 01c8#;&Q 8> |Q@T$gT!6nT!p,PdeR~HAQo(Ee1cXp(;J|??U DĖD6Mb2 ,4̂!2ƈWH W #:+=mlH˞.3qƘ8q2bt]dzb#)KiҔkG6Yitr$Ccc`HΤwoWBD-A I1X9+_A@4c1c8㩕x*ɀs(' [%{u*o rӝO_zENOXGmD >p&K4Oc8q+у(e(̯.lrdݔԻI~ZW]CYP(0h`p8]O6q㹋16ʹmFkkk鴵?QDFQ `T늉b^W{?Xرث{ao9c-J!oΤ=CLUc*\ԕRqRI&[@5A橋H}T;I[8Iw$P]mBܫKyqyKwurkϜ7N<>S!px޾O~Sg?9ϙ1flIإdBs}?HOAd $PF̺#`ICGNq_`%eXi3tk?;& / vs.{web4no=zZ]]=|S+'6V'N?~d:964QcQE9`PUB8zᠿABݧ=֪પl2lP"rF#"THn%C i:D4Q4P'ujUUXcD&-"-Dc}mEڶJ#mNm't:md<O&6""鴕HDpՋpypqyy׮=vڵkϾ}!z!ur镓GO?uG>yӧO7]xyrT$5"Qd0kyDo٥;3o<)bt /`&P 00g4V/w7ƷooxUO{޿o^m2mWWWN?|I`D-QS:harFU%DZCDbȫ$EOX>,MK+%j {,][eL+4t#O\q]'<ᚇ[oZ9uꡇ ~~qiee.UUBh,5{I]ƻTNyXXYt;Wgeg⚸,W̓HIxLzc??^xዟ=~~׷O_bئtjP0jtMob=юjbʝ^DXcB.e 3N IjUjFbۥD8P[!HqG5bDA&ȇhk%T+@z2Њ.Z>'ij$q{HTm[JPL Q$4e)XC*b]|/ǛOzS^X֛?|mozZbS++ Y1ޓ} '1;']\jLFA6t1"WəOKɴRM%4ML<1~=w}7_|[?>u/|w۳u}m3u]\[ TFRqR|"g PC`;I@V&I~u$2(, @Xʬ ՠQ@xkTktI`dn4ôAj*U)j24YJ1{RQDLʅ@R(rB"&iPP᭽?T#g>㹣&uUb ?#MށtDY^]s/,9:@@ĜƵ~q~[LXSx:7vMTvoM*:8b;>q?]v?q"FߝC*P&bP4T{S]pA wR7PS/p"_;Ed6;_v#3 VaVZPD`W a+LQ T1*3@W!pLT!!Y *!!fVVҐq@btGJ!ul T)fDI i4HM5J`b&BC'Xb_PDXŅ?<7ƃAOE>˷||=~i T|$X:! ^%Ќ9i~9K.xRYf)JC̣Puɒ`=J|0%Uu[^}7=o}ӿ_ЛZY9-PBh!֠=G wO^9Ъv tvSNȰhRT3>cEׁ6wZbTU=|XĎHE'sЈeZOg0U=kI55d]t%KKKiI H!V偭JL[gܺ wf@N5b2n߿TUh49~S'n"Bmq >^| kHD$IPsԙ/~u/x[9}{7|=5F:uMQa,B.>KS*EY? ƱIW؇G{[j))M@@BڡH3 j[oy[W%z?c Y[;ރo,*EC%V!ipx!b5ͭggwI7F$B3ӗ2%T*Uphtnlcunw 1^O'u]7qBN eSQz鴮CJUU."!x dT׵D0tѺ.׿pqRO#1q8U,uoHl kn  `J26m;@imn檮kè AE [xu?zOܳw3/}˟kq{6@:&aGT E ѫH:ugNhMFBI׀$@qP:3hR#'mdNo["cOO//ys>ؿ+.&gΜq DQ@cGj*eioRQIܪ60F@IH $&osBJT m3'E>ѥ{>oϾ!ο:qm;ollرt=zQ.xaoa8L&^VN^^ڽ~zypҞfQɩ'vı#WuםxT"r]DCE!r_6^;ɺuQ/ /w\>^;D ki 9:)V^0eϐy_W1wï~ͫ9?moqqxfmU շe'u2P92˼P^os'OM^ٹkxczqO|sϭf?xm_|?w΅Tw穕SwO3g>> n _gG+Hw'Oyyӟguԙqի+wtBDjϞUWU!ԏ~wwȎ1L͎d%-b`=%1~IJe{WDj*lBvI㈟ìMo<Ư7w[s^~?yBT"I#)&)Z(E[Bu o=2][N鉪aW9)+G m;w_~?Q`GϜY='\tEgN۽o:>+6wur?qbKKK̠a>Ϯ3VvXZ9q|dcfRɤ]ڵtɽv7,/.9ɈG/ %SF 0PA'͇Gcmd%UVF͊Yɔu+8+UGĖDTTZpR8 ͍5_ɤ]{vd-oPw(\ =pѿܵȱW\qŽ;_gH;uIMH{'U H$Sw<8а3˝e'nW`vNq?خDԲ;֞sf˱uT u‘S.U}}GjΝi *t.L7ɨAmz</.,Fōd2׃#uҌ;G^?m m+6p: ;ǣuҚu<^袃/~+wرhAZ բU&4:NҮnABzƶmFm͈(>e Nd2˯)x̩^czڪ`2G~oh$v$%(3%qҖ`Ϝ'W;];V^z,c:w<) 0 ޹隗K;'3u~ afMfb|T!y@YE': @!b ^+c#/zd:_*;Uu8*ځTմDUK =qˉhL6qՎ5N&&RR@n(A,8&e<;>x>(*v2/L&^ͭ |((Dk+ȄՅ|M I[%V8P1V1~5Ӛä!2s0\åxdtVtle"U 7B i'6b6$fDIR i76bzcjGݯ*mnn6֪%1/ێHQ:Ƹc3'n^x+?~r ٠Ly<y:C0$ zGvMr$UqJ od)W:Se(%q#ZIIrlCJBm46KzUz׻>6L1Kw*v-\{3?9Kcel8$Dּ79Y#ԅֲA4J}\9JQaDBW3y_1F'>銏xʓK.OK̠fcJ-$RP}5iju5GPըĭG녣wr.?Qf08*ĜxT'h/ڪTTDC&F@B:DH[AZU"REDV1wbԠ1#К+51K&PsЂ(T R$FDkM@Dsۄ3"RKFWק>v_W~3sڶarR3K'u.rk޻{g??Bo>ceDRwDu.[F.2(+>*6b0ƿV{8yr[BIGARa$`R[uIֹ"M.N^c<1nG, ?lOYUM*b0vTdfH2ƌ&ӪRnv5#|- q=`)U)CiDX(рTT*UL,$Q`6{H[%lh,j4(b*HF6l 4[Pm4*!@d^ Ɣ΃FX^ , \N 5S^]4J[ a>GUA8N)@(ee˗1F?{WVN_\uh19}L DV!SHA*ƍu*TUQ}˪CNW-cDXCYQHcw.?/k/;Y gr1AVrOO}3?+@ 4m ƕ=D)U;Pigt |XLKjUǽ"!N?iHlGjqUA,C#,Y#3 j^(kjϬ>}B=4v휯##,B`=K9^]YrVbJ$z! `gʜ\T׶fSfT%G>XQ]tD1zw|Jv bQiLFy9#%6S $!t``r#$MJVjkwRkt LD3!Jwi/>g=z,ezU^'fOeyyA. =fV3h HeM|oivq*>~sTVժÇol[x|=Z, P>yˇl̒ZX4Bm8*xץVg5Ŵd\aTI$LY&qЄ҇bܳg_vڷo_lQeMºsK[dD6hh͂(X&l6!5dVa;4_&پ oJIdmv'bѹy;`ݖNF\ei/|䶑`>6_ISegP+yPΙrl3[]~{ֱm=gBUUh<\qףYz 0,g@]4D1;|xyy$s1NE`mV?`+St MJKiy8%MnUȌ8<'SLPWww{ѯHdES{I.ChJ[ ϺWIJ&uF͈gS:)Oks1-JbJQ*QCf, и`^ۺ1 t2'bdl^wMyCtfEu_F3JԆ ziAĒ;}n93S[<&opY>9y'4"b;c<1>{kk;wm:J-ŰT ʒw"""{ Y?ARxesgڊ\V~C9A loY%; WJdvI5w$N5]w#sڀeY"daZEc;]*hӎ XqJ.D07ROZY4oJP\6֭VQϜYGJ֙axq/C׌MT7 ! QW59Y\% a&+-ȸfh/>$"1mkYc<1NE{WNLF>jgUUөLxDme164(k=Di+Y B]q0ɝ]lU3 2*Q82*sI{TK~NJLvu(f*pt@*T {G"j%\\[o.f)Z /J-DYh9R驁$jЊDZv]( vr{U $*13Q`ǭ8[4RʬLx$XWdH_*@IM c `])%N@PrFޑޖ.!  ety=4p#$NJ*ukk Ufa$K}D^,1qmxrg 0sL⤶5uuz5f>\1KR>jp%U*3IHAȔBȷX<woZw6$h05:15žy)u;36l"qa()]A)%ʁE$1I yZ4m`JD 4_HyJBTLd$kE8Xj##$P8Lo&^Of{R P 6Z[غIߞ.cE;8M#f0x޽ ` l^EcS;cb,v.勐p }' ažKD,g;,-ndjMdPpJ׬貅FR  Q@ɓBq|7b,{:pPj?F_>$)Ҽ\ }cBxS̵ZaL*]IIlvJy2F ;$ZyTĻ,0,;K ",%H 3R'1:BlSbʓX"+Pg}):X˷]@)#IҬtX+ХRBsF%Ǒ8Aq+%.Ɖ{"J#R 5IP0Q 1 *"h[f<_MM{Dkpʤ* a,civ(w%|宕D !"Sa'DRe6ҵ1`<m[u5u'ݜiyIU [RThBSp&ɮg]tЂ DqG)L9:m("3XATMdluE\Ua0 'ٚ\g8(ч %V\R# !Ծq'̌-QR!d6NӱHkzDĒ<GKN 3߹h)tȌZAnBݝR-CлV.!uIjV"S6h7똊v7՞ -gp+qpT5ЉDH $($\SVO4sw w"?E" &d]>!4o䭻0?F>nYS IcjyR53E'E2pN`Th<[7Hc4}b&>h;𻒙7Ȏ05Jץ* S==)?S UUId8D`}Sw9Y-MHd r|Pšc<1^zU =EET64X7=;QdL:Qq5GA_>H=g3bߒٕ:+GU UM ;t$B `^JA̓ST4%ҶĂGWHNѾa֥ %Q?)UbfQwJ{Q 6Jy]lXo8n/7CQ*uH .;621AS!/'~uFji w X[Lo"))$,b4㖉i.c<1(<&.Mzl.&5{biȍo$#:wG5afh^ ٯ `&ф)Kx;NmRqT|[*&DRDn` Wa;AAޝ;F c_b#o!ڊ8-be ̙!Dީ2WS=+V}RA+ZuN+-l2oD$-"@ 5+J9Q @pMI@LjӝEp9bSa%>J~ٞ ne~rV;Sw Krvtg˘g<$V钦"H:l%0ASoT~xZ Z!}۶)tv&CJ]ɽ:Q@zJeZhҨEv$ cr3%i1$r)`V QefBW ~7ڮ2ɏiYɷua#5腨 \<'YE I:"*Y&Zʁ$O5X5ĬyFږ\,PުoEJ'.` $LIX$v+ANzD.P*i4'fJ:,p'JRc<1Fs8SUq۶Yo[vi`oI5BlR&cjh6@ll?%9eg됁{$S*3Ӵ ؾ-'qG)|0=#*I bVt%0uhtt dlJY9PN+xF#B  7K45& R#ETjŎ 4„JkQ$EasS%2?0kb"k$pR_StпӔjtDYF1\DHVL f#uQ>GJL?5^f,Te2BH!Ee y %"EYg0ޟ(GSp%GDdGi")ڄwdB.MMH):9 F"..HAIY0SYFcҍ Rl-j"*me 4_Ty6#I ϟ5)M6#C=Y">X@6.]uRpGr8}yiDO"dy.FPkHvzay_kQ;ڴ/lMj؎jm86:?HLy1AjgaQ;GT݋"UV7B63!RJ,, * D"tѴl:jVOID58D J=*FI4] 0ĵP`ՋKՀ$ As=-Ā$fqf6KIliW9#P_)E`AT(u(þ,!#$;2&&G;m{oKY)q1RAHHO5a+-"ܸxb$cըFJZQ'?ɕ'{^n;`'k5 {QTiz9C!od=iilugIeHixu;v""F\n J݇c9j9k!wiJ{,+3W M@rmŅ}v4TI?S Cm[ӢOz YYf*S1%K\ɘ0om"EuJYq9 DVR"R2d}MNV})hjej @xc4YUU<D@ҙ7*^Vw?С^RMY}}?<ʿv r%_=:Xߖj\%k3Kͨ.PaUN8iaa،4_j"?3uUF,w1gjEB#&&2֒k+eq!ΘzՉX]Wv)H/K_a㹏#XrJ6^\e+٦Uv ;|_s _=.Hlgg-oLmg%C!al\`2T4 tuQSO+AVˁ%sUYFR!f(uaiǝ:'+"R(u|\@{oP#N,y4F F#UE0'4d EK:`+[o~) +}/*FYfByzdtykrrc3Xt{ivuu~UWMSorKKUUm{S)xs|.~ٔ53 +ħ\-zNf̪1dB&v6_|RU%%-~H<.ee, A!`Iu~|ʀY9nBm"E]יOD,Һ! Vk18porQD^:tW\g=wg>s7_'?[o;T{K_z_ Ǐ_^^ǎ IY{~eY}eii7q`2^p{|yy;v5lllr-ys>6ݶyWj׮]huuu޽|ԩ??9yd_qw:uq{Nz$3F ^{{Wu>|^}t4 e]3F)fn[1ףX-#[3^~x$634{&+ҀLQͅ 7P8(D}"ׄޅ~M(X}՞(c<1@"(FK`[JD/|/y|7ӟG>򑥥Eyk߿̳x#?#oy[kuzy]ZZW+++ڹsp8NۛnB}cЇ馛./}KO|?gΜٽ{iO{ڍ7h7?|߾}W^y 70]v_ /<9'O}^vĉ}---ozK_#?#~??.c~~IUw7pۿ۟OM7ݔi$\ZMSףnΔ@&~SXrওH8'1dsWHi*l"FKi|m҇CI\]EssF?XUt:u JTB љĉo|~ɟɇz ox{^ve~o>G>T뻾 [}C/~_׿]w'Nꪫ7'oo%?G:u77;C8qn;/g?w<:o>QG?~exy /ky߼~<xы^x{W۲`eUQIX oNmw]w-..Z浯}OO~ӟM}{!>L<ޜ0WI!}OQ:O%133msz$Ė&MȚ$i {sCd<ݔ#*f ļ6Iy]ZWFK](kI '|t-Q2Q(5h|p fҘm9$:gC #dqnilk?سgύ7?mVnfۦsZ:p__; .p.//u}5\СMh\QDžf8T& U^@G 2!ӝ̴Cv65*rN_gd65x7|OOm7鱏}w?c?7~7/OO{gx衇暛on_뮻mo{뮛oy<g?!-_iRzСnO|c޽{E$W!!'No'?99~K_ҥ^O|kuu5?{~K_>)OU~ӟ~wW///ر%/y>}ST_}N־/xeg>|;IOzɓ'ԧ/}g~W~Зx[j*0 B#" EV1jNMnA,tԊ 'lhKOsH/j0y`a"%u*$`DŽrEʖ^ b bd=s^;_WO_G=-]_d S)uKx=-/õ__oG?brguYkd`b߽{w۶~|:zWwc]vq]z׭?3 Ν;bmumG鵵#"v%F_ i}oj !HyO~sۍ))\7p~&عX(nO2-jN&nN]c&AD~U8΅E78Lu+/g+؄ s#[D!"0Ym Pn媪QW !0C*_\[MB*bwn_r[HyDlz222Td$Ḍ{^s(]LE?2V~vhpX1q%!t㹍Q\=5* S&8⅋UUUnvp:UbsbltBЈܦVAIDS޷4vzU~% T"-3+X@r.G÷˽wUBC;UW^K~G+\>F׍*G M{Rk xV[FDw-eX$ն؞s{zB~--|VJaB1UDӜ7pFrzDe*֩a+{/烙>'%?$1"e!31-5I%fOT,IHqs[Pƫhec<1zb#0vd4xs[t?Q1oL&F;Q&o(|t/̓Uܝ-0wT5vw9j &H$~u&EF,Y{?O.ժ\5 +m*0slZUntLe+7Fb0lC掃!4[gqѮ}ݫɆ;؁u,@zvI0id"PVL+G$Ƙzh$ ,ȝo/7Pq$5ch)6OYmURi˚wVP͡+^!=Ap5xc 4MadoeQrٗ]!bBG")ǬNҕ5#Ȍd#4)s~=pyk-% Iwg_M5"UV6pVjP}쫪>HU4Q5m&ӉR h$gH[?=3|fc4h,IUC0Sgaa}T!ZqȊp}"EL`zLD`Oc.'i$$[EF$1\8`g%6!@Y\<Ә.LlI FMq!b &n73vPNyz[n+ $(?S`[~|FI0WcJ 9QjC8z-*CaI=q2KdRwG45I bI$^P LӭgubRHYc9| [UD% ALRS4 (AJuDJKzt[ '`{.u]0?2w/߷\og91F3l_pG%&b"89fU{sքQ)%>A-X:KJ '&Iba/>V1Awk \x㹎kGSv\If F0XŽpP{;v.U1y;:h ~ɇ\k=KVm xzss% @ S,!llcV}W@ y68xEﭪܔWU 2y0S lfU[JT0cC Ax-ʄf@ iR6>KR&'F:A`ʴYN/WA$+]R< XUېjgH!/ :xcD0PvE})1`pf&/-- C;ngL .Z^DR"P7񘙳+^>.A嘡;m VUϼn3Q$` APEDm~Ĕy/G#v_'D @`x6;VDerGϠ9d Fu]|O3FN%"!X!F,I90h<O&|=ZU*$y}9]l9TbT+ ]tuʁ[0'((%fv*Ü6OdqNn$L$[sμL=yO~*{l`kҊt>޽kNy̻vYtfg' m&@ ZHԒFP%CiJR!@Z4ZY' !ݍᬍzmr ٹloOiolbi;{ [h춗.0 vƎF̽|= \BisdlML]GfE^K&R?ɲ* bRAn(W;A%̦{J(H ;(RF)*(jPTPjly|^[[{Ӟ4vX1ڊG*Slgq2̎/XHB`$.b.@$xvI(UE5aMHI\=gՑJJbM.OI8[erV? //| omٟFɌF+|8UuϞ=|򕯼K's8u Ǐ3 E`fEgWsthl [ 3ʈwXhR%#3l-P|6c5'6eró]f-86V=_LT3ϐI <ٹ2E#=Y@$m'1xJ3cjC\ǕS9#I2A>n;ף/󞷸xe=vzkUU_~9sڵu{=/Ç?OUjv08p1s?swy瓟d;رMӴm;`'>h42L¿/_o/mv G60>3DT1?"U%NEFa DܫʶF>UlG!y4F"RP۶HNCvnag<[7Ms饗^{ԧ>Oe]fç<)N:z{ݻwee塇WWWxx`4ٳɓyLjmhk׮'Oflmpt:L&W_}h4Ǐ/,,sm{3kkk>Ӟiضuw:t(o_|3F֠7<'}7~7._y 3onn~7}-r-\uU8^Z۶c!5H)`'ňT8Rfva/OdBȮb?z=m[i؞{)%=Qg1f H$tm777w,T`bmF*NZ;J($H9D A^_=̈́V*hF9<55VNY36yP `WDlSy6F"46 |0&S4J͛Hf c;3Oӥ块\r>NW\qM\s5n``y7hk@{mU .|;ooO;LrGgϞR"t.>NLQ# U@9[ԁdRvLj3$ǖwbfItcެF܆3j L`܏ĄhVmKKU]v<_9FNg~g /j(;*3ю QWW`<>淗 \DLlZb|(VR!vkVGjBESv6$ac<1V! }QrjWRL&B. hsdzWK/N%)Wl-~Y5#(njTgae y#~zp-NZ*Yss;8ܥ]@~_g|=X5MQH:dHc2DI |LHE.7HrEU ] Tj:m Lޘx.c@lA}\Q  w#L&G=Q\r?~ܘvH|ӟ~7vm~u9K߿{`URXRp8lll٣@>EU#( !=!XE{Jܯk&T-5wpۑТT,A'~~dZwyY!f姙jցjBUq_L& T2_cGJFfABH$awJb`Ob |S32uU$P\yAjIL >)lRc<1{!v)Rd˴2}Ƙu]S:t1.E/zh4<9?3?=K/][[䕕w^xݻ766F^E"/rML&knׁBex*Y7)M"2+7  ҦTU! 6 "Bը]DK uΩ.,[9_3g2-@uKKKeF}FQݍF>W\q]wݵgϞ+b82_iO|ы^cǎhԶ޽{_tM^{/"~?O~S^g~;nnn^wuw^__V Tѫ@T _ ATMI{-jkJ_4#6vD,Ry !˳pN%β@β0%}?cuoQ~'U>F/""~ޘn8jA[Tw ^>B3Efmt9 :rBʘI\1 (Ih&\{nQ&"ѐ1[ȶo{%>TFI#aj2L&Ҫbccc߾}_| -c(lf<kc3Uݻw_v1kkk!k&Ʃz:&`""h/Wrl泥$P]#F 5<E B+zٽH1idز Se?'ӕr/ ,?cp:#T dQև|=BP9u M;VAj T@W̒ b ĖZ1V'͂提`E&/J{qb q*`"6I09P跞^A޻g l۶kkk%&mjƆfrYLmx\JzҶl{bnVؕ 03A2 4/|_F" bFgCQIABdCLߒh! $[\Zu{bLg$VJвg7e 4<.;r}J.CJď7 `qwJ"Ǩ1J]bd"e 4QN(5,}VI9)gcK.B-%?܆4%4#}f d{lx|Fjhі6.6I^T1U*kb{^]W-)UN2稔*4~!d|m~-l@۝KeMd SZ=LC~Ebzm7CƓ9N@vP .\v>%>G5*;q:*c 2t[my oOݏחEvY:#'Ԭ옻a33 <9͔RBC sCG(O|c^UP !1H]6l 3 d3PRvC'$%gS\R^ KhUJY bU~Ye:h>ىc<12sΗNTm=XLYBJl]IL/}Cv boFpb |l\2ꠠ J;B=;䩯iILLi-68ZC+ (٢WeF6RGJ"TvY@gK-h"QbcB!ϓ66F8=G\rzR$H6` 1?M4]V (Qn*n!D\)=. E5j/Q -,S)6"l8y8FmmI*Nѥ%o#F٦K}rӜq.U?3!,;3&j= qH}WUHA5q2U%6LҏkTc (3ES~i1F<3M t,O@c $/(5rj"IM3jǎ;gvju%GurdP]crB% 0,)rELQ;R#v"\˳&V֑J6su渜:tٖ1z$wQ#!gՕgl~9,3љv ) B&DwTFDSZ 0QbHjuĽȱڢg<ʉn)Rss2ÿޢE@/3cn>/fՙɻ+ $ !VGRJlW^"CiM];IM$ yf )#V[8ܓM$̠Ҽjdqj#OY\=BDdxcd8(P!Xc=)goSs5mf<~π35Lwf{8%%Zk ,F!r)[4yxV/S5AIH{HK:*V ikQh*iu %W XJ؎i,^ӽyӮܻgD&S61c]i'y7q_Պlm+0_#;7[$ousUj ,)^ A05@TXO-KYx0<\AcX4rc?TrY1۶lHE`2ۦ(]frY1n)Ȩ|-wvY~(YK6Hwn,Se\ZkH*SiJTT+2BUVsN"RglOYd~]C>^?%9TQW>8WyCBqKדe;;ą%ڨԔ/4VWBLxbUiTG@T:"::cHH{ɻs ;+%XP.Nމ2.ؕdS#\6%JTWR(BTZ6c@M;jL41PETAAIʔRY>_UneuzJM.!E%T^=(UȡU " @V*X%<_L-Lt-nh>wgW9%nX Z$7i =yPGhq'Vv-܁:}ul ^ p K9ݴɖA߮aRPFzy@bYu2~ɮT(etl1^]qHGlQQw!05s| 3V3r'*}Sme[ezS3.8Svm̦R`=wF3ȒX[ggt20m! UP`fi qF|u4d|H=k4ƪxEA\QؐmH)߁| 08"wq_`ARW`BҫːU vL,ܺbWdW%H81Ed44&@TU&j(K}EL R-,7FTn3z3-f˴1\ގ͜J=tqU!33;QI |&^乴-?w9߷bȺ:*ո|fu]D"k(>/v+bڨܺXQ Jל 0<9P}6꺕\+jE9bd)6 OM[cGglUEErvq~ՙ0HDMji$s$"Jw .0sO6èKz9܋( tΊ+e&3b3{(as.)3r0X:Ee%W(0|٘0؎}t"HjT 1-E4K9ik%r+>+H 2 [8 ]QxIAi_u9Q}& \ ULz3P0΀Lm%JP X=ۻK#e<ɛZZɯHpu2^?_U )[oELY6syXɢCKV.әfP0aCHi8W@BdŖJaX]\⿒Y]y1#}^6y$XJLKGv}DTO)R%&ȵj$Ҷ׷"I)U@%t( D;vh9&'fmrTaCCƮڙT*T\6@$ k q IC8pѪd[|=Z QA:k,LaM hid~Wn5: шWd\w^iaqk'EIRSSM0ѲyDb/bDUV{y5\("km3!X }y Xк'jLBÐljW07*)۱7X_Qig5g _@b;޳{Xд+6WN?:fڎFx/y2L&T)3$ϢgE;5l "13ZA RպaU~,ݻw߾=_zѮ]{EΜY*D21U ZrĆA;vCڜ7nm};oΕw-V=OtX$+-ږ}G"*c#XaDA$ 7N$v,!m e1&K!hzsa`;&~8gxvS-Tߺ}:={ֳ>:3 !u]E'M=773;صz}ɿ믺Zd&m6{b$vIJUUQ jRƠ6#DbIvHAf\1GBo?K_үXYY! *0̑y*1Ӕb?v9v~-__7K۷ܵGgB~"& RMeu]Kz1 =QR$jlȳm0/J!@9՜@2]4)k!h1T5=M T1ݪljwEac1 jө꺾;C?mJˤ7%QEJ߼Ox)Ƙm۵vhؙICzHD0ysṆٛi V}{_CY<0xn3^`P[1\M;ez!h 4 ʚ;- u+ݜ X&lOh~է]_= O_=5U !Dy_[/y\h7ox.xnOYKarIPZ0/iW)[,+N7&5-`I Ɂ:d"v#r։ܵ܋Ww&K `~ҏ"Wq4E΅23B3{CE{N̠'ƘdZiIHBUhIU7 c{Ғt&%1FUq`^ZZ8r9STg/dw#cuϹ_D&DL-4T HM#@!YWofݪ $be$REIU[JUQPKoTO9fF̑"U ., xrߧ<?]5\&l ǩnsG׋<"B@HU *W%b/U셪zCU,BbPbhBBMT)XTA#!!h={/ǎ޳gA!T \h\ENWe<'}z}g9tӚ fwt΁]qqKy2X)|i$SUHq}{F':-ҋDSW" uCP<< aE(Z2eˎ$HeDd]g6Fs_[N}hvOC<4yI׳!# S[8$}r@y~%,~,7H B*֤MRK#(>M338P%mv}=#1fDz !{{PQ"@=~SEbEbǑS8^/|D!pcԏTvp 6t +EbOE@'[7 \*ZFȩ5WJdD&g,i@[BLf4UEv53p@UFBz2v& .LB"b2چjh4u*!*ԌcOfgXшf#OTE"b$RV$FLb)0'2ɛY$$` A)7BD1Q_5MDDD#5$!"Ґ51 Z@U"*tŽBY.^w,i@%0J PЦzѵt> (cᬳ3=LN913lV*wϣ"IQg'@!\DɜGf:ppQ|? xr-IsSjB,77Ʉt0gCc:ɘʠmiz8:BpL`fb%RRpR0uy# VәxjgϤ?yĉh$aaaa޽&X"&3KJMjF;rرcEf{sk~k{m Aڗ5u fA]}pCcخ|45FZ(F8JSD{PX 0Qd(&*I #h }ZYN@rX@ʝ@ ]ˍ6P!@ ͕;OzF-FH9F%FҘ\?g<~;]'?gBxB\-,g-@}=яKˍ9X>9ΣOڨjyex}g1Ԡ7HU4$ řuÈD !RE#H[Lbg(CP4SkmXIe@!!Qc ORIq`&RQvF DD*(N|'> !$^~&s5n{ܫUWHl"5󳉏RGL$2u1sl$5)j"!e*L՗s>&CB# GnVL}%xM{ _ƒomm1źУ}O8'dĉ}g<bnti t0x=HjC(5^ĸ*BѠ>(q0 {"&@!Df[A2nnCC Rh%&dE:b"RM bʓO Eovqfu7 on@1C5XC o+'f"J!ѰChJ5i<KQC5O9) $3#35TM` UNvxgb\1=) V^rtĦ͕($ TY׋N6@`.3:i.jYMzQ9eeihSR033O|O*1Ƌ/G^B3w Ï|#q+^nsss7rG?ޠO>yy'[#اSUDrCŘfkkȉDHH)KBJWKi Q秦$/p˯xmݶ?+.ߵh?(9z_ՇVVV=~m7_v٣BlRJ܋W_}uf_/سg1.z#?_.~X׃$ *ٜY &OloV oI*@ m(J~~gq f(s4J, 40b֊4M!*B "B@$"Od96 DNT)m]K}l~}GOnQ҉d*N$&TRHqvn5>ⲇ]4ڮ47X 7}#s{䒧LIth΃B^Bvic3D:D7'W֎ݸVM -P"`Pb^rbHHJƅt$Tm5  Tk42AN wC*e e]6["4e\ n=Uu1n@Lywjm~3/`g4 R[F٩uG^riaemXNY_ܻwρ> `kk &@VWWE4͞=K[[_O"f yppi@nL"/kHゐU M2OՐLbE{/DT^H* i513e$U~r` DT7)ۓ"YKUBJ(&D1D4 %UUIzρsΙh|n[H1V E):"%d} Ij;y&[B ^W/F-xE{Isۭ73z\6wGG1 d,kaR5IE$icdu>l֋&m4MJݳq#rzʣQSO3@+h }R4N8ZomuUFNtG8|{\z[}|bHTErJ2o>؟LjVY¡k瓌4䯃)3wY<[aJR92ސE)Y;Tfw97c.3c <j2k/򽶪rQ}Q&1)ffalI>h/2Q4YBd4DO)6u3"3sUUkL&^d1nllF#+ $|$Rj1H ߏ=4q0($TUϽ!fygv@ShUe3"@"IU2>y`!lmmyY!D&2VDb}  b6T7)%g/g[6iHp@ F0h-:d8mD)Hݽp,G P_ OWDw\7:I}e&\/_7u=z(چ~E&Yb)w#@Jm'O6>h䓌)zHPԽDCSQ˛^^2 ^}X )ԧ_AxPG OЌ.KpJ:BԺHD3% (q* ,BFB &MjE@{ω'!3@!F^ O&@مh{ݻws9ɤn$r [Rl튵?U@=W, l`W7'|WU\Mj+1*RҦ1ĘFE/M*j"v|3 gB0Egar!kF&۽5ڼ9uZbTbЏ@K1RLf&žY^H|11ڞ0-nootϣ@++z^/G g ٴS bɬ"瞦^Nދ@Fx.{* 3X!{Ú.H#ʖ(t....Ưh^'/8Z҆4w޺hY0VR-(` 22R,76YL>ŤHpOccc"F(Q1uhFfrY&rn:sybˉw(83ϠY^*b N XpNqccc#F@)lQ3=$GMjv,rR$.z{[)$k(HȨ@іWs'V]YN]]]]Ys)_K1C2//Ya\0gu= gSS2s%،fP魤Eھ"3]]]]^N.IHXB);zbA,Z6LybdnZO1dMI#*7( D-[K-I-;f^ʣ y'9͘:,2OFiN$?]]]]G;+cVr̸RN+!ȱX).tv^Qju-ZO@NWPJ+dKXDs]]]] 1X:$ٝϬ?rϕi@5Ns"\QCqE>[9>4;\HP6Fe [bct1v1v1v1>Hbd1LG{[)T,h"Lʐ\rU rze%pk)|v.~Ym؂z@̱lUO8>PaQSeř831fmBԁ2T&`-:VD`##xa$FT$mΕ,J6隉W@ƭFӒ=;QcWP sbcQ@W}WUKb8(^~"o܊z_LvYT_`w,lvNYGÀ6^kUnvcWPsbc*.b./?xjɀ}(Ǵ )^{ә*G? { _7c)br.MSJJTbh(jN53(NG.̐wȕ 5A)Ly+$ٿy'tc#-`{wLm7l\By6sh0sY@VAUrQ`,$S&<{<RVﳕƽ0s51+DU>Fs 2(5Y HԯvXUn<~0I6o[4ӎ5)'^!f Xz`dZoBVbbbb|pys2=Մl:6x,./#;&,x֊b*Tzvcc?޿y{~yX?to5'NPX j!pf})2q6.C]0bP+T;7 $oiAeR0AcB^;>]b$j1~WOPo[ϱ#mLf ;DVr<@b)ү]OF+ʠa0=@I6\LNɝra{ϗ..d B}Ÿ~J3oH cd k%ʩǙ|WgTCd  Ʋ H.qsUw0`ͥ|`%Q"X'ި..^,hĘKu?״c3]7PT&(86cdQur~Q{1`\ҟ鴔_MfSRM@%lЫzv*Tbb|!q)4pR[bس10H% I}]_:FZ^^% mceU4um):gNRv#S(.ieeXFFX#iS F @$HԾ7&QMȴ̕SK@sE0K!TLZR6,..|3tç4=q鳻ϱ7F6q̴ɥ’\R`gͫ8i [leO24>>)dsIM96|w2Y@Dpq16>V9jS02T*vbbbb|h{$aC!Pe`g{jBT^ +J嚓:ͲAde)~nn2)H9fȈ2wTR!ʾbbbb|h]vٻdS- qMfUgh9(jI,&,pBΪJ7Sc%IIq*cd"A 0 D*J&Q!  rレ>9E"ƣ$4d\rg'(Ov92Q e(%+4#[J`vA#*-JEmflɆ^مT J^D=I΢Sa0j<%%`)KKN%6YQ!ʓ^EwJnb fo+v`@})wT<CgRN3E2k)s sa[~6.%6!$(dS_ߺ....Al6HJj2uS;JHR60 U><3N/Yٓ9d P ޒ"rcjZ> 6>VP{Uu1v1v1v1>Hbdp/yV%@LÇ S͎_*{/]{ :Oy9W6"s0տ m(2K0LKh2={L/;&P3TA@9)SⷒZS.P 9U x@Q0@d2O&$U"cP`gX*vc㗈1:#H0ѼmK iAG3?yɿLP%ULVB2Pw=E*_NJr$*~zR DOIG;5677pk{8Fx{=nFDԪ e1Sy ;`GUD$"̜=~ @Nm+B`f"jnn ٹ`n{33;~H+ p"eDP<2QL$- ÎY~ ;K: tss }v^Vni koֵ'WWֶp{4L꺮)%iB'~*P 3W1VUUUzR z=U![s&1h]uUihk8N&h<&Gu]d2:I=L&ixlCMW $1®Ņ={,..ڵkϞ={ڽk /[~W1Z%2׬ܶAcK $-f %yJN0>|d3qeΗp7Rؗ'T ̑<ʐ4gkJ0ws7s=9|Nz4M])%"*_|Bכ?,..^7`PU*X1B1{!$ !e '`43V^)hD!TU_&ԤRz:Lb13pj&r8L&f'BX]]%c=IۣdR=OTi<ܜLU[[p8pk4u]гhh?v7v-.=ڻwރ}b~W@+Z9$LwϨ1\Cl##ayU5a".5+5vMo>aO~PCTX ÛRWu\[oo[9^7:iٹy+A}_gfAP9%$"Բakh6u]hRZYYh$"hⳞs={H+ş^S|T†e'<[(>J Hp OFX+Rri;mjX].Ưk>w{?tݻ:tueUZOFǏ?rʑ#GN,LZq~) IJR4#&{y,*eDHc ߩŤ]V1˦ kGLWm+7??~qq#.xā{?3[B`}ms=uر{=rȽ++kLJD.g L UѶ̽iT+$"c uIH?sID&"Eb5oT*+STUlDPRkP^UE5TC> %ImI5 Dk6XFq]'h8'ɤG"MJ 媪Ņ>۷o~~`vND7O.8vw{IOz^]pa<~1ҊyLKT@!:+άlh綦p *:v"Є6:D=2dcګ6$(7bjWbo~ۇۓ?~]zן^./袽{z @MHuI4*iBLRmUE-*ej{ȅi"+k;[Ej4J*$% D5Tʀ{Ce4A ij_SLeGoˢ dmAȄ1QJu[m)IӰ"BiA=QM9\X?y]ueOzs/'|N?:ݿwz3{LOmNQup]~ԹD[)Y%D*{;Fލ7f VE b*e+;p<4L/>]G^yW;q]Z>~e~S|ɥunԣɸI&HVG%4Ȑd0T @Hm/ /Q׾?@E$iU%IJ,k+S"*M޷j-Dٿ76EӥSLPC2 yو6Va%04`c<|~|7}Cգwʯ]w5Oss=;0&^Ξ(5=[ESVMENDIlͲ6+ HU$m(OYI-I`'iS$M""$V)[Ul^n#&%&)r@RH)uv.ɁEGF+'"r->D%40HvɚU 1J =s`}]wDO~3^o4o{=ieye ʛ 2@Ղ"tJ6F $~hqV\?~3]sœHIl \Z]?k?W?+++?C?{|eyC/ǛI钝}^p4l5luVqT6рPU'BVHSٴ:پ`DiZ$N 3[6&Rj):^iUs^ND%j"!AA*H3HĢ%Ar6)gNA&_ VQp1+ɩO'Q Ĥu2!(DIU8)I)PU[J@v:ѪZh{Fwm{x}v<~ieyŜjWB”Q6Fa3"LӔFӪ6<9Ij cZڥ7Gn0U!8ȉ v<5Ei;16u=e^׼v=O,{օx*J{[jYyWvaUJyEl(W9$bQXL2"3S8"kI#??'E ڨ4 ݊IUa$'uݤ !d=HHFU/QR%XsJzGalHkk$IJiӶBȒ!TU ֔Dv[=U 䳸NPwņzK.;h˺h1oo}#/?KASZkk)_7=ϻ|#w?<;S8tʫ"R=IQMdӗu*˱[B[[[7pw]Uh h{\@UJH +7B5KKygnqu]w\G\sͧs>{'ƕRK9@7 3n1=X10&A[/,S c\+!_g T2}ZKrH ]ۿ^}gu{t D Ƭt< 123mm|udϜlbTF5RAD1S5caV4ڈ4HG:ޠOu4~3W>|UUb-H[T>Gh Dm=z׸N/*q׽M?=^lp)l_O3M^Zlw*>j7[."ӟ39l>Ռd '6NBl -}]?k{K!^[xkVWWU&>+Kgl%RDJ=jk Vn idZi!a ZR#n!iHPb;qbue_~׫/z#nC?~xqankkc|[~ oŅo#G7uѣ|usM7_gϞ;n7Vz-Z\_}><|3{ǎR0DУ Lqav>L?e+&¼Td|R&DT4De $i !Vi!Q4iqqq}WԬ'ž>(2Q(i| q38*ٛiYh=?33̮=Gy<=F{1'{1~j`-fY;~~(_S)mfEf9RΔVgO9A B!?k9^SWGd .J>iO!_}/}飮SnK\ɋuqӷN$ r N!n]|w'IpPS\ˏ|/ٟLofyyeiiimyeϮ^荶7YEzcmm&V57w~7#UHn/̞8zⰺ|bЋɰiiͅ'gf{ۛsx{+Bo?qDL:(XgDiV>;$ I, z29#*^/h ViTj"Mp`R&®nm:hN=gɪ=ed4D *`$)"<xҾ{;z%\s5xzDj=:$)|E%;N0`Xŏ$nR"ր!jLa`,NټO=}kk? ?Ji{k=@TC9:=.{yw2Lm~3E袹C8N@.Pɏ}3ZUk疶7f$WqfkյKgLČz{76Vgf涷6fggZL]VWWw-]\ &8^ϗnm+QEWKLtL sԌ&ÕA{`Iiz-՛xIVjMh ɤ>^zJ^`qq+d4Ї?6;3&h̟u " +GGƊs=~؎1lxQtR|BNٻ#؟ (tVνoݖӓi6rXuYQq #QNv1zӛ~qsc?`y*JObbv -ywml$sI2Nii'@"NtϐF!O{3w--~)5Blj d<9쳭&hL&wa]>?-MT!F9q?^$fc=|HhߡCv1Л[3{#F|2qSo-oզP3фTC{Jl DQP*j &!be{D~1I 3GȬh{3V :äLuyN"m'"4Ya$ VW?~sw]t?7.bc(G}Ωx^m@5ĤقOy7Z7 , RV΃e֝^zf./s:#aup)2b|XCg> O|eW\NI{Mqpoִ]7$ 2MWAP||p` }0I% Dh$W>ɏy0/`"dEn.y)䚒{)%o"9#x94_!](55F$)BMR !6MC$ɒiIYHIcO(`@mjuy.X%p4ٜ5 '$Vfd؈fI,Jj@/UW>{::t_vc1(22K3~ڪ"_&T ,֔H[Z ?fmbך;@$S%ꍠBu1>0bϕ}x;6և_뚕4] K?CxP:c\#B ΪW U"I#sV2Ʌ"IV(  l y^rIDXUIQ֘k*% ET !H55%eE ܐ #JRQ*6LJ`hG L4o}/vˍ7<_ݷ\tEGtc1ZI)fєo&wu472Dv2o&EOPbb{U )MJ&rsvL,ax)K>qeyʗ_|~<[k4 ZGbVZ[56F?ǷKќNԒķFl U ZO=0Fb$7Iفy,`hcZJI$PBQq<2mR %-Hc"MI5(Q.9HI66#)% C@J5QUm !($$hڨ@@?9}2I]U哟GЇw_F]wqJǔ)1ANWRN?r&a]^ڳg]KyEj4V:7h1ƌEBv.^4@N ZmrԆo-fgn?NiMfjVv$S-S?LVF#sPLL.A e6j&%(Q_ 77>ٿ^Hp4^a^cqړZbG jҢ6 bN4mDl>-[j${dcAk\KUKw1?>!@Kq#G䃝P!P&$7 lDh:LHBRJЬ++B¾> )!hb.d^0&uVM"PRTl:L#( '6R6¦s}6vuJih*U D e8QJ8DUAFXzO'~jDH3AH"%A$[ "̨d2IʤT97e& mU XeMAtc VWWv/|{K i] E[WU~o>e{_MÂ4O2_DhMpl3$cYVYi=#gKY>xc<|}{#o/wCv57i)ĕlTX3]oW)Vm ]_׌N-юSnj R(%mL6,8B X!1 irlaiطz!Um;ߎrO8R$qe$1y_x:!@D !Ԩ+LsN/Te"bq$j4^/խݴ=fQ<!F"* Nͣl^ۡ@`\!2^'B!ƔW_zܲ64ۅXݪplS #LǸg^R} {l[J?oUd[kNgKm2w˾Tsٝ pj<Ծ`|3$)vnJS7m0Co|N6\NZ<ɾ` B>5{K%0gg混cNtϣȆB;Ole 6BQ0ӆ2zFF%e{'r٢whO Pj\s)V2)w19|ҞcǎZZ z">@Y[UeR&Mʲ.oesGIR*PG|Twtk]rY?G AG iT'rZͦc %qGP\/ݴJ:n)hq⪚$$q酦)M*F=+Δv('G@)?8BX_I))tmm{-F6ƥ@Xr  (ieC~w< 7\GB/Iy(68ٝ7Qe`㺻[L*49D V <"B>T 匜ު$;2ҺN\0Gi.3c=n߻RGU3ʥA6vكa{-LVQme42W2ib{uqC uaqY`,^o9`Dž1~*yKH,v~v I ""IV+ȑLXTPF @JÊ@$S)K)!l08)28?! "ֲ&QZ5Lj mWHDIgFjOژÃܖ/y]4*)L&h1F+[yGHShzӊϢ,,w7Sh3̛+{16NI`r|zɣ`Cev1& tԽ^ZDthHЂ[2=&brS)h&Z0:r*hĺZm.۸C29 fH5-;D~4HߥD`C2TB;+TNQv85Ĕ*̬IAI y/l@-̿| $beUUP :gX.j{g m)7K|? 5lfS'd2! 6Ky$ <+؉mJō*:}|Xۨ0S\UoD,f(-L4Ђ| tt1X %/eh E~m}ѝu0yKW2zh~j ?9O=<h'שV] mó Nu}՛V-ۏK)咷:|gA 8II9x;jm.JHL%"ZIBb}yh٠nP=X0G|hSdj -&{U'YdlZca 5(Qb˘J[#yǮ#/l?ŨZ MPboZ[lS9wp@]8M TWeY | WSfGeݭC%}6b4FΕlO5so݇F5EFSji8ӈf$1YS_Q2WG% לmFJ8Ջu# (Tj*瑘{7 ]dyDZ\Z>/*s^KRN$ήM:~u|cZp1º|.3c]D=""Uɢ[t\.{@PXNrjK"BpM;.5;ь mTX4S+H.+l xe MpQ$;|HH;tb& i{2^7x-_G5*QX%tG魦ڭy8dHm=>S+c_v7*Ť/()`msۨX!pU5'rwRn'L̠JBx,brn1ZGD&{ $I!^2 TL1YHe@xo2;(n0%g4sR' "hȆʅ|-2.3#fmf]Ni\Jv<&ez͗zUmB1{|*o~ehPQ1ZF=E"YUGDPmIc϶%g+M5$$ J[r?CVa*ן${fҭZ;˧EJ 7~Zݔ(vRMv0@YEӄܭhC&Mn7j<\qeyc}n8BĔ\~o!`=!sӗe8U@d,w-Ӹ"Z :6fQvh27>o:oLa$p`t15H'2XXI'(``"asfȓDο.,J`>vwGbB( C[<Й\X^E#c^mU\D\LP@HmSkڞ>"  $b&pieER ε1u4 PMd X l"i"Qs)"*K-;$R`ci|D 2}f7P*icyin$Oh_[f"u{Ͷ~h!ޗ^ME67{ Mn_Yo:L-Z:xbDajJպd M,"M+;hj⋪]Д+YbvIK+ =&vG(k3 3!s%|}.ïzcS 2C"lʛlgk!$"4l^e aρJrxI10bjd\x*i7)^BOdݢl-ͭ=>Y:߱t4^C~?яn!Vr3m/Mwϓaj%Qq ʼܥ֧eaZ*ԓܽ \ ~u fR'CIɞWbd͗=bN/ e1UԖd•hp QR6ՔE;2/ Z@E)§Ux<]- @2b'bDYDe`Ԓz̑"6-+YMhOszsS:AGDl}LJHnY+4yޗHijVv#rX5ƉJypIgSI>lȉ2 ӛe˨( ;m=3:LwvTut&xfcRPLTSUApl}mnQТBpS,_ikO9h%1)"PL?')@(Vp7y?&[5lEV9g+wB $d {He ZoC<"qm3"cLDШQX%P)~ݒѱJZ]ZܢQϲ%!Q!XuSQy@Dfגq*DLeFjSRb14g~eB¸ѩH)/@.3z{T*U~E{y4ؠ+)wz ?phi,T4BLm7b %) g2gJws[u2"Ᲊ12eL ْVR1kx vLSoW @l |vs2G댺Cet!"sss?ioo][[9sg|S8p஻`׮]kkk>>^{Çm]gtM_}[[[1_ݤ2<F%zO|7|/&^}{K>)O9z𭭭{iO{'?I{iv`~~~<㹹9f^__>Y.;p@4]ty4d2>Q]p8|S: >qk_dWZU/K.o'?ɇ>7poo~TՋ/ _7}7x^WWWSw\pe]F-r.{ww766瞓'Oqx;Ü<?c?c/{ˎ;=occsαٿ={p Ǟԧ^veMXگove`0onȑ#'O{ѣ{??w/ғ}}[[[Ǐ]^W_W%C׵Bn> H٦[sԸEi)$ nMFAJq#Ym6h&Zƍ 2g`?y@Kl,"xW[ ( .䒫W[h>O\xo}{o~#Wr޽yCk^y;?x_y~Ҿ$h/|ws~~~uu-oy{þk??}gggs ?__y_|K.9~ܜ}g`0i&v뿾kcկ~OO_uU("ۿS$VUUibf"nܙ{IJ^cn\9GdlI*`6n]: Ҁԙ^:Nkv5.`+[%.7˺pO*d?7rȫ^}ysl}~DG~G^W]y^{=z|uvɓoWWWw}뭷~|ݪ ._}{}V]Nw(w=ۿgg_u_xᲝG?#?#UUx ^YzKKK7|ҷ~뷾mo;xu]wgoll9rcعЇ~7~cffO8qmL&hR:4Sh_}'NXA?}ԣ3  B`~&D;ݪ@W6఻j6e '?m(Q+uLvK(݊RԡeZ` %.l28.Š0%,8B.{Obw1C"K*˷0hB c>--'+*U=;io}m5y_w,//o]__?y_~7^s5k/ſxs?soy[n[nʵGqɛnn9k^ɓo; oxÕW^i{k%/y3={ݻwaab"v=[mmW<Ҥx<&'O~/믿:tч_?o{M _/?#?v=w/r>4)KUDHIj6Lq9v#,@uң`4h4|YgeZx<>rHCaۡS ?u.HfǂFec}y{k-S?Ed`k rlR5xSدԤ,SGʋ%30&#['BHS,_V.oRvMf;.3d?RՔ&2" F"F̟(K~'~, DxC{Ӟ~vuuA;Rm/e]Q(!+p;NN"YYY1*/5w7DɟM"n)LHUЉ;^666Jg5~{{dڔYp"jL݀c,bKl)Ay6ӻ*h]<㩤$ȵr(r(.y6!$A+[;ïف;fڲet1IRWU)5*)(Mj77biSOOWmk)9qCk1l7 ŧ,er'?5ٳ[`98T~WAp>`.ѝkv v̄,3.wHھ8CJ)HOԛ\YfN&$aQAbRgf V#T~,vųmRm.,9rEFQR*R#DWvEy*C4qao䢊.3ctSZHvfZw ~+'N )%*\~JD"qqJbwK)k9{C2~fE$ +@}|fU;о`vD8-P0(sem/vz!7 e4 & fAR-$=@Ӯ꺚"Q6#kBu 8_4() :%++!&6_u!Yf45Iʎhx&c$3S`TPźP_yݕ BPF ķOT_88 ~+@gRAS-'A!A%vQH,2e$岝l(s'fboTd7jY!S~o)w>e"1PLG1Lb2sbíI=C׫Dy]U2ݳ7bS#z L",'ș`Mݙ36$`4Q֦́ wxfcT'1йrS# }@ؔ`@.6}̧,EY֠i4Bmy!rd;2buڃk^3im =]h; DDāEB8.l +)t L87}νwD[g,\V)Ԩ,.-~B,)2{TsM-0r!tϣKS~fͮb* Ů՟S.BB O>~NU)$e*ۙJәպL\]g*Fw%̀-V 7@HE]S勔U"y+6{XyhfT9}_\;*" n3u|`t p;^x1tѕx!UDM` {ޘ#s-ʻV BӨ2qcFJLaSWV` q-?"U5F2X*r%jFE3&qOFb"Ab!4yc+@s`K@O+Ps71koiӎ^WX*;4+2"Rh1.3X1ԭ9%6 n z{n{kIfۀ^))Ő E]e#m\رfՖ-^KmC6,SHqܣmi.#cTjĆĻ藍+61X Yr?}G TXH)Q$"CFN?`JS%rw]}sJ:{i UQްQݪR 6OCbm5H. +k"2G}Ud5ճ:%sg2B2\0bAԆvA^L*̕3mKH%WxFcJGQ/XM^mf헵;r η,m^Ֆ~)GP&Gom'$+@+aa?>OZ&PR-YHPIĂt5=+124(% sjhlasdcX 6_R^J%Q⵵U̴ATra).S`[۵|JO kRL)`V4yTkΝ3b/­' qSYa&%|0d;nGΪ.qp6,7&|y,)w'oIk>t1SJ$)Ԫln٢c6}w.{䲔wŭ8P ӥRʖNK- K{oUՉc9ioߤ'-!$ $t#"@P}?B-KJzZVQ+E,, }k9)0v޻P%pDDX^'kwp":8y*SM4%zUZoZnNyLoEknOh>Q,ǡTO9S}bf1'0ۿ# vU<4t*^ <b<ԋ 2l^ShbÈ)G$u&S|LT^Σ@DS{Tafeiz"rH"_9n7<:i,J6c 1e67I^2zPQUoW6s0`pxÉuHrqG#X 7߁A`q"pFWƲa~Tފ:ꐕp^v|3g˫|ʾ'3Os7rIhyIVApf%,"@h΢NaOu;NQ"r-Sw̠Y #, ڬE2aB$;`> lk<5S:"tO ̌([+E)YB̜_'/zD-y۔lt(ȶ w?z"V,^EH d 8bt$Vʟ? pDʹdE?+r[zrJX+o̝s{j>G̿/OBbb^vZQ5$)#BU= `;ci鸢D))Ihc= l2PJOaq̚HvJg9ObJHD!dQ\[9E#mAWi>%.sss^/2yo}w^Y1*377`Mmç.GDB P?>|HD$Q079XG@'7,qҘ8BJ<{:E:|ÀHCq/5:#BA)Kr2!".p8;3~}:,V^엔}i'iObI"ͰcC(각PbPrWl 7c"SmF$ScRM$ky}]w-,,oo_[[Z2%/^r9JH"}^XXO?,q<)^d̕7!AָJŬ%ͥF&<]Q %k(*evd6 iʧMRnD}cJB jk<5B,!aDR1FM-DCe/{[޲}T`0ZM0(kA]n)נ𮶎?!O|O_WF^獈Xu`0 0Eޢ:ӧOܹs+n׷|72 2Q@$"(NDtJ|˧kG*ѓx<!TU8zau]Zrj\/%1O&٦ޫa.w)Nd ?׬rܙ7S c"ϣGclB=6)3sGO$1}K^5Ua*z 9l& 5@I%5 ҩM~Q1!)\y].w3WU5JwQby׿n۱cGܽvduuussS;v|w3s[rqw[p_$Y9^l`ٿqK.lC};~5<|ѣGŽ;ȑ#Gu5tnn9rСx\R}+UR#j~SEo- ,*;$G(ST 6qb3lU㱮&IZ!^#/~~ꪫR}ǎz׻?pС__8}.+?3?g ]\677 _Nw?{g4:?GO|w~wfff߽o>kNtoVܕW^t-lnn:pAF&Fqٿo.7}֧?+%pdg=Y1/˺kx777gff|3|Ϟ=K_ܡ)fy9EFLѾA%/>ﻧH)K{|S%bR2{?<)ťv,1ñx5wTf9Ru~$Ɂ$A2B)NHb9i]1>q5A  9eB1PC3E ݮ*&  /ĉg׭~8v[/~ɟ|W>{F4~'wӞ7ˈxʯM7ݴ}a Jhj~_믿>:jS9lx GIdǾmn_?K>v?v"~evvѣGg Nj|(%XKr/E8)K`;hi2Fg hCļ(9:J&@&`3JGsW>ߊ\;blTITZNp]׺ڵ#WEl֞ԧ`׻49777w7wݛn ~}ӕ~u]wu{{oo_K.u_ر㕯|u^xgQ~Сիz4ر Ox\{s@! dm}%0]kaW~ ]qHg$?>p]w]8tJR&Yaѷf)&Ycfu8ya6 1N,@/ڄ̥P9qBŸ;jXX[ + !*=DGS)+>M계?nk| )G3u(.3K*^4\rɳnOs+Rw>|z1g YodfLc<F#VV4pnkkכz-t饗v~Ǐ)˹ޙn[oǥSMk蔗?J |ibC-R̓֒S|&Ê8gH(37!0'CH NLAdb"!`}:fd'QLrw S31y# e5Y^YlPW&1I9#"K_׼5mmmm0\s5sss7u ID7|ǏkKq9 )^=yw}wx??o߾5 *4TUڡCSNmnnQ]UU{Qyn@[vhqQc!a -a}>~o={looC<;nIjm-q C:!ٓy/%|/"QQg猷>Sp"Є%H~Qf<,1@0Z i2h`E1Bf*_hU l0[ާޞs\#": z+XaI̡T(4"ihpaaiO{'?7 _җys`|+WWW3R?;?С+%^W|oDDkkk_ٟooMo_ /pssSXukkGyJCp8 H-tr\|!mmoo޽w[n^.HGz;j4:;R(YUUU+rLGTT>F('-mޘxu]K((S*1pRZY&GR?2 !_yCnsIBZJv==37-/I2O'Q$LimF}i%a`(J;y@*6B1W8|W]uծ]666fw8z޽{wХDMԾKI4>#059E/zы7o///~^z+^ n}S>o9oI3="QđDΐ}TC\re]s\ۧs|c۱cDmtAϪB]׊Ɍ2Щl)[!@"ntB5RĜsꩡ;h %$B `d-^Gi+!Ji6Ĉab&b7LgnQ9/}TmFbdUrP3(z&,L'>gfffff~onn^s5\s;ﵯ}N8k_^__־}5lml2OL 3.ne Cܜ헫taTѣGٝ]~{z2=xO²˰] g@AjpLb`٦{%s1:'\&-ϫ9LUURQA홙7F-f!tWؤMG/m(. LqD@QY\,3>55#Lam:հU(ȬR`A v”e>Ŗvg295Efg~P @ Ҥ;1|CRދqUWx?]w֖sn}}կ~>?|3ݻ? RD3 t襗^z]wmoFzuu}ԧ666]G~dΝQox<+}#Y^^/"yK^r`p׿=>׷/.FqeWfЯ4@c*QWWȄ""øU+CS_xy{{k !(/x}Fў={'O;v/PYljO{tA*-#5JT>uyؐ; pY+<;pm*>^mSr&:ە BRHÊlp5 lcH}{8PFy&x"'=Ťhkr[9fݔlr{I)@ץ!pM7)|UD5yMAy{|}}k}SZ2XU/lf}}]G/}iqssWWWʟoTOfeeE e0_9c{{{4e|\Ν;S1.s$SQ%1@1en|W֬Ѩ"/V<z̖T%pǜ{iqv(  K,%V4d'6<ɤIQټ7gG6լ3C]iwyo>#- yԝT fc\[[rPπJ_deeE=QJKϦ̼LrC]n0iPxk} @˂JHFt8ƀcDt0 e25xcc1 ~pSN+sY|ԡ/MKp&_S֚24g1L73gq< ZR7XE" "KڈdBrIP$7(̬"(,̐Z*٧xk$"W|lຳUKG6c2q-\JE{κT.(өEƈK1T5C#g<$ я~ ۍ"g =/cȣ H.ؑM 2%̕Q>Q2׳j٤!G$ɓϒ^fˏ3Ҏ ^|4Jn_Up>==S"Y'Q 8uP7)|?#zrrtDBlbin^FM%M#tR:ޔkzg8숹 MV-Ld )8qI-# v1+)Q|D1(nԓ]\;ZŘiX(kL #%m5ɣ20-s2P׵{>OWa/ܯ[L"\yA+nWuw)c2a˽8:BZg|<|{;`QPK܁N;/7z*@`UUdt@ԝuyOr`+߫ʪ%[3][.MTUٱ'7l?zr_)tAk!"bYHM@&ƀBP}N;,F";aMJd[h}%<6b@Ln"Slf7? iȭ:߶s]#Hq! F.-N֣_9 -r6)EhXg2n*~3cyӗc{NMzyXL];  ॗ`c5H$ c=rCю)J7!o;2ZEIe.^e J+Ͻ!ʽyyi>`0'ҦQ1w?GA'¡<aZGjTыOD5E(~aVJw RV0LR5"^TbʻdɃe  bJjk<5(_" !FfD1ȑ:N%YW̒% ,I)=q^>Jڞ_Ay^`]Xے 3(҇\%E@D ;o:ɻ2 n\\|u?^UMUTN 3U>l&3+}D'SDȡ(xd3yDPC>4v:5=駔gIh3Ƥ̾ $f/6H.$ $3)HokxLvH) d⚯>9xjD_ֈj y{^fiO/lH{r')S6}nҔ0 v*n3H6yX8 Dїu)“ Mk9i8XsTE%%/[|rv4RϟcYnztH}ڀV&$;EHf3WY̱)&*2t!qcم-VWT(?S6љdMI>uxLG 1`7Oy/(/BY^5΋~xW?-)k}C.5SC@'\iF ^# 2@2rDU@v(<3{*32{i:仪|)^ړy_"g'Y޺|#mB̀H&jGo+}.H\,4: @֐m*JOeQPhg!LR-F9f]kҴդIM 1q[9QNn1FA"z]P>lp \1"s2#[ dRY.7:+wM@]Fȃcv]X#G7ޖtI/*ћreWDEg4}Dq"RCs9jI4ju"BnG)*Ւ^² 1>{ 23U zTyb\Oi19 m >_QB,Ef{i?3_\ D'J:ff*jY^ (W)hܗXTfU6S[dU8d//Amu&(]su.8 FH$$!r1Iȣ{}+uޞB)g*M͟Bv>_KX<)%f$甎b6kJ} 8߄Nxf Ka荞%;@N/8 tR Z13KaBmXtWOE-#$FWɼ_9ؗqH/C㜫 JaSj#J}&=,=1FT6%<Ȓ3uUj3ux{U| 7 "QSDssgwO\GDD3?hnyƜ4oHr)V'THa 5HnElL @dp! S*uO#^rL˩JBʛu?&(A-$q"1A c^3Pi1=g+>o4H6ȝ"yggdr,SK^ C͔THPyD8bʛSJ'RL?{~v,V4Z(lcʩ>|UѤ|AqEWkv1o_4!QREY EBʤ4"!s 1%,J,P@g}Sa2#bE@LwCGĩi$hk<5PL.(BD%Z^l;Sny+0/+en*OuOi%YSěiQS~8% =fͩICE%w%)~/C\е[]:bn173̷1me01aL<2'1R潮'2J qBzPRPL~sXh)VuƜmsҀA.PZ&8؉:1Pc^2@d [2 C,\bh[Qg/Wƫt";͒:YR}JJGOy52Q)eSyoyZ%\.!L1*oryn*#Ț.*_|Ji: Y7RfZ# &QV s5H_3 k{RK@ ./PX썀ك .p,a2FL136 NIj,f LL4br]kk<5Z0Hi,"DdBt:SC-賩/墓\_tQcؒ9-yYv)y cM!SqES}%_p}LM4R|`Z)\xU1f*S+sIoL%Mv+@B=(@Rt, F(9"h98 AD2o 6b UD;豩쩉Зeg 혬MYz*oRimFD [F$KvQyi:;8/ͥaf}T"%qjQ־y3Ixy+ٓ@(@ X,QBeT1.@Xb R*]~'l@rPT>;Yߥ DHÉN){X4 (#Q2'7'}K$+&r`l-]SksW@ʾo(Y^C㜢-ė?C;`2d@hf xkDpLMȘTq3fKBR4"@]jIlg! wLY}N3kug,%1gft1VB8*ONթk_?)_x<!p"%xuD5CUc'LɆ,EX= "q(",N QU={毿ҧWEW]uaѡ6a'aԕӏ_?߽x{m ݯzx[ԌO 1&M&!\>-Og?Ieߥ D (ƉO 4@O`~` 4#3XJǺB*J㜬BI0ib^̫A$u,q4fn#fDFBxGqnn@HE464}5錄x3+ƈI#Tq,4rfX__U'Jbn{̅?SxmPgSUsw9 -&!hU1FH6@Effq؈R0d T${]ӓ[`(k,1F Gۃџ~+{O_s5kkk"1 jCQT౪;q̛u|e;W<Ƌq{~s?~ {.Gq̘~h„e<ޟGiKŒD4G+Ղ@jA}b l䭜jLTANv2h$d5L l!م!Y # Gh("d0Qd*x> xJpcX:~9=z;}4Bzn-3dUTD4 ;w;v .Tz*:Dckמ'Oԑ#/~^CA퉏l`UdtFcݧ DX=k.42 1̙HBw$*7Ol܋gnٵjpxq糟zammSO&z~VC@iDfyo^^tEHwɍ-v\2%,r,)"oK<y FH@ .jO 8I.(:T.%6vEIaك)wJ^ڣŎZ۸hYv [xnk$t3Dd9  O;tˠV43331F}պ%)&@LwG8E*i)BRDcQ@avvvm}suuuaaAfvc2sssfe \ʷ xk4&!fG)1BԶ$Uy'2I>Q12'ZtF&dqb$߈ 4D#Rg_㿰0UD=!DXw>s;;06'6dYL`/m[ Oi1ЀhSP< d ѕvV,q)(@:2ARԤ=Dt|nn&DDz1pqМ\~UW=㎧`Ѓ5GZqK 9 ݹk{zvBr. GwݺC\Z6=i7 2ׇ2cҞT;v߸7!zPOJde) cVjMa XPuFz+sT*2>O'uDƂS9s%g7ZB]uI<ι>i&G1#bIFcR]u:ϴh4Aab$._3Q3I!r .B?p`P@GDq! GUa Uh!!!3 09G$MA2CF EeJ@cq2:5 DJD1 Dr( Ki>aFMAp@.Hy}7";.aBF& zȝ_\__Xb87|AY g##"0DCBADL.3SB|wv)Fc{2>#JTPL͜gRo Of# I=(C%";4hk<5%' !݉'аeR8i\dfʸ !`0ݻwq̐<32~'N:uxDq9( \B3'|W2PI\Se*[#Q1 ƞ0& b~`{FO #@ $BN}|(%%3T 0͸WfLÄ x.kt޳! J %&YoB$8#A`O= ?|ĉXJ߿ǡCGơQwpjG?󙛽kAPtP?lH*[u;Nl,:p\<:p}|]^rP_LWy "Agtzu[YytGsacUa婮49r"߯]cMH~Ѓ<+t 3"6„.:Ѕ QwaO;xcr_>ޜeF" @7vl4"d"4T.ϣ5S;B/QX/L̄,YDT&B > ! CL1>loҎKIxnk1FM4L|T40=d/Ìgg]"RIJx<믿k]XXМpO~333Nzjf!x777oCvzK_o&TK.vӹ+w^v%ݪ4cNR"w+ۣ@zI!]P"J|'Γ.W^VI<@:s0{lc%!x1s+%TDXD5reݡB0X= L%. v$("T |W}*pye-4CGA蜟ѥW> ?e4ތz?v}~i3r?s]#x"9LcdlB4%g<*sSO22&fiI@,9оMhHa}G,6BHv |?BΣmH0K!e} Hl'hsKDbJ"t6rrf{08/߽{gp0K^9waZ\U?rxeeEnz־}{6V7778~ksZјDZQ4c:WyNrCjFtu|])ݎPU;'5REkO̊:x"P{rNǺú+ \SNCW9WCX9tWu;{y؏]'6مjյ&]'|]wӇ4Y"8 NbHA)y'WAZØ*#s ݿx;[=tU>A舨+7(;x R͞uoCs=.5o_WΟGo=.(D št Er&BBIdafqFo2wbo!sg2ޛQ{OlW~Y}E^%&QmF$vTym0ʹ"eg! ue Fv[DĦi$ML3 c{81SZDaqa#s q@ߟj*HF~ \`F=,U|E#+ㄣ$ NՕhSȇfI 2 rlu$ an{`|c' &R (Uh4}qDT; 8B$nb"Nʑftr/K~;6sdn4lFÆ;I|ļ"u$Q]Y?XADխTB, UoF 28 &yIY!*`M&KHlk<5VU57c!ّd (͢rons/=gǪuM9T"+Wu{rv{?Nrnn.Fq*M Ȕ"#CHCá tXw{t\|׹.™7B5@GU弸KwSUU; E]ףH[̭ު;OY]@YA|LD D@~U #8@_ }㯿. rs4eNppBaYXwBC^@ * U&/4GٵVQP;0&??s7nɓMD/"4,ZX xZ #{$f~nOψ@G*ƍ6z? s{o5KW灛qCD JBIe16W%g0ACi x 0SLS6 HlTk&l 4LNQMhB.3A:?7 icslklklklk;]G{d|EɎl` aL4N(GNP>.Y^wsC@P`Mse6:(NdM+< 5zT$j9#(fқꂓ5! Q1Tckn8]rvA#-0t H4 \x?#52r07:OF293Ey$Aac7PØ,/el Ҹ H1mIO) @8WVVOɗW#y`;d|KeZs3*?L&R2WlKHUU xD`[c[c[c[F\^Y`y#T1{NiR!JqvɩFR$HO`'6gqJY_i:,)*]x@0+H"6HyW%H;h,YXg8YW2p=arD`Q䪀y`c0h k\D5KK\Hn=mmmm 9QePsQ V})1O 8me$Ã,WUH2U5g#eMx};%tKo(Ljklklklk||H6Lu [%=<- 0PЎ1u&!Ʋ$(Dޱ^<D!zԃbS>e>F@ qR#WUsAd&MPEfKfw0 . ifPrEZ&Ade!N?%H١bCfs6c"mmmmqyyYHl6\02@TJٹByɠr3LR( \7J2' 53"9_5555WVVR֪+lXDHDWmsbIn {cLI ?5%5b)H&Ĺs|>1MJ$`Ummmmk$H2)Bi6?F`6J7+G T(q2+`Eg+mpQ?HdZEo$LIr-Rcc~Oc[7WWtQҠ$Y Ur5`0ZdTlfh}!$'df/3"0 8R+kmm5~`Ąvk95~35.4M(5555>j$T`VHʺ4gAJx @œW(-yU όKc\BQI~6O[ l^ #ةqP#$0dCi )8;[tj23yG k Vld騒Rc=P_o.P4q*Y55~k8~m|+++*%!@@ \24G] I&LhvcBJu 2y.< X0aNEAd?l HD chklklklk|~mtc|J4„42OV'ؿPAAev&icfÓYTNئ($E#ejzⷵc[7]#[HRc$ pJ= OɆ#):0#@JYB;0+ jI K\IPIk:әPaƶƶƶI$IfAc6FTɪhdԛ@}q4 QFT% ̙/Unhe ET,Ļ i-Qcc[7]#,/OYh5*+GJ@ A(@fW@Pa Tl"Z%a"$-*y L$EkcIykr[c[c[c[ƕ(=9 0] [e{-[F &R_!vJ0oKd-<"($`aR{thklklklk|al'I5@~ a&!~B( cY݈ҼQITQjR_c5vӏ?8w'_zͿ~m}'Fs;rNR%x(YZ z}kS4%A;GrGr[,^@ ']f6%&Dd132/3{{_Ycÿ4Uc?dJs95U5RJSwwCpƙr AUPU}G^8iɹɘA:YLl lh& E_[c[cFd!pҫr\̭Tpn]955K<&։xBdj*d A9B#N$(_,)iY;0$pE '+ PBTn[c[cFA / g^8Q<)IkI|ޙnOΦ5O!O2ZՀWGmmDȉ 9&\o)oCqD.8c[_]#!3$keL`51ڭϨJ2K@Ah>g½` #`@1;!UJJ1K%[Z#иm)RV1XccgFl@ ~gLS/1D'slkkĕR6 @_Cy &$lt@IF`W$h$BB) DWeI BlMVEmm )& .z_~m5ʊ#5)Y޵pU4 8)Ln 8_%zf6PFȨ:(cHr;Qd zg.vqm1[W?U$ $365O}5./ػ$ln3y $9癣?RVpAIJ ;daҢE ˃#1[n؂ymm?yo<7.z{FoslkHxlȴ PtܓXYŠO|N 'FQ0@!;P:<<ʖ-٢I%A"dدy83$x g荿~ms'L2 Sdfd-j8f R, 0砪\? FA0 !aT/́"uEk45fEƗ^=5OL˗8zX@gZ3] %(E^s5B AR*b-@zGyXu> Qg[c[J7Ts~mL++a36r>M1Y179cc]b=Z*h" \nwl iŮ&B09S\P# '`m%وSjbi#L,32z Y!rO$l-Bclp -mmmmqyeFv PJ#A_P|Q$tEd4-0 q r+pkkK C"眫9ru]TU{^UUթ 1'^p\J?p(E",!Bd@A &0aF %0K&Bdf 10s4 7!qq7æ7a<B$0vDĻ8zٺ;~۝-;w33כi8 q< +hKKKKKWVOmÝ;v/~_}uOn5겒-(<(LRR: -ʦ *pm̚1"eJɵĬ3G#+)lŜooN:uW]z],ݰyĉǎ?yرcGYZZX:~jf4ө}?73ӟL;.ٺ$A-fѿg6 Ġ7m\,bafOߎH2.=s,(#dZoA "PD`9$G5mG/!fc,i`{ Gn"slCȄ93Oj$!JPU%&F DFJ4yйil^b5V+LX%Edja հ,5~}/kƱ u>>\:#EJi(8L}~Q"f<F0j)_m ,h@\rFv vbBf !<&ѤM~H[?9/xu=,p7vm>ǚz ^waqΝݮB"'P1ı@A6yqDcKp/nWk/'N8 (T"ۏcf$ѡ1woGD"b07h{yɕxtnsGyίO?:33y׈++Y{(v2^9Z%vdQ(l))Ы# CTfɐfhviyhWRa) -[_HW(;.zֳuuO9x`if<c feJdGIΖ[U RDVM. . +fUxO^<Ff* 55=1"DFvtuzI0 : GfߗXM'еrDf(@cLK7;9982cX?uɓ'{dίy#WN}׫_yָ$ ؜gY2Sӂa \XP~.>AVIH%R@A N:ꭖ lnYn`#{~woo_\q5/+̸K}Z'z[]4h8 #Ti"S%B F:&j>cO-xF_ @Ү9}T@,##;H=e[Ǵ rfEB"nᤀ|0|f {yۙ@b 1O:G"TN:rؑ~O\kg_^ o/~O󲶺4 * HѿA V+"lL$UV&A 0DFt,̀deI>37(o DQ NhA(,"AGch[x[ q" 4@brSl]Y DV#"fZ$0z]Kh;zNAbn6@9zӘvppCN} 7M 4{ccmC6A&!П5l3ojGvbH8d1>~wÇ޵~ո"NPcU%%l65)Hi/`(Hge2)1m[eY!J J< Ҽ)υ@QmW??x[ߺ?W\yqaĤ-)aCE^,5@2 B &hMRNfXLSdN WaRQ!"#0'}! 0xdf47܆Jd0\#t@8c^#3C V cG(1BdA{4zW+Z82zxD Hy$=,;vduexʳC\rWV3 wMf,|  'CwHoDRd7?{ɟTHҒU}pvIo @Hnk|s䟾E|k_Goxws?s{^>EarQlֆQco4L $wyx&Pi>u-FvĻz0X__Iyv8R3tE1Ғ)ʑJ-_g^G C@AYAѣql@p *A `Q:c-HM bwp4P)݅H J:DPȞ$Q㇖Vp>=Uo<9}啕%ؙ&UH9A0[3W_$2I*pc55= 3E #MM˥ζ1Vwq~k=O&#8ZQtLټN,= /ĒyMO2%2ń=.-|Cn#JM>!iF 1p M UF*GMB hX`jRDTpUU1F_웞kFD( 2فP!Dtl7)`Q، /:x@?ٍկ}k'OBh daD@ ;pQ$2E'ؑ67~;z^wǝ_y|qeuEWzLl*<N90҆)(#I6,sVډG{z# QnJ@r E(i kk|x_;qw5K /:ƒjUlTq`;DE-@ i5ܖ2<nL9WvSU2GDh}N o@G[Q# ncqR3 ::#: kuիjǣѨB7/ۃ`{@K'V9~O|(#Grsf;TIl'ibgWftA [ 8Cc#Y "16 r^xŝN|Pno嗾xԉsX0#PfqxȡN{r}5 3KbSLN4`y=ab$i=b(2PqtF¢.:saDqekbEae#pHZIOJ^ m?O W?ꓧ%F]8QiAwڔeDl40:ʗ`Wr:|ML3"#DAɓ=C?gxӧtUno^rz /p{{c߾}g .'J++vKTH@=qĜtgwoy M -n+7d½҆4<0s|wp5>j~O:|/z>s~g$GSav  iZ8fJ'i@<Jbf8aWHFAm!a'n'v}y!ӧɅ5vNN߿333Bwyر,-777{tncc}qqҩS=z}7V︱>䩣s=x@x,@T-8ZvFBv(%"ugf7[0OuD"jU.f8/'>:Va~nk`ຮøO|mtc:|2fM6`3S[%xoؿ;^y,k$Q$kLhSTd Ld萲e3\)\tcmB5KE 7`QE@#d2yx9$u $D>)u(Fj .(rbةx3񬵵5y!-~I߮M#:0%ɣ9'HH9yoeqSU ^hϡ$txN6(A$zj"MizA4^1KK>\2vFc'QIQ(@F3 ,stN1 xd*~ۃxYBɓ[[[ f@b&ey((SwwX[:,۵{-ō7>}sd:)1 g~(1#P'$8Cy̔,N1 :%ZRZ@&%'' D@X L*h'f:j[c?_?xW껼M(DL!& £іҼ'lY gsM0dZN1 SHcɦ D"$1 c 748!40b 1Gj f;rӄQC1s1s0rxGM s $2{+Dt_ @<  vژY*I2f [{v3;;ǎ]_:p$"ѭk.DUA"WWN=?]v٧>y,k$[n˿>dP4|C$-"/[$0`S YC*?9Nol%$Bi[1îO8q1Qc^W|{?\uyk"BbDn@ս/)Ҁ:[Ց#I!oUk`Z>q.s9OBJ9c,`3#N=) *.mM)RSjtFgZ, 4Rp)Ŭze:`?:nk<59r οt_<yCX-E1;VsNi95n,kEB N͏^o>FP"Jg_Tg]GgեN!8Ldfd$ `O= D"jTDt5jCLV %ta p$`Q02(Z8 IKjm >yrcsS41!{4"cPG8ZqȓHdE^T6,eܘ*!bv0SIصdnL=*)m~ODw}wK.H F \ÙuW{,30IMˆ.BER@alLRZdw;E UO msm)} 9Gjh;dbz ~jdiU$/F,FVKHS:#]/&#= O#~T]J,9OF(ҕhD@?@H6G9{ !2x#~> iJL{m aҶJFV씌 Cс@St6zGl5)ܘ4|vmĈ|vlva} e [ܙqa"::tLfq#B)\u|Сrq_XWȅ&*jyڮ2̉֩0PT |P'u!03@"A!.`uF/({\2 ~WHS‡?a2CT¢o9jK03{j*"A\I2%%̭uژKWvg77gsGG(`p7D1{3b 3@ke('?j7 zE ]#TH~)cY=xp#/ܬN{f:jU*j%uaTHI&y%H kMmf1sorGJ{$M9sT{0X<,ǘo`ҕAXuה]Z c#!4>;j܏[DI/ąD$oZ9sweĉH&?9>(OF9婄.JM{&+f5 RZ2 ;IS|q.ƒ7#RS݄ch]kO<]bw~XWذtYH5H%^8J_]s'۬q>S/&6L`({xUW[zjr($LTS ~!8ʺjcaL2ojk®B"R] ?M 'jȗW5k+|iuEDvg_%SN#j#lCīR1$cgmPK a%`U|j0Kp 0=X毴A# OJfL&b#F6YZVmvMi~W rflb'rG(`o݌ש7x]A:,\.*dظtȔ4dOPWuI1NHs'⅄IConKc\brm$WBrU5 ba<ǂ" .;Drh`.M]l(O~H k4 $Fȫs Gܥ: :/(p l'FZWg9Vch@+fF$ K3b"ԮU,_YU R9L!# ؐ,b+ .v3!MD~g15 ߙ8l`G NVXp; D&yB="gq!B6ȶ-I "qLTa5wn2ެr6a8F&ՏN&RZRKxjxz*9k:)YOǯ:M+Ue%s}@F113!T{1 83~Ƅl~u 5l~V`҅ъ LfRcmU3>X֙ݳ!L1%3gOٲk}\ÉRJfT#SefDPs(8fJ-t kBl(%b]MOm|D(kH 1mRvO`Z9L11|pЖrb-6p$q`){!TΗT^""e<)c[;;;}+;o!Z: }nX|lz1pկ[p2pǥf\sMfŬ)!׸J˺ c^Z(*U2B ى>HgmfBQVPU6zUÀaجgѯ;E) ^3p0_J b%KeS beBU#j |ǽ lI|d%sL%aN,& % ךiA 2`zV- I|LSDSeƪTʤ0 evD Q;F@1M2d&/ڒ3h;T{Fd^ڴ*o?Vy)™G8I,AdXL]#j雹"?G6K4b"mg"%XpEGZ[y&e} bp-)=hNna5cMWZwwֺd.yD HAM"'Sp1%GJJ5q&][=VdJX^ON6O>9Vѱ}㝝"*ze,O&Ml (DQgV~[)&gW>Woa0+5mVF~"(H+6&\<F_M ~DX8R7 ګ8|0"e"࿫_ PNOzMDmli6&;cbB~El57kk}/Dc6-6դ0H)f7jȬ!]OAJGG\=IWJ&&!G{RY\I Z˽jo@ AXD$X0T%M`a~V yh*1"KO&%7vbT6A7Lq[a&PPqC|uy" 獥̄,瑝hC0mG0Կ:&x NLC׉6}QNjM@O8Qtsk{]qZ9 R]"8ָ52pܳCGiΩϴ\y%Ff,6lkh7fe5(" *tI,9#̬p;p'B%]6b \p5lX7.6eQk*4ĝ _3 ђ]cڦ &\0yDz*:WӒl}]7].y C7d7<@o0Wg#JdJ>D$Př8FZ'˯AolSHrv)FJj~t͊yqk}K.Cg"RBiU`IVnĩX$Tǝ5bb˹J",%;'H `fN V;=1'8\%S߰>Z bziJI ɨ r~vݷaV /󠷪B LQl"f&"2>ː OfxL%/k6c)ix98Yx1&oTjrL$g[qQU{Hn"(U'"G㱇W)4lESvj8np!iXo=V 2b@S"똕 ͢f3i&n SX䞍:#MUcT=Z!A ƢܓnM,FT"Vv@}.F=iPU;9Zo8˩,Lcۧ r H 3"LK4y$.cf`0&eI#1"yP t\%υ'T<}5*/!2!p&R%~j/SMPJLvHWdrf*ڴGۈ0jÈ?}eF q&4-35x,?*ubZkD;**WT #,T2Va!`;i%\H ҐSGdX-l 1h%l[BsKYS41.QAt=E2jmQlzF*QgV1p[JBd*dB H闪"JŔ;W#[ ϡy5RFŃI0ń#id+Dpf,Mf~!"h.BsW{gg 4@P2V Fk- SQ"c uېBjS@3HD̩=gV|I%gaTJ9bi8&Ք.S#"fdVتԼackɺaf!T2m@v1))*1:t w$5BbD2DF Yuo40+6@F6,a+qu E|?I 9-D.ߘmnu{?*` D"3Yd5[3ѐ8OX1w)#LSky|’b^И|繻Sk.狴I!AV 2[Xb16eRԈw*4&WW.4sE̠8o- j?P~}!bT7p" UymoϕجTjU4Bi`1va팗F eL)xE[8+,PBVcK7:5G>&l˜MUZ$ihh]&J($.LTtmIgt#[iqn[=i0o5Y꿜͊o#jtLS5C]v6 O̪t̵.\o H&j<it9Gan„"92XI} ,"9@s/)j1Cz6ָ5.VEeXaD@%Lk+kIR#9 m0 Nj %5Gs:z+}A4?xTʰՁb+Rj5ja'?֧I"{-}6+3m2;tQ0 wj1kfHdZ6Ω]ucZ@H̝ x0DPH[&O$D,\'y{+XG& fT 3) a@, &I[E,,Gkd2L&S,*t:2_«K8K|žr/A"UW9ѐ XiӖ?r=1ߞqak#/߆+E?#9v.ѣ7Rk:SMy6M&N-G7VZ8ySժm'Px<3B0': *i_Ĥù*E@e)YӢ{5k]7@Q;&Tk33+Ʉ'>$}B$ڻz 9WX1XRA4_凘l^$#jR6dWeMust {gӇ6R=E.?hUqu6>孭Ir)"Ź[i֕_1˩Q@ ,5A 30qhu< s^4X<>Ss0 wuRC,= C a}07cqkr_,ٸL3N YI"צa]׭4V_ߟ.`_bbf½F9|/6*hMp7Gזfl6k>}e}^s^3|DlW7j,R8[fҪzEh99\b} b2UnDjIl1X$ŭ/-½-8pn"VS?/5c枦8nJtcU;?S?u7w}}tX,677o;K/'N{)/|&T&={xR/kgΜ9|\;;;r MD fiO{l6뮻`|cǎ?VA}J;SkZIwysLmcś =`8sbp{ ١S-ƃ@9N(9B`1ܖhk@fd h p59?xeMoZ,??Uzr+7,dr7~]w[[7|WU7YDf[wvv>OW]uտ뮽]D[f_||m/|OO~c#nn+|}[n墋.>ϝ:u/|o ^߼\.=?zի~.{{j__???OuKיy:o;~o|裏߄N0Cis tyDiD_hxbR1],#?#Kg=̮K//Rg>_uUk_{ms=>'}чzh>{ѕW^y=ztggo~oo/׾v2\~2[nu{*>}9)vr)3lG(9\5fiCz̧Lă/h}h3#3`{,`m^#?#-_]D^c{{sݷn _>ul6Ë:tԩS;7Oӿ꫾G?C?~/[򖷼e? 70~ /*ob0Zr⬓'Onoow}\s^__뮋/~ooO)>D\}d2ϗeX,vww_q_xgϞ%__x;|ӷr =)O/F)K.+-Fl~7~'xӛַ~?|N7~~룏>O~]xᅟgRx'??{菾E/.{N/~񋯸⊧<)O}S+?/k^nZJ)Lm3{;vإ^z饗>99|ɓ'o馟9yc=ff+򖷼_ƂN!bfjըJq-</I:8=‡F1M'F`ftxPp\s`tNAF!06<ָ5}Oe'Ϝ^I kt:e.o/|&ׂt˿OUc= m?yϛL&JDO}S>|̙xmEKU N8AD/}K޻gruU>ϸwwwjzK/ĉ'N8v9!:4-쾉˟fg=y+kՓ'/恃ggz?dڊ#[m,NqO]JJd5R2VW dlR 1F*&G9)!ձz0aaָyFվ7eHĞUn' [yd ^??{뭷zq}w}-YUC 'NYd>c8 V_>~6wk|, 4;Dku6vu=#P~a}yG}/uW@IcU'J xbœ,:f]<S Nbw7MV(JkmcaRi5iD)cZc)e6Yˢ3j=-P__H{/ks_t缀/}eV*1/ _Rv$݄LQzH)0^+#{ă# Ib1 ЍjØ1ˠue5LP3bϪaba[Ás!"K3G*`JicY#-.Wc*fټ.gBNm*m3/- $rpmW~08,ٻ [7gEkЮzk fkWzۛU܇s20(׽z9az=1~"]sd ט41mRr?3W_<]r8p%S1)eNk璔kzHU%{^ߜoWD$Quf550 xd[:ŠlEZ%qQ6KˢV"2U mhښ$ _k*DVLxÇw~}& $0N뤄;bQgsfҶ)Sa$F@do| ,fhݍhJzqV i,ꆣkܷL!WVޢIoEy^kGD7( 36āBZ}39w[·Ě_^H"S^C6dm A++cHu5Qlhh6y},2\:ܨʶR/4|p[|JLMFLA 3.h >KM+c`\2dJӋ0RP5AyS~ nMʘFUepW f𜖅UącGslv)Q՞+\X_ 5D;<՘3G-]* ^5ڻ㕗m!4m~[--زUec޾Tއc_ڃKd-s¬TOdXZfD '6>&F!o5 44wabSXY=4B)A<ޏI*8Ϥ90#+TJ$)Lz7/#TXȳS}' )k_]DTźB ^)p^bYoZUJܠ]M֖v#@Pƹ5mvi˕7Wս8~  4,Xmy< CRkB/Ϋ; h)vY73s?H+e=Ǧa [q)ΞHiRxȆF7 Nr < U\݃-Q B猸Tˏ)naf8U^,($cJrɃ9"(X˅qR@FUR%_g߭bTU*oR/۽gs [Y*8AAk1aM-llfE t 0  0;N{)M0^k4`BMQv%xEoLvddN O1qWDiq;d H Rl1a`l)(V&qFYʤєycc\\[LGZ`$fenk}ooou]PJ麮GG2b 'f׆E&&HbWiǒbc WܧC[GcǢIɿ\mps|G|^LpUk<}N] nYRXv3j|-HWpMwyNq D.\V5-HBdRf;Uy49OuqkfR"ߨ hl햳ȑ#wu[O}SG`7< 677W꼶ddWmĔ^U#N-/2v,M W\. -Y^"aDJ [璝 qM4vmq5KղyiW]b@̌Y̸K Dzv]RU :%6Dה+GrK1 A[3XCA&3KPXhب+#!QqZUu:n/[ﺮ]*!K)Gf@z%`ɝfe (uflooQi1s.Lr/byI 'XOɪlk0zI !mvq Zh6-ږ==@\%Z&t:CǎN\r ^6׵1Ca-k6`tՖB"r {$_Or]N > kGv5`D: w-tPaby4bؒh`l$V`qa%W9k^g< OWQ,E AWBMq8N#QPJI5c]i@flʽ03I@KHϣ}n?~kfkk듟$]Z":}^> WW|"rM:v]}t: .2ݘ}~^g?/L&G^MMsӧ{⋯*7ԧbMro;̵p+jMrn'ɚd&iavմ]E)L&VʿvLĿet]JrWghiu#jj,7@Y* 3Ij'F8[49+9 'f3ƀRRfYYi<ָ5Q˾.RUQzzvPI9{g>œd6M&%wq@ma# $bn/x|>eb\l2]b{9pދ1_nmmRvwwow?~X,뮻0Wx9[V>il]-~kԔP'0\.G5"M0INnL~)1A5AKIjk/d$znwĉZ>Oyק>)ٟ&9&x8Xs)N_5t`jFŚx+N8z׻?ܐ:uE/z?|}fꢣ1)̴~7*[rKr%X7k̍66Fjyh+mG ٴVܕ^Wf] 5vDnYágHyYF_e"Ժը esK*W&m݆xw>9IeMr L\ėe5.p"[zG)aG_>wկ~\LZw޹}fkΥ3#:uJ؜S[WpGYtGSƍ3\ acc_TM6. dxSr Pؗ[7J5bL"E9DW lٴ١I5E5;rD;A uB@- %$E5A<7$GrxV|;yD"ʎIftD?rv%|b̆/&&hL$A>d!XXO~La4!$kT`:﷈^ѩ܅+a}Ql!W2k7d2lnnz뭓YzVu:flE'?Ilr:O;C,L޾w~{%\2ϯ{;8tVr_bd>fd(|IDgϞ].,]:t}{oƓ'O&sj {bNdD;"5nĝ !F¤$9?g>UF[kr%H`99djybj,k\pްpD 9'ǽ,؛wG ؤqssV:nx) k Ո8h!zx3q6_ O:}`++>я~~s~wѣG/}ckqн{7e/;}rn=\sl6誫RcҊ+lrkk-r嗗R#G|gΜOM&3gμe/I^'vc;9u]y-kZ6EW.9^;.w'^i3e ]i| KoEHY]gff #+dp8 w} O2V9'* RdUj# ajl+Ç8T6:ָ52K)TSԈ{B 1m1 S;x={xѣGw!Lu;KGy>Wo~ggkkxÇ%/yӞ6ϗ%}7|g?++=:٭x_U\.a{{{ggGUwww9Wjgncǎ}_u n`hU[[[Ÿ[Z\'֪ΪZC*sd94+ڣh5 / r֐7Ĵٜ %˓ݖ$'ZDzE#Oc]QUtZfihDvIjzl.&U0j7ʲX,ZON vS3. vJQf>uTmm{j/Yc 03 sؕR {Rd\*L7um\P)%[ k=n /)w{HRZ?5^vdKXjd"k4ָ52LLϩ̔ Q^װ\i^Kum2XU,sxYcOY%G aN v;ҟC6uDI"f/eԓZf\II8N@5*DmXsbiRG2805 `\l b͵k'w2Y,l:nllpB`#dl i{.uJ iwBL OpFɈM5_|H)bJ޵ibbv bz,pkuK_ nIZ5jؾΚwnnAs˚MƠeͫZZl_3Uooo+QODUDa0>QDnkn%uag@F\c&*+TҴ4PeY?\z5oOdk0՘Hy+5{fUg1b4韾{\PM93L#Wee AdC""Ī/E)eY rvބ&zbZ~Bӯf&.bLlȵO֯es$ 儴HcԘdܹ 俍|nV5 [&m?ⓄLULսFbbUF"R1J~4)sH펩eָZOMZ2ָ5Y$KWkVd^cajsFە(7yHP'ο+@\O%rKNW$:@=^ QaiZ&+ 6޶%/1 Ik\V| _Zfwvda}Z`Sd|:R 9iBx0aHHA Ib6A ,&x:ưh9DFD:dʪbZ*VcC|8-Ujk~kA!.]$ݘ.olM&Vk7ZH4xԋȲ_IfXU1`2Z<`85Ro skޫ6/c֒`N*}Z5\אGۊFyyheP^]rOGS >Fz'wS)P+< r5L1MN?mD\guc W3zihAeb0ָ5.*ȴff,DBJ$'s^[Ð du-Eϓ'"n{XȫImnH)DKklv|okgkd?^U׆ⴁ}wfi [-O~3g-eenw|P2eʙz%[Ծdkc< s_{5ީķS|fxL*+2RwB 5XI{ R+')'NǐCpK*dfBbvXH;gy 6ffŬiϤɴ?gm`$-)e$Kjqs%ˍlA^kl1|D R֋]N-Ѿfkfw,ωn!?٨Үk} =-2[(+Mj6o2WV˰/Ťrplc|: V6f&, >)aea% ǔJk_T\ b=.bfHZ5xVf)9@~Sx5{d CIle27W5Bia{%s+\KSKL&۾ڣ@"`-ݭErNלIf=>h_%6.nZ;G2lV`f欶6,@qdRe($`|U%Kg#%&дSg*QXpx >$IfFDp]jqʰHedS!+l)0G&.E~X~֘+BL3V%HT6xlqkƚ$2Ak{֎|%2- O̽&7 _]n5"Gl)sE[#qf Xrp ڭhk{TB.-JCu!&%/[h-\R3Y/ɔK7>"O;G 4'x&3܃i)%xD{{i:{7C7 r|~/$9k(WfS{"!@Z6 Ya@kvo9l>cdRF6վV.c9q~ME֕ \.md+zj$ků ֜[-9$9[֒FZا +CiedT*6&>i1PD\9nWNbS HXZF Dtd_N0>>nY;x`WvoXpܞՆ__kVl@T&w罨`kT[ym$wc$A\LoER-ŷ%{\+0ᓀuX2b]S$s/tnRRRTɴK|Ѯ}@1l=W?>Qip6aK,@tv1)[WquS'G!GFx?ix"‘A"3A1X~ȱ@VϨ[?&?Ip_kYpÇ+{@a9=+JwWKgV-2<׼V۲f匷{.k2Ԗo/fhYrsoi{k5 ?ȏn&b.Ō~ G3LOgǘ lF*"~PtAԛxp9s1K:i sa"B\Fu&m0X֨JYe1P^|+.\.bP&,lĥ*1D\HMvTRV>j#:K1 (21턖bf- TOͱ3 CE-IWT9uEЌbEE\mW~sxUxHks5 tDnƚ6=p@)CC<1U%ɺ nDlJ?_,Kyg Eq0;L";~ƙ5%/.r P%33U"c#/MG#dqX8<:2RMxS~g.ȖLԉ(R)Wb!nԼ_E{JYUN3=j#"ZW̤EҐeP VVX̬`+(d]Ghm,r%] T4xB+rCZ+瀵H;MQkRmonn{#a5Sۋb'D<О˸z;Q@H+2<✜7Ayb쯋s )hX1Z|xoeřD}.a aC)Ψ}+3-~9v}1%hEi ^je3i\mMnmbP"斕Z"]ynxkE&-eBޮ_#-_< q,ՙɶ\X{R#t!k3bCZ6CaRڂ7(ڍk!BT3&JMoMh,7A%ի1ӑaUBB:gJp^^Was?b4OYsm>&|1oaHX|C`iL1&W'!u&¸ 9 "C8\8 /_XB9FP:cU[5w{Nڛ2VU.L*x:"BV'1kI7~Lj$+PN:+`]& 221LL #6M Gl6"YFd\=}0 LdD>|FNaqbJ'i7I\U}ȴ&LpO*̴V Yj/2f[ OS@tq2ϣ1wC+)xZx5`bpe' lb~n'J56c=b4c+{dIImPX>cZ3bb3Me.QaդgEZHDicuڰe|VJѾzH;klֹel`5w AH2)񜍍ld쥫L!f^Ծ*:LU(--M faV2d8+rS=7oȺ2B됿Z108q)%5ָ5 6nHL؈ETLLM fVf'az|8{f[#[[>qil(l̀cqkE dTWlW!-SƜ+ xWzu"f6r;6779|‹qW?+j1رc?gf3p"[d(k,EWb(oyR&.5׽BqDsĉ|#}onn.K ̌)(-bUDEӦ{2L&NgJ@5`Hv HGŽD,q2Z'ftW8x *f>pӧ?>;~G}_5]4瑸shh`B&ފA2m1qmLYhJ&nGdD%:f oɹ 4a?Kgb"? YQXըfKSLf֓!Ĉ3ڳ2.g\Xg2=|hz>zG&t7VrzT)VUǐ78[4jh7lդ@1GGHRl6߶!"flK.?_|W^yF& >ży$3d$4j2){2iY2{]90n@Iea/T( s}ѪVKn8YgY1F3UӾݳtEPɤZ5d=QD`T(x%NB{.DL4ّv'294)I'p/LI୸ؘMx^tEw}#GŤt%bq ^wG/N& v\QЖ50Uɠ]sz֞6i' AIꢶgrs=^zAw}綾^j{Q+&ə\5vFGWxUw:Jc ԣk?v[*k LiD1adym:Rne4x)z-4>]a젱ƿ5b:gJy%^ܣD3^Lʴ%'Ѧ']׺jq?EWfk3 "d.ܚ|ljq^iS)}Qub}Rz̙Cof#:ӧOommTLUb ssj̥7-F2s.y$2V!c=;ܤ,!-f{6jDcc3Jp ߩL3+ 7KpGi!OvZ?Xh9%5gFE -8 L;YjtEv뢘KtwLS_f(NRG Fy4"TK@* TNC M&U ֮+bggU M&|ɓeOe<7B)e>A!>#%3K*5vĪkI {#ct}QȇqGǍilhmf Ek 0I-gk?EldZ@44D2ՠ?d"E_6btjBe7lX2aqvB|OCd1UMǖH^c Q(KR%.ׁnL]MI)e1_@[9Lgٳgn`~:n("_?فdrܔQIQ3K7haEӝamaܯ%b{S<ۂuw?z]y쏗pcNݖ|4bI88x<~=U V&z7⥖OL4@nm~~zli& 3N~}R 3dk`Ja1_ŒBJ#e=[w;^&ӖԞjm0bpu`&'sxqjvwi17"dE 奩[&ؼiX"׊MUU' I而tg"Ml2"t]u[>%6d2L&[3"N;&)oؔ2鵂Sk/kɭM"R:ic<d9q\1K.c#VX /@GϣPY(C"%~ZvX+cH)ukzԕ$"`* 9UUCc7N9Dp'HZ0\8Y+2x%M&`w}=UHM(v{;q[x ơR']@dT|3hq?,Dca)\7lGI0XR4i3 SDɜ*\G s26b $`roRD3򉌈0 l@q0&`R66cޏFYl5orUí⿎eM_$lEEd\L}=ǞHu( O\U ܫb5ni YJ'SU ^JUf"kfЪp6"Zl6L&ҕjZZ/غ1d̵ 4*ŰL H8{R~D2xEofDuU$8τYS: >bxyd"nYhxMYLlh0_oJbAH)x'vO1;%1#4 kqj&A)VubZ=,٘tŪ2J g_uF#,3yt"b% Xk}lixkSƶ94oDD-EhXL&ʩ'&ItYBU+Hu"bptb) |E,qXsU>V a'KHQ.<1%0MĽ[xkj)5QB8]`"Hnw#q1wA}H4 J95T\80$vpocB%Q'T>MV4/aσ@ڏ5LCrHE01yߦL*R ad*A\JYiR6ꤘ.{Y i06;bS 0&UlˁR f2˭,x+8ك3nr0bgwsk}wef[RJ)7pÑ /9˙tJFRجLJ13a11S<[|<$gbR|lX€wT#8[)$E(݊gw]+6lR u>=](qB൫1ŵ3f4}pU&0®gBqA?ć nt. NpM²L@7U6 +cZca"c9E:VԤՔseZhɼ!Ƴ;PM)qUh:SzJ[6?֏% a1mkuI[[[$\,IE9(W_~ً^SN%5T n-0I!JEЏ='N ET,D ZY>m&aqb 7 3UJ7\UtHn[qa#RpS/]gTjZMRՙp#PB֌EPx )Y 9ᬪzӲ3ONbZ_}F"‚"udˮvW4P!]pۖoñLk,BE2:,տ<g\wL1q Ӭ{ܖl_"3ż{-HqvlL;2tD?xG.|%2_,anfO'zҮ(۰[)&lܒFb6" r boZkʉJĤZB4X !fh.%sbg;>|[ŏq9 4ybΡrY7;=,\'ٿ8WI"Fa3DGJ7ȿ4ōX K7)2+4M@F-ɴV2!+9[O$Fdմ؂#U,Yp тۛ/|E?'|c'z_9~>nkѣ_L%{v\w^k^GW/f٘͘XD]W-aSN7&TjAyddv.[ 5v "mx Y)JNIqf23`T@9\e vpձ)Z6 *$5%~.dlf X17NSu,*K)L\TJ<}z9yO4o`z! *yA` X2GHCJ9ߵ@OҮ9t!]/ dxqb>]|8 K{&8P=j=0qűk4 /y3a$$n%I;B8dcsqf\mo{95~5J̓>goѲ:F粰%CiLq](L%p^G<?]-hlQkk+Z?DZ/F>~81Ie'!xJ7 {8ZUϮ|I)i \aE>>b"ϝbm'B)4( !ccccO0. 8b hދbqL<Ch6?(GһRf4P|Wki8I6O[˱ƱƱƱF>qx|"wpP'ev44øOp $At| ̃[xjPZ#RS1qHƱƱƱF>~gr{(vd@#**@9Ɲh0\.B7F.M~1̌]-":$1Y- = hkqqqI^dM]BKfh4 2 VhXx!'jzRa˃PuߞX }i4888ĉ)$ͧN` p0 UgēV㎑MgzJWmR~@GVFcs^~[ӟq0 g2ǸN!yH'L cV&Ubᄭs G Ye)pƱƱƱǎQ@"3"yph4`';<'61 _ⰷA Sl,MPLӓ5)ccccO%'Y}o`]gՌZV"S *@%~0q3C|8<ȼH#6 ulqqq1342v KZ `T5"AJ) zDq S"RgY"?91"ұƱƱƱ'23L潢W'Z kY"Zη'X.q0IQRFp0ARyU;XXXXyRp"3F2ɐ)0$&2 12,Q`g8r Un`ق=DSs{ewwp5v~!=|VfFØI RXA@kX) -<}M#v .@ȹ0ȸ"ȄO#^b(&_XF3tPZp8FC+Nt3H5v=ds>t-9cTg/28S e s e7aXXXXyRq嘧s1?<%s`v|,ZbÇ%4N,G'79i1X08g 687~$Kțqd555552ghSHf`QZ4mX7SCl~OUg 'f)FW)ŨZV+F?888xS_n92p8QpOQfTylx"&iL0HLzՕmatƱƱƱF'gC0\1L9tPn X}sdoU-ĢW_3f؞ x f?@EYMd PDJƦ1P'3rEXXXXQ#8|wqL%KGv7 f#Ţ>nVRvCseC艈nX0X[11agNccccA"ʎI$;0_UHDɀD"zCC@wJ rē \eSP ~WkkkkUO0%V"HqM[ ;{{1Uu|^dyv2i!_{qqq<3ud4waQA GοcDɞuI&sr>*l"i-DZ<)tƱƱƱFҀ~bRNVf 8j؈t%3n\`jITJ8OLƱƱƱ'NscLFT|bfrbت7h&R?i)6|pxxa 8-?ƱƱƱ'u!" /_7%$(g,|*綊R}JVp.O'e9; a,iN ccccG݊vp&"E`LvcjR̝pCl\&}^`yQ_#3QEwX؃Np1m8888Q8ܺÜLIIY9 GJ +,)"bEccRr 2ٹ(j)MC0SaHmd*ahYN&4888xY H[ ]h!};D`ڨcR4M']>^e\`bgdh#Qgqqq<Jy|C0%|2ng4*wEp^?*b؁sϞ!WN wHrSLdfN4+ccccAБO}"<Pӆ|HS͉wH ngdY p&&:|Y{!{_@-2Mi0+ccccOgK'Te0s% 3152 &4f0TwᬃV7q(n#mJ͎5555'5ì&lF~aF(8 s]˔TLNl!0`NzH7kkkk<jhSx;x0f&~\Ad.~cϩ$8ei?fbBtcpP X?-Ķ! 9ccccO;n̪Hs) ^&Al4)A!S2nUV L!Fؔ")2k5~ғsk Ubuntu UI HTML5: Navigation ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Dialog-Spinner@2.html0000644000015600001650000000336012654470322031030 0ustar pbuserpbgroup00000000000000 Ubuntu HTML5 UI SDK: Dialog + Big Spinner
    • Ubuntu HTML5 UI Toolkit
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Indexbar.html0000644000015600001650000001452112654470322027570 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Application Template
    • Ubuntu HTML5 UI Toolkit
    A - Standard
    • Label

    • Label

    • Label

    • Label

    • Label

    • Label

    B - Standard
    • Label

    • Label

    • Label

    • Label

    • Label

    • Label

    C - Standard
    • Label

    • Label

    • Label

    • Label

    • Label

    • Label

    D - Standard
    • Label

    • Label

    • Label

    • Label

    • Label

    • Label

    E - Standard
    • Label

    • Label

    • Label

    • Label

    • Label

    • Label

    1. A
    2. B
    3. C
    4. D
    5. E
    6. F
    7. G
    8. H
    9. I
    10. J
    11. K
    12. L
    13. M
    14. N
    15. O
    16. P
    17. Q
    18. R
    19. S
    20. T
    21. U
    22. V
    23. W
    24. X
    25. Y
    26. Z
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Buttons.html0000644000015600001650000000521312654470326027474 0ustar pbuserpbgroup00000000000000 Ubuntu HTML5 UI SDK: Buttons
    Button
    Standard
    Color
    Icon
    Icon+Text
    Disabled
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Popovers.html0000644000015600001650000001165712654470322027660 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Popovers ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/ListItems.html0000644000015600001650000001407612654470322027756 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: ListItems
    Standard
    • Label

    • Label

    • Label

    Subtitled
    • Label

      Secondary Label

    • Label

      Secondary Label

    • Label

      Secondary Label

    Multiple Value
    • Label

      Value 1, Value 2

    • Label

      Value 1, Value 2

    • Label

      Value 1, Value 2

    • Label

      Value 1, Value 2

    Progression
    Icon
    Control
    • Label

    • Label

    • Label

    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Label.html0000644000015600001650000000307112654470326027055 0ustar pbuserpbgroup00000000000000 Ubuntu HTML5 UI SDK: Typography
    Label

    xx-small


    x-small


    small


    medium


    large


    x-large


    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/UbuntuShape.html0000644000015600001650000000532512654470322030301 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: UbuntuShape
    Ubuntu Shape
    Color
    Image
    Radius
    small
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/widgets/Sliders.html0000644000015600001650000000432312654470322027440 0ustar pbuserpbgroup00000000000000 Ubuntu UI HTML5: Sliders
    0
    23
    50
    ubuntu-html5-theme-0.1.2+16.04.20160203/examples/html5-theme/ubuntu-html5-ui-gallery.desktop0000644000015600001650000000030312654470322031505 0ustar pbuserpbgroup00000000000000[Desktop Entry] Name=Ubuntu HTML5 UI Gallery Type=Application Exec=qmlscene /usr/share/ubuntu-html5-ui-toolkit/0.1/examples/ui-gallery/qml/main.qml Icon=ubuntu Terminal=false X-Ubuntu-Touch=true