From 445ddeab858f6a516603cd1ab271c0f9afb9929d Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Thu, 5 Mar 2015 14:48:50 +0100 Subject: [PATCH 1/2] added generated phonegap files. this is for testing purposes only. --- uhr-app/.cordova/config.json | 10 + uhr-app/config.xml | 70 + uhr-app/hooks/README.md | 196 ++ uhr-app/www/css/index.css | 115 + uhr-app/www/icon.png | Bin 0 -> 11401 bytes uhr-app/www/img/logo.png | Bin 0 -> 29632 bytes uhr-app/www/index.html | 46 + uhr-app/www/js/index.js | 49 + uhr-app/www/res/.pgbomit | 0 uhr-app/www/res/icon/android/icon-36-ldpi.png | Bin 0 -> 3383 bytes uhr-app/www/res/icon/android/icon-48-mdpi.png | Bin 0 -> 4681 bytes uhr-app/www/res/icon/android/icon-72-hdpi.png | Bin 0 -> 7839 bytes .../www/res/icon/android/icon-96-xhdpi.png | Bin 0 -> 11483 bytes .../www/res/icon/bada-wac/icon-48-type5.png | Bin 0 -> 4766 bytes .../www/res/icon/bada-wac/icon-50-type3.png | Bin 0 -> 4998 bytes .../www/res/icon/bada-wac/icon-80-type4.png | Bin 0 -> 9217 bytes uhr-app/www/res/icon/bada/icon-128.png | Bin 0 -> 16334 bytes uhr-app/www/res/icon/blackberry/icon-80.png | Bin 0 -> 9217 bytes uhr-app/www/res/icon/ios/icon-57-2x.png | Bin 0 -> 14643 bytes uhr-app/www/res/icon/ios/icon-57.png | Bin 0 -> 6177 bytes uhr-app/www/res/icon/ios/icon-72-2x.png | Bin 0 -> 19336 bytes uhr-app/www/res/icon/ios/icon-72.png | Bin 0 -> 7839 bytes uhr-app/www/res/icon/tizen/icon-128.png | Bin 0 -> 11401 bytes uhr-app/www/res/icon/webos/icon-64.png | Bin 0 -> 6690 bytes .../res/icon/windows-phone/icon-173-tile.png | Bin 0 -> 21147 bytes .../www/res/icon/windows-phone/icon-48.png | Bin 0 -> 4653 bytes .../res/icon/windows-phone/icon-62-tile.png | Bin 0 -> 6207 bytes .../screen/android/screen-hdpi-landscape.png | Bin 0 -> 45248 bytes .../screen/android/screen-hdpi-portrait.png | Bin 0 -> 46644 bytes .../screen/android/screen-ldpi-landscape.png | Bin 0 -> 15112 bytes .../screen/android/screen-ldpi-portrait.png | Bin 0 -> 14941 bytes .../screen/android/screen-mdpi-landscape.png | Bin 0 -> 28912 bytes .../screen/android/screen-mdpi-portrait.png | Bin 0 -> 29381 bytes .../screen/android/screen-xhdpi-landscape.png | Bin 0 -> 77189 bytes .../screen/android/screen-xhdpi-portrait.png | Bin 0 -> 78744 bytes .../www/res/screen/bada-wac/screen-type3.png | Bin 0 -> 29372 bytes .../www/res/screen/bada-wac/screen-type4.png | Bin 0 -> 46647 bytes .../www/res/screen/bada-wac/screen-type5.png | Bin 0 -> 18937 bytes .../www/res/screen/bada/screen-portrait.png | Bin 0 -> 46647 bytes .../www/res/screen/blackberry/screen-225.png | Bin 0 -> 29556 bytes .../screen/ios/screen-ipad-landscape-2x.png | Bin 0 -> 87242 bytes .../res/screen/ios/screen-ipad-landscape.png | Bin 0 -> 86796 bytes .../screen/ios/screen-ipad-portrait-2x.png | Bin 0 -> 85806 bytes .../res/screen/ios/screen-ipad-portrait.png | Bin 0 -> 68785 bytes .../screen/ios/screen-iphone-landscape-2x.png | Bin 0 -> 72319 bytes .../screen/ios/screen-iphone-landscape.png | Bin 0 -> 30210 bytes .../screen/ios/screen-iphone-portrait-2x.png | Bin 0 -> 70677 bytes .../ios/screen-iphone-portrait-568h-2x.png | Bin 0 -> 85308 bytes .../res/screen/ios/screen-iphone-portrait.png | Bin 0 -> 29372 bytes uhr-app/www/res/screen/tizen/README.md | 3 + uhr-app/www/res/screen/webos/screen-64.png | Bin 0 -> 6263 bytes .../screen/windows-phone/screen-portrait.jpg | Bin 0 -> 20813 bytes uhr-app/www/spec.html | 68 + uhr-app/www/spec/helper.js | 33 + uhr-app/www/spec/index.js | 67 + .../www/spec/lib/jasmine-1.2.0/MIT.LICENSE | 20 + .../spec/lib/jasmine-1.2.0/jasmine-html.js | 616 ++++ .../www/spec/lib/jasmine-1.2.0/jasmine.css | 81 + uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.js | 2529 +++++++++++++++++ 59 files changed, 3903 insertions(+) create mode 100644 uhr-app/.cordova/config.json create mode 100644 uhr-app/config.xml create mode 100644 uhr-app/hooks/README.md create mode 100644 uhr-app/www/css/index.css create mode 100644 uhr-app/www/icon.png create mode 100644 uhr-app/www/img/logo.png create mode 100644 uhr-app/www/index.html create mode 100644 uhr-app/www/js/index.js create mode 100644 uhr-app/www/res/.pgbomit create mode 100644 uhr-app/www/res/icon/android/icon-36-ldpi.png create mode 100644 uhr-app/www/res/icon/android/icon-48-mdpi.png create mode 100644 uhr-app/www/res/icon/android/icon-72-hdpi.png create mode 100644 uhr-app/www/res/icon/android/icon-96-xhdpi.png create mode 100644 uhr-app/www/res/icon/bada-wac/icon-48-type5.png create mode 100755 uhr-app/www/res/icon/bada-wac/icon-50-type3.png create mode 100644 uhr-app/www/res/icon/bada-wac/icon-80-type4.png create mode 100644 uhr-app/www/res/icon/bada/icon-128.png create mode 100644 uhr-app/www/res/icon/blackberry/icon-80.png create mode 100644 uhr-app/www/res/icon/ios/icon-57-2x.png create mode 100644 uhr-app/www/res/icon/ios/icon-57.png create mode 100644 uhr-app/www/res/icon/ios/icon-72-2x.png create mode 100644 uhr-app/www/res/icon/ios/icon-72.png create mode 100644 uhr-app/www/res/icon/tizen/icon-128.png create mode 100644 uhr-app/www/res/icon/webos/icon-64.png create mode 100644 uhr-app/www/res/icon/windows-phone/icon-173-tile.png create mode 100644 uhr-app/www/res/icon/windows-phone/icon-48.png create mode 100644 uhr-app/www/res/icon/windows-phone/icon-62-tile.png create mode 100644 uhr-app/www/res/screen/android/screen-hdpi-landscape.png create mode 100644 uhr-app/www/res/screen/android/screen-hdpi-portrait.png create mode 100644 uhr-app/www/res/screen/android/screen-ldpi-landscape.png create mode 100644 uhr-app/www/res/screen/android/screen-ldpi-portrait.png create mode 100644 uhr-app/www/res/screen/android/screen-mdpi-landscape.png create mode 100644 uhr-app/www/res/screen/android/screen-mdpi-portrait.png create mode 100644 uhr-app/www/res/screen/android/screen-xhdpi-landscape.png create mode 100644 uhr-app/www/res/screen/android/screen-xhdpi-portrait.png create mode 100644 uhr-app/www/res/screen/bada-wac/screen-type3.png create mode 100644 uhr-app/www/res/screen/bada-wac/screen-type4.png create mode 100755 uhr-app/www/res/screen/bada-wac/screen-type5.png create mode 100644 uhr-app/www/res/screen/bada/screen-portrait.png create mode 100644 uhr-app/www/res/screen/blackberry/screen-225.png create mode 100644 uhr-app/www/res/screen/ios/screen-ipad-landscape-2x.png create mode 100644 uhr-app/www/res/screen/ios/screen-ipad-landscape.png create mode 100644 uhr-app/www/res/screen/ios/screen-ipad-portrait-2x.png create mode 100644 uhr-app/www/res/screen/ios/screen-ipad-portrait.png create mode 100644 uhr-app/www/res/screen/ios/screen-iphone-landscape-2x.png create mode 100644 uhr-app/www/res/screen/ios/screen-iphone-landscape.png create mode 100644 uhr-app/www/res/screen/ios/screen-iphone-portrait-2x.png create mode 100644 uhr-app/www/res/screen/ios/screen-iphone-portrait-568h-2x.png create mode 100644 uhr-app/www/res/screen/ios/screen-iphone-portrait.png create mode 100644 uhr-app/www/res/screen/tizen/README.md create mode 100644 uhr-app/www/res/screen/webos/screen-64.png create mode 100644 uhr-app/www/res/screen/windows-phone/screen-portrait.jpg create mode 100644 uhr-app/www/spec.html create mode 100644 uhr-app/www/spec/helper.js create mode 100644 uhr-app/www/spec/index.js create mode 100644 uhr-app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE create mode 100644 uhr-app/www/spec/lib/jasmine-1.2.0/jasmine-html.js create mode 100644 uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.css create mode 100644 uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.js diff --git a/uhr-app/.cordova/config.json b/uhr-app/.cordova/config.json new file mode 100644 index 0000000..610c152 --- /dev/null +++ b/uhr-app/.cordova/config.json @@ -0,0 +1,10 @@ +{ + "lib": { + "www": { + "id": "hello-world-template", + "version": "master", + "uri": "https://github.com/phonegap/phonegap-app-hello-world/archive/master.tar.gz", + "link": false + } + } +} \ No newline at end of file diff --git a/uhr-app/config.xml b/uhr-app/config.xml new file mode 100644 index 0000000..79bb2be --- /dev/null +++ b/uhr-app/config.xml @@ -0,0 +1,70 @@ + + + Hello World + + Hello World sample application that responds to the deviceready event. + + + PhoneGap Team + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uhr-app/hooks/README.md b/uhr-app/hooks/README.md new file mode 100644 index 0000000..62e58b4 --- /dev/null +++ b/uhr-app/hooks/README.md @@ -0,0 +1,196 @@ + +# Cordova Hooks + +Cordova Hooks represent special scripts which could be added by application and plugin developers or even by your own build system to customize cordova commands. Hook scripts could be defined by adding them to the special predefined folder (`/hooks`) or via configuration files (`config.xml` and `plugin.xml`) and run serially in the following order: +* Application hooks from `/hooks`; +* Application hooks from `config.xml`; +* Plugin hooks from `plugins/.../plugin.xml`. + +__Remember__: Make your scripts executable. + +__Note__: `.cordova/hooks` directory is also supported for backward compatibility, but we don't recommend using it as it is deprecated. + +## Supported hook types +The following hook types are supported: + + after_build/ + after_compile/ + after_docs/ + after_emulate/ + after_platform_add/ + after_platform_rm/ + after_platform_ls/ + after_plugin_add/ + after_plugin_ls/ + after_plugin_rm/ + after_plugin_search/ + after_plugin_install/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being installed + after_prepare/ + after_run/ + after_serve/ + before_build/ + before_compile/ + before_docs/ + before_emulate/ + before_platform_add/ + before_platform_rm/ + before_platform_ls/ + before_plugin_add/ + before_plugin_ls/ + before_plugin_rm/ + before_plugin_search/ + before_plugin_install/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being installed + before_plugin_uninstall/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being uninstalled + before_prepare/ + before_run/ + before_serve/ + pre_package/ <-- Windows 8 and Windows Phone only. + +## Ways to define hooks +### Via '/hooks' directory +To execute custom action when corresponding hook type is fired, use hook type as a name for a subfolder inside 'hooks' directory and place you script file here, for example: + + # script file will be automatically executed after each build + hooks/after_build/after_build_custom_action.js + + +### Config.xml + +Hooks can be defined in project's `config.xml` using `` elements, for example: + + + + + + + + + + ... + + + + + + + ... + + +### Plugin hooks (plugin.xml) + +As a plugin developer you can define hook scripts using `` elements in a `plugin.xml` like that: + + + + + + + + ... + + +`before_plugin_install`, `after_plugin_install`, `before_plugin_uninstall` plugin hooks will be fired exclusively for the plugin being installed/uninstalled. + +## Script Interface + +### Javascript + +If you are writing hooks in Javascript you should use the following module definition: +```javascript +module.exports = function(context) { + ... +} +``` + +You can make your scipts async using Q: +```javascript +module.exports = function(context) { + var Q = context.requireCordovaModule('q'); + var deferral = new Q.defer(); + + setTimeout(function(){ + console.log('hook.js>> end'); + deferral.resolve(); + }, 1000); + + return deferral.promise; +} +``` + +`context` object contains hook type, executed script full path, hook options, command-line arguments passed to Cordova and top-level "cordova" object: +```json +{ + "hook": "before_plugin_install", + "scriptLocation": "c:\\script\\full\\path\\appBeforePluginInstall.js", + "cmdLine": "The\\exact\\command\\cordova\\run\\with arguments", + "opts": { + "projectRoot":"C:\\path\\to\\the\\project", + "cordova": { + "platforms": ["wp8"], + "plugins": ["com.plugin.withhooks"], + "version": "0.21.7-dev" + }, + "plugin": { + "id": "com.plugin.withhooks", + "pluginInfo": { + ... + }, + "platform": "wp8", + "dir": "C:\\path\\to\\the\\project\\plugins\\com.plugin.withhooks" + } + }, + "cordova": {...} +} + +``` +`context.opts.plugin` object will only be passed to plugin hooks scripts. + +You can also require additional Cordova modules in your script using `context.requireCordovaModule` in the following way: +```javascript +var Q = context.requireCordovaModule('q'); +``` + +__Note__: new module loader script interface is used for the `.js` files defined via `config.xml` or `plugin.xml` only. +For compatibility reasons hook files specified via `/hooks` folders are run via Node child_process spawn, see 'Non-javascript' section below. + +### Non-javascript + +Non-javascript scripts are run via Node child_process spawn from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables: + +* CORDOVA_VERSION - The version of the Cordova-CLI. +* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios). +* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer) +* CORDOVA_HOOK - Path to the hook that is being executed. +* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate) + +If a script returns a non-zero exit code, then the parent cordova command will be aborted. + +## Writing hooks + +We highly recommend writing your hooks using Node.js so that they are +cross-platform. Some good examples are shown here: + +[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) + +Also, note that even if you are working on Windows, and in case your hook scripts aren't bat files (which is recommended, if you want your scripts to work in non-Windows operating systems) Cordova CLI will expect a shebang line as the first line for it to know the interpreter it needs to use to launch the script. The shebang line should match the following example: + + #!/usr/bin/env [name_of_interpreter_executable] diff --git a/uhr-app/www/css/index.css b/uhr-app/www/css/index.css new file mode 100644 index 0000000..51daa79 --- /dev/null +++ b/uhr-app/www/css/index.css @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +* { + -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ +} + +body { + -webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ + -webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ + -webkit-user-select: none; /* prevent copy paste, to allow, change 'none' to 'text' */ + background-color:#E4E4E4; + background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%); + background-image:-webkit-gradient( + linear, + left top, + left bottom, + color-stop(0, #A7A7A7), + color-stop(0.51, #E4E4E4) + ); + background-attachment:fixed; + font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif; + font-size:12px; + height:100%; + margin:0px; + padding:0px; + text-transform:uppercase; + width:100%; +} + +/* Portrait layout (default) */ +.app { + background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */ + position:absolute; /* position in the center of the screen */ + left:50%; + top:50%; + height:50px; /* text area height */ + width:225px; /* text area width */ + text-align:center; + padding:180px 0px 0px 0px; /* image height is 200px (bottom 20px are overlapped with text) */ + margin:-115px 0px 0px -112px; /* offset vertical: half of image height and text area height */ + /* offset horizontal: half of text area width */ +} + +/* Landscape layout (with min-width) */ +@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) { + .app { + background-position:left center; + padding:75px 0px 75px 170px; /* padding-top + padding-bottom + text area = image height */ + margin:-90px 0px 0px -198px; /* offset vertical: half of image height */ + /* offset horizontal: half of image width and text area width */ + } +} + +h1 { + font-size:24px; + font-weight:normal; + margin:0px; + overflow:visible; + padding:0px; + text-align:center; +} + +.event { + border-radius:4px; + -webkit-border-radius:4px; + color:#FFFFFF; + font-size:12px; + margin:0px 30px; + padding:2px 0px; +} + +.event.listening { + background-color:#333333; + display:block; +} + +.event.received { + background-color:#4B946A; + display:none; +} + +@keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +@-webkit-keyframes fade { + from { opacity: 1.0; } + 50% { opacity: 0.4; } + to { opacity: 1.0; } +} + +.blink { + animation:fade 3000ms infinite; + -webkit-animation:fade 3000ms infinite; +} diff --git a/uhr-app/www/icon.png b/uhr-app/www/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3516df327b2f0b189b3b46854b9e1905e625ead1 GIT binary patch literal 11401 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

G6}Eco1+#ofhL~V^(87S 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/index.html b/uhr-app/www/index.html new file mode 100644 index 0000000..de43d2d --- /dev/null +++ b/uhr-app/www/index.html @@ -0,0 +1,46 @@ + + + + + + + + + + + Hello World + + +

+

PhoneGap

+ +
+ + + + + diff --git a/uhr-app/www/js/index.js b/uhr-app/www/js/index.js new file mode 100644 index 0000000..87b5660 --- /dev/null +++ b/uhr-app/www/js/index.js @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +var app = { + // Application Constructor + initialize: function() { + this.bindEvents(); + }, + // Bind Event Listeners + // + // Bind any events that are required on startup. Common events are: + // 'load', 'deviceready', 'offline', and 'online'. + bindEvents: function() { + document.addEventListener('deviceready', this.onDeviceReady, false); + }, + // deviceready Event Handler + // + // The scope of 'this' is the event. In order to call the 'receivedEvent' + // function, we must explicitly call 'app.receivedEvent(...);' + onDeviceReady: function() { + app.receivedEvent('deviceready'); + }, + // Update DOM on a Received Event + receivedEvent: function(id) { + var parentElement = document.getElementById(id); + var listeningElement = parentElement.querySelector('.listening'); + var receivedElement = parentElement.querySelector('.received'); + + listeningElement.setAttribute('style', 'display:none;'); + receivedElement.setAttribute('style', 'display:block;'); + + console.log('Received Event: ' + id); + } +}; diff --git a/uhr-app/www/res/.pgbomit b/uhr-app/www/res/.pgbomit new file mode 100644 index 0000000..e69de29 diff --git a/uhr-app/www/res/icon/android/icon-36-ldpi.png b/uhr-app/www/res/icon/android/icon-36-ldpi.png new file mode 100644 index 0000000000000000000000000000000000000000..dfab874d521fa539948fb6a83862aba6e7f10669 GIT binary patch literal 3383 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 E0EWSJ!vFvP literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/android/icon-72-hdpi.png b/uhr-app/www/res/icon/android/icon-72-hdpi.png new file mode 100644 index 0000000000000000000000000000000000000000..bec8104d34691bee5b3ba58c155280b2e9b284f0 GIT binary patch literal 7839 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/bada-wac/icon-48-type5.png b/uhr-app/www/res/icon/bada-wac/icon-48-type5.png new file mode 100644 index 0000000000000000000000000000000000000000..b998398a73a6d8d99a8b37a55af0ec876935fc27 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/bada-wac/icon-50-type3.png b/uhr-app/www/res/icon/bada-wac/icon-50-type3.png new file mode 100755 index 0000000000000000000000000000000000000000..cd536ea8067bc3ab5f93e8323402b9752ffbbf3a GIT binary patch literal 4998 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 SG)TvP#te1MbgH$SBmM7$Qv=?Rgw@`Y@YIM?0 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/bada/icon-128.png b/uhr-app/www/res/icon/bada/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4f87773280766972e35f3f30b00db75e6d6979 GIT binary patch literal 16334 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 Z;VzxdAeC3{e}Bq(Evq6^DP{KlzW_`zE|>rS literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/ios/icon-57-2x.png b/uhr-app/www/res/icon/ios/icon-57-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..53176e76bb77a7a6c083a3e8827e04949691a09d GIT binary patch literal 14643 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/ios/icon-57.png b/uhr-app/www/res/icon/ios/icon-57.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8231fd14bb5ab8e4f144e1ecb5d54c34b03c32 GIT binary patch literal 6177 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/ios/icon-72-2x.png b/uhr-app/www/res/icon/ios/icon-72-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8e82bb190e30525002ad9a634e16150131f8f3 GIT binary patch literal 19336 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/ios/icon-72.png b/uhr-app/www/res/icon/ios/icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..c47314bd5f9fd957bd57e9c64020e054af93a00e GIT binary patch literal 7839 zcmbVxbzD?mxA)M9fFK}J(ntuy3^{ZR%@9Kg(lEe)%pfyJmmnpebPH0_NP`keD$=Ql z(lK<0Al&hJp5J}nKkj?~c+cnLK5Knf?6ub3XP;;TJq;=fW(oiRK&7P#h2yW9e-Cm} z{Mlr?P6K~o!m2&Q8lj!A-gce{fU+an9>JmIZs&}EBkUY~pL{{c0RTiUNaKgthcI0k z2eiA0-Cr6JA9oKtHvk}~=;LAM;D*3**dv^gD0!~k4;@?_NJn`tGYOa|%tIC7g4Fc$ zL>T$$89Vs7IY1n_6csq+d}Qzd?g*?MhmZSX6h_8Jp6g$@GWh$y%|I@Wf01C_ z)I*p7hbr0=!66|cChQ;z0&z%6ih#r=Bqc!)IKZMHFi;e~OA3R;Wh5kJz)~Fl*|_l1 zJRO~6;86Ad$ihF#bGcx#9x_0nx3{;5x0ndp(-{bYKp=lHz+hoKg)qh!g|+h$Mq#-B zL4YDK4xUI4EE0|4_={*~kM_dKbKy1pw+ZeZFxYa82fr4fN%r`?d9o!?++*Lf0*&U``-oqCB$nZqwk5tcZ%I(DB8ix z9f87XLFKvdZ$uoCjxy5X($cER>JU)~SX5FP1d;}Wl_BDi;$l!yX$i1|=sy_$6R(P> zgfvuLR9a13O&tVM13{pYYU825uV7W2uF2Kv^&SY zJS>C!A2fhUgP~B6m>3B3|FZnwypI1rUIXHl0sak-|0`VnX~M_g-`oEVe*D9Krw;;! z&lyjAa(rc!CI$eQ2eqKe#y&G!mSjH0lT$yFbp4+5go|^8>$%Y4)cj01^Y#F=G&q{F zhkNF)jY$}YU%wiG`qC@A@+(`c^B&zM$H{ZXC2N7ju4gWWC<&B5buOJ_I?(L{vn`ml zUtTBH{*{44(4y&0-1*7+;1+~3~XeKP|k;&QFx&A@F6h*+_n3|eu zG(Ij?l_Tqos>;pHooR}x{ymT(h5>`es+Zc3(!C4jqs~tHw0C7$ShA2`zI>6=do6d~ zl9S`UVqWJw9!f-p8+p?u?l$$Hw#j=>=E*^KYvJ;;rkmU5=^oR?wWNXI63L|rYq)W3 z-Me=_vH}7~Z7ep{yV61edA7G8?lf?>wx*_S_giPDibcH(XXV3|XIyA#Vs$k-F*33* zjhC1AI%uZUc{#6xn1kqiW(gz+0@=Y;RPvn%GbNCF^HKu*{81GZ70b;N$@CUSgIw^^ zfp@`NE$`pYl1*$(mgA->vzAv@a+Yzpb1G@q8}}gkVFTCTkn{jrkV8`9?Xdg;hqld$ zQkZHawOV&9@1sY&_G4pXF55E=^$vYc`v+Q8pFVv`xN#HMswCz-#B=}teaH?fNJ04G zf-Y0D$e{e9wPqu65gni%WI|(N?HdpkKV%K;`rznFUkoIBnrpmZO6vPk>>}9 zdfXcfx=g>Y@^d< zy=(WaVDHQ{7)30JK|c)p;&XWV0|Ek;eW2txDycy;XT%$T*XfSc?>n>&PJ^!R16IH~ zVUC4!Dk1eWrDl81#lP4|qe4G9h?m`l3-rEq8e|stT;^v6*@qX#-UcB7eBmeCHw$88 zDWSSn1lwER>l~2?tv3JT{7@oNcu{}Kich7fj*R7S*mIrg=`XeqS(gLf=G>*- zv~)Ckgwnlhg z5$9YTf2nkHwAoOBs^h{X-;m#*>YiTicsRhmVeq zf<;*&$D7jyqa&7kKDCNKsh5!PEB#F}`C{!}*rvcPDl}xWIykt0sJ~eLgZGOeJCfNC z-e~fcGKBPETEVrB$NK1ea%rAAJU%wI(CRMhl-cp+rm}TxvPwcul2D&{et(g3A%^&v zf}H#t<-JSRnT<0W>Q{zIAv3%(_6`n)C&DG(xk^kmxxv5mbH~p$!(The#wh(m zUIjBjjto@pjPwIAbeYa;@odCPIw6Fw-(ujzN)CXQXZAEM0(ck{LI1OWDRIS)a2`x1&=+!@apfORS*i=vg9u3EF zhR4u~8D&I!Md?R{u^JfJ?ka_QQ$JrQZofcLK_D`Qz}aL_zBoYpILh_;84pVsO)F^_ z^LsZ&`29!5(mEuh#SaT;fo7?#ko@oYO7R8^{D(Sez%P&3WU#OLezo}{efKHVyZW?E_tCKBzd5fr< z6y9r95&B7$<%U|-H$ZYrzJB6uy5-7`AC*Qm{ZF<&^;ANk5I~92)0NYl+^-TplH`&% znHyZASK;M@37x!)9cS5>IU^ySOGQOJjtB=0kt%*u2(lizgqmsflFgBMl07yyZWq2S z@J^o{DsA}fN>qk9h<-x>V7bqtWt3uPCpj&NjE#X>$HOFiwZyPsFX#qI z>d077Dg~e?_sb*r}oO; z*u*g&K3rJws$BUC^CwV>E0J^r*&!i@xZIuZ5MNgf%Tp`Y*TTq;N#z zOifpSgLr=LAx&&bNUvE>yHCYr+p6P%0eQB>E-Y*H2LH4v|p+kr5onwzgU_|DMVkVdpkf z`LM8Rf|Zqtp)fR&=1mqK$>^^S(TKQ;PxS6&(}v;%L?qR*u?1nC@@mqznBp1FKQ6yG z-Co!{!(>Ui7Ye&gkF;|yEO#99n7EpRwSuOC&Rm6p6@R-tny)K|EI`kBzY1Ph3wf63u2f3;vDXBylzgda81?|-$tp=y2B4OmbW!wL3-KFeqgHLVnoMg!;|bEpt-%y;dm&C*(a8xc=Fn##VM zLiy9m%Ci8e$kE@qjpLI#jHP8CguDVusfsKh_nb;!tXiX#7>(SijpwDNb9+N3W@RhwIyi09J&{(g2J{D5J*FbP~fj{E9C;Z4mT z+TU335mZZZK4b5!tPOUbY0P<6&1bY6x=nBJDIv4zvGN@?lH`me)$iwi?@0)!!Yd1? zHy$w0NQMwz1c%F+jw`s_i&t0hp30%b2~Jd5vCuY07wcx|%KJU5wy1w~v>Ny6W`z3U zdgy+8OsMtIH^8T0lTUGu3keSEjJchGY*m&m;KB&S136e{N&}g!f8$+NrN?()yumc@ zR|$0)`W1Li&DGtus7wr^*5nN|C9SmR2&FFK8#hVYNdCR3SYqhJ>gxj53Zrm}b7^Bu zQkqu1GtQw%#yr^oZdeD$#JKm5$CbEv5`?;e09@9H$HwrUnMQXZ%oF@}^eL8UzLXvp zr=KNh!Y2|KSk6O`T}?n8Y5WCENPG<^n{V_2Xs_0``yIPhb?U%LoLqun%U8M#WP%iD;v&(4UGr-Da}!=EG- z50+@Wyf;y+CPY(7HQ^O|^j0{|5v2)|TE2{DlSS@#RtsReNIh-Z2bRIC3|FizD1cSzKo5DPI&r)pBMpcZA*?{ zZHXd3e-WzH^@p02*V4)M-c*V zb_a{_nPmEVKsIqyS9-b&rw^%y(&z^LbKy0kBSyFTId6^^=52ww-|LY?YzhHU%;Jxg zlK5bqo9wtq_9?@z2&x>Qb*nh#)h<_IzbnAxPkY|^+0x4uElthOEc02tbbPvbQ~NlfX-0i>hAfPVSyh5C)6mi$jBs|+oDm&% zVY(aUCpA=nqq=DJPEJpTLd+qvGq2n%q6ik_JNrgdOsEFser-&Ya@#lf9R9ZCUKW<*ly>&?`#;E=C!)abIEGtuQD+J!^v7o{S znW^;^W0S*bW*_v%vAnrYQKDxR+^@z{d%d{ljIg9t0yAM4GQ_;81CK^E03WDWTN%`) zo#54Dcjop;7w@U2SH=jH+k11st~oUx6Jut%zTH%LXsB z7RtHhohp$WZ=9<(oTgQXqGknmrgyzc-=~RKc@k>2ZfuVbu@;&=@fH;ldSu;z`WZ3P zwfCe8d2!-SPiiz>=`U47qK@vBXATOFj5Lxy@ZbF<&ta#NJYwwW<@Nm2pjmx7B_jPDL`6&tY{w%MJ>aa*Q%46VrZ2L3Y3Q(HfKAFD^Xf%Cv)0j;6u5MF{2kok z%OP`LFOz>1w`P{}`(#_yV^fYuXt4hDm%mwkLavR8Mct}w|CcYt%3;6qn&yI7`c76{ z^!yz&q`(kax2wg*${+9_lI}P_EMmRtXFX<3WMiU+TSE1rU{bIjR7J@5sPFUR5ayq) zh!@T4nG$Y>koCl8&r~4Q`w{6?6L*!3Rr@=8217)UHxB#f1nxz@M8t!jv7Xnb(Bjwq znGe;9(v(CzfH4A}rl$0s9`f+LMHx@P)^oghR`@VNCsV>LdW|C4Y*rkezWAhyHJp^a zepZ+vc9*39Hb3+-qu(;qG+HZqg7Cdl_vZxo&qh1?E0Xa(VL}XsWCU*cfG6bW8D#QX zfTxkXh={fJ1C9G(JawhLEWLC$b#A88_Co;iWn0Gep)L)#g=Gko&>Xg$&Zwf0wfa}A zl)CO7{Rv$fF0;)wW4^=$?1bz)-<}b;jTcMAu`BA$G)>aNM#-s%2RuOwnqA&= zL7EKXEPRWU?a^O()pcU%KI()X=n@*VMmXbR*|^eAV&-7{PG*O#LjNBSJWJrM{r=~G z!>bGSkqD|y-f7?Vt;L?3T>LF-_Sse@u@%3>Nrc-6Mo#VGX=UvLP?|z-SaPhn;y&DH zHz|W#UBAa(U6PPbjE>dJb|}Ug1uzbMXS+NG^JpoyDtrmdm303R<^S?M8%euY!C+Q! zq0?Yyf9Fj~m-aeL%jtfL`Ac0;;PB3Pg~i5Ad>%PEJsXc7S8~4n#F0<~0iW>;3oh`tB2Z1<28lkrV=+m5RN@aydd)mY`smRQD*STKW?D*$1oC9-JM28u@~5T1 zq9w7^*&+U8u#tZH9Zf!{y~5UbZdlQA{zjX?DU8RZ`Np|u{&VNMcT1dLSzT-OL`weQ z{?gmcg%@YWi7Ubn_gIbt40Q*uwQ>tf1(*TSSxsZV|{d=N6J zf;LJvVwXSDTC_Pa3>-*mfoAtac7#>8o`Vc-9SG)KJ`y}R1R!p^u$ zrj*9j&&bWS)bF|1#jSaRDO*>Fu?j0hDX;Rgjrz@i^(g4rudDJ{xTOmGZ4Js++dH8JFA*8dTqoLHQaM91Q zPj_CKur;_&&QMiLv*(2~W!ZL2GW8r+H8nPxqa7SJpG{}XkgaY9H6W{#BAQhq{8TkF z$j6o9#|A-#Zw!(5dHJ+(Rdaa+u;5dxjPJHf{mjK{LO>%U)s6knxe9?6%qR$l^Qt6z zojd1=EoEXc{qom>FMrUFWMyT7wn~oT&EpOmj7#CX^riJ7p}wN_uk)TKojZz^3##t8 zrD(qaKS}&ms2V%J-hWr`7y8H)i7XxKT^0<@CR2Rg8M~8rlXi_aWo%pwy1VCJQO(6k z##2ER28Wj=?XH+O&$=&1-3T>v_|qv<=6B5O|4RFiMp*IM+BRr+qVCsc)e4fk0I?)~ zqp|)8n^bV6M5sfBHWx>B4o);GOa88oPdt6lK(>U@rp=%nSH9ZsY1 zSvG!&WH(e9JE3T+=(C>to4htQbMk<#7k#iIMK+FDdkD(!N0<7$zFMgG9@w&>-he?t zG@;3w(-hn~#RRZlDjiK8`37?6`SJKyt$A_4_e*MD3_sKPOXbBxMf+~enP(2-uShR* z=IM}O_}OYq(6jJ)s`otfv|{Y7HP=Y!05<{QFtoP7y5mZbtM=h~O-5_bA7+LHr-4D? zWD4g@cYd*#RYqL8894siVc*&V{WU`y>)kg^HP05nz#bkJ=Jz+NWGsh8@qrpv_=XCA` zP;k5+SpTAihg;sKJ!V=-iloEC55YMo_%Z2tckb3lbVvvmsN4hD-ri23Wn(*}7+#Wk zu2~n-Pkl@AK@2l(-Oav$o{#(rI~|8~rI8}mN>#z6yR}1ugTnmagWmK6ZjJOh4Q6Q% z4zJCbxC(bcL;3*SP-yabTZ>R7*HS%VwbKXVWf){ZLr14GWtzIDB5~UJ{dCzivc#9x z>7-8Vt)ABuhgTlf+u#3U0Qe~7_4B!x^4N`xQ}c%pjl0G9+4zP`Q{m2|6K4v$k*fnI5l zu&*-N>&QP++^gQzo@#}A6k(-WT3TITF|i8#60$B4DP?{munkJxctX!c2RkP@PxKp# z*TWvUNKckNiaa>j>15A&8}D%?SMc%cGv6A3Kl_e;Sds`gTv4t5aiOz^|03dJiIdzP zF<}MHptGN?A5tG%5c!k9(@<8Qtfp!o#LJtWjdIi1%B3r$@4unh4`Ue)^0?)PpLxM? zt!-^hfWmgi{6E)*AveP z?xNdUxdGF`)@d z=zW$({E}VKI*1f8E6H7^mn|)FlhsG1#(DU4ZSdANkY*FZb1D|e3X+h;tET{Y8bgzX znER_MD{;Eoy7foZX1VzB;JzEy=SK_X{`YSWzuq$US@M#7!5GXP2Yh%_%2K0ujybPZ z=?z>zjE0p|(dkPaXVP2Ugci{$4c%3_8@@ZU=2x&jD>Jhu95ZY*@%miwr2C$FTFwElYD_+p=nd_Avb_I9Xd z_REf&ui~|iDAD>Wia-y?0!L@fwNhe`q)Z z-8`SU0RS<{Ku>F17dv0Djh%y&yEy$xM-M&N2`Wx+$gd7j_ms7BbW#fTw$lyP(6bG8 zu@#2WOG<#n0!5w$xY_wyg9F`M-F-v?#p(Y`uE_KFpJgt3@PCo`x`@;Nw^ByxT3}fZ zZ#ytQCxpWmBESt6;N#@xg9!5pvx9jc+z>8q9xjL=2RB57Ur+?X4gOc7e@63$+KcGO zDf|oTc_vQp=rEX)Pr;o{-pc&6a+33B(f4&-q6VfeQM zIXfR)ZzoS*Cl7b7O&k1 zm*;=w6_NF}v-b7y*7NXi{dWdvIePed_&9oaf@O92Ik~~=*0xUW|E&BIp#Qd4&d%G( z-wvwa?coOgFAs}2{Ra(r

B@$&0Rj@T!jN8+0(S9`(W1Z+j8B;FNu;EuX|G10A+VB=Z?w_OWKPc zJtsBJ!@}_$6L$gD0Tc*MV%o?%<|I$V!@+MT_6EnakC;hVzE zyyPtE5i#eo>n~)%3qo>iTZ>3o{#<(Or8hB_&BB|$?EdO1_U&0n_sNqAjrDv&EfL2_ zCp|WV)rZ7*>%?;S?s4wU961yt@k!q`7G&Z7E@)CAu=TCt9=)1Y95>ZS$s&fUphqRz zC=~D(qS!E5dR|YT&21i4gWm}{OLkvZVeZ|&TaoY+rRW{g)mNO``qPsEgzNNt;b8BW z@fUl>TAmSEzYJLIPTAIWeb;5H-b>&Nn?ba`V{%|szpYX7BT3cX`p&R~Qm}GdaooMh z*Q+fYz9Q_9CR1JGm_olx)5r`TzFb_Z02Z!!&PXbt!E03t*TztcQD`zS!pYXwyEfGT zANJ_DXa`)n?XHntFPv+`qnl>D^_2Lo%lO3owvj0mr3a0$|FO~dM)U=&RcK^lw2pKiqo=^w|aH&Jl8FD0W> zN%ng?)I41pBTcQ5B%+stJ|%qVB%&Tziy^|sdC^X!)|*$F#Z#r%9q$?CG!OkrN>nWN z6S$hqwi6)<>C5nnS|7MPTXRN2OT9T;^?0qFJFpU-zJY>li`>Rbaqg?_XDomlLA!wx zgL8iuP=*$WRDU-TRA^zq+nMeaHSULuyoju4Ho8+!5~gg*vgm9at5R;>)V43uWuXb> zopOHHq$V{ZGxXv%ocVaEr&cmP%SjR>XPt@>kqeF5wF|tivx4;uUTThamOr+E$sdnG z#1Y0l*1R81z|Z0Teot#y+UXCSduoX8CY-KiG3+pOO3n z645>BCx>HSv}^274#}MvwG3vw zX`)|#;NpLHJn9Li()f7=+_M_lRsNiME%(vB86)Dh)?=Vq@|s{$Lo?BVU>8NYMP03* zsWEy_c);ItC2}s4;5t3x6s7RK7h`4h=YCBDYu~erzRR{zF(YGlu%4@#C_%e3K5KqB zXl>OGJgZo?z8R)WN#Ps7WsX9R8Z6x$(8zV6j|0mEP9Oi2NJ&dWcqpO}%olQYF>6JT zhS4gYShrzG2A(kq1^o&P^x%9a&l5@iiHky-yAmQ>b?bo$x$m-k6bijbexd|WfRBFs zy;Zb9e$tPNmo<$W18Az;;pxMrNR|83ErW>sukbdyH=9e`aH{5`m9S>nYydO?pJtcZ z)%~A#H6#JNtc}cGe<64U%t8+vJ;;@`LQL>+YYjEuXkgC!U&GyJjog8^c_#ysca`sA zLhRpL`?!cE5wk&ni#Yd!u996$Qd)U%+O^zdUvJ74xru`V_3Ql`VZDOdm1GrD7C~wA zFUf?WqT(ENAFA``J@4tQW)ef}tz2D+!;*TvW#5F7z85FKnwpnC+1@}r&Dr6F)AW_9PlWLorI@b(w0PvE|e#K|Moo)AGg9P_fpDM(^SVC zE)7XsX9|SL&k)U7+8Si7huBvlOxMF`NXf{CTG8aN<4pu1*l5>;pDbBXC5%Ku-TX)@ zo=QFQ18JSIc|81E!o|G_(`Tj!=}e`2M?TFQ2KC<*kYLZMDoNVDCvD%KS^wyDbAaVlD`Wj-vJ8G*9zm;MGKG?9i{$jbk?{|{Hb zjYr**-8DzPQUx0ER)ZQQO5w!n)U>oDfw)VP*0VFOsuH3VDvDTLmXm1rdNK*T^8zrb z_`6Fnkr!a1@5w3W=e#om7l+9ZeqjQI#%S)oJkdT3FWrbYGrf<>@)X$6vvZm>wM%N3JNs|ilk;&-9% zhS19R?XfPWjN8d`luq6@*n5QV^~3rD((#Wp__q`(Op&;1cSN2vNC<>$m3mXdJ|l63 z9Jo;-sJ*BWQ$iE`hj@m?8%sNoNmiPI!jtCY>NG&&_=PNORHv`^_g@LX`NLpPT43Ul$HA!__SzR7PV4fY6^)x zx!%Da?7M->`@i)?CSHam#W;#c&KLQu4{)1|SBxzsDsMNe&pt{X@ zfEL#Mw}3~?gT00(LOSa>=BgANJ!@E{wbF!YeHVsl#~uAQ!eEQ9=C)xQz7ebrf!~XV z_OyB84#)BW3sl!r6+?UJKj;fCaZ?AgDaN>`m0YG0^&#~Aj1uRV3;K2Q~^A#^V+%g;g=!(vo%asyTqux?O<&sI~6XA}#xY zUUISN9yyVmJP`&PWd#agOg3|t1@tb|Tm`MM{Lq~s)E?v8uNN=ZZS0*@93!6|A|83p zQR8@z5!&CcjJqI$c=0dC0q@XiM{PZ4o+?X@SoR%M`UzWR)H+vw*Y|I$zjlwb178xi z+Y{3J(Y=OcJwR~OmjjG+T#PPq>hemTgjfX(P2%c8X2j$J(V4c<OIQ?8r zX=lakKXl|B3;Z$DrvTgJoU9zMlEaK)>Ksa4tr%b&>EHNIPwFcQ`?T6clF6v`nm0Ue z(t4V6__XP{p+wpw!(I%eYBHE5Bg2FaiAY2v3ZSL>3OLONNA`*vtED7Sds$flwbxr$^#+s=wC8(_m3ZY3wC$pbcV0G@I$pLEUHTtiam>1e`{s1 zQU5IyGAD_+<}R-R+sOPuq6M{9hDoGH($*o&>vD63t}f|f0_n6oz3_L)g1e67^grYkv$wD4z0cvaKjm^7>DYs=WY*5Bb5YC$7=CI&>u+ zcMuTRC`paBu^9bMJOcQoh^sdv12jG!Cm@(nk_VPTxD?~2lglllp(RnsV5;PBL9yco zyyq+FA zW2*?{s1MuyQu`_-@qt=^N(oP-$NP@;`1PRQf*T8Cc!-MtA0H&AMUB;U+I?S&_>BmyFu-^+ZY?FQn9rh6mQ22Jw7wr3aPFD&S!%tQS^)R)oyjTL8KIJ8qh81F*87>1+*AFY^o;sm1*OtR%uswFOS_yPeW(+u`|S`vo1;b{AjshEq5lPmFeen7n+}w zDz*z6n!d0#U~MbHNqW8L$Kb@ge@12WPHJi{Zm-FaE0Rum-W(%y(Wl5UpUg=!$3L^%qkdj=5@PG_|BC9kI z^eretkgZH^ffql z;e01r!-Xb+&Op6oinDqicY%sU_p{Fwy44*2FZhp^vdpXEzS_+98u*eRFQLTCp)5RY zahZ?&v)H9=J)gR9lV1tST~p%dWo|fO+ZF8Z!mY3ai61X`{lLy-$9Z{^RFXyt4-*$m zqqOolEO8A|5=m+(IQD1_^P?zQ3~BYt-(~D&+dc$$Ti^^~CQ_NM%)Y?8!uU%9ckYQ0 zee(!K0n79RW7TnR3_OOv7#>lOMJu))9kmWNvWP~5tsa;0=AafDL`g?0$Za@Dk8$;a zVp{@ekbN78xNPoP`_!etj0yBW8(8r-)}LZp-ZMRCYs@tV;%YP&k3mRkt^HWH0+ z^v5^CG^PyXiZc7ev@HU{5x-d$;P~KWp^0q^(6FAXf9X=7Wj2DK0!lo`XF3~py1Vg~ z>+yxBh}4a+I!yzh3p9NMVv95a-HrvXugBh7)oLjm7_WahXlQqVshNt+bEyf#pqb~Ae3qC{PKye zcwM23W}9gCB`g&$jQseaBE6sX7m3!{0GY%iR>Q@>opq=WNz?$cj8)T+LB9S~yo62YTs9uqOx4uI_I?JwhE<{X*m9(*OZ5y)2q z^;1h5yJwpHza>IXgzmQ%9w7c3u2lU8VXsSod$(7m$V%7!w{eDvr!T+uSfZ3o*a0Xo zgSARxzUzg>)X=`5CNk=kSQX7Q*+#>yNBhpmCj$n-zR+UKqri*e?zXroFCkHc3pA2w zwW<1IGk9Kt#*!J6(-h27BY#@CG59bYLqf;~dT@xZO~kO@c0S&Mde1gb=>$K1As_Lt zj=^W?&2gz)`Yvp3wIh-AB~#K;dzV&(7WQevGgudtY%a#s z%=*z0Ui9&Vl7fcIRy|?(CAs~%RlKLOz>jo&=Vt;f=CUs@&)^UjiwrF14_6<{Y}LRS zwAV{!((-br{SXQ%r^tWcFSD;S4|4GP+&$ENInSk=#p

G6}Eco1+#ofhL~V^(87S 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 MbPcapYGcFy1MJPha{vGU literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/windows-phone/icon-48.png b/uhr-app/www/res/icon/windows-phone/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8394e88c4dee9826578c7bc37568de3a31ad72 GIT binary patch literal 4653 zcmbVQc|4SB-?t@M%TAVQXtJ9zW-+#82-&ieLo$Q0%!t8QlI%;ikewpg*P<+0lQo2p z$W9?fLKL2H&gs1GALo7kc<;}B-PdyezTe+^eeNa7Q2#0mBR?Y*6%~uN7TSo?gHIX* zJ>_anvmZg}_=p-7L}P*j(Z|jMOQnV(+`2ab{yJ6ANp-pdV(Cu*aW zfs{Kk7#s$Llt&`f)if2r3UXjL5&}WW$*C#G!{wo9FcKyQ1OMjuH|!NK42jkR%WKGM zXhI+w5Ct?`Lldb9(Y%7xgd-r3-&k$DC(#aXkNvF|N74H?7W!YYD0L649g*N+LLj*Q zt^h+P0+Hb9L~sYF8^Zx&dUp0W{K1_~LIJIY zMnfR-|Ci@~VKM)osL4`{kv%Do|5Yx(mnb!OGW@6bDU*M;4;D|^Gai)9kv7_qNJYhZ zLmRDTLYiE+JY(|StNGadL$cln4fH8p3>S~oSz`_pdHdy*Yq6dK$PBNXJhc%;`1`D< zqx}m^2;DWo7w?{rwr3O;KT2kZWOz9nTm~$qsp;|C%pTnHk-cw;8?hiPH*F}SE)5>l@j4TQEIF^g^Xa zW>!|wdYSC*-#vBg`~AHa0W}>C+g&j-;#d@|4=%yz!ozs&DC>PwTAObcwI2k#n7>66z@< zVX<5RckZ0y;tEsnTn?JPzOqI{5fiWYUfgN4se}fOOP17v5eQKu_ZG6af9@abMB6rUhtRVab@9jq2>smKj3_S`3}@M%D?;DeT~|=% zN^RxZJ5L+IDcsOvJMO-fgO-w(8r{m9zttqb6LT$9rk0X)znY-;$0jt=($XrfUsCoE zgnKz^iMSv2XV213GgjFKw4sL5EPQ6e2l!}Tm44f!mravfX)G>IzlUl6@F8l& zx$0(Hz?abYloZn=Htkt|ToB@&_T|IrgN|f`j=p~T&hQ!o3sYx_X{nz|;m8+LGW(}j zZ3`8Uq4P=d2Y#VwO|@qq!Epdg|oJb6VF7x|;9&Oi1^&^3uqMTqmewH(71Ea#>o=MCvKXn7#6QTwW`9$;ilk z{qs3uqAy54fW{bPaBoUK^5$~CrF+#2gZ_a5eSG~0`*%Reogh{%)19V7?iACMlCK_6 z)w_2&Il1Rr3r{EHB(fGK^Qjd>-WP2RmCmvRrCeWg!$o<6GTU3@1@_rprGY?@_^-5W zC29}HtA+PjZ34D57PA!Nv3(Df+w516H9b-$kE~a&o=Lx7rQZw&me(T67%X->>fD|l!LZf-F8Ky+-v=Z+`ZNxUyl;jeQ{DxzlR*O@(Y ze3p8#$8gYAHe9H}#_-LwUUcnLyr$pCVM-3e>TPAK<7z$lD}{M(tx1F&PJ@V|6X22#Y4YmU!nvRy|X06#r3zyyf4#E^)^+Vu~fQMU0to&5_ou4K*{KE zs!iub_4#1w8;XjL^100Q3+K13q*eOGLcMy0NT|tM%YR&1^xOJ026u;`OtKn zU-2>LNcT=&6M``IsPc|25{2T6+j<6v!>cyjqD$*7NiLl_ua9;We(m&fJ<-b!lCIYi zL)~V8g5uQsuieg)a;D|bSKf!=-{F6Kz3~neRHxjuS*y`_)U!glsuy`25#F1j zo*xvLcYNs(US?X8387oD`)OQ@amSH1K}}6c*bdyrEVQ4;Yp3?*_i-hQ1ZH|Rq5FdJ zL4=mWI^C`nspSpAMF7L4;fU+HW8e-61B1a+V`K2b&NYgQCEh|R0Ss*&AzR;}(7DZ( z2t~R~r!X~Y%yX?*?fYi0Zf8R?znL;h(X*&!&MdeK`>{?w(6ugiyYiA?Ted|DI<2Rk zTFxO+>f)aNi+-m)nQn;HW!~X?(YxL}gG}y=u4Dbdca+>`Tj}Pdua*Wpyd4^9ALVS& z&_2k2o?oVA>&^KQ9w|~_pjulke_dRS%dnU()MtZ`km1KTP*GvgKs*D-PXz@8k9F7w zW$ahTgruCU+XvW*Skfw+S;0^bwT9#Z&;$<#E)(n;|j^EHP|fmYwuw>@#N|`d7q9^F{~j+ovSq)BKX(> zBe0tJ5pw=wB-8ougrVxPwDidf4duc5h1jmL_Y6^Ri|v)C%bGt<(}_t}KU-7pI%uW= zC;iNl=kL10<$%e86CX7-O~oWT*4^q<)L{|lkG8|`?f2Pw&)sDcY`2eB)&%@C$;9VpqULch|~_KAep$u%x0wCbw+&3LAa*J3*r! zwGes^*y*d-H5guB!0kd|GNI$z*7H+`+Ivosr8E`;KAzLC92t+xbZ4il@h?czDd$3lg*) z3&iqPjfNa^v-2<1`t67UhNXEpp-b)i+^}T2fkfZXX1do8w8-Q+@>1s;r2}4-PmQOi z+_?T=bYY0I_N}0@M6VT0q@H~(T2eIeRq#dQTVj08+WnN&*VzJsvns9XmOCL)QGRg` zbE=)pq--BQe6rAGFw2h%ST3`4a(Y=#4BJ~fXk_K}F{=+ttBC%_h~!^txqE!HD&Em0 zyxFLFWV3(7n9k5{Vjj z`t1!{#?0K@N-J60!-dkwn3$xWUwIF@4fnDa`!9U5`Q{YPTV+cBt@R!)!_uo_+OGQG zjbl)(gz|7nFGKx{+FH30(2_ak`4gJLGZ{@WzPv&LQbrXHo*#GJipq)%w`Eg|fLZ}s zJfludwKEJ&NuDyv>#r>b8%flg99dCOQ8cUaHnMdFxhm;2cvaOFU!RTVP4ym2-`)#< z{h-`8_QtF#ePLrmsBgPv_38Czjr@;BO(#n(7a*j>+{)aqc`~)FmWei%t)rTeq=YHk zu=LU3s%rbWu|Yj*8}G#@PejQe-nMDApRuh968fx7aZI%JL7|~^5852RVSw5G5H7Qur3;F<#zk(Rw8mZ zHAU_odYpDnP}-Z;e{a2w@*1cynPR1%E~jC+k^r&iOe^3Bk5-&(4`Z@u2^5h$5|^}* zUYx;sZvB}}NVI(TxyEgmB<0I0<2qaCA|$9`;^zwJ zBx)?qP9_nDzZ&t^K-omd1f}%zP>^VvkXVigW z6&u!*ae0F7ouH7iHzy>9yAR1_)8A-umh#|Ga2|Dvo%pYGO{H*nJVW0*FOfQNrC1bk29BJ;$<$Wcfv56m#7-IV)zX1G7 zfSp|~WE`yMe)D)`J-IPEdm8Ahw%Sql<4$gD?|L-g{n(hMiMjc!t5x(W`-{xA-TsD7 z5?ZM>qupZ{%NFP7^Q;Tgr1^3?BG?cdRV|lNHyb~?ADUDW4ny)Y^SV2=0|SrLIP<$} zT^3|zEZIZYR3?JWnU+SA#1s?f+d1=WiZuk7t*?9W70W={*~dK4WLE0S9a z+1n-7wdB5lBiV)O0}mTu-=5uno2L;otG&VV@Z3=E%bwelOoAN4hu4U+H`pF%m1D{x z=kxMN2C{=erln?*b{sjqZ{M0q3V+!(wu&vh%gX$#5&isi S^UBE&9BmDKbj6jM!T$kLJy{6= literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/icon/windows-phone/icon-62-tile.png b/uhr-app/www/res/icon/windows-phone/icon-62-tile.png new file mode 100644 index 0000000000000000000000000000000000000000..cc290c81e7cf4813aed22d9d5787d355459e37de GIT binary patch literal 6207 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 wF7dR1KwFtsQ>@~ literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/android/screen-hdpi-portrait.png b/uhr-app/www/res/screen/android/screen-hdpi-portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..82553358f794fe933d482938cdde1cae02fc54dc GIT binary patch literal 46644 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/android/screen-ldpi-landscape.png b/uhr-app/www/res/screen/android/screen-ldpi-landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb00a0046bc38f9823f842bbdee0ec4bef22dd6 GIT binary patch literal 15112 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/android/screen-mdpi-landscape.png b/uhr-app/www/res/screen/android/screen-mdpi-landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..41932d8b19283cba09ff29076351752ecc54c0c2 GIT binary patch literal 28912 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/android/screen-xhdpi-landscape.png b/uhr-app/www/res/screen/android/screen-xhdpi-landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..9e96534a490ebf1bb39b46427d6928867ab6fd6c GIT binary patch literal 77189 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 VUw?CO(4Kun2{BpG?1$Pf{}<$f2@(JR literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/android/screen-xhdpi-portrait.png b/uhr-app/www/res/screen/android/screen-xhdpi-portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..fc82d42a154f52988b97ae5e5e17f708864aeaca GIT binary patch literal 78744 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

mb3Ul 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/bada/screen-portrait.png b/uhr-app/www/res/screen/bada/screen-portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..346f688f294d70c65d0a317bb9c6e73a4ab1b2d7 GIT binary patch literal 46647 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 Por9?$t1441Wg755`Kh7W literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/ios/screen-ipad-landscape-2x.png b/uhr-app/www/res/screen/ios/screen-ipad-landscape-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c21a954d7a37442771117e769d5bbb49bdce74 GIT binary patch literal 87242 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 Y(yzpXx0UmP=2jUzUHx3vIVCg!03x*WQUCw| literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/ios/screen-ipad-landscape.png b/uhr-app/www/res/screen/ios/screen-ipad-landscape.png new file mode 100644 index 0000000000000000000000000000000000000000..a47cc10e84cc7ee8ec47034e29574dfbca1ddb1b GIT binary patch literal 86796 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 z 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/ios/screen-ipad-portrait-2x.png b/uhr-app/www/res/screen/ios/screen-ipad-portrait-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..34fa27c9ec6dd186487d784e38a0a03d28dbccb5 GIT binary patch literal 85806 zcmeFZ2UJsA*Df54A}SbEq=*y+1eIO|gdIdgMY@70Rl4*hJprXCiopViAOQZwX~X!oPO(ocI0y@xTAL-?-zB`!&ZICyLpt%=ye`K69?My`!h2$+Gjn zP815oa_;PD0~Cr8{C0a6(-!by9~W8+KDfL!E_)lg*?Id~dD^1XY}~Hd@}G0DvbQy` zwX*T|sIfhXLZJm6FJAV(tbIYr+Ra7W3i*z>pNl(q8ihIu`MFzJJK1{kU$eD$bX7S# zS5k49-_b_pu(6!Bq_(@dt%Kv)08d-P0G*500Z!J6Hiscq{*!)6U;r0eZ!3O37iU*5 zB|nwJ^l_EI?~xx%9OkEg#oI~c@b5)k*4E=!ck{I6mlKx}vzC;S;+K~fmy(r}mzNUd zmzI>0mXHMh$%{$JD#^(!Nh|RG`E?k~=4oT6WN`Y-pSi%FR1Q0Md%G)1Ncj5tiu=ll zyLsA6NGU2RB4bEPi-B*5dHK6~TltB(dI|hB!f9JCYfndaZ$~#*eq=T?Du=;J ze{aFX{qJF2z5bX97)-*?%3VTAToT#RUtiSL{{R1~i_72N_VPBc{l|L$KL_@@=v87F79CF)3%JZ;_^;O@ z^)JW!^Q_IkUW@d`pSlU+UyHKKECY0 zA|FFr`N97~+_$iT59|pBCh)(6ocveO5C6;9`EMB_ z|Gkor!j$Q0TB{+f%njm4svk^DOcWOvKX~w9VPQe+ z>U-xwRsU9Pg)-`l8y^n^e*lGw)eD@=Ob2PPIjz$IPu&i!eqJeG=^w5lNNheD9v)U0 z45|wpTp!5J{a9PdfMSjV&7;CmN~guMnr@N*h{6zm)r<;|H(!qmctp(s>< z8fr_3T>8`B&*_OHUyYgkJt5WvOn-S_#PQ!>{RlKK_QTMh>0QAvtj7g@|CN#e_^XuC z-}7A-1A{!b`7_2k7=tPQ#_tWK@PKtOmw}~#ZJU+c2qvj-PITK>P^$$97qqomY`Bq~ z*@B@Zzh=eYW=q_f-n;Z3(6Y0$;|-jy14h8MBY*igD-L(%S@Dz5ei# zvb=420UGpQ?mm`A{1|Rg@q{agF`#LEPy!gplpn?LsX4-Zo?{psBAOs#3R5rDVtzp z8A*rEL*I@~(FbhS1p{8Jc7H{D-U_!0B2I|}PKlNDo=7Ksq{-HRrIsB5s|aDShL6@} zL)z#jEP%<<9Bp=8-fdu7c?W6)Ok-&oAxmXb$$+$PHDISYaspRMd=J3}$`_SEn;Hj9?;3-wEW$;us zEeXQY66}-LdMl`3BybCNL+9kcZmNNGuua=u5}!*@?AOQzK2sgt-6kC23@C3bc$l~L zETl0v)f6>h-xM4;NgVC#>$4^VuRYN0;|4JG0j40`c>>1&Kzp5pTkflvYE-WJ{{89k z62H3+2$1)KZ-|%}z()g2@IB|Dk{g8R+^gO)z^~;SUGXc37hPDvPGqfstxTwn3eIgK)~I(K7(N%u)`2vHDdQV?9QF0pVCr~aM9cP@t-AWx zsU}j?KKv%tcVKOdZ0LOn|1=Rk!`M?~3<6063~@Pjnr!&k7~gXaY+{C&ho{6@L#T~- z7YZ6`N=Qf$=Ea+WZz5X}TbM`}$)pt~;J$zV&d&9&?KdU>eBa!B7lVtEp445RuwT#* zG{ip@Fs;WDR6e>90WM#wfqjZPMgw0=!7>U8E3YJiCu)Q%mKWnw@M~TNaT`QG>>nkx+BP$Wxtr-@Bw*9G`hj6D8sf+~-yK=sPD+)aO~}(`i=JmvJi_ zidLcZIOUb$mZ!1hZc9r`n`GU=&2c>KbK^5*w=#-6zz8X`N1=Ryr2zHmfblaBdHZZ@ zJJhI-!c@~=Ic~vI>KN+ERBlPG0mc6M^~oQ>fkeMw3*Ft_$AZwEIah^2w5bT87~Z5^ zI!0yNp9}H4BpO9C7g|^Oh#fz0foh^ko$m8rLg=@_O;sl2>ghTx3QGW%d#!&-3(~kW z)wDP<9(6pIlaJ4B>>*{UvlHqelgZC3H;3whE)gTusexmELU;8EFe(%-_WuNPlKR@59vrXB~ z_p~qHy2j;r2@Me5OmDBzZ~i_9u+~p`1npPavp1H3MWb8HbV! z0-J(Y#Gc}!jy*MX$1!i?oE1m)JR#LVKKyV}GUuEWmjNEG9JTA@044)5+QE z`j;{wvovDFGFnevnag2)aS+I7+|BeQC( z?n!ar{&tX_Sf5{+NY8Mk7Q1&ewd&@{Q#U4!BMAo;4L19~KRljS>bbsLbHijsSs z6so$iR#U@sw}be|kfRCqFWn#;78>K90t=+Tz#9?fqb<7nKj5YB+bk?r6J1+$v(GSQ z=>}E-(}gp8Q?EiRYfZZE`wjllkIc@ZctG#XM-?+aqCJaS9KvN_k*m)^`pGMMY`pUwLdOCXiqx zA0GpruBCfA*cHE4XOW~D9AK5-mG9dB5t#UuQNK3o`ejvg^u5>0c-(_`@egrPxl_8W zpJbZnHX2LP({yO$bjW4N7-XfOshpyjzTyH}2`zvjPK63Ld z$pqTBZ{MRw%HON12s|b3D*8*WiADkf0&ao5y(JY~4U1eEmrMW~=FwzXkHytsbBb=ye$US1 z&BKR<3)O1f0f_?81JE!b#{k`OZn>lj!gx|wVIqBKy1Sdh+;3=c6lBkm<(?d$9Q_nu zE{8Q`*4RW`lz9g|fpdxi+n?vY32gtIR`2VbI6g7aDev6%21kvE+X1a_EHz2Ii&M2p z8Ew_2-r86oZcLc@_FwwdMoFc~K2wxgiWTM^Tp^Vs8MfI1*k!-mLBP#HR7E^(qqSdU zXiChjIKb0$J%VNU+j)kJR86n~a)D!Onr_e{;l@nQrP*mp0Zn#$V!{Kk2^^4f8A++< zpl=~ly2Cf~Bp#F9SI#gV;NmioLdiXT63Pgi#PC~tkc7d~cXFkX4VmB49w*|&6{{`U zwXc7y$KC>RB;~gpLBt1Eh}i@_%4mdFItx*XRf1NV7ly0ib)kL|KRTK~$g`-RwPhMo zf#qy}iz4z<)K;KREWksC$U{Dw1YZBO(RdCX_iNXF^*9yjXg@o7W4h}USIvuC%!Ljn zBuDsY)}N^H1+Te-O$2Fnf8ktjcoJTKh`p0}V*tnRP?ftp=0@OHGPqb?5#vV?@uBc&KFhfI~l zAq;*M1JUl#f*2z5X|jURqW6nsa;t9QHdH{?16(;M4_KVwqwqz1ZNP`XsZrzO zj42T~yOcBV+G-V4+}yi8?Ohom%M6IhNJ+FyId!@B#%!qx;}$xGNvUB#zPzA4j>TP( zlWxAVPuR}hzNhb=xqXTqTztZ3QdhVV9b0~6_b_>bJKL!DeCeL&C-i2w>Uo-MjRdg0b?mt>28iC3@guL&PH!p_dFLsT`Z zy$}~0I=Owrx8J8TU6nEsmkGSjmrIG>E#1tb&^O;(5!@=%bh2MZMf4enTC^aFLGNh> zSnL~`_eNNrdgSg7GurXrBp~nFcNrfHlP6%pr9Z-y>ncf; z@5AtY^^v6{u@xCK;9fdGkod+sZ{S~As9D{=Dp^=LZnV_K0D#@>tQ%jQ1#8f z2NeF+$0|>z8R$H~mKp)E>m_7+u8ax?~AK&es(#QSAK zV6czU^B@bZ%&yNK2S`)Nq^GD?ji{{NQvappnMc9ZSg`)OzR(PuBz~pe*CH9WlagLC z6c=D^XE&Ayts8I7V+NCm#EOmnSHG*74ki$WyDtF^1u|tvPVaf%kJEJf5_nalm6c2U zm&S@pM-|5V4=OHZQ`c7{3UUFRylTVzgyusr8*9YPZ+i{XY2K=R2F5s_1l$$iTvlBW z4DH8|T-y6yFW{2MJKE#LusncBBW5g1a3hvOV)f(tFmZLnV23(&!tO)epojup67W9( zp?mD2F!eEhtNCLS{CWI`Kml|^!!svglpOgGntFsPS_ZWdT_Z|Hq6c0PjU?uv`T0tV zAW$QQh=NdX$-D?3J!XnO4+I2|tU#F+Wf9t6Fp~k#WI!rhvk!&K^I~wkt6e-rg9Em3 z@%%O#c5Lo>KYiQa<%uGfGp6V1E{l8g;KE}@N~3ef;l6*`Ly*B;M9 z7-*<6a#H#EV@!`N<45vqqU}l~+}hwCt;6C~FhRc%1-nT5&twY==}oRhj$l@0avK{qaeG=rt5K1&iX)kPH`Ju{(xXegVqm^}(q z7Z_wT(59vU7uU}>scT>915$@t2Qdx3zG4C7lFCsu1C|0rp3@Zy$h^_8;cR6;;6-om z{wR>A+_)S@5s%yM?z94c(8oXRo&VmA1!?Xg;E^|HSTw*-_3%g^;>eLBI?t5aX%Q>3 z=y$QmehY_;Elmjrn`O^?7pW}gPlpH6tqa;@#PQ$qN@!Di+7dvy&Y&L zjyVCO9XpHKLT_-eff}X%WFOUHlcG7^_^iZc=(KD7u)bF!;Y&z2+4_wiC{38GF9X@ zh@-Suw8M8*8nAVPp$_eIl0M)HyvdaH`}r{Nyb~wLpSR)GVDLOpLM{OT0Y8f1xX?+7 zxbqO@(x6w9rs_fsG+8NyPYBE-Sj2l)1j^Vqz6NE_9eO?u2?a`G3k%50usL1{_oeg4 z3(cv#BIoXwfVFmAJp8CNU00$&4Dg-S%mZlk7A6lg4<>aZ?d%$Zmh+6_aZx0CrTPg4 z5TYNU0Mc>}v?Qd`R|e3vAD|18(G%tfiVdzGTpO4g?tJz7vyv9{tq0WGzy{379i(#L4WY51kN3!}Sr0z?TU+4Eb%1=oj;NTRa^Ywqiw`?5QA(^@92`!WuSEJeXnc9 znjIHYh#b%poYxpYTGv7}YFin(MJruLTkK=RojZ46V!F<=W43{HwOGonu98_8Lxc-- zjW?d)!zn8ZQ!S&Gpme#`&`FnwFz9`7p1-9H8Jl{1LppqfppgO44P;(s3d-Lz=#A<& zfisnZR_BlB9sICi45HzPu&;C9hkP3F8vOIKaaK&|$FiSJtW_IYuQTu#@ve+hs)zw> z4LyE-3ay9_MWujb9&*Sqoa{AMwqgeA##<^|EUtYWJg9IZ33mWTTOyXhliBg2eQ&HP zSrkfhKr{wC3mqF9+kLPLzp=WYfiDO7G6Qls3R+W>O)Z9pKx`v*t-8Qb&?$LMPjg6q z7K4qZ&SAC7kTjQg|KM7?fiHg+U&=u6ipuCq;wh?$2~g;I_?{9I2~Su$PZr*2dQ&XpCt2FaOT=ChZ5zwYWfTm3+wpg<;3-lZHYGtrIbuT1ylccweP zN!>oXQEyLsPFkSp;SZd@0ENQ^PcuKb%f~Qp-M}x;ZdHwf=QlU&T~E2*jM;T|OSQg} z8b5Y7|InFGK|zKs4q8m{hkxojy&DW5ufAX2%o&`UTgc!LF-GlYWfI)_SZn0%&SQRs zvFfg8`2`cvo^u=HUC*YaWRy#k3qS_0c==H%JUy`aK3+}L|uvER(^4eOw2>!Ab-dDxv(u6Z%R&-NZL+BhR{9~9{q%6 zIusUjm?4Dq)Y%t~;kf6|3zu_y-`^T|Z?rN|MbjcNR2)S8T126@F)}tjTPL-=(u%Hi z#gYhTqgpWxR1Y`9kWeuDAq6xFj5F54N@Wd;qeLc9yeunjlC4d!SX8imdWWVE<4$H~ z(?W*@piI~}M*@BRET!7w$pNxD7SGnhX2~DMda8O91y=MjwNL{JyFrNr700K^_PLsL zzJOly@}SJz-1~d4U^qT#if-e&&1=(`q&Ni{fBJSYbL~ z@cQyI8GCW+qx*vvz@9-uh)4Vt#ab|_8q`$HF`&`Rid73(ua(S|zoYIy z`*39tkB=8$F?lUK%D|YFnOW>UbW-T8{xss9jN-Y>^UzkZCRJOFk2NZ)V{VBN9Ud9U z!7hHAK&XJVw)X~X0U)nmt$#KpxWC7Z8>w_oF* zIL^AG1$a!~WzaAY$3!A%%5N(Qnd;2l?=rsyy>0vU*7bAOt{uj`Kum>0Otp9_CnrZ( zCn-fU8L`<_cz6r7x%Yi;uDpoI30c`TPsN+4ucKUyJ29AaqU+}$N6WT&jW?Q=2Zb-* z3d*~`_Dm1eG#l7LZUt##ZE08kOTI1e@B?kD0#u%)-sQ`j)XLs>PR1M8)q%ek5U-C+ zz*5(@qX0|^HzwOMd6eJp+O2vi`UUak z&6}>*$m$Ln_`Y<$x)Y2$ckjNzgf->0=69r{2%pFM;`geD+!=W7QtIpL$zt(}@`wBDL89?vY2epg4`w-nrRczr?yO+44uy5l%H%IS1TXC6IWE zw&mn^Y-(z%MCtrBcXvr#D`IqKy3zI0b@59>k$eG*d&DNHKJ)kWB6gRRlZ%ZXe4UkL z;AWbB0{vr`sK}EFo0`2o+te4PVB*>B%2E{8K`c7#2EG5C0un zDU0Rf{)ka{yV+(%u`Y~JckcMl77zYh;Q@ASU_`7-srtl5>A31ecm4>dZTE z;Iu<^?${3i*M;gdJGZJ>J@6&1BSV;CNq9K75~*56V=L0C@)iL}fC-@)J_$JR6N z_%vd0OxlwKWpbqu6PC<=`|gwueqG#D@T{FY^XWWwe}8}5QJ2r*${L6#X6D)tQAMwO z5HZ{KXJ=6)4Bk+Pv9_T>OI!P!n+gC<4>JnpyPL z1lbHfSQcpP?Bo{_$~1OC)(TFYd*iq85Ol2rUH|Y>N@KZjBu-jdnrS~m8h$p0BH2(- zluR>drP(*sR{hgNlQ$@n?cfAO{Z+UY2mmRn#~M$$>tMMym~6t>zKM3(*jTvCw#|+| zzsl$O-;vO}@OWV5`gNNhm@;lXUYcDhRO_-cmKn zjE##ssC?rBi$hEb-zhElMO$LY)nwc#YshNOh!mq|G(r*C?HwJo895X3uwM?_=I=4z zQ6hEsFh&t{FXvy|hFd_;WyjF96$Hd}4heIE8=<=a72TtWXh3NTZ+`eq8EM##&SYdb zoFDK7&JG%_9bH^ZjALeFWo<674{~-+GGHE&rm{Bk#a|-oP>4`+266OS(kldEwB(=L;nwEnH`Z0l4ScxESFhf(xC;1l;{+W=oGRv*MotPO z07AgxdwP0|@^EggY0)?5?up+>7+)H1YHwr0lqvbnzHXghX1tYn{I%#mrNuJ&>XpeS zgT*|$cY>Sfc$%EsQJxE>@PVcBWT6b6`F;f?_cdC)&-7*xe5f=B60ay;pXn{yN=XOA z2^y=+yLP>B8!Yji8*AXcV#)8TvufZ>N066ta_@SwHEdFNLO`V-S8IMf>HThhq4pSW^zT0vs>U>^{_Dwalwe@uk-|{5EUUBS5PLk~hbq2er$aHIZ zQ=LSGv_mt$G2_tnNy0&RC@VKtnloz-BtgIwQ{GB-y5V7AU4s>wnG@69d;*6LgR>U3 z&BXPT0A@DOE7bpNYIUXgz?Lmr*d@$=sUl$UuX)AyP*CJWtJAAhgl+ zEicdQJ95Fj8ap(!$Ft+JHS^08$S5^Q^epg9<#Q1^QhCTJ`vkQ6_eBrRO)wL+~+o8f+96+fZYvAKmzHx8wfkTvu)^VZFPUxdK z&|8vyEnC@rwu3?~=ymjVOzt~t{`dkbe(@D95lKn+AJ4zlBI06C(|&|V2fFtKoy8w) zZAvOONl19ya9A`M19#MO`HR113N{T`?zUejp;J*MGcah&_34-+hYl^QjaxjCvCrj4 zo0a-`98%`4jtXUKCw3V5lV5atReFA|I^v^bC*QofupPr|T5=&RQUz;%M`HL!1tM zt2-ih^O&YfqublsOh33M@8xQI*Gf=QS0xd&UH_mWC79}Q7V;XefA-yCYCC+3^;8C$ zE?$UtxM@eeS3#Q_OI~C3-KG8ol4vp0pVDYWZ79qOuEd1+DD{86^XPl_cdVG0*y!kJ zY;4gsN>vnM67HS+Zs?C%2pcK~-uzC{+)cHywdE2kKb=NHArgMgmaaddKS(h<@-hkw z3X0TWcTd=Vz8Ow9c@0c(7p|<5Y!16KTon!Zk$%EHPO;ZgfK>ke{fwGZ3ZF+~U-5CH zldq;T%!mFG$@f??PzWgJrgvQFAi^J&6v>r*ip84YNE}W6WB^4+_4c>fry4$0K*F7{Lrg)C#g zzm&fN`k4Bk&DkOKM}f~>HfsH|#MlH||B(^ic17yvJC*dzNPTa2 zAbIF%V=8T4ikX}^IMS3{=2JHY^oy2EOc1<>mj%R5kkT{PFJJEreMX9o zK1UQ`pB`$V-SFWbz_LsdOyPV#W_p;~@X?tdF^D=;B_@hiAwq$Tabk(OwaAp^ruO+^6;aRaV%|LeV74_*m6b0Wx{t$^5}`zvujbqi{iAj9BhE#jQ6_fHo|>Wb4@dA92Gk;z;X-3_%2DbApm+%< z>Eu?ePp`jRb0;vH3U=}_C(sMuzJFJxeccD7YWtM;?(fdLZN%kh?BtOPPfob@t?EK5 zg>acKIM5M)U+f3#2mWJ6pIj*yk?b`5Ohru@79ir7_EWYq0asLG=&XOn%Mic1ckeG^ z;H<*hT0xO(x96`g6uQ6IYkYmKoLkk|&(t)j?MVYST!~Nl_z{le!?7lnoW6`KTwk5x zwXv?)A0Cr^4oQ>7e@st1-wjtsg8q>37NpXZ-^UsHAqCp-{58A}N9}X7YpC5MZm#u$ zq$fJ}qo?Pib=Ccc5BCPx$l-BTV6rqaXu&DZRa9i!bT*ES*{$cbPk3v^iKZI&%De~& z|4YWRXQv-Vpk}-rmX?;5lEUxex^rz;j5-7wTt#6#K9ue0p#XP_RdnXzE`9;c2!{(D zDPI`tP1i{dnk%~$8yg$vJIW<;yzVPjzS6U4iXcn%p6ZwZWpaY7I<(ZB{Y{ zN{l{D96XT@mBO`vL&iD8-J?QFv!TU5>Gjn4t%z{RNe968VD?@d;m95g)J+O~JH}B@ zc$dU7LSpD^BP#pOI`@poBBqkVhA9tCy{pJVxJ`35*-{sZGyCXWbChxMIqk$tqUN}2 zoJ#-f6)3JK6+-a7gz(PU*36gC29x9J{2nsVFkL4~QqRND(b34rNbPe_w$|ypCqtCs z%B1;sj;-S3^lBV+7_i~OuWu6*t_VyXyc0g#O0bpYss@Ge6C7`_bHK89BA4#_B9&Aq z1n}D_9Ov&C?tv=@Z-89Z$>)m@iU`YLPm-{JHM3gG`PU5Os?W*%+7KD^!7-5M{Lj#+ zsGW5Pdl-{7*{K(ZjkDB&PQD9Ufk{TzvgjiLj5X&Uz(r9gR4D1pk1DgOC10rQ`-xg-aA} z<8PY8;Mc)CWD)Xm&edh#VJ;D+BaJwIkyOa{*zx{!MC7yHK7kZ>n%z8=t~{4v#g8{; zu2+!-7R6-ciXP91i}mPvYuyeFpv;;%G+~dC2osNkB^ zsfondXin-lrOE_}fZAEk_fY5k31J0=qJ5gs;lV8x=f%X{a-DUgKKLEp@UfW*3^g8b z)Q2~6NPLGC9z+my@d5*C@jY#R*XC@=+(59eZTMDn!|~hE(fh;hogWL!i!QmbvsL%Z zneWdv?lLm3Ca}{(984WasiM~*VCs(Vhaz#H+aXfp_8Av@f%)P^@2NN@bc4h};bE3x z+u0w0r44r>k@=}uubIc~_upc$XLiO_XQ^mS8u**1Ou^Rpup%v5j=fvLD9 zRS?Q%%kQdT(~23o`u`g173!=ZTq)duC7(4=L#&=_1X>DDvyp83xL-=77P#VZGoR`! z&fDgtGGz7DBpNHSic_@9D0v2e?2|5&nEp>{w`dFB69;!m={Y%NQ>kWjJ~IGfuIl%K zNcYvaq8mYTFN4+$`l4eaBRbFGOpM+KzTiQdm3vQM@P0o1uulu~MdR@&I8RSck>g1V zQqc0QW=UgobHd-pDa1NT+|U6%Wku{^kva?YOBBsL$c#H@ zH~|hcJ90gq;+WdWRdxx}=d89cfBi;eyD>LVmUFeJdGmHllLS6NMx}GM`Bx>pM0(+6 z=J(xWCnpG9F}hOS@3lRIUG%b`d{Ao|ZJr2&l+uxR)t3tUeAe`c3Qd6)4e6qEuX02J zt|Lj=w}V#D|IsILCEH)|Fj?L2JbtxH;hseA2mL3ZAH649n!CE%x*Rq$-@JKaL0gP( z_44e+=+LBABA@dHPwR6e`y!g|kXWSQC&28F)_VH*>U3ESo*+>+sTGThi@$h!!SVI= z;XR$XW>?FD5)Lxnq*Y&_1H^TX6RZ5PJ>;7dY90GS~{ml?VvGH@ja2S*XP#3fz7=mOc3{|UPf?b83&zdbAVn%3|{RiO=C?TrY~Q_}icGLT^3zKff| zHaa@y9t-!at45?*K_&XT*KS=EqX8BBt3BKDswjek5_uQz<@;G9A5eKxQqr=}dJYXs z7xGqgc=@TmhSEIte`{pC0t>33;wrJtd=qUc$l@mNABqQTaFAB&XN>oQ_mtKbnCB7Y zj#s2u;@0=vp_jR*ROw}WVG=~b5HBzWsLj8WBoVG7k!0E*7qx6_x0kc<~#(KJMNCPCO{xyfct-avpxci=^stU*>UAWOFVJH2l8oJ+Bl&`>BNR z+=evbKSw2~l@A9JhllRTd|BX<4F2P1X< zh7kQ(1w05Q*ZllNPEt6>t3gTgZng5mx)0ak7xKu=_BWV~!OYKTZS9IFL~vh8Wo<;d zS93VNPoMm6gyT{mb;zq8dpz#=H>_$Z(0=yk&YX!*Mz(D;$0-hCUXhxampAzF8v|AJ z>ifPPr{8t;hyvY(cNGufSEGR!zkgSueQinV>-)u{e4h_WV?;Yz;B9_1J&}5OWomZX zV8awY(yVK4Zl12ACcaVXXMpE~yFZ50G?Q@B4V`c(O>ZmcsfEQ5>Ee8_Zj&5Yq3(R4 zexL5i&kc+QaiOxg5a>t<_6uW3gi0RuBUFI19eFqH$W^DIt3?Aj9O=Z-x(2AC8MM(r zY~XjJ0L`h!@l9decIM~j*Gk94QL1*p`ZrIeKrPAcbCCc?vXtrlLf?}Z#Y$j?Y)SP`L{=dk)v&QH*=`kf9Iqm=+*Sa5N3udfah z#z#h``%Hp1Ry`7!U#d|(!hcV`qr&jTsyHcfmbO z-+0b;YQBli1?Oo{P(4Y0RHBs>8t}bpbGazD!m9LwZ%ihXORpGKm4^z45Q3%7;p3kZ zOS#mZDb<*5lbFD0L07@){b3EL&iIKb8Wt$DJarNOiH`Xq@@~K=j_T^_m2S!FK4xam8thAari}FTViFZ@ zB~S!bm!5M`GrdlOZ6wsiyQ|GJGc61A`@^!`2aIqGMB zOR)Gqkt+*i6m@8>QcCZJd?i*`N2CfXK0yeA^?CcOnJ)T`?-rLt9!?os~pr2qq=Qfz)rw z4;0l=1UjDV*@d*`3Ga_Z1LnmZ>ObDk^d8_oAPP~Mn!rDa@-i(=%%r6eYu?F6y8=;K zfV}(@3W9t5SLdyqw*m2yxr;-*bg8jdJZPxUF(G^x`)y2AD)b(XTK^!-D={xzO zH4JysP3xhJUkx|Dc=2(qH9wAA_oFFoMd4C^vA~Jb_=#8X>Dq}$=tltpi8tM^;#Yk# zGNr2R`Qs_+x#f*}s5UCpHp9n1n+}pS<*0|~;(J4?%&B4kSga-!bO_oq9|4erFrXuL z^Bg<*axb?8h|dX(ncwBh1}$&e+GGQq@iRSgiDIV4#_J1JfzaB>qk&+!xw074@jT%2 z-o~O}+fZEb8yHx`eByW7hse=PpsiMxBRJ~}MoD&M^9(!0$b{mQ){6t}P| z!ReBPaglAE-Sz@pGOp*QPzsdX!3U$m!yMz4XCf;}B{FFw$k!9g}g z`#@aW(~jmY_kJ*Fe+fl9I=Yc_i_b*MEA2%2WR-OR1#TvI*e}1QgYU~pZU-e9?%OBr z6}WE?xSZE62>oTf+KoL0X16HvsEh#jX}dqaCbnJFa>_ST0|!X3`rfuivl7!T!k;zJ zC0kT68mk_`{6Nkq9JKbJjr1>HDj#t&o_BF@D8*3^2qg-}iTam5Z3qayz)XIT5Xy$+ z*RTSScXBQR)CLB$S%uM+o<^*^)3@fP@6mbXhtGr7%y=m{^*n-bKv>r=l@}11<)0&M zOd3VuYbI7O#KECp9<0TynE0>XGoYu@aoC#ezNZI=7^!(uSosQD%F z*Fdx3-km#Ug%0{a@~XlP*{_Ae1q}@!8a~wASh_3m-gzKs;g_z_DJxmrjn(-d0-7zw zPH2tO8N>S<#kau%?{+_a5xs}2+jgQwm@k;D58D613){*hHe`f^d_Fbdj7qIby58a5 zzI|KlL}g0YPOeHsI@F*i^n?MSm9g*4DGbXpAR=$97?|T%#m!4ssVjquL21$j>5-8U zdqvUTs;YExt3#^6uxSOZ-!izLwA_t_qRI`QaGMWJ8>B!6Q`njT&fWIt;J~qaUtjah zhDneJKlg%*KacOqgiKCNx%Fp(@^=>oQ{{#QlU~t^)DA)JLXfLw&5unIs3$7G4FWR% zAk9#4eRLzMdFAZ6bHP;n=HM;~TCOfp^}QX~{c`tE%_CtI&`f{#?%huR@B*z++SwfR z=*IV-c4(Kud}_W0?cu;B!P(5tDKAe?%)t{50gog|m_wzf^QH)O&_41PFccM@!VeZY zT5D)*!+9a(ck#qFW*~w~}8>$e5CNO-iJM zh)9O-oNE6^jb|$B*2-sYyXwO12}uv74=b*X#Lt3KBR#mpQ5O$P3|gjdeWuv+ov1eU z;DX&m`V1mp%7vyYjy6paq#<`p!11RJ&~wSt-LSQ<#2g7@p{FOz)msqEdj26ZnuSkl zW28o+$hAM9#vc@1g>K@}6QCIx78yA{-juB1mK@`R#eXddqbiKvg00s+{2r0sQSV_v zMwFN$l+GNLJa5M-qG9Udq~;Nyi%&ha8FZUpa3O~+;o;#jc8za;Vn~>w zK=?(YE)yq0TfTJ4IC6`|`uyIn>8B-GkmuY{&{@_kCr)Gv+N8}n952zmY@0#BO#^_5E1y&O5R2$>Bpm*Rv)mIyeW(F3iw%*n( zp_0EJRLZaVl)j$AZBWKoiLfE(Yk^PtU{H7puGHN7b$&=7f`yybZk%pvMIYfT z=%fA6Ezhw9i@>+?MJ*m+45g32K_3BpXG3n~CGBk9`(1El5X-vnSP!;RQxF*=^AR}0 zh_3^cZ;ek(GanbZz_R1D$(A@ZEPlfR587$vlatp8yi1=EMShV90n8N)EP!vIs^eEn zOd1(I>#=)=bR?q>tP2i3f&~b;#fCvya=Jhxb*+_13!3S92QH>ux_Hr#{1bz?=H;K( zPBY({)2ux>UD$E%VPyp2?D_NHDq$YD;*DEdv^_56XrDrk$8A0wJ!jR-mu*#U26_+> zGzys=Y@oXl=k(#uCH%tX`yIL(N`BFi{unX1^RA{sZyKm)yZt~Cmp-qZwY?oumxa!CGCFSPE!%znBTgh>RTl>Hy-UB&lsR7*C`zZA5S*Yn7azjzShjwozN0L6k z>gP5^FE=u7K_ktuSOm-?0&4h^S&&X*SQRLAx1VFJ1Q<|~otVn25Emct7>$Zz9%+S# zW5CWXpEwQ?g}F!=vgTOR7J8hz(Gwx^69?<-K-}4vQeVEw)0qLa<7n;vZ(P;B$Z@A+ zy#ITC`g7Mh**7GSCs~oTvx1uMMK0~K_yg;dyb9VC6UIe-?fxNmz5m(@>9w(=R23}oU!)}r={(ZC+7M}uLgYGs?V*bqv zhYwL5H)YRBGt1hL!1bU4r}$Rp5peVXOd@Xj)qE@=goec@we!WJ5v$UL_(RGh4~(XI znBZ51VwllFEIgA3(Q7fZ>Qv&!MmL+98klL3Qe~Nuzmb(~oYxF#{$rMToDS8j5uxXAoRiTD1MT_)t$YdOR&fbrm&{b4V%I>i4qi#TwicdOw%h|wYB|KN z$Xb4CqF1_fH4T8RgJ%MEp*fv>c<||C*|29U7Z2B9H*N6-PvXd$s#Ij(iW(^>lqI` zm9?pEZcVS~ewRHmdC7wj&Ks=ruk?F|00>;9=yec8iqkb%KpVoSuBLpp{NOPhvCeF> zscv}R2ZvWA0tdx@usj&N^*rVp85X9x`tw%b%-C4kT>1L_irz%G zG9DhD;k&T)62prJygPA*SFU(cCNHh$q_$3&TJkG^u1dLUot+}m^7`$OG`l%-6S8%& zUA%;adGX@2x_F5lv)Ox@1vkMRSjxgqbV9^dL3(DQ%U(A$Xju+}8@Alw-<_D-idy?X zn_n5V+bROKO~R;yj)-&rTN6gQ!#xp)^Q%DtWweUT^}IN;b%kA{bW9MHfzAzBx|k~D zAy;w3!y{fJ!f+)Es{7FwMxvtE$HKz4h|m!t+t^zK(TWA*mtA>*Evr&#ZwheBXD!AQ zMMTbC!IJ_gla$U*+Ksiv(M!h%(>7fSwkAIMV%p4ivqYX%XD4Wr(?b+-Lm;fa2D*2< z?CcqsgGs4}>>HEPG*iKXz_Ix)9D7rON-uma3@=uxcrfKm< zby#r{K@?7qshXuv@RFRKmS)$)s}F-}NDIivr-_LYrYGhe)8?UX_0IhET-7xK%zrb4 z(oNclQ|u%Hpr&~X(23EI77k~z(%lJKnL~RT%M72W!zQH;3)6~TVacbFonFL$s5{vj zn6{M~77?+xUa0J;Su0=pSMxI37wP7b-CP-)sLtJDC(+=VAiImm$8B`oA&q( zneW}dKjvEW?j1NqFb; zh{}QTii$!2Irnhjt-saD;}YQIDrjch0_awWK+kUQivJvX`)&jTBU6OWmR;by?x~zp zBN1|wJuowou1j3Ewzi%i+H#Y@ZS`Nq!*vo9Ws6IB^`mVb_Q`-Y6!vw$s$1Q$ zF9O4j1L6Dh>4C)cR)|O0mmM5zzc-|&#PPO#)fAE0DkI|jkUN-=|<0Ut=S6PNLBi=DUoFzO}w3U zR8D5b&rT@HbhnIz+nMXv4}6x2VW#GHpE1rg#eoAQ@T7;L9QWDjk5|YmQ?cFHv_o6H zGX3fiz|iTy2L(u0iuwS9-CV6o+!#r@{{muHH=OL1v9Dd8F26DJbSrwo`=tPE^2K6| z3xMiDCN$ejkVP#pKTcE-kQ4egc5}yWO62BT?D6=)z$P(9Prpk(bP1 zK3NC7^({!E)PxPKGrILl)lJ|%TT?!Km?iJNFqg5H*}LT{c1T5R;AlO#I#pwpQefY7 zL}^pUYDQw#=i_$X)irPt^Ka4|kwF3d6i2Jxo&s)HrbgZcn)%h6IZjqL)Y?QO;XHEpG=de@+taHgS+O1CIB;-hqsr3-#G1 zgDP@*%r?3Ij$jRmM9Rp>04K7buiMbj5JxQY7>2L9m6@293MeQj2nofi>@es^eK`34 zQ1#~FP`B^<_%NDMV~ettA<8aWi7q^C-zI^#2FAs-q3WmrJ16Ey23$g-U)v60Ssl04>20BnI z=VEq&8Z#gu8TUxLw-GM#0(_IKBQ?m#PbU@6KK&a0!?<_$_9*Cosm*AghQzA=ooax6kBWxL@`>$?%XmB3W zy8(*>^n+fh7@2?4>AyaO`g_)==8=~`Vb{Y*Jq7{}N?N)Kq$O&T`3&al!uzTb=}z1L7--@_#gGb`&~%#pl)*(r#6uc$TOvA;(NNF*;;dybHov`9wc z+DO~k&$ec#Sy=TOc0TOlx+^#xeIHkRdC1GDX|di&Palri1OH~HJ#Xh9;V5d}{5R#M z#<>h6NOP!1Iu4SA`$DYw2=m6zbyZ^07d~tK8Rs*DK^rQa$KC?O1}7;Ka|T4~&yxMc zm>Q6$q*NQijce{>r{yA#QWK#6%9FXK@gskqQENp%D$}7>@x)NRAWrLD?X{|)Ah!L_d%?jbrZ6+m%v=ib5)Ap9JW@T$KX3e03v-O1 zuQ`HWc50qcva=?#_G7g2V@+*!&V4Z#cx`<)#5`IkcJB)GjsMTIIP-cyk`WY~l8ULJ z-06nJ+4Ejd=WrD1LUB_I)c-4UGGC)pGLX^u>jeF_K?ESER44)DTSNvp;&;;g_Ht{fMS#SPP$p5m1f1z5D()11zh=0s8l$|M^Tq z13LhWXdeMh>>+nzs9$KQKJru^K7&S0ZSW02Q#0nJj}>6>A_N1-lIwKPC=M&XaK{cc z#QW-7*1TPsbpM@cjDy92D)>+zOORRm$BAujJDMrzb4PKjvep$63ALlRSTcnu&>_j} z7wb4=dVf{PlTMq|g}rwgDkT_VhbvPQ?vADW0=(Z32NmJiw-%m>SUSW&3(6=T(C=KP z4FKUzoEoA29yK)<0Q=V097aIBlO0${wQhuh^oebS9m129Nzd&TgrQ~%hn8j>+mjK5 z@6Ei*Pf6lxq!E^{G|;af${&w(nx8)pM1i`st$wue?>C?QjSUXoGqLaqvCHt3kYPUW zlVQUtS2$qZ54Rin>t(@D``7@Q0w8}(@CVNb>*!$i@*|XlyVYS?^Jm}w z?~Bj7p9aGSc}Ts6vm8Xthsg5T7ySt25FX$v^rUb-u92(xyd@?Wem{G5b?J?bw+^4% z93LZEpGM{#8j3+;r!_t3wByiz0$?^m&g6~Rt)^aBg)MI=pj9C7zqY#I&^MNi36%F| zU~z?i>+t{QmVshC2f2FHf9-TOe%vaXw9w0>zv^JyyK8L_+R)EbC`f-+raV7jl&L{0 zE^XgtMtY4Mw&g(cI2}8WSlIh1#K$+&jatd!ENE=0#tJZnaam=2Z`QQ6x7WCK?VBfH z$jd``8xI#=Fssf41Z+&Qrz`qYn3T?BYeWsM?DQjgmT@f!!4$1^<9-BU6p?`LR3;N+ zc*!1!%OvcFXJIqlC5T;H3Dvgr5xe=`Kj*Ybx%sht2>Vf{j!E1=)sj}ROjDA!%Gn>6 zigaKge(+eK^Cjg0WF(@j{5?03112JJ(k^3QY3T$Vr`8P3zzUTNnTS02MFyb&#^8JG zq9TCs&XJ!TIq^^02eM%Td!B^96=)NiSf(ks|G1{5<>>FPSU3bSq!J|iMG6s+41YCq z`v$jub#->GJTs$s@QXh)6M#^kbuCTq-q>h9_-fym&dS5XNZvFD-WU$>GoT!C3y@bY zak=1lHk&o`m3FQl7FIs1_ux1EFi?KybMJ3H)1~_fg9euRm}?GMOuLn<;_G@je-L%` zmg|D4+&WWHSwH+*MbTld4yd;4!U=Z89u&~I%a==e?Om_=Z;TJg*1V1n@EY$4 zc?49g!ddw~^IZTqdO-%c)^ z1I@K5->sRjzN%skuSI*PwoHF5sL<9bv9H6?j;zoHA1s#2-UYLk!NGJNXaNI<8jyXe zGBPrnLz$*N_p5n7`g5ME;%B{&kAJOKh~Pv`*WRz&EtST@ zHDWw1*Ymlqo`cADp}yAtmh6K)ELG84p`z6>p+P5+rzMznly}1mPphvon|9Gd8AcvxjNrVG5gn!uy$vCqM>d2UwESPC5oF4q5mqLv3B9j3IW-kW*kd#&fp> zLRO4PN#8#}XxjeN^jOmH>IzRbC+(nmOsk+O+?XfO?rF2#4&up=mZ#X&!P#vgprN zV0mUXG)4zTA~~}{O}nWFc#u9&TS*HSAUl6Vt zWYcjP&eq)r>`*8RNfcb@1NVg?gmUcoH5c=*KSv>Kt=-@-9dBX?G?jE@MOo?WU*4F` z_SCZ-_g3=Boyx0lUR8(mCYzMw!;~3|;GPgH;iz++A8xsBK3Z)n&GX1uh?~lb^ywGSa0l7_E0FC=W)lM_$FJ5*)IVo80N~&$@!sv z?B7D^2^eU$toQmF2RF9LV8w?%e@IuX?{%G4#}OUV(BQ<~~h zgof1zMLXgtHgz1#hsu_010EX|`?mPqtL`z^-o-PkaDBYe?^SA{1j&-?0~2=ZU+dd2 z!Ia{G@zY#f%NOCpX#!fwz~xr~D(%t|r=C7M7bvMo$1+q8br~rqOLAyr(vL zPLR}?w`kh^sg?Iv%OemWu`{IXBV;RkvcJG}qzY41q$P2mZ{kn5l+;&+@}EvDd7=ue zt8|FYi2hDvpGH%zU4L7&?`qU0nGog%cvJf5`W6DYUFc(qM%BsM)#*9HmG$ zzI7|S0hx`FVwO4E-i->@A%Fj!+RMTM)N$cZ^E!dgsPKk+p!-U4zh#&4?OR5sTIm1T zRrb!>)JAvmP{L0xFz)NSyUM2oZ0guD&IrQRlx7Vfm+w2fy!iwN@8G?YKgmM&5I!g^ zbC;PsS7-5I%&Vm6Pflj;fR-o2aL7?Y_an8q)2tYd-`^cbSL!608$`qzqJkH4_##+8 zi`@^az4@mPD(>z4ik4TNIJW_38&&GvJvnd^*vsoQh8D^G^DHnC_b99wPohJHkUD2U zVc~<-@$#of{^v?)XlS4?c!p*0`*-hr7g+#jLj_~I3}ReLOE1;s9loO6FgF)(IBG@< z2J){E+x|um~+l1n<}LHN`*4!Urav*ow>&mcFv58 z+w=4W^C(&&X$Rcn(6Olx;2s$(Avx8N9{NX&MLs81WFC_kS9v%NXgkiFnJ?q4jkf~Dacof%rg+FaPi^BWizJP2OkIf^8`Bz^y*OY zd&~-1WG>X@jO@yf;G{Lgb)#(etAoWPpe;Ru6*bnxHy9qrqGI=>foBH$Wcrl%S4;6L zWAA4{Hxg7mD;_zAGW~KFU@ul?g4nL^MIgG9ZQ?+#r_Um z_7up>7c$g5OnsOgcKg{NOHR6gS>(%D0S`9qim5;fTY!v#=CaV@2PuB_0Xc$SimO34 zL!7{5WOp{f;{wxTpLt8r5VSy7*49o?DglmqIP&3HWTX^)AxZ8o05Z+Z8(IW(vj^^2 zSm+`2Y^<%VZRV=Fj|*sPXliPztJAyEk@$e-so~n9~OFBAgP2cwyP^th8wQe=c@F-$8xO6b+Xvk7N7`X-!dfB`&uVUiqFE8-q zeAkc#Pd;5dN1N28&YjGOQiw}Ce(k1!y4T>+q}HOxMf(J1?HG+`<$M&_7mJ%=^_l#3 zhri^(Fw@PO77{8*AhiutMHUYyfr5zd)MVcTQ4nTU@3oVzzOlWPM$P0H;*!5{MXMQqR|5-M?mq_%aeTBu&oDpm>OO+Dr#v{@1BW# zv5fm{Ag+r9N#-#IhBrl|L1<`oF@p;c-*8Ho+(ZlWVk98)Hm=3Jp$k%Y)1x~L=T#!J z@INU^jLso&Pq!e3>;k*xJaY6}_0zYBMmNjd)nY+T1kSFbqXS4$9~{lj%3?ivQdERv zWz!pGrskGhXq12cJOlq5{p0cdh^|@3M)KN;u~JLSVL%)FT1PgZ7RxyFr0fiCV3?@W zIn>-63plYEmx@giQ#gcl^M}+huUUDiV45GP*?e(=kNlKUrcpXoTmOcL*Hfr)V;*TV za<&e$&}30rg=gH}_3cyOfATCTTJqh%;f2D>{C-Njak5`yUenmha&1f(ih+%p(V!DD zZuIVM3Od+Q>L^|R(dF^+n&>YmwfJr~4*d@KcSd>fO}?F08MQcN-^Fguqr`Z8pV)AR zn)Lr3abC*c_HKJ@G)Mc!jwa;}6o6TqaTH_cS7um0rVL$>u3*~tXi7%w1S~`HbcBfC3(NRC@Ey6qb^1)k5O;DHWJ%adkNLA!OpoyW_pZ0J`t`p*JCdzYtBQ>F zdLqf(OjTRY#c=BS*uEHf$QydM`@r4na=+Ws?4=FNFA6B5>6RQWJSoJRt|6_dtZOR3 zVh}0<8enVe*uELk`p`8zfx+^AfkZ;Z4%aCQ6hhxTBq`94>6coqw7YSAHv7>dfWnc z>(xQT$C~x8)Ja`p-qYVW#9aPuB$0sH zJtIz%nhJ((0HBwyqd3a}+^JZDmfB@MVCTM%KLunq5>6*@u;?slFUeuS2&eM1P3~@C zlDj2F;Q|#^TDOsbvTQMqCWHnh5eRtX-ZlnkxlCIw9R=0UOP0n$Fq8lR;Bb39yehA% zN>)@v_^oXPa=hN&|vDp@2lQ!7G7G&gXgbQ zkT+arzTXfgFO|Woyf-N`J|A1a7PjX*^B`zup$Z>1s6N8G;aTNKc@8Wcc0Tn4x#QIt++M-DV``2;^&#bA&D%zE>t$C9%k zE6X1s9Dcvi55J)FmT@Dvq_BVHYjQXsv5XhSfeO;rj|ex*`@HLi!5cCEz=PLU^pED_ zGwP;-6-j(aK0?w2LC|okO~^*B|(Fbzwi0j|9qH4i}?%#rQo)uo@rMt8~*xg+s%L3a{C&wZe zulVl`0S^hpLa4~5#EQPB=OqGYDnFbq%hX{cKfQ}NNXLTu!|6#{c1lVLXeu#sNTTv6 zfDNxXquu&n<3q6t1@QL?@fMVF3G&?UGWpc|V6qL!A*Rbd7zFwW1U>~~o70y}WHb>N z{7m%;Vm6#CW?nbEb@t=*AmY@8^gUMSfG7~EV%RUf$GSRIceM~1Y(xI6_@A8)UV;9> zQ)dH#+>~%ZZ7tc)&CyXvSa_lla|nLmg5K+PhA}XTt4~V|&Bn(;kM0Jc*)s7jU$TY& zoLnKzi9rYOQFeo%Wh3fE{gsi$6ZG`%s+iUEGb&`7L+~@yfE<&@={Q-Xvl-vye+#oG zwG8^BE6dAb$npMu1GCP^pFq1y){3_6ugwNh0?}-_ctIn>I2TO+^eCeG%V$35fOEkm z7)W!T9Toj{Thw!7L382}wX|n~KDGd~T+r&hZ zDHO#0AHnpjYO1Q#M1>MjRIGxu1{5eFVL)%NPdWiDgdalSZFoUjs4)bnW04q7wz6bt6LzSeucuT91F2*V~D>WSY}60oiMWgIi!TI6zcxq zeN?d&`iq-9AO`KoM37))ld1iJY~&SI!0-LrK=Y5rUhjeD3{_D2$p=4~^imUQ-DU+Z z&w0J)6w0w#W*XQe9wma=@NRA}rKAW3&LX_`wt$RC8+X+w)Yg)wLNXxXXj_p#pZU*j zwp3ts4X$4mA|_A@U=r12v8sC@dk6^C&5xI7zmV#GO2X4;u2y3ek|@k)H8Dm0ShU&3 z*Eb>;e@l|Z?vy<;uKQw_E_|Jle5bKFQIObH|Kl5Imq($wxVgm-eL>4JUCB?CI>Ha3 zcD>*NpHKpYLm8Au-eHlEuP;3ro!5^4y*8Tt^I=ZowUsvRm zxVRKre2{waS^d`yZ4zf%y51d&#o7p$lr2(Lnu6?}!-r45SOwXJ4`5z5in3%V&E zECKe?xS}Qoo6`mrTjxojZ5RKA76BOMGW>; z*mcDl8SV+z2d&_W;5jgIm}EacD1c8ZTB!VY)&BTkoNyZ{)JhTRQ#yt*g#2X1U>sn68l8L-Esm}z| zDbiCJK+Cm;VtmV8(0`3J5C1V}sy86}_toF-STvz?VE~tV@YEbr70IwJ8FQUzWFU!@ zkcg(N*x;0Q!4S#~ss3i1!0z(-$HS+_5S?MO>HnQ69t@RNx%Tn+!3JMYs$>j)_5#!x zAn#(~!|#jL*1!hj0SbEh{ANTTeX)ycDCk=lGy zdXa`~Y;626MiZGbgy@{L2htrz+K7iE*$4^JBcS_Qp^5NYg=)i2K4tfz&K~}CB3NuU z{F)OO1M&kh+`UQiPk!WR@BiLFO5m_Sm`Q-su`eHwR&W&~_gxv%w)$9veEBVp2&kTU z)CR4>bM#4}p(3D$mP~|_Z>C}i!J#yr12{Y4_jPSBwLAIFB~=M3UyQu6f8yW!ufPV? zy`igpsxjfk7%}uGd^e{oIiAfnqrp#E>0oKRyxW5pG@1#x-$ZbCu0KN)$tUGecoZ@iEMTqit74Di{L5TdHccW~l7c*TI#Af}o34!p`Fht6_J zjXNI!5FNqYm@ypuH#s@>;5Bx1W5Vb{6KZA*p)3Q{wdEw#>{FAC^kz78Agc1iwW^IJ zCO}>WA_c+{pj8$~QKQwgU$Q>AMsI&KP+3$69`L}nWGlhCyLO!Qo7JwRt7T;ZAQ*LT-g z`f*3d$5zp1BZyf~UV2y-z5bOlGNfAoKp3;);H zJRMz@+RHKCKt|6L2GnMiAAS1-m|H*_uocJMM=e2xa*?Zc=@Gxf`}JEgUS_-$CXHX) zo{X7h;MbnDCbYFnJg;B7TNyZ<2U5}Z970#FBpv0wIEb^0HLnv}&_B*m$;M{tl+A(p-6LA zvBH^2&F(zeQ)7`vYu!pH!S@PDD(#5_M3UMqyZ3uaA!mNO(NH1**b5etn9~)*Kv?0q@H0^zkxa>V|I7 zldazF7=2KSMAtE#eI*%S;dt(ed0hRDw`XLK-rzn&0cNPf%OXJ4@UB3qaeUIGT%THL21KB;-uUQ9=Q~TAFRbbLgD%tsu-~wn^ z^m{Ozy9%T!McYyLF2h^SgTK-gJg@8PBiho~@;J%0K68uQZj_+Ie!y7=2w7D&5MoEa zhyY>x+Ara-e|q3z<&6UejF!KbH#pa)Gu_^SHosxyYLkxOvt+lj!wW@}cUo>UM?oTm z@c*SEez5mi@lWozKXJQ6wGF+5CrP%zRRF>oU-qUpIn!Z0o#kA=Xd9X@}tOdCs5v|kaLqdq~>~@HYQT+@R1yNv9Q@c z{-8NV;!CF2eaT9UPq0Tebmi}a_8vmCE|8y|2&}ov?Zg3_{OD583oSI)(rTw_m_?tx z;l@ctQvbSknn3>~Y*ij|4Q_1o1jtO!39{K_fYhihikqE_YY~X-vO;+QR|{wzAucKtc}OrUGyJ1qwbD{)B7UpyfIu%B5-oMrbv zH+gJVqib}4K4PMje}fldZb;FY286yJ^YhLj?a-hi48Wep2V_xez)vKV>nMWfS^z$+x- zix=4sS~*FkHIe}y`*!I|x@&agy+R6eH=Gv($-t0TLZ8F#sx8el>;tBET1*VDgpvh} zSK^|y0SbjeQ&vHZ@qzLGPBji2rzsGT&bH`6{%#b6ZH?q)KYe=H3K-ef8lP=lX9$pa z-T6RGx!1-&f-8DbGm=NKvh2nN<->kevi_X3R1Bx@x-`VN#}eAERV5Si;Bw3tPOAls zsg^HypzVOZ@AHL)icZnavjcrEhO3OH5Oj@02-3wrmD^;n?++yUASLgk%mGOPaFi7l zl~DCw&p}#GKnm9LXLqSd|oNm%-X8)n9Nk z8*Do1vN$)XMp6TvtO*)}NWq;@`R~qcyZXv3dDL!r=)%RCQg5W5&t!MB+Qp)tdF8zL z4|g{CxYobQOc&-M$6ITezTl5&n7(GWx6W9>n4%0VpuDw2wYURV2`FAB%PdmRU?Qgk zeeS>nLpbc-JpmzYwjBZy&WL~n05k$97X*bK+8A$60(&FJ9RmYqHnw1Pf&ZBXlMJ)) z-ry4R3brRozHwbLPndx2_XV^FQ0PgNkOm0uXr>SmNx7~ zMJhwiC6I`>O7?$-zL4%Okm9uI*IjBgia{c zx}nRu7yiqeymJH#S(o8Cx{x2IEsSjTevz5pxy_D_j}wx6ICywIKKh;o zz;eXJ8~=thK+w6*tGmpE--63N9tL6wAkQ-%M5sVsM2Fwf#}o-H{rp@-+{8≦x{r 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≧&gdnT(QX`no;l~?8 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 literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/ios/screen-iphone-landscape-2x.png b/uhr-app/www/res/screen/ios/screen-iphone-landscape-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b9689b696c1c0b84a4589a3f968569b273a38b9b GIT binary patch literal 72319 zcmce;1yt2N?4S%N=Wx279}kpA>Bwz*P=^F>24O?-LOaj0qJfKkX(||&3V!9 zzwh05eD~}<&OP@q7~{8C{`#Hq%x6ARe_3fUOf&*C6ciLp@wdWqC@6QnqM+RV^x!u5 zW;W3m8*K1lA}TO>OGB80j*S6|fWD=!!3%M79U}ud108)Q>n;NxaMVX*1r?Zz)H|r2 zr8$Gn%{~l{=2qZn6ciqQM=KpYQv=uwT>~Ry3*J{d_06wd80+)CQiez|Nm&UQd^CRR zY-1qrEUlpDY^ukl|B9dQ1&<>XoWR@wrt`wl+|0rj>d5=*&v~KX^Uc?cuU`Dw1!l_o z>hDddNXfnsva~UH0byXJ*JEO4e!ssJ1-d7)CFe@k{ql1G3g99srrHv6IGZz=v%{f?D=)oTJwoVo> z9Y=Z#Te5%7AZ%c(XJc#yGq$vNadSo;T}wL{?<;Vpe;>izN=oWKPHbWOuNMVg8Ka|) z6(chP6QjBL&2#~D(#}Q?tcM}lKL>+%_dmbT&5q!1 zpfWbbU{Q3;ge~>#%ndAH;=;VIz`ro)8|yh_H#UFf)rVa|yGHh;oWDiwbgzvU4yq|8uOkg)L0S zLeJoz>l%aW{_9xb|LL(%AsYi7n5B(^rKQ9*cjUz=!@D|n!ot-hM~s)<__oFj|Mt_kH9ZjrdKfP&-n=G=V^?6q;!-L3iq zi~E}tuc&AO8Yzb2zCF7P%AS!8fcO*0v&|Lfrg{?0K-%MUgXx)Z?{ZVo5MyT@*BPvG zv)<_$ZYg%U;%CIOHv&JOdG>Ak&jXIP=V))D0LrJj@P(T=fP(Vk&7GSK&oh=Xm7t27 zk0`QY&p)Hye0cNezuchQ{dlwIe`oVQJDX$7_iwt){eSN54YAH$fx@1X{r|R3|90{IAFED+8LvXuq59{7xnx0q?fQRpf&T5P{o^d7UjL^a?U%s+sZ~3C z@qfr5KRJi}|Lt<0{x>cUh!Be)Qu5R`G&Bqj4ia*-va(jF#4vMkSk6?N$1)Vh#KdrN zp`Z-l{|+Y;vjPsbtu7$YQe~?1S~}@_S67}@tiQj1eZ9-^wuPagA?JIPKYns;7Zumm zDmVZ~mzI$!&|!_17^|^twwSAXDSGFRnO%tC;NjiBchATBu91Pk*zcF%I+}I0azWMQ z<*g6zqBvIHIT*?iyYc8>B=7+^Hy#mDQhdBM>0=HK4hMVt?Rk$+d3n^*lz+n6*ZsoW zTq<(%<=*&_Xj3?*IQg?OmBJCE$z;d3Z{PZg#CCo(BC(QG{si(*Yf=IN0xBw#{#c!+ z!TsdCyzpULFI3ER+#)4)+aP;~ot0HzT%mvMdyirjyqARqTVrEL)x&^xT^~UK!uck* znbuZ8hS;3UOg7`;Zyg=JEU>S3^O5=P-*b>; zRH)EphhoDcBO<6skGEzfW@h|uS6VT)uY~QtB;>H*abA9~Rr)?d6#USY_`0RHKS8+( zDGT_4{ep=f?CtF_6UDRSx?7x_oQ#c)u`}l8=3dJr?{(9bJP1$Fd9L)4VwoeG81?R5 zBCb7UclV~EqF@B#-khRopiU?Wugl>tpMTy*j>6o`U20zWh9;L|1~9<_nROC4Y)_wJfaH+!ULFx1pI zq!Qw5VGb0?;UDhI4~$h6AP`(XKpX~{`qOLV)%4x_7|)s9>ejw~zJnA+>+}6xGwaA= z`aDzBf~}5CR7_a-?6im*w*JJ&avE5!zjRK46WeraYq})f#P(dhy1M#O@EsJ#pZc8l zPoMYg#2-ntRLs$2VRWu|{hI@O1bRAq>lf1k# z6lnYd1FNdcKbUFA2kO|{AMsybxGlCi85!YqZ{Mt_V>#1pOqA=Q^$V-%yR;OV)n^Cq zT(J1~ZC88q6=^*#?Mi}!`_!>0dlR@Mixf*V5PQ3eZFZK-Z0zi~O3cFl*p)YlMdF7d zq$<@+SeL|Ax5L%Nsb%x!>hb(_SXZWA=hgfy!nWRiE8k-fVXG0i2z-~ioC7Sx__&h7 z42>@^6v4nWAD??aG*CWu5~qd|bNd2xG{D>>wQC|fC}fIN$i<7E_#TGKavV(?+kAO6 zqwPK=#O<*LuW4*(sDoMKuutrf^_36*Hiou-{rc(7{iC%tyvdmv@B$|caN3&O&h2)7 z^vx161CVoLil2X*dkVC)v_K}Hfxl)cRm@?yip*=GZ{L33Tj`;Kj;uveN+obRSol36 z_BO9oc{j74ST=jrE~na+!H~qiQ`6!xpW^Wgrgs1SeKNA81iy3<*TA%b0#guo{&AGr z>vbX`*O1XNDJCv1guA&X&TSZyhp<)Is6T0{ddtszrg|iK-g%?wbbpPD%kJ5>E(|)p zyXd-USo>VcWuc>pLYG;@MB4zT@>sUzpY5sLK=i_a!=a?wF>mLZXQ5>bQv9UG4 zI-dMqnwnCDm?@=6SuK41jP+WYh#eMJTdlT+hK#>@KOQrbA%Vu;e|}cX=X&yFYqr1m zvqo_$%zdRhTC35SI=VaJuI659#2d|+WQ2@FQ`DFCh+)p;xVY!Qw$J+%l_onWpLu(QA_e3R>+ zy{;iw<+|8fXJ>l6IVGfRw=oX4ms3y}E!Al&Ej2AGD=RLBH#WL;gk19Lyp2m1>BLhE z#2jJeVC#EJA&1alSe2A`L;^jzbeNZa1j7H>ZpP!+QVCHoMq?03J+4mgi|F5XaiRSu zdd&Jk$Dx5I>;l1}Sfr#m;~(!I?Cfy4oqZMXTDB4C1Izy4R85Tl?&T#!1-(9+(Sim6 z$9CABo%;6eU>1=IG96e*ld9e#bq)p%&Xn-*mDTaNnVIwJj>bF%D&g4^=9;5aCR{21 z1j!?8c)M=*$oV>GGCwrp-iB6wW#oHoz?(YpbiA-1YDFcc1g?cmkXF!Wf+Wq6vnK2n*Xc%%+s*@DI#ewdNZg^k|(s3vVZfeSGt9cxycEnMAEgBSDW2(|eJ zv#<>7>gfU3rXC-$p#CmLk|lQdYfPOX7QKMPCQmtS;W0HgJNs%!AK|H!lV-jBrQ;7C zR@QwdQV-aXSr{BXmnn{w^X~V@sdAq$q;{(|=Bhnu->uFb)xGbEbsdb&8AzV0)wy#? z$w)^9^5o~>;NaY9MGWfN{i>n4rKKfC&AO=QXmK&=(|XPNBWY=AfS*pJ@7(14Pexi6 z78WWhA7y2qh>RudGfYs%C1R1Lq>lXpd2#`XJlyM{F!!X3O|lcDDw1@Li5iD$H^BT& zu`W)H0Hhet=tP&6UNv0BX!G{f0vFE4BqAc>hB+?&Xsn+o(as<@*Vmsd*5s}WKT2Kw z-AO4&6$QgHe?m-*kBb`<6{Vn2nEmw^xW|>1G4PO2n|acnv|xs2{v3+YLXi!^)tW}K z8r{Bg=Mf2~tcuDyKrjXdinf7iOr}*K1>YEIEF~o+0SSc{+kfz|Y2#1*x)85$&EDcz zm7p#)I3nMikjmsmByab;h#Bga^jH;yI7^pfTpZk^^`W*RF&VV=`1p7mMC<6N_aizA z3XyhZlc{o%k!&dlf%&_4Ff%hVd;99(V5yDqqODB=8f+V9oP*v2s%awuot81$Sj!)^ zc`WQCyv_%&(fP`1YVgu4eA8`>TSUi@2-hE3PX@GEsj{AJzg+Y5y1cx6OfuQI4m)~e zXTn?l$TJrIz#ftgfh-H0D^#x~zI}+*1S&ib|zVpOsr& z*3DBx@o)gqb_jE*DKF2?`SPVUIxOsivGG)sn_p1S!RV-h4!+fNkcHV;z8%PORMjB= z%0)0xQI%FynEq&R$`B1U9_Z>4=db{OETI}~aCC;IKn+aJkG4dz%sta3h7hX<8n_vf zrWr`GHkLI{PY&~+0nkbUJ1^g0s#)}c+R@_+dFSmPjV|*|mq9^6yK@gvWVf5~Izvf2 zRZ%|W&_n&a@22owelYhu8~n~vm2K3vPK5of>f!cGO-XHTZiajgp4R$DBcsIlc=32n z3JUQ&g{djX_uh9hG6PHy$a|`&))6EO8ZdM))Y|I#%yuNZj|!`^ql281(xi$&QnDZ^ zDe23X2e!8R;TfU;W^&oVo;@m`OqJT@8?LyLjtLwBz?tExe2^ism5hmLVX`d4=k#8+ zeYK%sRn2pyuF=s-Bbj56tK#G07PztgV1{ICK+HxxKJ3SZ*LW?I0-FAe;X(wkKL5i>W0kER$MpWb60u-%)&Gp#)pJ zZJh{tczQ){LUD`Qh^-G{v;>058q&TF0GW{ABWxU8i1~Q$Y^!IQ>22S%SQ$S!94;kh zYG9DHq{xNKu%M3NVz(Uxp#7Uqq9EwJ&abVFD}eFg9i)OJN=7apyY8B7iG>{_Y;CtS zo+XKgjvfeZ`O6n|adB}Bzk+Ti78V8?nr9?}_uu&ml+}X79}?1sj9>bxo1T$TrABY? z@ny6eEF?HMYfCJI2x2<^4n&0XVSIMsF>Eshc=86%kp_O7)o~t`=sp%t3OC;7TFuo- zSq5%QOl#&4jH$+QKBmWjoP(o8wZgEYqvK%Mgdr}wVyMcrMyqkQuebO29QvPfGc;PQ z2sho<+1XjDIj6hoVgC66a${+URsVa~aGVMkdBvC=CIPNl62Hff0n52$-ex%#duwZJ zTic4#(#*~0BqZ(|UYWHcD(Isx{TUKrT*2Z0QJVw_# zD;;5B?^22M`ug(*r+s?5Ugbg+>yup_xb#G=wO$3Y5gr8y%QZ=r>Y5a$o0fL7x1^^FzRr=3ilC>Xi-_3n(zj7pucuXJXz%PyjEl=v z$QKPJxOveuisY0(#NU3&VWQ6nUZ&8iJL?coSD)z!P9!HMpKZXm&^0+54rFw3aY5AC z<2)*lOJ`M1pesJClyaF0pT|#m{>7DNYhoNdYvI-SyExu;u3X|L$+T(eFkxl018u4 z1g531Nx&A=kH@IBFmw0Vlr7d~3ymzC*vO`XQAM zl_b)#j#*sIiUui9_6PVkU}_vSB<9nVRpmdkV?c6KGc>G|%d@evdMhK->~geGuE#$hD!A}d+sxF0TZngG`g>v+X3Dw3EJ)cLcaykmeWQy_ikH+M9tthB?s>Pa z*xCz?cowe|0V@N`y@ zVF54Hq2Q_&!<^RXnO$T%Uqw$@Jp04CZBb=aH9UbA=PUu z-$eFhz8FIMF!yvj zKRP^O02Qu~Gy6J0;V9+XAw+8GV0%_Yy^9PwdJmwo-U};HVQDHiKz^@nw*V`WWA zuwfx7O-s);iP;4IS*2IULzHi|>+0)e;^izL0`K8jv=xo+o=q@{@g3Nkdz z1__yxf?}u%7>ZmTaHf%uYzG<`&2j8$Oml^*toQGWNx1v_I{;wkJ@gTwAw9(U`ZYHN zg<`QR1~C-2+N)Z8k;~c>?etOAOW}-jgcZ+TL^oRECC@pChahH^nNB={k{>7Y;<}da zR!wMORTnZqmER8d%81=c(5>A4BA+9DZn=BDmg2!?0=cPvZV`ampCsFFj8dgjq09Vz zo>W*mE5%zQqqPuXYA8qQ1IH!NlfFcbkLt9v8`AJ3>eC^5W8=K2ARIKGK|!%oxq>lc zHj`+HsoeKVAYBvSW3zk&=?)ewp~5R0Sr92h=fR2 z)Qj-&_dT(U^JRM6@atQ5&OoROeay>y~7_dI+%Fgr(gOa%%HZTC}=oDut-A6~;1{{GfB zHY^4|L1+TVjrG+}+&Mv=nep*{P)oPAzJfqjR{PYENaH90MVe@)EZ;AQae~Sk8gD-j z43(XNqLfj)N!Lu5$NAtRqYPu(2QO2s(O)#3Go2%l?S-j2F?m-g6h+?v@p_c+b%O z_d`Rbt`jFE$0Icl9|2Y^E~$8YUE}zm&_feLo3Jm~ao_d=&gEiw3AHd5iqRoD!4(Qt z)7%eSRL7`4{=-V%R7=+|*s9@V>OoR+veL*-LOFX2d9dhAiMF0w4(hPcH zfIoG0b=6pQt}QPQqGEreHXjLY^KD|8Gj%q?OOpy4Q&9PGUY28&CC9MRi7fHmGxwZ9 zu(xOd(0(R}4c95!_X_5%Pz;K;g|J2~_%uIH!bICU-sg6|pvoA5m?`Ao3fbDGwU?6q zbrzH>(;);WC+G5Lp2x-{Wn6y|CDry={qb^FB;dsiCn;5gObXw`;d#oM%vVx>m~Y}o zM@Q$jhuK&o&5Vs(#NHXGOpbwKn-&`lV70%9UTl$*fq@;6+^t!jv;;8^D@?3dc?!m& zDz>(^z`6=00t$Y_Iw3Bui3gUOlcPLQT$~=kE&wmh*Cv)<6?!*tLH&#nxR}=C$Jz*+ z_I_gSQ4^_95({)(IwIzub~-N3B6R#uHH&1d=aExPqJb380)|@O!!M4PQ9Z8ZU(4iI z5ty2)1E{5@jsYOsEZ4t~!pY;*UIJWP`_0KAXyrqRigK1ypG$o&)W^vuE#G3b-4VX) z8bbLX?F53f^ZSt3Y5~PS`}OO9eunXJc88rG^>!PmTO(avT>ShTJUkkdk-yP#%K?8y zuU=hVSqX4zP)GoGK@R+!AYZetssWP%7*xFj<}+udFpSZGxWb$S>^@2#s1FQ|8&amC2zD z5s`Mlqg0mvRL8KZs(k*4fGyW_!s5%&pL8>j)6g(GI9OU?G?1B@IeL(oRVc-jY!LU^ z3)RKhsqy4z;Im6%%R}*jvvt?gy_MmyyLQFJn$uOLmIelq(a}%w@#B+|rDgJ!@J1rl zRaJ+seDvR`(iRXuY_1|1Hw64o$HX3YLEU zq+-Q<&iSz}cJ1rco!ZZG)gfI)0qaE1K!rS4H}5{9t|B`KSARDMY#`|f4+qEYbWg-R zZmL=`mca(G*B#w+yiL))f<{JWfe@$*~&GagMK{&;Z?otr>@p zJrmlbi(P%Ci?8x$DNj(IR{T29nDHirCBf>j_lDV9AO)8f7te`DO0?&l_E$G%?rspm zMIL9^WCSQ@rsR21$LD2aw(s`FAG&XZkaCMousnJM*kn=7{Zj5mZp#Md>7g<%_u0SC z=LDKX*H`D3#4~qq`Y&&eH~7E0bOg2BxgV2V=nU(@uYTz3ZDsE1a{Nmf3kJ~X)A-xg z0PODkkZN!~3(J}{7T zKOrIE5hW;e*1?L7c$1!cSA0ou9&aU8V=-cfS3`I?!Uv7Yad zA`3f^qLs)V76!|RkDvPTlnk^FG&HJ8pSC9ciq7n=A_wz$(dElHa2_X{Hq>hm8Te>!)%f^0q(pZz zO~~&tU)&c`-oMW`w$ps=ezY0?Yn$F2tM}*3-K;zJA0@FF+o&dfFlR1ky#!u&b>XBv z4>>>HnLt*;pC#4TF44i66}2=-;EWMZHl<(2=LgK1{A znZRKw9opUBU+2dCl9e@byYKtkoC|Znj5@)7eiH}WUF(RosYZnvF)oJ32~yQjDQ#2W zTM^}R@NfaIQjywX&SR8hHI}5?D7pQI8x#4G1HR^-u0}H-7;kDt zaf`X(3O=YdXwz&>+qoP8>$I@o<+k7aXlB;R1a&SxI5_zBjhiO=soPD{*3xokef>EO z4&bb06%=yi@|JCUN>g7Llt)D^FE5i55)y)nvoB$)6ZBHs+v5`xn@?90wX}Zp_xB6J zuuui?!`~j{j@VMnM)K%6Wa0X~}j-V2jf_(i01I@N; zA@T9Zjgrv4g9Gg8yNE1NiJ7}o(|Sun#V)H@^aWvE-mLbtuUZ`re_;}G48O-D;ip zWRvKK+A$`C3Z|9nw|dvOy1E`@^s9NX3uGTnp6rfP$T8rJ@76m*U~Qt;p!mUC#yi-a zGyVOu{SGQd>cq$Aa8sE92uX*0L^6VwA|`s!bZNxa-TjtwvilB6qc(P`kBIp$*8Q6b zdAE1uV{McMGpacGY=S2exxd<%$m=4lX=4PIRKN;>*aAdjU_kuTn)T(&&$_rA;`cZ_Dn`G3^G>%iG*q&(Duu%}19AJP zMUC_`LCEmYRRx`qva+t+_ZhsrIU`%GBk!wm_Z(EI3Qft~2M_4zJc?-G)Lfg>RXDUU zJF^J+oUy}SD@|65IngtBO`m(Xq1B@nc#v2u#Q%UG0unvQI2b)9iZwSTPPOXo8%-yQ zcN&lRH1FZy;?iKFwdsBg;=S{Age3L13mQs3dY$5rd<7ai=vGHC;od&_50C3h!@h(u zUPGkEqDHON@A{o4fb~m!e0=;mM{{!lU;d(dWNM0wv0+f4H5{L?fQlYeZrFHu4(q#u zJuyW;m#{46r9nWY0VK!9`=XLFAlQaGv%^v!<$)K#neIM(D=A49MH?VB)o zFRLpn1cZrJ0_v0;?CcWK(g@en0Du23?}wJ4r3@EF1;trU>|+XEWfQE-^#=W}2>L{h zK!E990`?dQqlii}O%aq)=tPfxJqA&^s;ZF76V6(uK|lz$Km(-t!p7RnEGfEb?Bd@3 zYng=Md_~E+jgDX|iGkL`J1AdS?>1MXq>_Z!<>r2oLr#|Id3pAm&o>plUlN^nKQF4N z*!Psd1tfStLBQOZI)i52!D^zV{r0TSFnEVppuB6~VhS5(-5Tug-(CvkzdHYRlfLDs zqCuyhlbTvJPfna%E=$e;+(T@v$LU^s8uwzKZ;5Q zf(WaV-87K@Fo?UQ%3GpMKUUFctIEaZd@yyvv@4m-6>~0LMAFO&4aNVkB_pHATHD;* zB<2Pxo7q#Z$9&)W`p)$iU&k_Po^8+UY!YuSVLdA^FJB*eJMb6ia&;Gi&}M8rYw}~K zVc+8I_tU=5xB7^Qo3FQB08`?Fj`yvz6Df3)l4`AVE>1WABX%|-!{2x~?hV8>p#E>( zZAE|8RO=}_oJBrWYrPcDY6R!9-9F!m1ttI7gU2#5GI--Z*;nJ1*VeRapX`C;E|;9$ zD;0|NxH&l?;cWHfp$9P+!4uhMoz&0~zJkJAAB00)`!S&?6e31sWbyCp4^7r##Sdl- zF6$1rw|Rly!F_YGELNL@Ch9`&JMQnQAv4~T^la}-;d)f0XXiH+gG{+){k4;G%k`0* z0pP%(&B^L<)c`V)$NnM5qmaHxxrk@aehOnKKi3SE$3WR-6L@$ZWt2n67Vk$_9x_PU z+*FU-dU%;hX>vXGT-f|lIZG6|vOpZt(?kjhjIuMMm_j*X2N4*~|tqo`o z0uPFy>zSZ`pqhvi!PX|L1Y%k;2#Vehu|T18wa>^e)+wAApYUEICN}2j+R6%OMUZpT z&h+-WZq{1gFi&<{G@BJb^n;VO8*Yb*M$vG_-eNjYQlx^=T|0tD?E#_;u{$E8P0Xi} z!hL%7AzQ0UML|8iNZvU+2Zw*TSYXko=ak|*GV;Q+^?GX-S#N(>Wx9A!JfzNL*Bw>8 zHEnEHH(FT<7%V6+8kh2KjdCUokB6U0Y5%~kHA3aQmy!N~0d}BlmP5>r_L}W|^Un|s zIysHiW;fdfp?a*^oWD1owWhT6BS^#T?IM=I3_v5N-j3EEfenBDl8>PHuurC|aD+uI zT!}IgVljKN6uQ=U+0R{Xzs=)%VkIGgHb)iymX&2VB2xaHl+^rlR>OSIMRDK&(a@I4 zRoHHz6@ySC@r8Do2S!>t~F z=<}qibJi~<8Q;BDJr2{mDJUpFtsK@B^R*AQ53mA2Sgf%1(&2lj7!!pIPN>!WuP<(m zR4~z$EQofV&Y#QWsTCNU(8MMT+XlB20;s4~WC5~UAf5+4A)&c}0mS3#f?7Vi(rijj zQ^WOmTa*4;cos+4xP^_DE~&qi4vq6qEp$crFaf6`NQHdNkJN%$AdiQZo12%c;xl~i ze5Z*U^v?Pc+3%rR1o#K9phnEQZ}f3=&P+`K3?SswHQk+Fv3sqNuP-qitzwp`fW~X@ zad|lLc*dO*wjLHAe;UVZ`7W79HEtq)V+4!Rt)R_h@p0p}>T}2JWje;-e$(;7qvQRY z3<9PPD9s5AFVG4pCNNe=oV23}kL$-@^vF;b$$meTB;Eq05oqRJjH_D?xx9?%8g(tJ zZ3-?4u^TuDSbr%hisrA91c&dhHSvS!RKL4x#mzkT$kZa&YG?q~~siq|NG#Sgb-TD&_X4eeM_zu_czOfV4E%W2GmZ@pF?);eJ z_V>qK#U=GP_&tApao)!v8nrxXAd!XU^^y#bp)^wnE0%n`@mrj*qx@8HpOjz8(uUF}>a^AtG8(nHht1SR# zANbMO4C)0#PW~=YV_0!RP3I7V>Vo)KP1cf1fq4^OaQW0xD^+uz>@hA7N9+ongO zd5>P>q-!eGwkL+(bS&RMO-*gM(Z%Q9J-I8!r)S@KwMp1VkXJGBug`)Nfx&p|nagc&1|%w=V*9}hqcs9dZ8P!QDehbw>#iUrD9nVGW7!zPu@ zmsesbd~RAGS^z(AJwplx^t-!XNlVWrIkajFt)y%*XBp`b#S1nu{UX9A=AF_rIj=Uq zbLY16@h`XCh0jZ!GC>581jhX$252CO(8Px>&&7*!KY}8l2)Vwx)OJQ@?e6Z%@TpoI zc8@92Dpy&I1uUwnshv5VYt&iYNYD-#0Cwf#mJia>mX&=|GOCi5u1sSlp7K0T0sDKE z+8oFc+;%p}?0sZh)W$8Ir!QZwHD8@2u7>o}$dtaztq`K}42~GG#_u`SXu8yP_;qbjYY4bSlUf6@9C21kufrsgoQo1#v}wS;@F%T`OXma>btnu%Ybvn zc~66k+)PR$=60y7~|aA=kL;+U7_9Og6RoAo-S zwYBF>Ct8Do6aY=W`-etgWnn?vL(gQ%d&e+hq|>oWT#|1pt39R@mOS;V`TX0-02T^Q z<1K<5Ab9sHV!Ev+qEUQ7Q8W2KTeO#{&YQa?Sb?S~SFh#d;nFb(tlFS{_&w|c0@LxB zvUVbSUxrj-b!)oU+2R^Bd+q)v!Sbtm;qdYWP~) zYH8!v+vk!4kPu$<0h+X>C`ljlYXG&PX_b?pb`p7Vz4213Y!#N2EOF%Oy|0JMBiml9 z_^YIkm>^RWC_%#~5$e=^V!h;kc~}FQqYQEUI|KYzpjhCw`&C&~bSOsZvAoD!q}UVl z%3?2g^WwtQnU15)H`go-q2XMdZ5l>@E!9%4@}2NcVV7ty^;ne_?M=M?=u8bi(% zCA;#>Uo=C!&LLJX&c~-c31QnA>=G&W;ln~UxJQf0g`JfZUOiu#3d1Ap3}o7@1d$mW zH??V}&PWF$;Dj{sd_M#_fb>99;i99n`03WAtE*uU5trPna3v?WY_QlcgsSqPO{C2J z>#NDKr9fOachCVvN8bm7B5)%2G zKix&!?m$6a7^cTa^UguJZx($ zOH+rPt9g!jSK_BnrwUa^sDUz*m)EDM?Vu9o4rv+ACsDfIlh{b?IqCzd0R0|2%<>f> zm}a;6UzOkK*VklCkYaLKMHP5`$2!pPvl9|)BWe2j`}?}PtE(zpuDu?Mh7g_3ST@sZ zH@S92WPxBlk}b1;v}bKq8XF~z`QD(Zp}7jxhh0GD<@S2qN8n0_8{_hFq)e&TKt6+t zNkCUfsglQ*wYui~-4t_Aua;scUhArC>2(v}>9IOPdsfOH^Cxk;93=sgqDHO6jDNY15LOsfy0|0n4dj1JK9Kc^410%NGNg)7vf$a|3I;#I!V@ zy@hmdZ_nk>W^Lx~Ip|mv%&RJ{t?D>n+GO;zxFs&MK$@DwLN5$VO!gMVYzc%aFpgsdX=qux{j*$rKlng>ol_4cF825KGM`by zDK5X-OugN^w8tbkddz~6{jW!P?29C*M-{=z@h^t*ZZt=TBdCcZA|hB=Sm=rhDP@w` zOqRdTyI;=@c+5pmNU~c#ay^GTH1hDO*I3XOMi-5lY>Yv^fAPNel>*I4Jn@6$Nw6Xi zV$PQd6^+*-5N=0PYb8z4hUvgt;p@x}m}rcVHmfNf+v<%b?Ol=AG&li3;?)<=+WF&0 z(=s+eajWJj)4@uYYh&G2LK;vMdDLIm08XuRkO>{#mXwqfWFdfvhBQxkrqw7T_gmtb zlbDu1*Q2VAmsZ|=_!q15`{ps6D-ih>Lo5OhHVADBo|}N$HEOxA7bY)X0Vt_Qgje09 z&DTwKJ*#5{O83mBncScgx^EvwRA=U951ELVVcKp-hqTKrFFn(bHut;)o!zHo-6MERp(DCCy*eJ%P=Sv9pg*tAHp1r5 z042tVj)Aco*I~T9o*UI;EJ?3C`kq=eHpIJJ*Md#?OC~cjGk~9%4<3AYZU{ySY}fkT zR-%>j&9Dk32kBkzJ+3khdjtWk=pIJAl&j;+B26!Yo>;(}bPTn;_Xx`(t2K*`w5jlA z)TEQMiJsLZ&X@sOEzq~c$A4;UXb80($6%C6VK=YkOpb&XDHXI|WZmP3_*uPr-gaR2 z#CxX#0FY7%3|szKLKGC4JB7jzKw*I}m7OQ;C^slr$1g1Cj6!$DFjWcEFjf>2B^5=W z3gxlAe$7Dxl}J-)xW2j%B!!q5v!k`v8Q|s51Lg$KYbQrrck>j|6}}_&5Fff@g8U>5 zo<$1^gtI{@omUIvfrHNh#U1buFtP*#ozKNKzd)aRxdkbch?p!)(jzr5&yB^2$0R&) zk+JhtE;U_|uOA}gwV5;&>KNG7-5U@Gl@(dnC;l}!HX;^UBqD1J@cM@RBW~k7W7sfY z{~Daf62{HdjMkPjAD~(j3%$LD+Yc_qWhb4nLf(C(D{Aiqz+4 zhjc)40N19Aw<#&*5;NnNdw!|i$UydlKg)4+ZJ#i-Tb_?`|I)a^7hzUTRa zkna!!iS+=%?5LjoJ)1kX*$=lyj9R@Pf(&`Ko`C?sU8`JQ9B3l<(b44OkQ{9?g?-Vt?f?DRu56C9tKHvG1_nYx^NefL&<(!M5f#}z- zu|I(68EisANoJ>?-yT0A;iAQy;Ch-_t7i(Dyj^YUzd-ken}(?AvD?^Zns)?+RBD0x12kUb?}i2jCNj6J0ZAi3 zvD}=TKvR~LV>E~g^E}Add8I?%NG=>ZmccU%^8C*yF(O}pct5((*XJS1LUW;3GtqWE zkZm$fbx&1R&b(uYWe#EhjVUrOOXiD(%f%9m^UF|v_Y<9sUy22H5G%?&h6BkXmBu5P zF30R39+l~JZh7A&!_u3t+5i$GC6T1YYmDQ!;{}yQI!kt6ZO!$#T{m6kNW+f~ zH7i_>LHxhiKjG+P)Ho6Md&CIDe*2MU4+Fz`PT5;LJw506x3eoiR}ex=+XD(?N5^-j zGu4ES zdo%HZRyV&Pun1~zGZdf`x4BukKB-cs06<~XyvMm7=+A;iWr<3e&ESFnt5HAEWyiWA ztC4P!NU}p0$U7a^~Z>bidm14~oZw_)4ag1i>+UNKnoKyl%s{ zd_ia#GzBDR=!~$Nq*LrS|74Xuya%CUfSU@7-Tx94yE_NJ>eO zDQT>&Re2R|g;3C5)~K%aXJRU}yj@sq8b&<<`97Ls8s>o(-V(`QxWVx!mpgVx2lhX% z0bz-#M5X$|g#OIrc2m3Tt1d9_6cP|YyRy@8eAVLR2gHcf&ZnoKZ+L9cDGj%=u>q2e z8e{oS5(Wp0ex#rnv_}q8h<9}f`WEYK*LO}qRQ93E8bL~?qb60-IUD1RGXwmWFwj;5 z1^Lc2VkB<~9f&RbLqdj3ssKBSoSj+$OtG|-WD38>6|gzwBDJ}E#U4-3hM*u=uxOi< z^lM>FUuLs&mmp2ALV*=gsRA)DY;zHJ>qf4|BXf$7n=G_C_OioN`r%}UPKt&fVw0x9 zAR{Rm8uTUX?Kdz*k;v*&+}PMy6)g4s{d+J;p+G~(YS;@@pcfowOw5pEQ2W&s7Xy7_ zKxinQe?AqCthNkC;)BED}tv_7gvx7;4M0BzDFAq4uDn% z3e3zvZ(8MI*W)>dBDE?S8k*kTZiRxXXa0qo1b#Z*V|qMC#VzFr8kaqf9yhxm{!+Zi z{d@P?)Cq3OnqD^p3R?y&@xpY{5)$2AU1@y*fny;dA)sUSo-%TE*>DX9n+iL?n1lq6 zK|`ZVH_N}Q>t}l)=;fXvb5bbLGlsI5&&2I8$B$rH%n9^_GnQarL6Wg?v{b+gXhQ?~ z`S|!IO8gkrt9x5o1T+i#yZRYu7$PJx)5|TI1CXZxp%7#nFLJ+C&|&y32WC+K2d`2; zeheBz7lnWCG{;GeoQ5YK^?Z==}f;6o!F%z)tUIv7pg0nv(G9=V<2Y? z23c17K7%F<5wlGu!lyk}+s*0f;vN9Q?B;5wYy=EoE1O zZuJ=rfv?WbpFhET&gI28U^R7`9{trs@Gw-Y&^VL2O?;55kcvegalIR3Wy|@cQqBDR z`=<_s91akN0_mKd?{7nc134fNIFfZgB{By{X?ouU!Tpm1vOyeAe)e7!j`aN-%9o|Hs%_MO;O zJj1B#i>y zyW6e{;MlrGOma$cvB0I5M2b&{YLU{&>(<`cF@G@VvS3zczeOOL@i&K`vR!h5{&761 z+JkP5U?%=`n&Q%d;iqysY*EoRJz?LsDdq!1{2|Pc!{0|-wr8LV-2|pnNIfpB0TcwY z)h|VDd#)6vSH^PIpcI?a!>n-1vM543Fp-BbOEg)pT=IMAwXmqD+wXR~v^1R*kEZWK zL*ePKeT>1xx=mPCd^9tWs=G5FmL^2d9c*{J-^Ikm#Q|MrRNknpC>B0G!tI>h!^0zB z=%nS&jY{8fRc;?^o1l=WshuLN(B|Uj8n2<9L1)X3B!lu`=Qr+}CEcZEG@qPU(9$(( zI^X7w4mSY-%fey~j5AkYH?b$Emk7Vg>*30~82$xMR#l>mra8644h#sWHk%V1a_U~D z#%5mYOLW*!y6bZeMiTNN34n0b(ON67P)txSkQ|VyGcBF1xqr`~NYwWDN8?j6(X;c@ znVA`&F`2D*2rWiCF~BY0TZFv$G3rZpTi;z=p^X7!$sT|ygV)1UE7t=vGs!Lb zk-y|Maky%ek*f2Qxw16m7lN~iHD+Lj>O9jw5_Fbu87`LhR%quvt{c6)8kGwA7^!6O z@B%TF37OxP$(T>1=3Z3n;&K0MNFrjDADIvf0^A8d(px?V47>z~hUPpklBLQg3}!HA z#&`pC+&3I3Yh-eJ^vD7hlAti`&7pPx=C!utUA@6!C4xbGomY?$r5vD+OFb|&(fzfu zvOl3M=IS;9hIARVE)34?&4CL>B`0eM1-XY63ji`xSR*p^U3Y132%H;gXOqBV406$4 zs}DNpI$s=4%*&Q9zkc486WSU@W}q|rf|tKf(+g*~qBK~ArfXmzLmj9Effg%-i0cec z((J~=%fS1XnTK9kyvGs2oDcYyOw*BaR|xSA(QxKnkLuI-FeBO(FR9iwVs$AY&OkVe zIW%wd-s@-SY(9Eu-S3}{~-120ibFyk=`{;vd(9VlPN28nLm7bDFy zmCfaR|J}gGho||)btkDqeQj;Sd4D~^$q9%)Pg+mWZ@4Xxq)yk9{s&QS6<1}ueScF@ z5=wU{BGM(Dk|H5Umy~pOhqQo*fCxxS2+|;pgn)EOcXxv{ywm;L`~UiR4m@~HTE}y_b;&x0Gx9R<5hO^OA`|ld3kv_w;?RC zx4axgZHVCR{FT~!9}&8TRMj;#|8Yu&j4MO3EC4!HRaH?RE=CxI2bEEZwjJVckr9M5 zvIR46K7ERP_pY$l-$*Dl$j*M`GyC=VFf<5o2VB5~GB+kA zR$^mxe7xGNcot~QOar&;i^>Kszqtl44MoL1nAyJO;?uu3AkBHdk(eq@AKUeYAhpfe z69xqlkHh6AurNg+pbw*NA0$h9f%(WC{uVKEtgP!<*z&2kE6;4qV1nP1TQATW9^hyD z*a(>X=U|IUP5#F;~pE-;zF4xx? zFgx1X+Aveu@m`O_<0Z$$I6%}FG;W~Tz@l70BmK{1q!Vr3^zUD`#p^R?b_QQk3q`}`muc&V#<5`D0Kz%l z+`KSasN;2d^Y`cNPEU6~5F>$!-xBXtzc9|McJy35eey}}5hj1traK6e?{}siD<+ZL zyC-|vmn!T9tQ35VIpZBtW>M0Qb<@J69w@gt%pGo=ldh9}wIjSRH#D3mF??8i@;l~X zfqJ2CqxT&jw?V(ap`l@ba&F*odrF3_7rW1)-9qePFLCL7GL$6~t(+ypTT=c)HY_@< zTFN5%hw?X7c^6_9=6@tS-2b3H1w29~CZ?-G!vA~}PtXU9!qu}_60{kEKFiEKWndH~ z4f~+Ogtp$U>rd4gB?hlTEr%LJZQ6&QqUy;0Tz?9AmC^RWaJ(h6W&1lbpGiOE1OBX>&J|jgjMVA7QY@d(DLL#ZwY}1qNYgvN26X~eAgs)E$W7m z|4?~+{2O?6Y=mUV++J)J6azG&sO%0SDUnRaX@u~VD*=Yno0rzH-6krwwc*~AhlN%2*5f7OtQsH$_%)=>tq*2BiLCn>XCKLNeq+BL_g%q!jeU1P#d!Gwg2T#TP$v#akkjym zaRLzGcdPI?kVK*WXDHc5tWCWBKr8X&fwObj`U3 z;Dse+6^jvH+8kN=Ux3c)c5Rm%+My~J1*z>cpNoxE7M&1ma#H|!JC(9V*&l?w=<`;n z$$N(4J6ekx{7cEO%3-P98TIDoat{)amS743AKcf+DiKnzsi_$k=e*ZO%Qhi6PE1Uk zo0IcqWtF?6oKnbrfBg1RQ~>DNl<9J_y<#uFY_4H2`fC~Rh%SgeG3ByBy#{=c!+&OP zRtw3U5hWfsjgRN8BCbMc9Kfjcb#r55;|%fti$hbH`THs}uOd~1QL`3u3P*Hx%*ntA zp0O=)_Ks}rW9 zl*B3BhmX_3m`ujaGOa#LiFSuc8F^Yjy^wR{-}RU*n7fZoPnG24U=Z0H&b6y^g>g*F z(o)XT^P5dUiI2bIrcf4IBzKe6aD)(< zIeBr`W6kz0S)uGXk1#C;E$z@-xmN>^X`T{@XXkOJy}R>rLrP3sS?nt@`4CdjY{Xj{ zBwFF1I z1tb69zzDWR|AhL>-D60Y;!yJZX&V_45B~csAy3(cnRVCP;`ilgHL8s|xsX5N>A^`b zbZqh6Y#b_q(uTQ?wLJwy01zwmv2S>E3?>-}93$E?UoyO>;y*m=k=RODl}y-;UApEGOK4@ngp>nYFl-^Tl0+ zb-+bl``LU7HU@jywJvHppq=v61)IlMN~Rm1C)83vhbMfH{bgm6HgU#&XKt!*#_e5| zZ`@B$+Eaz={4?Ozl>&Jk9MWf#D4jOi`QG8Li?FO>f(exH>zkgq0eg9 z3qopIhjGWNwr*`@ZOz1t92<4)QVVN=V65m`T{Va~1Rf6bbogMXgvCUs61eXVrF}K_ zgSl-5-^48FnYgs{#Y*>20pw#E0n{XU<51CRs}h%V8LnNM`^e95?iBH^Ll`hZjNN`- zEMwqg`P-}i!=rx`6x`MGj#ebLu|gj)&m8qjw)!AYI%8USa0ki4pP>EbEF3?Ah;6pS z*GEeWBDO8VN~h>pSSUfkPfX~!>|-Cuax6P~=%vu}@kugbqhn*=aR=8;k>7p)c;nT8 zk))(aIyZWsx|$kd;KtI{RIXAQtwiX>+1YfxhZ7)QqSqC%ZAPu#db&Z(sI8_|$=`z5 zy{W2nj1~tnTIqa0LL1HW7mDf)TU=8PW>!||e?OG3XvEs~@NirsE)*gpv~XND?4NQB za;@sBPSvzxC-*28HH$v)|I8&UIJHiuZ){p<*69UJX&j zguR{OTc(?%Tr{Cjk-LMxrI1+?o>cWi1>t4&-TB<0HUF)T7Nq0 zB@v1>TWb^1_G}U@ps>5U`z|J?kW?nFX>Yy#!D4-l)0X9kT_ZnBsaF*^`d#suM6u0F zB@5EzQS>yX)OLGSbDr>i9NvG$R?5f3^-5h&;ifWcI?XM4yvlCPcCOLp`ofNri)*l$ z9}f=?$s9hRP{je9Tp7Pyt9w>dT7$0g&dB1%I32GYuz760RiS@3Zy!8i?lCD3xZUI? zo9Ay(RJuXw_`<1bpy}l4D_hjuPSF$n`>A>Ev#N~ep&zDQa7>(Po`m8w@`LEc7JVhm zBttR7(KN@#%&kd>M~a2opf8ha-$?#rNL>{930@Xtr`X}YruD9_ccfgi)Lf>=ISS+p zW&o8H6%{p&o_n|jdEfMCmG`Cm+&_?^)@J#X$YtuRwEe?zr7J0kj6Sw`#W8&hHLKI8 z@||QVz$e1Ki_0x-5r|nZ7Zv2^_n2~N3172jkPS>huM+&6iu4-<1O>^ji{P=K^_PD3 z%oBws>bke6naH72^+|jkci>a&jGH@S>8*p2sVT*o0pBV6zI|}`(zF@)HJPE}i3rkV zLJex6dh*PB5BF-Qe!~c|4UMKq<=M@~eVuH-GxTV$dFidF(n7na&8yB{>DXoiYplJR zerC(O6WKjAuEd_|>S_Qj>FGt()YW+aY&=-%u$d{llP4_1+|xRvSM&j%BKK;qo-Zec za$OncPHTzsIZ&A7yfO5qtt*}}{#~=lK0+2pk3lB;+)4cqJYh6QL-o0_3nc89?qXz8+@bFZUjWXTY;9K{Sa7=dmU@L^SE8l7(;u{D5 z{I##H+*8w`u6&gz8gO*Dl_dWN*@^<)xO^LN^ne%JGesNJCC^#56 zm+b6pFjBqN`lvg=(sAGaP*P%FDW|5U#}eE5%jm!hF0RZ^Ean;;z`0H3H*W7DWD-dg zzN`$#4}L})(TUi2+a{w~$3{p2qj6qO{p z&he#-mr*&K481>H__TKrU!}I9dgi=MCs*1u_k1#1u_KSFGqqmo%3b$?=W<&&HW

oEx-Sc!Z_zbaq*MR-^kh?nKjYB3tgwUf$Z9-e_E-_iWahZ zj_w$-o%J$i;LG#C2yZdm4w2P5Iz>t7PC)qgaXPyxr~Q};u%4coaX@n8p8M+3uCrZQ zjXGuYCaE^r#!qD`SyQ6uUFa6s*Irje!Oq^=6?;qzyZ8zE7k;j3W^8L_aR5N zy`uc^wIZ3rNmo3p@oT>oBiBnM9uA}jq??R6^+7u&9Gcdj@o=q@48J}ckk!G;%FGPG zp`3+*_1(L!#Bx(mh#Wiq+L%T>dccXaY6xVjvT{al=o&moZV<48jNsVF$jxc*Ej_)f zPU#|7jc&7PscdAsL&KmsJxhqlUj237x7b`!z0zmPEAjF1Phw~0jG)!5&Sq-Vu2C!W z|36Q6ALX)7=9u}X!ixnH6Vv+bHD6bI(mhZ6G_f>L5P=9e3HuU(e+KI-)@}l9k$z_ zyztEjKSq8TI%#6jCkJrss@(1=8FSlkd^O5?97Y&(f=Os_ zFi2FY>gp|DmJfm;dC(k=pKI3h*@8z0z}=JO*l=(iYgDq0xDvftiErjNBBi^G7?OD2 zOdc3NUS-o{!1I9EkgA4;4)do=ZLBKm2~g*(m>3xcE|LH5kf8he10$y`mBPOaid40< zCjNYj1>uY?w)3BaPlv~ojQw(G)b}{c6`RK@XHa}RU#;Gk13~_8m~LPndFN-Y3ZC~f zKhsCk%BUnz(=A)lo#}Q?5V6Fi z^}fTjR7;*GpqvyXnTEt~KzZ0QVDvAYbp=V8W?b8T@J)F5j3FMYZuR`h*kjwNAB5`m zhK7a%hBdk%C9Uu7LcBlny7O|aFVTiGQRHksuqZ{aQ1e_XO0La>9YxpH_+=xe#~OrO zdk){cc;hJb(!NBMG1v{iyz`h(FVJS61fx^)?wN&p!g5S4YD!Uo16O@U4#v$(y+8%; z9q(WmJ602mc1|6zk-lp8n7ZNe(kM5Ixu1<6h$CM_lM4Q=BDZ+{YW8A#(XQBTf?)RP zsES3YnnfZJenQh3Gb(W-2}&r&Yrg1C8ua>|XoRHV=K0-$x_WD#P@3JJ77A?3<`Eg{ z1;G}imz`*$Shyl*UsvK1@QjjLY!tA4RTu1WNT0?O4%1j*INJ-ht=1DG^ zWnl^qmn_TIMYlW+gB~cJ-P=X%n1MbN>72V3KVDqI!=qR~W&afWo7}wnrRcy@bfrmn z?SGGJdHA5(d!boEMjChXwyVTY!>>WWbW^a-_N&iv@8(}UBbyPT7s07Ankd%KnwmWJ z+gi@$-}b|qnNEt55Wr=>NX0JSOMw=OjL?&P>eg$DA9~SPNbaklyrLl+VOZy?3|+er zJ9dMr+Yah}GJeNjpp|tVG8rxaf)%eea_)B6Aerfw`_pUt_aIbt;-eso@r$HZkaR6` z;$@wClf(<8^qKS2)z&n?MGC4gRfr@+o7UgGd*`KzMTpr3Y~WxW3f|DI4hPUzVbX~3 zi76bo*XvZN1cXohG6#&@&Fz#ddvWpnE}W2K=G?TjP)tgTg=)yY-Wf@v5Zp)|ZdKAY z%i+SK%W%)+Ywq=hmCutsa9_cF3qVGl++L<a8(G)9`b8TUIcn()B+x?Gsfudk-N|QNOnVX(C>(H$Awc ztUA7R74>^e#XIoY-DF}r_we}b@^_N#E^>LfCd&KffaM#Gz@|d_*r@L>-s1B$8?Yw| z>Dz2RQd7*Y@=LD^Mf10gU_j?d?p-_juKq$<*#W|ka%x$_8}sa9=1p$qZ<4Y zVYZJ~?CIk@UY#B|@oQ_V?Z>T?du_QB4Zk6yLGld_M%@Poy`7!^Or|ddz5Rw_1CAZ< z5Bv|;qmVE#5V>IzR*4l75<;i~;brpb$%%sy&WBBivykApNQDfNI|9AAr2WL+*^~7gr>{R_5dHe17Nr zvEm=(iV;g+lA`7urkmj+anFOmRyhd<|LouqOF@Uj<=htuz76((1bNmu= z_R0Q!HtslQe5f|0;`co68eyW3lI^?){||M8FJezK0oHRK)7ylEf8f8Q1l%#(Ll-jsdqCWgyNQpX#D!^=6vohZ$m@ zV+K(M693>F`y(P}q>YB;lfo-w{ptZ9v6!Z>Z}YcTk1tNL+|qk15)SrUu(b=-9rc!X zcbN{_Fcv|Ae({NUvh>XhDZ>E2Tf>+LUXKQ$aF)NLzfZosNlGJZSBMM7=gi9P?rD=Sh@jXBxNWN$1ja_q|CuTI&a) z?FA#YW|_$bbPCN1mtF=(5JO?7p56=rrj(l6qjVvPp0y)VEPAOy+@Qf_n_!KPB)uq+ zA;~y2`kI>V;6)XT6>0W<0>}2&AEDY)bMl*&m7&5o1Y~@DF2frd?53+5-Ruq zb@(6lA*94SM?7u{sJM&mBv<)2Pd6|wo%{|w)k>+>2aj$3P5Wzm;-Cd;=p@Ykl ztp&pjkn=8Ald<8%f#aIuspWC;PkkI5dXI$G1rn_G!$Z#CXE?}@2#}=i8sv}X?eBX1 zo1=nS=M8G#Wk@bUVf*&(g8s{w_E*0SfJQ_#2n`KBKflE1W7YT#=h=P2KZAQUYxNCn zP)Isg#ddzV=UOtp{g-3s+?%R|ufk(XeG(A-Pi(Kd4DL1Jg{NRXw;Lp_F8`;z{6~?Z ztz?Oj{Zr#)_DwZ^Y>N<6D!D_m^SD-jVd1{GI4z#&b1kh6Ky0EZMe|h(I)AUv8z2xA zs^6tiNwYjP{3Xm=>LhW8kY?;S(v+40FMJPLOJtkMG{3ywUZ%0`9DGki{?o1C(~yvF z>yr7j{u&# zYl9ICZDg*_qoL*M#rk^M+EAdl2KLTq*BehFnQ>zjQzJon0h-13XWZ7PyUoA&v2-oU z*8XVOn(u6&KFg^x@JvCoJ-uIYhk|~>>TUB1MtAXRhUeETG;|a%M@%>o?m;HzVl%z~ z2=O%E+N&*>IRt^di8`<4-!V`Cgtm&BN+s%hb#r|wEG)dVBsjUlBQ}+vFZbDiJt42x zyvck~oPE**uSE`#eNtzel8R_|chyyp_w;P=A+c|xdHGb!v(~HYD~f6feU?|>)Qn2q zfWAY;BAMUXicLzY^*T+}tMf&oX~*zxZjl0f>A6C~M4g+Rzi-5ZhgsPdcz5p+f~9sL&KVy&`^&{O4P8}q^uvwA zH=>|BA9l0hlJf|0bE{?z=2=>9;`a$tc-r!z6hBs$IchQw9sa>FTY`LTuNU~p%M&^1k*yLD z@0Gt?+UzyM!%|Nf{GzYoqL|a9&~DCVn3?7khxYmb%~sxLT`eJ2+=u9)GwLcTjvGU4 zj~=xFJbSci<7;tj-Y8b$)xX;oLG;GN@<)K$ z{pWAq++p^bNAzZjIlCK-n?bVv-zVYku`F6KkYVgONFo7!D*RFOR18^rVC6%UH1bs_>@x_KlFb%} z9IloYDP(mv;28~h{HTG?-oRWoPqDao@2doXE!^%>M#^N`c#(6xct6}K`p|)nxdjzDB%}$yK#pCeEQhL5Bn$v*`c9z zBbLbdKR&W52~1W;p}XMWJ|RvYF;ZrFJbd$USDc+MwnBP&y0)2v7C&icv{PCT*)Kah&;lU<@jf)*Q!@SSIC?z zCYx-fS9^)jqW?TyFVSLYs;5d#h0)owLFCcOeAV1;wetpEY^UX%2#=5u5<20_5d(H4 zfmf}H^Ca*2CpEERTnb6C{MF-i^>e>-Y@Ueaz(u&VsfHj+M~l@o;8Gzn`M_zj^Nnby z(ysEKQK?@Qudh0XFqR&RaX}%^@Z&V*&fmWYBHG|LMagTctEoxyMGsOjk<#lJft`6~ zZdkm@z4m(cf%66s+Rs)|*4M`&Nr{iw($|+ZtVk0>AhD^^?73e**Tn0pgTjlA?2hEMjwV*o~3R?k%ASJC* z|E?MH@#EpbcU;)TF=F|&LbE_6rdMEFAgkH-@x%NY-M&C#5Apx$QO5%&rJolfdRIZ4 zlFjxXB!n*?0zBtMdL}#}U%%cL)2OVhbgZG!%$CY|?^T1UbI2BQ|Kuh5@~<3%d-ovW z&2RZ93|!QIhbT9&M8iLj$v~ZO(abkbq(UM`RYoeryUeleOhf+-C&}gC-ISjOh>cu6p^bw-Hg2~C*r4E+G79%%0?z$A^OTLIUU~Jf)utZrCOR-&UJ9ALg5(wzO=KWZN z?D6x#%KzRHAE@%lUhpDIJMn#KYN84M^|QJfnmY;EJt5Q&`U)kd3H+Z71{K4$D6g+aPG?eUfP{#@ETkUCMDJK7O}gzI)^y{p1-!d{4r-f&H*Rm^(xBN-M;=4 zCsYHC+~L6$)PS$?5IP+9)3 zXaMi%-(^IOY_PzL4OmJS8y1V#R_J-xaO0HO60<~`6{14%t1c2xo{_$XmC@8T)7ns^ z=tQ$JA1!)i|94vp3JQPWFBg@=0obcfz2&`Ua(}s9m^7m2dwhY_;T|}dZ)uQu>`{@C zg{r35iO}$?7b!&aKN^et)bO#aQlz&d#&0wkNxE;`-t;;KI&6E>M0vTmbeR7_LGI{s z=c{MWe#d!O#*>8*f8s`H?z50tCq(#*ka2&&CjZMLtx6p_xL6}IMA92)b$20TbR2_Sh$cQ~rz2V0L-ZAET{E^Z`5fWr~JGl}$ zikfJT>8gcHr5X>GamyYGVlgVH%GdEiM1RC#iDQVq+N$$oTL}uDR|F8Pg1%RhVrG0^ z3JOsZCLvY^?4*4Wh&>h$e;zD;qY~I{*nKNStVQzyYxAC$yE`fhgQ1HvZUn6!S_}=k zW_WxYK|*{yxOAnOSWd{R$Z7orc?_Yp8fqH80Lrtnvfhu0K^Pz^AF;J#eyrt(M&Wv_ z69J#VKhLw}HsXNw8~pmYLK^e}eY=rAWx|h0BBZ4Gkp;?YaAK(27s?7S3v>M#_>UzD zRql_`nocH^w>Mlc)?4?_3RCwbsl9y3@E5N?QTX!YxgE+KRB_yRx!^WS+N?nxdTeLz zHB*6s@q>AM)U4@(rslY|0dn)|9O>s;SOo^kD7XfXQ0Z9i?Qh&mhlVLwPcSrur}-jG zQXgJ6>?!U-sq*SB7ss7CRYOozi;Crb0QFgDI8-E;huu&;u|Yz;$4KyT>XJvW@>KpB zHk&F*{l7D>s;kq8ggzcsO;r_aa^tplN|26){>DGBlu6?4Tka(7M0p&F;fkz{ucmV! z(>L=zb^8BXDPh)kVLrb9Rk+SIn?i1)%FfQ*Tyv~wMgVxUMjv@s*FL+SdMP)%$BHQe zQKVcyl=ehGf^@7YYc>k2dOuVRnV|q*@__^qijLA88q2HxTGWjD$umZkwbj)Kd`a>- zaSvs9ywA@^hSx}hT$`#lm?csUE<9M1?|47=+PnF^AN%-mo+cVat$BG2^12EB_e|@z zgE1Kq8s9(fZ!*cF8t*kWfYAKAhsNe@1Th=*Le{G?-f@OTb$ja0jMlImA7?D9`!$0? z2&?_SJB=7nIc=d!SQ;MQkdP2h50CgypAdz~J54-NDFsFD!-0t}pYZ|WDm+h5=%YLQ zb}Glf8M#k7vAaD{ZcjMpcX|zVnK=#TInCz&4)hT?0^6psiT(KF4uT<54p??Gh9YUv zzJC9^*I#2>8ggJ^VjdnHu`x1MyD+(|bSc3pcQUlj0sXL;*f@oS1!@H&IHA1@G)bEz z0<8wfvz&?Y>BEQbFj*7G>9DWd|9-ijCA~Azu(iJ+0rw+JTwKU;?G0o|sHzftfl}sV z@NsN`%ROZylT;3FD3IWp&FvN?L_agK+XGXQHAN7nLUR}Gr*Sp(%kk({SQV@?jEjSV$TMVa$wD+_6t>`=ETvAN8Yrfr zUS3mC5%+lh&eTFT-h2>jU!9W`SH6bBM7XdxT z!`VGvyL$U8g1~-UN*-w;10*UcyLJ-EsJHCq9B&!J56xPz_Ah?@DS9x?i~iH4+1tS{ zR$)J4ESeR_O8EPQhUp{?uW#Z+Pp}7}Hd3h+fCm#)qEne%V^-**f zez{bc^qX&jUN!(Y$HwU2i#lBpq`N{qbbgl09yP_O_Rc|?fD5MjYrv{Ep=tGqdG-Gv z03S+Mz2RU6hVkaGTMde{ps9^Qg!u^_3cI$(l4@JY9bsN13dMU^NW7#9CT*rfFBs$D zR&ZDI3UJTR=ae5&KN3kat*@_to`w`~&+*pST6-} zD32Aru?I-?(T$BbV=9p`IE}s<*3ArhGc`zEi1vK*%v@?7vKJb!?Uu*bElx{I11~L{ zmMFsT`Up5SySc`l-CZ8j9!>unh!gQjtc3)m`y{f*gg`;~dK>JXqQ2eiW*aS@+lRb` z;%D{+n9bZA90J5GoqkdnP<}EYX8q!KbH0W+QKL(B!6N=)UyhwIF?P0!&{!}o-p zeI3d@kRxZ)A}Xs)lJLF3D77@SIe`_`t+6^&%>8; zC8N_8lkUCN%8Xed8nW5 zuUGa_L=stp%l6~2hizIiUORil985DlNQ1!Kk@E&w*DGRYFXTZOw=^!rz-{oYkRQO* z0E}F37L15q?HkL>bN3)J#>-7X?}6BqS%2!*a4zrn4g-V#v*7stPkg#~T)+~sa1zg? z4p)N57VblUlw}8qyO2exuvQsjt6`-KkhUgCP2!;-lBnwGVar^cpZ5c~zdn%Rb-E)A zNo^1^pS_i+b=`t#o|=#_B{|t=XR;D*$>{FpAbA2g4Zr|wv2sb$c2pvNtbLT}6fgD# z%ggqGIVT~RgWDL*ai=NQlr;=l`VV5-EQLL{&+_|4gne#=&>mmBPy2K>>TGz4o^@wf zU57pKOSe5A33Hh`{Xe9XV^=^yRj`WsZyuMI0A0yHuEpKrS z9Flo$FwoJ>HMyp5t?fC~887*Cmq0HAnBW}ZvfgFKv7nkqwCUg6ATkq?n=Z}h>#M1O zzNp9tKzoAW`T!dnn4Bdf&}B|Wb_bv%QM&YT;4z7mCarmJadF+;a5s+*LPMmT@81&> zw&YEMTNO~|w0It$;y4$19Ut^%`qOfS7sCaTxyFq{N z@xj)=;!>)Haa~(i9*kbh;FdNiSeHXZPJTBIdS)S`eE@1RvJj$SM8hxj{J)gpetfg} z)pFNZCYtVLy6#_iaR7OSM@Cj_-Z@10x@cpzQ0MT*Crdi|!gFU#JIb|hn_uULwMT}Z zA1sgs>9bYprq|$};vgrkTtBd;Jr}0(PB_|$#=#ltj}Nk%pS44gM=vL z7d_T025ke#=2L(fHfX?g=^qaF%+nk}p#!CS0wIstk++IAZ=Q-IN|}SinHdynY=0)a z@ce>;{xAG42Wt^Y0#TBSXcWCB?9A%r@tBTnDa;|CxfWDJk;cok3jGD49A|q+LAx0b zzlK85)|M6FgS>k0(t)uN>|Zjj*45Xa-GKo&Cp)+KZuXEETPaEPm{IBE&X15!DbF%@ zZ~`LIL5shiUg;vhIN2P|_avD{=n(-r!omDvG_}YTT%!7PN=m+GI_@*!n_1r+1oJ*d zzm^op?tS^D$y%K#+29^l`7A;K27(q+7D7^ML7lJu>(4tZ4NPLMO8e}Y@r!;NajZdK zXRY%_d(@Wi4PqL!P+oM8q@=np{$6N({_x|dPXo@yN#C*CkG*jY_kEg-mwCgMphRt$ ze;qdFHFPRqAlPm!YBr6)o<9Q^DHMHxB;M!Fs3>RR_J~G@$E7R6qPL!CoINDo8r*6^F6_xIAF`RB|7H41tpIjx=c@guTWFiU<)#8miWC%) zv#kFGoN0wA{BwBkc6Z6;7ra3V_|U%=8@|S1=oVdS`+m^mDK-KDpT!%sm6~!h=s}gr zR=INr?RntaaqAy#CY;H=pI;GfeflmTE>vM$s$DrL(4fD@@^=^Pr-Y&z1WPBUG7#u7 z{8Fm!+Y^o3~nWkM|P2EmLeE;jEsXoa^7foJ2JzQF5nj*uv_c?fmJpdj*vi+MhE{{NfJj-SS4ZS|cH^~I`1+^ec!^<=t*v&7qK<}HMo7|oIk!H&8TJsr zCICy=s9Tqgn3$;P#a?9)%LnV?yhwlzYJHzM9_IL1t4Xai$HlSe@Ib{0BHHEI+2S8P zKmXOu;Aaqq!MOGHV=-;;~jkRivm-$J1i|CqxouLZOOi6xi%zTN_kL!YADKsB~AO$j1N* z23R2=4Iu;t$yZ&S=nFK7$F~_FNk_CjFh^2EDUsdDiAC&xCXNj7ca@hL!n#1xZ`r?9 zT88P85AGXGcfQIM`NCtd^SE1%G5<95MjazSpLj?&CvBpKQlV zKy@*Mb=DxQEW)_CaCSQD$QzD7@c+ z`M0{Sw6rYP*U!BX)B1D$JnbTFg`ULkzu#GTg!&0?JBZ^@61EKJAVL=O&A}{&m|vmI zLfJm>HdV*_MVg|94CaR-nSOm?uj6HVO@96wUfU~u7!1rXaHA2Z-YS}!m_Y7(bF~*X zZQ2k-G1~@_Z=sOMTd&-7oJ_ z2_e(B^6L$3RlAuz1||HG6fFr7?oJpy;+lE&gUoLY@IJR$yN+)&GX@1Vn;?mG7k^P( zF}sipwD8X<4sNA|ykJRuLV|>7u|D{*O@2_tvekIA8vZy{R#B1aspTIigy5(63wMnQ z+nKSzP^|m4=ueYs1q^)ZMNX+!u^O>!3dsEy>rW$}O55@wySz$tS|fOLf(?w4Oc}C5 zh`s8`)~T+u{AK+#MYUjxfZGc>xlMo{z`A1hyyl%FASMhB3Tb)X`6OTo*HK>}FHl~< zrd&LkV{i}z<6zQ{iHV30v6O~&1`CrvcE2Gd-PoDx$oxa`U()WL*sYpBs>r8K6Vr0i zrnk*aQPP3(>ewtgh5L~R2yuO%9bSL8u;m~CW6<5x^HY3$iii){8JI{25-+k<__78~ zTGszq92Z$SdD>nPJ(f+=EtEE9C!=fhZ9stA^r8w;D`cjz&*T}L1IiKbnn@SnC!sVW zrvRhV5Dh0!k|Rmdon;(ui~(mXXPd&1jt8j_A{?tA1r9PJxU`+ zFsu}y9N_Y2Z>CAgCa_TFU&V!?y-+vs#A^sU@_HQsq$SKz7N`yKXW~riarAf^DE`YO z3@!3~bTnIW9+cP)fT{rSjY0UM7+G{VToql4TqAzXxbPC`>{^HGiXwc1Cfj`I?|#<8}=tb*NCOn2msw;LkPbRG`$=B z>61kbIZz@2-bW3B;y1HGb*6(@+3V+#Ie+ijyk8}1&5>ik#{MW=G4VViqZ4KN=y+Hd z`v1F3oowg&8a$3dbXk{<0N{mZMOhao(dFzo5q_y!`z`+d2qb8l$k4A1%R_3F(nO%q z^()u_x^1P#GGIkqPMCEg+Q4Yh=8aROCzB9vH&JP-lh|cgjwc`D|Gc`?9_Kyjwr1(9 zYj*obZL1<4etXn~HnU56AX_o7O<#H(qci%aA0Ix^vaK!t7gkW_U>|*pG(_)yeX-~3 z>k9!*-MYW915AJtj%|xy`^96vHdRxz9%dI{X}TY@i6aFxnX{X3Zd&sQCN7fMWzOUv zdO$*gs8f!LLrfI5R1~NbkfJ26De2^@jWR4K!%?=-8q(I$(M&01PqT8l_Y+?2f#GX= zdrIvq_$V{sM6aUWYa!Z(v|&(W6%}3|78KJ*Qp0vWS3A3d$1g;*YOOtPQoKJ~d&?CP z`_jig5f+YW760*!?(6OS459xd#G)B)sSvqekQTOldq(I#pBf*pCM6Z@|I{DmtnoR~ zrruucbxfQ(Hfcc(4%o_yg@wfovBBP6;K@(Gb$RW+5FBugh8l{pb?m7Y!5D(gH~w85 z^LU|t;1N*-;XN83*gAlQ<9z^JC~W)|bX+b`B_kmwhO#R&M!Vyk?d?bJ=dMsW05l|(Q$L^N_X8AjsYeIRs4gsB2CvEBNY-4Y z;K28D?A^xiJc8dJp?_H@F-8eQoEu??BU59E?uV3`SbwSyY|#XUa1<8&c;8;1{#$&= zZ)^%Cj5WR1?4VI;b0)S`*l+)hUtd3d_>-p!(|m}OENEep?&IJa>r?XLm_E5O2a^VL z9(V&AG_P!Jp~aT8c_NGkb#`8=<|jdWPdc8dtn9682IaqOj_CKFwhv5RBC!{K`*v`2 z6cM#!z>|FJDNK`|n~UC*(7n=SG7@husrINOECL#oR-P6#dAmingFuAXyAkA;0Es^P zgZkPZJal}Ln|u8$_6!jj@mShT+K)EO&p!20TUY702n6aE9~~U{Y<|m4^*(&QPK$*! zU@0ZVuj}sYtg5Mr6586?UFQS)pT2*$1~wx{8Y5ScKaSJv@Alzg+1XjpuV1^sTq6aD z6^y785E-P-vi4(jkYa_7Z0o+C5??ttF6-2_VD2$g9?R?Qjwp!Vkek7-VU@@z;7Gbt z-AXMx`TE28(MZ>}4i?VoVn4C(<<2SWqS>joug)`&^DzxzkITIV5msUzy0gh)tS?YJ(Pl1eOSH4=*YH6xZGt?X|HIYfM6DG~g53iI;h`JK(LLr&oQZ>FX7#lwi0b~DWz z*@SQxESG$=H?_C6_S5|!Q>~!Udv(HWL0yHAZp$ftfD~CUu+|w?13zJ63T)FEPUm~h zny|KPf`%5_v?FFm|Nq7h(E*$aF`9vm3dmEU_8?X-EG}Zo%XA2oYciibNjKBh&X119 z9Y7a*ETpBZY+5<#?enN<827zaMcaq2ZD|IACKd=Gdvihnl-a@Y?=eUsk0W7x)n%3WrYe>O z^8bAzqIQE4`MCA&3QcAkByJ(wkUqydHFY2uY0(Kx?cmS{)P?z+8--VveKi`JJSxvM znW?{jB>8WNgU`u|2BaiT_mpfaF#6I&?O;<+zvwMBK;~J^>4n3vN$>5Te~;$fhw~B+ z*aFQJS-ropHv>}o*ECesg>?NEfV^_WzbWJwCP`R?izWhnyl@Sn|&R(qkjUmokEj z#kGUVc`O^sM}+E%iR~)eY@}J2ok<0{!y(JcWAgh~-Af1g`T71r2%ZAY>j?cEi9N6} zN^Dj%sE?)k-4EJHYxSmj2%E97!CU!0&7Q_1(*#LXm-nf`8d zeSIc{0CUV45d2=qm$>6;Ww$_Ih*nBxZA6TS42 zm`=stzA2CWsfGob9;*|!;WK_U?hYOAcgT6H`96Ql92vcH2NixrKI;R`&=aE=5zO1I7AvAw)*DgS#xvqpY81=J%3PA%Uj*XMhVg=hA^yjaVJ+v zmrgs-xo@B=1|)dY)|O2JM}rz2(?(TCcH!mXME2V-egOj0&-Q%j3LKR$CdiJxtunfP zzdgUd^i7kyn^+(;6D9n684Ks`wWPb}7s>pH=m`B9yYo^dz7AA!@-(m@RMDjJSaZb; zT6~^1;z{_`#_2kkPw@DUY6DsZm!px#qK^YL-u2r;ayHVdYh(h#e9i%Q@K{;;Ja#U? zxd@}*CqRF#^*LoSHJO26*N*1kS(F#C4Bj{|iq*GfbZNpb6|*e8PrWQoce4U>lw@Ck z?d0jxPUCxHHsvFH9WUaC_!{tq-F^8z7CwNk{><|dp`o+IirS*ha>$`kU(9Zb^XMk< ze|{U>vK*}C1BlcFX`g$K_o9VaU?WPWR@sYx-B zJ?57Qt9d%K@&hw?U=_i+cr|i{BEQ#&fqBp98b5H*u0nbxyxPl7C+B$VPFJ{pkw)LL zu*`FvTJNt7&Q9_`egZ?)?p!1CH$I^001XvJ=*DJYxOrVB9n7v3cZ9m%@BCjk#_jF! zgLkTG{g2{s95XIDx!N7yKfiu$u0Dv3jt))Ic5@@{Z-HgT&cg8vZBOmf-RA(x5$53; zd&10!#zxZXdAv?1B2ZngS-PI&ak*O`p?3r=>WTCo-X z3bI=W9d^JZn0U=&B=6lPQzS_@X#3&t8S&i25D~B9t*Swfz@e!|pL?1bF*SaZSyv&r ztI>D3Wou+ar7DqC`rA&hNtAC1g*D;-^77=%n+>xYbqRgOO2 zmrL%dxaWYri@M5Y7Qqaaa*`R%H;L!*5pvRcp0-r2&p3q3XxN<#+|zpjxed4p4QQ-FckIL`Uu+CIGUD=qg`TZ!ux*-kR@CiMbIS4aAZ>>6Pc7= zxjCnC8cVhL`%RYV2%Gm2vGiXAl?0^sn<@OY%=B9O*89S-`NmsQQxl%G^ap$pX54me zF+WxP2(U;rEvEmwVjn3|pa-#!jye{PZ-s^`OK{eh#w{=sVZDYqztdfsZ(VLEOMuFc zNpENmCVDzcYcN*!LTmPh#3}sysFf6(bn!!24wb-Iv2dMN6oY5^C?(;oRZ3(-t@RCU3?H=Hq|f>s=$0olWp1pjtrd)JQbgrc6~7Gwao*=?q^m7;pG*7^7s`0b zl?R-u?S?`bBv#`VpG(JU8585nYDaR9dgng`dx$$!Rg} zqf%7?AH9&t!6)-&M#XPM+Uuy;Bp(Y4qguKS*9Oygyh_@{$+vNQC#*hw`><5|_|7gzG^Ac&?$qbG&SI-B9U+j~|BWgiv@A zN56k3#j7YP+B$F@g7H+_LH9PO-={%=4;M=}4-d!B>I&HLBl~=*yzbik{+II}fNLCq zeKCWW80Z&_HYOecgN?tx0vruF9(Uk${)EAU0zWZspFNE3%-0_pVOiNG@WD`1BeO~F z^&$$X_(sDhr+4*lYU&A0q-FD}@m&#|Jw*&vRqy#$Gml78$0cS;+L6r8&o8%kTqhPN z&NSJV7HASK?X7PwBmc2=N6HqTew>b5L3oJg>WNxqYd&=+i|9G6=jCi=@YQweOzX~R z*{sA+;2=IeerNcdlwLEJ^?{b8_f1YCCfSysr*W?2cHY#_-1>)BNM6#q;Lc!Ehx7qyYrM2ZYcSeS@BH{dDH!7oMM+ppC4)YX|N~GH@bxPn$_@(D=Uc;-hg`>T9C~?qsoj8|g83$j*soz=}z{>Y zw{6JB@B}9p9H9`mQ6l#HszdoBKN*|mHUOCLs1%J|1b`{RNoKEQD&Tu|*A=rR|Gx@$ zu}GT8;x{L+h|nsV2h7xM1ZG#yFvChm5wf!e2vg+de!+GU8x>V3txnmg@vBzX-au0m zO$7PF{EX|d{3HVI;;`OFiCuS&@a;zj0iP~k@TJ=iY>g)}wN=~CYR1UkPg0nlpWl>X z$CF$Bu_yhS$L*I0qK?RFyY9H~(3*qZD(lIG_iS<$|0t8v2hSB11z+DeXkQ)IS0VJ3 zK~(fQFHStzMTbo@L)r1O4rZ=@HkGn_`-Q?dPwNaNfjv)qS)Lff%qHTrhL0$w@CRL6 zf$oJd4sbRY;T0zGRe6sd4uwxslD z_e=fYs&@7o-OJ-0uu6?U7-w*>uh2_{sQWq)Ys5Kxof{EVG-UMFsmhn)8$TysR{E`H)Wf-iNBVo6$=SuFkmQcLkW0^ecTAZ{ zk4eXGL|sk+vdE)FtTw}yF3W(!&eIei6Z851ZsfKUc6|e5XlK(R>TOwz~HA5KR4$gTos#0pRTh%aZbY9!!6fQ&h4GNxo4` zmcQTa>bl)FK-t_llJ~NttSlI>#sW;(uZ}cB{!^?5JcU*R5u>7{q}A(C7TlV5t5lf# zhlT)sfQ5@2@<_rseL!|n@z=o_80Oj8iQjPY)rAxm7AhC!o4(kzc`Y&Sa2{hCk39d`GzNqauBBLoR>0U)C_pUt^kN6Rh)?h^0=*MO2j)IGm^CPV*-u4>}j zb3y`r(lV-4MGH;MHJD-pydLNqkLn#--|GoLTAlP|;_`1H92yaM#>62|Q;V|u_5ObF z&VIy#lbqe+8S+VOr0UHicoU{(gLvc8y_$cBUzp-H;B#g=I8-1ZE}B%U4vhwlti*Cr z<*Bf+mX?C-=j41n>vVr#0MaFaj(zeY|Cz(??)dm8sBe20)*h$35isZmFQu7*0rfbY z|6&r8BC>#>NKyHCJ5g}HY5F}0zI5uA5xRTVrd{7|F%hlcM7d>YY;3G;p=ZL#HUvaV zJhQ%m0a&RKm}l$bYG-?Y2e@A7Wur4DIxoxGfaB%zWCs};nKCBCwf*svg>!JLwNImT zc;X=JIL(z#&~=R*r#B6YE`2;Y;sGc8hOfN5HdN+vJ$`<>v$d(}`*3hwU*54(eU8UL z&Owz4u8%;O*RN3_(u!5zM@s4n(m%Riyl#Mz$G>Q`4B_+E)>a@`WpJ6ZWPBL3snsbb z(Jo(F={=AweTi-4RBxwk7deH}DKc#dm{tdv?@{lV*D>7TZlgjP!50=^2 zcLBHASfE!1vq@Xo9u$r%zYvZ>r4Drb?DFcL$!fNaeb^4BaM|1>QTbh2ronW>v{rCf zbNnYv%7Y*4?B+IVWuqtZJVmB@)}Bj8!`d1%s!KtB1EV>2baTTDRpO35N8=Zqe^Wki z2q--X)ur4v===f3Z>X!B{2>QZV)QO^GGEQ_ zV)`$r22l@5y*%G!#{=Jxg;W0GyzkM)(dK9Peb+O6@RHwfR$`V}=YP$;LfqfkX`TfV z?#){IF<)u9kIC;3jV@8oA`uIW*Q8Hx5b=M(GyDJeXfd!!CmhV-ZNSK3ZGK;Y#y%*%xXZsz1@{Y9K4 z0zh#^X^v4ldA}xu-s%I#nM1X<(H2-j!Rfl#n0PxP_xX$KrXAP+@jn=FA;@4828CB) zF_cU#2WTO>`ayGSyS@cpY6^%Zg16O2z$KeJ07si^y6dZbQ)cYkxi`b zLMQ#-M|^`m4qkT1bMNbmBpDi29h6`JLb#-4hfqc=qw@PWK*1WJ&{@Ex8fN3A<#{9T z2QhKw7Qo4puLiR{UIvDmX!VCqERsun3R79^XQvVyb0nh6sVbdOCg5vuJxNHHRgS2&? zU8}1+Vs5y5S5n5j#|GO#1&d4lB!Qh$w`oK9)Zuet;-28T{b-Gnw5n?R>7#mnQBh&X zgvHC1bMfaX96PhLe>_QSp%$wDO^_ zfFeLkNR3>GxFG_rUHncttS9s>hI+cXYTD}k4BF+zOfitZiAaHsy}hZaq=dUvsbQna zVw;g+09|PKmeBo=vRyndVgUo{^_i5$V9&q@6^0+uUVZo7O6 zsBcp}!O<+p$!T@C#_rhsI7D(?DBy1|lgHkIi<@&0I#3uqT=Is~7?jiz?FcjQ6}1_R zc`D=wJQ?*vLW_U#k1l(o6+5F!#|{+e%71MLj(~Nt4s6%~9^l&dPHRap*HJj)=PnGT zcui!cV9ML+A=9q;sz+11^hgN=EZ@`%BJeE8L^mAa3QSLYvx&M?|trUy5Rx7S&f z0qxn6_uximP-izi!)xo}@~X~Z9*wYPNbHi0#U@3q*!$+(ABexSBA#y&6BP?bOVn$D z$siYd<-PVt2LcBXt{J(d6L@}~lC!bl3Xm3IzU(p34X7~2>LDcZc{yykTCq|^Y5=2ErsHihw zjRYDO8=b#ofjnRR#sTGI6#R5-_&)~qhzSE(}RPts#%dQ1Zy%( zLPj=&I-UoDtJ~wHV!D5wjf{-UHIigYt^K{3#b-bq6}G#{T{!x4^j9OzaDYULat8m^ ze&_m2-&V`#zK{qi9z8^}z8f$;4~Kx@{wLFG#BjhdPMvS{gW_yhgv#l<0uM}dJL zBth4DUxN~y|rhk$Q2 z``6Nv5kMm{o##C!0_kAI1m=aiQC(2kgH~CRu&#+?HS|hBqKuH|UE*D_>pbzmN*8rz zjI0zhSCy04oL*gB{asSZ52_4=yzeal^YQmMi`@srzrfJ>At{0=t*G}==N<88zstHW zU%qR-Ecf53)e0K7`uLHMk4y%cS?|-%=N$?j9mA@K0TXN#Bu{_Ut^{$VA(Xi9kJ#C- zuTK|^yMds63YMMQ-%*c{K60rT))%XK39$TjLNCY9|o2vHLAIj3P(%<=(>pK9k#a zE7;4gfK3WUyhA8Lw|fCm#y04tKeyHx*nwCJ3G}pl{wc2F&Ok%~q!a{0t9W{TqvT#d zVAf*M*pKY#8-x&K=3y6icfLQM1tT@YX7?*bTA6S0@wjpb`LF8g3@5Rsz^h}Ol!=Jn z+_D;oN)gjN=d8j^G%>*fqRpoX-4zBtz=#Kvb?OfX1fI^n;FSMlb< z1Szz(l5>m*qs({hA7H;Xj-NN8k5ONgBniij!y<}Q<5=wN-OPJH3xm1i(IK&z=rrn?7Mbk2 z;ONLmEK;o$NXr--{aj2ut9DMOxA%==UvqgxA0uQ|bc zvEuvLmAwd(j)r0G+ucI@PBhAFmeZ`gt?ILNd8#ZUF$LGru>!S?rWlW`k2mlc&__4Yn6gP=7R@#Cra0!v5jMWV~A zPq1Y~Mw+pz#qE|ndw3TEWUat^R6*4**-lr6%I&q>eGC!V0(aR+v0iHmn~LMPI_#3w zEOo7!8K4K7&EIJ<> z03noZf8=Kz3rpYXD_SNda(%`=PHXEs`wCv`86M!Z3tDuls>*cwMTEyzW~mV9P_)nK z8yeL$meK{g&(8<(iwYfu{!&s%f9eE9M_)>(!!Fs(lBu}3nD?++o&iY=jmX{Ed2_0o z@F|6>5c@n;Xf9#3w!WI$hxhLzbGViM9X@Ou;hhpW=`VUD7*3Pt&BmE) zq^kiiLzpb??ATjc-g(|4_^60?s8BhtxV(Z!++l9qb~2ewhpLu!t0z7WdTqlhBSc<3 zTZ4zr!B1oCk>>+^z|5ETJ=!Z^z7 zYYi4qU~B;+Dsu5#RTZa%sj>03U+|qvC~u&W#~&Uga6**4IHes13!iwRtnby?KYN7^ zs;z{(kt?M^ZrY}itLNycv5fbp2y~`qQpy&iVmRQzeBbgZGkieB#2ZvR1ax&j7 z-B53DL`)0}9*!U>0K^;C_ai<(fXt_z^{hL3UD!zqs2hLw_9`K+r&}^eqG;R(>S4vG zHPq~F!0B64$xv&+mJ~N#o*`lFZb&P7p%ynePE&L9humDLb}NL3&@yVz!}M;+#GA?> zJN?7+sOZ=Ft~~w;p~W3iTIg9slnF7Xrk_@R0@Asv0)bm2gnUgM5*yTt^NMvE?GGpM zC5l{mgz5p_F%Uz6P+mjERs5SqJ=57jvmh~X^jies<BBQFHfrC?}e5xaM}k2Nz%|{GTT#JCzU*Fw_svggg1;hf`Jc% z4Al<|bxQ(vr7A06tY>}vxcbwl;K3B)Ds3vXkOOV@Fh;$W0(^Y#Ej5;{$MyHBQ&@^D zFdI-+%($Q%|1&_?d`T8ZT;42hdQ(4wrc`Mu)WpvB!?d>nHlu%0dM?q=x*faF< zI;Ty2_w}tmAUWZ6x(nWpO>*pQYa;)76JyaNr09Rf27nEMUr)D9!`Qe3-l67}7RXwr zAtJ&dGV$??ktL+0wB*>bJ3qLijk7-j;5)G_Ej`=aw67}%o)Gu|xuE+82iA*Xz)8q! z{l2!_2NV#P&C$n`30&r!Mb(*%a#6%^;xa#c=nO3WAFFD`gp&JE#7s`x-lV3x9#s68 ztMYyiJnsP#xqP>`F{N_+IqLx$m6A0SB1#DFLDhS5auPV`>|A|$y2r}Q{K`FfTH+TY zGD3k1jPd??*9;e!DauERjJ*<9JcUN)=8u0K#U>pD zy;ePNc^AbIDlh^lqyKA?9%G4>L#h<8=hDDTEMAAcGzkcS%Zm$Wd)weJ=3@(kAq*^X z2R3z{Kb@@Ib}71|`fUo@2c&K#g{JkDm9hM1S`tVCdfem~ufP8OolsMwE~IeXL)`ba z69)rr4F?uuP8g|}?a!wusZfnCXj_V961}}*kUOI<>@0#?eVY_Qrc1-6R@E(n8%3y- zD3y3*AGw5HyxgFW(Z(El2Xxr;=f1vIyYpY*sCqyU5f#NfBJ_-Q*_cH7EP}pcqo#`< zKfP;g)6JKW)ZhGZnotObD7(@cgI?Vq!t8ZOS#+4G+58r<3Q>$O4$9+&-|zX{?Im?T8e;M zKKOQ_ny-yn2Bw#k^Z}#c(=?TlZ99^YZ4G8S?iJSC_*75Q2d{W68R0CTrOg6PQ0qRagbKsxS-=n+Okz{ z%jVBb9`?(-Wv`I@#Bne?IEXjgn4Nuh%@hiy(z9pM#|g%3$V1Eb2lDLnaE$N0A8cR# z`w5F94*jixp{A@`We$tS3)I4A3eQSxOQ86Y(6%{#KPk`hyE#8Qc%+o}x34hE9}NK; zp<B>3;X&MZ1q%nDLFVQpzC;zjusNsYep}|N6`x(D{E2-JSYJA%E_fV zu9MorcF49gLao-GyYgLPfB_fEB@QMz9KO|X_|7UjK4~0tI{Ne}0f>ibifDAGoVa61 zM5u2Tw-PKh-503}%Ey8%-X<1iYVB>obxV2x)A6<=oL3{X$@BI{2oi@@C1WFfi z($gbt2m;ziHaI1Pl;vRJr(!P%#KRzwAt`1$mNzOVyro5yEmRz_^0vX;MRp_0VZrxs0QS!17dGa0c5~n|gN#sK%RzmPaPO84+-^qn z2dRnz3{vZhmDg~Sm^l+Y;QR}PuGRD4H*B}aV!#Fge+ONI+Bp1}?S#N>63reJ2b`qSu@hDmW+lnvgRn zgz!XA_zRNk3u0efG=X}#uN&RuJsaKc$=FvV_#c%S+kC5xDR+}GnAqpuq4;PQEPG#M z@kCk8vjY1sF(#%DwD~wH7|*dp8ksq4?{^~Z{|mnhF5H91wJAUx(`b?pG94wD+=v>R znjnWa?E7-3D;{4oMjUK(&U#eyy5lI(?~^3I1Fkho(pYGWQF8J-bq!546coFe2Cv1N zP`J0E+WiZcpW$6ZK}UBMv=bHeCvzpn6Syn-RxxmJvCIH@!;V1-z?9yg?uV<6?x}U3 zg-6cupzz*YgV*7=gJozk;X;jvqfAy1_!9z>oX*Eqa#u^Jac0P=$jJ}jAAYU5+qMUT znSVo;ix7}!!p!Yoh+0Rj1cNJ5NNqtjEo0F zk!1y9fVv)4yeBWA3t{bpy}g1yCv0!)6T&i+nX#Ts7d!6!V1;cBHPv6pf&d)aud*X= zYSBC^Vj=!sABX5T&3fb1XENy&KLgXXzDmEKnt26GQncc~!QKVajPRNhQu{#?Irt>v z6mP~yye@wJgVZ}@+DX3)(qr!Bu`F6y-z{|ut}P|)^{^p*8PROetQDu z0XAyQI0pJ3P?7Krl;-*}8vUJB}Gv4Z^}-@-e8cY9L(l=m>7? z=$@$BC@KYB3B`F`>xVGML(B`3IXol|#AYMej(_iijGOoo(;Zu2cWAD)!Jsf5&0D#!+N>SgN>j5JT4v^_|lU4!;uGR zE{uMd@h8$img*#3L~|me&yu>FwW{REL}&}}kKkIJ%qKa!w7tB{ZKrJon^0YraGar~ zqs>uZPx|i8O+$pvlyYqNeO+b!VTSJ``0WchFgvBE|DE#E9~FZ}cnwv;J-?)&ri>~{ zv$uC3e(EXYxuSM@LY6v!#5<*=Z%==Pa|XhjlRIu@%yBxQ=Lm|?AHHQImN_WRS7hp* zI?vAWb&kqvnPPrAwq3h}R23pwmfFU~h{*CGLrs&Zrs@`!(f_9N|L>&F98gfm3d$NI^{#n}_FMN4>dwq9TRa-k-1wnSQ-KJ`oMf1InL;9vd zzFMCdM^I1)P-Wj@_^otG{#plyK@jr4N$7_Xwc@)Sbb2|;g^*IFUOJ9Yt7&c89*C%{ ztX$rRS#@}@{E~u)c?G&MsHTzwI%QZ%+<8hdvJLm)$b{qziD&KHd=!S-V?GW9;TAQ+ zf8WZG%`R#39NHSl$JdRIxON+HW^wzK4f*3Mq$InGt)`Fc2~k}Aix=Cd@VsLk0sgpc)@Wl5TQx$OlvJxY#Po?dC`->O+pegDAb=)5 z4;Dg&Ik-_yPsTNP70jEWJ|8kYOTnYy0n3x4X2n%PrVz_w>Opt?_GD)g-alDLR3bPabyk?{h3w& z1K4sr{Tr5&QXdkcPIvbw@%!WCtVQM>G8M|?PC0?d9ui{W)pb^t8Zr%Yi!suOknhlS zNfZUvN$~AY-=SS;mxegbA`kwVd+q#J$FK}9_y%o6c;^)X7C9w=|a*OFz-=%t7|W&sWmkO25gSaD#DNnect&ie(toR@T4o&HL;R zcfg=cEN+n^oi5}RmUkT4<7VKuC{bjKsKdZ;v~Y+_#IpxPB8dqJx_!2vgcynCUG#0%xOu zDF@djTBjpe=Zp3*C5OJ#=<0QT82mWCxisFD*X9^R>ZYrEF+j<$@S})=tEYR|tP|k9 zcVP{je)(5Nh-;MYBkpP4SMq`-barh+LT*Z7=7yN(9lbkBwc&9U@nfkhR6z# z;MMTu3$iRY=!?f$B#h5$&=}DeQ0bE88B8MP|AClz=jMudenS=zQZthF=w;57Iva_l zg~eQ37M!xvd2-LEERBs3vt5jh@A zMa30(xYVsqzjFW8_1o6av$M0QDS@

!o%{&^Byk2O*me4!R{iZxZu1u<-mWsmYHg zNOgqXVExkfpzC;>|C`B(@LuzeW#^!^c=4QGR@8uh?xf*KaCh{ZIhT;sHR#)uhJiz$|@-IMI?R?5WG4B`zw%O z*V$a~uqh9|Hjw(9ZY}TZbXioBxk|l@ZzU}<;b~UHWbDW*UFr}JcfXp7eAL$Ly2+); z27n`8zpa`Dze~vXEp2M*?&zRtEB~(<_HNFN@ncvjR$+Ga@bG~BG6x6PexUt*$lL>G zIa-;slatY~#(r5?ZNL4jI!ivZ`zz30O@So{&b8OA!Z%AHcV7DJ9K*&o^v>DFMiG2v zu)0TmGd(g=T~hL|-?QUm1v8bAG%R?X*xIdT z*$o1h{=Gqvq5(1*hqHZrr*{)`=s^;kCNkR4DZzrt8OD*~V|npd%>1RN`f}Ooxo9JE zKJvUIWwzq--*ed8$IUt>Lj^sWtYyw0I^#|pGx3w}Q2n9Kk3Bz+6!n2meIYS36AgK& za)Ht6^5&}w4lcDrC*v8@V{d54;C}Jyq>MP~9?l&zVk>KszU;Q)s`~nHOzpYdsl-C% z(6E14tul{F!&UQq_21zODmoels)if{QB7i#wYDi0jspR#j~^cN#KY8Xb#fzh!$4IP z)`4(+!NR7*?4+hA zsyuy)$ywdfas*yhNPcv}2nYxW^bAA>MJngUhObpcBB91D0s=)lHXmZFWcl;56E(?_ z^78AQ`b8k0OnmX6l_2Lq_bfsPga^Nq5rmpI$CEEXB1&_tobZv@yCT5ulhm9#CRW%q zulD!css@f!y%Z}+9tWHoqDHi*TjC`eG1_cET|7V6`@MX+JD;AJ%y<{8rKJU`977Brg{WB4t2$^#AB&~O(q{J>$>P+YD*%F?_{TW}D1~X>iY9f9*>sVdw zEbK0Gc5!h8>uIQe_rHE!Sy+w?!4fAnG zq#nu?Mg5HLDahxgdR5(e^uJpS4F_W)Cq=Onmx2S_EE9Xp0!P}1y}Tk}83Qw^C9>kN zc-5@tjv{O+LRT9`X=b9&+JCa{(8BlXec5)KarPI5G4aXRAxRk~5g^*K{xQlxz2WTq zSVFbPjqhr{x3^e2Tv@FcIk7hsZjSs4GkjzS)3||Sv9UyQDJdx(=Lj=ji(gqyGs~50 z{^KNpb^1Yjykv-!E^W*%oYC-ESL!$VLL6!GOr?mTQn@!H>jMD{ZtWL~Bcq~Q{Tnv% zdLsxjG4F}QreXF~kxr+j;6_NqLKF#IBB)5{1k-H3?QE_>pTAM}u+A=6VyZJdZe!*+ z-aa@$*02WQjj?`C7^Bs{L}FM$$I^%e~7Y zb%_`@kiP=x%aHti1eN?US2NJKzN{^ki=}D=z&jPStmh$BVcX#ZRK9<6fD8V< zxjssiIfUUqzkkE}RY5M#3HoP{qVX}nTy|Pb^HVQ&* zJQYoAUOaj7#L&>;>C)qY7;y@v$v-5^`X`R4OJ*2JspSy#w? zF%8GNxw(Pi$q7pTbu@611sb&VaMIm(e%69-rn2QiS5x^UW_vP@R=m~4(oB7fgCiW= zA&_~z4*TuLm<5uKDi1XP9sX9n@(_K+>F7gyssUWAXy2MDey0})s zxg*5HNrHlDU0n~VUa_)=L15e;>Cz;1)wsGiPV{2AAF@Yw*C`hd+-Su6tgIx5T*>Wz z_Mv@jL_ZeL2Y(nqb} zE2!d5N!~3{T$=+q@|8o_e|Pdd!VDGTzyN)Y$&#+OgE8(>k1c|qG83VK6d2+AcI&zO z%@scY;`!)Bey^r5!P^9j=!FbUV{tB;4ik&olBoC|!s3pLnv39{k+rYr@&(!1g4NYAfr2@G=THf*TX{!kt z)UKuUM$Q2Pi!H@aTm#vyTZwE&KU{X*=%Y_e!@Tl8IV2M^T14kGo*4Su+5OpVXyEB% zWCoP&<##9`jWc!j=(kI&PHX*}FukAt5T>f+rJ_UD^u3S^`g@QYeLFDq%|tNN*_o-w zwxfk*-_q8a1yj-|9kyDy+Ljte6c#cW*d~;etEw8hgMH-eOw>uH>1$K}{5-C^!+l(f zqm2=8QJc28=;LMR2ZtU_5ww{PWzIur3P4|G^%j~Og2iBR zbW3RmAEA*00uwC(*BNYU;9PdF?#Vf_LdzhBsni|m*d`{S7KOaNfgi6^2>Q2+W}y*7 z&s!X#Ez(+J%j3?AW+O4jft`Uq%r9XVh)|xdR$N+|K3?}Q8Seex=D4XqjQ)Qgn|Q=X zP1mpiql+v_XIa@FaJNZliaj^VMMTt8VbSQ*O_JzwT&#e1_jbR#e|om=rU719u-$@V z${n)pp#+-!EXOZ49Ax-J<{fa*Me4E+V5F(3)DZMj0HL{W{_L8aMSl=UwlNpjO{SD@ zi~Q!wIO-StQjZM0d7^U2&C1^S3!BdHYD4Xz-|}#@rkDFyh8+2H}9M5 zyP4GJ#fof1t81&@y1Hltoah7v$+d^0K4JbHSei<>!B1a$$tvK|ZZ($J71mXCF2D4* zLB!vn^T|h%Cx#Z9YtHwrEt#C%-FL@|v73LxEycJV($Qf{%&7qNrnFVX^_g5yJS_(JpR{W({naecMa#mlt@^(6!^be0kUJSjSyp$P?9Rk)QSU(gi+Ap;tP$f7fgua z;5V@7oob1mD99+`84rDndj3>}ODpw#H}2#{tlg zd%}tnHE0vV9;TR$T|8F(i9iSE8BMQ=0B}oS^)cOTb?9u(!=#cF##pMoY#C;b((=$b zokAgLnCF?U%xfj3)DLtKP2K>=v>pC9Njb%q4ElwZkP!Mu;#?vk#xJF0Wzp;jkNCtN z@i`R0;>7D22!gZH#JqY;QsWPndhoIGl0K_KqI#FQp))@dR?{w<$9jH^lQd!7zX!1-zlC`tIM$@qGM_)G!u za2MlDeHFhY=RmA?t(UTBB)V92;x(#M-m6|l7CNPb<6?YQIVpAe_f|C?1P>ywLMkMY z4HjcQVG1ckMMmWXOf}eQt%O9o!q|bX#}e)omMeR-`)lcr`2_`;;wr+bXKCFYxVR5p^tr;-dANgXgDNCuvu z?L)8W2s^jn4es;8s;!hDpm=?MwB zY7gh<=DJMqhhxn%U-wcFrzwU)9J$mG4=Xptx@fxM8kZZ1MmA+V%lV~2i0d;Vtj(Q= z>DezNgXlRpNY?m@9~Mi+w=cHgUPQK^qz0|?@bJ{YOaJ_}(*95pNKjz9H83W{?)tgXtGUSwI-Sa!`_HM zW|VDOR#c*>23?yQpiMILm^e0VZa-V0c(EsC|QKk{?|vahcg?eGT< z0>$Hx`$tE*)h4S~=h#+J_r|;Sq4Oe=d3GDvwLiDl_L5rIolQgUyN@9%EDw53Z6Lif*E-sqIW7!+pKIg=J4hxiL*(h52sDIGFn)9oYZh=8aaI z1PRc6Ja>sAgU`+ezIc2u_^86Jx+3NV)8!+@Srj=GR8c>^4)Mb+iNztfZh)}_Mr3B@ z=9XrVpjnuboP6~F7YPI;e?%ZX&m!pz7Y}>87{$sL8&vJ zXJybsBD(dX>Ubu-E0&Fe4?LRC9%5&Y^q9MR(ElJqplaw~Xs7t+ChKGoq&O8-zhdZ* z?$lz&lHs4I&!XHmht`0{1ym~7^`$UIO(Y;r15dY-L-oF`-br3k0BvMZK(gN zo+aisL3EVk2Bx2iS_vp>b#pX7YxifjXYaLM`k#CdR3EK15H3_q`+GcD3V7DUDKL6VDwf?kUzXHO$-hLeanNPn=YNxHE6QQ4^+4e?S%RV02elz!Pi1+0e9f{&LtzeC+`mIVj)z1_vQIiJ61L---ffE+AD1kCG(PKKQ>LI1|&i z05eBbu)bS$@M3&}c*9|y5jicZ(#WL&Iy9!Cqd>E~vT!EevJ zNZ}MSU{P-^t%Cz?AT2q0wb$XI@#C5S=_*000j|VvV?`$)dQYPBGWBAroTV2#n`}r6 zF4U-wACk-74~bnC)10K^U8Z|#NopxqTmu_+79ksW+(3Z`N@!O5;G3Hs#wp~yLuoPL zX}bVj9HF;a85tSr&yrqiG6UZ5wNj+zC|`#dTsGuHb*lb11;@_SiLj#y<*WB~csH(h zd;6~IEdyNj0`DLpAwg0tfX+UHF!>$}iw(Ske%tI}J?>$;ud1}!Xlc(Omd#>NhNSaN zTZhRM7xHAj(Y~iTC#87;kK{UuVrWst=i(gqj9&WV+#5t|#O3G`I$3Z=mgoLoPtJ>M%`G&`?uD;>4}Q&i_P$RtQ}j zd~o{uPGkR@sBkkTZmMohN2lp?XyuKYiGV<8y4H5my)!HZJbHjm5vGHwEli$B*t9vF zf6D|(Af#eD*>OT41x+>RWC!!u!{9nDzVm!Ppr1s#G}k9{d&~y+5AI-jU7cnne|t{< z_b1k5%xkj@jL*2Xg8OAeFDE2jsAc(COv5WyA9>*Z9MG3Qm+#m?SF>^chry)sZPG7tf_YelMSOJ zry$jX@otq~QjD1z+tYz2H&E8=%E*}6+4aK?3%dT3kUL_Y=jLXQ&B&hSY0A0D9v#OA z07vq}v^eAzc^Mzo`b>&cRv^WquG?g4<&&|wHaCln zCD0D!d+vgb3qEB717!7>Eze;IhoqkEOOwg_b-na$U&qQ`=U}Gc-bzho_kJv-dMi>K ztq>R_d>07UjxVKP#dtqGdm&lrZo%Uo#y6RyWo??b7Kac1Q&0p%Y$XP!pWs%%5loB* zjp|7^B1e0qjRFf}2Y>+$>vv~i7y=5H@87;bzw~Z*UMt{eDl2ozeV5xdvFaTLm1uJ_ zJqybgn99MdfsIYMySb^OSBk>HPj|GCgEwhTxLRg_eVV8( z#wI*0%*G?CmHzi?S(^&)1yV;nK|w?FyFPxe^LgEFw#ghavLChZE4NAq4Fd- z2jy9s^5)s+3dvONF*m|@LL{UqGEa6QqoWm{J9ZK36BL{P z^^z4tLJ@PE=Ci(EST9w+EMj;|hM}JGb5ZaiA5IGn4z8+lhRi|#`y>7&M|!_JvB}AW zt14%CVo~?8coQ9>7v@kx1|IP#&ug%?j3$_&;(yV_X9&b6Sc8}5Qe-Vs*E2~jsZ2db zEI2Y0Y$!AICnuaa4gRcdZf*_^mNr`f@Qh9%8N(#|VA67su4+7Cz<7uR%J~DZ9s>cU zD>$H4%uKrs$HTgOr~N9SA{s50I7f7Dkkp7-;c@ytEpTG%e&>IJzDq1ABRd-~6R;%d z?MzG*cE0mT&TT7hBdY()<$47n1j{$vR>P9HrPT@jI8-_+Z43OMIW!CVx5 zg&D!-V%AXSP$%jU(MQ;jLq%hyutcBe+g^(dKh3tKl|3XvzOLT9RWc zDxm|5A^m|M*<&UyF1x~7|{w?_{ctl z3(a>#6Ov+AziSO!L=Ni?=2S@Px9Z+FxP5tkOlgUV+Uw7|d3(R43T}8SaLSN4VrsS_ z#EDP6gy}m^ESm6ZR!oHgfn67L$Bn)(Yp*gQBu^NjpVH-n=EceTP*hE54FVLitUed0M;*D+K+)bVaIPj<0fF;4(cjPgKo;aUBgK zBO1w7cQG;M5D#s)WNbX38bBujtfBsq9#Acxa}Q`6FAXWUUXi52H7EN+GDz6TL1%)u zN#@hQ=X`7>DcRF6P^b2XZxX zGBe%PbPNnS=C&7Sr`(O7V@CJ^f#){fFCO2GYb2=S2^=rhj8<0U%Rj$g+2+`8;-mHr)bOw)|{T@rtS^-rqp3-8a)PC`S<(rIYq%*zjHuq`4lX;pr6?qrBoNd`Vad;$g-c4V+7Ht0B3gbQjkHhX=hH%G~{`Rcb zxglX;!x9-$W+a*S$rUZHc5**?!pwc-A}abwk{%cx{ouTu6nHH{tZ0oCKOyv`p1HY4 zXXh(z*OVVhd1;pVo~RD)N4_r}!XOi(jYeigyykG)M?ST38Q70WfBscnMM3j*_bv}Lb>nZI4;JZ@ z%y%@wU^C$%9SWZCN6C<@+A2A9I0+eem?_Ipf3rlrHY%9Z_bJ5O5tp5>TwbP8%xM`I zAbeom+Z1Smd9oOo1am>iwk#+p**VxD+&nVh=81ip)K#mL%kU?E-e=}F$Q?DRA?mt8 z0{q!nB5{R`bf>FM4uU6%ps^~q-N0NlF))Y^4t55lv#kvcqlFR~@Tw?O=2`;H=xke? z@3(KdT4ZE0STY2o=Al8!lxL~H;`dUH35~S>Mw&3?^r5(m8N(`tpOA~3Fq|mm{lcG1 zswLIKU&ci|K%9u!kC05Af9fPrE24XP7)~V<=UcaS*!K}u%U@P~D-X%lQy}PG*^a7@ zWHqNn$vOA^mdtXB53`fY@UBDX^?QU;4LRJFm*B=@O2dTVwRz99}fB>5o= zRb?3SI&~5$pZk4g6@)!QU7h6g+AB;9jM?|xn=*Nv$RgEG;=r?p*(~3bUS`~GUsiaY zR*jO}Gi%wv<`|G2^?^9V>z8z56R-91!`0gQdT`#4qzT;ydZ{_B2u0u;2W=Qj?X1h zFxO2@&8=m-WWhSoMcu^rWyb#2o<#^xcWBPLST}VB0Q$UUe*1Z#-HiqA)_;(<)Z^mf z&W`siEiL82BG;UwU*uzV7@hm$Nh5zDNIw4E>T_kWahb^E5kF@o|953X2qKCnwtuXi z*5sEbkTFhS&_Xe*t$4U|F}WpYr(jFMW6tOOjGA>~U4MZXQU+Vo87ychx>s zRZ+2+Z!;9q{I0ycKVp`nanfFDF{A0E6Vodj6&4j08F|xKpisnWtnwq<*3lI&5d{?$ z;Btim5mo8+Kwa?k(vv#rM1ZF3Y`7@IJa{AqGoIN^C7`aDp!i~ZwP$hty#tazNIq>7ZXtSxQP+)0_V5iuvw zfK4C#BIC7Dpa{Hn9aX*y$-}9d1iwa-nmVnsvvWYxajgZKnf{DLeYZx@d4<) zo<4Q4x97gz85d{7lYDkiikfq(Z&cnXIW$i?R)hfOGR<+#4_(5jSOhnYKygiQ|NaiR z7$KNXj*e~~I=vt}E|8ZLVrZKls-ttr0@F0$Un>1Z6u5jMJq|FX`Z; zZF4`sN=~OfFiFhb-XSA{WU;1)9qHwt8n#%bgZ8Y3JgOuS*&VS6Oiq1t+$0?>9EtE1p1s?#5+{+c+AAERp0u0cZiVt7*FkYm{fd|D2Xayl~i$jcc@i0p% zOLS~+atr(i9ru6+90R-KY^X?0#q$e%03nbO!*Ui*cS%5(ic_e7`~9BZcMw{Ru>kDe3w-q$Mt^27xdw;y^PLV46qKA?_pf-5ND<41Y(!MJU!$08&kxho z-2y~9HgON-lDhN_44^}E)vCd#eJu@{BR#2pfU9ENG9tT=d)9pz{`C!xxf1%|asDl0 zg&wnr*LQtQIDjr!b+$hetYxnUXGp|i1dy76gvrgt)yc17ay?)wtj-18vX=UpXc)qi zfbJ!i0UR8ZzT9H3KbN$Q&cv%c@BUsmHDSV5xEt7m1eK~^y3RZ9E?O*gr+}0I4uv}#fk;wZ}D&A?3m z=;vUm;QG|<<8yRUa1K^J%s2g{siQ*~@3_vbt_hPA@QFeE1c81WEusrF-2nFiYId1 zTEX%4(AQymTef%`HR4Tad3p80p9+8|M#k_!S7;sB^lq>1moKWx;a2Q_{Vn;*!A!B%+h`ijB5d)<*I9wtU38$D6|D zFcsMGFhKAP5`Q2Ir<4N-zjHKWE-IV&}=}3-#)*Zio z@!$@mZ{`Vm_|u<`y>*z@a4TLM(!~^F?@m2WYUS(ss2{|Z$vzyYqw~JZsW~XXVRsc~ zcCGlgt}Bv4xKa@XLb7wpDXA-6E^80f&Btel_u{}6#H@EYOq9Wb!NsLoHATPRoyyA_ z<&@w84_9u9sD+jK5tOd~Id_zQkRZBpcp3t}b@4XA*Mg3nFmc7@GCHWN#FI0UlMA&j z&M#E})lS@W$A>d1keqn9TF~L`?Xz6omaj};dBeEG(_eANo)2>jor#*$7UmEEWW1OL zeJK)zZnE*=;b@YhassH?FoRod@CgSWrK^NP|MfNWHi@+&KW+7vqN?5U;8ee*Qu5I& z)d2S$I-Jl`+jbZBCxS2xQ>{Kl4}1aSqj(rTTY#bx(o=?G?@pWNJVarWc*?3WuXX0(gG zzxf@8>c*lGg9YG{E`dA1tJs44vY}bXRn@gQUxW5$G50+m^}*;`)SA#e7$vNXPbqk zz|Lv>^k@g3$KB>1dWd#Bv4hnjr=#~@C<273#nO_K!BOmDtv_eP8=v;<)ad}|iBolt zguor>b9sXNmj0)fGE{e9GQ4}+-+e)K(*b}{@WSbCz$F^TUl*h8(I@q#Y$_FaC8 z)ut{=(Css7o(d`_%BM*Kafg^o`@z#R_Gn2A;=Q;jnf#kfThmw<0{~mvTP{4LroN7f z%A7uFEAL)ywWO=4I2ZCHkB66c2K#Tr9fHEPPUZu>R1nu)nKa{0io-E;Dys5O3VcOs z@lQ-3uRJ|o$%6y!K47R#3AF;%)p7fAM4{!C-_(=3m=-GozytWlkM|jF^)PWhK5%tu zkID-UmWS5%HY(*egQ#XQs!yHEyCwuHb2o7-`S>BtlyXZ`_mw$QaI?vuPT0;@23&cK z`%M5&;JbF&!o*Qbk$}pSE@WrZsvMOV)0gy){=>8%K}%s{KdXd(%4HNLBy3jfO-M&? z9lM^N*horRfuDj1#n$%r=lEWmht2vpdUJY^z2xsN{hZ4K6@&IRFYiLO(ZVKC^IW7KQHgeeopl3JarpuYsdAn1z<4X@GnQO)T>(lOF@{P_bCOMr%Vez)DbIN5Z4()?t?`5;!A&Qz+^H1mY>kz0+c(6hSg z0|JK8B38NewY3MKL>TT=v^~XjIfw&5D;p^P?rwj1Nj=xQ=;`br_l#g+@WzSk*SigI zQdXL`tmQt7n{_frVvvz(m5sj6$Zl?HyCx!FyS@sNt9kHOB*7bn&k0iouwfvT(e5PH zk`5)2sT5Ub@{(5Y8E}s94x=OzIy%KF|@p0{EGeBy&JMr9$xF&&q9lPmaL45 zRMUEfM|kb*?7SOrBHMsVkKMG_^qq30-+8B*x)qF|tPcLrqdwg}QV(LIQ8XenSb$*z zG*|Kbj;5UnUx_(QUzx?y5gg^K-NLv%a1-Npz{TYjGKihnvm)OkH)K-WCrt|pCliH+ zlrb2je*Xeb;;ioZLeb&m0I=}=foSq27bYs)r$^_V?zfv;6|^G=bRpFj<{VXgRmpOO zE-vREuL{y@6k9cT;};dZRIZz`@R5)RDSC-mVK?rFN9%I0g8DF@-ly3K$%FQk?6p+d z7s)6#L*Ngsuam;!PM@*eY1g>`;i3lE=#mEi*QLB7cek_%8xntL9aovw#y;rTztYVP z48s1o_iVQba0}_oKGkY}cm%~xPY4PXiR+2E3Gh;1n$3W$FMsUw zO`W~=GHhCSD& ze$3_lGzaVG-6hu0(9m&BO`Pv{7lYV{qzKqY;})>+M~IUmlDZv;oHiEI_tB31eVkUM_Od6m@z zX6NxPJe$kLdDK+nw2X`eQLPqpEun2~l6>m_f-cT>biXTu{YASz`j%uX#h;L%IA#z21cn`R#2Ez#WEKY_fI2Gz`z+)tY8 zdkXRs@-5T;IPU-QaK{|^PU+N}E(;qSqLyyHenP@fjhv}a>A{`TQoYu0y?A61PmyY0 zOwH6aIA1o+8~#;FcC-!+r98=xN@sBP_wNRE4`Y}sv+a6JX(<=3+tS7cV{mi&OB1W1 zBI;pwQ*g*hJYW_<7J0$DF;;{S{bP*A)F z4-KflAoTU<>>%rL`0><}u4_HoOh${lE027_v$Za&x?UI+Ma^SqC@6S((Eh9Eb=6ej z9Y@(`j-(S321_{53#CX1UQzb-9u^Hsu5tZPRRuirN8*$-H?3~7WaHh+n7A&!!&-#@ zG^&mCS&PbxJCGh&KUM6XC{Bf&ii@&o+4T)}9Mu~YdN`7ys(YZjRmwfYSyu)mYJcP6 zrcJ9(!8<0lZT4+@zC$$DU>`8$oCtrVsrg4&0I_5M5qIO|E&IoeE<6k7w$P9l zA5-HQ!r8sK`9iw7=56ydxX7;$6?nAkU%ys}?e$QM(o478*MaJMLBnk?Wx12FiN-T? zEAXLP@=-X2p$``~*`UgU^vuk*mKGX%dSP+8Vl$%bq@E>pb@kcz@t&KTfMWxj!1D{F zfK4CmO!(di0IxupCSQ8evEKM(+)n73i&CocbD=;v8=$vJ7QOAAv*R_diJmGoPOe8G z^gW9?k>Zn6-v5avu6T9&F!~2K$GrPW5#9;|$i3ZNhs_6PGXde?^~xzAF#eXs!QLK4 z>}o<#a+e6l&JOcA%7At-?gLME`FuL+Puq#yB)Q6T896ys7Bddd>Mm7ZAYFurP)I+< zy;kd_j8oum>eUScbf8g#ddc$Q{OnmGd`P3-MOmOySufr>1v^MEG?vI4u;jLiTqw6p zxjN2A8sDmi11JDBq6qCaQ9f)t09Qbm;bPSRL3c`qwIr1bCl~*;IUZ+b2lI8e809?gxZv z*do|?ct+T-2#UJbt4dQ*Prcg7-ozwZerhhCm(8f?lvGV!ZaZE^@NCE+-fKc8j%AMUV4T-scM-y{ ze{{2W)Vq`&=!k|_?IREan7{cxtoYYz+nsJrv`6k(Vw>}iiTy$5C=pM|s@U&lq(Q={ zmO!OZpT{>yfSGvw zz^|9=EjT=11(u4*AeV9f7$EIHjv^$x$xy**8Qz0)@7@#XF^?=IhV#8V%n-6WSPggH zDVLiJIUlq`6ywg}%^6$Q?`lhHIbARIDlG?cN7BZ^qJs-u&I~{WbF!EeaK3Ov_}lOP zLXJXze?KW;nj#f)8Oz1>2|k202=#&xpk7SVAqI%KKf%BSurFewWi>T5$CH?~wVZ(! zYo0OSBEy^**k2+dR8$zgEO&pI4UY`Ze(xsJ?VEg5vbnRvO5_LLtfU+!NT7atq|}?1 zK#(Oia1~E2bakgC7^`+qCeB7CYuy@lY%A2a+um%6YeW7CaLNEe=eA2wkGW$JvmP8& z@wRYr6=uD_nl>5#F~s=ORa-77;3Ys;_#`BS`g=rM%x{{$;#owIIV{#roX&HGKBq|= zW4_GzD0Qtpv)J02z7c!BA4>}?2Y19iez=qdu`_9W5CM2*}% zFwTjJBErU&)tcypjbDPrI|3aOv)`x)w&fPaCdLt2Di!9Gm)@>q|c{Zp*Pz zwt|P5XPVSSh*n}}S6%J$Ep%t61Oo)Yw5%0L1wBRuUh8?8JXJ=0G+UaSuIE>_BIab@ z9?5?`?XAT3CPu@GV>OVjXpmD@MjD!7VcaU;44nKiYvzSZAw3N4=0wp%pwuHu#;ROO zjej)8goGL&YUKUjD|u_fRVQK1C8r%ejORvMd64W*f@$EW<~Y~Y!l~(ccC-+FpG!Hn z3wd^SRzarag!=Uv8Nysj&f?aGl^7^20bNa(%|OEp0q=x$P(biMN~-+D#KBQqRdojL zPp+pkK>>nC$l*2HS^Wi(#$RllCCbAi$=}t?8XESF&T@z<57TOfVuhpX6S-W;pQViy zIFBBA-Cvj&(_+b8Df?5**K$7UD#)qVk|V>nmFDe+225p8x6jqBFMS?dv)MX&inr-O zE6As0ZvxXI&M`Kl{-Q-8^&#QU1 zd&6BdAYnD9L^_tsBB*JRK)hf~KRDOHuI%aPhEbn(xP#JThN@m4C-P9s=n=0A8?WPy zrLxvCvx98x7&Z%CqvdoxiSYA{i)vL^rymBDx89~?jPv`7`Iue5cFl8~U(SB^!1eG9 z9>ettGnbaHcqwv$ae;B1OZpZIQht6~t7Gu%qjJ>HSBSyGP{Yc~*9m*Cwck>%JK?FD z=_LD2#5J}LWGJ%M!0doe0hYI*r0VONk7H3aHGPUV3)}p~&eDZ)h3Oj9XjD=WgRVb6 z%+JreA3LPgZ?!YDPSj`CO5}My4&c#>criV6uEKyUA!&XcAwyUF&X%hRfBfmkrxIbO zTm2a&XCoV=j5KtYk8j%bEjC9YZvyPqwKXtY8td&XG#TnHFL$s2O_A17BA9A!fE`YV zSS&FSz#I+jv(LMG*o-ZHr%K0Wb|LN9ul!{9;qF9~<8a%#cqIY?U!9Yab3nYZcZ`V5 zUEW>F5f$aNUBlap0+%7!zv!6@3u#9e^od~!T$S?r2q<*Rw z**pDw+ceUIEz)LfH1XBrJqL{qTJ%1gc7Qa1&h{sUzrcP+-=Z)g;;!Gq_E^<`rP%Mq zllAEEn3y(WEJUt_SxsG_k$(V_IM^xqj%IO<`<+Jejf(M$P-{gE~t|739EfLDdx&QO!~&qmhNQBo_thO%fiPHFGKdU^S=rG-;s zsUx{YU#DKt2)ls56Jhu4WAi>WaQN+&mw}#t&{9;)b*VEvx{Ew6;cyZg2Zv(9nyd$` ztJoPg2rQQEs!)CgT%qhl9B<01%~7f{@$yo0ah0Z~4(op34e4SCmv~zU#rYJHBU++3 z6vo^gQ-zJx55+`8JYDc(*ES`I&e2}qwuyd~1Hvr!NMBeF05nIw`3-*H!>cy2(grNi z;Ast{4}F$MzJlPQ?W)%3361STMrowXJ6?W5YK14E!0s=#Uha*GiUQ`nx6BQPSm_kG zz4t@U7(4D%mnLbN&Rja44CaFcv}6R6?D*DIgpknHL&GYq$DxpE1rMHsv$lrDI~mKQ zISzd1%c}lczdAjO!$@`2iAX%mqCK9AcxL0>Ugit$(wwk?6K{YA@B7L^7W+NFqc7K? zi|-~uX7y36UCkjJt9;XFvt!maP zpMQyLsbi8IcXxC!3Z<=7B|3J)T)DTm7or3f09+)97q>HnyNe#ajcRT!;^j}wxsK&} zcmRv$;61ZBcao^3hldC8w{OtMANRVR?gav4>-_LdNh>}f8R6Z#$dVBa27>{owUNwP zQ~R~ZhN=uu64^cimjEmGUq8%Yf;ipzXmo0ad5lt)O>v zoR0*;PIY4=EAEW<)#h#vyYX?QEJZe3{*eZt+9oq zODG^ODW1}#EKY~!sEH_(jiN^&^nXu)a9Z&tz@}s2;o%uZvR%>`Bf1#UUZz0h(`^Kj zzdqo^%*~yMur~hM-56k$v`VXY(Mg&^r$sr@?9hypus6dHEiZ0tmL|fB5h%Ts@Hd*Flor&B`KD6Bm!~yd}JDbMtOTjA39G zjSK_U;)E98d|#GeMqVCZEd?WMnsLsHvl$&#;f3{6NMqxyj0|inZJ>O^P8TEn{KboO zuJ}q2seeG->{*zhq-Snx4h*~N&9(0Al^75Jkc%OkoES(i!otbSd1ALLwx*_Z;vTtU z1_q6fd(-9;t+IR(E-Zz;&4h&j4-ZqEl;X5TBz}y7^JB zHO$?^gHg2**%AT`52Hqs0U}vlp47+^RZg>^)1Ozd_|A5F_V$XP7rC(PppWIY zR5CJx(+=FydTzTfVj8C%nm`WH(EPmqR>3s4H{Jen{VIex15ug$&j=)A*>R&>RxS?Y zs;n@e=jD~i!^+OftC&{AutwpL?S@2;DE=Txytmy1I42HuTvPFqbRGM(>Gf623WI3gy!lkBiZKDFLr=A|Q5p(6zzfW(j`ZQCJ2*rstyDO)M`>Lg z$6uWOikFGyD>I+E3KqiSFafTAR$s|i;p4;_^!!x3}B0&$l{JF`t)3Bk#I#gumE^JA`?BhwaWc_1m{PVz4%5Vabl|{-SWj3Z+kf zhp@u7sJJK$Poh9XM6vOA!#?^3wf{{1h$xz^YL1kY)H%vI0NeM$!p3W+Q9z}t9PF1# zmWK@Du)mzaQQ-^`#S3jm_DG~>%!z5oxKp@2Q8!^qo{zVUcL+gO-m7%}H{H{dw&V5? z7w%vuQfl{Wn$L5CCbXqhdihRKyCf3vAOS^vVuO9c$V*2`s(pVA%+Jw&l}wB5xr_IW z=q#C+$9hXJYEj5cF-6Z|FV@~OT)H0{OHpcljsm)>I}%V`3O{q}h~bCuib^nJwD<}} zLJ&r4mLfO2`N!0(xY~ zQe)__BrZ`Ok;d9W^D}rMz{z`LLr6CZ)s?0!J{Itj$Y47*)F1Wjlg-;+SF^RYZ@1+ z8kRI^Xc*OxL7jpXD-?ahn#y<6$ZsFOfgV~ADXG1MhWKz(T5F#BUN>*T9z*e&cbGQ@ z(?H(x4N`d!dUPQHk8h1N+WQ3mfb@fFX43LEad_8-SY-5ZwEZRTeQy^|25nLD5NeWaCA10@0G~fu! zMt0-WziV*ZUzep(wCGOuXY#1mDNvcS+4B{Wkmo8kr7z$5U2AB#RQyM}qJEw1jy8t` z?;JQ)laY~y8$=sa3A_riZ@*{ARt^B$l-2KFy8*WX%u7j>qWh+-3X6;K)Q_INc+mv3 zF{{?u=Iz;FP$Ph1ZW=_|g70TNODFR4Uv(X9r&KzYK0GY*3G&%!QM2zI;H)f|&Vflo z&GB;9eS+4c00D;uUtWoqFGW^-N^1^pfIN&k0cA2OWf~80_|)?l9BRa+q`;i|qTCvI z*~X4W$cixrndD++Iyl{&*2^x2OD%*o$LXgHC@GVoqN7DWyhOi}GAuBWusv6%VJbTg z#uRZ|S_chic=)9Eap^IUEKzZe>ovfIVg<-6W|c(P%C~;X#H@fTR=Q%0+*Ap|JafUH!#YIFg{iPB&&dtwzdRR;ujbnPWTANlS?aDqSwKg>| zauPo6rEL{;@^E+ev;r>KK1{|+%oxEA{Xqx{lnx)NxA*q$gY8VZEGI~!-i=pgr1^$f zDrfb1E8v%1de9SU+6g>)Vt9IZ6YRbq5hf>RZG8Mz2cp2LPbh69qwjcm*CDheEwklu zb%KHsBk6P~R=TV)MG~ZZWeu6QfcU+{q&c3=a5|*9#NFdyNA`s4zD-v9xXMK5Xz%RC zMtD?|02QkQU)}cEN$X1q5CdpA?)3q|O>gq&XJ6kg`LuB=2cCxyMN+o+w~zH*Y>XvZ zVQ?IF_D)4_PS&kqa;JPm>U)8 zkCs{t4GjU;;QIA1FmL78D?C)3nKI|9K0jUw*K}YObd><_1RERw+B*O_uh~?zG*Z*F zbPf-fyI!0FBQYeLtaHf<&hRkly+Zt#~N8YT;MB=$664?4Rh8NvNe^3ZI2E?mF3U-Gt`$_wV2Hv-9K3&JIvwA(2QQ z>R8ZyI)KAvQMOB*(2YnadF-_$R}yH>CF$N-J0LXg9L{nkbY!u*|_ zr)#Y_0YaVEgd@6X@!Pi?e!bo6FH^dgtor-v0dP7KN87FLP`v)ZgXgwA0fQ z_%tk8EnPWv`;@G)2EY|m04j3ZN5^~diV7q+TH-H>xS*cHY32x=hlx-p=S}3)+*(>SHioy*y(k zm#wU<>{4~Ib8`4cTH9yu `ZiTZk*;FFIG8RGBJVad8i+lpZYj^G1wFR~l{44&vsWm`z zn?};p)Aw~NIiwgX<&78E2DGjLJ&Rz7zN3EK<ZbKzQ~P;~s@{JJ34T7p-z zwc4apGGx-H-?Jo74Fl){d_atdiKFkt-z6j?#_bVglN^p6HZ9_bH7!!5bZJq0LjQ=* zaX-8CY*|KNsLV0Eu9cSSu`(YQ_G$QiyD+IJE7m;>!~ly}0?H|u=V$s$r3X#<^yuO^ za25W6cR*NE%DpjP3urqomTdT5d5MioGjx! z9WCCRzyG^6Z%Amtw-yFAgO}0gZ{POfV*xk4wevWR!1u1Dht0KSP?YD zgxgB!>+1^vJ2vs}rCp#w7ow^vh!Sawc)2W+>b(uO< z@YXM{JW)xY{go#s*6Mygomq;3PY%I~frqCJm$f89P{pQV49NyUBsr!?N&SK&qvxsc zfQB<%jfy~JF`17CtyS%vn)ywuLmp=lf3*zzy{NG=?L@C_*@(Hd6f!M_c_zV8~ z-@MD^d;gDr{@>peLG$HVt;*%Q9D8E_FMr{`{fo=b_;-gy{QbE9^W|m5g+P?v`v2eb z|Lc1Sn>>7*8y+tcU%?RzF9me3UEb@zfB(;I{~s^^uDJh~t7Gyc5h4&`uESd<1l;}j z-xl4!t%1KUFCUoy-5U63k^I}m9J-|A-MVf7*N<4Fgq;`u{JTv4?MMFY<^R+5{_}zU z`^8M6rTw3}^uO2jfh^|#)Ls9#$8)k#B<0m(F7(U$O2&NU^5Iqga)GOjXs;>grd;R= Rg1T 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 Tl|mmu0DlsqG9o2HIzRpwb=}sH literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/ios/screen-iphone-portrait-2x.png b/uhr-app/www/res/screen/ios/screen-iphone-portrait-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e47dd390d18e52416d22777cab5f1c39cbc2ef GIT binary patch literal 70677 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

J6Zbl8r#N&pB>5%u&^JNRFqj2|2A7m zYDGyclDR-@xYy|>KW2>(;?o)^{cUH-U&6v-1K`os)gKps|9L^eA;{7JrdmCD-C+bm zfA33(KlE_%poacz_{0H_x@+>P^-jKTB;!3stXh@nF%nocQU#6IkjJ}q^|$8Z$D+qr zMs!vDWPf0op%HQ=dN4?TM*_^D`HixdyUY6cP<*`rwe{lS;>9XQtd2w|ABAzRe1{q| zd|O*tg-=yDJui^#D=^2x!txLnT{en3ZgYrjEB`K%mn@MJbXZaP5^0V+rXVd%uUsp5 z)7Cmkc+EwjwC^K9W}__Dqa6>4prLwS?%lr=z`Yy1PfxuZvqUMqphPt#g%FT!Ex6& z)7@Yfe)Hy^)=LLo9u1s;M3TV9lW-uxcS~h}D)0hW&%+HF+wt!i#3Xlb@6I>Su87|3 z$r9x-{#v35GUtZ&PYw;c)@~81~ixbzcbDOuhwY3|#>jIT5pQ91U*X0Y{KZkl|$*W#kZAfI*n8`92 zFt4uLc%EiYYdw%_=Sbt>`WJrqW#MPrQ{U~kKK$975}YG-K;~#`YO=qoKUGs7`=(in z=oc7;{MI=73+nCLz!J9crI)W#%QUqkCMljQV(!Qc+ty-sH)@glvnMJ%pvT6;gG9N_ zy8`yJ-Iy)wsL06T_(^k1ORWfL8XCvfubU2}OzeLZyO{NLwFBK2)`(xZdUVQTI$b`x zQ$+L)nh6>l|5j9&unGu}7I~N6*M~b#Ru*kV6s$YZRqcIVO{6%F4{tRE;~_+oL2S3n^r)_9cyL0eu1+ThxGg7im_gL#@!|sxHp}}lWiqDk zr{{9VVI)felZvpPFh4gpK{oI?2LI0VvaL(CDuM)MOJ#DV^*&8$9GrSjCKeY*l&Aq3 zC*u)HZEtIlbM91JQD)gq8Q-i1)jywDM|Mu}7eM+7VH?#t_W9~fHshOw%%*U}yTCiw z=Jdq{M%nD_4%?ux;(+a+sSKw_4rCmi6>x z3LW#Q4}N7ng|^N8s6y6m&G0!^Za2|_=3^7h{x$E*aa=6|LlGmqNBC@%|pSbm>7z^ z4hJb_DD1D^xp+0R#~x!Z<;hCaEnP;|L1Wl&*`DfQ9TnB#vXz6}K=2Zxpj>b44b08I zj^uRLxVcW1=_Y*mP`zC$g3jF$;hEd@hpI`e z+R_3aMn3(zDd*_o&##m`EM&iHF*|fz_MVsHHJHy^hnVfvObVEDxBFr)tfsDwvvZxU zyTavDIK8v&F1ys`2e@gQ`GEG(y~}fdufZht3XY0<1K3<&JcpV=s~RPp2obeYZGQho z;$P&@u^+qE3P1QXoyQmY?`;3g%~j~~a@^IGh(YDzul^4oK7i|tfFtw{__QO=*E7Y` zdxb7$@;Rk(^*?EPNaavq`~Wv3ps92uN%=-}U-|g>V0t6NmNhqjqqH<(zC-%O&&LPs zSiR@y?PYtmn@Q}q4+5t{N>7fD$pxKNK?$C%2po8d=)W4knz}<9o0{fkXU#gpF|-}U z5885cYpr>|m}br?#ecfeta3|aNWZxr&2lWX@)xxEc2+tK=;@sk8Na$mkz{LYgWd2; z%Hg&(7sZ4v4ihdj-_h`*gCG}|CF%3WGg9^wRJqZT;f*mKIV}nZ`?gR?lcy@AxU{? zRDL9d(d7o)?qLz0`vE%d$$9E?r6z1sD*;~Wn*1LbS>9Ngbbu{EBq(XR`V1f}{Qm|w zHa9kass#yPC!Pe0vz*8lT2v1jK^)l4A_!;}WBb-7Cs`;66mep zMB#9{Q~Py&aBz2i6sh>-cK4FgQhiNBWm(xSkgcDM-h1tlw8D1}-!(u=Ws+kr8MMjJ zoLy0d9&v;}K*@nAjZ8K#(wX;mpInljl-Go_>lav>Nq-{SB5inhB+ksuf&2l14vY=R z)MGpD7k}iA#57npR=OGQU3GVLiHM4_cd_|)51{_A%?-JYBEgsRjQW9?z7eiENfIiU{&3kJ5 z-@A=wskGt>3bCT$eo1Zy&hcj}t5(>z+gx;kn+l9$K|w*=+tYBTep3Ie=Jd6uWceK5 zs?<5fu(a>P+m@uHq#qeV$TTBmx;3>FB{btz68t~(-$7wDHKoE) z>ChQ0KeJx)xkN!jT^-wipS48v;^~)}`$6TkPf{PXpxT4S1semSQ|l{sl5fn>8Tf?Z zpzN^6+{jm6Nuf>NDN- zlQoHA#-)myI%6JOxt$V(tQ1jX-ge%f=mA*>_ZF%TpY;1@!xM%K^P>Y zPJ`)xW`2W1~v-w{K2OJ3l{PqS}NlDeFe_7Gd#dwc@dM&;7 z!DyeoascIJES1pll)jT>1jbrgG_R~MuM#a{yXBTSoTU5z4!tOGdL2hc6_YsFSvion z!s79MzCqRc`oEAK?RhFHDsWnIB@J5`U<>cgu&@8F{y4M+^4e>~jJ1#=Q z$<2)!t5Lf5xQopg*~8--9IOaOjg9wgZEd5iRp@&M=UHtXiG9jzG}3+#ti$mvbqfVg!~>k53mG{3~Tk9}q|q-tp7Jwou-zATM8B^vFp*sM9a75Zpg- zX`r=5Fp$Jnc5rpzAWGLc(E?@tpF(KLxET8i8 z8*FnqUqi&fgw`Y^N6BE2*Sq<(3A9S<6yLx(d=8!59*>^qX z+?gFYPy7Ml9ha*-!%5l8q1A@I<)rjLu4l%_e}tfWlBgAVcKv3mkEn*r+tWtxsfAp< zN429Yf26%W>|~751KSC*k))dih4Q0GCp})NaGOuiSf!|-*miMzGLTRZO~v<4is?O> zP+H%XKeWz`7pTBzHdpnQp=|^!=|dXQ zap^2(YDS!kE|2(7#uT4^@LcwWSwow#X7c-aREQy&s|IUY7j`c(il=&UEnr=PN#)R{ zfGxuCt3KU%wi5)<&_4O}uJ9@+IDAF_<3}lybawoE(!|6*!HXgLzp5Q+X(y%d9!Q77 z%+de+#a-lJL#0urArzPXME`o3KD6{75$PdpDM%wApT5hl^zbNwpv?VXJf=T8CumuR zMdLP_tQL3HaYa(6g)cTvPUwMBHT`4e+yrmK{x>H%>ahO~_7>Z+JS8>t#SNz zFJAxdviuld@GiHHfR{VcUW)l$%xVcMNjiq0Fc6|IpFDw3Y5C_7;mgQA|F+dWgoisr zt`9W1Ao^}VLMn9J4Gs)=xOnO|y90!ECY146S2+)LYba*MT5{=@Z&K6D7Wb3MAa8NZ zxUX57uW*PRR8&LoI!mG!XyRSYcKHBXsjsV(p-3Xw9VP00kP2t%4K#b=(u(=+ROjoa z>ZbEo7+p<%fXM%}IlUOI@#;4hmsPE;qS!z81S+=HH@j*MMqA~~TOu-_dY0+6?t-on zkWc#fM{I2WAoTIy>G*JS`%PL*dAXt0h)o@8=wGYh-iM3^z_)ogJ0tvX;3CskO6R$! z{p{|o<$Hqg0~~HmB_-7lFHIFxP)3r6EZ0~ve?K(gPfq|M2xN2C6ciMgg6~M5cD3K* zz_xaT!HXlAlAIjl5W;M(UNY#BRm95XA*Jk${!C~lEyi+a!)nxxWK?9@MH378@#&j6 zw{dr@h*-x_oJqGCRFk_OsrvW`pSnTren8vr-@ma)9wVS_?(Wu`boT;U7g*Uxhmr1F zQF&}$Z^(bWr2Q(joRdtsZU{_he^=lA_K$93L?%%YKw>YEb=nUPQHHE zfC{!>9Y?Vwhy$4QUrp&A^pvfz94@uf%Kn4jv*ew}88t9sJ4)ZPVPR3I(gy^eo`$Xo zs3VDdq|(_(Nq=mttv&Omyd&_+A|=;x5yr=imO~E$c@a=GSQC@Z5sd;d5EyDduhcp% z(NHDH5XG=#=c!&Ft@xn@kJi}Fs%@mouvkzxYQhGi0n+sC4m=wFgPH!sh)W5N})oA=c1`Yt-m`KP2q^;4{ar@7>+N zLmkZ2v5PY7Lul>+^!mQ1X@wv!k=JA92xra0#8)yzB*d>`-=m+hv$6)ELH+WI(~3)i zaKJ*x9EQ{Xzl3u?Tl}Gos7~_~l@xhJq>(t{r2HNA=fEz&(2>FQvW*07F#mx4^EK9`9{$a3=zk6b1()8w^59xvSgBRK=@4^W0TV))=&`g2H?-rmrkC)j&Q0{(E3) zyW+h^_q6nb#X}${V1?pI*G-FT|L#3IMMzbHb~u|e1_@Qbgg_&?P`*6IiiSM&2;)NU zB?A_g-4=)dq^DN-O#RpO%;E*@e$(q5k)_*F-8Sd*YtD zx*h(_ycN1V0n$$8ZQ|etHYNXm*_?s4iAil~NpA}_b(fO6JuGI3>4N3eONxr_G%3iX1TtIh}~4h288pR@+|)l zSg{OvA?h&48#mF|*@@5__>6MoF;Ii@`D69UNz(L)Q=WTM)M?C_zZLY+1bKK`v+0I` z)R~_zEH0k)M)h|ST)4XW0^nIK(uaOw#^kMyjm2gU9#K(hT$IY-0RFVu--i-T`hAIr zPIDi0u?Xt^aJsfW(#60Odk&~P^bx#zMNJ2GLOwUOhVji@>EV#QT^lVj-?F`u*J=7* zYN~JTFX}zW+A;xZeet!g_`V+zr<NO+R%?ug3bdfu4I2=C>vJ^x;Ma*vw3b7fB= z>|?b!C>ptvDI+6k(=7||^6vh{L_)g2d=$#z4{a?Iw)qB&(oD&8dIB`>wbj%{H7l&*JG!SKA!S#Z{ zIyKrUIocKyYRD9heG#amY-RPL5ZQ~?Z21t9-m@ix;aNvgKEXDo8a9$JbNRj6Gno7m z;Z;~b2-9Omb5&K<5u;RDQIFjT@Lfa)k;mahd%3!D8zh=L{$LnHSmNX1fqjnIm>4By z(Hr$N@%g9o!=;CWuTtv>obCB36LHYqCjUn?KhJ=TwS0cGy7Yv;+$Pl_Z{tBNTKN>| zdj+I-k2H$HGxVG|)QcaPi{ZrNl-O4+6}~LyOyB!6Y$8LUI2i<1}CEu$NSFcXrEZP zn=%HBFFX#uKm%=NOYT(pKMqlb?(Xj3?_4Feh5iLUc^1B}hij$@Vv2}?F7xR8ye~D& zh!D1z$bqPZ2)^Jv7S(*JjJ`oYo*Pb3w;8;Q!3=G0dOrPhXAd!tq)aR@931j?o zgjNu}(lws-vf+l$PlS9!5I8%ewFkwR^%p5}A-L7C(gT_u=I`aYh#WgmQU*(3@>S@2NxDNlRH&@hR zIr9~*LP9{ks&&3i&4Qjd6;cSpq_c^xZfY>H3$pu2t_;KX$*&@Ij)oO=b!Y#vybMA^ zseD!AbHb^QhD%ii-J*cwba%2)cXR#1aTL7hw*0&~lu65Px-PKfTjPH#=H|wcK_sHe z^r1UtM#xtJUdfzi;emfFxTmuM~>%r`W!`{C#ZuCA_bZ@&VD ziV0`n1y{bFhDM{+3)6W|l=U*5$7t;HO*OQ?@X0IV!c%4Q#Jru`b92XrhnEHh$dxJg z6mg{V6F%NlH8+nfWH<$7KX(W4w?oLDjez)P>l(BlTZTHXTJ zhqimOcHto&DfS;{7;7#l5k9;9F!fjJo(?-wV8C|{X0K|%r~CrGl9s@AbTa&(M$nd1Jeinxrw0u zNZXxbzj{Mk;sPXBC8ede(uE|BJKBb+Rn9B90Rad~Mj|LNYeHDoVFv(jY$|a_1jjmQ z>giSc{o~ixo`z}d@*lbco8{#-cj{vf4#W1M>8ig7Wm0RC<@y3VJf3EGVq0i2LzY(N z<|00){Xc)Ux>@<>s|Ozc*{MO^1ZKJ5iNF?OA#K!)TH;{r5%Q6kqM{-M`TfmJCL+C; z#rF8K4ttHF#DAkkauhWkeht}*`svTUi!ibA7@X`b-~Oi#7?V?QC58kz3Y<(#5VxUq z7Wuxey1J#Eof%Soxg)|hu9n7~oVBU3k)H2y!hMed{Z!=sNKfLXnKY@q@n!V*A~G&< z`->wQ(Kk2E9)rCxOYcDrF`6qg@=&IZFR~>fxBSvRs8br3Jg!S=v)1Nia8NLWZEd|| ze!QiI|6Mi0IZ4F$&A*x;3wm%lmP#!$x0C^upG zbbR~{CIt0|;=eHo*GB?L@Gq(8&R6h95(3&yoGw3&`~S&R*Dv?7Wl>^jo;A?miFY5^ zZB=<*LdZ~hxgqm)fve79yj;7VGiMLe1fz{5NA=!yAy^~;4F}!R$zR{6Pv>K`r@0(P zrRv_E6%O$Tz$W4vx)9wd?EpcZghWi*x2 zE@phgJ<<1E`<*On!e?E3FM$RRyXouY?M9PsA8s$opPikE?28XweMBlswWWHY%W%2r z=;UNiTH1>4iQ_6)fQv{TVk-zPm|wQ;%g~U6Q%0&^9Ib!%=kkB zjtkbDPZ4eFPs_OsP^^c_%N??b>pvr66BggxECl8M8BzQwq{&QFj3yzIt+pdM`{j`i zb5LZl%JtEcru)A!LoW%MDkkP4odP8gw%J)<?t}tOQVG#7B2qsPp_n`kHH;gx&kT zNBHvAZV3fRI!;_gMG1X%7Cu`;Bx)aVBJml{8T`R2N(&8U{|=4(uFpQnCm8wrT_zj7 zMMXdf7$jyL=Sy2w$&1H>+x8pCi~)`-87*Q`Nn=cAt2AtSOc1$z1A)6ze@g2GbmjxL zR!PW@qC145X>Tzz_#OA|9^f-X2L*__fO%f{SY@JO)Wc-;Z@AWDe*Vp0vpisFlNh2D zs4!~tZ7L`TlhQKaVnzI%?)e)81Zt$J6ktkk*2GSKhHTNv^-ilQ= zXDuJy{ke~L8S8M~nq=kVJbM8y>XS|7@$om-9OSWvnwn~_UReNYgY%?=Oi$E0bRhR_ znmAiTOvg;Wu<^S&eB+_pQR}pPI+^!=q{Tq)Qzv~3P=b#-l^+HV9- z48j8xQc}`d>B82JB-_s$>vnf{l}?kQb!#*3K!R$$$II81?G8f&Z+I=f@rsN47i*~N zzYKnSijDSJLlipkdgm?y)x^Q2sj}SP1#lZ8w*W!51kwIurr%#4=`mR`IWkk=;6{$T zx$ZrK)C@)@#;#0p*Y$q5Ho#@p^)m$`0{{CD#rW;f@>`eB5#1|D(K!u>R-rTreIG7h z=mm`IWQ#Mv3Q@p^tV8f)qM++~6~-m~j09nTbUK#DzP-$EPxBSkv`&8K#kQY{tt(!ofy)DT*S-?sO`^nS!5 z6bnMItYRQ1>5dd3Lv6qoXzK9V+CY;j;+uk2#T#SdjvN;}W&yrrV8QL{$=%USy89#g z;rxrC;jtY18tL5E#Rla)G3M$n!iieCYHHg0d;9yX7AI4F|IQ)G0omAT>E@bp%AXd0 zdDxVjX#M)xgI6QYbjPw|2tMsgRWu`5xjw&Uo`7{1JX($QbrxJcad$1@`VCIZAOV6D zWPo@&hcFsgvUTY2JNlS~nVA%AyJ`rDiJQECqmPt--KT-$)?X-l3-Twu{`}GTbhzDM3VWZYgKx7&Fqep^X z2UKyCnx@v3#ImeeWFBP|#U&;6wU1q0T^mR&5L4$5$Qg829Dk#8ZW=7Y@20dG|zS8jh3$SaZauaJ} zXYg3zE+7mH6w-=#8zXi5M3IOfIhQ_rPv{|lY7Rl6hcj*0+wt8dCV2%=iPw~nCC$Xb z$)3z7zaom+RQ()9c=FfT^b#2to%wjd;o2JEk4(|?$!Q~i{#v97I4<0e#EwY!8JewQzA30yYoA_;VUalVgL=)U!5KPs66Bs-UX_UAQ;iQSoA zK1T~qan-8R{!RMvD>RTRK}g+aet9bROl}q%J+Lmv8|KD?j(#yT*_fC>fFIf%sriFA zf^018KR}?myQ7$3Iwa^U+}kJm5@Ehan2F5m7V#U9_~2*Tkr4%N;a~*s3KsK7o}81Q zFspRYE&ILS(b4WaJh)V?`!13}(2v=@Et$jo8)%HqADo6?yf?mCjLVZPKg$Um(xbP< z#C(h&CK;Zi7Kj@yLRskaCOwy1u>X_Ab0hOWtz!Ml=86AEXFO0#w9ChI=4W&;LN|yv zpyeH8#qVh>PP|2c;=QmP`4kXYdbqJcOhGZ%;+3T(&{3v)h!6&84{m!?%Hv)4^GTfO zk;$SDc#W$d9pv6pQBeeg94=rAH)lIe-abC>C@CQ;DbbdAxf&XLa@rP0J6(Rx;dF<^ z=(Kna$%^(ZO=_h&>APrH9x1v?`-g zOCr~zVgZtv>?2H=R z*NzBJ0$i@r!DE}6mE|Ob6twK@>515ib%Z>FU@cEGs;c{jho>GO8)LHPS_Y4UHqm^x zU;LNxL8-Si@F&ub)-NJGrjcU#JY0Bbl^~Vr9tN(WzG^vmbHt8%yS;m5Y>Y;AK=Mod zDQf<|Kl41wS=bqW;r2koqsjQ-ijgb&B%}h3ib5!Vg;zqDlxY1K11{O-@9#0VU3Tn4 z6y2R`B*HoZi3|Mt5sNnqNO40^0qIdcC?tNNy1gonKUXqC%%~wqO8oD-&Fcj?KrAf_ za)!R~3PSX-T=c!W_3_Q1$qFU>Cz~TV&xW(aLB^vwzKI~1Yto1A0Z9|tX2x(%-6tpi z+eh1nkh|8`iquc4NWofK5?|MvT@}E&3`91X`J+(Jz*NmeH|95INJ^`(v0hyI3AqnbnrN-!y0!X8dPQ$7-xzEN4j5 zOS02dTMTTx18W`rHiArEIq@S5JG;GD1C*J+Fm;4uW3>7TZTy<8aj=sjGbG_xIXT#Ww)^$bj9H>?`;`qTgd4uEs^StCZ;!>UMG9N;Jt;To4nuCOFlu)U>U1!Y zR-6DfJ2Xj)uZ}N1{(j$$AO*kc`u3<9^lCCP;20f6?(R{1UA2FzKhLQJEp+DnFpgIm zUbD}h5w-K|!5Zff^kVKqO~JyL&q?41Y+j8YmY;px4{`mIe5+tOGW`dW69a>_yRa)$ zz3^*7Kjr@&J~?!XjjHovi;PUgkkey(#!gDAt*H1Qy!)Z{HY;|PKkq(fQP^}2hQvF_ z)WV+NQZKdE%D4Y$9&RKc4S{C6y!4bJ zj)UFF&6NfbHOB;X2=SJeXRWqS54J5sUEN6+?BM^%pL!ZR@6QJ69s+XpI9dBM0T(vHAov6Kr@e37#{6?8k&QR{Yl1z>8YvbUsp}lo`etL;L%!`u;_g8 z{w!gP$o%?fBv6qh+2{NKr(p>QSk*;r*4eB#WevLG)Z>iF-Qzt>eQ%a?pnQ^!ta_B_^ql>;uWd11I@#YhcWoj511Zi3j5zIRGD-` z%GHb{w!WU8%106MxlTy0MGk{NMI}51hCLRA6pPb9E-IOVTF+ND(Kt_R)ui)lB~lUn zJa#@7UrL8hkal=Lc;F6pb6#+3erW!4#yMy~1t$*JQdTUTJzWnXhQ19AiSqK+`rqF8 zZ$t*Pc){f9yeB38nD0!oFOlAruDjJ%9?e*gpC3&}%-nhV0;3Wf-U9L#8=8q8XCAX4f1*(Fe)>mrL(@R* z`GbVWw}_K$gH0`V!bu*Y%m6eAlO zAyJjiW7)}=x!9^5WY2r*7i0NE*2xec19-8pD{A&FR0%Z#_>0_*_=kzBjFyY5ScA8B zr!+^smZ61RHaI;{CP`E(wd%CHO&Dpf$yUixOuK@O*td?NE+(ctG0_4_66}9LIO$Br zf&pR{o?yt}JYssHm-TiWc%Vesi@d$Pzkd`>H=uLg1V=yhIq~i=p>UcrsU)Yfm(;^Dn6H0X>9?4?J!o&-Co%z>iKUopLS=#>Rz9-i9`l z%Jvdx|KwySVo+knh+6zKQaM>z-+u~u)dQMJ&RJO^9CZ_(Kn!gSX z_S~P-G+HvYu?bA)yTc}99*2>jAN6jyN)FD=%}HftD%BXMs;k2xi8(}n`kQ5)l_~G1 zt=}A7q%<}KQXKehA{rKb-oT_|{c8`%o40E*0{;K@wXNx(92)rC1t{jC<9NQ(+&l-! z4iA|-z*~TOgU|vg2QdTY_YqkJoRL!PtZ(1Gfxa88hJqx9A0KXMKaPV>hve+{z^5uM#|UB!kWz`w8Ra~Phs#O&f%WG0|8AW!t z(ZKbP`PAxbE^0$~Bz;)K>`{u2j*bL6$6K$3o%K&uRq)BmLYrb`bIAv?My*G7d%Jce zr9-bbMc1pfc)mTi% zGe3Uda$&pHXVV!mvIc3xl2%sk5Vz})NQ*fXS&*L(?XGZmhKGmW9uHd9q9o*=PzQdz zf#Tw=@2M?NbK2NA1GTP~7Z*~Bm}4X$21|xY9RWy#p?4 zss#-yN=xnF@{o`lv)s7#slVjIEN~N9>){4JL8ho-6}Jd_E=&@tVtTv8p+9tJmk_$8sh%q-k6)iM(&4; zKOtQoh_eSA9B=z#pF{LOTwELwZ_$`|UTz+tG^|wahabN}+t91#|4e^ufNnt_>acew zYXq8nRMoZhz0MDI+_paC2q3>VD-B;A-q7p`M2ud`!rB%r)d6kR_nUR(2oLyjz=w=@==BHgS)586CSg?lJ86$ z^tvu~8p9u7*w15(Bmvgk)vv#6YkBhu%j>L1t)0aaNXo;2cGJ*B zbetYL=KdHk{ABCV#xc|D1Zn#62jk}4+tHvoImP-V?zUNmUVL8Jah>M+8ouq((I<`v zj%&TK!7VPsA48ycWZ~biy%}i5S<0QE-o&XbrK4Z@MZ-dYLtS1c{LMk;4iXvH#U$z zG}t9`06~Hj*b#*3Czq%}j~bgKkl0-y3fgYcnZp=zr*-1>CGa0Yi|$h|SsA%Q(rh5bd%B?{=_!_Q^=!lv7q@>96e|8A(rKR+6%SmO}en)+`i_XAj z0MP@gar%aah)xIDGHmdSBcgHZ6@+=kBxz+id2n{@u4pgsTRH3_mi#y^s|@+1ML8=` zKD=^)-CUtzzH6qhub-12SEbwYRl2WtUBn0F%TD&txABC2%Sm{0R#PolR*lx9Ex_%J zl(xJ%cYH%Gb-MZ5e1WZ>v;X<9pvS7!3Cb6eWGVU)@A8t)I*-g_x z`;`)tabvN=c$k41fjmQSXDz*y&fPu`rRC>$J&?eR*iBt)ZNvM5*S}!&GGm@`Wh7bH z@vm;$ATB+jmRl0$PtKxdq|oNa)U3yKRwEuV1y8hWP)JCeHDzRa0F-E1TdM&yuL;W0 z+Z}6sc31Z1F>X56od5hv1?n#4SMPoKS8?oF-=8r57#JA(_Dx0DV=Q_okh%2bmde}A z>o2XX`_xn@QV)Vvk`*9Mj>r%|My6>@g2m0W-4b{)pqRJg{s8eG{@7UDDmTLJi~sqA zTsoD>?_Ni5RSJ1^^HKUquFppe*>vrVDMdQVdwYs`_frLQlyYVDZC(py_3izdw>jZV zUwU)cTCQI&Ewi7&??7RE0T3-J%^q5Qom)2t$B!kDNy2C5e|s$u*M*MzE7-Gdn6qPG z03#7K_tkGO+II}e(7GAYhzr#_iiq&jgevU zzk1tCUDsFfShEw@Oi@;jKekRlZTnX7iv59!mzEYucsF=#_H_8!&VjkQLFO-Qm&AF~ zH4q+#tE?c5YC9uc&J`k0_c=5ab;0#3UpyNlx4enk0}+K0PDYO8s3_)z>yL&K%9Q$) zu9k8#g@nBk5Eu_7!&yQJ*w!R>)(BkLaYwS=xCc3x8Oe8t(+36vj+(ClF#1$*`B~-fa<^f$HL3a zM;afc8uM7M0`}>ltG^*KY#bbaMsltpF%Mco;98PH{#pJFX}7R6=fS^ml5)s=H)y*u zCn--_>vce>>J12DpEt@Q|1^rks65zHjmFPf*I88U*)U<%>k*obv=o~^64uAZ`It50 z{d;hf8-voTWEzWiGPtnyLfc;JgiO)w~A*%p2EWj~z??0W!%@-Z_;Ze!t?eG3 zQ@wR@BJ{W*2H8xOOu}3Zp(Aqcrxh>{{k`x$-)kpLp5W(g!zm^mR!|h`RW~*<_!*Y7dkO+*^Wy zy)kuvf8Qk`6h@mKZ1Yhmn<}~r!&W_m$79yx{5zC1tZCKk1jO8A-#K2jI6!o3>-o~{ z##WZ(rb-&`XCv{hTt3goCZo9oGH99-v=S{14Z{sf6%aQoX>LAI*-kL<0lJM~fj4t- zFmrV5%9SaLWMtRl|Mc>5;ISS=we~^(ufA@r-Voy6lLB=XAu9S#KIfthu}KH?ERVBT zJt7-xG=4pf(g!G?^~x#d9`cyxJnWhvd83^dc;G+kkmUUhVy90UVL%NHFbbSJJSVF?Sa6F{e|Ii!H?=;aR;b{>zqjns_;cuWf%@m% z06AnIo(B&e%>0SIdk}cMsHkLNmPnU7MM;ga$`0f1cB-xcU%nV{B=4>5Ba=Z&=FNL? zhj)v0cJPrPqoMd$T?E6SIvzoQTSUP63kcv?AZbR}dT^)!v@let zYAC`r&uDArK!_Rmr0{jsw>ZSC_s{RXeZJ}K)Ed@JSUh zWJ#Xe{LqhOp9py>mvrc#y1wguhgpMY)x7ENw;6kw#5m?pQl>noHhoWWyK)<68n4m+ zKoVq}yI_mwCu_Pd4iiO3TXU9Y)4_^i2?=h_&Rhl+V`F0m^!F@alo~fovLQsgPU-0A z060ru57UJ(1Th*}4r{x9%s*_;(%PM#Gf;_@SUw+IBTK_~zMHhCPBihSR?|P=Z@q3g zoGRD({Tj|u^=|8YhTs8rH&nhawxB7yfB!Z_Mp0Sz4Xvh8c2#{nNz+&~E>X@42QGB` z^$+AE66%x_a$}KZ>euQXDA(Zz+7z!wCD0YIu+&^!q|Lv=8UtN^zr97a@zm-xeUz+f zTp4O~QCA-Db}zD?UKtFK0Uxy>go=v#nl9$#L;(ou!9m)m(RkCe%^w+LLrl_%(YSD_ z*iSP|-kK>;CQg=(L|`II*UQJKzcP4i%B2e>J>pkYHY;5+?KjO(g>3}Q$|%&n=A%eE z0h{SLO;%iFVqzgOcHq2IQ;XMcxFIBAAKz!O$Ccxu!kDhrdHU(ePqR^%7pRn_`b>VZ z79X&8De+q|Fj=YodEHH#H0JtG_1SU&yyX>U^0Cs;@bs*gpxcI7a}aB`?9%j9tiZv7 z>r1}`G6r1)c#a3?AJMB0l#{$j;4jUFl@vE=?(5xRX|em$j#xLn*!b1AE|QwG=34?t zbfJ(&sO1DFGt5*zTbWJi0=HDu)OX4;<4hT>Sx;33^tkkc1IH}?8=)eTv0UQ6csjL8 zMQ?dSAj3WG5ism&Q)f}pX;mZ5hB!TRl)U*(-zxv0*CBpqX;wRE@Ae3N_v{&6IdtMXTrnNSVjHK@{Ah}3|z7|35eo~j33^;!wh&LLTc*5u#myQQ32|W znwstsQe-mp*gra_A*YjO?|MuJ(#(b4SHDJ*EL3T0zp8%S859a&5IPD%7`P}%;7+vo zMuZ!VoPyGrTg?O3W6(7jO6b+Du9@NeTG~4k(65a~ORagyk@(Hn$=NX`CI&N<05@Np zgF;p|ttOF4<7F*__<^cvmn-!z5km`JIKkbEG^+) z(DsTIlFQdfEjU!PuDSddG`P{6fapW&v2&z@bobW0?{wNrjvh-M`_Lv#KVGCkk-)+< zW*s>sNR_3M*|ya9J4RqJB0BnAR8%IgIR(n%zNe#dm91fq^@tMnCK;Kz-Cj4g__erh zd}%tVziECb#&Ix`gDf1CL>ZOe=lq6*y`!p5^|?;1bZ#zSUa>m0dVcoaJYRT(eXO98 z%KENyTuzni><>HdVvu& zs__|G5OQlcMEFV7>U3!6L`yrCyU}5pUS*9KCRsiPK$HZ&xEcxjGqm7er4<#Cv9Z9$ zo*u0*bal&t=3IdPUErQVEmciuGN#YZYwBm$r{66tJFE zO3E_-jQU#9pP`3&r8J09a;R)*7jB6C{(_ z{&N)yG@+%~C&T63J=00v%ss~LQFx=+{<9)qz&D|vI>1k=ZK(=={_p$3Cup*L! zxB#|h#IWuzSukCE@98P7sJPGd-MHwqFUXI+)-D{!J(PtP?NsJ=dh^dGiV2}l>Nm}M zn3q&@_F7VXLsN`bIcgrj$25KJL~ZH`37|5p78IKNRC%&XmCU`^@vn zT4OgwzB1ylZE9>Zwc0NbR$=FOu)k6F_Bu@W@Jo%y;1pcjrjCMw7r}V^X>Le~ulPUA_7!0HlJSltmMkPG|cQ;NeQH2vLh3C zl7bBaKR&yuT&Zx_H1AG^{k6TV!>#RQ=^r=(IUBt1>#QTCr7vS~^=ggHyn~_kPl*Xc z|1t00iMTPnzBmHtHVmR`odv1>ueG<1s%mZfg=v%$K^i2KkXAyZ8w8{~B&3lLML}8w zL_nmwySuvtM7ji|L6Gi_bFugL?&o{nbDlBI`;E`B#{NV1nrp5#=e+Oh`dz;u4UY(h zN?__frl>_ZQ~F39n}kr6T#iAG2)(alGJo;f=dY#4@`|#uD|c_q;zQIP$x3X3eA+NV zMoesMXm%~qb*hqewdLyGl1Dc7O)Y>Wcne;`uYXWCXLsjNG znESo(m?vii`_xvqPd(YH^(YyugEpLnXCr03)5%;)LVjzXaqEl+gp<>06`KB*1^^&o zYiUUuX@w?dQrgp5MwUU|`_Gpm?~h^nlrzJ4w~zc2lB#*8-E(xVqTdQt1==C4>;&Go z`G-1RhdxcG#k(0Ue{^)DU%6R(Jr6kAJg%y$BH=J~xw`OK>K3Blp!@YBK+NzFV(X3Q zguB;4tg(D%(;({V`1WmmvJ#T_GGRgmIliPlFPOFMOukCwW=L8MD1SA7EP&>p5$LH& zl{#YS9}+S@<37oFAKB!N$Xl-R=b4rx&`vhgL>uIMt6DyJ1+K_7|T?eMt=6|K$M{Ci=#Xt}p%htCv6 zad7(OVnf3T?)WgAa&){G9SeVcwwhl0?S4Y`;z=_);{#T-&nPG;K;wFQ_%h}5HqcG< zT^;NV3>v}q>kHZAgzlv#UvU?chtYx!4OU}$T9BCoRZYc=o4+456!&M4$5CS5>>vhv z0sA?0AiX`Vswyh7sRJSrLWh<~-8P1XPwCoKLrI$Ui9Ua(Gt~(gv??=DSD9Gcq>|I5 z06akgSq%zQB+sOr9Lwe2tj^9)KYqv^XJ(p7S*rsZuDAyS{fqnK6__S=Xv{eU4G)(= zJf(WH=>U?upSZHRy1JU$&6fz);ECZQnZ`G`o3bigd|_cYx4y2crd9oVtN^NQ$D>WhD)G(D&7=h-dp!J14BJ>3=C}EU&W0GB&Np3` zRfTBgJYh2h8-<$8gdT{bE4#ZTFnBVL6TzWL#U_>F8o*dXguG+S&qE{Qs0im{x*8Pe zg_7@(7*sgps&%JPhHu`Y(Bs5n-$%2!!Am3#L{VKsLqT1n(xAAEm|JcuK=46m7ZO^l$sNDX2u&;PLR?hI!Cl5l zjm`&~w81hXA0OG&Yu`X>_yiN4w6q~GVn9cL;ANF;)ztlwCf4DkLlQzlBxiKrnAO#l zm6blo3X=YbtzQomtt`WoqNMM`9?)%&CA~X8*3i|Pvb#k8YhU4y_c$aPzV-E+IX+fC ziw6ojmTFcOLt%DyGOmNhv9SORV-BYAoz@@EF$$T$pOE84!bZH6dLg5|CJ^pl3sT;T!i z|8#Ou(y2qX(>1R^{`mbn22^{6sp&NgVvlZ^<90yILQ*U!aU%{99B+k{R8|(|=APl> zFE18VltIvh>lq4+%x|-@%XG_WE;FEhu2uX~E-!>&96B>CDB}yDc5EwZB?VF?q zQ3~G1wqffy`5_GOgs~~l7P86%%YkY`GKuxcn_VthDL+3?7#lqKAOU*0cf(4f5S~5l z8-84Tax@f#b4~>?>6euS{S8=cS%HLneSI{)Rz^bowGn@@0+Kx3pXexWZen7lDrFlz zl%aekLE!#ig7g-O$KGxXVjks((bw7{IZjgO=qnFB1gD|Kfo;CneMZnv9P|MQdJJW| zKii@>vZil>AKB$8mSUIY!QYR-76w@58`z16c={bBg`^`8P>DmbS<;Q?B9@v$J{Bv4 z+$ii1QCK4Q9mWXKH)P0=H!GO0qz0DX=M@%)a>_t_27>(y$sn{PXGj!*4Lg)x0fQOk zdBSsY4h|ltYF)Uu4Vj$zbR3sI`h}t(HHYU$vSsR`Ibi1CQANg_&d#-R9tTuZyoK@* zaUTPP5UA?l1y)@h#PG4>J5q9imp)1o4y(P5jl7mtwQp@LcwJMlR*C1SXLlOMO^oXb z23^Nbr6IG&-RdW$5PMn>R^o+UQfh_k4+8}4ikE+;>;0ZRvnSHfSm7qgZ!{+Eza7nK zv0G*_)c=|J{LSoN>wqnmxf$YJ@Q?BMVJf9?MohQt^GvG@%O}aI;|s~!`taKurxs9Z zZ`7F%uX_*5czucF;(AhB3k!3$Eh$UOQomhHKOk6JTBZzUagUAy zMZxue%Sd3S+)Be{y3P}W7Ti72&<=qKMwZBi>-RY%RH5~*FjsF3mk!NsNX^A(^@eGW zFVh31o*$Y?D!>(l>@%l_H`M8+%;=?B@ae-Xh8Ly1B&~b7`ntNkUjR{xj4 zA)_7i!C-Caffz(!xuI3|b#{np_Th_f)m69%mpXbH6lu158?u?mUlCO8okCMXWg$`; zNR(*TFli{S zu93~jB67)1e7|Ei@jD4_dC0R5M)FZWj7L?Rq;j#cvIO?R!Jo{;%`ZWroS!KY+e{C> zGvUvo$Eg8X7^db|-y&r)`S@x-e#An`f{0ZAcB3I;?lN=4j|@G8EGeIX_V5%OZ+{lI zk+X~JH_kYWJUq4Bw@)ZDe?UsQD$>o%!;5qce4#A60jSaTu?_BW(44t9B8Xy#zHWV_ zg&!{uRx~)6n9e|Z0EiUBQj^&R@;ei>^R=t&=K6##_zma9AsNxR3a445S=cIB5#01b zkst~jlJ{^sP=Ftvo|blLrmG=&nQn1mTULdFwqJMmCWCUK+sv)VHkk%LQ zdE#WkN=4X5xf2QNbVSCE0vuI5?Y487n@mmV_BA}#s6IXG!%qFE1(0dqGW1aT^z)>h zM!4mFyDAF3-(Oi7NCoO3+iia^oj+_}PTUwTML(5;R2RDoKAX}Hw&?%WOJJb_AF(yn z{fdeTq{!A%zkLn}S!P-N+s)0*KVnM-ku1!w)6o9*xOzIK=KuL%W1#YcR+THb$b3Z1 zx3#Co6}kbXR7uYkAz<0KxLi|itY5waQ|aBkJ)x8R&?lwKaZlyZDEMEGG9McPo(m<< z$ZrA;o+9nXhnVEpICR5B@$mxEb3peESGF*;IMMVc>-c=qY~|}h?smvWahhuIX;D@V zk-q;Z&@k-^c>f6B%vWDsoMJ=UT9}t}Ua6~*UolW7QYPr1dYO;m4d4Y-AEJdc0s;bz zG&HP&3C+exAzQ!dLnC8}epYUk-0~y6wS5P{Cz4rf7qDk5X-aMX1kdK;tT((~cdp~f zg!io{-TJz^ic3q8ou0WlaxJ~0V@cxD?Sq&D9swO4KH%KyvI6f4?PG0KRnhpmI!RAJ z&NT4;VbbH#=e=b~&XX|HG$g^M$39 zr*XaJJ@+LK-yAq5MsD5f#m@U{O3SF*Zq}XVXC6CvX5RdgoSobyJCC}#SiGSKeihI z;sk14j)>!ea&frvVEgFt-idHu^~qhg3h0m#JpWOr#OGZb(bIRoO8 z(oeUwTIUh3a@M}{xIT!fcobbGa+^9_#-A1sCvp;|J|NiJ1Nv?#T|Mu@0g1=*uR0_R z4I;GAEPe5{Pp_j~48ml>LsE?TEx_4PHj>$OFYxh;d837eg_1{)5Dt^7pOAm?I}pvv zppFHFXy39*=c*(f4(2=$45NVNR8&ubj*|xi;2A_wYp^1K(F5oqh2CwxeEPKO1-Iij zT@9AvyoVobyebE>RI$Su!@F`Anby`;qs6h)>5g5k_3E|r(*{0~);3w(XUY!i_(JnI zXpkvPW+l}lPOs$HON+zo+Jy*uPRN1z+S1$G+dqbw7t_Qpp@Gp-wt7wEai#mE@y!z% z7{UJd!W62v35T~~7$f%sTLoMBz93%#lYlFir0{gjn(#y^C*vSXx@xvsmL!sQ-1dl~ z$RGXMx8+q;QJoXVJX^)oeu%9}Mt;LXqH`tbvNKT+@3FGlK(7K65g5dwqoW(m*0jQI zE2hthI~n`xFNDAdjiC|5k4QcM`oJSft(u?A)y^=XE!bDGmea${B9))5dT~>+Yr-RK zCK`o3aDK(S5!yzue}S~3`IEihT9ZGOu{!S2uZJVtrl*hQ^=j>iBU-mHmd_=%K6bcTG*XPS-hkY=fiFfAu7^7)gPz&IRcUm=;>5 zikcGTk?;v_mnEXA7GcGIiniz{+|N02Sp{^&WmPO(0+(R=(- zQ(s9*p1LILYr=L#6umd6SJ&d#6FzwQBUtsoHa(K9@py2c>(%7eB#6dpHfs+aMRRg- zh0FU4FrCjfBM<$lh0A^2h@}Vo&YoFrau_k1toV^>x$Nzm=g^O1W$p>yKlc@3D$H^WyZF?-^dp{Q>t`{(@q6Zj-KE6+4YC`= zQ1zqCmvns`Ofu>D`4Y`5I5zeS${3H;sUkx$u){{E2SE+Jf?If(an6XPw{o^}E(kB3 zb{DgOs|H%+Y*ofo-YSsXc2GW^g4%KB)nABcQ*t}CcG+HBb%FL^qw<*cuWY}61sBie?qoo{-CPUQsqQ-`%LsZ%t)3U^1-cLL2p)F%!LAl? zb$N8{jrqLX68f1Au(Dv&tHD}XvhPtMR1n=#_IqMxP*hv%EGpWfV_OeZikiMcp0tfs zw=!cmEYp)PP}MegvYa3sO|f`d9oKAM%tHx^FqimjAMO-K_gX=b^Ov2$M;@Y z35-51XsqP>qrv&=xwi5Tqv8|(>A33Gtx`eYGobiV_s3@frj*oo7c*BZVEhLokC6C_ z8>(9&v_kTUf_heZbQ(P6H6KvCxJW$#$k;R0cvq=5Q}8mY@EtgvN>}PJxEycKegB>V zh?D^v=im3f4QieftDZ&-w*bm67b8uY5u529;L9ue}XDM6V zo2z+*JJVy9LapL-J12nwEw8w|obT=WPl$d2&MyJ4aaOIbZ>e{w98G>fHd?eSbw@rB zQQ=qgj)=e{V#T;gQss8>4#G1I4i03}F$OA42-4r8 z;BwRMO+Zu3^00$MGVvcq+)Uw+NY(r{snDnQ1*ZiO5%pfbF5TPP+nTO+-B=}XcJ>7q z7*w>wy`v+kJOcmr;S9QP88tn%_{7BJi{Wv>zC;3AHc53&6I@TQVERu>M zBaeWb4UT>_R%T(bxw()ptIDWTA6;g0ffMfqqv!>`+kbTxZ1f)|o#vw7=#j*|@V7z6 z%a%T~?0n@gpO!`Htt_9a^lM7s*DwCId7odubcNSX_Lf<7t7g~N$!971Q_cDS4ujnA zqH*$cQB-HRVrZ5~BEZb0xP3b~bdQ0Wy1BPE;b-IO4wlbr^N{Xp-OW)J9sXZa8U^Py z$;AUBBLq&FI`vnb!L7hK1ZG{kQ;FTI<3ljpSXg0qyIqy=cubA2z&en-wp@~rC?JBa zYsns#i^#{|>cIQt$)2MN8JP|f6BE_UPH4wtoAXP5Ho=(^lkN-WcMPiK(Im3@>VCA! zAa{YD-W!t$NDXcW%O}zD~8_orlAa)(fxS&_Ih6v&=GIg_rW9w*4bA&_8{?s$w&ec8 z-0D24xX$U>5!%K9G62nso}MmET$fdDP!fQ;#n^%z`*7;VXp{CWFA8 z*jHIj>yv?40B&shHS5UO;g-Gl#zOBoFT-~r?H0~qt%LH)wl{8^D%FBwPx79QdZ_N^ z@84h$+)QFy7aen&R8#YPMROn2*T5Iu+4%fd>rX_lP0K*Xh|Nx{%ldAzVg`)!=()Mo z#UlLae~Lvkrt_~A!J)ypxOiDv znc8=2317bw6LK4MeE9^xL0Cito>nTKvT9V338Ggl4|#7PIFHWnv4N+Ia&{U^;~WZL z0^9$b$xG{v2}`4-lJIbLKEAWq@R=WpLTrM9&&86RoSXnJ!DX`OG~wtgTa$Tl%(P)U zGQs$vhk$fqw&>n{^&LkSHibf%GxWxtsO!oFq^72-(&1}ric3oN#PjhzdGdslbN}?f z%AECNN2NtIMmakqc&IOt`3iKViK>haDxrBSULbq?*Y6Tws!P+oJb=goE^i>IW>R;- zDDwL4AYA}n_Pjz={;viSU6;lHMo2JVPbc0Gcv{n?aV74CtJw8JHrBAC} zoUR(`p&x!z6TI{R!&`YT?K{Qak5Iz+_Rh{92o)UAr%uPjdTVblqu_qrMc)k+#r%&S zQP8|LH#T0_^rGkcaMDT?nqN7Lh1+D`K1DClP99OUbnU=I;Jdkv^fFf1``-p8;@$WiEya z+rNDmCdY5zI_)!@mG%j0LFhOrLnKo{iwu!$v%|*OddM340SXj9%uo z%rlCz0T*`Z=XZlz&QuK>*}n z*}i9Ob@f{SMXB>Umq=DbO4t1za8HLj*#9Z(-bez|gDR1O5=~AmOIu$S*XRW>f_ihK1V?xW<#UBZs@|7eEa5FHx&%gD6K2txm zdr?f(7Y^wz8FZI|i0G`HNFORXz`?Y%wMkhh%z2~{PDi@CbL;BP{n;9&pFMNlntC^G zx(=L}jh_`SPUySAAVo=2b01=Ms%vX=v+ksec9|CUb2whMc!R?QFfi}9-4!tXp<~-X zLQcNEvJz$gKq6a}*jYY1e^h3!$#dZZ;}qDf+iFb%jK?l+(w$VE!irj2gWe^IMesj1^(iAC~dU&w&%FYgj`xC8Exy-YX?0Q1EYsO9wTg!=XW^z{6it1n& z@c6NCNSMRB?(EVb&ZHD&Z4ahnK6z4&FhQN13)>1uZ8aew;mC*@jFIT3v0fr9B2-{v>?$M*#)pI;ecC=2nWfL+*d!7CbxsJ^})jO}*E=@U=S&RUnzO#)1x=jZ3s z%SGYh;@ZKa11JP7sGb*P@nP0n(g=F^Ne-Y41gxo=|23t)KAqR?N9^JZW&Dn_21Z7r zu*J+hg49d9t`OR2l4yK7`D1`=5bN(IBov`Xm;C`jnhv)u{2;gdQBUK>S4FF9YCv;@ z4_upTu#;`&LL}4q{d+Vtw28?{0R3QC6f2C=B+PKq_7G!y~wiXU^U zj)Ux`ZrZEc(>D@1!dI8KgkF5ZDi#lki(|g+&%(@dp!fMOjr|;(2!(aR51-!BGPm~4 zAJYd#D?^!;w#)L6i+H{elzN-5Lci8cz~#*`8`SYfLRSz+pv0&)FZs$;-L&lsh0sOW zpXrNQ@O8*qt~m1*L>W+mDCv&ZWL2biUpjoNpRj>l78o9YIjDfkv7MHdmUE{FAq$8# zi#5*~_^z{9epb3~0mO_$!ufN&J-wjdIgQQzvU`D+(uIwE4kI$GYuuT5LroLR|PA^Mx}osFQqdCr{Q=B^4!KA)-9{8UHmt z`Xce_{F()J5!heU=N0%`-JJ;Fn>e4T?LxDCvryys34;8r4 z{nYF^6(WTTeE5G~FbR*cjj=*^xJ6Zzl|lXqjF5qZJCcN;25w0S4^AlNbr=ESCHM?J zHWDW`s7m<6>#ZwqJoSie)UXI2<9n|Z|3M869jc2KQ}ctb*Y#yg+96`?nHi!RqxLm%d4cz z)E3E>X28{Le$_Z_H#L`1wz3;>qu_#%sMXX2moE-w45x+t&+Xd;|5FG&r>-{)40F;68! z5*HDMEeiy0HWT||CME>B!Z0=91vZY2l%ynHPGyZY!=0AN{^+vDJy;qqe^tE#bF`U2 z9y|Uq&t;GXMI*$mFl&DRaC2y6r+=0usE>`Afyepxj}a>kPd8A^00RM-i!>RQWu^HF zV-6#xbur(U?8Q@B($dnv#Tc8IU6{^VnPCx0uo0HN*<>+lYOf?)kz_@=B_FyWX{M)~ z&|5X0u37;l25xu;M#gIuc(JB%&!I5Ra_f@47V~egC<3R}8;MiXqkb%n6c$^aZ*d}MH&MGP#^-;5RLp<|K%6lWF-*+cmt8obguckiAg7A22ek_Cd* z^4FU|WndUuJkI>nSoL^?CU^yAE~<=rRI{;fO^ZJnL`Ft}COINJ5}c0k4$+Weo@FF* zKATBOnuQCEih?rhd<*>x5!E&>=a)uOUVrr&Fb$x9FV#PI*ZHeNcTdkVX2Rvg#XQ}U zgJ!QY`T%zm;Z7=g`sLFJQa?G#fLi5pROAQ1W*@=pQ;jc-KF`z^Q_3xmX7;=E%qS_5 z!PF2aeufgPCX0;`(_{R0W03YC^+QHRO9(%qvhE5n_}x|j>vJpmeSaOzWU+U+_23Z) z+R)bY)*~_;a!tgArhyWs4g(}vG;C6=N0ne&KoeZ%YpB=?!PCMBvkzEV8|-#kKrj`~ z=$#q)n89L}(oXxSe9Wc9m|E;j6Pnw;(yC!#x`W|3>wySC<^_r{_fdMa1KJ8@Wo2=i z+fVqce7<}kWGh!|nwa|Y`8a3T5-t8Z^Q?H`TX;mo^V+ur?}?EF6Ppd9q{lsdaA$?- zrdy34!LM}L%U25WS5NXWp1){Oo~=AeFi!QsBB8<6R8?1x>Pnoaos$fbU(dnE z|HEoLxAkdf@V#UOFI$$sI+s~T7lazH@D~$BbLdY&B@HvP0Vh4j&0piNt0S`r2=K2{ z-1H|@9^@rCHHOY1o8f^jj)v-e85#N2iF7NwZG`ABJHs8+k2lw#^xbBLA#?zke9cr^ zLl3$(l1ubSo`>_H=ais_17GF`9Cd~}oV@iqV+AT1^5I-vq4Km)6>IBEM#+yGasp&O zXUu**GVw$vdeOA=4%NS%l>4P4#8q6w#lPk3As5McOT5<*BF_BeLc+s$fCT{C1c%A@ zFaXY~YHP3AjrZ4XRn-5=`=jYWl&+(yxlk* zkfOAnssa8&>x^sV<-u4cM_2G-2Zk1-)+1o;_{pbw-kC0PyIAZBbw4&-@H#sZ!NB)V z(6M@>5)3IF5fQ&ww7A$05{dfG^H;gp% zjo67JA|gyp*Wr!8+JTCeENX3j9)gUKeNQyJsRB&41^4(!BPXlWqK0?$nf!BUtQK;iik7`P30B6Ld_Gx{%DBi zr}J1tgJ&5T{Sb--zxKeSpx}8amBx&xd8&+n%!6OS916@bW1^#zl^^8i<;}gHkHz?F zCF0>Fm7_BpAms<;4WjNdow6u7!o)ta(wkWNFk*oskSZANh>i7^(*6;6isGqClxsDX zd??o6=I;1^mQR%5#Op^z_;ue(xzo>~DaB~u+Nc>I@I%ye91n`@+W1l4Id1RhFSVn1=^V@2qKz_>36%)Vd;@QRP0f>QQd0Ld6oI1&@}wX_~k zXI9R|6ul|G@eDm{75YsOjx~*V@?K|dy zh}o*6FwKAxagdH=p9MJW(90O;90z!)$)HPSF4>=e zC*o`kq@`2L$p4M_?ihPAYkQ%2-#{T$QwtBOG~YQEo~Kb70O$q?M+M2|zuVi)O z_3rL2!p|(-hme?ZU9dYEamf+#uA{r;6cjuPmcV?L_rV-3{rY-co;x+Mdx?Cq(9x;A zGTV~(O3T|q`J&Kw^YugaR(7HfHyHCIwSp1RiIJN9qyo%R?l-F~Xd6Bb9}daSulr8t zRI1bEuN&SLrbE!L_o}kwL)Uw1tjf=b_d|$TC8E7v%l}^4d~!H5C4)tknsxJj;w?f5 zB^=t|cm~#C`;Ce8cejEhQ@ie!1gp#(J#&_dY?W*wBqfW5G$8?#-LTbFlKO#Zc9q}D zL@@CXJQxnuP{?iglM!1}TjN|)+e#@Ply)SU+M)d=kc8v+DfE!%yWK7O)h;J5auakM zy3!-TqlJ}&`rbLlr2B3*edGC(`}t^P1BLzjtC^Xr?R!^FM=6aUx09z(bziHI?JBiK zp-zN3E?23gP2D6*}!+h>0FGf)tlRxuSLdQ|AJ>3~ zESpx_aG%`XPrXyKQ@PV_We5t*R?hS9Onjoct(43UNa8h9Mu;fM`HRKZ7Ed$ME+vQ`vZ>p`0?Y$?Uub{@Ry69GZB$6F{!F`)OVqJm6KO?SW&@_q5rBq{IRaP z*ryekT18%-FB{t3Lf!)kt_IWuBZY2DlQXA>WM|-CbVWqzwActT099q(kOKvd{DpWxp3lk#%vp97kC+0}oxf#%qj`&nB0z+z?-JE$%t z$q39&>8reDWxc=OsQW?gVkoJGIP=UPBb}^`D6k>RYKNt-B&wV!`uI=;+&v<h*vGzJiP7N?UupysqK=8)~<;D5ork)tbgRA^Q+t z6xf@#>h=n{R5JK4_J?|&1)`#QXS%)22IS&9Q>Hc!HWC))m&(2ruH2%c?UjM#Nb{xT zWna9<+}yy3vY4!}4sI6rfeZ~aG;}fjp=s@u1NE8^-z0qe?L|1|v&6e46GZ;t#Pyg~ zaI5U$OO`vFY-~buKMis9E8V6t0%KeF?wf&gpG`gP6ycSI#?gx) zfz$Xcx5p?AFXgm|j}!#3J5h;rshX&ow&xUD@qxl9c;U)C09G>00~1wlYZdt3^V9q=-HZ$f_w^rN{5k$(hO4NAVPG4Bd>acx2ZkFhD zJm(8&)&STId7pvhCr;t5!O%zYjddsap_V>d84=2qe51Rat+HFy%L%@B-)CjkIs=eU zIrV_9-K)yR_8~&N_Zd&N zFo>KN@ApFF^9j5_DX=h->HZGeZ_vB9m%EV)Sdl@^!642ttp%UPh*#2g>wBC@+%QT!zkxl&0*A<}+-Pf;b~xNA)2})x$ndx$!orxJpQn4jV`0wC z`qVz}>RMc|pf^X>9Vt`;froK%>x=Yx@`6fB5J$FEW0g#gd;{qH6hdw;lNI@(c(5=x z=h zu~ZN%^x@x4BK6*$%;>6XscG>TiOU~uH#p|i*XQ3W{_I>-1eOO$RKH|3#&!f?sf)zv z%YR<}ZYu%z68-M+puo{D4JEbd$sw{!3u_CfKj|z%7k%!w7YBu{6wt1Mh>5@MJFK+7TbqQ570~VNebfL=x0rA9r`L0t^Ckj_H$3c)nTeUNXH{k;JyuU^$?HdtIQ%6E zt!El8N)s=B^gNy^c{yHER1PG+;q*jxuyS^o9QAB&215j&myMGSpIZCR%L^}FA5Y;! z%nYI7D>qq|ftuBvT);y2e{h&-rx3V7vVyE^!((!pCoYaQt60RD^{$`xp^0-lo1AHY ziCt!W^Xw!MI!>ir{PL3@ZN-{-)!92ej}LvN@HTTxO6&nA!e^~BKlfh9$@xYYd0#M| zJV^5F4864UbxWd5pEPqjFF=h|7oR}_yOYimTviq=aj(@2lZ{xO?>K{5(=Pw?!%gB| z0%}jd_~8%bZv7kwX6R0e#5<^i2rh)#$Jwl3T(wLR`@X=wo~ z_hPjd^zt!p=04t3DU6%=^{Z?JQ@^TWbArun=Q8nPy&1eZePX>Q>mt|idZSfp%?D_N zY@mp%tUIFB&ioFmS3$w$ex@xeBjbCsF@485Z-6Q4FHhIDwrqh$OYK0P4oafmIFuY2 zbybe4&|F2uPEJm?jzO!}s&~tY9Soob0G@lj?Dk861ckU)2|RsgY8Jy&@|e>eyU_mV z*gAZ^brT4~b%zr*+w)Yve%>O2V>@h__^F%ET`$pniC{k=xQGUi!xsuRSinqY8tTpV zjy9~b=QARF;-AzfS2;K&=4EGh^}RdLhi_ciW>gIBO!4mt^W);;vQ@4QzmeHGvi%XT z@Pa1Wb)$St)aPh@d}v~VwBJ+4;JokDM|0T$!X^qH7Q zWZ8mu3Hq;>QTovOUguWhE?nF4r>8GrE$6vy{mIXcc9?P)^NzgXW=GZ3ggd|EC??iQ zX1jh1Xu2Q^oZbQ-`8R*A+qk|23euPE9}tkuIP9Q22BeKjY2l*KmpyUrb-hJ|R;3;6V!IjOc!a3`^yz<}*1yh7 zkXSzSO^c+kd|Bv4Jl3O$52WzSRHWu>bXK z5&rdW%M_9KQ2wt^2j17@)Uk8}@&EeQfseGCe)R<6Z~xPe|M$7TfB)^muyc+fqy10L z>-qp`!}v4BGDpcFG&$1`HHG2}=yPkX$Ih0v);iXf zFMQovtz{`FPTAS(8F?6~Kb5wEItyAJ-y`Vb?0Wn-g{*>)tEH8rwFlR8Yg>C4x$7I% z=<8heFXXNpimBgKcU7{svw!60ZmsL5p=agiXeIUHx`I5HtdBHkz}ecvlFP^0$pt3u zBX|9;cBR4J$Crh!bNzLThoju}zjew;U5iTz>Tb;?CMYIgbyq}~OF~LeSWHw(SojW? z$X(%kLc({2M5F|Sg{4I$q=m(~{{C|vyv_ZEjkL}~mA}6W{3mza&cnl1T1d#-+gs54 zo*>lSR!CS%N=oRih>(bg0JuW{=Ii2N=_B9*gxZ|unX+(69uMB$j8!ENLcW$khAmgxc<5u=AmQ#&u;w7yJ331uGT_2 z)-b52yA@au8}5HR4Cd~C|Dxj?L2slr-R;4mSUNp~T6sEKyLdc)D0dxvBlyDpg|v!< zgo?1Rgy>xfk-OrO!ordwB8pO?;-dE+-jx&+5xe`3HvZMK5)#59_a2Ded!VGEBrL3a zPx0XcVI?sY2{BQXhr)M76#wz;V;7i*rHhsIKi+E(-uw4wMgF(XN-McrTY5m<^`KCv ze^`K)9n=E~vxB;FDd~!H-BP!-vUfSYaQk?H{x;r+*6#LR)-P1tq0U@?&9Jonzv#ik zyW$VTM5L6IMU_QC?}eoviYu!~stBt*kW>+u5Ej1v_h(=Hi&^{ovk(72pA`a~5jr-H z|H)kbaS7Pq@t^-;{NSJe*gn=SV9&UN&5`ds;6ZWXvBTqsih4eyYZKJT{R^lg{Jmo50Y7YCp0qzyN4c0m>4CEmASEl zP2Kk1+1TvV@x@RI8VZX06qMlN2}bZic^`Z*Qk?itU*w`VNkQ@T{qKl}*UhLv%ObC7 zxj<9@ca8q__{-xiQk*<)jpilz`0GvorHlXU%-Uo3>mO+h!7#s`{dV&I$16{d9p7|DNq?*BQ&|70JEViq1= zKVJx}>;BaTRKQ06FK76#$Nx_jU#&}VgA%;*^EYz*MKXGzzQv-xC2X3zK@6D8Fn3dM zbXyx7%#FyF{&W?Xp0$0w6CE04`J{I6eNjuh%@OBuf0d3m*1v7e$Yt~Y{WJ5IgCO($ zcWobnbL)STN0~0?;k^*y$^=%kjgjvq`1N1*h5wV+`&Zldi6TRrp7)LZ|q&CvGd-({D#xc?2Sd8_*W&?s4a!SxKqnnwSZIJA_&<#+qk z#}Voo108&!Ew;o?)WNjOsd#+cOj)75t*vZxq21KWtIT<#Dwd1p*u(e-zh&YlA{__w zixckIj=sM-H4HAuu3@V;;09S5>@vHcs=P6Hs)~Cx^$a*`bmF}^D zdlTim>(v{>Ya=Cc<2kduxilIHA|nn1x%RfnZkYplhTZ36arfIhBTp;3aw{?(TcDRW ztrHWUUQt^t{}||x96>!*@!q8Tg?VUYhV z4xL;BLG2{h%Za;$h57kmdD5B{zhPmirour#zdt1C0OdSZ)_Lk%oHt$Ga*j@RwC~p9 zNWO8&+83*+;uuXA2i{blGcj>g>T=ow3rbzI5@UmZtqEaIoQW**Qc?O+(=lQfQ{B2GQ zzcOaN%;FjKp7b3HK?IM5(X;03WIQR`oAih7EloHgYio1~Nzgj{+i6}zfD>;@|F1+b znWiJ>Ih9@NlfY;H6r>BxC9D`mI`2=1Fvup~{$2n)R+{oJjn_{7C0jWr6TTz4F1;piyQu2G0MFEn|RE=k1t zZD*3iRJAA5pk4z1`v<8`qopHY$a6tmU0pvqlgfQEwA9eV>g-^%y1Q8)vbzhovIS?A z-(4Q*&(RHxewMBhDSJai^=}LK9M{Joe^BKzAr1MIB8d-7QV4>(3t3dO2*nh&8xGXR z@*Da*(%mV9Ep^oe$l7#VISLpnTOe{MgjPN>C|g)`;U{pGa?z|RsWtkML+O}Dzdw#y z+wRjWKTXeadJoygrbzK8sCvo|Q-BDDFwE*u+$wO5n#$EroZCz3#*=2kIc2wRzhN49 z^KCjS$k6I{Z-$!l)}p#s!x{B_rEssoGG~8C9TOGG_U8L?VXKx=|BX6Z;di4asM(&8 zu!aLia`5MmZ14+H<6L?!B_=3`kr7*jvnOV7i-duX^3qUP|9KAVOs7?$Wn&DAE@4ne zwgdJR3(vfBw?#-nfBMoneSvPOAs#Xcru_npTz0y?;K@fA`C+~GD``hfA7}2^zYw(<`vOYzIl=@P#YekK{@`je%8!XD{-C3`C)f1Cn0DpmE5p(ci z{M$=kil|+Cv_;fIkqC1+tx|AW2+<#V#Q(M-v0-qw>7AUB{Rqmm+{LR$nR!f+n*H-x zublSs;&dYzUiTiHO&qrLdRCU+ZbABJ4ne$AQ!}mLa&wVu~ z%P&15F7#cs0tMON6qor=3fk9o+fwk0&TXG_#BHM%3C=j{@!3T}=#0b24{Hm2o@sfV z=W2hCU>)It4DRQtzLQ2K75q2Jp$G+3Re86(zyHp96Eg(Y1qnQK%`w(jqpBzGJ*Ll| zVXNna6DH#`Js+CK+*DtikI~$5^PGvX0mmcJ}J?xt8d?1Ah~p^?{Oj z=W}pm#tef3`6nbk_-prhJ!O$bt8f_QPR(Lhiq$*jqj{$8O!cIZGrY;uB#s1bnrG2O zsJz-wic3)qQgG>XL;uxFEk#|}q2FFzy_i@y2)R89T3DbcJ^-8ah6;kk-54QT`QoSm-IUC3R>~G!p zK8mH<-CP}~qP8pK3p1MCLILkT#HCZ8z49!Ow7a7K@#qOv#8poUR?dH#?}a)1d7nYq zn!m=@{$zgm%v{S@ws!hj2*cc*RVhTvpF-_|PNP(?DraEn!MZnk>s7DA3+)VTCdFe^ zHY^YVk!;bd*MyNXpC+u;Yg($mDk_qKTP_teSK0-%MJpUGTRv(}W0&!IV!A3|-}vy* z^w)*<#+;O(c_DA&XP2PQz zRR6<$pCR1$$8b3hkw@-l)rGswEj88VSUA&5!o+?NKPa8UW6~TO2v?31f@)=)u20|B z1u;hh(k*5&$&N4h0+22=g+Sb3WIbWM4F2Rf=5wwtJ!u*2KGP>MXyH^1kn4mTMeh8? zoLLFGKNS8mq0G+fgUiFSADkEp|USVF;sV!oBqqAWG=p-wDt^-#^mSnJBi!)d~UvI+WrO^W7q9T^jA5 zx<39(Ddn}Z%w70Av&v8U`4!$D_YCjq4JSxIEf_h5jDQ;~@ZWP>3#Jo%)P;}vbZ5`z zY!I#WsM;4A_&uABqHjv!qp#1*IXAsssEfvd3D}L1zVx6EW+ghe6lvTh{($oiyPCy2 z=la0wijw^CF>^x;xW;IluF7IZf)#K!uMMxp3y?-2rjj*PMHm(@dd%7RkrG?dODC%O zJ`I`9ytlcRfM@^dLOQ%p#W=k603zA0c|xTV)VB51e0M;oIABKe2=YqMiO!dVEw6n?*cm$Nc6a|#U|wBTkEw2^HrT`L zRe(JlZcrE?rI2yMDeQLc^=wT3Ps48yl%bcUR=&s7TsO*Sv*;vNVy*H39IkQ>!jr4G8z?E@NZA(Qd)D@!a`;R=Oi5ZA01nO zQ|qTDMVt(uPsiNa&r=L#LTGY>%zM;Y-gNHjG)T*2r&Bx)V3%4w1u5`R`&P$vo^gpOpGFnR zZp>Vc?m?AafyqEf2^^xQui32_oxb$_bd0WsRFj6}%)>GNjoM(+U+Zy+A_VdJ%*&rp zvn#=a1*Xucz<7xk%~$E)VdPR?jZ?`eGcz#gW#`iFs${X&oeHG z3&b~xBAZvFZeLoJy0yGI1Twy1^8Qwh@r%C9&bp04?~Td2hxs3PXy3$SX`q6r>NgV3 zbo)?k{b)BaiRO?ySe8`#b%&}}Zw8b9g(ld6>ni7XP)AHUHa%KiG?t0!ZA`Ro2b&`D z>1obz4!`V_z}*oG{QDw|(VBSz(kQ2q)ob}yExYn9noCnefvxTV{!mwj=MFel`G7Co(|s@l zoZ~p*;YQ-XeuK2F&rCyTU4PzBpXpcB`xG{{sTVb6TjOn+^mYQa{c8`$$FqgbcPEPV z$%AQR2(wM`ESqp^VYd*j*_%Y~r#`@5bDGFR?W_-s?Jb6Wb9PLt=N7wRyLzjTQPzTB z(i|N$s`CDdeay|k`A%+XHlMH2=rjCq<;MtapUh*_L+$FA1K;079PBK^R;DohQqBC~ zRdV-EgOR=x;UM=e5dvrY$(IWCGII5DZotTV!_AQx=R-1;#lFLM#YfNOKdpr|I{xI` zn^0CY<5dB5LOUn9v<14otS#<7PeWSC;_(6)XDq=sbww?QR(&eysKC32?{)5K)-%Ff zG+h81VYe|3(#8$*pVFQW+ket3r#XIWj&fgUqu!fxf&>W5RosN|@V(|g5C@^VB*~?2 zBr%l@Nmy`*&{z9K+i*2EJwf9}&r%=ZOA(#1qJ~;)V>o@u;~3ukom~CAxFB;6^>?N> z88jJs)_wvIHMTmC_i4an0urqY0H@>N+NC3+ow1pvoLLt&$W^sef*}D>Q*|7ar3jG5 z-Bx@=992@R;4QdC%S5Z0n3Kh43No;K$DwsEd=vA&`*#Hm(M3gf|6s&x((pV6iT*Le ztum}T*F4$~`fhD`6ou_rwDmPCP$|gXGEf^zY|QF1tv#*JfnqLFi9D$NkyW?=Ac@a2 zou%SKbv0xzV_18-CB=BDZ;U!(w~|^ztSA{kJdh6`OmU<=NMh=G&O-ygJtGuLT|Zsi zC>M+g#$?-^_q?bHP%Q*q72jAaqbxAB3R@AcIwvKy(0j6!FJkmmPIs1N-|Ef5pZ2w0 zwc-adipMZuIAkT#LhTDJlolStt62t86>;Gfr2D9weZp%P`Lck?{6Hqih=zBD_Dbml zC8y#cTPGu`Y|4em8K)H@VOPbU&Y7kDK)_9$!r8sPq`0@`)FZ?FGce(ta9o0~e%?Ck z>!dm7mENYZ7p)f{Wd>Zm;U`x|<;5rOuoESDX8S zaq%fBR!fMWS39c%eMvHx&dL#TwhXq8XwRtgoC(UYlwEsqj{1pX#jgK`X6fMpai61} zmZ^;d2e=xGjf=ZW!#B@I7Iz%%KUGk-PV@(07bHLaM$7G@Et)g8IaZUKqe4feNTsSz>FG};M{hsauIn>^+9&2A??@y% z+9D48F(W1MDSoT=^-K9|4Dbj(Gwp#Ny|2+H74OCd z(4VcHCKarF#`dg1u3k?gv@bJ@V4)HUzDf`Vyao-qIRwGN)_=Chck3oZMZXE!m0UT= zWAX_=os+p~IU<+4@QxEzD08mle<(h@Ywo}n9?tgd@su}r3+f}>#2g`#pXRu+aUD=)tOR=u|>h7&;s}AgP5wPV` zgv0w-JU=HT@?N)-i+Q!zR$yrE=eD>DU87@%xOfiA#-A3&4`e?(CLA6eZgKj%Z!dGv zz-Ny#7f5M~G-20J6_$O(KbU-dj1~whQoo2Lh3tRxI#WhCUCBTGd&C`#te(AQLKH+- zlCPCbp%(9GY*hc~+Bf(C(Q828a0~=$V;@{Q^Wj^%mm>h;Ijj?|)4;j08Sxg|asei3 zdN`TouctzmirQ?tQx{Y-Rc_yvARJ2YQn7Ar*21Botq%~A%TA_lbH8tcBqYMuJbx;FtUYT z2<@aPxAWQ1bw~OVCF(Wn=?T}3%-m9Jmz$ZHzow<&jtkhLC5^;Ry@VDK0 zwaH`B1a588tg8>*-(&(5&=epJYB4j9pGdc8GVyleb$Rpo9u%0M@O?6+{U&xeeoI2T zXcrIMV1ts=JZ(Cw%OcWQn<7QV+klZKp0KfVHP4`65vla;##y=5*#V^Vs`?3SMJ;`> zq?d2(5p(>qNh@9~8U=+*Dd+XrO_Q!e|X^-oP=c!&{H>fKo=xfJb$5Rm(5|gG;Tuww*I~7 z-809$(y;pXZoFw64Sd5FrfSeu@v&h&?<->$UKbYL5EI1;Qm|TTH16S9g^T4yzjU4+ zM~enIxTd^RTcb_L>B#)YF);xi?_Kh)z6OyZC0x{VjUy;P4iaXN_2cx@ywxRJ{LKf? zu270$G!?bfTEf|M`XKLYP6{5{7Z;eYGr);tlU3|+aY%Gt1odckH=f@mdaCPeP)1c{ zbZ-PgIsXG9g&iGd(tEUlKIp7FTvcQ6uR6W@d%b7Q5Bb5tU=~njD?^Xdp`wDkY&Xm= znM(+iW27C1J!<`SWR3WJ?)^oe5Mqz96j-+f`Ie3J=$rc%3I|EM?o6XOiAI8Yl6u^~ zL3Sc1o9r_iF**KC4nEU*2`^xyd?WUH1EgLG4k79wyD;W8MyHaa_wHt{rkzX;R&RP6 zi!JGv-yI32MKJLj;1=lxH2J1imdm7IHvZGvGy0lbrLa?|F&#Fz%uI{DR=-Xcj2uw|Ho7K4G31dllZURAu^{^9--q8wn9Vc@u@m8$h8bRP|Jpl4NnF0)_~Ibj`cUc?pKV~`Ut z#RH=}&I=&d2%#W_o!@KaMG#Z(Mn2VE$OJjM(@iw&7!%xh;JeSY6w zqx>38F4tgRN-OabtMMJLaI>)1+slbE*3Itwl+ndHc!o_scWvRDx<7Le8L!IVLn};s zomK$l$jLsQl}XJk;M|=gF|>EEvh!K9qfhs@wmxj3Z9$%-IZ?6%aji4=c4k1@gz_dW zzn^ketY{sLVk}V$M(}88o~b*x!1q}#Dx$};=k8ivAm^6jNVfJVOy81M^>i@Zr*t2k zy`50S^#MZ&N->0bWd3nXfK6IlyQe^d;&7;T_TVP6aOIfM0^HJ8p(P+(KrE?#1Yq=x z`a}^+Kt2zoR?)D~Ea!KjMNd*ia7vVuX{}%6020z&SiN4wC2RJDZAoWd2kJn{_o83T zVL;QL42as*NIHjgt!1rP?Nd?uIej9?-PIL&lT^L0`aD|K3}$WwaL`_*_7t~ z))w+LS1b3lpz(!`!vV|?O8b$HtL(yO-TXaziBaRuB;LK&+k^!_-A1p|ICDm_tPd5^ z7?~B2HY)*LH)ECY%BN=&z2(yh1I+a5Fy|40*U{HrP3GCrsZW*yVjn`)MlBi5m?+Bt zyy*kco-yF)=}t+oC;QIE*ag)QCKYZ^kB-zjLE2gABcmZh2*3Wvl`E%dUQ*tF#v5MO zF9m1Ok@elYlqBXDXV|8D4zPtd(d6UjCNrZSo@@f_`;m5i3U}NhMDe)4#}6d+55N z)84Gg?x}|(GnDObE$s`tCSrKilf+6mhIWeXbxCsjUM>zsL_ZyQ^?aZ(o4mjOtKQKd zRzq~l_1Bx3`WBib31}U=|C+GZT%^S4K!FKQ2t=En!*4vh`%1@;yOQKF*?Zged%zc$FsNfGIkVI4yf3cmgd*>LQa=P%o_ohI9<7dxf&)Km_kj@Vh6Z% z+QJ1*ivsLmK@xz_;+6fTX12&wkHg!qq{Ahhu4|)qzy>%|XQO#jL!q@SFyxu}wVr3X z{ZhYX*c7Si32gP5gBAEQt(N1oZ{J6s0J+DLYhYh??$QE^Jc}=WQm=$eUjxXk%dda! zC@!0-N#SS?@H&=s%GtFT*7?Gm(4Jh*oEZ1Ct(*|YkF=`vPXF8e|R%f(W&n&(aK8Cu9~ z6m;sCF?_Bt@+$;!^0_EVr}98Q2f{}VRVy9M`Vzy=@Fa0a(g*i-+UgDU7yxm`@m(ne zfC@F>mbH~4{1&ij9YohD%a+weyMI!2b;hCmTT|i0+sF>S3Vr(EXA2L%@H_ZQjzhD@ z2J(I1qH~(k9kiW$l8T1-8lt3!L93r+w=KmIa2Vc5mRXGg4#>k2N@v0V$6Jt z*d4R~{7z$I*cK7k7p%JC{`8J<<`d4P%~<-Y7l1)H4A4TS|NOoj`c#1b5ZCBk$Cgj= z4Gqd)bL71#IIBV+x6|Y!cG`juc?SVimsgGSsf$ia#Q zF}2#9V}Q@l(Lt7u!(4@H=)}`{8GioR#_V>UIP;~h6x)!~=Wr_Y0@ethG!|H4v6u6h zuf8D1@@z^Mk1zRxHR%OKr{iVcnb4(L6jsg0Db%yjRq;v26GbLRm63$_+LN?0>$_q=E%i`Z_9URGgTlCoL{sB~lm9v$o*vTd`7sjdG}V%S=k z1cjinj)W;vZ&C1vIQK2Sr1P8)3;JY5e;JuKjxtLI5=9x{w9J61Eafk(5D}7eh(cuK zZyvVI2=%EmksIzppXed$ zJGgc>i!p23u%826q;rwOJ5$2A6A#eTJ9GEP@8&ts>~wI;JvZ_mByc~Lo>RC3>_QCv znbE1CeB*lx&Pw#RS(ehad_57T&Po1emAEWqF>fh&Hf;vh>!@d~d6X$=A@=%(^#b7n zvI{?8rXWCv@yt2@0I}tbCZ!-;+$MdOcx3d;T{?H#^hF-d`@6{q5U}@~gq-B@Zh{L9 z8Iw}tE^9{qHIN{r1Bdr`u~!Sbw@G`Pz;S)Kl`9StYsf#~4$J?nSybfsy~VKP(Xe?T zr-%i7-+E(hP|LZNLtrb;BkJoql4KV({g^jp&AgE)Zym)2^7gjZU=vJ=iZuc{UF|!q z43YGy6aS6~{QiD!nmZPiIOko5MO-=aBYj3lj1YLwDvX}3|WK|*}Jp*yQ2|MJ{8XA}gw*uhEegmjO^GhgI(Zs@YX?f}O5ZS+McQ1A)}Lgc>B zwOc)d*^Wr9^&3gBJrp#)3g-U(LP}%*fCp2fU0;^O9bG!^tc|4PE44oj@$#yiuX!M_ zmE)VPlkwI zC9##O)0F+3O-ZehdJYu4+w*C-s64)c5al?*0T#QAJR!?d&eHmB>U zIX{{4nf-VXA+(k2p7Zvre8ZEkyZ2Y?a%t=t=A_U^wfbk42s~AOeJrwG)wnFxD4&cw zQY}IRX@;vJzg5n1&RjEET3$r~UBb-*lcZ5&)77O9mR-l-C#U;%oYAL20%9}bYq?)1 zi$8Y2(5WNFYHiCNLE8JYTe^xdPm~Ilj(iwv9jd6`uyb(gm|w_Tjuc^YPBZqrXA>}I zUP}w-LCi64t$tO>SXS2=D9=M0;Ho-&9K zKf82WI_S_09m)5_F9c~?o@(e{M_QKwB9R;gTh8anSM)DNQTAZ;AL%I<85A@IG$RtF zOKr7C=wq!wB-QBL5T8#VvxUdUDS0tM>^9XQ%S4^8YQX}PLJCs$*)$ich|h=UJp2BN zkA{w8W%hI2+9FhFEdAFW9Z~75(`ZV(zzM z-8vS3i-7$_Q6V=YbQZqqE*O82VT+bYnZ4 zg&8QX8RFBr^4XS_Y!PzDz3$-{t7d@h0;Y$uMPZcsj|~7Vh4Cj&J~&`}NJ9zoSQpKi zTM`m1HD~0pGnyMoIrRb;6+T`QZrR8}z&Fp0+*H>ni(;1{01FhAi}-9H=C(WUerwg@TJjI-;HX zHeZCC-YKx}voSz9=m!M|tT-SL9QrMlw<&UC3_Dr<4Qt!Z)Dh=|I)L&oF46q(#x_K_cG-KdooqYY+kCijGdm7=Rkb;m1C)#`mJk$=oeH9 zSM+kPAZb=9Kj1Ik90qmBz<~FMdtcj9;a_j%J4&*J_7|9XBh$h{nvPNZ#HWT=C;QW* z537e4CXcl|2B@`x?4C1qW&*>y) zyT1rGf(k|7L#q~f3nsmbEkCT=gNMYpi+`~y6bk0USA=I_2jc!eWw!sA7-V%7*CQl= z5QlSQZ3IT{XJ8-6bQ1%Nq>Fn|sbO&N&#$~!$D)`k_*H5_9i1-Pi3Cb?R?Y8GhX)+x zJZka8ANv5ws#b6Js>wZS;eXyUyJs7>iy_fT1UMP;{P>VG@1P06$>|h7m}FDL3Joy2 zMJn`KJQASCgufvVJq{XVV5mwpkso4UeE;Tz*Ac~+MzQ*%9R;L6VhI)bGj8l;0qe^>+CQW}VK=CefEeh6Zad(cZr5#-|$e4kA<95yU zKS_Av4(nRQT-4T|+ytl5p-hQI;27@EyxGELr#p-R%H%n}!JWNYczgWO8d7X+TQ63V zb95=|$zqx^-9hoT)FlEa1ukrn8!~XNXYO8r#7`D9A_^ay;82>_D1eEyh7g9hwatUb(#~?EZ4p}rYKA|O{vaaq-jj}Na3|b@tfzqG5yQj zxAsyJeMzy08b_J9exT^!Vw?CZyMg-Ss?#7bi^KQ7k_jZni~Hd21ONYq3EL^NHx3Ih zHi(t$oJo=oOf)nQ{cik9qrG-j&!Wbs82vc>9#Id}DqylSg23qG2xRHVWi9U?iPCzO z{q8Bv6U*`}OTC5W{xVC+Fp<+}ENxXa7df<(H+MJmghl%n@a9D`jo~Cm=i#D{6TU6x z@?9AwZD*T59p6eo*W;MG=q?3DN91-8Enm#PvD~c>=QPHqN0pXgM@LG#v-bC*avO`! zTG`ORkNHFj{Ut|Ty0Bt~k-b#RvGNR2FVoRr)w?5tjX?LLo)fK9{0xf{g zJqx&-vX&(7==>D6Chbah9>}ELvhLmfkM1mcX(gfh2@w+Bzm|wA+-y$@#*ikcUWa~3 zu92DxsRMa#Vyo-)sy|=Q!Y!w7;c4eIMoIcc<)RKVD`gKU`Ye-I$sJ_2t=Xngex{AZ##OxPI$A7YsokMw86S05omt#t(=T^1)^v z)0s@_d#W{Ncyd4i-z!Jc1!za$pyw5}1`=F9ziTiDl|hNarLAs-DS&jH1WZaF$!DeQ zI>y>b-Baov9^nmmI1riwO>Q5b7GvO${7vLtBBZ<+qJ#)V&Ysy5YQE6PUd--$j_0gN zkC8p6)sQF2h88{|HDYk>{2|loB%H)fT2kOFWsoQQOtLE6@U4~bv>X3$`Vr=irGDo- zmbd4QC&1=*QI3g0&U0l1L)Jw(k5v^k{9sKpsH(9#3|fhbM%ho?Jv3t@d?QP zI%$-`&Ydf?4l=E_DG+n$|IGmuI}D4KxUJ@>Uoc`uB|Is3|o&3#AdQWOU0eX_Wz9I9-;cD_jZOLV_y|Rg8vY*kH$C; zan#idaY@()x~;|4+xf4}%T{Szw9s{OglUBWt1OM(`DI=#P-fDfoR>J(c1^oE++1Sj z`?;dWz>dvq{tUQLV=UL%!wS2Poe5&?ZPd_BTOf!UtTpw9tkUPq8tN^TC}d$fTxFz} zgbJQya1$@Ik8+T04xe$Wyf3PY-rWg&U!_q#?)R=6PgkuQ_|xr>A^V22ucSYCg#6gBfLoMZDXL_?#@ystKCr*1~YalE2<%ElfSh;r$yns;@zDy2IH zq9^rbJXBVDt=k185;6K86b|v4gMu^xO5qIUpf+lZ;G)^Z9KAj+rH+TM+S=&l^hAtVReSkwP9hn3ub$z4+u}r zZMzsyaSJf;|FJ)_QBZye^ngP6TDKrV-sNGKaJ zld8Me?D@WlO?QH`Rcb&lQGWM}fccMpP=t3ZpE^`^9QhFn9F$x^6;l{`_?&F`g{-RK z_3|a5BlU)J_%?XkyL}zvvD7r0jDc{Fzblcvyi5^e`S=K4B0}tj|G?@1{$5P`f)A7U zA_wdtU95hwGVqPP0F!-`^#qes~r+W_3K$A7#QkxN-;#pj^TZ8#Ph4 zzmZosng5G{`QlC4Ig;iSoaEfz6-7ws8lC+EC=_(T14J1;fmP{w<;2nrliRGXfD-4` zlyt4VYH-oz$D;anqQK&q3j5EK0m~+Y>95QK+*U)_xvNfcer8Z6{VlTdbb39dTpunU_8zhw$p{SiGUjX5uMQw>8Dw#qj#I@Y6RVK2rZTzGu)m5aX83nWn%ZVHgae_i{9CVYDCwMj2EPM2}>eCJ}G zR&g4;JMPtPJeu6Z?{PpFgh?_(nwW2maRxhXci$GV?_S*8QtCX`)dkJ~0O8L}uY3OImbcDJ+40z%L!Ko< zPM*a1U_DFryLQhQzlZyj!_vbd*HZo0@fUB4evq`nl?I0E?G6ki) zg(qW0Zs|ej>?c=xUgCbiA~N6*6|0r*_u7BC$3C8Ji9f6_Mw9#lPERbVvpU=3zCCGE zq~>%w+EO@jWCzvWtdI}le%p5bD^2nFmg!-GTf|f^&%C_A)USwN-@Yz(UcpnJnfjG} zdFs>^ue!F(&Lk%wWZvBfIvTS$JK3M7H_~4HrrKlWInW>({Aj3_WAozMem^G z%O`9ELU0D4p!dt&w4=ar3DrdTUyM3gw68oFYvFK@IE>+%IY$A+RoM% z_xa6;8AK(C+5PzmSTHLA6SG;xqJVuiBt@*6XvA-sjT$SEF1+Dv$%q8W?+l<9{F;OU zyi86`esng@pbfGg%DAM~Zi!Qq`r!;XPN(UgigidRcGMG4hJg4wYhjf%FXHvF9?Be! zPUE-{mp{08kmWJ^i(&0!&{2D8;G(fYz4Ac0MXjIjbc~u%bw?Njr)3B=Ls_AD)#x0r zoJ;w5K#4i1Xu})AoF;$p6pJP?S2P@avcU5*LqGRO4IKH-DeU5u82qQlZ4tF{1R#0o z)R4S3IgqEVGFrVl7ot;#w91(g@?@|cg}3z|ymUHw97~M91^RP57y0$|LJDlaSxWj)cWPhDb6-_SgEd@eJR$Z)u&=zoA3 zIuNe*#5fFD05K^LNwuop_IL@qog0*qx)pzxipTlUBfT7*L>Zf|M0>#A7pZb$F_F|e zn4$797mQWBxtH(e4l^s+%Z4!a%8`ko%*3ygq`6GZ`Sk1q68hi<^U8Qm$W_{0p zI|T&e^F#Zij!3-VHt;|mpLZ~Gw(|ZcDS+M84=f@U4;VkPY|b9Bsl(;$C_n-5{>Uev zrM_Ghk{hR|hu5xT zCaukBX8N6aee%WLx;c;vOxE2=JbV2%?3DM5hmUd^ro8TuR(<2tk{{oJEp`-xgG;?3 zQBlRZhR8USP#xjZi+c|vl$w#UOF~W-XX5=9fa1R7@POI}7F7zJ>T;>vzbtcG8z19J z@Tyr&#Hf|4QcW>T%JzQ?iDZ#$JKP6}9$0s;ww$a{XP{qymd|yC!>cl{}4v8 zrhTI5#@w}+a_Wz5W_greqM21_JL&iN4RV5Z7wV_g0~(vv>z15BBF5pVhn=P;pU1#E zJ;ihm|1^l2i|OiZ~T~i1t|{krETjYI9Z5 z8n1n8APT^plz*z%WP0Jb(>ChqcwkpU5OJGiL%TvCCZ9FCQl91znnaFFXM=>B%*uR3 z&mDO;k!W$OG%w9ge(t0&`q9r=x1xN#_<@K{UHRZi%e#kpESx`J?g8C{RntmL^`j`q zu|`G4wO-UaP!MdJq&pd!YaMief#h4ax39JFBTE5cA-iu=CveoeA*8?0zwjmAH3~wI z1tm>PND(zdR5#x7&)3w01))>5X&D!vK4B)qLve=Bpx>J-U+|i8ULyC`Y_8@ZN5Xc1 z%8c=k-|nh?R*IiVz|#+P2E?3e+Lm;zp$*zHaJfdV3eP-e{S3hhFCx5RZzHH2xRv2y zVXL(qye3K8Tc~#XM>K`svCMp|Ou(yCY@)yr$(rvrr*c@iBbTv0h3k(lrHH?9*zhE+ z?mVq%z%QLWs%9NOr3O+KXEF704PiyQrx9`|dFa#SOKCjq+Br=14ep5sJ9Xsq)21`kdJe$>QaD)Agnu>*KZiYdQwb=h>y`0cA=Aebp-ku-_v?RTMl~O~Dar7{P{5c0s8+s} z+Z|5lAaA1#@1qx4u-&pezE0+u+OqarxmyFX+gG$VD5q9qE%Y^+C^u>_g6*^%;Pl(! zO8b)khJKT@=i0JjiDF3Dp$}~!IG}^G;i5v%HXsx%L=(qPeVN3vs>PkqZG^0bM)Xjg z1exd$?hSQel*1R0+KEKIy?w(YyIS`sZEj55dDKa&J}Gd=L2RvT?9dLN$^O(JJQb^i z*Lw*%yT=udHHdnrmmiFIuVwH4#xnbQe?6bN$ zKw(RTKG@AO+1|Om`*^KETPQ*<$oO`>W~@Z#vw*eYI(ef?os2dPvfuXdjB0i$6WTS% z=FXH=Mt6RfmVkk^r1j$5sF))V{X@#HDN&DQAp+Jqg{4nq0EN_{&uCwk96U*);OTqY zi0@SBv<3t?E@7`fU^JSY)c=7)ZN#4ztnTLoiZ2^q!`?%~fI_vn)Zxi>nlQC6)AA7@ zhbPYg`5r+ACr8n|cOn*hS#18BfxkOO!z?xOled{I|!_ zvcWs7cb~na=SY@l*_iZ4?o2atsK&4OVK;GxpTRPVutnru=`j7fX*YM zR#66l%lyRGZ-Zxqw(iy!eaebqi9?#LDB>2Apk@5Xng)>lN-=PIPk6@fV8@1BYVayh zY02Y5d%@34N*>uaLc+9#EMxhcliNEIIEci(4Nl5<)MOxWIz++<$QT2RJbM)P4QYau zW$h%pGR&?MTKzZB8(D?fV+JrXh_$n}vP+yx7x>p4&8A1Q)-2C1osQE)%< z=sZ!gKI&NDSYFuLqrj4oelsn34Zx_g35k-=TN_`#OWcYdRbp2Y5Bx5>REmqwIsNo+ z!JhUtNA6pTUG;+X7w1l2JuRWyH}xWLTs4g^d&@Om2x3Xi;qh`}G%Ff$GEJL1T48c3 z&6gnqvC%&>CF}3;4pq zJcaE_FDh@RrcQMe4-S%W2ITJqrsHw!{IXU$=2WWiYQ*9)Bja5mMjm!E^8rfMo-&f78gS53z> zK+Mzi8jMEuaxk4UI#*xq649&N1+rnL@fy816*NWM*??+BvMvR=j1?9jIzFgC?##;`dHE-G)%SRbNbY$*1Lz$9#?)!{}U&Gh~MDX^U64hlNE2| zoI^w7$umNYgqV|x*WJ*Ma54hSxk`HGW#A0St~Q_dq+2-3rLVbJR;mq zs~q!{NKpnLpP9aRi)PU;-v0ZShl@L@0iaYdE(}f>Z>XelzSio*`-7@LU=&31r*Ao3 z5RXq0SFfp;Mj22Gc5?VFUn8N9{3m{de8_|)j)8-Rykb(fv8V-s@MhY;nws-MGe~@q z(YFUp^Qo=)i_N6-KH#*riYx)OF%3J_IGr^&+TbS0k~23@^Lbx5r@bqoDlk0<5>2)x z-Bj}_1`KHNJjJrn@yrw(N>N_NZuoZLn1s~=^7V|+|KRB?{OSJR zxQ}7FyJJjE8>SgHOm}y8_YuP|HElS$r@K3*yE~3w z{3V+KdXD}!0)hH2Jt98^_iIHEBk!S@)S_#^lo^oX_4nR;l`QW9?k*0f4H|qEKh5H-)w~hEp);khPLmhw^G2z5(Kwgx0>pH{=2$Q=Ds)0&YBGe4Fl(c!B0%E~} zo|8^KGUn+F4T^35C}961)<5}Ti1U;1WhZaMWIMr}ClX;@o}`J#>;fCb^7ieX=Us9Qz#T9R@4Vw5ggwvX8^Yw{p&IhX$J(91)D4hPIc{Bq$m;Sf+%=H+f}VixS9^W;gz>j4>`Nys zScK?Rmq|Z5#n~wEf#E-`tK(_IuMtQ%Kh?S}RvH9kMoVV*whbOwgNh5;CLvirf04bQ zQH^RIU#2eX>v==#+IhrOdyOi(15p1P$1{=R5!TMJ7_(V2WZYPV!3?(7d#8VeW$p#g zzl2l7IHF4qxa!r=9Y9Vuyl2N3=ur5pfK+V^72n_Uhnw|#@6DkKt4YJaq$Qx)vx6a?2l?ycfCGeP|=|WV71vnS$jf@4x9o$G}*5oV2YLv8U#MbC`VFBn(_}~Gc!4%e`@$&Zo;2W5pM(m&~;yp2tU?8^R$nrV~7=K?B>@BVuQR4ZMn+ zes~X$;1|Ni4zH~5`h(~8J zkvzOBjj*ANs$pCLXD)&Xu@jIpfe`5ILcI>ph5tfB%YQ8!V2O`>ovWA@*#CWvJLL zcYC!AVZ#HG1#mxvjj#fr?-oyCHyoE1=Hoc(78-u2)Sz}SHQ+EwO!3u12J;8{%Chah zje==3x8t%h&$nX4kRctwkQTW!GQ~*bFJ##5CycJ&CR<-i8SfR(EZZ1xXRK!x~LQaTHA}snmngOJkKbh^mlhJq9mW7 z9xriXx?!&S{=8%0SAVZdMuT-K|4aB)K*?yQHGh~Cdm8IGUvJZkCi-w%Gelhn{|v4s zcWNIAoy6qtSE59f?K)jTrEasFljojGx_sylb$i#WROztR{=rA|f+1CZ$INNN{|1ws z&$s^B2`6*Y_sIeK)2G&Nyg&2^dz~{!Q^tQg>=t2C<)~jpOQT~g#qN_+<71&t3LGpUm#&D_gVIm?o;E!sm@*;Y16Mo^i%@IKQy z?=|aQDrK+27Oo46B}n}1tgK28+bfXxy42!qGbb5OxOnjeW*O6+4J~d5(2AD-;#~rG zS?~4RJSnlGShfDtH=Hc4{)g89JzaDy7ci@ZR70)w@Y^F<*La-*i?k5u+i}7nbMz27 zcX+dD1H2d0RooZV{P@;9zGx>ioV}eM&e504h?_t1sqCIW^SuO6DNd6+J0+_ z(^m+LP(@9{tV)bvb?(<-Fw0DK$z77zH|H2wD%5kCAjy+V(Z(XdGp%<#X;yl z8_5yRO+{MtHF|j0&ixZ1;R}J~==<1+S&A+oKDc32oWeJnI$5*uXGI$jPM?{C!^p4$ zdm5sUyB-Bn`#oZ0`eIi?zLEK0gMH@YUEE$wr`uT!iX1oRQd6lu;y-tW0ihKzy%|(K z-Aj9^wlcPT7BY8z0k~cr27i)zj&TiX-yB%!03oVhLl+PKD1q!~wO>THf^6y8o*;IJlgUoxdK$q>yLK!!k5$zTIzl7^zcNyv61f$>i41Fa-rg?V}+?U^sv zXaH=)$W=AJ`GDMf;DjrVApuTb{K2k1ou)lBny>_#95`Y0=wN0OLtdj@#1oiU#fy8< z_Z*VKl|-cRFne+P*bpP0EE?9a_fHuOduD(139@(wj5>Ip?pK}u0RJ|Cx9Do3j}x9@ z0a7}vI4J)a!Ixt2jk)|@xPh0r*n(jFOb;+)-oDgmUxAefe`_~mbNssU800^-Vvq?m zXF!nZZ*+*{kAhLaS~SO{&L+K{mn%DuZT%z&YjLH{CWJ0-1B`U(7D{O&C|tkLp~$p< zYE(-J@G_p02m1J>lhiDWeb=2=RKOe>({Z=(`+iF5wI0Ca?9~wf^WzknB~OKqeAaPb zWG7iXH(Iq&b0`5iKs8tt6oD0bJ`wRlI6AoAIeD5NFqq2=J@G%Rt6A??{kVi|lBZ;b zHQUb1b%Bw?PW+FZKbpSKq$M_Ywt9m7uOorfIdRXOa8CxmlOqs~`i{M;nKRcl%Z6~O zYyTHcj^Io0gTwS$<_+;`j|xYPd4y$6Pf2yx4gc*I+F&-SrQVLPhtTL&on+M1=k~dw zoVhZM(HHk2%6s5+tOoqsyhyGB66EWOB6sS3x6`tTZisb_W*1s)eK#9GzL)FsYn3?fPUF)Awb(%ah{ zDJ~O68#DGjf*>MRb5y~rpl#)}G1-B_z^Vg1w3pY@thfFI`}Z&4Z%C4o7vHD+@a=PQ z5a=ig)symq5JFHIyB1FdDvjY!#mGISqX;Al_?c%^J{K;=E91@hdA?k@Sz38{dU+<& zr1)j!Kf(VRKd&Eu%7SFxP;|N195{S-fCpWt9E&Jr$>Bt20wM!4U)f@O%k)qjH8CM) zFW>8uYc49POL+(Y1L!TU>Wl)42}ytahdRWs`JOXaLZ{X6Q&>VTA1{le@fU11^R|?D zR&C%m(EV$+mFj}1oS0BP=BJ8!DfULwlYA!Z9TiwQf`>0YImxBXRXs_GkEfye(h!HX zmC;~#wWp>;!y$%^JNmnF1&*0eDQxH%CsBpLpkG7Z+ScOF|Y=}L>nJQ->;!ReK$ ze@DRWVD-J)891EIe+$%kaSp3qrl(6a+8w^h2wgU&FPTH?PL_<Abc-Ngj*PB49c$S=O zTPR}beW8K|6!u__6gcm)XwX+Ec%b5euUx4w2)kdcLPLxj@xek4X-8h79D5uA=qU15 zf-ys-Sl1A1zIWM?A5m6JA~1tIm#!9j!9FVgg1N0O>#OwAYi%bupK2eNB0G#-BfjS1B~KxdW}tgwI1!qG`pu?vg6L&qhx2{!$W-Z@JO0zyhOcsPdu6v7&h>1=#CJWT@12&BD=&gMD=bQC5RV(|Tlg(XYnn&^5&Gik>@%31#?)VyRMS91Bz9^_D z9DBS1uJtr*tqL3bkMo6H407v_c|i8L*rTcHpw!^jzV4ujT3vB6b6%+XWWFlyYhreH zyUz^)$_qN+u_AQ4f2dQ06N2Q-i8pGM z0k3lkebDn=Gf+1d_JoeJws~C)K3#x<8qr{x6O!f@7U)okQwPa*fM&MkRANSiNgb@( zWeL5}#1pYGDqg(X7d#JKOi9(L^BM=g54-646LOCghi7wiQ~dB-^CbSno!Jdb%&Cj< zTLu~myFN4qp=YQcKYqOn(r+xxW{nD0MLqHDfUCHPE&$Pny3P&aX~T_L#0dOYC_loj zm<&;)frv*TRp#rR(oZm(fiST{X5(=rmz2lfeW%|bZ$vVZm9l`aQge}|^TCJNpvcH8 zZV&UBg0C|wPg9}TBVX#TcHeKco>cY$rGiC&W&+tqGW3vM`>$I{r~18n64hxUenf!I z9wu~7!iKiL?zQ=0YY6KA5PXN@rtZVXQ4r~C+_)stEXmr6T7;bbv<3XxR=T;kmc}V3 z1}AZDp?e3n1*ou<6IY=R7hmH6C_n&v)5n$B>2Rt+kKe};-fmdAev+CU4MsQ%;UJ-X=qx_>3OP(8 zIej>K&)omMfD2RhuF|)G>=zz`@DYtUJSc-hKka3XhR;*jv&H9Ocx*U+SGUyE!u@Q9 zaJ|hdQSy~i$m`2r=jGbMUzUIHi6clFz6lRvCGL3AUP7FMjY>||CbEQxf!QgFA?TU! zt9)&KsC7-?dw7=XD6{eIs0zU zs1E`^Otao8gSJ$<+VNQ?MG_z}4j})aoH@O_}gqMl~1Mhh#Au0&|vQj{k1Ac4L+bC8bTBZA6A|ae+RV7?C7|z(! zGbK=%_caplT!w@i%Cp!d2t*u$5m-AlQ+#pWmArVUaB7#TTAXfl$iuHJYG1G82`&JW z&qN1Y9CweE$BBe_gpwRu#!IuN^WHFYE|(odn}aWkig=fPH{<-$54(X;sRoX*qpkg~ zP@O*TdrGpgv_Y`AbF{Ny+CdbT`B9edocwUgQKI$YXDJdLW zqGRMP;EFUkUGf{~41+k$mH72Ln(qy_spQLG`g~vsM5NT#u0@pV%hMJGSvKEjz4*r! zTdZi^e0}=#EadyVHFh9>p+!!mG-# zqag5dt4AvD9o{+AsgG(dEArKi3=ocim8 zR&+rd{T$v)J)K4?dW|nLE=-5%XU1g6U+GyRc;N!LYO=@sX|?XaL&G2LM(y2 zzYl!qpa5kN>py*?{UwbnpUdNzcg+W4kOw6!0b879h=;rhym1=mBt&`1%&=+wDh>^` zd-sKga}FUx*pE5npuQ?DE1H_K7sEH>uJa+~U32zmEpn0Hs1_5)0=q($<61K=NBboL zkXQICQKIPD zC)PpA=6@AcpctIz5le&3F9c745GD|GcblW+v=}KuLW=~h*{2SK*33^RekUckysXM` z_!e}YV4kswh{ln2wW>9KvcxUm6S_NBBJ6qW&IedPLjNYSn4UDA0T=$q&Iij}aciIv zGAHk|rp|vs_bT*tBb=HZa#~xeNz3cz;NpTeyXYVWB)JT77|I(TA0%5h^zCd<`@-1t zBwn|^h{YB@y%&M3K*o`b+2_yE=lUS9SlVFQgU*9>c7~W!cj%&@O*MDMeVADBqI4lY zB{7Xr5B2kt?OX+I_c(b7kg+8K7-3=Gq3E~DA6-5bC479mgp_P{ zn213%fdyp2Hm<)shnDDA-i06_D1{?*KX@B3b zl*U5yXf5^qF8FdQq$jqII&g`C0Itpb>_AaMht)Mm(1Dy_jW-(0l-h%l)0n7gl^+L6 zif*c)z{R!pE<}Zi@GHgiv&KM+ke7X%F&+s|*m4 zG^HSlizp~~s-PuUXh|?2{`|_Q3CBDcT_n9Z2#E2!po~s6^3_p|1ZuqQr;Cm_08E4i zy%H%|Qsr|ei2^h8m8EZEU7p`3zkb^+Mv4mKi`svATRzM41k-7+;yBbP&chU~ul5b* zhuIvQsD`o<8Zoixq?a(YH2P#YE!QHc6)E%p?QjiX+vWu@Y~58~6D?;DdvDzCPf20b z9_Vzv^i%aZZvBG;d7NU{LrR(AjUkN!NJso@Q*Q#E?h=vX05=8`PG%@T9#Vv>2BHax9pzBO3S1n@J7?`Uh$`zDEKmEH<Lyyb1^7vtOFoUT6EseAWFWK{Exx7Ft7&$oTqv{f1vm zn`iNfun#hczJX92_>9>VFt0LOkVd1)v9YMYSx&6BP8-}zLye0TWol*@9RlRn7!`ht zej}I#@?|6X8|(&^Qoy&0RDlwO$h7kBGL1^i6Qd3?M$~5?J4HV?uMUp0zY{cRVi)SN zn=fOA03vMX^}?-gK}MVFKH6P&uJuZNdi%#opHAOzMF)M7QhS+omGL(Fa>=Z$C@>9m ziEMGnE{*&jxc+|ta`0#)l|Z#oYj}&uss6#81Ao+#i7YN!&VNk?90>*7GUCp90$KMl zgE(;|$dk8OLm@}ql@p4Nk)Hh=6~)4emO}`4f3&WZ^Yd>BFZ>fi*1;M44{<&a{1$fS zk;1qi?R$cPq9PijtT;46R#bx9=56Gp81~StHcyimSe47(r3nU=FbO!|KAqQ#^TWs% z-36O_Dr4rFv@U0=ry{Bs#o&M#IMH`6tLIg zi<#5cdptm@{lLR&4%Aq7y}zY1l70_|lTU2zUrmmW<1!u2m&Y-Ei6#nQ^{@pTu9@~# z_P9Nh>Rk}tQkx87=7*(vXpfOgzzeUJ?Go|JEmw!4-Tox+#yIs${gx<*UEogCePg{d zd-r6{L7Rg12OD9e99m#Oi`gt=`_HzOPRa8t96i#rASd1tHNGjCDW7$7Ux{E zkegsk0fQC-5Ytr|yUB`XJQu4eJ!$C2M3I3yf%2f&Ulz`LHY#_RQ2wE=WWR2s0*LVzEOM6uGyxj?2HmN$=2z?1q~U@L`ft zeQRaZ3Uyv08@lrQ#zuwH91i->DXXOtZDxDed+PSDf5*mB z$io4xITvs<=2c%=nm*nCIku~F8U4_d=lAd2)hr<;h2_Z1kuCrMP@!xvD7>TRoPZG& zF$utO8G9*=@;mv{B=?>JB?KvKSZ!7E3*h^qeYpXD&4UI$E*ER(Y+W5ro1q<;A|9qG z5<#0Tad|5&N)#Md8#OBIfxH&`U5ty1i>t_$x6A8U^)8s~zs^ur8NvN|{*X}|RpZn6 zKcwjCEtgNNrjOi&$m8j+B_oTr1a!#Vz>%_A;-`j>UPzFPwu1UxJcBk za_BZBSLqTysAfbxprE0cClDVOdmkN<<$dn zVJOK*dnN!X`+>5>jVzPuOOsv8;%83bUy9Wi?WG|y_aD+m}BAv7k`SreYlx}q#L0x zh=S;%ZBuryqIPerG|4|SO=|&vP59MP+tg51wKD#V*~HKX$EZDq!qz6+OyPyzkrK*P4WsT}JB>E8ni(>{_>}nc!3LXAp_%$@ zrD^C#o6OeZ`Fi0l)ZH|XM3E{hmg=L6+n-Yo#FP`1TJ z^;AH|M=ZtqXx~rPGvu=B&}4eP)&kwzjWZvkmBpAL$XK;hpuNIe$79y*b_KA_Gh?nt zg{gUFL$S5bFrA_i;AR5}o)Q4>1R`9SY9XD9DC0`kRQqQlwt?FRR?DV~uwL-&5vN30 zT>=Su@gdFntEg>a8p!xUG_o{RSN~x3rcUrWI+4*2Rxl=zL z5(v|GJ;X#FBp%^)KwIJSR-kqU$MZm-*L4Ol)4DD%eQr3qGrk#ij}oGQSvRsXBhQiO zD~2#X>39EScW8??l!1=|kBntj1|%eY{urYjIGK({r-Wf={1%Ea5_zX2?Nyn60YZUJ>liH7` z0mdLK?Z9FRZvbtD_^t&T)(Q0BXg~`No0Q0&tv!e^+U0mDD0r7C8bB8Fn|EN@%}OLH zXxsD@-In3

+5FZ&x3#YysG( z8KZMlTZCQ&JD=AZH3>UJpk$nRUfXZ}_8PKzUXzwEZTC2%Fi4 zudK`<;OCEBaTX|yr1?c+eK-;LJ>Lgb8Q z3g!~4otB#CAB^)MsL=zoBf9PDZKwa*jOQ$g(wjTue>7(f^8+V>q~D46DghXI<8XBM z`otX09Xz@Q`5jK}zRKtKH?4tPp=E4&ed*pLHP~qMSZi8-Eb$B=7=G(YkqXtV&x&b0+;<_mMN~|@j?6;&VmwGuU=_t7vSx&#M2d1@G=PU zCgV{r^yj?OULJC`v%@ixy3Z+54p+uKC31;3$&Akyl42ViG~{FSxDQq#tXe^`uh*9R z`Sz}bV|dqM@I#!~*s~FUkXhq9p(?vn5l{{c0HRG{as#AIZ=wDFO!!-`+wUBiyc|F? zV28z#uS`&SL@KT8(vt~qoZR%}F=G>7L053aZR|#>*w3#wz6r0`|I?It9vb{=@xu2_wg}W0goR!W z>|gZI5hc%no?s>VV7@urM-Oz@Ldr|6COBd~j^uvKcR@_&%S5oofS5PY0e@#4fa_KM z_PZ`WUQK+^#QoqJ^RmLUFDYrA+*|9@9rGGyzZk>ha9gN`;$3B6+Yfpn>m$RA7m_eo zF2Lta^<5KiHr-sX4X@(OBkg$EE^{e^hZa!N`NgmaE2}b+7&SCH$pC@n{;x^^no;GS z?`#lcp>ANDe>pWe6^7{n4<66I88&@rdy9mIGfAv-r$u3tYhnfxLmn4F?Bw@oGt@1_ z-s%%$PmJcJiATR@BOCKwuZOmV-Pe0DU6d;|h^5O>qFqGCvL3Sgk|!DUtMU*pR3r^5 zGH=^9kLjQ4fbs_9{SJ-)nk@jb%2W0huVbs9snqKP?AGJ$#;0yPeA_?ce_9E_GoL31w(S)J zfXG)FN%plZlV+_u)u(#v@6T3*YK}w$P1gH zQ$zT)MbqTN*g!S}~sqUA3SFZ}&CV<0^Dr&g??)J*_aLOyV@rz{PV=Hms`bPz&^q-biGV3Og* zEDQ9<+|-U!cUL=ry#%a5=Bz|=j}{v9ZC~)UZ13NDWU)6t>I@;OgcdHle(PjQkfm7?IilP-}&a;o@6M!ks2B7n&2&fqN z>|}fCeWf~Fji(kL$xXfaG79`buE{Vz z$X`ADxKk6mNCC}Au_Im-TBW4^YiIu(+u^6pQ<+so2x8`Kd_J@8dlMW z-7oli14&GBg)S)wDX~B`H(~L`t50v+W!=)eua4dUmi$^oOuVeZBf;atZG8w@qP{}>}(&DPh4xm3(&(oA4 znr3LbaQB--rba&V<(qq;8Ph#5g$FdS`wJ0AiA(U|SH^+}k6$@eJD`~l@i+5T6$wH? zm450Lrt`e+dKu`tr?4kFe)^F*&^I3{OOj;hD6=lm#B%@9@zEQypIxU4Vc>u)EcbcT7+C}>3jVl|CdSsOCfazI=cFV zN5RaZvT~FxDO@pv1M<8z&p3(6?l|y5pu(G`rV99L%Y?1kfFttasZb?Df@J6GYxzm* zbS2J*Ij`QgQQqsHZ9!p+K zh&>hd=jgTL-Rfsc(!V2SBW&F?phjTW2MTN~B6D`60S|AVdal`Wk#UL5EFs{r^eFB{ zgfNT$wh%V&zY7vV!k`l^f`D4wPoaMuhhuO`0uw)RhC;)m68fr&9I=^#oBIa`@bwQDfFUc8M zf+RQD@u*cuZO|x;kc~U&)poTuRi<|sGfY4SnUK#FfI>fk05qN7nAycR2V}U zXo~BQxkjzoGTlyC1M#6Jz7No-?is*7utLM;is%IZyB|AU^l*+V+d$bu>b;+# zrs04q-t14gZMZPZJ&&5?o9yTgS)qG136s=LF!RIrcY!Q}9^PciFoWjbyaiaB*vETS zGW($aP$YK+YkxZN?#*i=j~*G$Q;(A#VWyUHvZicu=~M_2b8U`R(K)2H9Kb89T6^lY zd`7a93h<`hLL)hb^j-~N<-}?VZL;}$YMsBS2biRw*8N$VyCbV-3qg7GWdO%M9o6`YsW{WuQ+y^{p!6cN73U2yKjTK(Llqa&RvaUV1B5&{} z3pp}|g{cCgVpw8Rf5&d_APkBX?vdFwOE*Z?d|+ zbN_r9l@7WAUMmrJ-=C6td@xZlU9oQj#7B1&GL(c&x*m(zEnHWOe;hjA^=14?6UEUl z^#Pn|&W#S3&x zl!W;V$(LWzw-40`m-l}>_=+iU?tV|w4B$7LLefg-cWvK7Qz)352rpdfB_#05uRa#g zxBv``_gSt!O62UC_5**x0`861_x#rUuX!F0$DO@ZtQS5#5n+;a4!_jgwDD-%L()5! zzy;h%DS&@f-tBNFMYm$B7ZeITmytZTisu~awb@SXdaNO@K@yN>CqqjFXxRIGm10`i`?~9dW`T zzmcmehp#~RB5v`3^2Z;zg)`ExE1X~T9tp%Tz8WdN(#%c&YCv~3q$JK;a$ICG{#z`T zq|B!&aEey>N^rHWf!SSqIIerZ@UO=0{r4{u2%XVUNh?(aL84uc3=~hk1MvrC1LIzcOVcO$VLIL zgXj!zcn|FPK7z0cLiJ^_xNZ~w$)nSuMI7m6x#0`l1WK9Sem0^(8hxpRPX zOz(!6*{x=FvRm@B&4~?ofx=6eCb$_Fcb^%MO8#IN zFnv8udX)Jqzyg;qxMIS=XDb(qc z!a@WCp&{tM8u5R^2OVYiVI+IpgKo#{+WgdC_wIoKvR(RgN6V^N-`YWdq^Qre^|UWpgAL%23ksLHq<|3TYR>!&|m#V4dp0CuOD9`?$Ya;?Jd@$2JY72(;- zO?W`Uy8#!mo^W)Y4-$5z>sErg?@!LM0oR3!jqI^n^R06uavt)*+8~Uc)c_~0z=pOL zOy^BjEhRj`y+S9V`+;^&#Ub4!Te3On^XDei6sjxD7wftTJ{AM^RrvGL!GHmOA<_lb zRQduFFG*9fNCW!NtWOsmNkSboe!ZeNMDzce&4%M|zb185NE&{M!Jjau!9V59jn9 zNsSUS75`cqWw)am=`*|s(e?gU&p!3Aex70gly;ZXLB1B~3hLP>zN!#wB(lywS|E*~(v&P^hDuqx>g$*EXu zPvX;`@=@5H+xID-Br@OXJ#{%O0}#3+&?mItQCKwnWgeC;B*_z8N&*lcAQZN{=w`EW zrC~o~U-@5m?weO(NKzd$C;4D{;@eeBW%OG=4zDcF`ek6za8Ri%47PW$hPYTO#h zfls^dG*ao9fnZ2i>k`B>qvPV6GzY4FHqR$HMxc2Iu>XF}l>XvBm}ShFrGvk{{>k=W z%a})C#^whU-t}Zrx$46Hfb@Bp6^uIHKx!9vR_wt3N?#pc-|FGPL_;lf=~B`Ca$=dU zM}(h5%VmS?1K?pM{OyH`ao5A5_k_f8aWz(G^VGiIX6N;>gmX0k z9qEJ*{MsJjwyOlGZuL-n`>BTAUXDq9d%6uv%-oD~NpgYj!Q6eYL-bxbel4;=cK)rZ z$`UI2rqgbFLCUUMVYXfTt>L+<{jHMjCVwgx6F1l39-`J27%b>f*SWY0{xnrCzwPdEDO-o?Z+$Wswbzf#X zv)vmvBa&*@dJ1iq*`k{A;Z-Pwp+!HK5>tqX*_#i`V?P5KdlDaVCjPopCNZ3cI;$n1 z_S_(d~DIzzK2UhM;J*g~jOIgOfruY}d~^(R9Vi-ER-qRdY^xLtb_c z2=zc0Ic-4~Vx-0ET7A_0cO!bfkzwL_sJ+t|u0-fSU20uK_hKZ;xf@QlNw}s(bXhHtrKPjhBaT zw(~26EJ3PD2gTRjXEv_nIZ3{iJ!BnV_Sf;)UEMlDgEVKHxG)!lfcTbc?+`u~Q#&Zg zW5-{2dc;Ca%dQl-IgjIPjlewDcjtX-(|td?kuBpfa_oKf6%Odo0SJDh5br`n_x7)g zJAcsX{g$c$1T0LnWa3!^gN7I0BV;z5t#`M4o2RRiJh~S(ACirliIY1H8Gfhu1x4t8 z-R?P()%vBvjBIJ=a8g`x+30yZKhN*F?^nJ*7ck$!neXScy{I-~B30pG(=F&Ue&mM1 z-EI`YO&*VU9E}v|p%*3a2fxddrys8tCk5pqM@8H>8d;huV9*Tz{bqiLsp`keX<>6= z9-Em0(xa)ZCP1cpyl{UF*~xKNcw)bEt11zOisD92WD#5HJc(s(gl1Lbu|`2|zJnaX z>MhMyJeExZ8D0Jq8b82;R0U7QC$W>A0k#=u(ENX)&IKQz{rOfSk6c1z=@c!#_bHW{ zm#v%YpR_Qet|k6Hj~P$ReQd)6S8Pkav3y6NDa~5QOsW0!Ozh^!-c_6NQ2dn3sd_*! zzG*tkwnl(-qViIC;;EH>1tcvK7-f~}VSL`L^ z>aeZ6RK}pgeBoFRBOMQ59f6*Mt*B0MFNPSsN6W93=-NjPLs(AvD8>J5ENROef@0RJ zUYAq_Etto=J^%W;?dF(8euN_npFx!!i>XU$DAYbayLH=xVxg_@jFMQy7*a`W*>*cR zK)Ukdq>vI6Q}TF!=Bd#{d6i**8fjLqV~%UBTu9?wVt1~p0A~lkx{)~1+&%r)E~Etgzq{ji_JFKCF!@!cpSIl=K;MocWbfnU@7vFgFVzRI@SI_kYOBl za;Py+o^&Q1?}SZiwSMXwIr1BkkDA|~59SO>f*Q$+X?=0cJ4CJK6>g4Y=QsP7O%y%T z>pXgYB)EWsdMG#gtm*HCSmLf;hY*ml*zBg)0u+W@)u-ayZ8>7Zdq)7SZ-Q3t$jrJ! zcjO)+Tch>HOnqU&r4EXEkHgw&|JD2|9*Moeu=#?glwY5W!&$bc9mTOVkB}IaoJ03U ze9o11gX}2mBg6cJXiIo@)I+&b?NcKo48nR)(_VSH%KZ^*!LD;Ix>T?7gBFzIuCney zE12$eK@)}JZOJp$2|;V!oym{m0ylmSk9Jy}1Pk=q<+qF$o3?i^!ac}uQELmg1zcI1_XVs)rl6uY33Q*>@9ZlQC z^0P#72H~o3HI6o0pV`vvVg)j!1V7rT*`f@~yJwD2bG*Z>r|M^aR2mk6#;d>RdU@*M zpDHyPv7*5DJe;ZUNkivdE$f=)^vC7?qo4(CAC*6O8ew(00~;~Wz@G5I@WXVD-0^z- zbOc?6Q>~s3Ua!m{NElb)yN^Wx9<52omO^l~wz z2o3vi-J`p2${f*cVR<^C>yfvDL$K}QXh+On1lL6@E-?V)Tc6Q>Pz7^}s#>oUEt|0G zT$-%Hi!_e`OCX=Nh@1VJf_;D!74~d(8M#=#3z2B*UB4BsqcYdX>_-2qA^l06NrC#^> zw}I9G`dTJ{p}!gBI;Ry1HVT10l4bnx%2Kr~L~A3@jaXwk5<@k*2-oW&wZ2#nh|5Mk zt5==nPR+5Qj<*6Ms5&i*UBzYF1%9au<@-5Aa&h!UxRB_(A9%FTY3R~SA5GP^3ZliB z#;wQUn3aiOX})~5ytbajOd}pSeMENRpMvlaX@gE64 zn526y@7#{A?-j@zK`Fd75wb+t8`W$1!hM^*c0_rQMwJqkd>Q=sx*E(e% zUQjST=5tmH)k;sv9?@p_M1#AC#1re1vb&bhdsqcs8CI=>`j?IO4s*;r7~EP2ndo)e z`vc`S?pTNxGB=E&oHoU|85RRVE7SG+gJVZMTf;JUfFN>!8-7waSmbai`XNGHAw~>3 zmDM1cZ?AJCP{uypI+h-asDFWKHCVq8Gd{{_+Z1ZNns|J`cwnLL#tQfBu}Fb$N6CeaVPg?0d+svhV z4L`jVcTs_%j9xB)SJvow-^FMvoC9-IK?s%0v>W8Z$#qe4)%PnM=dLBzVn4d)(F6_C z)J4tp6dHAs%{*b1E#dLeRCmj_s0PA$w)4DjztB|K7L6XLFeP;1o8x+g>D=Ke+|MGf zBHe!|*AQ?J>oUCI#--$Z_G8AvA%m+OAddT@Pl-^=Ub~4D?Nc90>lXNm>RdEaF-stm69pu z^wcDDU$Jge?@##=$K~c_{iRf$C= zhrpohyh@Qo=dH}&R`?V)?d|PBa_AIOokaz#z}Ye}_PgZwqX*bkn8Tz!+tikKBt?TW ztYsIPl{-bsC+yr)9M7)o&d2O=+~;_>Y}@VXbc3AZwiTFw9|2=T2Pgh6;_*8^fi zc6g*4v2RQAlh0W;THppO$w{<=zirHNBaZ7J(`-?kVtxF!!TSm)hj7^X2z*?##?pz) z*=4h1L~mr@Lbzedp2{E?vVMcrhvm(MKXWUkk&&7G41%y=KrYL@H|bD&#q+>vOB|c% zX(SsG4C+&wcZGFXgx|mp_D}Z4k(jAE+0K`97_1I7O4;-xNG$Sw%H`ir( zm_N($45_h4O)>hkv*?SGtU(Rh^#nPs|3;R$>ci-V+yIr=68D}~CmsT{LSHLJ+-j_( zs8SS%nQ&U9idxjQKV$QR5D!0Td8(9TQogWhT!oX!@it)g+Uwv%s86AX)eQzSY~FeA z{HbvI`YSLS)G4=y`=*C$cV^B?j9W5wM)F!fCk=x*`hsx>7Va9pm?qnr5D^ICl4H~r zPgcYBxoTdx(+5sYZ__sfjxH5|e(IMBX1hC1l6OjbU)>Tpxo6vOkzMx8>tufFsHJsC zLr+hA8*4gcUFFsH#?1$li>G}wOjhT*CRT-{oEH1&xPpm z_MEjGL(j`l$Qlt@tuI9pm)yy`eA%Wg_ptQ|N zKQ6YnZ)A%W$G4Mru)ju#YMpK|gK%SO;^c_x zSHmxjg?(*nrG(Uvnal>3h=`3FthStT5FDedBs@BuT^X9p|X{cntDw944)WW7z~{3 zT4gKhxU6@9T$LXT7VOMnDW<PUtuRJ8klX@)9s`HwEJF;KzG%lsWk##Z|AMkdFr)GGT}6hsZXWk zfstnwxNbPqa>l7ImUdf&%e7$U?cNK^9j(Ybu#mu|$9?1u>2@O%)E>c1Nqb%nrIFgF zZ8B()vt}t?&8q_OlJ0&eJ_)tek!}1^_-THs_=@)W_;?PnV(^6cMja7GY{GS_8fU$l ziwsUrSDZ_5xE3`aW5+M6v#9|ec?~B*jOaN;y3A0D6&T-)wxcpY=JC4>=LonZxNIxN z3US;M=i|7BLft>4x=s!9DI7RqIRV7{lJ3qX$d$fHGVioo-;_A|L(8k=aXYVKZ!B8G z{w1C9{QQpq9)BmqVzbktn>bJP#*h6bb_p5)%jp~>#v%sRcFPkPnkq6s+|$Fa#4eop zGBmNAEL}8iTqhtR&7tT}8(3JYl@5M~HH2?EfS5g!x(kQd<2Poh4_b92j;iH+pg|SqeCaWfP1`rU&ZUJp z2kkPi_wvv_iI8) zg8~J6_8ku_krQ@^>izzJ!e*>a3B%|Cf{0{?7jKDOw0%i-3*seN>C93eSYF*~{k!0; z@f&WrnXRd+>U=nuRaa&=E)9H#8%vQ+6qOnI^OI@M$6G^z!Blhsj;fbrFMx1!AE__%L z2mRMBz~|-P=(Ra}`)NnG15f{T3BzY%_=#fUyBmv=XHH^UZLFBns%m8c;g-CNj~+>3 zB3q{0?)5_D^{u{rRJ7*Lb~pE2jyP4bw0HiFg3=^ zam!+6rcfn?aF-*sN&5i(bxxpAoh z+?Rjb4R2)8)KwX_@l-VtkWz&FRP)3lux*n7d+r#7qugGeXhXZJmech*{4l@;*SJ&2 zrLa6w>zpgmrz?K)Lk8Zu^}ul2-9qJfBtkuUva654MM6$Q0@yM7O{eik&v9m8OIw(FSxl@;3fg!qqg^}^8#&! z=3V*+B@U0QQHEtM$aTzWt_-|+04>2Zeb94Z2tBPGtU2y+M)bqu%-#5A1mjPOuh|c& z2=!G?i>mEE@XKL`tKoU>xr{VjV5lto&nW%C0G>)dYZNB(I$}`8xGGZM&hHZ2Y6-YI z16!9lWJ*0pRT8_$1GPdYz>oYaYS5P%ULU*r{o7zS=XU<@1QYv zHI9dGm%ASL7a5-70~;?vl~y1B|RLn{?t0DWZWdii{?KxNcs#FN2UiBFTloVPXi zXk7P30WgP){K8(r`!;bUG=RyD4LBurLC zULg`Anuy&ZoR#S<4!)Aoh@T8n5vR5&^s?NsMQ+T<5X+H8?u zqb*?+d=J|Y$(dJv$NhMoB`Oo6LdtT5G~|ZbqaVzVZ44}{?cU1Q97UdGfxa81<75A% zR$!# zEkRe@8Iqt|j%e}u4k5c1Jsq9FoC9s>9nD&GpLtA_-Zj+>1rAnt(1Uxzt9_|lb#1li zTb-eeKRY7<2rg@>>()~(xse>2niU<#6e78&2~dyrp+&b_d56usbEc9f=6^~CD2*ew zfb7H#aNP!49a-zBGcCTs8As{e0I~fC3TCnUHG8G`QR3vj6bx57qj&<4^tF0Dgf+`i z!p&<&a9*$RDO7~|DPe-1(bhtHaaQe~J;#jO2Gv5x(d-T5{901x=&SRs(<}oSlCT~| zeVw$SffndtgihtVlC_cnrSnCMaKWGA&rVIC!)s|_66#8e(T{DVFP3nZ{jOFJ&qtrw zWY?-o$dPE&$nrdg;wSQ3dM7^yFpIl9i&Cs?>SvSh`1la_rY}0BY$xFXnehAYlasAt z?44lKB)4=+8N}Ji{CtWzRg@c@q=2O+qg~r={?bcBqODVOpR+cO1~Vj>TA2|Fe>C0l zuyoyp3khueXS+_eXcQhm`KX7??m*}EGIHX5=Ss|U6_WzVF8>gEk^jT)NiZa#%aVW$ zr^>(&?T%?Y_-G+%f$a|Eecw1>DN&tNVpxg=)k$T@JE;vMX>y@j$*Q@7)jl&W1EiJk1v0MRP zhK|~;jP2eP$e|N4PIgyuUqI@JLp7rbaIZ5di)}jYtWSzcY%il*k`kQX$MEzNbSA|~ z!rdnvrcvj?WT3g)UF^zCHBvwlF5#hr6U=Xgo$XFH(a15X$npn~5E4>5PPhN+nCY~s zI9jiINhWc)#LA{?M{H%KllksGR{RrmD?+uF!Gl5KAU-p7zq1wd{M{6LboR$>)Q77I z_V=+CL#Ee}@e6&$&vdP8zjG!#Fcn$Q`F?)s`Ej&F-l^w{S}(@M;=Onut8haipRJ+m z{7qN@e`<)oJa1Kwm;*C`Fuv4@%^$d!vC)UU;YDV5k;Cno8+$)^rgbDdtTVRp9%tP} zS00}UN|{nf;lVM}4W7d^_%L1;+Z`M*Z1VfuQRB)WRY846u1dglER6Ln)Jj*`!9*7` zKk{fY&NduRndpQ)%hF$*-S39Gt2R7%T7Y65T#@X|TyZwGCD95N!(N(;$AWB(%gYIj z*~|>n$NM*5EKYe>IKa@%aZ#yQZFSmwv(e6cXY^#HgARj-@Z<-CuKf^iN5>ppcW38Z zn5*)^sNGH>imw|VN^ZFIyfU!%Fwn%a=Q*T-REk8QrQ0GOrM^cXcCZj;RC}@)M4C-j zc?3}MK~?2QsXu0YPq#a`)nY}feG8`Y`H=1h3+!hXOFQD0J9OSklL_W!s%TxhQ;8(ty^IRK^M3 zpTl6^faEQSW{aBj9N_62EMn{2MoVh+ko9Da?S74mZXE+v1SYhw-3g(}9T z`Y=Q>Bv-s*eaa{Nf#-~~DAOFJ&&i_WF_ij|!Hk<`}ZubxpxJMw_1e|jImOuv8nvtRlA^Suk+~7wi)k3|xYs5~k{4PF- z$wiJqFB?r_ZNXBnEq*0(GYY?qx!2F&4n2&jj~YnZHG4~<>SG`u*c}3Z-KKI|d^qd0 zc4Dd%X4AS>nR>WB@=0`GBsvBsp5cHPmwYlox|^#eG8%w{d0I zQQRnbI-1Cql##1eVqY+%)3+cU(jLabbyIZlgS7-s6vvfEXg%7ouRGn>HiYKace}6^ z%N~)F$*kCQt7qWFmVWy=jHa$*r8Wg;ikPDUR||>pF2WuWE2uo)CPVL3^gIu%SM<(Y zt1k{XzOtZtkTb()LEmfl{#51q1#n5Y8#`hw7Vd;B4`j5GgJ?C~6456kYbfC$tLc7H zsJ!?Kr`09H12uL#50UQmLlt$C3=OmCL82nz9*N+NK%HG-8@QYF(yh0jeIp13_gdl!Wc9wxaCjnoBgo@&2a(Tc2Af0$`lWt z4ypD-nc`U8E0%Y_*1ig|{;w}KFbL}NctmCgApAvGG)QO1(#=*8;oF*32_Fw_=-f$L zKzk-L5vjFCaA0Th!)|imXR2pU!|>CYQ@(ukp$p;X6tda*TE=7hAiEI~BWM~a6)$M| zk)Z5mh(8AalXJnO&BGnhL4lA4(yz(6K-^wm3;@HX~ntEr^xcDpX zd!wfFo2@L_HO#zkqgh=}j_@Ikl%iti$%3sUdLG>+2}!X0fYatT<~a=Ig;2r|<99HA zZ>Kt=MaD>}JxfWGQ)fK!L5G@1=lps`x*Xi9PN{h*w;ts56?j6Jk3mafsD!6vP>?Pm z1dId$m=Ht?LI}A9A%IYOLLk*>A*d)VBpJa^NcL|pl1V`TP6h#U{L9b$!`sQ*@81jE z$RmVEu^SRo|1Tr|!+-tN7yte3^XEwpGy88c$oa|?-2U$}rT?<0`Tu;Nf8EQj1ws#R zT-G3fB-8%C?dJ1!`q#nE_oswr?2RCwYzUvaO+znz!=vt9kKC+8mrJ3mk?T#7-m zjcO3c(z8JDUH^B3ogbC+Bl}OEsyotDP3^OxgFr-RSi#%>@uB_ao3P2_O&uY&HJr5&r7!f3h|E2Ig5cu{vk&GP^@IFCdUd&qrOM`y=rL<<+}X^yE?y z&&wi^D$^rlh;`qg@1!0*cwy=qSgq7id$3$WvD}0NkfnFvQUB`8{$d9Ixb*+@EdRKO zXRQClKk;8I|30h5f8M_R^WOY-rmSiDU%$itgB6$hnb~JnehC6e@S_2T=6|!;f3Y^_ zzs0}v@_(?&{^3(IMA`qzM@SHb#OacN-JZI9M$QKjql0%|eJimI0e>%Kl%C~D8+`g7 Di1m)A literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/ios/screen-iphone-portrait.png b/uhr-app/www/res/screen/ios/screen-iphone-portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..203e09e322af544205957cf52d92fd65ebea5d95 GIT binary patch literal 29372 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∈JlU zILYn5%o40_p9vS7)qdiHhj|T6O*zz8rw4FDOdKwX;xKR(JN0m61fx7ADBUL?o9@mbYElTgg9sD6PmHOHvYOrvQ?WJrkpV zVA^wkG;fyXH3!Arr)di-yEOgI=l;y4(DeM#*W-ix%RO#GwuQi9=TPf!F%*DH#&8H1 z()(u6OryFgc&=dR%7bP}V+A`SC|-QT1-Dh>vyUyxSKwu<<5}nkC#QAlddL`nhf)f| zU%v$E*8e*D;dj}@6;e1^n( zwLvZYN_uK`a&v^SrJP(7-Na~w)}D^<-H(;6sqIqoVQgu$?WWT2y;u9i@AyB_yuEyV z=kSp3gh993bVZIUJxb0ha2Kf&YBA8Y#?nmCw zAW<>VH`+NepZIxTmMeGDT1pycd3kS!prc=h_c1e~-+;4nDOgxm7Fb+dT;NVw5g|?t z$IC|P52=fvVV(uBPCo6Vz0_#~ziXM5oGjDY(NQVXecLe75h&0J?zH#xR1>jSRn_kN z^_rz>y#IppAnmQ~s5jdr0OX8F=V^KAXkMqU)wOGd))iVjPeR_-*Z*X1@EK(uKB_$p z0)9-BppgMxmR(JEFW8Ip8=0I$UVWMr$0S8RoWUqE0W8hnI}Yk6NnBj)lFbPG^HGj0 fwBuw?2S@?*K{Eq_?n literal 0 HcmV?d00001 diff --git a/uhr-app/www/res/screen/windows-phone/screen-portrait.jpg b/uhr-app/www/res/screen/windows-phone/screen-portrait.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e404e8a582b9eed68423c9ab489e9b0d0baf2111 GIT binary patch literal 20813 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 + + + + Jasmine Spec Runner + + + + + + + + + + + + + + + + + + + + diff --git a/uhr-app/www/spec/helper.js b/uhr-app/www/spec/helper.js new file mode 100644 index 0000000..929f776 --- /dev/null +++ b/uhr-app/www/spec/helper.js @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +afterEach(function() { + document.getElementById('stage').innerHTML = ''; +}); + +var helper = { + trigger: function(obj, name) { + var e = document.createEvent('Event'); + e.initEvent(name, true, true); + obj.dispatchEvent(e); + }, + getComputedStyle: function(querySelector, property) { + var element = document.querySelector(querySelector); + return window.getComputedStyle(element).getPropertyValue(property); + } +}; diff --git a/uhr-app/www/spec/index.js b/uhr-app/www/spec/index.js new file mode 100644 index 0000000..20f8be5 --- /dev/null +++ b/uhr-app/www/spec/index.js @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +describe('app', function() { + describe('initialize', function() { + it('should bind deviceready', function() { + runs(function() { + spyOn(app, 'onDeviceReady'); + app.initialize(); + helper.trigger(window.document, 'deviceready'); + }); + + waitsFor(function() { + return (app.onDeviceReady.calls.length > 0); + }, 'onDeviceReady should be called once', 500); + + runs(function() { + expect(app.onDeviceReady).toHaveBeenCalled(); + }); + }); + }); + + describe('onDeviceReady', function() { + it('should report that it fired', function() { + spyOn(app, 'receivedEvent'); + app.onDeviceReady(); + expect(app.receivedEvent).toHaveBeenCalledWith('deviceready'); + }); + }); + + describe('receivedEvent', function() { + beforeEach(function() { + var el = document.getElementById('stage'); + el.innerHTML = ['
', + '

Listening

', + '

Received

', + '
'].join('\n'); + }); + + it('should hide the listening element', function() { + app.receivedEvent('deviceready'); + var displayStyle = helper.getComputedStyle('#deviceready .listening', 'display'); + expect(displayStyle).toEqual('none'); + }); + + it('should show the received element', function() { + app.receivedEvent('deviceready'); + var displayStyle = helper.getComputedStyle('#deviceready .received', 'display'); + expect(displayStyle).toEqual('block'); + }); + }); +}); diff --git a/uhr-app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE b/uhr-app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE new file mode 100644 index 0000000..7c435ba --- /dev/null +++ b/uhr-app/www/spec/lib/jasmine-1.2.0/MIT.LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2008-2011 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine-html.js b/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine-html.js new file mode 100644 index 0000000..a0b0639 --- /dev/null +++ b/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine-html.js @@ -0,0 +1,616 @@ +jasmine.HtmlReporterHelpers = {}; + +jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { + var el = document.createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else { + if (child) { + el.appendChild(child); + } + } + } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; +}; + +jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { + var results = child.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.skipped) { + status = 'skipped'; + } + + return status; +}; + +jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { + var parentDiv = this.dom.summary; + var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; + var parent = child[parentSuite]; + + if (parent) { + if (typeof this.views.suites[parent.id] == 'undefined') { + this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); + } + parentDiv = this.views.suites[parent.id].element; + } + + parentDiv.appendChild(childElement); +}; + + +jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { + for(var fn in jasmine.HtmlReporterHelpers) { + ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; + } +}; + +jasmine.HtmlReporter = function(_doc) { + var self = this; + var doc = _doc || window.document; + + var reporterView; + + var dom = {}; + + // Jasmine Reporter Public Interface + self.logRunningSpecs = false; + + self.reportRunnerStarting = function(runner) { + var specs = runner.specs() || []; + + if (specs.length == 0) { + return; + } + + createReporterDom(runner.env.versionString()); + doc.body.appendChild(dom.reporter); + + reporterView = new jasmine.HtmlReporter.ReporterView(dom); + reporterView.addSpecs(specs, self.specFilter); + }; + + self.reportRunnerResults = function(runner) { + reporterView && reporterView.complete(); + }; + + self.reportSuiteResults = function(suite) { + reporterView.suiteComplete(suite); + }; + + self.reportSpecStarting = function(spec) { + if (self.logRunningSpecs) { + self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); + } + }; + + self.reportSpecResults = function(spec) { + reporterView.specComplete(spec); + }; + + self.log = function() { + var console = jasmine.getGlobal().console; + if (console && console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + console.log(arguments); // ie fix: console.log.apply doesn't exist on ie + } + } + }; + + self.specFilter = function(spec) { + if (!focusedSpecName()) { + return true; + } + + return spec.getFullName().indexOf(focusedSpecName()) === 0; + }; + + return self; + + function focusedSpecName() { + var specName; + + (function memoizeFocusedSpec() { + if (specName) { + return; + } + + var paramMap = []; + var params = doc.location.search.substring(1).split('&'); + + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); + } + + specName = paramMap.spec; + })(); + + return specName; + } + + function createReporterDom(version) { + dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, + dom.banner = self.createDom('div', { className: 'banner' }, + self.createDom('span', { className: 'title' }, "Jasmine "), + self.createDom('span', { className: 'version' }, version)), + + dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), + dom.alert = self.createDom('div', {className: 'alert'}), + dom.results = self.createDom('div', {className: 'results'}, + dom.summary = self.createDom('div', { className: 'summary' }), + dom.details = self.createDom('div', { id: 'details' })) + ); + } +}; +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporter.ReporterView = function(dom) { + this.startedAt = new Date(); + this.runningSpecCount = 0; + this.completeSpecCount = 0; + this.passedCount = 0; + this.failedCount = 0; + this.skippedCount = 0; + + this.createResultsMenu = function() { + this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, + this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), + ' | ', + this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); + + this.summaryMenuItem.onclick = function() { + dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); + }; + + this.detailsMenuItem.onclick = function() { + showDetails(); + }; + }; + + this.addSpecs = function(specs, specFilter) { + this.totalSpecCount = specs.length; + + this.views = { + specs: {}, + suites: {} + }; + + for (var i = 0; i < specs.length; i++) { + var spec = specs[i]; + this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); + if (specFilter(spec)) { + this.runningSpecCount++; + } + } + }; + + this.specComplete = function(spec) { + this.completeSpecCount++; + + if (isUndefined(this.views.specs[spec.id])) { + this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); + } + + var specView = this.views.specs[spec.id]; + + switch (specView.status()) { + case 'passed': + this.passedCount++; + break; + + case 'failed': + this.failedCount++; + break; + + case 'skipped': + this.skippedCount++; + break; + } + + specView.refresh(); + this.refresh(); + }; + + this.suiteComplete = function(suite) { + var suiteView = this.views.suites[suite.id]; + if (isUndefined(suiteView)) { + return; + } + suiteView.refresh(); + }; + + this.refresh = function() { + + if (isUndefined(this.resultsMenu)) { + this.createResultsMenu(); + } + + // currently running UI + if (isUndefined(this.runningAlert)) { + this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"}); + dom.alert.appendChild(this.runningAlert); + } + this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); + + // skipped specs UI + if (isUndefined(this.skippedAlert)) { + this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"}); + } + + this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; + + if (this.skippedCount === 1 && isDefined(dom.alert)) { + dom.alert.appendChild(this.skippedAlert); + } + + // passing specs UI + if (isUndefined(this.passedAlert)) { + this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"}); + } + this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); + + // failing specs UI + if (isUndefined(this.failedAlert)) { + this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); + } + this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); + + if (this.failedCount === 1 && isDefined(dom.alert)) { + dom.alert.appendChild(this.failedAlert); + dom.alert.appendChild(this.resultsMenu); + } + + // summary info + this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); + this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; + }; + + this.complete = function() { + dom.alert.removeChild(this.runningAlert); + + this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; + + if (this.failedCount === 0) { + dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); + } else { + showDetails(); + } + + dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); + }; + + return this; + + function showDetails() { + if (dom.reporter.className.search(/showDetails/) === -1) { + dom.reporter.className += " showDetails"; + } + } + + function isUndefined(obj) { + return typeof obj === 'undefined'; + } + + function isDefined(obj) { + return !isUndefined(obj); + } + + function specPluralizedFor(count) { + var str = count + " spec"; + if (count > 1) { + str += "s" + } + return str; + } + +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); + + +jasmine.HtmlReporter.SpecView = function(spec, dom, views) { + this.spec = spec; + this.dom = dom; + this.views = views; + + this.symbol = this.createDom('li', { className: 'pending' }); + this.dom.symbolSummary.appendChild(this.symbol); + + this.summary = this.createDom('div', { className: 'specSummary' }, + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(this.spec.getFullName()), + title: this.spec.getFullName() + }, this.spec.description) + ); + + this.detail = this.createDom('div', { className: 'specDetail' }, + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(this.spec.getFullName()), + title: this.spec.getFullName() + }, this.spec.getFullName()) + ); +}; + +jasmine.HtmlReporter.SpecView.prototype.status = function() { + return this.getSpecStatus(this.spec); +}; + +jasmine.HtmlReporter.SpecView.prototype.refresh = function() { + this.symbol.className = this.status(); + + switch (this.status()) { + case 'skipped': + break; + + case 'passed': + this.appendSummaryToSuiteDiv(); + break; + + case 'failed': + this.appendSummaryToSuiteDiv(); + this.appendFailureDetail(); + break; + } +}; + +jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { + this.summary.className += ' ' + this.status(); + this.appendToSummary(this.spec, this.summary); +}; + +jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { + this.detail.className += ' ' + this.status(); + + var resultItems = this.spec.results().getItems(); + var messagesDiv = this.createDom('div', { className: 'messages' }); + + for (var i = 0; i < resultItems.length; i++) { + var result = resultItems[i]; + + if (result.type == 'log') { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); + } else if (result.type == 'expect' && result.passed && !result.passed()) { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); + + if (result.trace.stack) { + messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); + } + } + } + + if (messagesDiv.childNodes.length > 0) { + this.detail.appendChild(messagesDiv); + this.dom.details.appendChild(this.detail); + } +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { + this.suite = suite; + this.dom = dom; + this.views = views; + + this.element = this.createDom('div', { className: 'suite' }, + this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description) + ); + + this.appendToSummary(this.suite, this.element); +}; + +jasmine.HtmlReporter.SuiteView.prototype.status = function() { + return this.getSpecStatus(this.suite); +}; + +jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { + this.element.className += " " + this.status(); +}; + +jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); + +/* @deprecated Use jasmine.HtmlReporter instead + */ +jasmine.TrivialReporter = function(doc) { + this.document = doc || document; + this.suiteDivs = {}; + this.logRunningSpecs = false; +}; + +jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { + var el = document.createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(document.createTextNode(child)); + } else { + if (child) { el.appendChild(child); } + } + } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; +}; + +jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { + var showPassed, showSkipped; + + this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, + this.createDom('div', { className: 'banner' }, + this.createDom('div', { className: 'logo' }, + this.createDom('span', { className: 'title' }, "Jasmine"), + this.createDom('span', { className: 'version' }, runner.env.versionString())), + this.createDom('div', { className: 'options' }, + "Show ", + showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), + this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), + showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), + this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") + ) + ), + + this.runnerDiv = this.createDom('div', { className: 'runner running' }, + this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), + this.runnerMessageSpan = this.createDom('span', {}, "Running..."), + this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) + ); + + this.document.body.appendChild(this.outerDiv); + + var suites = runner.suites(); + for (var i = 0; i < suites.length; i++) { + var suite = suites[i]; + var suiteDiv = this.createDom('div', { className: 'suite' }, + this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), + this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); + this.suiteDivs[suite.id] = suiteDiv; + var parentDiv = this.outerDiv; + if (suite.parentSuite) { + parentDiv = this.suiteDivs[suite.parentSuite.id]; + } + parentDiv.appendChild(suiteDiv); + } + + this.startedAt = new Date(); + + var self = this; + showPassed.onclick = function(evt) { + if (showPassed.checked) { + self.outerDiv.className += ' show-passed'; + } else { + self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); + } + }; + + showSkipped.onclick = function(evt) { + if (showSkipped.checked) { + self.outerDiv.className += ' show-skipped'; + } else { + self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); + } + }; +}; + +jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { + var results = runner.results(); + var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; + this.runnerDiv.setAttribute("class", className); + //do it twice for IE + this.runnerDiv.setAttribute("className", className); + var specs = runner.specs(); + var specCount = 0; + for (var i = 0; i < specs.length; i++) { + if (this.specFilter(specs[i])) { + specCount++; + } + } + var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); + message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; + this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); + + this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); +}; + +jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { + var results = suite.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.totalCount === 0) { // todo: change this to check results.skipped + status = 'skipped'; + } + this.suiteDivs[suite.id].className += " " + status; +}; + +jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { + if (this.logRunningSpecs) { + this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); + } +}; + +jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { + var results = spec.results(); + var status = results.passed() ? 'passed' : 'failed'; + if (results.skipped) { + status = 'skipped'; + } + var specDiv = this.createDom('div', { className: 'spec ' + status }, + this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), + this.createDom('a', { + className: 'description', + href: '?spec=' + encodeURIComponent(spec.getFullName()), + title: spec.getFullName() + }, spec.description)); + + + var resultItems = results.getItems(); + var messagesDiv = this.createDom('div', { className: 'messages' }); + for (var i = 0; i < resultItems.length; i++) { + var result = resultItems[i]; + + if (result.type == 'log') { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); + } else if (result.type == 'expect' && result.passed && !result.passed()) { + messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); + + if (result.trace.stack) { + messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); + } + } + } + + if (messagesDiv.childNodes.length > 0) { + specDiv.appendChild(messagesDiv); + } + + this.suiteDivs[spec.suite.id].appendChild(specDiv); +}; + +jasmine.TrivialReporter.prototype.log = function() { + var console = jasmine.getGlobal().console; + if (console && console.log) { + if (console.log.apply) { + console.log.apply(console, arguments); + } else { + console.log(arguments); // ie fix: console.log.apply doesn't exist on ie + } + } +}; + +jasmine.TrivialReporter.prototype.getLocation = function() { + return this.document.location; +}; + +jasmine.TrivialReporter.prototype.specFilter = function(spec) { + var paramMap = {}; + var params = this.getLocation().search.substring(1).split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); + } + + if (!paramMap.spec) { + return true; + } + return spec.getFullName().indexOf(paramMap.spec) === 0; +}; diff --git a/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.css b/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.css new file mode 100644 index 0000000..826e575 --- /dev/null +++ b/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.css @@ -0,0 +1,81 @@ +body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } + +#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } +#HTMLReporter a { text-decoration: none; } +#HTMLReporter a:hover { text-decoration: underline; } +#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } +#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } +#HTMLReporter #jasmine_content { position: fixed; right: 100%; } +#HTMLReporter .version { color: #aaaaaa; } +#HTMLReporter .banner { margin-top: 14px; } +#HTMLReporter .duration { color: #aaaaaa; float: right; } +#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } +#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } +#HTMLReporter .symbolSummary li.passed { font-size: 14px; } +#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } +#HTMLReporter .symbolSummary li.failed { line-height: 9px; } +#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } +#HTMLReporter .symbolSummary li.skipped { font-size: 14px; } +#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } +#HTMLReporter .symbolSummary li.pending { line-height: 11px; } +#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } +#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } +#HTMLReporter .runningAlert { background-color: #666666; } +#HTMLReporter .skippedAlert { background-color: #aaaaaa; } +#HTMLReporter .skippedAlert:first-child { background-color: #333333; } +#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } +#HTMLReporter .passingAlert { background-color: #a6b779; } +#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } +#HTMLReporter .failingAlert { background-color: #cf867e; } +#HTMLReporter .failingAlert:first-child { background-color: #b03911; } +#HTMLReporter .results { margin-top: 14px; } +#HTMLReporter #details { display: none; } +#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } +#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } +#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } +#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } +#HTMLReporter.showDetails .summary { display: none; } +#HTMLReporter.showDetails #details { display: block; } +#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } +#HTMLReporter .summary { margin-top: 14px; } +#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } +#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } +#HTMLReporter .summary .specSummary.failed a { color: #b03911; } +#HTMLReporter .description + .suite { margin-top: 0; } +#HTMLReporter .suite { margin-top: 14px; } +#HTMLReporter .suite a { color: #333333; } +#HTMLReporter #details .specDetail { margin-bottom: 28px; } +#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } +#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } +#HTMLReporter .resultMessage span.result { display: block; } +#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } + +#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } +#TrivialReporter a:visited, #TrivialReporter a { color: #303; } +#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } +#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } +#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } +#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } +#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } +#TrivialReporter .runner.running { background-color: yellow; } +#TrivialReporter .options { text-align: right; font-size: .8em; } +#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } +#TrivialReporter .suite .suite { margin: 5px; } +#TrivialReporter .suite.passed { background-color: #dfd; } +#TrivialReporter .suite.failed { background-color: #fdd; } +#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } +#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } +#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } +#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } +#TrivialReporter .spec.skipped { background-color: #bbb; } +#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } +#TrivialReporter .passed { background-color: #cfc; display: none; } +#TrivialReporter .failed { background-color: #fbb; } +#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } +#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } +#TrivialReporter .resultMessage .mismatch { color: black; } +#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } +#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } +#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } +#TrivialReporter #jasmine_content { position: fixed; right: 100%; } +#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.js b/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.js new file mode 100644 index 0000000..03bf89a --- /dev/null +++ b/uhr-app/www/spec/lib/jasmine-1.2.0/jasmine.js @@ -0,0 +1,2529 @@ +var isCommonJS = typeof window == "undefined"; + +/** + * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. + * + * @namespace + */ +var jasmine = {}; +if (isCommonJS) exports.jasmine = jasmine; +/** + * @private + */ +jasmine.unimplementedMethod_ = function() { + throw new Error("unimplemented method"); +}; + +/** + * Use jasmine.undefined instead of undefined, since undefined is just + * a plain old variable and may be redefined by somebody else. + * + * @private + */ +jasmine.undefined = jasmine.___undefined___; + +/** + * Show diagnostic messages in the console if set to true + * + */ +jasmine.VERBOSE = false; + +/** + * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. + * + */ +jasmine.DEFAULT_UPDATE_INTERVAL = 250; + +/** + * Default timeout interval in milliseconds for waitsFor() blocks. + */ +jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; + +jasmine.getGlobal = function() { + function getGlobal() { + return this; + } + + return getGlobal(); +}; + +/** + * Allows for bound functions to be compared. Internal use only. + * + * @ignore + * @private + * @param base {Object} bound 'this' for the function + * @param name {Function} function to find + */ +jasmine.bindOriginal_ = function(base, name) { + var original = base[name]; + if (original.apply) { + return function() { + return original.apply(base, arguments); + }; + } else { + // IE support + return jasmine.getGlobal()[name]; + } +}; + +jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); +jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); +jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); +jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); + +jasmine.MessageResult = function(values) { + this.type = 'log'; + this.values = values; + this.trace = new Error(); // todo: test better +}; + +jasmine.MessageResult.prototype.toString = function() { + var text = ""; + for (var i = 0; i < this.values.length; i++) { + if (i > 0) text += " "; + if (jasmine.isString_(this.values[i])) { + text += this.values[i]; + } else { + text += jasmine.pp(this.values[i]); + } + } + return text; +}; + +jasmine.ExpectationResult = function(params) { + this.type = 'expect'; + this.matcherName = params.matcherName; + this.passed_ = params.passed; + this.expected = params.expected; + this.actual = params.actual; + this.message = this.passed_ ? 'Passed.' : params.message; + + var trace = (params.trace || new Error(this.message)); + this.trace = this.passed_ ? '' : trace; +}; + +jasmine.ExpectationResult.prototype.toString = function () { + return this.message; +}; + +jasmine.ExpectationResult.prototype.passed = function () { + return this.passed_; +}; + +/** + * Getter for the Jasmine environment. Ensures one gets created + */ +jasmine.getEnv = function() { + var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); + return env; +}; + +/** + * @ignore + * @private + * @param value + * @returns {Boolean} + */ +jasmine.isArray_ = function(value) { + return jasmine.isA_("Array", value); +}; + +/** + * @ignore + * @private + * @param value + * @returns {Boolean} + */ +jasmine.isString_ = function(value) { + return jasmine.isA_("String", value); +}; + +/** + * @ignore + * @private + * @param value + * @returns {Boolean} + */ +jasmine.isNumber_ = function(value) { + return jasmine.isA_("Number", value); +}; + +/** + * @ignore + * @private + * @param {String} typeName + * @param value + * @returns {Boolean} + */ +jasmine.isA_ = function(typeName, value) { + return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; +}; + +/** + * Pretty printer for expecations. Takes any object and turns it into a human-readable string. + * + * @param value {Object} an object to be outputted + * @returns {String} + */ +jasmine.pp = function(value) { + var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); + stringPrettyPrinter.format(value); + return stringPrettyPrinter.string; +}; + +/** + * Returns true if the object is a DOM Node. + * + * @param {Object} obj object to check + * @returns {Boolean} + */ +jasmine.isDomNode = function(obj) { + return obj.nodeType > 0; +}; + +/** + * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter. + * + * @example + * // don't care about which function is passed in, as long as it's a function + * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); + * + * @param {Class} clazz + * @returns matchable object of the type clazz + */ +jasmine.any = function(clazz) { + return new jasmine.Matchers.Any(clazz); +}; + +/** + * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the + * attributes on the object. + * + * @example + * // don't care about any other attributes than foo. + * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); + * + * @param sample {Object} sample + * @returns matchable object for the sample + */ +jasmine.objectContaining = function (sample) { + return new jasmine.Matchers.ObjectContaining(sample); +}; + +/** + * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. + * + * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine + * expectation syntax. Spies can be checked if they were called or not and what the calling params were. + * + * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). + * + * Spies are torn down at the end of every spec. + * + * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. + * + * @example + * // a stub + * var myStub = jasmine.createSpy('myStub'); // can be used anywhere + * + * // spy example + * var foo = { + * not: function(bool) { return !bool; } + * } + * + * // actual foo.not will not be called, execution stops + * spyOn(foo, 'not'); + + // foo.not spied upon, execution will continue to implementation + * spyOn(foo, 'not').andCallThrough(); + * + * // fake example + * var foo = { + * not: function(bool) { return !bool; } + * } + * + * // foo.not(val) will return val + * spyOn(foo, 'not').andCallFake(function(value) {return value;}); + * + * // mock example + * foo.not(7 == 7); + * expect(foo.not).toHaveBeenCalled(); + * expect(foo.not).toHaveBeenCalledWith(true); + * + * @constructor + * @see spyOn, jasmine.createSpy, jasmine.createSpyObj + * @param {String} name + */ +jasmine.Spy = function(name) { + /** + * The name of the spy, if provided. + */ + this.identity = name || 'unknown'; + /** + * Is this Object a spy? + */ + this.isSpy = true; + /** + * The actual function this spy stubs. + */ + this.plan = function() { + }; + /** + * Tracking of the most recent call to the spy. + * @example + * var mySpy = jasmine.createSpy('foo'); + * mySpy(1, 2); + * mySpy.mostRecentCall.args = [1, 2]; + */ + this.mostRecentCall = {}; + + /** + * Holds arguments for each call to the spy, indexed by call count + * @example + * var mySpy = jasmine.createSpy('foo'); + * mySpy(1, 2); + * mySpy(7, 8); + * mySpy.mostRecentCall.args = [7, 8]; + * mySpy.argsForCall[0] = [1, 2]; + * mySpy.argsForCall[1] = [7, 8]; + */ + this.argsForCall = []; + this.calls = []; +}; + +/** + * Tells a spy to call through to the actual implemenatation. + * + * @example + * var foo = { + * bar: function() { // do some stuff } + * } + * + * // defining a spy on an existing property: foo.bar + * spyOn(foo, 'bar').andCallThrough(); + */ +jasmine.Spy.prototype.andCallThrough = function() { + this.plan = this.originalValue; + return this; +}; + +/** + * For setting the return value of a spy. + * + * @example + * // defining a spy from scratch: foo() returns 'baz' + * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); + * + * // defining a spy on an existing property: foo.bar() returns 'baz' + * spyOn(foo, 'bar').andReturn('baz'); + * + * @param {Object} value + */ +jasmine.Spy.prototype.andReturn = function(value) { + this.plan = function() { + return value; + }; + return this; +}; + +/** + * For throwing an exception when a spy is called. + * + * @example + * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' + * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); + * + * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' + * spyOn(foo, 'bar').andThrow('baz'); + * + * @param {String} exceptionMsg + */ +jasmine.Spy.prototype.andThrow = function(exceptionMsg) { + this.plan = function() { + throw exceptionMsg; + }; + return this; +}; + +/** + * Calls an alternate implementation when a spy is called. + * + * @example + * var baz = function() { + * // do some stuff, return something + * } + * // defining a spy from scratch: foo() calls the function baz + * var foo = jasmine.createSpy('spy on foo').andCall(baz); + * + * // defining a spy on an existing property: foo.bar() calls an anonymnous function + * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); + * + * @param {Function} fakeFunc + */ +jasmine.Spy.prototype.andCallFake = function(fakeFunc) { + this.plan = fakeFunc; + return this; +}; + +/** + * Resets all of a spy's the tracking variables so that it can be used again. + * + * @example + * spyOn(foo, 'bar'); + * + * foo.bar(); + * + * expect(foo.bar.callCount).toEqual(1); + * + * foo.bar.reset(); + * + * expect(foo.bar.callCount).toEqual(0); + */ +jasmine.Spy.prototype.reset = function() { + this.wasCalled = false; + this.callCount = 0; + this.argsForCall = []; + this.calls = []; + this.mostRecentCall = {}; +}; + +jasmine.createSpy = function(name) { + + var spyObj = function() { + spyObj.wasCalled = true; + spyObj.callCount++; + var args = jasmine.util.argsToArray(arguments); + spyObj.mostRecentCall.object = this; + spyObj.mostRecentCall.args = args; + spyObj.argsForCall.push(args); + spyObj.calls.push({object: this, args: args}); + return spyObj.plan.apply(this, arguments); + }; + + var spy = new jasmine.Spy(name); + + for (var prop in spy) { + spyObj[prop] = spy[prop]; + } + + spyObj.reset(); + + return spyObj; +}; + +/** + * Determines whether an object is a spy. + * + * @param {jasmine.Spy|Object} putativeSpy + * @returns {Boolean} + */ +jasmine.isSpy = function(putativeSpy) { + return putativeSpy && putativeSpy.isSpy; +}; + +/** + * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something + * large in one call. + * + * @param {String} baseName name of spy class + * @param {Array} methodNames array of names of methods to make spies + */ +jasmine.createSpyObj = function(baseName, methodNames) { + if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { + throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); + } + var obj = {}; + for (var i = 0; i < methodNames.length; i++) { + obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); + } + return obj; +}; + +/** + * All parameters are pretty-printed and concatenated together, then written to the current spec's output. + * + * Be careful not to leave calls to jasmine.log in production code. + */ +jasmine.log = function() { + var spec = jasmine.getEnv().currentSpec; + spec.log.apply(spec, arguments); +}; + +/** + * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy. + * + * @example + * // spy example + * var foo = { + * not: function(bool) { return !bool; } + * } + * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops + * + * @see jasmine.createSpy + * @param obj + * @param methodName + * @returns a Jasmine spy that can be chained with all spy methods + */ +var spyOn = function(obj, methodName) { + return jasmine.getEnv().currentSpec.spyOn(obj, methodName); +}; +if (isCommonJS) exports.spyOn = spyOn; + +/** + * Creates a Jasmine spec that will be added to the current suite. + * + * // TODO: pending tests + * + * @example + * it('should be true', function() { + * expect(true).toEqual(true); + * }); + * + * @param {String} desc description of this specification + * @param {Function} func defines the preconditions and expectations of the spec + */ +var it = function(desc, func) { + return jasmine.getEnv().it(desc, func); +}; +if (isCommonJS) exports.it = it; + +/** + * Creates a disabled Jasmine spec. + * + * A convenience method that allows existing specs to be disabled temporarily during development. + * + * @param {String} desc description of this specification + * @param {Function} func defines the preconditions and expectations of the spec + */ +var xit = function(desc, func) { + return jasmine.getEnv().xit(desc, func); +}; +if (isCommonJS) exports.xit = xit; + +/** + * Starts a chain for a Jasmine expectation. + * + * It is passed an Object that is the actual value and should chain to one of the many + * jasmine.Matchers functions. + * + * @param {Object} actual Actual value to test against and expected value + */ +var expect = function(actual) { + return jasmine.getEnv().currentSpec.expect(actual); +}; +if (isCommonJS) exports.expect = expect; + +/** + * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs. + * + * @param {Function} func Function that defines part of a jasmine spec. + */ +var runs = function(func) { + jasmine.getEnv().currentSpec.runs(func); +}; +if (isCommonJS) exports.runs = runs; + +/** + * Waits a fixed time period before moving to the next block. + * + * @deprecated Use waitsFor() instead + * @param {Number} timeout milliseconds to wait + */ +var waits = function(timeout) { + jasmine.getEnv().currentSpec.waits(timeout); +}; +if (isCommonJS) exports.waits = waits; + +/** + * Waits for the latchFunction to return true before proceeding to the next block. + * + * @param {Function} latchFunction + * @param {String} optional_timeoutMessage + * @param {Number} optional_timeout + */ +var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { + jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); +}; +if (isCommonJS) exports.waitsFor = waitsFor; + +/** + * A function that is called before each spec in a suite. + * + * Used for spec setup, including validating assumptions. + * + * @param {Function} beforeEachFunction + */ +var beforeEach = function(beforeEachFunction) { + jasmine.getEnv().beforeEach(beforeEachFunction); +}; +if (isCommonJS) exports.beforeEach = beforeEach; + +/** + * A function that is called after each spec in a suite. + * + * Used for restoring any state that is hijacked during spec execution. + * + * @param {Function} afterEachFunction + */ +var afterEach = function(afterEachFunction) { + jasmine.getEnv().afterEach(afterEachFunction); +}; +if (isCommonJS) exports.afterEach = afterEach; + +/** + * Defines a suite of specifications. + * + * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared + * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization + * of setup in some tests. + * + * @example + * // TODO: a simple suite + * + * // TODO: a simple suite with a nested describe block + * + * @param {String} description A string, usually the class under test. + * @param {Function} specDefinitions function that defines several specs. + */ +var describe = function(description, specDefinitions) { + return jasmine.getEnv().describe(description, specDefinitions); +}; +if (isCommonJS) exports.describe = describe; + +/** + * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development. + * + * @param {String} description A string, usually the class under test. + * @param {Function} specDefinitions function that defines several specs. + */ +var xdescribe = function(description, specDefinitions) { + return jasmine.getEnv().xdescribe(description, specDefinitions); +}; +if (isCommonJS) exports.xdescribe = xdescribe; + + +// Provide the XMLHttpRequest class for IE 5.x-6.x: +jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { + function tryIt(f) { + try { + return f(); + } catch(e) { + } + return null; + } + + var xhr = tryIt(function() { + return new ActiveXObject("Msxml2.XMLHTTP.6.0"); + }) || + tryIt(function() { + return new ActiveXObject("Msxml2.XMLHTTP.3.0"); + }) || + tryIt(function() { + return new ActiveXObject("Msxml2.XMLHTTP"); + }) || + tryIt(function() { + return new ActiveXObject("Microsoft.XMLHTTP"); + }); + + if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); + + return xhr; +} : XMLHttpRequest; +/** + * @namespace + */ +jasmine.util = {}; + +/** + * Declare that a child class inherit it's prototype from the parent class. + * + * @private + * @param {Function} childClass + * @param {Function} parentClass + */ +jasmine.util.inherit = function(childClass, parentClass) { + /** + * @private + */ + var subclass = function() { + }; + subclass.prototype = parentClass.prototype; + childClass.prototype = new subclass(); +}; + +jasmine.util.formatException = function(e) { + var lineNumber; + if (e.line) { + lineNumber = e.line; + } + else if (e.lineNumber) { + lineNumber = e.lineNumber; + } + + var file; + + if (e.sourceURL) { + file = e.sourceURL; + } + else if (e.fileName) { + file = e.fileName; + } + + var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); + + if (file && lineNumber) { + message += ' in ' + file + ' (line ' + lineNumber + ')'; + } + + return message; +}; + +jasmine.util.htmlEscape = function(str) { + if (!str) return str; + return str.replace(/&/g, '&') + .replace(//g, '>'); +}; + +jasmine.util.argsToArray = function(args) { + var arrayOfArgs = []; + for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); + return arrayOfArgs; +}; + +jasmine.util.extend = function(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; +}; + +/** + * Environment for Jasmine + * + * @constructor + */ +jasmine.Env = function() { + this.currentSpec = null; + this.currentSuite = null; + this.currentRunner_ = new jasmine.Runner(this); + + this.reporter = new jasmine.MultiReporter(); + + this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; + this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; + this.lastUpdate = 0; + this.specFilter = function() { + return true; + }; + + this.nextSpecId_ = 0; + this.nextSuiteId_ = 0; + this.equalityTesters_ = []; + + // wrap matchers + this.matchersClass = function() { + jasmine.Matchers.apply(this, arguments); + }; + jasmine.util.inherit(this.matchersClass, jasmine.Matchers); + + jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); +}; + + +jasmine.Env.prototype.setTimeout = jasmine.setTimeout; +jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; +jasmine.Env.prototype.setInterval = jasmine.setInterval; +jasmine.Env.prototype.clearInterval = jasmine.clearInterval; + +/** + * @returns an object containing jasmine version build info, if set. + */ +jasmine.Env.prototype.version = function () { + if (jasmine.version_) { + return jasmine.version_; + } else { + throw new Error('Version not set'); + } +}; + +/** + * @returns string containing jasmine version build info, if set. + */ +jasmine.Env.prototype.versionString = function() { + if (!jasmine.version_) { + return "version unknown"; + } + + var version = this.version(); + var versionString = version.major + "." + version.minor + "." + version.build; + if (version.release_candidate) { + versionString += ".rc" + version.release_candidate; + } + versionString += " revision " + version.revision; + return versionString; +}; + +/** + * @returns a sequential integer starting at 0 + */ +jasmine.Env.prototype.nextSpecId = function () { + return this.nextSpecId_++; +}; + +/** + * @returns a sequential integer starting at 0 + */ +jasmine.Env.prototype.nextSuiteId = function () { + return this.nextSuiteId_++; +}; + +/** + * Register a reporter to receive status updates from Jasmine. + * @param {jasmine.Reporter} reporter An object which will receive status updates. + */ +jasmine.Env.prototype.addReporter = function(reporter) { + this.reporter.addReporter(reporter); +}; + +jasmine.Env.prototype.execute = function() { + this.currentRunner_.execute(); +}; + +jasmine.Env.prototype.describe = function(description, specDefinitions) { + var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); + + var parentSuite = this.currentSuite; + if (parentSuite) { + parentSuite.add(suite); + } else { + this.currentRunner_.add(suite); + } + + this.currentSuite = suite; + + var declarationError = null; + try { + specDefinitions.call(suite); + } catch(e) { + declarationError = e; + } + + if (declarationError) { + this.it("encountered a declaration exception", function() { + throw declarationError; + }); + } + + this.currentSuite = parentSuite; + + return suite; +}; + +jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { + if (this.currentSuite) { + this.currentSuite.beforeEach(beforeEachFunction); + } else { + this.currentRunner_.beforeEach(beforeEachFunction); + } +}; + +jasmine.Env.prototype.currentRunner = function () { + return this.currentRunner_; +}; + +jasmine.Env.prototype.afterEach = function(afterEachFunction) { + if (this.currentSuite) { + this.currentSuite.afterEach(afterEachFunction); + } else { + this.currentRunner_.afterEach(afterEachFunction); + } + +}; + +jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { + return { + execute: function() { + } + }; +}; + +jasmine.Env.prototype.it = function(description, func) { + var spec = new jasmine.Spec(this, this.currentSuite, description); + this.currentSuite.add(spec); + this.currentSpec = spec; + + if (func) { + spec.runs(func); + } + + return spec; +}; + +jasmine.Env.prototype.xit = function(desc, func) { + return { + id: this.nextSpecId(), + runs: function() { + } + }; +}; + +jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { + if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { + return true; + } + + a.__Jasmine_been_here_before__ = b; + b.__Jasmine_been_here_before__ = a; + + var hasKey = function(obj, keyName) { + return obj !== null && obj[keyName] !== jasmine.undefined; + }; + + for (var property in b) { + if (!hasKey(a, property) && hasKey(b, property)) { + mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + } + } + for (property in a) { + if (!hasKey(b, property) && hasKey(a, property)) { + mismatchKeys.push("expected missing key '" + property + "', but present in actual."); + } + } + for (property in b) { + if (property == '__Jasmine_been_here_before__') continue; + if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { + mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); + } + } + + if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { + mismatchValues.push("arrays were not the same length"); + } + + delete a.__Jasmine_been_here_before__; + delete b.__Jasmine_been_here_before__; + return (mismatchKeys.length === 0 && mismatchValues.length === 0); +}; + +jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { + mismatchKeys = mismatchKeys || []; + mismatchValues = mismatchValues || []; + + for (var i = 0; i < this.equalityTesters_.length; i++) { + var equalityTester = this.equalityTesters_[i]; + var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); + if (result !== jasmine.undefined) return result; + } + + if (a === b) return true; + + if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { + return (a == jasmine.undefined && b == jasmine.undefined); + } + + if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { + return a === b; + } + + if (a instanceof Date && b instanceof Date) { + return a.getTime() == b.getTime(); + } + + if (a.jasmineMatches) { + return a.jasmineMatches(b); + } + + if (b.jasmineMatches) { + return b.jasmineMatches(a); + } + + if (a instanceof jasmine.Matchers.ObjectContaining) { + return a.matches(b); + } + + if (b instanceof jasmine.Matchers.ObjectContaining) { + return b.matches(a); + } + + if (jasmine.isString_(a) && jasmine.isString_(b)) { + return (a == b); + } + + if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { + return (a == b); + } + + if (typeof a === "object" && typeof b === "object") { + return this.compareObjects_(a, b, mismatchKeys, mismatchValues); + } + + //Straight check + return (a === b); +}; + +jasmine.Env.prototype.contains_ = function(haystack, needle) { + if (jasmine.isArray_(haystack)) { + for (var i = 0; i < haystack.length; i++) { + if (this.equals_(haystack[i], needle)) return true; + } + return false; + } + return haystack.indexOf(needle) >= 0; +}; + +jasmine.Env.prototype.addEqualityTester = function(equalityTester) { + this.equalityTesters_.push(equalityTester); +}; +/** No-op base class for Jasmine reporters. + * + * @constructor + */ +jasmine.Reporter = function() { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportRunnerResults = function(runner) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportSuiteResults = function(suite) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportSpecStarting = function(spec) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportSpecResults = function(spec) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.log = function(str) { +}; + +/** + * Blocks are functions with executable code that make up a spec. + * + * @constructor + * @param {jasmine.Env} env + * @param {Function} func + * @param {jasmine.Spec} spec + */ +jasmine.Block = function(env, func, spec) { + this.env = env; + this.func = func; + this.spec = spec; +}; + +jasmine.Block.prototype.execute = function(onComplete) { + try { + this.func.apply(this.spec); + } catch (e) { + this.spec.fail(e); + } + onComplete(); +}; +/** JavaScript API reporter. + * + * @constructor + */ +jasmine.JsApiReporter = function() { + this.started = false; + this.finished = false; + this.suites_ = []; + this.results_ = {}; +}; + +jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { + this.started = true; + var suites = runner.topLevelSuites(); + for (var i = 0; i < suites.length; i++) { + var suite = suites[i]; + this.suites_.push(this.summarize_(suite)); + } +}; + +jasmine.JsApiReporter.prototype.suites = function() { + return this.suites_; +}; + +jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { + var isSuite = suiteOrSpec instanceof jasmine.Suite; + var summary = { + id: suiteOrSpec.id, + name: suiteOrSpec.description, + type: isSuite ? 'suite' : 'spec', + children: [] + }; + + if (isSuite) { + var children = suiteOrSpec.children(); + for (var i = 0; i < children.length; i++) { + summary.children.push(this.summarize_(children[i])); + } + } + return summary; +}; + +jasmine.JsApiReporter.prototype.results = function() { + return this.results_; +}; + +jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { + return this.results_[specId]; +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { + this.finished = true; +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { + this.results_[spec.id] = { + messages: spec.results().getItems(), + result: spec.results().failedCount > 0 ? "failed" : "passed" + }; +}; + +//noinspection JSUnusedLocalSymbols +jasmine.JsApiReporter.prototype.log = function(str) { +}; + +jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ + var results = {}; + for (var i = 0; i < specIds.length; i++) { + var specId = specIds[i]; + results[specId] = this.summarizeResult_(this.results_[specId]); + } + return results; +}; + +jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ + var summaryMessages = []; + var messagesLength = result.messages.length; + for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { + var resultMessage = result.messages[messageIndex]; + summaryMessages.push({ + text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, + passed: resultMessage.passed ? resultMessage.passed() : true, + type: resultMessage.type, + message: resultMessage.message, + trace: { + stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined + } + }); + } + + return { + result : result.result, + messages : summaryMessages + }; +}; + +/** + * @constructor + * @param {jasmine.Env} env + * @param actual + * @param {jasmine.Spec} spec + */ +jasmine.Matchers = function(env, actual, spec, opt_isNot) { + this.env = env; + this.actual = actual; + this.spec = spec; + this.isNot = opt_isNot || false; + this.reportWasCalled_ = false; +}; + +// todo: @deprecated as of Jasmine 0.11, remove soon [xw] +jasmine.Matchers.pp = function(str) { + throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); +}; + +// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] +jasmine.Matchers.prototype.report = function(result, failing_message, details) { + throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); +}; + +jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { + for (var methodName in prototype) { + if (methodName == 'report') continue; + var orig = prototype[methodName]; + matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); + } +}; + +jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { + return function() { + var matcherArgs = jasmine.util.argsToArray(arguments); + var result = matcherFunction.apply(this, arguments); + + if (this.isNot) { + result = !result; + } + + if (this.reportWasCalled_) return result; + + var message; + if (!result) { + if (this.message) { + message = this.message.apply(this, arguments); + if (jasmine.isArray_(message)) { + message = message[this.isNot ? 1 : 0]; + } + } else { + var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); + message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; + if (matcherArgs.length > 0) { + for (var i = 0; i < matcherArgs.length; i++) { + if (i > 0) message += ","; + message += " " + jasmine.pp(matcherArgs[i]); + } + } + message += "."; + } + } + var expectationResult = new jasmine.ExpectationResult({ + matcherName: matcherName, + passed: result, + expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], + actual: this.actual, + message: message + }); + this.spec.addMatcherResult(expectationResult); + return jasmine.undefined; + }; +}; + + + + +/** + * toBe: compares the actual to the expected using === + * @param expected + */ +jasmine.Matchers.prototype.toBe = function(expected) { + return this.actual === expected; +}; + +/** + * toNotBe: compares the actual to the expected using !== + * @param expected + * @deprecated as of 1.0. Use not.toBe() instead. + */ +jasmine.Matchers.prototype.toNotBe = function(expected) { + return this.actual !== expected; +}; + +/** + * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. + * + * @param expected + */ +jasmine.Matchers.prototype.toEqual = function(expected) { + return this.env.equals_(this.actual, expected); +}; + +/** + * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual + * @param expected + * @deprecated as of 1.0. Use not.toEqual() instead. + */ +jasmine.Matchers.prototype.toNotEqual = function(expected) { + return !this.env.equals_(this.actual, expected); +}; + +/** + * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes + * a pattern or a String. + * + * @param expected + */ +jasmine.Matchers.prototype.toMatch = function(expected) { + return new RegExp(expected).test(this.actual); +}; + +/** + * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch + * @param expected + * @deprecated as of 1.0. Use not.toMatch() instead. + */ +jasmine.Matchers.prototype.toNotMatch = function(expected) { + return !(new RegExp(expected).test(this.actual)); +}; + +/** + * Matcher that compares the actual to jasmine.undefined. + */ +jasmine.Matchers.prototype.toBeDefined = function() { + return (this.actual !== jasmine.undefined); +}; + +/** + * Matcher that compares the actual to jasmine.undefined. + */ +jasmine.Matchers.prototype.toBeUndefined = function() { + return (this.actual === jasmine.undefined); +}; + +/** + * Matcher that compares the actual to null. + */ +jasmine.Matchers.prototype.toBeNull = function() { + return (this.actual === null); +}; + +/** + * Matcher that boolean not-nots the actual. + */ +jasmine.Matchers.prototype.toBeTruthy = function() { + return !!this.actual; +}; + + +/** + * Matcher that boolean nots the actual. + */ +jasmine.Matchers.prototype.toBeFalsy = function() { + return !this.actual; +}; + + +/** + * Matcher that checks to see if the actual, a Jasmine spy, was called. + */ +jasmine.Matchers.prototype.toHaveBeenCalled = function() { + if (arguments.length > 0) { + throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); + } + + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to have been called.", + "Expected spy " + this.actual.identity + " not to have been called." + ]; + }; + + return this.actual.wasCalled; +}; + +/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ +jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; + +/** + * Matcher that checks to see if the actual, a Jasmine spy, was not called. + * + * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead + */ +jasmine.Matchers.prototype.wasNotCalled = function() { + if (arguments.length > 0) { + throw new Error('wasNotCalled does not take arguments'); + } + + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to not have been called.", + "Expected spy " + this.actual.identity + " to have been called." + ]; + }; + + return !this.actual.wasCalled; +}; + +/** + * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. + * + * @example + * + */ +jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { + var expectedArgs = jasmine.util.argsToArray(arguments); + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + this.message = function() { + if (this.actual.callCount === 0) { + // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw] + return [ + "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.", + "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was." + ]; + } else { + return [ + "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall), + "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall) + ]; + } + }; + + return this.env.contains_(this.actual.argsForCall, expectedArgs); +}; + +/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ +jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; + +/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ +jasmine.Matchers.prototype.wasNotCalledWith = function() { + var expectedArgs = jasmine.util.argsToArray(arguments); + if (!jasmine.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", + "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" + ]; + }; + + return !this.env.contains_(this.actual.argsForCall, expectedArgs); +}; + +/** + * Matcher that checks that the expected item is an element in the actual Array. + * + * @param {Object} expected + */ +jasmine.Matchers.prototype.toContain = function(expected) { + return this.env.contains_(this.actual, expected); +}; + +/** + * Matcher that checks that the expected item is NOT an element in the actual Array. + * + * @param {Object} expected + * @deprecated as of 1.0. Use not.toContain() instead. + */ +jasmine.Matchers.prototype.toNotContain = function(expected) { + return !this.env.contains_(this.actual, expected); +}; + +jasmine.Matchers.prototype.toBeLessThan = function(expected) { + return this.actual < expected; +}; + +jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { + return this.actual > expected; +}; + +/** + * Matcher that checks that the expected item is equal to the actual item + * up to a given level of decimal precision (default 2). + * + * @param {Number} expected + * @param {Number} precision + */ +jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { + if (!(precision === 0)) { + precision = precision || 2; + } + var multiplier = Math.pow(10, precision); + var actual = Math.round(this.actual * multiplier); + expected = Math.round(expected * multiplier); + return expected == actual; +}; + +/** + * Matcher that checks that the expected exception was thrown by the actual. + * + * @param {String} expected + */ +jasmine.Matchers.prototype.toThrow = function(expected) { + var result = false; + var exception; + if (typeof this.actual != 'function') { + throw new Error('Actual is not a function'); + } + try { + this.actual(); + } catch (e) { + exception = e; + } + if (exception) { + result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); + } + + var not = this.isNot ? "not " : ""; + + this.message = function() { + if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { + return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' '); + } else { + return "Expected function to throw an exception."; + } + }; + + return result; +}; + +jasmine.Matchers.Any = function(expectedClass) { + this.expectedClass = expectedClass; +}; + +jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { + if (this.expectedClass == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedClass == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedClass == Function) { + return typeof other == 'function' || other instanceof Function; + } + + if (this.expectedClass == Object) { + return typeof other == 'object'; + } + + return other instanceof this.expectedClass; +}; + +jasmine.Matchers.Any.prototype.jasmineToString = function() { + return ''; +}; + +jasmine.Matchers.ObjectContaining = function (sample) { + this.sample = sample; +}; + +jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { + mismatchKeys = mismatchKeys || []; + mismatchValues = mismatchValues || []; + + var env = jasmine.getEnv(); + + var hasKey = function(obj, keyName) { + return obj != null && obj[keyName] !== jasmine.undefined; + }; + + for (var property in this.sample) { + if (!hasKey(other, property) && hasKey(this.sample, property)) { + mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + } + else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { + mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); + } + } + + return (mismatchKeys.length === 0 && mismatchValues.length === 0); +}; + +jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () { + return ""; +}; +// Mock setTimeout, clearTimeout +// Contributed by Pivotal Computer Systems, www.pivotalsf.com + +jasmine.FakeTimer = function() { + this.reset(); + + var self = this; + self.setTimeout = function(funcToCall, millis) { + self.timeoutsMade++; + self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); + return self.timeoutsMade; + }; + + self.setInterval = function(funcToCall, millis) { + self.timeoutsMade++; + self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); + return self.timeoutsMade; + }; + + self.clearTimeout = function(timeoutKey) { + self.scheduledFunctions[timeoutKey] = jasmine.undefined; + }; + + self.clearInterval = function(timeoutKey) { + self.scheduledFunctions[timeoutKey] = jasmine.undefined; + }; + +}; + +jasmine.FakeTimer.prototype.reset = function() { + this.timeoutsMade = 0; + this.scheduledFunctions = {}; + this.nowMillis = 0; +}; + +jasmine.FakeTimer.prototype.tick = function(millis) { + var oldMillis = this.nowMillis; + var newMillis = oldMillis + millis; + this.runFunctionsWithinRange(oldMillis, newMillis); + this.nowMillis = newMillis; +}; + +jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { + var scheduledFunc; + var funcsToRun = []; + for (var timeoutKey in this.scheduledFunctions) { + scheduledFunc = this.scheduledFunctions[timeoutKey]; + if (scheduledFunc != jasmine.undefined && + scheduledFunc.runAtMillis >= oldMillis && + scheduledFunc.runAtMillis <= nowMillis) { + funcsToRun.push(scheduledFunc); + this.scheduledFunctions[timeoutKey] = jasmine.undefined; + } + } + + if (funcsToRun.length > 0) { + funcsToRun.sort(function(a, b) { + return a.runAtMillis - b.runAtMillis; + }); + for (var i = 0; i < funcsToRun.length; ++i) { + try { + var funcToRun = funcsToRun[i]; + this.nowMillis = funcToRun.runAtMillis; + funcToRun.funcToCall(); + if (funcToRun.recurring) { + this.scheduleFunction(funcToRun.timeoutKey, + funcToRun.funcToCall, + funcToRun.millis, + true); + } + } catch(e) { + } + } + this.runFunctionsWithinRange(oldMillis, nowMillis); + } +}; + +jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { + this.scheduledFunctions[timeoutKey] = { + runAtMillis: this.nowMillis + millis, + funcToCall: funcToCall, + recurring: recurring, + timeoutKey: timeoutKey, + millis: millis + }; +}; + +/** + * @namespace + */ +jasmine.Clock = { + defaultFakeTimer: new jasmine.FakeTimer(), + + reset: function() { + jasmine.Clock.assertInstalled(); + jasmine.Clock.defaultFakeTimer.reset(); + }, + + tick: function(millis) { + jasmine.Clock.assertInstalled(); + jasmine.Clock.defaultFakeTimer.tick(millis); + }, + + runFunctionsWithinRange: function(oldMillis, nowMillis) { + jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); + }, + + scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { + jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); + }, + + useMock: function() { + if (!jasmine.Clock.isInstalled()) { + var spec = jasmine.getEnv().currentSpec; + spec.after(jasmine.Clock.uninstallMock); + + jasmine.Clock.installMock(); + } + }, + + installMock: function() { + jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; + }, + + uninstallMock: function() { + jasmine.Clock.assertInstalled(); + jasmine.Clock.installed = jasmine.Clock.real; + }, + + real: { + setTimeout: jasmine.getGlobal().setTimeout, + clearTimeout: jasmine.getGlobal().clearTimeout, + setInterval: jasmine.getGlobal().setInterval, + clearInterval: jasmine.getGlobal().clearInterval + }, + + assertInstalled: function() { + if (!jasmine.Clock.isInstalled()) { + throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); + } + }, + + isInstalled: function() { + return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; + }, + + installed: null +}; +jasmine.Clock.installed = jasmine.Clock.real; + +//else for IE support +jasmine.getGlobal().setTimeout = function(funcToCall, millis) { + if (jasmine.Clock.installed.setTimeout.apply) { + return jasmine.Clock.installed.setTimeout.apply(this, arguments); + } else { + return jasmine.Clock.installed.setTimeout(funcToCall, millis); + } +}; + +jasmine.getGlobal().setInterval = function(funcToCall, millis) { + if (jasmine.Clock.installed.setInterval.apply) { + return jasmine.Clock.installed.setInterval.apply(this, arguments); + } else { + return jasmine.Clock.installed.setInterval(funcToCall, millis); + } +}; + +jasmine.getGlobal().clearTimeout = function(timeoutKey) { + if (jasmine.Clock.installed.clearTimeout.apply) { + return jasmine.Clock.installed.clearTimeout.apply(this, arguments); + } else { + return jasmine.Clock.installed.clearTimeout(timeoutKey); + } +}; + +jasmine.getGlobal().clearInterval = function(timeoutKey) { + if (jasmine.Clock.installed.clearTimeout.apply) { + return jasmine.Clock.installed.clearInterval.apply(this, arguments); + } else { + return jasmine.Clock.installed.clearInterval(timeoutKey); + } +}; + +/** + * @constructor + */ +jasmine.MultiReporter = function() { + this.subReporters_ = []; +}; +jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); + +jasmine.MultiReporter.prototype.addReporter = function(reporter) { + this.subReporters_.push(reporter); +}; + +(function() { + var functionNames = [ + "reportRunnerStarting", + "reportRunnerResults", + "reportSuiteResults", + "reportSpecStarting", + "reportSpecResults", + "log" + ]; + for (var i = 0; i < functionNames.length; i++) { + var functionName = functionNames[i]; + jasmine.MultiReporter.prototype[functionName] = (function(functionName) { + return function() { + for (var j = 0; j < this.subReporters_.length; j++) { + var subReporter = this.subReporters_[j]; + if (subReporter[functionName]) { + subReporter[functionName].apply(subReporter, arguments); + } + } + }; + })(functionName); + } +})(); +/** + * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults + * + * @constructor + */ +jasmine.NestedResults = function() { + /** + * The total count of results + */ + this.totalCount = 0; + /** + * Number of passed results + */ + this.passedCount = 0; + /** + * Number of failed results + */ + this.failedCount = 0; + /** + * Was this suite/spec skipped? + */ + this.skipped = false; + /** + * @ignore + */ + this.items_ = []; +}; + +/** + * Roll up the result counts. + * + * @param result + */ +jasmine.NestedResults.prototype.rollupCounts = function(result) { + this.totalCount += result.totalCount; + this.passedCount += result.passedCount; + this.failedCount += result.failedCount; +}; + +/** + * Adds a log message. + * @param values Array of message parts which will be concatenated later. + */ +jasmine.NestedResults.prototype.log = function(values) { + this.items_.push(new jasmine.MessageResult(values)); +}; + +/** + * Getter for the results: message & results. + */ +jasmine.NestedResults.prototype.getItems = function() { + return this.items_; +}; + +/** + * Adds a result, tracking counts (total, passed, & failed) + * @param {jasmine.ExpectationResult|jasmine.NestedResults} result + */ +jasmine.NestedResults.prototype.addResult = function(result) { + if (result.type != 'log') { + if (result.items_) { + this.rollupCounts(result); + } else { + this.totalCount++; + if (result.passed()) { + this.passedCount++; + } else { + this.failedCount++; + } + } + } + this.items_.push(result); +}; + +/** + * @returns {Boolean} True if everything below passed + */ +jasmine.NestedResults.prototype.passed = function() { + return this.passedCount === this.totalCount; +}; +/** + * Base class for pretty printing for expectation results. + */ +jasmine.PrettyPrinter = function() { + this.ppNestLevel_ = 0; +}; + +/** + * Formats a value in a nice, human-readable string. + * + * @param value + */ +jasmine.PrettyPrinter.prototype.format = function(value) { + if (this.ppNestLevel_ > 40) { + throw new Error('jasmine.PrettyPrinter: format() nested too deeply!'); + } + + this.ppNestLevel_++; + try { + if (value === jasmine.undefined) { + this.emitScalar('undefined'); + } else if (value === null) { + this.emitScalar('null'); + } else if (value === jasmine.getGlobal()) { + this.emitScalar(''); + } else if (value.jasmineToString) { + this.emitScalar(value.jasmineToString()); + } else if (typeof value === 'string') { + this.emitString(value); + } else if (jasmine.isSpy(value)) { + this.emitScalar("spy on " + value.identity); + } else if (value instanceof RegExp) { + this.emitScalar(value.toString()); + } else if (typeof value === 'function') { + this.emitScalar('Function'); + } else if (typeof value.nodeType === 'number') { + this.emitScalar('HTMLNode'); + } else if (value instanceof Date) { + this.emitScalar('Date(' + value + ')'); + } else if (value.__Jasmine_been_here_before__) { + this.emitScalar(''); + } else if (jasmine.isArray_(value) || typeof value == 'object') { + value.__Jasmine_been_here_before__ = true; + if (jasmine.isArray_(value)) { + this.emitArray(value); + } else { + this.emitObject(value); + } + delete value.__Jasmine_been_here_before__; + } else { + this.emitScalar(value.toString()); + } + } finally { + this.ppNestLevel_--; + } +}; + +jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { + for (var property in obj) { + if (property == '__Jasmine_been_here_before__') continue; + fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && + obj.__lookupGetter__(property) !== null) : false); + } +}; + +jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; +jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; + +jasmine.StringPrettyPrinter = function() { + jasmine.PrettyPrinter.call(this); + + this.string = ''; +}; +jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); + +jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { + this.append(value); +}; + +jasmine.StringPrettyPrinter.prototype.emitString = function(value) { + this.append("'" + value + "'"); +}; + +jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { + this.append('[ '); + for (var i = 0; i < array.length; i++) { + if (i > 0) { + this.append(', '); + } + this.format(array[i]); + } + this.append(' ]'); +}; + +jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { + var self = this; + this.append('{ '); + var first = true; + + this.iterateObject(obj, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.append(property); + self.append(' : '); + if (isGetter) { + self.append(''); + } else { + self.format(obj[property]); + } + }); + + this.append(' }'); +}; + +jasmine.StringPrettyPrinter.prototype.append = function(value) { + this.string += value; +}; +jasmine.Queue = function(env) { + this.env = env; + this.blocks = []; + this.running = false; + this.index = 0; + this.offset = 0; + this.abort = false; +}; + +jasmine.Queue.prototype.addBefore = function(block) { + this.blocks.unshift(block); +}; + +jasmine.Queue.prototype.add = function(block) { + this.blocks.push(block); +}; + +jasmine.Queue.prototype.insertNext = function(block) { + this.blocks.splice((this.index + this.offset + 1), 0, block); + this.offset++; +}; + +jasmine.Queue.prototype.start = function(onComplete) { + this.running = true; + this.onComplete = onComplete; + this.next_(); +}; + +jasmine.Queue.prototype.isRunning = function() { + return this.running; +}; + +jasmine.Queue.LOOP_DONT_RECURSE = true; + +jasmine.Queue.prototype.next_ = function() { + var self = this; + var goAgain = true; + + while (goAgain) { + goAgain = false; + + if (self.index < self.blocks.length && !this.abort) { + var calledSynchronously = true; + var completedSynchronously = false; + + var onComplete = function () { + if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { + completedSynchronously = true; + return; + } + + if (self.blocks[self.index].abort) { + self.abort = true; + } + + self.offset = 0; + self.index++; + + var now = new Date().getTime(); + if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { + self.env.lastUpdate = now; + self.env.setTimeout(function() { + self.next_(); + }, 0); + } else { + if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { + goAgain = true; + } else { + self.next_(); + } + } + }; + self.blocks[self.index].execute(onComplete); + + calledSynchronously = false; + if (completedSynchronously) { + onComplete(); + } + + } else { + self.running = false; + if (self.onComplete) { + self.onComplete(); + } + } + } +}; + +jasmine.Queue.prototype.results = function() { + var results = new jasmine.NestedResults(); + for (var i = 0; i < this.blocks.length; i++) { + if (this.blocks[i].results) { + results.addResult(this.blocks[i].results()); + } + } + return results; +}; + + +/** + * Runner + * + * @constructor + * @param {jasmine.Env} env + */ +jasmine.Runner = function(env) { + var self = this; + self.env = env; + self.queue = new jasmine.Queue(env); + self.before_ = []; + self.after_ = []; + self.suites_ = []; +}; + +jasmine.Runner.prototype.execute = function() { + var self = this; + if (self.env.reporter.reportRunnerStarting) { + self.env.reporter.reportRunnerStarting(this); + } + self.queue.start(function () { + self.finishCallback(); + }); +}; + +jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { + beforeEachFunction.typeName = 'beforeEach'; + this.before_.splice(0,0,beforeEachFunction); +}; + +jasmine.Runner.prototype.afterEach = function(afterEachFunction) { + afterEachFunction.typeName = 'afterEach'; + this.after_.splice(0,0,afterEachFunction); +}; + + +jasmine.Runner.prototype.finishCallback = function() { + this.env.reporter.reportRunnerResults(this); +}; + +jasmine.Runner.prototype.addSuite = function(suite) { + this.suites_.push(suite); +}; + +jasmine.Runner.prototype.add = function(block) { + if (block instanceof jasmine.Suite) { + this.addSuite(block); + } + this.queue.add(block); +}; + +jasmine.Runner.prototype.specs = function () { + var suites = this.suites(); + var specs = []; + for (var i = 0; i < suites.length; i++) { + specs = specs.concat(suites[i].specs()); + } + return specs; +}; + +jasmine.Runner.prototype.suites = function() { + return this.suites_; +}; + +jasmine.Runner.prototype.topLevelSuites = function() { + var topLevelSuites = []; + for (var i = 0; i < this.suites_.length; i++) { + if (!this.suites_[i].parentSuite) { + topLevelSuites.push(this.suites_[i]); + } + } + return topLevelSuites; +}; + +jasmine.Runner.prototype.results = function() { + return this.queue.results(); +}; +/** + * Internal representation of a Jasmine specification, or test. + * + * @constructor + * @param {jasmine.Env} env + * @param {jasmine.Suite} suite + * @param {String} description + */ +jasmine.Spec = function(env, suite, description) { + if (!env) { + throw new Error('jasmine.Env() required'); + } + if (!suite) { + throw new Error('jasmine.Suite() required'); + } + var spec = this; + spec.id = env.nextSpecId ? env.nextSpecId() : null; + spec.env = env; + spec.suite = suite; + spec.description = description; + spec.queue = new jasmine.Queue(env); + + spec.afterCallbacks = []; + spec.spies_ = []; + + spec.results_ = new jasmine.NestedResults(); + spec.results_.description = description; + spec.matchersClass = null; +}; + +jasmine.Spec.prototype.getFullName = function() { + return this.suite.getFullName() + ' ' + this.description + '.'; +}; + + +jasmine.Spec.prototype.results = function() { + return this.results_; +}; + +/** + * All parameters are pretty-printed and concatenated together, then written to the spec's output. + * + * Be careful not to leave calls to jasmine.log in production code. + */ +jasmine.Spec.prototype.log = function() { + return this.results_.log(arguments); +}; + +jasmine.Spec.prototype.runs = function (func) { + var block = new jasmine.Block(this.env, func, this); + this.addToQueue(block); + return this; +}; + +jasmine.Spec.prototype.addToQueue = function (block) { + if (this.queue.isRunning()) { + this.queue.insertNext(block); + } else { + this.queue.add(block); + } +}; + +/** + * @param {jasmine.ExpectationResult} result + */ +jasmine.Spec.prototype.addMatcherResult = function(result) { + this.results_.addResult(result); +}; + +jasmine.Spec.prototype.expect = function(actual) { + var positive = new (this.getMatchersClass_())(this.env, actual, this); + positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); + return positive; +}; + +/** + * Waits a fixed time period before moving to the next block. + * + * @deprecated Use waitsFor() instead + * @param {Number} timeout milliseconds to wait + */ +jasmine.Spec.prototype.waits = function(timeout) { + var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); + this.addToQueue(waitsFunc); + return this; +}; + +/** + * Waits for the latchFunction to return true before proceeding to the next block. + * + * @param {Function} latchFunction + * @param {String} optional_timeoutMessage + * @param {Number} optional_timeout + */ +jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { + var latchFunction_ = null; + var optional_timeoutMessage_ = null; + var optional_timeout_ = null; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + switch (typeof arg) { + case 'function': + latchFunction_ = arg; + break; + case 'string': + optional_timeoutMessage_ = arg; + break; + case 'number': + optional_timeout_ = arg; + break; + } + } + + var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); + this.addToQueue(waitsForFunc); + return this; +}; + +jasmine.Spec.prototype.fail = function (e) { + var expectationResult = new jasmine.ExpectationResult({ + passed: false, + message: e ? jasmine.util.formatException(e) : 'Exception', + trace: { stack: e.stack } + }); + this.results_.addResult(expectationResult); +}; + +jasmine.Spec.prototype.getMatchersClass_ = function() { + return this.matchersClass || this.env.matchersClass; +}; + +jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { + var parent = this.getMatchersClass_(); + var newMatchersClass = function() { + parent.apply(this, arguments); + }; + jasmine.util.inherit(newMatchersClass, parent); + jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); + this.matchersClass = newMatchersClass; +}; + +jasmine.Spec.prototype.finishCallback = function() { + this.env.reporter.reportSpecResults(this); +}; + +jasmine.Spec.prototype.finish = function(onComplete) { + this.removeAllSpies(); + this.finishCallback(); + if (onComplete) { + onComplete(); + } +}; + +jasmine.Spec.prototype.after = function(doAfter) { + if (this.queue.isRunning()) { + this.queue.add(new jasmine.Block(this.env, doAfter, this)); + } else { + this.afterCallbacks.unshift(doAfter); + } +}; + +jasmine.Spec.prototype.execute = function(onComplete) { + var spec = this; + if (!spec.env.specFilter(spec)) { + spec.results_.skipped = true; + spec.finish(onComplete); + return; + } + + this.env.reporter.reportSpecStarting(this); + + spec.env.currentSpec = spec; + + spec.addBeforesAndAftersToQueue(); + + spec.queue.start(function () { + spec.finish(onComplete); + }); +}; + +jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { + var runner = this.env.currentRunner(); + var i; + + for (var suite = this.suite; suite; suite = suite.parentSuite) { + for (i = 0; i < suite.before_.length; i++) { + this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); + } + } + for (i = 0; i < runner.before_.length; i++) { + this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); + } + for (i = 0; i < this.afterCallbacks.length; i++) { + this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this)); + } + for (suite = this.suite; suite; suite = suite.parentSuite) { + for (i = 0; i < suite.after_.length; i++) { + this.queue.add(new jasmine.Block(this.env, suite.after_[i], this)); + } + } + for (i = 0; i < runner.after_.length; i++) { + this.queue.add(new jasmine.Block(this.env, runner.after_[i], this)); + } +}; + +jasmine.Spec.prototype.explodes = function() { + throw 'explodes function should not have been called'; +}; + +jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { + if (obj == jasmine.undefined) { + throw "spyOn could not find an object to spy upon for " + methodName + "()"; + } + + if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { + throw methodName + '() method does not exist'; + } + + if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { + throw new Error(methodName + ' has already been spied upon'); + } + + var spyObj = jasmine.createSpy(methodName); + + this.spies_.push(spyObj); + spyObj.baseObj = obj; + spyObj.methodName = methodName; + spyObj.originalValue = obj[methodName]; + + obj[methodName] = spyObj; + + return spyObj; +}; + +jasmine.Spec.prototype.removeAllSpies = function() { + for (var i = 0; i < this.spies_.length; i++) { + var spy = this.spies_[i]; + spy.baseObj[spy.methodName] = spy.originalValue; + } + this.spies_ = []; +}; + +/** + * Internal representation of a Jasmine suite. + * + * @constructor + * @param {jasmine.Env} env + * @param {String} description + * @param {Function} specDefinitions + * @param {jasmine.Suite} parentSuite + */ +jasmine.Suite = function(env, description, specDefinitions, parentSuite) { + var self = this; + self.id = env.nextSuiteId ? env.nextSuiteId() : null; + self.description = description; + self.queue = new jasmine.Queue(env); + self.parentSuite = parentSuite; + self.env = env; + self.before_ = []; + self.after_ = []; + self.children_ = []; + self.suites_ = []; + self.specs_ = []; +}; + +jasmine.Suite.prototype.getFullName = function() { + var fullName = this.description; + for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { + fullName = parentSuite.description + ' ' + fullName; + } + return fullName; +}; + +jasmine.Suite.prototype.finish = function(onComplete) { + this.env.reporter.reportSuiteResults(this); + this.finished = true; + if (typeof(onComplete) == 'function') { + onComplete(); + } +}; + +jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { + beforeEachFunction.typeName = 'beforeEach'; + this.before_.unshift(beforeEachFunction); +}; + +jasmine.Suite.prototype.afterEach = function(afterEachFunction) { + afterEachFunction.typeName = 'afterEach'; + this.after_.unshift(afterEachFunction); +}; + +jasmine.Suite.prototype.results = function() { + return this.queue.results(); +}; + +jasmine.Suite.prototype.add = function(suiteOrSpec) { + this.children_.push(suiteOrSpec); + if (suiteOrSpec instanceof jasmine.Suite) { + this.suites_.push(suiteOrSpec); + this.env.currentRunner().addSuite(suiteOrSpec); + } else { + this.specs_.push(suiteOrSpec); + } + this.queue.add(suiteOrSpec); +}; + +jasmine.Suite.prototype.specs = function() { + return this.specs_; +}; + +jasmine.Suite.prototype.suites = function() { + return this.suites_; +}; + +jasmine.Suite.prototype.children = function() { + return this.children_; +}; + +jasmine.Suite.prototype.execute = function(onComplete) { + var self = this; + this.queue.start(function () { + self.finish(onComplete); + }); +}; +jasmine.WaitsBlock = function(env, timeout, spec) { + this.timeout = timeout; + jasmine.Block.call(this, env, null, spec); +}; + +jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); + +jasmine.WaitsBlock.prototype.execute = function (onComplete) { + if (jasmine.VERBOSE) { + this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); + } + this.env.setTimeout(function () { + onComplete(); + }, this.timeout); +}; +/** + * A block which waits for some condition to become true, with timeout. + * + * @constructor + * @extends jasmine.Block + * @param {jasmine.Env} env The Jasmine environment. + * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. + * @param {Function} latchFunction A function which returns true when the desired condition has been met. + * @param {String} message The message to display if the desired condition hasn't been met within the given time period. + * @param {jasmine.Spec} spec The Jasmine spec. + */ +jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { + this.timeout = timeout || env.defaultTimeoutInterval; + this.latchFunction = latchFunction; + this.message = message; + this.totalTimeSpentWaitingForLatch = 0; + jasmine.Block.call(this, env, null, spec); +}; +jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); + +jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; + +jasmine.WaitsForBlock.prototype.execute = function(onComplete) { + if (jasmine.VERBOSE) { + this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); + } + var latchFunctionResult; + try { + latchFunctionResult = this.latchFunction.apply(this.spec); + } catch (e) { + this.spec.fail(e); + onComplete(); + return; + } + + if (latchFunctionResult) { + onComplete(); + } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { + var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); + this.spec.fail({ + name: 'timeout', + message: message + }); + + this.abort = true; + onComplete(); + } else { + this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; + var self = this; + this.env.setTimeout(function() { + self.execute(onComplete); + }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); + } +}; + +jasmine.version_= { + "major": 1, + "minor": 2, + "build": 0, + "revision": 1337005947 +}; From 72c3cd0c06332c491893f10859fdd5825f4d8dc5 Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Thu, 5 Mar 2015 17:26:23 +0100 Subject: [PATCH 2/2] use cordova, not phonegap --- fritteliuhr/config.xml | 12 + fritteliuhr/hooks/README.md | 196 ++ fritteliuhr/platforms/android/.gitignore | 14 + fritteliuhr/platforms/android/.project | 71 + .../platforms/android/AndroidManifest.xml | 14 + .../platforms/android/CordovaLib/.project | 1 + .../android/CordovaLib/AndroidManifest.xml | 23 + .../platforms/android/CordovaLib/build.gradle | 68 + .../android/CordovaLib/cordova.gradle | 165 ++ .../android/CordovaLib/project.properties | 16 + .../src/com/squareup/okhttp/Address.java | 140 ++ .../src/com/squareup/okhttp/Connection.java | 335 +++ .../com/squareup/okhttp/ConnectionPool.java | 274 +++ .../src/com/squareup/okhttp/Dispatcher.java | 86 + .../src/com/squareup/okhttp/Failure.java | 59 + .../squareup/okhttp/HttpResponseCache.java | 722 ++++++ .../src/com/squareup/okhttp/Job.java | 232 ++ .../src/com/squareup/okhttp/MediaType.java | 120 + .../com/squareup/okhttp/OkAuthenticator.java | 123 + .../src/com/squareup/okhttp/OkHttpClient.java | 408 ++++ .../com/squareup/okhttp/OkResponseCache.java | 56 + .../src/com/squareup/okhttp/Request.java | 284 +++ .../src/com/squareup/okhttp/Response.java | 290 +++ .../com/squareup/okhttp/ResponseSource.java | 37 + .../src/com/squareup/okhttp/Route.java | 91 + .../com/squareup/okhttp/RouteDatabase.java | 57 + .../com/squareup/okhttp/TunnelRequest.java | 75 + .../okhttp/internal/AbstractOutputStream.java | 45 + .../com/squareup/okhttp/internal/Base64.java | 164 ++ .../okhttp/internal/DiskLruCache.java | 926 ++++++++ .../src/com/squareup/okhttp/internal/Dns.java | 33 + .../internal/FaultRecoveringOutputStream.java | 163 ++ .../okhttp/internal/NamedRunnable.java | 40 + .../squareup/okhttp/internal/Platform.java | 370 +++ .../okhttp/internal/StrictLineReader.java | 207 ++ .../com/squareup/okhttp/internal/Util.java | 394 ++++ .../http/AbstractHttpInputStream.java | 107 + .../okhttp/internal/http/HeaderParser.java | 112 + .../internal/http/HttpAuthenticator.java | 166 ++ .../okhttp/internal/http/HttpDate.java | 88 + .../okhttp/internal/http/HttpEngine.java | 686 ++++++ .../okhttp/internal/http/HttpTransport.java | 497 +++++ .../internal/http/HttpURLConnectionImpl.java | 590 +++++ .../okhttp/internal/http/HttpsEngine.java | 72 + .../internal/http/HttpsURLConnectionImpl.java | 366 +++ .../internal/http/OkResponseCacheAdapter.java | 57 + .../squareup/okhttp/internal/http/Policy.java | 49 + .../okhttp/internal/http/RawHeaders.java | 447 ++++ .../okhttp/internal/http/RequestHeaders.java | 317 +++ .../okhttp/internal/http/ResponseHeaders.java | 512 +++++ .../internal/http/RetryableOutputStream.java | 75 + .../okhttp/internal/http/RouteSelector.java | 269 +++ .../okhttp/internal/http/SpdyTransport.java | 103 + .../okhttp/internal/http/Transport.java | 64 + .../http/UnknownLengthHttpInputStream.java | 63 + .../okhttp/internal/spdy/ErrorCode.java | 83 + .../okhttp/internal/spdy/FrameReader.java | 55 + .../okhttp/internal/spdy/FrameWriter.java | 43 + .../okhttp/internal/spdy/HeadersMode.java | 49 + .../squareup/okhttp/internal/spdy/Hpack.java | 387 ++++ .../okhttp/internal/spdy/Http20Draft06.java | 385 ++++ .../internal/spdy/IncomingStreamHandler.java | 36 + .../internal/spdy/NameValueBlockReader.java | 139 ++ .../squareup/okhttp/internal/spdy/Ping.java | 71 + .../okhttp/internal/spdy/Settings.java | 187 ++ .../squareup/okhttp/internal/spdy/Spdy3.java | 463 ++++ .../okhttp/internal/spdy/SpdyConnection.java | 599 +++++ .../okhttp/internal/spdy/SpdyStream.java | 684 ++++++ .../okhttp/internal/spdy/Variant.java | 37 + .../internal/tls/DistinguishedNameParser.java | 407 ++++ .../internal/tls/OkHostnameVerifier.java | 194 ++ .../src/org/apache/cordova/App.java | 331 +++ .../apache/cordova/AuthenticationToken.java | 69 + .../org/apache/cordova/CallbackContext.java | 144 ++ .../src/org/apache/cordova/Config.java | 122 + .../org/apache/cordova/ConfigXmlParser.java | 181 ++ .../org/apache/cordova/CordovaActivity.java | 951 ++++++++ .../src/org/apache/cordova/CordovaArgs.java | 113 + .../src/org/apache/cordova/CordovaBridge.java | 192 ++ .../apache/cordova/CordovaChromeClient.java | 366 +++ .../cordova/CordovaClientCertRequest.java | 96 + .../cordova/CordovaHttpAuthHandler.java | 51 + .../org/apache/cordova/CordovaInterface.java | 72 + .../src/org/apache/cordova/CordovaPlugin.java | 231 ++ .../apache/cordova/CordovaPreferences.java | 178 ++ .../apache/cordova/CordovaResourceApi.java | 447 ++++ .../org/apache/cordova/CordovaUriHelper.java | 86 + .../org/apache/cordova/CordovaWebView.java | 971 ++++++++ .../apache/cordova/CordovaWebViewClient.java | 395 ++++ .../org/apache/cordova/DirectoryManager.java | 162 ++ .../src/org/apache/cordova/DroidGap.java | 34 + .../src/org/apache/cordova/ExifHelper.java | 186 ++ .../src/org/apache/cordova/ExposedJsApi.java | 52 + .../src/org/apache/cordova/FileHelper.java | 163 ++ .../cordova/ICordovaClientCertRequest.java | 66 + .../cordova/ICordovaHttpAuthHandler.java | 38 + .../cordova/IceCreamCordovaWebViewClient.java | 107 + .../src/org/apache/cordova/JSONUtils.java | 43 + .../src/org/apache/cordova/LOG.java | 234 ++ .../LinearLayoutSoftKeyboardDetect.java | 112 + .../cordova/NativeToJsMessageQueue.java | 552 +++++ .../src/org/apache/cordova/PluginEntry.java | 89 + .../src/org/apache/cordova/PluginManager.java | 414 ++++ .../src/org/apache/cordova/PluginResult.java | 198 ++ .../src/org/apache/cordova/ScrollEvent.java | 67 + .../apache/cordova/SplashScreenInternal.java | 257 +++ .../src/org/apache/cordova/Whitelist.java | 170 ++ .../android/assets/_where-is-www.txt | 3 + .../platforms/android/assets/www/cordova.js | 1980 +++++++++++++++++ .../android/assets/www/cordova_plugins.js | 7 + .../android/assets/www/css/index.css | 115 + .../platforms/android/assets/www/img/logo.png | Bin 0 -> 21814 bytes .../platforms/android/assets/www/index.html | 41 + .../platforms/android/assets/www/js/index.js | 51 + fritteliuhr/platforms/android/build.gradle | 285 +++ .../android/cordova/android_sdk_version | 29 + fritteliuhr/platforms/android/cordova/build | 41 + .../platforms/android/cordova/build.bat | 26 + .../platforms/android/cordova/check_reqs | 31 + fritteliuhr/platforms/android/cordova/clean | 44 + .../platforms/android/cordova/clean.bat | 26 + .../platforms/android/cordova/defaults.xml | 26 + .../cordova/lib/android_sdk_version.js | 65 + .../platforms/android/cordova/lib/appinfo.js | 41 + .../platforms/android/cordova/lib/build.js | 481 ++++ .../android/cordova/lib/check_reqs.js | 242 ++ .../platforms/android/cordova/lib/device.js | 123 + .../platforms/android/cordova/lib/emulator.js | 336 +++ .../platforms/android/cordova/lib/exec.js | 41 + .../android/cordova/lib/install-device | 42 + .../android/cordova/lib/install-device.bat | 26 + .../android/cordova/lib/install-emulator | 38 + .../android/cordova/lib/install-emulator.bat | 26 + .../android/cordova/lib/list-devices | 33 + .../android/cordova/lib/list-devices.bat | 26 + .../android/cordova/lib/list-emulator-images | 32 + .../cordova/lib/list-emulator-images.bat | 26 + .../cordova/lib/list-started-emulators | 32 + .../cordova/lib/list-started-emulators.bat | 26 + .../platforms/android/cordova/lib/log.js | 58 + .../android/cordova/lib/plugin-build.gradle | 79 + .../platforms/android/cordova/lib/run.js | 158 ++ .../platforms/android/cordova/lib/spawn.js | 50 + .../android/cordova/lib/start-emulator | 39 + .../android/cordova/lib/start-emulator.bat | 26 + fritteliuhr/platforms/android/cordova/log | 36 + fritteliuhr/platforms/android/cordova/log.bat | 26 + .../cordova/node_modules/q/CONTRIBUTING.md | 40 + .../android/cordova/node_modules/q/LICENSE | 19 + .../android/cordova/node_modules/q/README.md | 813 +++++++ .../q/benchmark/compare-with-callbacks.js | 71 + .../node_modules/q/benchmark/scenarios.js | 36 + .../cordova/node_modules/q/package.json | 93 + .../android/cordova/node_modules/q/q.js | 1937 ++++++++++++++++ .../android/cordova/node_modules/q/queue.js | 35 + .../node_modules/shelljs/.documentup.json | 6 + .../cordova/node_modules/shelljs/.jshintrc | 7 + .../cordova/node_modules/shelljs/.npmignore | 2 + .../cordova/node_modules/shelljs/.travis.yml | 5 + .../cordova/node_modules/shelljs/LICENSE | 26 + .../cordova/node_modules/shelljs/README.md | 552 +++++ .../cordova/node_modules/shelljs/bin/shjs | 51 + .../cordova/node_modules/shelljs/global.js | 3 + .../cordova/node_modules/shelljs/make.js | 47 + .../cordova/node_modules/shelljs/package.json | 48 + .../shelljs/scripts/generate-docs.js | 21 + .../node_modules/shelljs/scripts/run-tests.js | 50 + .../cordova/node_modules/shelljs/shell.js | 153 ++ .../cordova/node_modules/shelljs/src/cat.js | 43 + .../cordova/node_modules/shelljs/src/cd.js | 19 + .../cordova/node_modules/shelljs/src/chmod.js | 208 ++ .../node_modules/shelljs/src/common.js | 189 ++ .../cordova/node_modules/shelljs/src/cp.js | 200 ++ .../cordova/node_modules/shelljs/src/dirs.js | 191 ++ .../cordova/node_modules/shelljs/src/echo.js | 20 + .../cordova/node_modules/shelljs/src/error.js | 10 + .../cordova/node_modules/shelljs/src/exec.js | 181 ++ .../cordova/node_modules/shelljs/src/find.js | 51 + .../cordova/node_modules/shelljs/src/grep.js | 52 + .../cordova/node_modules/shelljs/src/ls.js | 126 ++ .../cordova/node_modules/shelljs/src/mkdir.js | 68 + .../cordova/node_modules/shelljs/src/mv.js | 80 + .../cordova/node_modules/shelljs/src/popd.js | 1 + .../cordova/node_modules/shelljs/src/pushd.js | 1 + .../cordova/node_modules/shelljs/src/pwd.js | 11 + .../cordova/node_modules/shelljs/src/rm.js | 145 ++ .../cordova/node_modules/shelljs/src/sed.js | 43 + .../node_modules/shelljs/src/tempdir.js | 56 + .../cordova/node_modules/shelljs/src/test.js | 85 + .../cordova/node_modules/shelljs/src/to.js | 29 + .../cordova/node_modules/shelljs/src/toEnd.js | 29 + .../cordova/node_modules/shelljs/src/which.js | 79 + .../cordova/node_modules/which/LICENSE | 23 + .../cordova/node_modules/which/README.md | 5 + .../cordova/node_modules/which/bin/which | 14 + .../cordova/node_modules/which/package.json | 31 + .../cordova/node_modules/which/which.js | 104 + fritteliuhr/platforms/android/cordova/run | 37 + fritteliuhr/platforms/android/cordova/run.bat | 26 + fritteliuhr/platforms/android/cordova/version | 25 + .../platforms/android/cordova/version.bat | 26 + .../platforms/android/custom_rules.xml | 22 + .../platforms/android/platform_www/cordova.js | 1980 +++++++++++++++++ .../platforms/android/project.properties | 14 + .../android/res/drawable-hdpi/icon.png | Bin 0 -> 6080 bytes .../android/res/drawable-land-hdpi/screen.png | Bin 0 -> 218302 bytes .../android/res/drawable-land-ldpi/screen.png | Bin 0 -> 42616 bytes .../android/res/drawable-land-mdpi/screen.png | Bin 0 -> 92347 bytes .../res/drawable-land-xhdpi/screen.png | Bin 0 -> 489604 bytes .../android/res/drawable-ldpi/icon.png | Bin 0 -> 3096 bytes .../android/res/drawable-mdpi/icon.png | Bin 0 -> 4090 bytes .../android/res/drawable-port-hdpi/screen.png | Bin 0 -> 222148 bytes .../android/res/drawable-port-ldpi/screen.png | Bin 0 -> 42034 bytes .../android/res/drawable-port-mdpi/screen.png | Bin 0 -> 90555 bytes .../res/drawable-port-xhdpi/screen.png | Bin 0 -> 504508 bytes .../android/res/drawable-xhdpi/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/drawable/icon.png | Bin 0 -> 7685 bytes .../platforms/android/res/values/strings.xml | 6 + .../platforms/android/res/xml/config.xml | 13 + .../src/ch/fritteli/uhr/MainActivity.java | 35 + fritteliuhr/platforms/ios/.gitignore | 5 + .../platforms/ios/CordovaLib/Classes/CDV.h | 41 + .../ios/CordovaLib/Classes/CDVAvailability.h | 92 + .../Classes/CDVAvailabilityDeprecated.h | 38 + .../CordovaLib/Classes/CDVCommandDelegate.h | 50 + .../Classes/CDVCommandDelegateImpl.h | 36 + .../Classes/CDVCommandDelegateImpl.m | 180 ++ .../ios/CordovaLib/Classes/CDVCommandQueue.h | 40 + .../ios/CordovaLib/Classes/CDVCommandQueue.m | 211 ++ .../ios/CordovaLib/Classes/CDVConfigParser.h | 31 + .../ios/CordovaLib/Classes/CDVConfigParser.m | 88 + .../ios/CordovaLib/Classes/CDVDebug.h | 25 + .../ios/CordovaLib/Classes/CDVHandleOpenURL.h | 28 + .../ios/CordovaLib/Classes/CDVHandleOpenURL.m | 74 + .../CordovaLib/Classes/CDVInvokedUrlCommand.h | 52 + .../CordovaLib/Classes/CDVInvokedUrlCommand.m | 117 + .../ios/CordovaLib/Classes/CDVJSON.h | 37 + .../ios/CordovaLib/Classes/CDVJSON.m | 52 + .../ios/CordovaLib/Classes/CDVJSON_private.h | 31 + .../ios/CordovaLib/Classes/CDVJSON_private.m | 91 + .../ios/CordovaLib/Classes/CDVLocalStorage.h | 50 + .../ios/CordovaLib/Classes/CDVLocalStorage.m | 492 ++++ .../ios/CordovaLib/Classes/CDVPlugin.h | 67 + .../ios/CordovaLib/Classes/CDVPlugin.m | 154 ++ .../ios/CordovaLib/Classes/CDVPluginResult.h | 71 + .../ios/CordovaLib/Classes/CDVPluginResult.m | 224 ++ .../Classes/CDVScreenOrientationDelegate.h | 28 + .../ios/CordovaLib/Classes/CDVShared.h | 22 + .../ios/CordovaLib/Classes/CDVTimer.h | 27 + .../ios/CordovaLib/Classes/CDVTimer.m | 123 + .../ios/CordovaLib/Classes/CDVURLProtocol.h | 29 + .../ios/CordovaLib/Classes/CDVURLProtocol.m | 213 ++ .../ios/CordovaLib/Classes/CDVUserAgentUtil.h | 27 + .../ios/CordovaLib/Classes/CDVUserAgentUtil.m | 122 + .../CordovaLib/Classes/CDVViewController.h | 84 + .../CordovaLib/Classes/CDVViewController.m | 1049 +++++++++ .../CordovaLib/Classes/CDVWebViewDelegate.h | 41 + .../CordovaLib/Classes/CDVWebViewDelegate.m | 412 ++++ .../ios/CordovaLib/Classes/CDVWhitelist.h | 34 + .../ios/CordovaLib/Classes/CDVWhitelist.m | 285 +++ .../CordovaLib/Classes/NSArray+Comparisons.h | 27 + .../CordovaLib/Classes/NSArray+Comparisons.m | 43 + .../ios/CordovaLib/Classes/NSData+Base64.h | 47 + .../ios/CordovaLib/Classes/NSData+Base64.m | 308 +++ .../Classes/NSDictionary+Extensions.h | 43 + .../Classes/NSDictionary+Extensions.m | 159 ++ .../Classes/NSMutableArray+QueueAdditions.h | 29 + .../Classes/NSMutableArray+QueueAdditions.m | 58 + .../CordovaLib/Classes/UIDevice+Extensions.h | 32 + .../CordovaLib/Classes/UIDevice+Extensions.m | 47 + .../CordovaLib.xcodeproj/project.pbxproj | 507 +++++ .../ios/CordovaLib/CordovaLib_Prefix.pch | 22 + fritteliuhr/platforms/ios/CordovaLib/VERSION | 1 + .../platforms/ios/CordovaLib/cordova.js | 1810 +++++++++++++++ .../ios/FritteliUhr.xcodeproj/project.pbxproj | 575 +++++ .../platforms/ios/FritteliUhr/.gitignore | 5 + .../ios/FritteliUhr/Classes/AppDelegate.h | 42 + .../ios/FritteliUhr/Classes/AppDelegate.m | 151 ++ .../FritteliUhr/Classes/MainViewController.h | 40 + .../FritteliUhr/Classes/MainViewController.m | 164 ++ .../Classes/MainViewController.xib | 138 ++ .../ios/FritteliUhr/FritteliUhr-Info.plist | 182 ++ .../ios/FritteliUhr/FritteliUhr-Prefix.pch | 26 + .../platforms/ios/FritteliUhr/Plugins/README | 20 + .../FritteliUhr/Resources/icons/icon-40.png | Bin 0 -> 4082 bytes .../Resources/icons/icon-40@2x.png | Bin 0 -> 7411 bytes .../FritteliUhr/Resources/icons/icon-50.png | Bin 0 -> 4874 bytes .../Resources/icons/icon-50@2x.png | Bin 0 -> 9611 bytes .../FritteliUhr/Resources/icons/icon-60.png | Bin 0 -> 5811 bytes .../Resources/icons/icon-60@2x.png | Bin 0 -> 11924 bytes .../Resources/icons/icon-60@3x.png | Bin 0 -> 30083 bytes .../FritteliUhr/Resources/icons/icon-72.png | Bin 0 -> 4944 bytes .../Resources/icons/icon-72@2x.png | Bin 0 -> 11706 bytes .../FritteliUhr/Resources/icons/icon-76.png | Bin 0 -> 7025 bytes .../Resources/icons/icon-76@2x.png | Bin 0 -> 15262 bytes .../Resources/icons/icon-small.png | Bin 0 -> 3294 bytes .../Resources/icons/icon-small@2x.png | Bin 0 -> 5608 bytes .../ios/FritteliUhr/Resources/icons/icon.png | Bin 0 -> 3902 bytes .../FritteliUhr/Resources/icons/icon@2x.png | Bin 0 -> 7869 bytes .../splash/Default-568h@2x~iphone.png | Bin 0 -> 34225 bytes .../Resources/splash/Default-667h.png | Bin 0 -> 57532 bytes .../Resources/splash/Default-736h.png | Bin 0 -> 80929 bytes .../splash/Default-Landscape-736h.png | Bin 0 -> 79491 bytes .../splash/Default-Landscape@2x~ipad.png | Bin 0 -> 212234 bytes .../splash/Default-Landscape~ipad.png | Bin 0 -> 91810 bytes .../splash/Default-Portrait@2x~ipad.png | Bin 0 -> 212860 bytes .../splash/Default-Portrait~ipad.png | Bin 0 -> 91713 bytes .../Resources/splash/Default@2x~iphone.png | Bin 0 -> 29475 bytes .../Resources/splash/Default~iphone.png | Bin 0 -> 10394 bytes .../platforms/ios/FritteliUhr/config.xml | 26 + fritteliuhr/platforms/ios/FritteliUhr/main.m | 35 + .../platforms/ios/cordova/apple_ios_version | 27 + .../platforms/ios/cordova/apple_osx_version | 27 + .../platforms/ios/cordova/apple_xcode_version | 29 + fritteliuhr/platforms/ios/cordova/build | 36 + .../ios/cordova/build-debug.xcconfig | 24 + .../ios/cordova/build-release.xcconfig | 27 + .../platforms/ios/cordova/build.xcconfig | 32 + fritteliuhr/platforms/ios/cordova/check_reqs | 32 + fritteliuhr/platforms/ios/cordova/clean | 29 + fritteliuhr/platforms/ios/cordova/clean.bat | 25 + .../platforms/ios/cordova/defaults.xml | 40 + .../platforms/ios/cordova/lib/build.js | 148 ++ .../platforms/ios/cordova/lib/check_reqs.js | 94 + .../platforms/ios/cordova/lib/clean.js | 46 + .../ios/cordova/lib/copy-www-build-step.sh | 87 + .../platforms/ios/cordova/lib/list-devices | 62 + .../ios/cordova/lib/list-emulator-images | 53 + .../ios/cordova/lib/list-started-emulators | 51 + fritteliuhr/platforms/ios/cordova/lib/run.js | 177 ++ .../platforms/ios/cordova/lib/spawn.js | 50 + .../platforms/ios/cordova/lib/start-emulator | 30 + .../platforms/ios/cordova/lib/versions.js | 178 ++ fritteliuhr/platforms/ios/cordova/log | 23 + .../ios/cordova/node_modules/nopt/LICENSE | 23 + .../ios/cordova/node_modules/nopt/lib/nopt.js | 414 ++++ .../nopt/node_modules/abbrev/LICENSE | 23 + .../nopt/node_modules/abbrev/abbrev.js | 62 + .../nopt/node_modules/abbrev/package.json | 31 + .../cordova/node_modules/nopt/package.json | 41 + .../ios/cordova/node_modules/q/LICENSE | 18 + .../ios/cordova/node_modules/q/package.json | 112 + .../platforms/ios/cordova/node_modules/q/q.js | 1904 ++++++++++++++++ .../ios/cordova/node_modules/q/queue.js | 35 + .../ios/cordova/node_modules/shelljs/LICENSE | 26 + .../cordova/node_modules/shelljs/package.json | 48 + .../ios/cordova/node_modules/shelljs/shell.js | 1901 ++++++++++++++++ fritteliuhr/platforms/ios/cordova/run | 36 + fritteliuhr/platforms/ios/cordova/run.bat | 25 + fritteliuhr/platforms/ios/cordova/version | 30 + fritteliuhr/platforms/ios/cordova/version.bat | 26 + .../platforms/ios/platform_www/cordova.js | 1810 +++++++++++++++ fritteliuhr/platforms/ios/www/cordova.js | 1810 +++++++++++++++ .../platforms/ios/www/cordova_plugins.js | 7 + fritteliuhr/platforms/ios/www/css/index.css | 115 + fritteliuhr/platforms/ios/www/img/logo.png | Bin 0 -> 21814 bytes fritteliuhr/platforms/ios/www/index.html | 41 + fritteliuhr/platforms/ios/www/js/index.js | 51 + fritteliuhr/plugins/android.json | 11 + fritteliuhr/plugins/ios.json | 11 + fritteliuhr/www/css/index.css | 115 + fritteliuhr/www/img/logo.png | Bin 0 -> 21814 bytes fritteliuhr/www/index.html | 41 + fritteliuhr/www/js/index.js | 51 + 364 files changed, 55371 insertions(+) create mode 100644 fritteliuhr/config.xml create mode 100644 fritteliuhr/hooks/README.md create mode 100644 fritteliuhr/platforms/android/.gitignore create mode 100644 fritteliuhr/platforms/android/.project create mode 100644 fritteliuhr/platforms/android/AndroidManifest.xml create mode 100644 fritteliuhr/platforms/android/CordovaLib/.project create mode 100644 fritteliuhr/platforms/android/CordovaLib/AndroidManifest.xml create mode 100644 fritteliuhr/platforms/android/CordovaLib/build.gradle create mode 100644 fritteliuhr/platforms/android/CordovaLib/cordova.gradle create mode 100644 fritteliuhr/platforms/android/CordovaLib/project.properties create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/App.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/Config.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaClientCertRequest.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaHttpAuthHandler.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaInterface.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPlugin.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaPreferences.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaResourceApi.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaUriHelper.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebView.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewClient.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/DirectoryManager.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/DroidGap.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ExifHelper.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ExposedJsApi.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/FileHelper.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaClientCertRequest.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ICordovaHttpAuthHandler.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/IceCreamCordovaWebViewClient.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/JSONUtils.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/LOG.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/LinearLayoutSoftKeyboardDetect.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/NativeToJsMessageQueue.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/PluginEntry.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/PluginManager.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/PluginResult.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ScrollEvent.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/SplashScreenInternal.java create mode 100644 fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/Whitelist.java create mode 100644 fritteliuhr/platforms/android/assets/_where-is-www.txt create mode 100644 fritteliuhr/platforms/android/assets/www/cordova.js create mode 100644 fritteliuhr/platforms/android/assets/www/cordova_plugins.js create mode 100644 fritteliuhr/platforms/android/assets/www/css/index.css create mode 100644 fritteliuhr/platforms/android/assets/www/img/logo.png create mode 100644 fritteliuhr/platforms/android/assets/www/index.html create mode 100644 fritteliuhr/platforms/android/assets/www/js/index.js create mode 100644 fritteliuhr/platforms/android/build.gradle create mode 100644 fritteliuhr/platforms/android/cordova/android_sdk_version create mode 100644 fritteliuhr/platforms/android/cordova/build create mode 100644 fritteliuhr/platforms/android/cordova/build.bat create mode 100644 fritteliuhr/platforms/android/cordova/check_reqs create mode 100644 fritteliuhr/platforms/android/cordova/clean create mode 100644 fritteliuhr/platforms/android/cordova/clean.bat create mode 100644 fritteliuhr/platforms/android/cordova/defaults.xml create mode 100644 fritteliuhr/platforms/android/cordova/lib/android_sdk_version.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/appinfo.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/build.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/check_reqs.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/device.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/emulator.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/exec.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/install-device create mode 100644 fritteliuhr/platforms/android/cordova/lib/install-device.bat create mode 100644 fritteliuhr/platforms/android/cordova/lib/install-emulator create mode 100644 fritteliuhr/platforms/android/cordova/lib/install-emulator.bat create mode 100644 fritteliuhr/platforms/android/cordova/lib/list-devices create mode 100644 fritteliuhr/platforms/android/cordova/lib/list-devices.bat create mode 100644 fritteliuhr/platforms/android/cordova/lib/list-emulator-images create mode 100644 fritteliuhr/platforms/android/cordova/lib/list-emulator-images.bat create mode 100644 fritteliuhr/platforms/android/cordova/lib/list-started-emulators create mode 100644 fritteliuhr/platforms/android/cordova/lib/list-started-emulators.bat create mode 100644 fritteliuhr/platforms/android/cordova/lib/log.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/plugin-build.gradle create mode 100644 fritteliuhr/platforms/android/cordova/lib/run.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/spawn.js create mode 100644 fritteliuhr/platforms/android/cordova/lib/start-emulator create mode 100644 fritteliuhr/platforms/android/cordova/lib/start-emulator.bat create mode 100644 fritteliuhr/platforms/android/cordova/log create mode 100644 fritteliuhr/platforms/android/cordova/log.bat create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/CONTRIBUTING.md create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/LICENSE create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/README.md create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/benchmark/compare-with-callbacks.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/benchmark/scenarios.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/package.json create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/q.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/q/queue.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/.documentup.json create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/.jshintrc create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/.npmignore create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/.travis.yml create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/LICENSE create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/README.md create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/bin/shjs create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/global.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/make.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/package.json create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/scripts/generate-docs.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/scripts/run-tests.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/shell.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/cat.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/cd.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/chmod.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/common.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/cp.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/dirs.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/echo.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/error.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/exec.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/find.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/grep.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/ls.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/mkdir.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/mv.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/popd.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/pushd.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/pwd.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/rm.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/sed.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/tempdir.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/test.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/to.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/toEnd.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/shelljs/src/which.js create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/which/LICENSE create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/which/README.md create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/which/bin/which create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/which/package.json create mode 100644 fritteliuhr/platforms/android/cordova/node_modules/which/which.js create mode 100644 fritteliuhr/platforms/android/cordova/run create mode 100644 fritteliuhr/platforms/android/cordova/run.bat create mode 100644 fritteliuhr/platforms/android/cordova/version create mode 100644 fritteliuhr/platforms/android/cordova/version.bat create mode 100644 fritteliuhr/platforms/android/custom_rules.xml create mode 100644 fritteliuhr/platforms/android/platform_www/cordova.js create mode 100644 fritteliuhr/platforms/android/project.properties create mode 100644 fritteliuhr/platforms/android/res/drawable-hdpi/icon.png create mode 100644 fritteliuhr/platforms/android/res/drawable-land-hdpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-land-ldpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-land-mdpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-land-xhdpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-ldpi/icon.png create mode 100644 fritteliuhr/platforms/android/res/drawable-mdpi/icon.png create mode 100644 fritteliuhr/platforms/android/res/drawable-port-hdpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-port-ldpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-port-mdpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-port-xhdpi/screen.png create mode 100644 fritteliuhr/platforms/android/res/drawable-xhdpi/icon.png create mode 100644 fritteliuhr/platforms/android/res/drawable/icon.png create mode 100644 fritteliuhr/platforms/android/res/values/strings.xml create mode 100644 fritteliuhr/platforms/android/res/xml/config.xml create mode 100644 fritteliuhr/platforms/android/src/ch/fritteli/uhr/MainActivity.java create mode 100644 fritteliuhr/platforms/ios/.gitignore create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDV.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVAvailability.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVAvailabilityDeprecated.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVCommandDelegate.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVCommandDelegateImpl.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVCommandDelegateImpl.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVCommandQueue.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVCommandQueue.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVConfigParser.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVConfigParser.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVDebug.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVHandleOpenURL.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVHandleOpenURL.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVInvokedUrlCommand.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVInvokedUrlCommand.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON_private.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON_private.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVLocalStorage.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVLocalStorage.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPlugin.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPlugin.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPluginResult.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPluginResult.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVScreenOrientationDelegate.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVShared.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVTimer.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVTimer.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVURLProtocol.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVURLProtocol.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVUserAgentUtil.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVUserAgentUtil.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVViewController.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVViewController.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWebViewDelegate.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWebViewDelegate.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWhitelist.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWhitelist.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSArray+Comparisons.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSArray+Comparisons.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSData+Base64.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSData+Base64.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSDictionary+Extensions.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSDictionary+Extensions.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/UIDevice+Extensions.h create mode 100644 fritteliuhr/platforms/ios/CordovaLib/Classes/UIDevice+Extensions.m create mode 100644 fritteliuhr/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj create mode 100644 fritteliuhr/platforms/ios/CordovaLib/CordovaLib_Prefix.pch create mode 100644 fritteliuhr/platforms/ios/CordovaLib/VERSION create mode 100644 fritteliuhr/platforms/ios/CordovaLib/cordova.js create mode 100644 fritteliuhr/platforms/ios/FritteliUhr.xcodeproj/project.pbxproj create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/.gitignore create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Classes/AppDelegate.h create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Classes/AppDelegate.m create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Classes/MainViewController.h create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Classes/MainViewController.m create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Classes/MainViewController.xib create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/FritteliUhr-Info.plist create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/FritteliUhr-Prefix.pch create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Plugins/README create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-40.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-40@2x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-50.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-50@2x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-60.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-60@2x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-60@3x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-72.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-72@2x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-76.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-76@2x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-small.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon-small@2x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/icons/icon@2x.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-568h@2x~iphone.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-667h.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-736h.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-Landscape-736h.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-Landscape@2x~ipad.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-Landscape~ipad.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-Portrait@2x~ipad.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default-Portrait~ipad.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default@2x~iphone.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/Resources/splash/Default~iphone.png create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/config.xml create mode 100644 fritteliuhr/platforms/ios/FritteliUhr/main.m create mode 100644 fritteliuhr/platforms/ios/cordova/apple_ios_version create mode 100644 fritteliuhr/platforms/ios/cordova/apple_osx_version create mode 100644 fritteliuhr/platforms/ios/cordova/apple_xcode_version create mode 100644 fritteliuhr/platforms/ios/cordova/build create mode 100644 fritteliuhr/platforms/ios/cordova/build-debug.xcconfig create mode 100644 fritteliuhr/platforms/ios/cordova/build-release.xcconfig create mode 100644 fritteliuhr/platforms/ios/cordova/build.xcconfig create mode 100644 fritteliuhr/platforms/ios/cordova/check_reqs create mode 100644 fritteliuhr/platforms/ios/cordova/clean create mode 100644 fritteliuhr/platforms/ios/cordova/clean.bat create mode 100644 fritteliuhr/platforms/ios/cordova/defaults.xml create mode 100644 fritteliuhr/platforms/ios/cordova/lib/build.js create mode 100644 fritteliuhr/platforms/ios/cordova/lib/check_reqs.js create mode 100644 fritteliuhr/platforms/ios/cordova/lib/clean.js create mode 100644 fritteliuhr/platforms/ios/cordova/lib/copy-www-build-step.sh create mode 100644 fritteliuhr/platforms/ios/cordova/lib/list-devices create mode 100644 fritteliuhr/platforms/ios/cordova/lib/list-emulator-images create mode 100644 fritteliuhr/platforms/ios/cordova/lib/list-started-emulators create mode 100644 fritteliuhr/platforms/ios/cordova/lib/run.js create mode 100644 fritteliuhr/platforms/ios/cordova/lib/spawn.js create mode 100644 fritteliuhr/platforms/ios/cordova/lib/start-emulator create mode 100644 fritteliuhr/platforms/ios/cordova/lib/versions.js create mode 100644 fritteliuhr/platforms/ios/cordova/log create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/nopt/LICENSE create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/nopt/lib/nopt.js create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/nopt/node_modules/abbrev/LICENSE create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/nopt/node_modules/abbrev/abbrev.js create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/nopt/node_modules/abbrev/package.json create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/nopt/package.json create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/q/LICENSE create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/q/package.json create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/q/q.js create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/q/queue.js create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/shelljs/LICENSE create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/shelljs/package.json create mode 100644 fritteliuhr/platforms/ios/cordova/node_modules/shelljs/shell.js create mode 100644 fritteliuhr/platforms/ios/cordova/run create mode 100644 fritteliuhr/platforms/ios/cordova/run.bat create mode 100644 fritteliuhr/platforms/ios/cordova/version create mode 100644 fritteliuhr/platforms/ios/cordova/version.bat create mode 100644 fritteliuhr/platforms/ios/platform_www/cordova.js create mode 100644 fritteliuhr/platforms/ios/www/cordova.js create mode 100644 fritteliuhr/platforms/ios/www/cordova_plugins.js create mode 100644 fritteliuhr/platforms/ios/www/css/index.css create mode 100644 fritteliuhr/platforms/ios/www/img/logo.png create mode 100644 fritteliuhr/platforms/ios/www/index.html create mode 100644 fritteliuhr/platforms/ios/www/js/index.js create mode 100644 fritteliuhr/plugins/android.json create mode 100644 fritteliuhr/plugins/ios.json create mode 100644 fritteliuhr/www/css/index.css create mode 100644 fritteliuhr/www/img/logo.png create mode 100644 fritteliuhr/www/index.html create mode 100644 fritteliuhr/www/js/index.js diff --git a/fritteliuhr/config.xml b/fritteliuhr/config.xml new file mode 100644 index 0000000..3aaff70 --- /dev/null +++ b/fritteliuhr/config.xml @@ -0,0 +1,12 @@ + + + FritteliUhr + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + diff --git a/fritteliuhr/hooks/README.md b/fritteliuhr/hooks/README.md new file mode 100644 index 0000000..62e58b4 --- /dev/null +++ b/fritteliuhr/hooks/README.md @@ -0,0 +1,196 @@ + +# Cordova Hooks + +Cordova Hooks represent special scripts which could be added by application and plugin developers or even by your own build system to customize cordova commands. Hook scripts could be defined by adding them to the special predefined folder (`/hooks`) or via configuration files (`config.xml` and `plugin.xml`) and run serially in the following order: +* Application hooks from `/hooks`; +* Application hooks from `config.xml`; +* Plugin hooks from `plugins/.../plugin.xml`. + +__Remember__: Make your scripts executable. + +__Note__: `.cordova/hooks` directory is also supported for backward compatibility, but we don't recommend using it as it is deprecated. + +## Supported hook types +The following hook types are supported: + + after_build/ + after_compile/ + after_docs/ + after_emulate/ + after_platform_add/ + after_platform_rm/ + after_platform_ls/ + after_plugin_add/ + after_plugin_ls/ + after_plugin_rm/ + after_plugin_search/ + after_plugin_install/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being installed + after_prepare/ + after_run/ + after_serve/ + before_build/ + before_compile/ + before_docs/ + before_emulate/ + before_platform_add/ + before_platform_rm/ + before_platform_ls/ + before_plugin_add/ + before_plugin_ls/ + before_plugin_rm/ + before_plugin_search/ + before_plugin_install/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being installed + before_plugin_uninstall/ <-- Plugin hooks defined in plugin.xml are executed exclusively for a plugin being uninstalled + before_prepare/ + before_run/ + before_serve/ + pre_package/ <-- Windows 8 and Windows Phone only. + +## Ways to define hooks +### Via '/hooks' directory +To execute custom action when corresponding hook type is fired, use hook type as a name for a subfolder inside 'hooks' directory and place you script file here, for example: + + # script file will be automatically executed after each build + hooks/after_build/after_build_custom_action.js + + +### Config.xml + +Hooks can be defined in project's `config.xml` using `` elements, for example: + + + + + + + + + + ... + + + + + + + ... + + +### Plugin hooks (plugin.xml) + +As a plugin developer you can define hook scripts using `` elements in a `plugin.xml` like that: + + + + + + + + ... + + +`before_plugin_install`, `after_plugin_install`, `before_plugin_uninstall` plugin hooks will be fired exclusively for the plugin being installed/uninstalled. + +## Script Interface + +### Javascript + +If you are writing hooks in Javascript you should use the following module definition: +```javascript +module.exports = function(context) { + ... +} +``` + +You can make your scipts async using Q: +```javascript +module.exports = function(context) { + var Q = context.requireCordovaModule('q'); + var deferral = new Q.defer(); + + setTimeout(function(){ + console.log('hook.js>> end'); + deferral.resolve(); + }, 1000); + + return deferral.promise; +} +``` + +`context` object contains hook type, executed script full path, hook options, command-line arguments passed to Cordova and top-level "cordova" object: +```json +{ + "hook": "before_plugin_install", + "scriptLocation": "c:\\script\\full\\path\\appBeforePluginInstall.js", + "cmdLine": "The\\exact\\command\\cordova\\run\\with arguments", + "opts": { + "projectRoot":"C:\\path\\to\\the\\project", + "cordova": { + "platforms": ["wp8"], + "plugins": ["com.plugin.withhooks"], + "version": "0.21.7-dev" + }, + "plugin": { + "id": "com.plugin.withhooks", + "pluginInfo": { + ... + }, + "platform": "wp8", + "dir": "C:\\path\\to\\the\\project\\plugins\\com.plugin.withhooks" + } + }, + "cordova": {...} +} + +``` +`context.opts.plugin` object will only be passed to plugin hooks scripts. + +You can also require additional Cordova modules in your script using `context.requireCordovaModule` in the following way: +```javascript +var Q = context.requireCordovaModule('q'); +``` + +__Note__: new module loader script interface is used for the `.js` files defined via `config.xml` or `plugin.xml` only. +For compatibility reasons hook files specified via `/hooks` folders are run via Node child_process spawn, see 'Non-javascript' section below. + +### Non-javascript + +Non-javascript scripts are run via Node child_process spawn from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables: + +* CORDOVA_VERSION - The version of the Cordova-CLI. +* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios). +* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer) +* CORDOVA_HOOK - Path to the hook that is being executed. +* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate) + +If a script returns a non-zero exit code, then the parent cordova command will be aborted. + +## Writing hooks + +We highly recommend writing your hooks using Node.js so that they are +cross-platform. Some good examples are shown here: + +[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) + +Also, note that even if you are working on Windows, and in case your hook scripts aren't bat files (which is recommended, if you want your scripts to work in non-Windows operating systems) Cordova CLI will expect a shebang line as the first line for it to know the interpreter it needs to use to launch the script. The shebang line should match the following example: + + #!/usr/bin/env [name_of_interpreter_executable] diff --git a/fritteliuhr/platforms/android/.gitignore b/fritteliuhr/platforms/android/.gitignore new file mode 100644 index 0000000..6e52445 --- /dev/null +++ b/fritteliuhr/platforms/android/.gitignore @@ -0,0 +1,14 @@ +# Non-project-specific build files: +build.xml +local.properties +/gradlew +/gradlew.bat +/gradle +# Ant builds +ant-build +ant-gen +# Eclipse builds +gen +out +# Gradle builds +/build diff --git a/fritteliuhr/platforms/android/.project b/fritteliuhr/platforms/android/.project new file mode 100644 index 0000000..0199a01 --- /dev/null +++ b/fritteliuhr/platforms/android/.project @@ -0,0 +1,71 @@ + + + FritteliUhr + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + + + config.xml + 1 + $%7BPARENT-2-PROJECT_LOC%7D/config.xml + + + www + 2 + $%7BPARENT-2-PROJECT_LOC%7D/www + + + merges + 2 + $%7BPARENT-2-PROJECT_LOC%7D/merges + + + + + 1390880034107 + + 30 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-true-^(build.xml|ant-gen|ant-build|custom_rules.xml|CordovaLib|platform_www|cordova) + + + + 1390880034108 + + 30 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-true-^(assets/www|res/xml/config.xml) + + + + + diff --git a/fritteliuhr/platforms/android/AndroidManifest.xml b/fritteliuhr/platforms/android/AndroidManifest.xml new file mode 100644 index 0000000..3a64ccb --- /dev/null +++ b/fritteliuhr/platforms/android/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/fritteliuhr/platforms/android/CordovaLib/.project b/fritteliuhr/platforms/android/CordovaLib/.project new file mode 100644 index 0000000..b3f4b15 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/.project @@ -0,0 +1 @@ +MainActivity-CordovaLib \ No newline at end of file diff --git a/fritteliuhr/platforms/android/CordovaLib/AndroidManifest.xml b/fritteliuhr/platforms/android/CordovaLib/AndroidManifest.xml new file mode 100644 index 0000000..6fbe1b4 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/fritteliuhr/platforms/android/CordovaLib/build.gradle b/fritteliuhr/platforms/android/CordovaLib/build.gradle new file mode 100644 index 0000000..2565633 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/build.gradle @@ -0,0 +1,68 @@ +/* Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + + + +buildscript { + repositories { + mavenCentral() + } + + // Switch the Android Gradle plugin version requirement depending on the + // installed version of Gradle. This dependency is documented at + // http://tools.android.com/tech-docs/new-build-system/version-compatibility + // and https://issues.apache.org/jira/browse/CB-8143 + if (gradle.gradleVersion >= "2.2") { + dependencies { + classpath 'com.android.tools.build:gradle:1.0.0+' + } + } else if (gradle.gradleVersion >= "2.1") { + dependencies { + classpath 'com.android.tools.build:gradle:0.14.0+' + } + } else { + dependencies { + classpath 'com.android.tools.build:gradle:0.12.0+' + } + } +} + +apply plugin: 'android-library' + +android { + compileSdkVersion cdvCompileSdkVersion + buildToolsVersion cdvBuildToolsVersion + publishNonDefault true + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_6 + targetCompatibility JavaVersion.VERSION_1_6 + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/cordova.gradle b/fritteliuhr/platforms/android/CordovaLib/cordova.gradle new file mode 100644 index 0000000..5ce93f8 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/cordova.gradle @@ -0,0 +1,165 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +import java.util.regex.Pattern +import groovy.swing.SwingBuilder + +String doEnsureValueExists(filePath, props, key) { + if (props.get(key) == null) { + throw new GradleException(filePath + ': Missing key required "' + key + '"') + } + return props.get(key) +} + +String doGetProjectTarget() { + def props = new Properties() + file('project.properties').withReader { reader -> + props.load(reader) + } + return doEnsureValueExists('project.properties', props, 'target') +} + +String[] getAvailableBuildTools() { + def buildToolsDir = new File(getAndroidSdkDir(), "build-tools") + buildToolsDir.list() + .findAll { it ==~ /[0-9.]+/ } + .sort { a, b -> compareVersions(b, a) } +} + +String doFindLatestInstalledBuildTools(String minBuildToolsVersion) { + def availableBuildToolsVersions + try { + availableBuildToolsVersions = getAvailableBuildTools() + } catch (e) { + println "An exception occurred while trying to find the Android build tools." + throw e + } + if (availableBuildToolsVersions.length > 0) { + def highestBuildToolsVersion = availableBuildToolsVersions[0] + if (compareVersions(highestBuildToolsVersion, minBuildToolsVersion) < 0) { + throw new RuntimeException( + "No usable Android build tools found. Highest installed version is " + + highestBuildToolsVersion + "; minimum version required is " + + minBuildToolsVersion + ".") + } + highestBuildToolsVersion + } else { + throw new RuntimeException( + "No installed build tools found. Please install the Android build tools version " + + minBuildToolsVersion + " or higher.") + } +} + +// Return the first non-zero result of subtracting version list elements +// pairwise. If they are all identical, return the difference in length of +// the two lists. +int compareVersionList(Collection aParts, Collection bParts) { + def pairs = ([aParts, bParts]).transpose() + pairs.findResult(aParts.size()-bParts.size()) {it[0] - it[1] != 0 ? it[0] - it[1] : null} +} + +// Compare two version strings, such as "19.0.0" and "18.1.1.0". If all matched +// elements are identical, the longer version is the largest by this method. +// Examples: +// "19.0.0" > "19" +// "19.0.1" > "19.0.0" +// "19.1.0" > "19.0.1" +// "19" > "18.999.999" +int compareVersions(String a, String b) { + def aParts = a.tokenize('.').collect {it.toInteger()} + def bParts = b.tokenize('.').collect {it.toInteger()} + compareVersionList(aParts, bParts) +} + +String getAndroidSdkDir() { + def rootDir = project.rootDir + def androidSdkDir = null + String envVar = System.getenv("ANDROID_HOME") + def localProperties = new File(rootDir, 'local.properties') + String systemProperty = System.getProperty("android.home") + if (envVar != null) { + androidSdkDir = envVar + } else if (localProperties.exists()) { + Properties properties = new Properties() + localProperties.withInputStream { instr -> + properties.load(instr) + } + def sdkDirProp = properties.getProperty('sdk.dir') + if (sdkDirProp != null) { + androidSdkDir = sdkDirProp + } else { + sdkDirProp = properties.getProperty('android.dir') + if (sdkDirProp != null) { + androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath() + } + } + } + if (androidSdkDir == null && systemProperty != null) { + androidSdkDir = systemProperty + } + if (androidSdkDir == null) { + throw new RuntimeException( + "Unable to determine Android SDK directory.") + } + androidSdkDir +} + +def doExtractIntFromManifest(name) { + def manifestFile = file(android.sourceSets.main.manifest.srcFile) + def pattern = Pattern.compile(name + "=\"(\\d+)\"") + def matcher = pattern.matcher(manifestFile.getText()) + matcher.find() + return Integer.parseInt(matcher.group(1)) +} + +def doPromptForPassword(msg) { + if (System.console() == null) { + def ret = null + new SwingBuilder().edt { + dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) { + vbox { + label(text: msg) + def input = passwordField() + button(defaultButton: true, text: 'OK', actionPerformed: { + ret = input.password; + dispose(); + }) + } + } + } + if (!ret) { + throw new GradleException('User canceled build') + } + return new String(ret) + } else { + return System.console().readPassword('\n' + msg); + } +} + +// Properties exported here are visible to all plugins. +ext { + // These helpers are shared, but are not guaranteed to be stable / unchanged. + privateHelpers = {} + privateHelpers.getProjectTarget = { doGetProjectTarget() } + privateHelpers.findLatestInstalledBuildTools = { doFindLatestInstalledBuildTools('19.1.0') } + privateHelpers.extractIntFromManifest = { name -> doExtractIntFromManifest(name) } + privateHelpers.promptForPassword = { msg -> doPromptForPassword(msg) } + privateHelpers.ensureValueExists = { filePath, props, key -> doEnsureValueExists(filePath, props, key) } +} + diff --git a/fritteliuhr/platforms/android/CordovaLib/project.properties b/fritteliuhr/platforms/android/CordovaLib/project.properties new file mode 100644 index 0000000..57bcb9a --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/project.properties @@ -0,0 +1,16 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Indicates whether an apk should be generated for each density. +split.density=false +# Project target. +target=android-21 +apk-configurations= +renderscript.opt.level=O0 +android.library=true diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java new file mode 100644 index 0000000..b34bd91 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Address.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Util; +import java.net.Proxy; +import java.net.UnknownHostException; +import java.util.List; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSocketFactory; + +import static com.squareup.okhttp.internal.Util.equal; + +/** + * A specification for a connection to an origin server. For simple connections, + * this is the server's hostname and port. If an explicit proxy is requested (or + * {@link Proxy#NO_PROXY no proxy} is explicitly requested), this also includes + * that proxy information. For secure connections the address also includes the + * SSL socket factory and hostname verifier. + * + *

HTTP requests that share the same {@code Address} may also share the same + * {@link Connection}. + */ +public final class Address { + final Proxy proxy; + final String uriHost; + final int uriPort; + final SSLSocketFactory sslSocketFactory; + final HostnameVerifier hostnameVerifier; + final OkAuthenticator authenticator; + final List transports; + + public Address(String uriHost, int uriPort, SSLSocketFactory sslSocketFactory, + HostnameVerifier hostnameVerifier, OkAuthenticator authenticator, Proxy proxy, + List transports) throws UnknownHostException { + if (uriHost == null) throw new NullPointerException("uriHost == null"); + if (uriPort <= 0) throw new IllegalArgumentException("uriPort <= 0: " + uriPort); + if (authenticator == null) throw new IllegalArgumentException("authenticator == null"); + if (transports == null) throw new IllegalArgumentException("transports == null"); + this.proxy = proxy; + this.uriHost = uriHost; + this.uriPort = uriPort; + this.sslSocketFactory = sslSocketFactory; + this.hostnameVerifier = hostnameVerifier; + this.authenticator = authenticator; + this.transports = Util.immutableList(transports); + } + + /** Returns the hostname of the origin server. */ + public String getUriHost() { + return uriHost; + } + + /** + * Returns the port of the origin server; typically 80 or 443. Unlike + * may {@code getPort()} accessors, this method never returns -1. + */ + public int getUriPort() { + return uriPort; + } + + /** + * Returns the SSL socket factory, or null if this is not an HTTPS + * address. + */ + public SSLSocketFactory getSslSocketFactory() { + return sslSocketFactory; + } + + /** + * Returns the hostname verifier, or null if this is not an HTTPS + * address. + */ + public HostnameVerifier getHostnameVerifier() { + return hostnameVerifier; + } + + + /** + * Returns the client's authenticator. This method never returns null. + */ + public OkAuthenticator getAuthenticator() { + return authenticator; + } + + /** + * Returns the client's transports. This method always returns a non-null list + * that contains "http/1.1", possibly among other transports. + */ + public List getTransports() { + return transports; + } + + /** + * Returns this address's explicitly-specified HTTP proxy, or null to + * delegate to the HTTP client's proxy selector. + */ + public Proxy getProxy() { + return proxy; + } + + @Override public boolean equals(Object other) { + if (other instanceof Address) { + Address that = (Address) other; + return equal(this.proxy, that.proxy) + && this.uriHost.equals(that.uriHost) + && this.uriPort == that.uriPort + && equal(this.sslSocketFactory, that.sslSocketFactory) + && equal(this.hostnameVerifier, that.hostnameVerifier) + && equal(this.authenticator, that.authenticator) + && equal(this.transports, that.transports); + } + return false; + } + + @Override public int hashCode() { + int result = 17; + result = 31 * result + uriHost.hashCode(); + result = 31 * result + uriPort; + result = 31 * result + (sslSocketFactory != null ? sslSocketFactory.hashCode() : 0); + result = 31 * result + (hostnameVerifier != null ? hostnameVerifier.hashCode() : 0); + result = 31 * result + (authenticator != null ? authenticator.hashCode() : 0); + result = 31 * result + (proxy != null ? proxy.hashCode() : 0); + result = 31 * result + transports.hashCode(); + return result; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java new file mode 100644 index 0000000..6bb9cb3 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Connection.java @@ -0,0 +1,335 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Platform; +import com.squareup.okhttp.internal.http.HttpAuthenticator; +import com.squareup.okhttp.internal.http.HttpEngine; +import com.squareup.okhttp.internal.http.HttpTransport; +import com.squareup.okhttp.internal.http.RawHeaders; +import com.squareup.okhttp.internal.http.SpdyTransport; +import com.squareup.okhttp.internal.spdy.SpdyConnection; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Proxy; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.util.Arrays; +import javax.net.ssl.SSLSocket; + +import static java.net.HttpURLConnection.HTTP_OK; +import static java.net.HttpURLConnection.HTTP_PROXY_AUTH; + +/** + * Holds the sockets and streams of an HTTP, HTTPS, or HTTPS+SPDY connection, + * which may be used for multiple HTTP request/response exchanges. Connections + * may be direct to the origin server or via a proxy. + * + *

Typically instances of this class are created, connected and exercised + * automatically by the HTTP client. Applications may use this class to monitor + * HTTP connections as members of a {@link ConnectionPool connection pool}. + * + *

Do not confuse this class with the misnamed {@code HttpURLConnection}, + * which isn't so much a connection as a single request/response exchange. + * + *

Modern TLS

+ * There are tradeoffs when selecting which options to include when negotiating + * a secure connection to a remote host. Newer TLS options are quite useful: + *
    + *
  • Server Name Indication (SNI) enables one IP address to negotiate secure + * connections for multiple domain names. + *
  • Next Protocol Negotiation (NPN) enables the HTTPS port (443) to be used + * for both HTTP and SPDY transports. + *
+ * Unfortunately, older HTTPS servers refuse to connect when such options are + * presented. Rather than avoiding these options entirely, this class allows a + * connection to be attempted with modern options and then retried without them + * should the attempt fail. + */ +public final class Connection implements Closeable { + private static final byte[] NPN_PROTOCOLS = new byte[] { + 6, 's', 'p', 'd', 'y', '/', '3', + 8, 'h', 't', 't', 'p', '/', '1', '.', '1' + }; + private static final byte[] SPDY3 = new byte[] { + 's', 'p', 'd', 'y', '/', '3' + }; + private static final byte[] HTTP_11 = new byte[] { + 'h', 't', 't', 'p', '/', '1', '.', '1' + }; + + private final Route route; + + private Socket socket; + private InputStream in; + private OutputStream out; + private boolean connected = false; + private SpdyConnection spdyConnection; + private int httpMinorVersion = 1; // Assume HTTP/1.1 + private long idleStartTimeNs; + + public Connection(Route route) { + this.route = route; + } + + public void connect(int connectTimeout, int readTimeout, TunnelRequest tunnelRequest) + throws IOException { + if (connected) throw new IllegalStateException("already connected"); + + socket = (route.proxy.type() != Proxy.Type.HTTP) ? new Socket(route.proxy) : new Socket(); + Platform.get().connectSocket(socket, route.inetSocketAddress, connectTimeout); + socket.setSoTimeout(readTimeout); + in = socket.getInputStream(); + out = socket.getOutputStream(); + + if (route.address.sslSocketFactory != null) { + upgradeToTls(tunnelRequest); + } else { + streamWrapper(); + } + connected = true; + } + + /** + * Create an {@code SSLSocket} and perform the TLS handshake and certificate + * validation. + */ + private void upgradeToTls(TunnelRequest tunnelRequest) throws IOException { + Platform platform = Platform.get(); + + // Make an SSL Tunnel on the first message pair of each SSL + proxy connection. + if (requiresTunnel()) { + makeTunnel(tunnelRequest); + } + + // Create the wrapper over connected socket. + socket = route.address.sslSocketFactory + .createSocket(socket, route.address.uriHost, route.address.uriPort, true /* autoClose */); + SSLSocket sslSocket = (SSLSocket) socket; + if (route.modernTls) { + platform.enableTlsExtensions(sslSocket, route.address.uriHost); + } else { + platform.supportTlsIntolerantServer(sslSocket); + } + + boolean useNpn = route.modernTls && route.address.transports.contains("spdy/3"); + if (useNpn) { + platform.setNpnProtocols(sslSocket, NPN_PROTOCOLS); + } + + // Force handshake. This can throw! + sslSocket.startHandshake(); + + // Verify that the socket's certificates are acceptable for the target host. + if (!route.address.hostnameVerifier.verify(route.address.uriHost, sslSocket.getSession())) { + throw new IOException("Hostname '" + route.address.uriHost + "' was not verified"); + } + + out = sslSocket.getOutputStream(); + in = sslSocket.getInputStream(); + streamWrapper(); + + byte[] selectedProtocol; + if (useNpn && (selectedProtocol = platform.getNpnSelectedProtocol(sslSocket)) != null) { + if (Arrays.equals(selectedProtocol, SPDY3)) { + sslSocket.setSoTimeout(0); // SPDY timeouts are set per-stream. + spdyConnection = new SpdyConnection.Builder(route.address.getUriHost(), true, in, out) + .build(); + spdyConnection.sendConnectionHeader(); + } else if (!Arrays.equals(selectedProtocol, HTTP_11)) { + throw new IOException( + "Unexpected NPN transport " + new String(selectedProtocol, "ISO-8859-1")); + } + } + } + + /** Returns true if {@link #connect} has been attempted on this connection. */ + public boolean isConnected() { + return connected; + } + + @Override public void close() throws IOException { + socket.close(); + } + + /** Returns the route used by this connection. */ + public Route getRoute() { + return route; + } + + /** + * Returns the socket that this connection uses, or null if the connection + * is not currently connected. + */ + public Socket getSocket() { + return socket; + } + + /** Returns true if this connection is alive. */ + public boolean isAlive() { + return !socket.isClosed() && !socket.isInputShutdown() && !socket.isOutputShutdown(); + } + + /** + * Returns true if we are confident that we can read data from this + * connection. This is more expensive and more accurate than {@link + * #isAlive()}; callers should check {@link #isAlive()} first. + */ + public boolean isReadable() { + if (!(in instanceof BufferedInputStream)) { + return true; // Optimistic. + } + if (isSpdy()) { + return true; // Optimistic. We can't test SPDY because its streams are in use. + } + BufferedInputStream bufferedInputStream = (BufferedInputStream) in; + try { + int readTimeout = socket.getSoTimeout(); + try { + socket.setSoTimeout(1); + bufferedInputStream.mark(1); + if (bufferedInputStream.read() == -1) { + return false; // Stream is exhausted; socket is closed. + } + bufferedInputStream.reset(); + return true; + } finally { + socket.setSoTimeout(readTimeout); + } + } catch (SocketTimeoutException ignored) { + return true; // Read timed out; socket is good. + } catch (IOException e) { + return false; // Couldn't read; socket is closed. + } + } + + public void resetIdleStartTime() { + if (spdyConnection != null) { + throw new IllegalStateException("spdyConnection != null"); + } + this.idleStartTimeNs = System.nanoTime(); + } + + /** Returns true if this connection is idle. */ + public boolean isIdle() { + return spdyConnection == null || spdyConnection.isIdle(); + } + + /** + * Returns true if this connection has been idle for longer than + * {@code keepAliveDurationNs}. + */ + public boolean isExpired(long keepAliveDurationNs) { + return getIdleStartTimeNs() < System.nanoTime() - keepAliveDurationNs; + } + + /** + * Returns the time in ns when this connection became idle. Undefined if + * this connection is not idle. + */ + public long getIdleStartTimeNs() { + return spdyConnection == null ? idleStartTimeNs : spdyConnection.getIdleStartTimeNs(); + } + + /** Returns the transport appropriate for this connection. */ + public Object newTransport(HttpEngine httpEngine) throws IOException { + return (spdyConnection != null) + ? new SpdyTransport(httpEngine, spdyConnection) + : new HttpTransport(httpEngine, out, in); + } + + /** + * Returns true if this is a SPDY connection. Such connections can be used + * in multiple HTTP requests simultaneously. + */ + public boolean isSpdy() { + return spdyConnection != null; + } + + public SpdyConnection getSpdyConnection() { + return spdyConnection; + } + + /** + * Returns the minor HTTP version that should be used for future requests on + * this connection. Either 0 for HTTP/1.0, or 1 for HTTP/1.1. The default + * value is 1 for new connections. + */ + public int getHttpMinorVersion() { + return httpMinorVersion; + } + + public void setHttpMinorVersion(int httpMinorVersion) { + this.httpMinorVersion = httpMinorVersion; + } + + /** + * Returns true if the HTTP connection needs to tunnel one protocol over + * another, such as when using HTTPS through an HTTP proxy. When doing so, + * we must avoid buffering bytes intended for the higher-level protocol. + */ + public boolean requiresTunnel() { + return route.address.sslSocketFactory != null && route.proxy.type() == Proxy.Type.HTTP; + } + + public void updateReadTimeout(int newTimeout) throws IOException { + if (!connected) throw new IllegalStateException("updateReadTimeout - not connected"); + socket.setSoTimeout(newTimeout); + } + + /** + * To make an HTTPS connection over an HTTP proxy, send an unencrypted + * CONNECT request to create the proxy connection. This may need to be + * retried if the proxy requires authorization. + */ + private void makeTunnel(TunnelRequest tunnelRequest) throws IOException { + RawHeaders requestHeaders = tunnelRequest.getRequestHeaders(); + while (true) { + out.write(requestHeaders.toBytes()); + RawHeaders responseHeaders = RawHeaders.fromBytes(in); + + switch (responseHeaders.getResponseCode()) { + case HTTP_OK: + return; + case HTTP_PROXY_AUTH: + requestHeaders = new RawHeaders(requestHeaders); + URL url = new URL("https", tunnelRequest.host, tunnelRequest.port, "/"); + boolean credentialsFound = HttpAuthenticator.processAuthHeader( + route.address.authenticator, HTTP_PROXY_AUTH, responseHeaders, requestHeaders, + route.proxy, url); + if (credentialsFound) { + continue; + } else { + throw new IOException("Failed to authenticate with proxy"); + } + default: + throw new IOException( + "Unexpected response code for CONNECT: " + responseHeaders.getResponseCode()); + } + } + } + + private void streamWrapper() throws IOException { + in = new BufferedInputStream(in, 4096); + out = new BufferedOutputStream(out, 256); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java new file mode 100644 index 0000000..42b70b9 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ConnectionPool.java @@ -0,0 +1,274 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Platform; +import com.squareup.okhttp.internal.Util; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * Manages reuse of HTTP and SPDY connections for reduced network latency. HTTP + * requests that share the same {@link com.squareup.okhttp.Address} may share a + * {@link com.squareup.okhttp.Connection}. This class implements the policy of + * which connections to keep open for future use. + * + *

The {@link #getDefault() system-wide default} uses system properties for + * tuning parameters: + *

    + *
  • {@code http.keepAlive} true if HTTP and SPDY connections should be + * pooled at all. Default is true. + *
  • {@code http.maxConnections} maximum number of idle connections to + * each to keep in the pool. Default is 5. + *
  • {@code http.keepAliveDuration} Time in milliseconds to keep the + * connection alive in the pool before closing it. Default is 5 minutes. + * This property isn't used by {@code HttpURLConnection}. + *
+ * + *

The default instance doesn't adjust its configuration as system + * properties are changed. This assumes that the applications that set these + * parameters do so before making HTTP connections, and that this class is + * initialized lazily. + */ +public class ConnectionPool { + private static final int MAX_CONNECTIONS_TO_CLEANUP = 2; + private static final long DEFAULT_KEEP_ALIVE_DURATION_MS = 5 * 60 * 1000; // 5 min + + private static final ConnectionPool systemDefault; + + static { + String keepAlive = System.getProperty("http.keepAlive"); + String keepAliveDuration = System.getProperty("http.keepAliveDuration"); + String maxIdleConnections = System.getProperty("http.maxConnections"); + long keepAliveDurationMs = keepAliveDuration != null ? Long.parseLong(keepAliveDuration) + : DEFAULT_KEEP_ALIVE_DURATION_MS; + if (keepAlive != null && !Boolean.parseBoolean(keepAlive)) { + systemDefault = new ConnectionPool(0, keepAliveDurationMs); + } else if (maxIdleConnections != null) { + systemDefault = new ConnectionPool(Integer.parseInt(maxIdleConnections), keepAliveDurationMs); + } else { + systemDefault = new ConnectionPool(5, keepAliveDurationMs); + } + } + + /** The maximum number of idle connections for each address. */ + private final int maxIdleConnections; + private final long keepAliveDurationNs; + + private final LinkedList connections = new LinkedList(); + + /** We use a single background thread to cleanup expired connections. */ + private final ExecutorService executorService = new ThreadPoolExecutor(0, 1, + 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(), + Util.daemonThreadFactory("OkHttp ConnectionPool")); + private final Callable connectionsCleanupCallable = new Callable() { + @Override public Void call() throws Exception { + List expiredConnections = new ArrayList(MAX_CONNECTIONS_TO_CLEANUP); + int idleConnectionCount = 0; + synchronized (ConnectionPool.this) { + for (ListIterator i = connections.listIterator(connections.size()); + i.hasPrevious(); ) { + Connection connection = i.previous(); + if (!connection.isAlive() || connection.isExpired(keepAliveDurationNs)) { + i.remove(); + expiredConnections.add(connection); + if (expiredConnections.size() == MAX_CONNECTIONS_TO_CLEANUP) break; + } else if (connection.isIdle()) { + idleConnectionCount++; + } + } + + for (ListIterator i = connections.listIterator(connections.size()); + i.hasPrevious() && idleConnectionCount > maxIdleConnections; ) { + Connection connection = i.previous(); + if (connection.isIdle()) { + expiredConnections.add(connection); + i.remove(); + --idleConnectionCount; + } + } + } + for (Connection expiredConnection : expiredConnections) { + Util.closeQuietly(expiredConnection); + } + return null; + } + }; + + public ConnectionPool(int maxIdleConnections, long keepAliveDurationMs) { + this.maxIdleConnections = maxIdleConnections; + this.keepAliveDurationNs = keepAliveDurationMs * 1000 * 1000; + } + + /** + * Returns a snapshot of the connections in this pool, ordered from newest to + * oldest. Waits for the cleanup callable to run if it is currently scheduled. + */ + List getConnections() { + waitForCleanupCallableToRun(); + synchronized (this) { + return new ArrayList(connections); + } + } + + /** + * Blocks until the executor service has processed all currently enqueued + * jobs. + */ + private void waitForCleanupCallableToRun() { + try { + executorService.submit(new Runnable() { + @Override public void run() { + } + }).get(); + } catch (Exception e) { + throw new AssertionError(); + } + } + + public static ConnectionPool getDefault() { + return systemDefault; + } + + /** Returns total number of connections in the pool. */ + public synchronized int getConnectionCount() { + return connections.size(); + } + + /** Returns total number of spdy connections in the pool. */ + public synchronized int getSpdyConnectionCount() { + int total = 0; + for (Connection connection : connections) { + if (connection.isSpdy()) total++; + } + return total; + } + + /** Returns total number of http connections in the pool. */ + public synchronized int getHttpConnectionCount() { + int total = 0; + for (Connection connection : connections) { + if (!connection.isSpdy()) total++; + } + return total; + } + + /** Returns a recycled connection to {@code address}, or null if no such connection exists. */ + public synchronized Connection get(Address address) { + Connection foundConnection = null; + for (ListIterator i = connections.listIterator(connections.size()); + i.hasPrevious(); ) { + Connection connection = i.previous(); + if (!connection.getRoute().getAddress().equals(address) + || !connection.isAlive() + || System.nanoTime() - connection.getIdleStartTimeNs() >= keepAliveDurationNs) { + continue; + } + i.remove(); + if (!connection.isSpdy()) { + try { + Platform.get().tagSocket(connection.getSocket()); + } catch (SocketException e) { + Util.closeQuietly(connection); + // When unable to tag, skip recycling and close + Platform.get().logW("Unable to tagSocket(): " + e); + continue; + } + } + foundConnection = connection; + break; + } + + if (foundConnection != null && foundConnection.isSpdy()) { + connections.addFirst(foundConnection); // Add it back after iteration. + } + + executorService.submit(connectionsCleanupCallable); + return foundConnection; + } + + /** + * Gives {@code connection} to the pool. The pool may store the connection, + * or close it, as its policy describes. + * + *

It is an error to use {@code connection} after calling this method. + */ + public void recycle(Connection connection) { + if (connection.isSpdy()) { + return; + } + + if (!connection.isAlive()) { + Util.closeQuietly(connection); + return; + } + + try { + Platform.get().untagSocket(connection.getSocket()); + } catch (SocketException e) { + // When unable to remove tagging, skip recycling and close. + Platform.get().logW("Unable to untagSocket(): " + e); + Util.closeQuietly(connection); + return; + } + + synchronized (this) { + connections.addFirst(connection); + connection.resetIdleStartTime(); + } + + executorService.submit(connectionsCleanupCallable); + } + + /** + * Shares the SPDY connection with the pool. Callers to this method may + * continue to use {@code connection}. + */ + public void maybeShare(Connection connection) { + executorService.submit(connectionsCleanupCallable); + if (!connection.isSpdy()) { + // Only SPDY connections are sharable. + return; + } + if (connection.isAlive()) { + synchronized (this) { + connections.addFirst(connection); + } + } + } + + /** Close and remove all connections in the pool. */ + public void evictAll() { + List connections; + synchronized (this) { + connections = new ArrayList(this.connections); + this.connections.clear(); + } + + for (Connection connection : connections) { + Util.closeQuietly(connection); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java new file mode 100644 index 0000000..1982a8a --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Dispatcher.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.http.ResponseHeaders; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +final class Dispatcher { + // TODO: thread pool size should be configurable; possibly configurable per host. + private final ThreadPoolExecutor executorService = new ThreadPoolExecutor( + 8, 8, 60, TimeUnit.SECONDS, new LinkedBlockingQueue()); + private final Map> enqueuedJobs = new LinkedHashMap>(); + + public synchronized void enqueue( + OkHttpClient client, Request request, Response.Receiver responseReceiver) { + Job job = new Job(this, client, request, responseReceiver); + List jobsForTag = enqueuedJobs.get(request.tag()); + if (jobsForTag == null) { + jobsForTag = new ArrayList(2); + enqueuedJobs.put(request.tag(), jobsForTag); + } + jobsForTag.add(job); + executorService.execute(job); + } + + public synchronized void cancel(Object tag) { + List jobs = enqueuedJobs.remove(tag); + if (jobs == null) return; + for (Job job : jobs) { + executorService.remove(job); + } + } + + synchronized void finished(Job job) { + List jobs = enqueuedJobs.get(job.tag()); + if (jobs != null) jobs.remove(job); + } + + static class RealResponseBody extends Response.Body { + private final ResponseHeaders responseHeaders; + private final InputStream in; + + RealResponseBody(ResponseHeaders responseHeaders, InputStream in) { + this.responseHeaders = responseHeaders; + this.in = in; + } + + @Override public boolean ready() throws IOException { + return true; + } + + @Override public MediaType contentType() { + String contentType = responseHeaders.getContentType(); + return contentType != null ? MediaType.parse(contentType) : null; + } + + @Override public long contentLength() { + return responseHeaders.getContentLength(); + } + + @Override public InputStream byteStream() throws IOException { + return in; + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java new file mode 100644 index 0000000..a354700 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Failure.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +/** + * A failure attempting to retrieve an HTTP response. + * + *

Warning: Experimental OkHttp 2.0 API

+ * This class is in beta. APIs are subject to change! + */ +/* OkHttp 2.0: public */ class Failure { + private final Request request; + private final Throwable exception; + + private Failure(Builder builder) { + this.request = builder.request; + this.exception = builder.exception; + } + + public Request request() { + return request; + } + + public Throwable exception() { + return exception; + } + + public static class Builder { + private Request request; + private Throwable exception; + + public Builder request(Request request) { + this.request = request; + return this; + } + + public Builder exception(Throwable exception) { + this.exception = exception; + return this; + } + + public Failure build() { + return new Failure(this); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java new file mode 100644 index 0000000..8210318 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/HttpResponseCache.java @@ -0,0 +1,722 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Base64; +import com.squareup.okhttp.internal.DiskLruCache; +import com.squareup.okhttp.internal.StrictLineReader; +import com.squareup.okhttp.internal.Util; +import com.squareup.okhttp.internal.http.HttpEngine; +import com.squareup.okhttp.internal.http.HttpURLConnectionImpl; +import com.squareup.okhttp.internal.http.HttpsEngine; +import com.squareup.okhttp.internal.http.HttpsURLConnectionImpl; +import com.squareup.okhttp.internal.http.RawHeaders; +import com.squareup.okhttp.internal.http.ResponseHeaders; +import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FilterInputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.net.CacheRequest; +import java.net.CacheResponse; +import java.net.HttpURLConnection; +import java.net.ResponseCache; +import java.net.SecureCacheResponse; +import java.net.URI; +import java.net.URLConnection; +import java.security.Principal; +import java.security.cert.Certificate; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import javax.net.ssl.SSLPeerUnverifiedException; +import javax.net.ssl.SSLSocket; + +import static com.squareup.okhttp.internal.Util.US_ASCII; +import static com.squareup.okhttp.internal.Util.UTF_8; + +/** + * Caches HTTP and HTTPS responses to the filesystem so they may be reused, + * saving time and bandwidth. + * + *

Cache Optimization

+ * To measure cache effectiveness, this class tracks three statistics: + *
    + *
  • {@link #getRequestCount() Request Count:} the number + * of HTTP requests issued since this cache was created. + *
  • {@link #getNetworkCount() Network Count:} the + * number of those requests that required network use. + *
  • {@link #getHitCount() Hit Count:} the number of + * those requests whose responses were served by the cache. + *
+ * Sometimes a request will result in a conditional cache hit. If the cache + * contains a stale copy of the response, the client will issue a conditional + * {@code GET}. The server will then send either the updated response if it has + * changed, or a short 'not modified' response if the client's copy is still + * valid. Such responses increment both the network count and hit count. + * + *

Force a Network Response

+ * In some situations, such as after a user clicks a 'refresh' button, it may be + * necessary to skip the cache, and fetch data directly from the server. To force + * a full refresh, add the {@code no-cache} directive:
   {@code
+ *         connection.addRequestProperty("Cache-Control", "no-cache");
+ * }
+ * If it is only necessary to force a cached response to be validated by the + * server, use the more efficient {@code max-age=0} instead:
   {@code
+ *         connection.addRequestProperty("Cache-Control", "max-age=0");
+ * }
+ * + *

Force a Cache Response

+ * Sometimes you'll want to show resources if they are available immediately, + * but not otherwise. This can be used so your application can show + * something while waiting for the latest data to be downloaded. To + * restrict a request to locally-cached resources, add the {@code + * only-if-cached} directive:
   {@code
+ *     try {
+ *         connection.addRequestProperty("Cache-Control", "only-if-cached");
+ *         InputStream cached = connection.getInputStream();
+ *         // the resource was cached! show it
+ *     } catch (FileNotFoundException e) {
+ *         // the resource was not cached
+ *     }
+ * }
+ * This technique works even better in situations where a stale response is + * better than no response. To permit stale cached responses, use the {@code + * max-stale} directive with the maximum staleness in seconds:
   {@code
+ *         int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
+ *         connection.addRequestProperty("Cache-Control", "max-stale=" + maxStale);
+ * }
+ */ +public final class HttpResponseCache extends ResponseCache { + // TODO: add APIs to iterate the cache? + private static final int VERSION = 201105; + private static final int ENTRY_METADATA = 0; + private static final int ENTRY_BODY = 1; + private static final int ENTRY_COUNT = 2; + + private final DiskLruCache cache; + + /* read and write statistics, all guarded by 'this' */ + private int writeSuccessCount; + private int writeAbortCount; + private int networkCount; + private int hitCount; + private int requestCount; + + /** + * Although this class only exposes the limited ResponseCache API, it + * implements the full OkResponseCache interface. This field is used as a + * package private handle to the complete implementation. It delegates to + * public and private members of this type. + */ + final OkResponseCache okResponseCache = new OkResponseCache() { + @Override public CacheResponse get(URI uri, String requestMethod, + Map> requestHeaders) throws IOException { + return HttpResponseCache.this.get(uri, requestMethod, requestHeaders); + } + + @Override public CacheRequest put(URI uri, URLConnection connection) throws IOException { + return HttpResponseCache.this.put(uri, connection); + } + + @Override public void maybeRemove(String requestMethod, URI uri) throws IOException { + HttpResponseCache.this.maybeRemove(requestMethod, uri); + } + + @Override public void update( + CacheResponse conditionalCacheHit, HttpURLConnection connection) throws IOException { + HttpResponseCache.this.update(conditionalCacheHit, connection); + } + + @Override public void trackConditionalCacheHit() { + HttpResponseCache.this.trackConditionalCacheHit(); + } + + @Override public void trackResponse(ResponseSource source) { + HttpResponseCache.this.trackResponse(source); + } + }; + + public HttpResponseCache(File directory, long maxSize) throws IOException { + cache = DiskLruCache.open(directory, VERSION, ENTRY_COUNT, maxSize); + } + + private String uriToKey(URI uri) { + return Util.hash(uri.toString()); + } + + @Override public CacheResponse get(URI uri, String requestMethod, + Map> requestHeaders) { + String key = uriToKey(uri); + DiskLruCache.Snapshot snapshot; + Entry entry; + try { + snapshot = cache.get(key); + if (snapshot == null) { + return null; + } + entry = new Entry(snapshot.getInputStream(ENTRY_METADATA)); + } catch (IOException e) { + // Give up because the cache cannot be read. + return null; + } + + if (!entry.matches(uri, requestMethod, requestHeaders)) { + snapshot.close(); + return null; + } + + return entry.isHttps() ? new EntrySecureCacheResponse(entry, snapshot) + : new EntryCacheResponse(entry, snapshot); + } + + @Override public CacheRequest put(URI uri, URLConnection urlConnection) throws IOException { + if (!(urlConnection instanceof HttpURLConnection)) { + return null; + } + + HttpURLConnection httpConnection = (HttpURLConnection) urlConnection; + String requestMethod = httpConnection.getRequestMethod(); + + if (maybeRemove(requestMethod, uri)) { + return null; + } + if (!requestMethod.equals("GET")) { + // Don't cache non-GET responses. We're technically allowed to cache + // HEAD requests and some POST requests, but the complexity of doing + // so is high and the benefit is low. + return null; + } + + HttpEngine httpEngine = getHttpEngine(httpConnection); + if (httpEngine == null) { + // Don't cache unless the HTTP implementation is ours. + return null; + } + + ResponseHeaders response = httpEngine.getResponseHeaders(); + if (response.hasVaryAll()) { + return null; + } + + RawHeaders varyHeaders = + httpEngine.getRequestHeaders().getHeaders().getAll(response.getVaryFields()); + Entry entry = new Entry(uri, varyHeaders, httpConnection); + DiskLruCache.Editor editor = null; + try { + editor = cache.edit(uriToKey(uri)); + if (editor == null) { + return null; + } + entry.writeTo(editor); + return new CacheRequestImpl(editor); + } catch (IOException e) { + abortQuietly(editor); + return null; + } + } + + /** + * Returns true if the supplied {@code requestMethod} potentially invalidates an entry in the + * cache. + */ + private boolean maybeRemove(String requestMethod, URI uri) { + if (requestMethod.equals("POST") || requestMethod.equals("PUT") || requestMethod.equals( + "DELETE")) { + try { + cache.remove(uriToKey(uri)); + } catch (IOException ignored) { + // The cache cannot be written. + } + return true; + } + return false; + } + + private void update(CacheResponse conditionalCacheHit, HttpURLConnection httpConnection) + throws IOException { + HttpEngine httpEngine = getHttpEngine(httpConnection); + URI uri = httpEngine.getUri(); + ResponseHeaders response = httpEngine.getResponseHeaders(); + RawHeaders varyHeaders = + httpEngine.getRequestHeaders().getHeaders().getAll(response.getVaryFields()); + Entry entry = new Entry(uri, varyHeaders, httpConnection); + DiskLruCache.Snapshot snapshot = (conditionalCacheHit instanceof EntryCacheResponse) + ? ((EntryCacheResponse) conditionalCacheHit).snapshot + : ((EntrySecureCacheResponse) conditionalCacheHit).snapshot; + DiskLruCache.Editor editor = null; + try { + editor = snapshot.edit(); // returns null if snapshot is not current + if (editor != null) { + entry.writeTo(editor); + editor.commit(); + } + } catch (IOException e) { + abortQuietly(editor); + } + } + + private void abortQuietly(DiskLruCache.Editor editor) { + // Give up because the cache cannot be written. + try { + if (editor != null) { + editor.abort(); + } + } catch (IOException ignored) { + } + } + + private HttpEngine getHttpEngine(URLConnection httpConnection) { + if (httpConnection instanceof HttpURLConnectionImpl) { + return ((HttpURLConnectionImpl) httpConnection).getHttpEngine(); + } else if (httpConnection instanceof HttpsURLConnectionImpl) { + return ((HttpsURLConnectionImpl) httpConnection).getHttpEngine(); + } else { + return null; + } + } + + /** + * Closes the cache and deletes all of its stored values. This will delete + * all files in the cache directory including files that weren't created by + * the cache. + */ + public void delete() throws IOException { + cache.delete(); + } + + public synchronized int getWriteAbortCount() { + return writeAbortCount; + } + + public synchronized int getWriteSuccessCount() { + return writeSuccessCount; + } + + public long getSize() { + return cache.size(); + } + + public long getMaxSize() { + return cache.getMaxSize(); + } + + public void flush() throws IOException { + cache.flush(); + } + + public void close() throws IOException { + cache.close(); + } + + public File getDirectory() { + return cache.getDirectory(); + } + + public boolean isClosed() { + return cache.isClosed(); + } + + private synchronized void trackResponse(ResponseSource source) { + requestCount++; + + switch (source) { + case CACHE: + hitCount++; + break; + case CONDITIONAL_CACHE: + case NETWORK: + networkCount++; + break; + } + } + + private synchronized void trackConditionalCacheHit() { + hitCount++; + } + + public synchronized int getNetworkCount() { + return networkCount; + } + + public synchronized int getHitCount() { + return hitCount; + } + + public synchronized int getRequestCount() { + return requestCount; + } + + private final class CacheRequestImpl extends CacheRequest { + private final DiskLruCache.Editor editor; + private OutputStream cacheOut; + private boolean done; + private OutputStream body; + + public CacheRequestImpl(final DiskLruCache.Editor editor) throws IOException { + this.editor = editor; + this.cacheOut = editor.newOutputStream(ENTRY_BODY); + this.body = new FilterOutputStream(cacheOut) { + @Override public void close() throws IOException { + synchronized (HttpResponseCache.this) { + if (done) { + return; + } + done = true; + writeSuccessCount++; + } + super.close(); + editor.commit(); + } + + @Override public void write(byte[] buffer, int offset, int length) throws IOException { + // Since we don't override "write(int oneByte)", we can write directly to "out" + // and avoid the inefficient implementation from the FilterOutputStream. + out.write(buffer, offset, length); + } + }; + } + + @Override public void abort() { + synchronized (HttpResponseCache.this) { + if (done) { + return; + } + done = true; + writeAbortCount++; + } + Util.closeQuietly(cacheOut); + try { + editor.abort(); + } catch (IOException ignored) { + } + } + + @Override public OutputStream getBody() throws IOException { + return body; + } + } + + private static final class Entry { + private final String uri; + private final RawHeaders varyHeaders; + private final String requestMethod; + private final RawHeaders responseHeaders; + private final String cipherSuite; + private final Certificate[] peerCertificates; + private final Certificate[] localCertificates; + + /** + * Reads an entry from an input stream. A typical entry looks like this: + *
{@code
+     *   http://google.com/foo
+     *   GET
+     *   2
+     *   Accept-Language: fr-CA
+     *   Accept-Charset: UTF-8
+     *   HTTP/1.1 200 OK
+     *   3
+     *   Content-Type: image/png
+     *   Content-Length: 100
+     *   Cache-Control: max-age=600
+     * }
+ * + *

A typical HTTPS file looks like this: + *

{@code
+     *   https://google.com/foo
+     *   GET
+     *   2
+     *   Accept-Language: fr-CA
+     *   Accept-Charset: UTF-8
+     *   HTTP/1.1 200 OK
+     *   3
+     *   Content-Type: image/png
+     *   Content-Length: 100
+     *   Cache-Control: max-age=600
+     *
+     *   AES_256_WITH_MD5
+     *   2
+     *   base64-encoded peerCertificate[0]
+     *   base64-encoded peerCertificate[1]
+     *   -1
+     * }
+ * The file is newline separated. The first two lines are the URL and + * the request method. Next is the number of HTTP Vary request header + * lines, followed by those lines. + * + *

Next is the response status line, followed by the number of HTTP + * response header lines, followed by those lines. + * + *

HTTPS responses also contain SSL session information. This begins + * with a blank line, and then a line containing the cipher suite. Next + * is the length of the peer certificate chain. These certificates are + * base64-encoded and appear each on their own line. The next line + * contains the length of the local certificate chain. These + * certificates are also base64-encoded and appear each on their own + * line. A length of -1 is used to encode a null array. + */ + public Entry(InputStream in) throws IOException { + try { + StrictLineReader reader = new StrictLineReader(in, US_ASCII); + uri = reader.readLine(); + requestMethod = reader.readLine(); + varyHeaders = new RawHeaders(); + int varyRequestHeaderLineCount = reader.readInt(); + for (int i = 0; i < varyRequestHeaderLineCount; i++) { + varyHeaders.addLine(reader.readLine()); + } + + responseHeaders = new RawHeaders(); + responseHeaders.setStatusLine(reader.readLine()); + int responseHeaderLineCount = reader.readInt(); + for (int i = 0; i < responseHeaderLineCount; i++) { + responseHeaders.addLine(reader.readLine()); + } + + if (isHttps()) { + String blank = reader.readLine(); + if (blank.length() > 0) { + throw new IOException("expected \"\" but was \"" + blank + "\""); + } + cipherSuite = reader.readLine(); + peerCertificates = readCertArray(reader); + localCertificates = readCertArray(reader); + } else { + cipherSuite = null; + peerCertificates = null; + localCertificates = null; + } + } finally { + in.close(); + } + } + + public Entry(URI uri, RawHeaders varyHeaders, HttpURLConnection httpConnection) + throws IOException { + this.uri = uri.toString(); + this.varyHeaders = varyHeaders; + this.requestMethod = httpConnection.getRequestMethod(); + this.responseHeaders = RawHeaders.fromMultimap(httpConnection.getHeaderFields(), true); + + SSLSocket sslSocket = getSslSocket(httpConnection); + if (sslSocket != null) { + cipherSuite = sslSocket.getSession().getCipherSuite(); + Certificate[] peerCertificatesNonFinal = null; + try { + peerCertificatesNonFinal = sslSocket.getSession().getPeerCertificates(); + } catch (SSLPeerUnverifiedException ignored) { + } + peerCertificates = peerCertificatesNonFinal; + localCertificates = sslSocket.getSession().getLocalCertificates(); + } else { + cipherSuite = null; + peerCertificates = null; + localCertificates = null; + } + } + + /** + * Returns the SSL socket used by {@code httpConnection} for HTTPS, nor null + * if the connection isn't using HTTPS. Since we permit redirects across + * protocols (HTTP to HTTPS or vice versa), the implementation type of the + * connection doesn't necessarily match the implementation type of its HTTP + * engine. + */ + private SSLSocket getSslSocket(HttpURLConnection httpConnection) { + HttpEngine engine = httpConnection instanceof HttpsURLConnectionImpl + ? ((HttpsURLConnectionImpl) httpConnection).getHttpEngine() + : ((HttpURLConnectionImpl) httpConnection).getHttpEngine(); + return engine instanceof HttpsEngine + ? ((HttpsEngine) engine).getSslSocket() + : null; + } + + public void writeTo(DiskLruCache.Editor editor) throws IOException { + OutputStream out = editor.newOutputStream(ENTRY_METADATA); + Writer writer = new BufferedWriter(new OutputStreamWriter(out, UTF_8)); + + writer.write(uri + '\n'); + writer.write(requestMethod + '\n'); + writer.write(Integer.toString(varyHeaders.length()) + '\n'); + for (int i = 0; i < varyHeaders.length(); i++) { + writer.write(varyHeaders.getFieldName(i) + ": " + varyHeaders.getValue(i) + '\n'); + } + + writer.write(responseHeaders.getStatusLine() + '\n'); + writer.write(Integer.toString(responseHeaders.length()) + '\n'); + for (int i = 0; i < responseHeaders.length(); i++) { + writer.write(responseHeaders.getFieldName(i) + ": " + responseHeaders.getValue(i) + '\n'); + } + + if (isHttps()) { + writer.write('\n'); + writer.write(cipherSuite + '\n'); + writeCertArray(writer, peerCertificates); + writeCertArray(writer, localCertificates); + } + writer.close(); + } + + private boolean isHttps() { + return uri.startsWith("https://"); + } + + private Certificate[] readCertArray(StrictLineReader reader) throws IOException { + int length = reader.readInt(); + if (length == -1) { + return null; + } + try { + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + Certificate[] result = new Certificate[length]; + for (int i = 0; i < result.length; i++) { + String line = reader.readLine(); + byte[] bytes = Base64.decode(line.getBytes("US-ASCII")); + result[i] = certificateFactory.generateCertificate(new ByteArrayInputStream(bytes)); + } + return result; + } catch (CertificateException e) { + throw new IOException(e.getMessage()); + } + } + + private void writeCertArray(Writer writer, Certificate[] certificates) throws IOException { + if (certificates == null) { + writer.write("-1\n"); + return; + } + try { + writer.write(Integer.toString(certificates.length) + '\n'); + for (Certificate certificate : certificates) { + byte[] bytes = certificate.getEncoded(); + String line = Base64.encode(bytes); + writer.write(line + '\n'); + } + } catch (CertificateEncodingException e) { + throw new IOException(e.getMessage()); + } + } + + public boolean matches(URI uri, String requestMethod, + Map> requestHeaders) { + return this.uri.equals(uri.toString()) + && this.requestMethod.equals(requestMethod) + && new ResponseHeaders(uri, responseHeaders).varyMatches(varyHeaders.toMultimap(false), + requestHeaders); + } + } + + /** + * Returns an input stream that reads the body of a snapshot, closing the + * snapshot when the stream is closed. + */ + private static InputStream newBodyInputStream(final DiskLruCache.Snapshot snapshot) { + return new FilterInputStream(snapshot.getInputStream(ENTRY_BODY)) { + @Override public void close() throws IOException { + snapshot.close(); + super.close(); + } + }; + } + + static class EntryCacheResponse extends CacheResponse { + private final Entry entry; + private final DiskLruCache.Snapshot snapshot; + private final InputStream in; + + public EntryCacheResponse(Entry entry, DiskLruCache.Snapshot snapshot) { + this.entry = entry; + this.snapshot = snapshot; + this.in = newBodyInputStream(snapshot); + } + + @Override public Map> getHeaders() { + return entry.responseHeaders.toMultimap(true); + } + + @Override public InputStream getBody() { + return in; + } + } + + static class EntrySecureCacheResponse extends SecureCacheResponse { + private final Entry entry; + private final DiskLruCache.Snapshot snapshot; + private final InputStream in; + + public EntrySecureCacheResponse(Entry entry, DiskLruCache.Snapshot snapshot) { + this.entry = entry; + this.snapshot = snapshot; + this.in = newBodyInputStream(snapshot); + } + + @Override public Map> getHeaders() { + return entry.responseHeaders.toMultimap(true); + } + + @Override public InputStream getBody() { + return in; + } + + @Override public String getCipherSuite() { + return entry.cipherSuite; + } + + @Override public List getServerCertificateChain() + throws SSLPeerUnverifiedException { + if (entry.peerCertificates == null || entry.peerCertificates.length == 0) { + throw new SSLPeerUnverifiedException(null); + } + return Arrays.asList(entry.peerCertificates.clone()); + } + + @Override public Principal getPeerPrincipal() throws SSLPeerUnverifiedException { + if (entry.peerCertificates == null || entry.peerCertificates.length == 0) { + throw new SSLPeerUnverifiedException(null); + } + return ((X509Certificate) entry.peerCertificates[0]).getSubjectX500Principal(); + } + + @Override public List getLocalCertificateChain() { + if (entry.localCertificates == null || entry.localCertificates.length == 0) { + return null; + } + return Arrays.asList(entry.localCertificates.clone()); + } + + @Override public Principal getLocalPrincipal() { + if (entry.localCertificates == null || entry.localCertificates.length == 0) { + return null; + } + return ((X509Certificate) entry.localCertificates[0]).getSubjectX500Principal(); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java new file mode 100644 index 0000000..1bfeb1d --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Job.java @@ -0,0 +1,232 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.http.HttpAuthenticator; +import com.squareup.okhttp.internal.http.HttpEngine; +import com.squareup.okhttp.internal.http.HttpTransport; +import com.squareup.okhttp.internal.http.HttpsEngine; +import com.squareup.okhttp.internal.http.Policy; +import com.squareup.okhttp.internal.http.RawHeaders; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.ProtocolException; +import java.net.Proxy; +import java.net.URL; + +import static com.squareup.okhttp.internal.Util.getEffectivePort; +import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_MOVED_PERM; +import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_MOVED_TEMP; +import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_MULT_CHOICE; +import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_PROXY_AUTH; +import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_SEE_OTHER; +import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_TEMP_REDIRECT; +import static com.squareup.okhttp.internal.http.HttpURLConnectionImpl.HTTP_UNAUTHORIZED; + +final class Job implements Runnable, Policy { + private final Dispatcher dispatcher; + private final OkHttpClient client; + private final Response.Receiver responseReceiver; + + /** The request; possibly a consequence of redirects or auth headers. */ + private Request request; + + public Job(Dispatcher dispatcher, OkHttpClient client, Request request, + Response.Receiver responseReceiver) { + this.dispatcher = dispatcher; + this.client = client; + this.request = request; + this.responseReceiver = responseReceiver; + } + + @Override public int getChunkLength() { + return request.body().contentLength() == -1 ? HttpTransport.DEFAULT_CHUNK_LENGTH : -1; + } + + @Override public long getFixedContentLength() { + return request.body().contentLength(); + } + + @Override public boolean getUseCaches() { + return false; // TODO. + } + + @Override public HttpURLConnection getHttpConnectionToCache() { + return null; + } + + @Override public URL getURL() { + return request.url(); + } + + @Override public long getIfModifiedSince() { + return 0; // For HttpURLConnection only. We let the cache drive this. + } + + @Override public boolean usingProxy() { + return false; // We let the connection decide this. + } + + @Override public void setSelectedProxy(Proxy proxy) { + // Do nothing. + } + + Object tag() { + return request.tag(); + } + + @Override public void run() { + try { + Response response = execute(); + responseReceiver.onResponse(response); + } catch (IOException e) { + responseReceiver.onFailure(new Failure.Builder() + .request(request) + .exception(e) + .build()); + } finally { + // TODO: close the response body + // TODO: release the HTTP engine (potentially multiple!) + dispatcher.finished(this); + } + } + + private Response execute() throws IOException { + Connection connection = null; + Response redirectedBy = null; + + while (true) { + HttpEngine engine = newEngine(connection); + + Request.Body body = request.body(); + if (body != null) { + MediaType contentType = body.contentType(); + if (contentType == null) throw new IllegalStateException("contentType == null"); + if (engine.getRequestHeaders().getContentType() == null) { + engine.getRequestHeaders().setContentType(contentType.toString()); + } + } + + engine.sendRequest(); + + if (body != null) { + body.writeTo(engine.getRequestBody()); + } + + engine.readResponse(); + + int responseCode = engine.getResponseCode(); + Dispatcher.RealResponseBody responseBody = new Dispatcher.RealResponseBody( + engine.getResponseHeaders(), engine.getResponseBody()); + + Response response = new Response.Builder(request, responseCode) + .rawHeaders(engine.getResponseHeaders().getHeaders()) + .body(responseBody) + .redirectedBy(redirectedBy) + .build(); + + Request redirect = processResponse(engine, response); + + if (redirect == null) { + engine.automaticallyReleaseConnectionToPool(); + return response; + } + + // TODO: fail if too many redirects + // TODO: fail if not following redirects + // TODO: release engine + + connection = sameConnection(request, redirect) ? engine.getConnection() : null; + redirectedBy = response; + request = redirect; + } + } + + HttpEngine newEngine(Connection connection) throws IOException { + String protocol = request.url().getProtocol(); + RawHeaders requestHeaders = request.rawHeaders(); + if (protocol.equals("http")) { + return new HttpEngine(client, this, request.method(), requestHeaders, connection, null); + } else if (protocol.equals("https")) { + return new HttpsEngine(client, this, request.method(), requestHeaders, connection, null); + } else { + throw new AssertionError(); + } + } + + /** + * Figures out the HTTP request to make in response to receiving {@code + * response}. This will either add authentication headers or follow + * redirects. If a follow-up is either unnecessary or not applicable, this + * returns null. + */ + private Request processResponse(HttpEngine engine, Response response) throws IOException { + Request request = response.request(); + Proxy selectedProxy = engine.getConnection() != null + ? engine.getConnection().getRoute().getProxy() + : client.getProxy(); + int responseCode = response.code(); + + switch (responseCode) { + case HTTP_PROXY_AUTH: + if (selectedProxy.type() != Proxy.Type.HTTP) { + throw new ProtocolException("Received HTTP_PROXY_AUTH (407) code while not using proxy"); + } + // fall-through + case HTTP_UNAUTHORIZED: + RawHeaders successorRequestHeaders = request.rawHeaders(); + boolean credentialsFound = HttpAuthenticator.processAuthHeader(client.getAuthenticator(), + response.code(), response.rawHeaders(), successorRequestHeaders, selectedProxy, + this.request.url()); + return credentialsFound + ? request.newBuilder().rawHeaders(successorRequestHeaders).build() + : null; + + case HTTP_MULT_CHOICE: + case HTTP_MOVED_PERM: + case HTTP_MOVED_TEMP: + case HTTP_SEE_OTHER: + case HTTP_TEMP_REDIRECT: + String method = request.method(); + if (responseCode == HTTP_TEMP_REDIRECT && !method.equals("GET") && !method.equals("HEAD")) { + // "If the 307 status code is received in response to a request other than GET or HEAD, + // the user agent MUST NOT automatically redirect the request" + return null; + } + + String location = response.header("Location"); + if (location == null) { + return null; + } + + URL url = new URL(request.url(), location); + if (!url.getProtocol().equals("https") && !url.getProtocol().equals("http")) { + return null; // Don't follow redirects to unsupported protocols. + } + + return this.request.newBuilder().url(url).build(); + + default: + return null; + } + } + + private boolean sameConnection(Request a, Request b) { + return a.url().getHost().equals(b.url().getHost()) + && getEffectivePort(a.url()) == getEffectivePort(b.url()) + && a.url().getProtocol().equals(b.url().getProtocol()); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java new file mode 100644 index 0000000..2c09596 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/MediaType.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import java.nio.charset.Charset; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * An RFC 2045 Media Type, + * appropriate to describe the content type of an HTTP request or response body. + */ +public final class MediaType { + private static final String TOKEN = "([a-zA-Z0-9-!#$%&'*+.^_`{|}~]+)"; + private static final String QUOTED = "\"([^\"]*)\""; + private static final Pattern TYPE_SUBTYPE = Pattern.compile(TOKEN + "/" + TOKEN); + private static final Pattern PARAMETER = Pattern.compile( + ";\\s*" + TOKEN + "=(?:" + TOKEN + "|" + QUOTED + ")"); + + private final String mediaType; + private final String type; + private final String subtype; + private final String charset; + + private MediaType(String mediaType, String type, String subtype, String charset) { + this.mediaType = mediaType; + this.type = type; + this.subtype = subtype; + this.charset = charset; + } + + /** + * Returns a media type for {@code string}, or null if {@code string} is not a + * well-formed media type. + */ + public static MediaType parse(String string) { + Matcher typeSubtype = TYPE_SUBTYPE.matcher(string); + if (!typeSubtype.lookingAt()) return null; + String type = typeSubtype.group(1).toLowerCase(Locale.US); + String subtype = typeSubtype.group(2).toLowerCase(Locale.US); + + String charset = null; + Matcher parameter = PARAMETER.matcher(string); + for (int s = typeSubtype.end(); s < string.length(); s = parameter.end()) { + parameter.region(s, string.length()); + if (!parameter.lookingAt()) return null; // This is not a well-formed media type. + + String name = parameter.group(1); + if (name == null || !name.equalsIgnoreCase("charset")) continue; + if (charset != null) throw new IllegalArgumentException("Multiple charsets: " + string); + charset = parameter.group(2) != null + ? parameter.group(2) // Value is a token. + : parameter.group(3); // Value is a quoted string. + } + + return new MediaType(string, type, subtype, charset); + } + + /** + * Returns the high-level media type, such as "text", "image", "audio", + * "video", or "application". + */ + public String type() { + return type; + } + + /** + * Returns a specific media subtype, such as "plain" or "png", "mpeg", + * "mp4" or "xml". + */ + public String subtype() { + return subtype; + } + + /** + * Returns the charset of this media type, or null if this media type doesn't + * specify a charset. + */ + public Charset charset() { + return charset != null ? Charset.forName(charset) : null; + } + + /** + * Returns the charset of this media type, or {@code defaultValue} if this + * media type doesn't specify a charset. + */ + public Charset charset(Charset defaultValue) { + return charset != null ? Charset.forName(charset) : defaultValue; + } + + /** + * Returns the encoded media type, like "text/plain; charset=utf-8", + * appropriate for use in a Content-Type header. + */ + @Override public String toString() { + return mediaType; + } + + @Override public boolean equals(Object o) { + return o instanceof MediaType && ((MediaType) o).mediaType.equals(mediaType); + } + + @Override public int hashCode() { + return mediaType.hashCode(); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java new file mode 100644 index 0000000..a505419 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkAuthenticator.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Base64; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.Proxy; +import java.net.URL; +import java.util.List; + +/** + * Responds to authentication challenges from the remote web or proxy server by + * returning credentials. + */ +public interface OkAuthenticator { + /** + * Returns a credential that satisfies the authentication challenge made by + * {@code url}. Returns null if the challenge cannot be satisfied. This method + * is called in response to an HTTP 401 unauthorized status code sent by the + * origin server. + * + * @param challenges parsed "WWW-Authenticate" challenge headers from the HTTP + * response. + */ + Credential authenticate(Proxy proxy, URL url, List challenges) throws IOException; + + /** + * Returns a credential that satisfies the authentication challenge made by + * {@code proxy}. Returns null if the challenge cannot be satisfied. This + * method is called in response to an HTTP 401 unauthorized status code sent + * by the proxy server. + * + * @param challenges parsed "Proxy-Authenticate" challenge headers from the + * HTTP response. + */ + Credential authenticateProxy(Proxy proxy, URL url, List challenges) throws IOException; + + /** An RFC 2617 challenge. */ + public final class Challenge { + private final String scheme; + private final String realm; + + public Challenge(String scheme, String realm) { + this.scheme = scheme; + this.realm = realm; + } + + /** Returns the authentication scheme, like {@code Basic}. */ + public String getScheme() { + return scheme; + } + + /** Returns the protection space. */ + public String getRealm() { + return realm; + } + + @Override public boolean equals(Object o) { + return o instanceof Challenge + && ((Challenge) o).scheme.equals(scheme) + && ((Challenge) o).realm.equals(realm); + } + + @Override public int hashCode() { + return scheme.hashCode() + 31 * realm.hashCode(); + } + + @Override public String toString() { + return scheme + " realm=\"" + realm + "\""; + } + } + + /** An RFC 2617 credential. */ + public final class Credential { + private final String headerValue; + + private Credential(String headerValue) { + this.headerValue = headerValue; + } + + /** Returns an auth credential for the Basic scheme. */ + public static Credential basic(String userName, String password) { + try { + String usernameAndPassword = userName + ":" + password; + byte[] bytes = usernameAndPassword.getBytes("ISO-8859-1"); + String encoded = Base64.encode(bytes); + return new Credential("Basic " + encoded); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } + } + + public String getHeaderValue() { + return headerValue; + } + + @Override public boolean equals(Object o) { + return o instanceof Credential && ((Credential) o).headerValue.equals(headerValue); + } + + @Override public int hashCode() { + return headerValue.hashCode(); + } + + @Override public String toString() { + return headerValue; + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java new file mode 100644 index 0000000..f78592f --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkHttpClient.java @@ -0,0 +1,408 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Util; +import com.squareup.okhttp.internal.http.HttpAuthenticator; +import com.squareup.okhttp.internal.http.HttpURLConnectionImpl; +import com.squareup.okhttp.internal.http.HttpsURLConnectionImpl; +import com.squareup.okhttp.internal.http.OkResponseCacheAdapter; +import com.squareup.okhttp.internal.tls.OkHostnameVerifier; +import java.net.CookieHandler; +import java.net.HttpURLConnection; +import java.net.Proxy; +import java.net.ProxySelector; +import java.net.ResponseCache; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; +import java.net.URLStreamHandlerFactory; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; + +/** Configures and creates HTTP connections. */ +public final class OkHttpClient implements URLStreamHandlerFactory { + private static final List DEFAULT_TRANSPORTS + = Util.immutableList(Arrays.asList("spdy/3", "http/1.1")); + + private final RouteDatabase routeDatabase; + private final Dispatcher dispatcher; + private Proxy proxy; + private List transports; + private ProxySelector proxySelector; + private CookieHandler cookieHandler; + private ResponseCache responseCache; + private SSLSocketFactory sslSocketFactory; + private HostnameVerifier hostnameVerifier; + private OkAuthenticator authenticator; + private ConnectionPool connectionPool; + private boolean followProtocolRedirects = true; + private int connectTimeout; + private int readTimeout; + + public OkHttpClient() { + routeDatabase = new RouteDatabase(); + dispatcher = new Dispatcher(); + } + + private OkHttpClient(OkHttpClient copyFrom) { + routeDatabase = copyFrom.routeDatabase; + dispatcher = copyFrom.dispatcher; + } + + /** + * Sets the default connect timeout for new connections. A value of 0 means no timeout. + * + * @see URLConnection#setConnectTimeout(int) + */ + public void setConnectTimeout(long timeout, TimeUnit unit) { + if (timeout < 0) { + throw new IllegalArgumentException("timeout < 0"); + } + if (unit == null) { + throw new IllegalArgumentException("unit == null"); + } + long millis = unit.toMillis(timeout); + if (millis > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Timeout too large."); + } + connectTimeout = (int) millis; + } + + /** Default connect timeout (in milliseconds). */ + public int getConnectTimeout() { + return connectTimeout; + } + + /** + * Sets the default read timeout for new connections. A value of 0 means no timeout. + * + * @see URLConnection#setReadTimeout(int) + */ + public void setReadTimeout(long timeout, TimeUnit unit) { + if (timeout < 0) { + throw new IllegalArgumentException("timeout < 0"); + } + if (unit == null) { + throw new IllegalArgumentException("unit == null"); + } + long millis = unit.toMillis(timeout); + if (millis > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Timeout too large."); + } + readTimeout = (int) millis; + } + + /** Default read timeout (in milliseconds). */ + public int getReadTimeout() { + return readTimeout; + } + + /** + * Sets the HTTP proxy that will be used by connections created by this + * client. This takes precedence over {@link #setProxySelector}, which is + * only honored when this proxy is null (which it is by default). To disable + * proxy use completely, call {@code setProxy(Proxy.NO_PROXY)}. + */ + public OkHttpClient setProxy(Proxy proxy) { + this.proxy = proxy; + return this; + } + + public Proxy getProxy() { + return proxy; + } + + /** + * Sets the proxy selection policy to be used if no {@link #setProxy proxy} + * is specified explicitly. The proxy selector may return multiple proxies; + * in that case they will be tried in sequence until a successful connection + * is established. + * + *

If unset, the {@link ProxySelector#getDefault() system-wide default} + * proxy selector will be used. + */ + public OkHttpClient setProxySelector(ProxySelector proxySelector) { + this.proxySelector = proxySelector; + return this; + } + + public ProxySelector getProxySelector() { + return proxySelector; + } + + /** + * Sets the cookie handler to be used to read outgoing cookies and write + * incoming cookies. + * + *

If unset, the {@link CookieHandler#getDefault() system-wide default} + * cookie handler will be used. + */ + public OkHttpClient setCookieHandler(CookieHandler cookieHandler) { + this.cookieHandler = cookieHandler; + return this; + } + + public CookieHandler getCookieHandler() { + return cookieHandler; + } + + /** + * Sets the response cache to be used to read and write cached responses. + * + *

If unset, the {@link ResponseCache#getDefault() system-wide default} + * response cache will be used. + */ + public OkHttpClient setResponseCache(ResponseCache responseCache) { + this.responseCache = responseCache; + return this; + } + + public ResponseCache getResponseCache() { + return responseCache; + } + + public OkResponseCache getOkResponseCache() { + if (responseCache instanceof HttpResponseCache) { + return ((HttpResponseCache) responseCache).okResponseCache; + } else if (responseCache != null) { + return new OkResponseCacheAdapter(responseCache); + } else { + return null; + } + } + + /** + * Sets the socket factory used to secure HTTPS connections. + * + *

If unset, the {@link HttpsURLConnection#getDefaultSSLSocketFactory() + * system-wide default} SSL socket factory will be used. + */ + public OkHttpClient setSslSocketFactory(SSLSocketFactory sslSocketFactory) { + this.sslSocketFactory = sslSocketFactory; + return this; + } + + public SSLSocketFactory getSslSocketFactory() { + return sslSocketFactory; + } + + /** + * Sets the verifier used to confirm that response certificates apply to + * requested hostnames for HTTPS connections. + * + *

If unset, the {@link HttpsURLConnection#getDefaultHostnameVerifier() + * system-wide default} hostname verifier will be used. + */ + public OkHttpClient setHostnameVerifier(HostnameVerifier hostnameVerifier) { + this.hostnameVerifier = hostnameVerifier; + return this; + } + + public HostnameVerifier getHostnameVerifier() { + return hostnameVerifier; + } + + /** + * Sets the authenticator used to respond to challenges from the remote web + * server or proxy server. + * + *

If unset, the {@link java.net.Authenticator#setDefault system-wide default} + * authenticator will be used. + */ + public OkHttpClient setAuthenticator(OkAuthenticator authenticator) { + this.authenticator = authenticator; + return this; + } + + public OkAuthenticator getAuthenticator() { + return authenticator; + } + + /** + * Sets the connection pool used to recycle HTTP and HTTPS connections. + * + *

If unset, the {@link ConnectionPool#getDefault() system-wide + * default} connection pool will be used. + */ + public OkHttpClient setConnectionPool(ConnectionPool connectionPool) { + this.connectionPool = connectionPool; + return this; + } + + public ConnectionPool getConnectionPool() { + return connectionPool; + } + + /** + * Configure this client to follow redirects from HTTPS to HTTP and from HTTP + * to HTTPS. + * + *

If unset, protocol redirects will be followed. This is different than + * the built-in {@code HttpURLConnection}'s default. + */ + public OkHttpClient setFollowProtocolRedirects(boolean followProtocolRedirects) { + this.followProtocolRedirects = followProtocolRedirects; + return this; + } + + public boolean getFollowProtocolRedirects() { + return followProtocolRedirects; + } + + public RouteDatabase getRoutesDatabase() { + return routeDatabase; + } + + /** + * Configure the transports used by this client to communicate with remote + * servers. By default this client will prefer the most efficient transport + * available, falling back to more ubiquitous transports. Applications should + * only call this method to avoid specific compatibility problems, such as web + * servers that behave incorrectly when SPDY is enabled. + * + *

The following transports are currently supported: + *

+ * + *

This is an evolving set. Future releases may drop + * support for transitional transports (like spdy/3), in favor of their + * successors (spdy/4 or http/2.0). The http/1.1 transport will never be + * dropped. + * + *

If multiple protocols are specified, NPN will + * be used to negotiate a transport. Future releases may use another mechanism + * (such as ALPN) + * to negotiate a transport. + * + * @param transports the transports to use, in order of preference. The list + * must contain "http/1.1". It must not contain null. + */ + public OkHttpClient setTransports(List transports) { + transports = Util.immutableList(transports); + if (!transports.contains("http/1.1")) { + throw new IllegalArgumentException("transports doesn't contain http/1.1: " + transports); + } + if (transports.contains(null)) { + throw new IllegalArgumentException("transports must not contain null"); + } + if (transports.contains("")) { + throw new IllegalArgumentException("transports contains an empty string"); + } + this.transports = transports; + return this; + } + + public List getTransports() { + return transports; + } + + /** + * Schedules {@code request} to be executed. + */ + /* OkHttp 2.0: public */ void enqueue(Request request, Response.Receiver responseReceiver) { + // Create the HttpURLConnection immediately so the enqueued job gets the current settings of + // this client. Otherwise changes to this client (socket factory, redirect policy, etc.) may + // incorrectly be reflected in the request when it is dispatched later. + dispatcher.enqueue(copyWithDefaults(), request, responseReceiver); + } + + /** + * Cancels all scheduled tasks tagged with {@code tag}. Requests that are already + * in flight might not be canceled. + */ + /* OkHttp 2.0: public */ void cancel(Object tag) { + dispatcher.cancel(tag); + } + + public HttpURLConnection open(URL url) { + return open(url, proxy); + } + + HttpURLConnection open(URL url, Proxy proxy) { + String protocol = url.getProtocol(); + OkHttpClient copy = copyWithDefaults(); + copy.proxy = proxy; + + if (protocol.equals("http")) return new HttpURLConnectionImpl(url, copy); + if (protocol.equals("https")) return new HttpsURLConnectionImpl(url, copy); + throw new IllegalArgumentException("Unexpected protocol: " + protocol); + } + + /** + * Returns a shallow copy of this OkHttpClient that uses the system-wide default for + * each field that hasn't been explicitly configured. + */ + private OkHttpClient copyWithDefaults() { + OkHttpClient result = new OkHttpClient(this); + result.proxy = proxy; + result.proxySelector = proxySelector != null ? proxySelector : ProxySelector.getDefault(); + result.cookieHandler = cookieHandler != null ? cookieHandler : CookieHandler.getDefault(); + result.responseCache = responseCache != null ? responseCache : ResponseCache.getDefault(); + result.sslSocketFactory = sslSocketFactory != null + ? sslSocketFactory + : HttpsURLConnection.getDefaultSSLSocketFactory(); + result.hostnameVerifier = hostnameVerifier != null + ? hostnameVerifier + : OkHostnameVerifier.INSTANCE; + result.authenticator = authenticator != null + ? authenticator + : HttpAuthenticator.SYSTEM_DEFAULT; + result.connectionPool = connectionPool != null ? connectionPool : ConnectionPool.getDefault(); + result.followProtocolRedirects = followProtocolRedirects; + result.transports = transports != null ? transports : DEFAULT_TRANSPORTS; + result.connectTimeout = connectTimeout; + result.readTimeout = readTimeout; + return result; + } + + /** + * Creates a URLStreamHandler as a {@link URL#setURLStreamHandlerFactory}. + * + *

This code configures OkHttp to handle all HTTP and HTTPS connections + * created with {@link URL#openConnection()}:

   {@code
+   *
+   *   OkHttpClient okHttpClient = new OkHttpClient();
+   *   URL.setURLStreamHandlerFactory(okHttpClient);
+   * }
+ */ + public URLStreamHandler createURLStreamHandler(final String protocol) { + if (!protocol.equals("http") && !protocol.equals("https")) return null; + + return new URLStreamHandler() { + @Override protected URLConnection openConnection(URL url) { + return open(url); + } + + @Override protected URLConnection openConnection(URL url, Proxy proxy) { + return open(url, proxy); + } + + @Override protected int getDefaultPort() { + if (protocol.equals("http")) return 80; + if (protocol.equals("https")) return 443; + throw new AssertionError(); + } + }; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java new file mode 100644 index 0000000..ffe6f54 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/OkResponseCache.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import java.io.IOException; +import java.net.CacheRequest; +import java.net.CacheResponse; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URLConnection; +import java.util.List; +import java.util.Map; + +/** + * An extended response cache API. Unlike {@link java.net.ResponseCache}, this + * interface supports conditional caching and statistics. + * + *

Warning: Experimental OkHttp 2.0 API

+ * This class is in beta. APIs are subject to change! + */ +public interface OkResponseCache { + CacheResponse get(URI uri, String requestMethod, Map> requestHeaders) + throws IOException; + + CacheRequest put(URI uri, URLConnection urlConnection) throws IOException; + + /** Remove any cache entries for the supplied {@code uri} if the request method invalidates. */ + void maybeRemove(String requestMethod, URI uri) throws IOException; + + /** + * Handles a conditional request hit by updating the stored cache response + * with the headers from {@code httpConnection}. The cached response body is + * not updated. If the stored response has changed since {@code + * conditionalCacheHit} was returned, this does nothing. + */ + void update(CacheResponse conditionalCacheHit, HttpURLConnection connection) throws IOException; + + /** Track an conditional GET that was satisfied by this cache. */ + void trackConditionalCacheHit(); + + /** Track an HTTP response being satisfied by {@code source}. */ + void trackResponse(ResponseSource source); +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java new file mode 100644 index 0000000..f95303e --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Request.java @@ -0,0 +1,284 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Util; +import com.squareup.okhttp.internal.http.RawHeaders; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; +import java.util.Set; + +/** + * An HTTP request. Instances of this class are immutable if their {@link #body} + * is null or itself immutable. + * + *

Warning: Experimental OkHttp 2.0 API

+ * This class is in beta. APIs are subject to change! + */ +/* OkHttp 2.0: public */ final class Request { + private final URL url; + private final String method; + private final RawHeaders headers; + private final Body body; + private final Object tag; + + private Request(Builder builder) { + this.url = builder.url; + this.method = builder.method; + this.headers = new RawHeaders(builder.headers); + this.body = builder.body; + this.tag = builder.tag != null ? builder.tag : this; + } + + public URL url() { + return url; + } + + public String urlString() { + return url.toString(); + } + + public String method() { + return method; + } + + public String header(String name) { + return headers.get(name); + } + + public List headers(String name) { + return headers.values(name); + } + + public Set headerNames() { + return headers.names(); + } + + RawHeaders rawHeaders() { + return new RawHeaders(headers); + } + + public int headerCount() { + return headers.length(); + } + + public String headerName(int index) { + return headers.getFieldName(index); + } + + public String headerValue(int index) { + return headers.getValue(index); + } + + public Body body() { + return body; + } + + public Object tag() { + return tag; + } + + Builder newBuilder() { + return new Builder(url) + .method(method, body) + .rawHeaders(headers) + .tag(tag); + } + + public abstract static class Body { + /** Returns the Content-Type header for this body. */ + public abstract MediaType contentType(); + + /** + * Returns the number of bytes that will be written to {@code out} in a call + * to {@link #writeTo}, or -1 if that count is unknown. + */ + public long contentLength() { + return -1; + } + + /** Writes the content of this request to {@code out}. */ + public abstract void writeTo(OutputStream out) throws IOException; + + /** + * Returns a new request body that transmits {@code content}. If {@code + * contentType} lacks a charset, this will use UTF-8. + */ + public static Body create(MediaType contentType, String content) { + contentType = contentType.charset() != null + ? contentType + : MediaType.parse(contentType + "; charset=utf-8"); + try { + byte[] bytes = content.getBytes(contentType.charset().name()); + return create(contentType, bytes); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } + } + + /** Returns a new request body that transmits {@code content}. */ + public static Body create(final MediaType contentType, final byte[] content) { + if (contentType == null) throw new NullPointerException("contentType == null"); + if (content == null) throw new NullPointerException("content == null"); + + return new Body() { + @Override public MediaType contentType() { + return contentType; + } + + @Override public long contentLength() { + return content.length; + } + + @Override public void writeTo(OutputStream out) throws IOException { + out.write(content); + } + }; + } + + /** Returns a new request body that transmits the content of {@code file}. */ + public static Body create(final MediaType contentType, final File file) { + if (contentType == null) throw new NullPointerException("contentType == null"); + if (file == null) throw new NullPointerException("content == null"); + + return new Body() { + @Override public MediaType contentType() { + return contentType; + } + + @Override public long contentLength() { + return file.length(); + } + + @Override public void writeTo(OutputStream out) throws IOException { + long length = contentLength(); + if (length == 0) return; + + InputStream in = null; + try { + in = new FileInputStream(file); + byte[] buffer = new byte[(int) Math.min(8192, length)]; + for (int c; (c = in.read(buffer)) != -1; ) { + out.write(buffer, 0, c); + } + } finally { + Util.closeQuietly(in); + } + } + }; + } + } + + public static class Builder { + private URL url; + private String method = "GET"; + private RawHeaders headers = new RawHeaders(); + private Body body; + private Object tag; + + public Builder(String url) { + url(url); + } + + public Builder(URL url) { + url(url); + } + + public Builder url(String url) { + try { + this.url = new URL(url); + return this; + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Malformed URL: " + url); + } + } + + public Builder url(URL url) { + if (url == null) throw new IllegalStateException("url == null"); + this.url = url; + return this; + } + + /** + * Sets the header named {@code name} to {@code value}. If this request + * already has any headers with that name, they are all replaced. + */ + public Builder header(String name, String value) { + headers.set(name, value); + return this; + } + + /** + * Adds a header with {@code name} and {@code value}. Prefer this method for + * multiply-valued headers like "Cookie". + */ + public Builder addHeader(String name, String value) { + headers.add(name, value); + return this; + } + + Builder rawHeaders(RawHeaders rawHeaders) { + headers = new RawHeaders(rawHeaders); + return this; + } + + public Builder get() { + return method("GET", null); + } + + public Builder head() { + return method("HEAD", null); + } + + public Builder post(Body body) { + return method("POST", body); + } + + public Builder put(Body body) { + return method("PUT", body); + } + + public Builder method(String method, Body body) { + if (method == null || method.length() == 0) { + throw new IllegalArgumentException("method == null || method.length() == 0"); + } + this.method = method; + this.body = body; + return this; + } + + /** + * Attaches {@code tag} to the request. It can be used later to cancel the + * request. If the tag is unspecified or null, the request is canceled by + * using the request itself as the tag. + */ + public Builder tag(Object tag) { + this.tag = tag; + return this; + } + + public Request build() { + return new Request(this); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java new file mode 100644 index 0000000..1e67968 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Response.java @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.Util; +import com.squareup.okhttp.internal.http.RawHeaders; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Set; + +import static com.squareup.okhttp.internal.Util.UTF_8; + +/** + * An HTTP response. Instances of this class are not immutable: the response + * body is a one-shot value that may be consumed only once. All other properties + * are immutable. + * + *

Warning: Experimental OkHttp 2.0 API

+ * This class is in beta. APIs are subject to change! + */ +/* OkHttp 2.0: public */ final class Response { + private final Request request; + private final int code; + private final RawHeaders headers; + private final Body body; + private final Response redirectedBy; + + private Response(Builder builder) { + this.request = builder.request; + this.code = builder.code; + this.headers = new RawHeaders(builder.headers); + this.body = builder.body; + this.redirectedBy = builder.redirectedBy; + } + + /** + * The wire-level request that initiated this HTTP response. This is usually + * not the same request instance provided to the HTTP client: + *
    + *
  • It may be transformed by the HTTP client. For example, the client + * may have added its own {@code Content-Encoding} header to enable + * response compression. + *
  • It may be the request generated in response to an HTTP redirect. + * In this case the request URL may be different than the initial + * request URL. + *
+ */ + public Request request() { + return request; + } + + public int code() { + return code; + } + + public String header(String name) { + return header(name, null); + } + + public String header(String name, String defaultValue) { + String result = headers.get(name); + return result != null ? result : defaultValue; + } + + public List headers(String name) { + return headers.values(name); + } + + public Set headerNames() { + return headers.names(); + } + + public int headerCount() { + return headers.length(); + } + + public String headerName(int index) { + return headers.getFieldName(index); + } + + RawHeaders rawHeaders() { + return new RawHeaders(headers); + } + + public String headerValue(int index) { + return headers.getValue(index); + } + + public Body body() { + return body; + } + + /** + * Returns the response for the HTTP redirect that triggered this response, or + * null if this response wasn't triggered by an automatic redirect. The body + * of the returned response should not be read because it has already been + * consumed by the redirecting client. + */ + public Response redirectedBy() { + return redirectedBy; + } + + public abstract static class Body { + /** Multiple calls to {@link #charStream()} must return the same instance. */ + private Reader reader; + + /** + * Returns true if further data from this response body should be read at + * this time. For asynchronous transports like SPDY and HTTP/2.0, this will + * return false once all locally-available body bytes have been read. + * + *

Clients with many concurrent downloads can use this method to reduce + * the number of idle threads blocking on reads. See {@link + * Receiver#onResponse} for details. + */ + //

Body.ready() vs. InputStream.available()

+ // TODO: Can we fix response bodies to implement InputStream.available well? + // The deflater implementation is broken by default but we could do better. + public abstract boolean ready() throws IOException; + + public abstract MediaType contentType(); + + /** + * Returns the number of bytes in that will returned by {@link #bytes}, or + * {@link #byteStream}, or -1 if unknown. + */ + public abstract long contentLength(); + + public abstract InputStream byteStream() throws IOException; + + public final byte[] bytes() throws IOException { + long contentLength = contentLength(); + if (contentLength > Integer.MAX_VALUE) { + throw new IOException("Cannot buffer entire body for content length: " + contentLength); + } + + if (contentLength != -1) { + byte[] content = new byte[(int) contentLength]; + InputStream in = byteStream(); + Util.readFully(in, content); + if (in.read() != -1) throw new IOException("Content-Length and stream length disagree"); + return content; + + } else { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + Util.copy(byteStream(), out); + return out.toByteArray(); + } + } + + /** + * Returns the response as a character stream decoded with the charset + * of the Content-Type header. If that header is either absent or lacks a + * charset, this will attempt to decode the response body as UTF-8. + */ + public final Reader charStream() throws IOException { + if (reader == null) { + reader = new InputStreamReader(byteStream(), charset()); + } + return reader; + } + + /** + * Returns the response as a string decoded with the charset of the + * Content-Type header. If that header is either absent or lacks a charset, + * this will attempt to decode the response body as UTF-8. + */ + public final String string() throws IOException { + return new String(bytes(), charset().name()); + } + + private Charset charset() { + MediaType contentType = contentType(); + return contentType != null ? contentType.charset(UTF_8) : UTF_8; + } + } + + public interface Receiver { + /** + * Called when the request could not be executed due to a connectivity + * problem or timeout. Because networks can fail during an exchange, it is + * possible that the remote server accepted the request before the failure. + */ + void onFailure(Failure failure); + + /** + * Called when the HTTP response was successfully returned by the remote + * server. The receiver may proceed to read the response body with the + * response's {@link #body} method. + * + *

Note that transport-layer success (receiving a HTTP response code, + * headers and body) does not necessarily indicate application-layer + * success: {@code response} may still indicate an unhappy HTTP response + * code like 404 or 500. + * + *

Non-blocking responses

+ * + *

Receivers do not need to block while waiting for the response body to + * download. Instead, they can get called back as data arrives. Use {@link + * Body#ready} to check if bytes should be read immediately. While there is + * data ready, read it. If there isn't, return false: receivers will be + * called back with {@code onResponse()} as additional data is downloaded. + * + *

Return true to indicate that the receiver has finished handling the + * response body. If the response body has unread data, it will be + * discarded. + * + *

When the response body has been fully consumed the returned value is + * undefined. + * + *

The current implementation of {@link Body#ready} always returns true + * when the underlying transport is HTTP/1. This results in blocking on that + * transport. For effective non-blocking your server must support SPDY or + * HTTP/2. + */ + boolean onResponse(Response response) throws IOException; + } + + public static class Builder { + private final Request request; + private final int code; + private RawHeaders headers = new RawHeaders(); + private Body body; + private Response redirectedBy; + + public Builder(Request request, int code) { + if (request == null) throw new IllegalArgumentException("request == null"); + if (code <= 0) throw new IllegalArgumentException("code <= 0"); + this.request = request; + this.code = code; + } + + /** + * Sets the header named {@code name} to {@code value}. If this request + * already has any headers with that name, they are all replaced. + */ + public Builder header(String name, String value) { + headers.set(name, value); + return this; + } + + /** + * Adds a header with {@code name} and {@code value}. Prefer this method for + * multiply-valued headers like "Set-Cookie". + */ + public Builder addHeader(String name, String value) { + headers.add(name, value); + return this; + } + + Builder rawHeaders(RawHeaders rawHeaders) { + headers = new RawHeaders(rawHeaders); + return this; + } + + public Builder body(Body body) { + this.body = body; + return this; + } + + public Builder redirectedBy(Response redirectedBy) { + this.redirectedBy = redirectedBy; + return this; + } + + public Response build() { + if (request == null) throw new IllegalStateException("Response has no request."); + if (code == -1) throw new IllegalStateException("Response has no code."); + return new Response(this); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java new file mode 100644 index 0000000..4eca172 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/ResponseSource.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ +package com.squareup.okhttp; + +/** The source of an HTTP response. */ +public enum ResponseSource { + + /** The response was returned from the local cache. */ + CACHE, + + /** + * The response is available in the cache but must be validated with the + * network. The cache result will be used if it is still valid; otherwise + * the network's response will be used. + */ + CONDITIONAL_CACHE, + + /** The response was returned from the network. */ + NETWORK; + + public boolean requiresConnection() { + return this == CONDITIONAL_CACHE || this == NETWORK; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java new file mode 100644 index 0000000..4b8786d --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/Route.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import java.net.InetSocketAddress; +import java.net.Proxy; + +/** Represents the route used by a connection to reach an endpoint. */ +public class Route { + final Address address; + final Proxy proxy; + final InetSocketAddress inetSocketAddress; + final boolean modernTls; + + public Route(Address address, Proxy proxy, InetSocketAddress inetSocketAddress, + boolean modernTls) { + if (address == null) throw new NullPointerException("address == null"); + if (proxy == null) throw new NullPointerException("proxy == null"); + if (inetSocketAddress == null) throw new NullPointerException("inetSocketAddress == null"); + this.address = address; + this.proxy = proxy; + this.inetSocketAddress = inetSocketAddress; + this.modernTls = modernTls; + } + + /** Returns the {@link Address} of this route. */ + public Address getAddress() { + return address; + } + + /** + * Returns the {@link Proxy} of this route. + * + * Warning: This may be different than the proxy returned + * by {@link #getAddress}! That is the proxy that the user asked to be + * connected to; this returns the proxy that they were actually connected + * to. The two may disagree when a proxy selector selects a different proxy + * for a connection. + */ + public Proxy getProxy() { + return proxy; + } + + /** Returns the {@link InetSocketAddress} of this route. */ + public InetSocketAddress getSocketAddress() { + return inetSocketAddress; + } + + /** Returns true if this route uses modern TLS. */ + public boolean isModernTls() { + return modernTls; + } + + /** Returns a copy of this route with flipped TLS mode. */ + Route flipTlsMode() { + return new Route(address, proxy, inetSocketAddress, !modernTls); + } + + @Override public boolean equals(Object obj) { + if (obj instanceof Route) { + Route other = (Route) obj; + return (address.equals(other.address) + && proxy.equals(other.proxy) + && inetSocketAddress.equals(other.inetSocketAddress) + && modernTls == other.modernTls); + } + return false; + } + + @Override public int hashCode() { + int result = 17; + result = 31 * result + address.hashCode(); + result = 31 * result + proxy.hashCode(); + result = 31 * result + inetSocketAddress.hashCode(); + result = result + (modernTls ? (31 * result) : 0); + return result; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java new file mode 100644 index 0000000..9cbeaa7 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/RouteDatabase.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp; + +import java.io.IOException; +import java.util.LinkedHashSet; +import java.util.Set; +import javax.net.ssl.SSLHandshakeException; + +/** + * A blacklist of failed routes to avoid when creating a new connection to a + * target address. This is used so that OkHttp can learn from its mistakes: if + * there was a failure attempting to connect to a specific IP address, proxy + * server or TLS mode, that failure is remembered and alternate routes are + * preferred. + */ +public final class RouteDatabase { + private final Set failedRoutes = new LinkedHashSet(); + + /** Records a failure connecting to {@code failedRoute}. */ + public synchronized void failed(Route failedRoute, IOException failure) { + failedRoutes.add(failedRoute); + + if (!(failure instanceof SSLHandshakeException)) { + // If the problem was not related to SSL then it will also fail with + // a different TLS mode therefore we can be proactive about it. + failedRoutes.add(failedRoute.flipTlsMode()); + } + } + + /** Records success connecting to {@code failedRoute}. */ + public synchronized void connected(Route route) { + failedRoutes.remove(route); + } + + /** Returns true if {@code route} has failed recently and should be avoided. */ + public synchronized boolean shouldPostpone(Route route) { + return failedRoutes.contains(route); + } + + public synchronized int failedRoutesCount() { + return failedRoutes.size(); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java new file mode 100644 index 0000000..5260b87 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/TunnelRequest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ +package com.squareup.okhttp; + +import com.squareup.okhttp.internal.http.RawHeaders; + +import static com.squareup.okhttp.internal.Util.getDefaultPort; + +/** + * Routing and authentication information sent to an HTTP proxy to create a + * HTTPS to an origin server. Everything in the tunnel request is sent + * unencrypted to the proxy server. + * + *

See RFC 2817, Section + * 5.2. + */ +public final class TunnelRequest { + final String host; + final int port; + final String userAgent; + final String proxyAuthorization; + + /** + * @param host the origin server's hostname. Not null. + * @param port the origin server's port, like 80 or 443. + * @param userAgent the client's user-agent. Not null. + * @param proxyAuthorization proxy authorization, or null if the proxy is + * used without an authorization header. + */ + public TunnelRequest(String host, int port, String userAgent, String proxyAuthorization) { + if (host == null) throw new NullPointerException("host == null"); + if (userAgent == null) throw new NullPointerException("userAgent == null"); + this.host = host; + this.port = port; + this.userAgent = userAgent; + this.proxyAuthorization = proxyAuthorization; + } + + /** + * If we're creating a TLS tunnel, send only the minimum set of headers. + * This avoids sending potentially sensitive data like HTTP cookies to + * the proxy unencrypted. + */ + RawHeaders getRequestHeaders() { + RawHeaders result = new RawHeaders(); + result.setRequestLine("CONNECT " + host + ":" + port + " HTTP/1.1"); + + // Always set Host and User-Agent. + result.set("Host", port == getDefaultPort("https") ? host : (host + ":" + port)); + result.set("User-Agent", userAgent); + + // Copy over the Proxy-Authorization header if it exists. + if (proxyAuthorization != null) { + result.set("Proxy-Authorization", proxyAuthorization); + } + + // Always set the Proxy-Connection to Keep-Alive for the benefit of + // HTTP/1.0 proxies like Squid. + result.set("Proxy-Connection", "Keep-Alive"); + return result; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java new file mode 100644 index 0000000..78c9691 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/AbstractOutputStream.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * An output stream for an HTTP request body. + * + *

Since a single socket's output stream may be used to write multiple HTTP + * requests to the same server, subclasses should not close the socket stream. + */ +public abstract class AbstractOutputStream extends OutputStream { + protected boolean closed; + + @Override public final void write(int data) throws IOException { + write(new byte[] { (byte) data }); + } + + protected final void checkNotClosed() throws IOException { + if (closed) { + throw new IOException("stream closed"); + } + } + + /** Returns true if this stream was closed locally. */ + public boolean isClosed() { + return closed; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java new file mode 100644 index 0000000..79cd020 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Base64.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +/** + * @author Alexander Y. Kleymenov + */ + +package com.squareup.okhttp.internal; + +import java.io.UnsupportedEncodingException; + +import static com.squareup.okhttp.internal.Util.EMPTY_BYTE_ARRAY; + +/** + * Base64 encoder/decoder. + * In violation of the RFC, this encoder doesn't wrap lines at 76 columns. + */ +public final class Base64 { + private Base64() { + } + + public static byte[] decode(byte[] in) { + return decode(in, in.length); + } + + public static byte[] decode(byte[] in, int len) { + // approximate output length + int length = len / 4 * 3; + // return an empty array on empty or short input without padding + if (length == 0) { + return EMPTY_BYTE_ARRAY; + } + // temporary array + byte[] out = new byte[length]; + // number of padding characters ('=') + int pad = 0; + byte chr; + // compute the number of the padding characters + // and adjust the length of the input + for (; ; len--) { + chr = in[len - 1]; + // skip the neutral characters + if ((chr == '\n') || (chr == '\r') || (chr == ' ') || (chr == '\t')) { + continue; + } + if (chr == '=') { + pad++; + } else { + break; + } + } + // index in the output array + int outIndex = 0; + // index in the input array + int inIndex = 0; + // holds the value of the input character + int bits = 0; + // holds the value of the input quantum + int quantum = 0; + for (int i = 0; i < len; i++) { + chr = in[i]; + // skip the neutral characters + if ((chr == '\n') || (chr == '\r') || (chr == ' ') || (chr == '\t')) { + continue; + } + if ((chr >= 'A') && (chr <= 'Z')) { + // char ASCII value + // A 65 0 + // Z 90 25 (ASCII - 65) + bits = chr - 65; + } else if ((chr >= 'a') && (chr <= 'z')) { + // char ASCII value + // a 97 26 + // z 122 51 (ASCII - 71) + bits = chr - 71; + } else if ((chr >= '0') && (chr <= '9')) { + // char ASCII value + // 0 48 52 + // 9 57 61 (ASCII + 4) + bits = chr + 4; + } else if (chr == '+') { + bits = 62; + } else if (chr == '/') { + bits = 63; + } else { + return null; + } + // append the value to the quantum + quantum = (quantum << 6) | (byte) bits; + if (inIndex % 4 == 3) { + // 4 characters were read, so make the output: + out[outIndex++] = (byte) (quantum >> 16); + out[outIndex++] = (byte) (quantum >> 8); + out[outIndex++] = (byte) quantum; + } + inIndex++; + } + if (pad > 0) { + // adjust the quantum value according to the padding + quantum = quantum << (6 * pad); + // make output + out[outIndex++] = (byte) (quantum >> 16); + if (pad == 1) { + out[outIndex++] = (byte) (quantum >> 8); + } + } + // create the resulting array + byte[] result = new byte[outIndex]; + System.arraycopy(out, 0, result, 0, outIndex); + return result; + } + + private static final byte[] MAP = new byte[] { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', + 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', + 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', + '5', '6', '7', '8', '9', '+', '/' + }; + + public static String encode(byte[] in) { + int length = (in.length + 2) * 4 / 3; + byte[] out = new byte[length]; + int index = 0, end = in.length - in.length % 3; + for (int i = 0; i < end; i += 3) { + out[index++] = MAP[(in[i] & 0xff) >> 2]; + out[index++] = MAP[((in[i] & 0x03) << 4) | ((in[i + 1] & 0xff) >> 4)]; + out[index++] = MAP[((in[i + 1] & 0x0f) << 2) | ((in[i + 2] & 0xff) >> 6)]; + out[index++] = MAP[(in[i + 2] & 0x3f)]; + } + switch (in.length % 3) { + case 1: + out[index++] = MAP[(in[end] & 0xff) >> 2]; + out[index++] = MAP[(in[end] & 0x03) << 4]; + out[index++] = '='; + out[index++] = '='; + break; + case 2: + out[index++] = MAP[(in[end] & 0xff) >> 2]; + out[index++] = MAP[((in[end] & 0x03) << 4) | ((in[end + 1] & 0xff) >> 4)]; + out[index++] = MAP[((in[end + 1] & 0x0f) << 2)]; + out[index++] = '='; + break; + } + try { + return new String(out, 0, index, "US-ASCII"); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java new file mode 100644 index 0000000..f7fcb1e --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/DiskLruCache.java @@ -0,0 +1,926 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal; + +import java.io.BufferedWriter; +import java.io.Closeable; +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A cache that uses a bounded amount of space on a filesystem. Each cache + * entry has a string key and a fixed number of values. Each key must match + * the regex [a-z0-9_-]{1,64}. Values are byte sequences, + * accessible as streams or files. Each value must be between {@code 0} and + * {@code Integer.MAX_VALUE} bytes in length. + * + *

The cache stores its data in a directory on the filesystem. This + * directory must be exclusive to the cache; the cache may delete or overwrite + * files from its directory. It is an error for multiple processes to use the + * same cache directory at the same time. + * + *

This cache limits the number of bytes that it will store on the + * filesystem. When the number of stored bytes exceeds the limit, the cache will + * remove entries in the background until the limit is satisfied. The limit is + * not strict: the cache may temporarily exceed it while waiting for files to be + * deleted. The limit does not include filesystem overhead or the cache + * journal so space-sensitive applications should set a conservative limit. + * + *

Clients call {@link #edit} to create or update the values of an entry. An + * entry may have only one editor at one time; if a value is not available to be + * edited then {@link #edit} will return null. + *

    + *
  • When an entry is being created it is necessary to + * supply a full set of values; the empty value should be used as a + * placeholder if necessary. + *
  • When an entry is being edited, it is not necessary + * to supply data for every value; values default to their previous + * value. + *
+ * Every {@link #edit} call must be matched by a call to {@link Editor#commit} + * or {@link Editor#abort}. Committing is atomic: a read observes the full set + * of values as they were before or after the commit, but never a mix of values. + * + *

Clients call {@link #get} to read a snapshot of an entry. The read will + * observe the value at the time that {@link #get} was called. Updates and + * removals after the call do not impact ongoing reads. + * + *

This class is tolerant of some I/O errors. If files are missing from the + * filesystem, the corresponding entries will be dropped from the cache. If + * an error occurs while writing a cache value, the edit will fail silently. + * Callers should handle other problems by catching {@code IOException} and + * responding appropriately. + */ +public final class DiskLruCache implements Closeable { + static final String JOURNAL_FILE = "journal"; + static final String JOURNAL_FILE_TEMP = "journal.tmp"; + static final String JOURNAL_FILE_BACKUP = "journal.bkp"; + static final String MAGIC = "libcore.io.DiskLruCache"; + static final String VERSION_1 = "1"; + static final long ANY_SEQUENCE_NUMBER = -1; + static final Pattern LEGAL_KEY_PATTERN = Pattern.compile("[a-z0-9_-]{1,64}"); + private static final String CLEAN = "CLEAN"; + private static final String DIRTY = "DIRTY"; + private static final String REMOVE = "REMOVE"; + private static final String READ = "READ"; + + /* + * This cache uses a journal file named "journal". A typical journal file + * looks like this: + * libcore.io.DiskLruCache + * 1 + * 100 + * 2 + * + * CLEAN 3400330d1dfc7f3f7f4b8d4d803dfcf6 832 21054 + * DIRTY 335c4c6028171cfddfbaae1a9c313c52 + * CLEAN 335c4c6028171cfddfbaae1a9c313c52 3934 2342 + * REMOVE 335c4c6028171cfddfbaae1a9c313c52 + * DIRTY 1ab96a171faeeee38496d8b330771a7a + * CLEAN 1ab96a171faeeee38496d8b330771a7a 1600 234 + * READ 335c4c6028171cfddfbaae1a9c313c52 + * READ 3400330d1dfc7f3f7f4b8d4d803dfcf6 + * + * The first five lines of the journal form its header. They are the + * constant string "libcore.io.DiskLruCache", the disk cache's version, + * the application's version, the value count, and a blank line. + * + * Each of the subsequent lines in the file is a record of the state of a + * cache entry. Each line contains space-separated values: a state, a key, + * and optional state-specific values. + * o DIRTY lines track that an entry is actively being created or updated. + * Every successful DIRTY action should be followed by a CLEAN or REMOVE + * action. DIRTY lines without a matching CLEAN or REMOVE indicate that + * temporary files may need to be deleted. + * o CLEAN lines track a cache entry that has been successfully published + * and may be read. A publish line is followed by the lengths of each of + * its values. + * o READ lines track accesses for LRU. + * o REMOVE lines track entries that have been deleted. + * + * The journal file is appended to as cache operations occur. The journal may + * occasionally be compacted by dropping redundant lines. A temporary file named + * "journal.tmp" will be used during compaction; that file should be deleted if + * it exists when the cache is opened. + */ + + private final File directory; + private final File journalFile; + private final File journalFileTmp; + private final File journalFileBackup; + private final int appVersion; + private long maxSize; + private final int valueCount; + private long size = 0; + private Writer journalWriter; + private final LinkedHashMap lruEntries = + new LinkedHashMap(0, 0.75f, true); + private int redundantOpCount; + + /** + * To differentiate between old and current snapshots, each entry is given + * a sequence number each time an edit is committed. A snapshot is stale if + * its sequence number is not equal to its entry's sequence number. + */ + private long nextSequenceNumber = 0; + + /** This cache uses a single background thread to evict entries. */ + final ThreadPoolExecutor executorService = + new ThreadPoolExecutor(0, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); + private final Callable cleanupCallable = new Callable() { + public Void call() throws Exception { + synchronized (DiskLruCache.this) { + if (journalWriter == null) { + return null; // Closed. + } + trimToSize(); + if (journalRebuildRequired()) { + rebuildJournal(); + redundantOpCount = 0; + } + } + return null; + } + }; + + private DiskLruCache(File directory, int appVersion, int valueCount, long maxSize) { + this.directory = directory; + this.appVersion = appVersion; + this.journalFile = new File(directory, JOURNAL_FILE); + this.journalFileTmp = new File(directory, JOURNAL_FILE_TEMP); + this.journalFileBackup = new File(directory, JOURNAL_FILE_BACKUP); + this.valueCount = valueCount; + this.maxSize = maxSize; + } + + /** + * Opens the cache in {@code directory}, creating a cache if none exists + * there. + * + * @param directory a writable directory + * @param valueCount the number of values per cache entry. Must be positive. + * @param maxSize the maximum number of bytes this cache should use to store + * @throws IOException if reading or writing the cache directory fails + */ + public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize) + throws IOException { + if (maxSize <= 0) { + throw new IllegalArgumentException("maxSize <= 0"); + } + if (valueCount <= 0) { + throw new IllegalArgumentException("valueCount <= 0"); + } + + // If a bkp file exists, use it instead. + File backupFile = new File(directory, JOURNAL_FILE_BACKUP); + if (backupFile.exists()) { + File journalFile = new File(directory, JOURNAL_FILE); + // If journal file also exists just delete backup file. + if (journalFile.exists()) { + backupFile.delete(); + } else { + renameTo(backupFile, journalFile, false); + } + } + + // Prefer to pick up where we left off. + DiskLruCache cache = new DiskLruCache(directory, appVersion, valueCount, maxSize); + if (cache.journalFile.exists()) { + try { + cache.readJournal(); + cache.processJournal(); + cache.journalWriter = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(cache.journalFile, true), Util.US_ASCII)); + return cache; + } catch (IOException journalIsCorrupt) { + Platform.get().logW("DiskLruCache " + directory + " is corrupt: " + + journalIsCorrupt.getMessage() + ", removing"); + cache.delete(); + } + } + + // Create a new empty cache. + directory.mkdirs(); + cache = new DiskLruCache(directory, appVersion, valueCount, maxSize); + cache.rebuildJournal(); + return cache; + } + + private void readJournal() throws IOException { + StrictLineReader reader = new StrictLineReader(new FileInputStream(journalFile), Util.US_ASCII); + try { + String magic = reader.readLine(); + String version = reader.readLine(); + String appVersionString = reader.readLine(); + String valueCountString = reader.readLine(); + String blank = reader.readLine(); + if (!MAGIC.equals(magic) + || !VERSION_1.equals(version) + || !Integer.toString(appVersion).equals(appVersionString) + || !Integer.toString(valueCount).equals(valueCountString) + || !"".equals(blank)) { + throw new IOException("unexpected journal header: [" + magic + ", " + version + ", " + + valueCountString + ", " + blank + "]"); + } + + int lineCount = 0; + while (true) { + try { + readJournalLine(reader.readLine()); + lineCount++; + } catch (EOFException endOfJournal) { + break; + } + } + redundantOpCount = lineCount - lruEntries.size(); + } finally { + Util.closeQuietly(reader); + } + } + + private void readJournalLine(String line) throws IOException { + int firstSpace = line.indexOf(' '); + if (firstSpace == -1) { + throw new IOException("unexpected journal line: " + line); + } + + int keyBegin = firstSpace + 1; + int secondSpace = line.indexOf(' ', keyBegin); + final String key; + if (secondSpace == -1) { + key = line.substring(keyBegin); + if (firstSpace == REMOVE.length() && line.startsWith(REMOVE)) { + lruEntries.remove(key); + return; + } + } else { + key = line.substring(keyBegin, secondSpace); + } + + Entry entry = lruEntries.get(key); + if (entry == null) { + entry = new Entry(key); + lruEntries.put(key, entry); + } + + if (secondSpace != -1 && firstSpace == CLEAN.length() && line.startsWith(CLEAN)) { + String[] parts = line.substring(secondSpace + 1).split(" "); + entry.readable = true; + entry.currentEditor = null; + entry.setLengths(parts); + } else if (secondSpace == -1 && firstSpace == DIRTY.length() && line.startsWith(DIRTY)) { + entry.currentEditor = new Editor(entry); + } else if (secondSpace == -1 && firstSpace == READ.length() && line.startsWith(READ)) { + // This work was already done by calling lruEntries.get(). + } else { + throw new IOException("unexpected journal line: " + line); + } + } + + /** + * Computes the initial size and collects garbage as a part of opening the + * cache. Dirty entries are assumed to be inconsistent and will be deleted. + */ + private void processJournal() throws IOException { + deleteIfExists(journalFileTmp); + for (Iterator i = lruEntries.values().iterator(); i.hasNext(); ) { + Entry entry = i.next(); + if (entry.currentEditor == null) { + for (int t = 0; t < valueCount; t++) { + size += entry.lengths[t]; + } + } else { + entry.currentEditor = null; + for (int t = 0; t < valueCount; t++) { + deleteIfExists(entry.getCleanFile(t)); + deleteIfExists(entry.getDirtyFile(t)); + } + i.remove(); + } + } + } + + /** + * Creates a new journal that omits redundant information. This replaces the + * current journal if it exists. + */ + private synchronized void rebuildJournal() throws IOException { + if (journalWriter != null) { + journalWriter.close(); + } + + Writer writer = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(journalFileTmp), Util.US_ASCII)); + try { + writer.write(MAGIC); + writer.write("\n"); + writer.write(VERSION_1); + writer.write("\n"); + writer.write(Integer.toString(appVersion)); + writer.write("\n"); + writer.write(Integer.toString(valueCount)); + writer.write("\n"); + writer.write("\n"); + + for (Entry entry : lruEntries.values()) { + if (entry.currentEditor != null) { + writer.write(DIRTY + ' ' + entry.key + '\n'); + } else { + writer.write(CLEAN + ' ' + entry.key + entry.getLengths() + '\n'); + } + } + } finally { + writer.close(); + } + + if (journalFile.exists()) { + renameTo(journalFile, journalFileBackup, true); + } + renameTo(journalFileTmp, journalFile, false); + journalFileBackup.delete(); + + journalWriter = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(journalFile, true), Util.US_ASCII)); + } + + private static void deleteIfExists(File file) throws IOException { + if (file.exists() && !file.delete()) { + throw new IOException(); + } + } + + private static void renameTo(File from, File to, boolean deleteDestination) throws IOException { + if (deleteDestination) { + deleteIfExists(to); + } + if (!from.renameTo(to)) { + throw new IOException(); + } + } + + /** + * Returns a snapshot of the entry named {@code key}, or null if it doesn't + * exist is not currently readable. If a value is returned, it is moved to + * the head of the LRU queue. + */ + public synchronized Snapshot get(String key) throws IOException { + checkNotClosed(); + validateKey(key); + Entry entry = lruEntries.get(key); + if (entry == null) { + return null; + } + + if (!entry.readable) { + return null; + } + + // Open all streams eagerly to guarantee that we see a single published + // snapshot. If we opened streams lazily then the streams could come + // from different edits. + InputStream[] ins = new InputStream[valueCount]; + try { + for (int i = 0; i < valueCount; i++) { + ins[i] = new FileInputStream(entry.getCleanFile(i)); + } + } catch (FileNotFoundException e) { + // A file must have been deleted manually! + for (int i = 0; i < valueCount; i++) { + if (ins[i] != null) { + Util.closeQuietly(ins[i]); + } else { + break; + } + } + return null; + } + + redundantOpCount++; + journalWriter.append(READ + ' ' + key + '\n'); + if (journalRebuildRequired()) { + executorService.submit(cleanupCallable); + } + + return new Snapshot(key, entry.sequenceNumber, ins, entry.lengths); + } + + /** + * Returns an editor for the entry named {@code key}, or null if another + * edit is in progress. + */ + public Editor edit(String key) throws IOException { + return edit(key, ANY_SEQUENCE_NUMBER); + } + + private synchronized Editor edit(String key, long expectedSequenceNumber) throws IOException { + checkNotClosed(); + validateKey(key); + Entry entry = lruEntries.get(key); + if (expectedSequenceNumber != ANY_SEQUENCE_NUMBER && (entry == null + || entry.sequenceNumber != expectedSequenceNumber)) { + return null; // Snapshot is stale. + } + if (entry == null) { + entry = new Entry(key); + lruEntries.put(key, entry); + } else if (entry.currentEditor != null) { + return null; // Another edit is in progress. + } + + Editor editor = new Editor(entry); + entry.currentEditor = editor; + + // Flush the journal before creating files to prevent file leaks. + journalWriter.write(DIRTY + ' ' + key + '\n'); + journalWriter.flush(); + return editor; + } + + /** Returns the directory where this cache stores its data. */ + public File getDirectory() { + return directory; + } + + /** + * Returns the maximum number of bytes that this cache should use to store + * its data. + */ + public long getMaxSize() { + return maxSize; + } + + /** + * Changes the maximum number of bytes the cache can store and queues a job + * to trim the existing store, if necessary. + */ + public synchronized void setMaxSize(long maxSize) { + this.maxSize = maxSize; + executorService.submit(cleanupCallable); + } + + /** + * Returns the number of bytes currently being used to store the values in + * this cache. This may be greater than the max size if a background + * deletion is pending. + */ + public synchronized long size() { + return size; + } + + private synchronized void completeEdit(Editor editor, boolean success) throws IOException { + Entry entry = editor.entry; + if (entry.currentEditor != editor) { + throw new IllegalStateException(); + } + + // If this edit is creating the entry for the first time, every index must have a value. + if (success && !entry.readable) { + for (int i = 0; i < valueCount; i++) { + if (!editor.written[i]) { + editor.abort(); + throw new IllegalStateException("Newly created entry didn't create value for index " + i); + } + if (!entry.getDirtyFile(i).exists()) { + editor.abort(); + return; + } + } + } + + for (int i = 0; i < valueCount; i++) { + File dirty = entry.getDirtyFile(i); + if (success) { + if (dirty.exists()) { + File clean = entry.getCleanFile(i); + dirty.renameTo(clean); + long oldLength = entry.lengths[i]; + long newLength = clean.length(); + entry.lengths[i] = newLength; + size = size - oldLength + newLength; + } + } else { + deleteIfExists(dirty); + } + } + + redundantOpCount++; + entry.currentEditor = null; + if (entry.readable | success) { + entry.readable = true; + journalWriter.write(CLEAN + ' ' + entry.key + entry.getLengths() + '\n'); + if (success) { + entry.sequenceNumber = nextSequenceNumber++; + } + } else { + lruEntries.remove(entry.key); + journalWriter.write(REMOVE + ' ' + entry.key + '\n'); + } + journalWriter.flush(); + + if (size > maxSize || journalRebuildRequired()) { + executorService.submit(cleanupCallable); + } + } + + /** + * We only rebuild the journal when it will halve the size of the journal + * and eliminate at least 2000 ops. + */ + private boolean journalRebuildRequired() { + final int redundantOpCompactThreshold = 2000; + return redundantOpCount >= redundantOpCompactThreshold // + && redundantOpCount >= lruEntries.size(); + } + + /** + * Drops the entry for {@code key} if it exists and can be removed. Entries + * actively being edited cannot be removed. + * + * @return true if an entry was removed. + */ + public synchronized boolean remove(String key) throws IOException { + checkNotClosed(); + validateKey(key); + Entry entry = lruEntries.get(key); + if (entry == null || entry.currentEditor != null) { + return false; + } + + for (int i = 0; i < valueCount; i++) { + File file = entry.getCleanFile(i); + if (!file.delete()) { + throw new IOException("failed to delete " + file); + } + size -= entry.lengths[i]; + entry.lengths[i] = 0; + } + + redundantOpCount++; + journalWriter.append(REMOVE + ' ' + key + '\n'); + lruEntries.remove(key); + + if (journalRebuildRequired()) { + executorService.submit(cleanupCallable); + } + + return true; + } + + /** Returns true if this cache has been closed. */ + public boolean isClosed() { + return journalWriter == null; + } + + private void checkNotClosed() { + if (journalWriter == null) { + throw new IllegalStateException("cache is closed"); + } + } + + /** Force buffered operations to the filesystem. */ + public synchronized void flush() throws IOException { + checkNotClosed(); + trimToSize(); + journalWriter.flush(); + } + + /** Closes this cache. Stored values will remain on the filesystem. */ + public synchronized void close() throws IOException { + if (journalWriter == null) { + return; // Already closed. + } + for (Entry entry : new ArrayList(lruEntries.values())) { + if (entry.currentEditor != null) { + entry.currentEditor.abort(); + } + } + trimToSize(); + journalWriter.close(); + journalWriter = null; + } + + private void trimToSize() throws IOException { + while (size > maxSize) { + Map.Entry toEvict = lruEntries.entrySet().iterator().next(); + remove(toEvict.getKey()); + } + } + + /** + * Closes the cache and deletes all of its stored values. This will delete + * all files in the cache directory including files that weren't created by + * the cache. + */ + public void delete() throws IOException { + close(); + Util.deleteContents(directory); + } + + private void validateKey(String key) { + Matcher matcher = LEGAL_KEY_PATTERN.matcher(key); + if (!matcher.matches()) { + throw new IllegalArgumentException("keys must match regex [a-z0-9_-]{1,64}: \"" + key + "\""); + } + } + + private static String inputStreamToString(InputStream in) throws IOException { + return Util.readFully(new InputStreamReader(in, Util.UTF_8)); + } + + /** A snapshot of the values for an entry. */ + public final class Snapshot implements Closeable { + private final String key; + private final long sequenceNumber; + private final InputStream[] ins; + private final long[] lengths; + + private Snapshot(String key, long sequenceNumber, InputStream[] ins, long[] lengths) { + this.key = key; + this.sequenceNumber = sequenceNumber; + this.ins = ins; + this.lengths = lengths; + } + + /** + * Returns an editor for this snapshot's entry, or null if either the + * entry has changed since this snapshot was created or if another edit + * is in progress. + */ + public Editor edit() throws IOException { + return DiskLruCache.this.edit(key, sequenceNumber); + } + + /** Returns the unbuffered stream with the value for {@code index}. */ + public InputStream getInputStream(int index) { + return ins[index]; + } + + /** Returns the string value for {@code index}. */ + public String getString(int index) throws IOException { + return inputStreamToString(getInputStream(index)); + } + + /** Returns the byte length of the value for {@code index}. */ + public long getLength(int index) { + return lengths[index]; + } + + public void close() { + for (InputStream in : ins) { + Util.closeQuietly(in); + } + } + } + + private static final OutputStream NULL_OUTPUT_STREAM = new OutputStream() { + @Override + public void write(int b) throws IOException { + // Eat all writes silently. Nom nom. + } + }; + + /** Edits the values for an entry. */ + public final class Editor { + private final Entry entry; + private final boolean[] written; + private boolean hasErrors; + private boolean committed; + + private Editor(Entry entry) { + this.entry = entry; + this.written = (entry.readable) ? null : new boolean[valueCount]; + } + + /** + * Returns an unbuffered input stream to read the last committed value, + * or null if no value has been committed. + */ + public InputStream newInputStream(int index) throws IOException { + synchronized (DiskLruCache.this) { + if (entry.currentEditor != this) { + throw new IllegalStateException(); + } + if (!entry.readable) { + return null; + } + try { + return new FileInputStream(entry.getCleanFile(index)); + } catch (FileNotFoundException e) { + return null; + } + } + } + + /** + * Returns the last committed value as a string, or null if no value + * has been committed. + */ + public String getString(int index) throws IOException { + InputStream in = newInputStream(index); + return in != null ? inputStreamToString(in) : null; + } + + /** + * Returns a new unbuffered output stream to write the value at + * {@code index}. If the underlying output stream encounters errors + * when writing to the filesystem, this edit will be aborted when + * {@link #commit} is called. The returned output stream does not throw + * IOExceptions. + */ + public OutputStream newOutputStream(int index) throws IOException { + synchronized (DiskLruCache.this) { + if (entry.currentEditor != this) { + throw new IllegalStateException(); + } + if (!entry.readable) { + written[index] = true; + } + File dirtyFile = entry.getDirtyFile(index); + FileOutputStream outputStream; + try { + outputStream = new FileOutputStream(dirtyFile); + } catch (FileNotFoundException e) { + // Attempt to recreate the cache directory. + directory.mkdirs(); + try { + outputStream = new FileOutputStream(dirtyFile); + } catch (FileNotFoundException e2) { + // We are unable to recover. Silently eat the writes. + return NULL_OUTPUT_STREAM; + } + } + return new FaultHidingOutputStream(outputStream); + } + } + + /** Sets the value at {@code index} to {@code value}. */ + public void set(int index, String value) throws IOException { + Writer writer = null; + try { + writer = new OutputStreamWriter(newOutputStream(index), Util.UTF_8); + writer.write(value); + } finally { + Util.closeQuietly(writer); + } + } + + /** + * Commits this edit so it is visible to readers. This releases the + * edit lock so another edit may be started on the same key. + */ + public void commit() throws IOException { + if (hasErrors) { + completeEdit(this, false); + remove(entry.key); // The previous entry is stale. + } else { + completeEdit(this, true); + } + committed = true; + } + + /** + * Aborts this edit. This releases the edit lock so another edit may be + * started on the same key. + */ + public void abort() throws IOException { + completeEdit(this, false); + } + + public void abortUnlessCommitted() { + if (!committed) { + try { + abort(); + } catch (IOException ignored) { + } + } + } + + private class FaultHidingOutputStream extends FilterOutputStream { + private FaultHidingOutputStream(OutputStream out) { + super(out); + } + + @Override public void write(int oneByte) { + try { + out.write(oneByte); + } catch (IOException e) { + hasErrors = true; + } + } + + @Override public void write(byte[] buffer, int offset, int length) { + try { + out.write(buffer, offset, length); + } catch (IOException e) { + hasErrors = true; + } + } + + @Override public void close() { + try { + out.close(); + } catch (IOException e) { + hasErrors = true; + } + } + + @Override public void flush() { + try { + out.flush(); + } catch (IOException e) { + hasErrors = true; + } + } + } + } + + private final class Entry { + private final String key; + + /** Lengths of this entry's files. */ + private final long[] lengths; + + /** True if this entry has ever been published. */ + private boolean readable; + + /** The ongoing edit or null if this entry is not being edited. */ + private Editor currentEditor; + + /** The sequence number of the most recently committed edit to this entry. */ + private long sequenceNumber; + + private Entry(String key) { + this.key = key; + this.lengths = new long[valueCount]; + } + + public String getLengths() throws IOException { + StringBuilder result = new StringBuilder(); + for (long size : lengths) { + result.append(' ').append(size); + } + return result.toString(); + } + + /** Set lengths using decimal numbers like "10123". */ + private void setLengths(String[] strings) throws IOException { + if (strings.length != valueCount) { + throw invalidLengths(strings); + } + + try { + for (int i = 0; i < strings.length; i++) { + lengths[i] = Long.parseLong(strings[i]); + } + } catch (NumberFormatException e) { + throw invalidLengths(strings); + } + } + + private IOException invalidLengths(String[] strings) throws IOException { + throw new IOException("unexpected journal line: " + java.util.Arrays.toString(strings)); + } + + public File getCleanFile(int i) { + return new File(directory, key + "." + i); + } + + public File getDirtyFile(int i) { + return new File(directory, key + "." + i + ".tmp"); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java new file mode 100644 index 0000000..69b2d37 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Dns.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * Domain name service. Prefer this over {@link InetAddress#getAllByName} to + * make code more testable. + */ +public interface Dns { + Dns DEFAULT = new Dns() { + @Override public InetAddress[] getAllByName(String host) throws UnknownHostException { + return InetAddress.getAllByName(host); + } + }; + + InetAddress[] getAllByName(String host) throws UnknownHostException; +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java new file mode 100644 index 0000000..c32b27a --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/FaultRecoveringOutputStream.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; + +/** + * An output stream wrapper that recovers from failures in the underlying stream + * by replacing it with another stream. This class buffers a fixed amount of + * data under the assumption that failures occur early in a stream's life. + * If a failure occurs after the buffer has been exhausted, no recovery is + * attempted. + * + *

Subclasses must override {@link #replacementStream} which will request a + * replacement stream each time an {@link IOException} is encountered on the + * current stream. + */ +public abstract class FaultRecoveringOutputStream extends AbstractOutputStream { + private final int maxReplayBufferLength; + + /** Bytes to transmit on the replacement stream, or null if no recovery is possible. */ + private ByteArrayOutputStream replayBuffer; + private OutputStream out; + + /** + * @param maxReplayBufferLength the maximum number of successfully written + * bytes to buffer so they can be replayed in the event of an error. + * Failure recoveries are not possible once this limit has been exceeded. + */ + public FaultRecoveringOutputStream(int maxReplayBufferLength, OutputStream out) { + if (maxReplayBufferLength < 0) throw new IllegalArgumentException(); + this.maxReplayBufferLength = maxReplayBufferLength; + this.replayBuffer = new ByteArrayOutputStream(maxReplayBufferLength); + this.out = out; + } + + @Override public final void write(byte[] buffer, int offset, int count) throws IOException { + if (closed) throw new IOException("stream closed"); + checkOffsetAndCount(buffer.length, offset, count); + + while (true) { + try { + out.write(buffer, offset, count); + + if (replayBuffer != null) { + if (count + replayBuffer.size() > maxReplayBufferLength) { + // Failure recovery is no longer possible once we overflow the replay buffer. + replayBuffer = null; + } else { + // Remember the written bytes to the replay buffer. + replayBuffer.write(buffer, offset, count); + } + } + return; + } catch (IOException e) { + if (!recover(e)) throw e; + } + } + } + + @Override public final void flush() throws IOException { + if (closed) { + return; // don't throw; this stream might have been closed on the caller's behalf + } + while (true) { + try { + out.flush(); + return; + } catch (IOException e) { + if (!recover(e)) throw e; + } + } + } + + @Override public final void close() throws IOException { + if (closed) { + return; + } + while (true) { + try { + out.close(); + closed = true; + return; + } catch (IOException e) { + if (!recover(e)) throw e; + } + } + } + + /** + * Attempt to replace {@code out} with another equivalent stream. Returns true + * if a suitable replacement stream was found. + */ + private boolean recover(IOException e) { + if (replayBuffer == null) { + return false; // Can't recover because we've dropped data that we would need to replay. + } + + while (true) { + OutputStream replacementStream = null; + try { + replacementStream = replacementStream(e); + if (replacementStream == null) { + return false; + } + replaceStream(replacementStream); + return true; + } catch (IOException replacementStreamFailure) { + // The replacement was also broken. Loop to ask for another replacement. + Util.closeQuietly(replacementStream); + e = replacementStreamFailure; + } + } + } + + /** + * Returns true if errors in the underlying stream can currently be recovered. + */ + public boolean isRecoverable() { + return replayBuffer != null; + } + + /** + * Replaces the current output stream with {@code replacementStream}, writing + * any replay bytes to it if they exist. The current output stream is closed. + */ + public final void replaceStream(OutputStream replacementStream) throws IOException { + if (!isRecoverable()) { + throw new IllegalStateException(); + } + if (this.out == replacementStream) { + return; // Don't replace a stream with itself. + } + replayBuffer.writeTo(replacementStream); + Util.closeQuietly(out); + out = replacementStream; + } + + /** + * Returns a replacement output stream to recover from {@code e} thrown by the + * previous stream. Returns a new OutputStream if recovery was successful, in + * which case all previously-written data will be replayed. Returns null if + * the failure cannot be recovered. + */ + protected abstract OutputStream replacementStream(IOException e) throws IOException; +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java new file mode 100644 index 0000000..992b2ae --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/NamedRunnable.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ + +package com.squareup.okhttp.internal; + +/** + * Runnable implementation which always sets its thread name. + */ +public abstract class NamedRunnable implements Runnable { + private final String name; + + public NamedRunnable(String format, Object... args) { + this.name = String.format(format, args); + } + + @Override public final void run() { + String oldName = Thread.currentThread().getName(); + Thread.currentThread().setName(name); + try { + execute(); + } finally { + Thread.currentThread().setName(oldName); + } + } + + protected abstract void execute(); +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java new file mode 100644 index 0000000..d5884b1 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Platform.java @@ -0,0 +1,370 @@ +/* + * Copyright (C) 2012 Square, Inc. + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ +package com.squareup.okhttp.internal; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.zip.Deflater; +import java.util.zip.DeflaterOutputStream; +import javax.net.ssl.SSLSocket; + +/** + * Access to Platform-specific features necessary for SPDY and advanced TLS. + * + *

SPDY

+ * SPDY requires a TLS extension called NPN (Next Protocol Negotiation) that's + * available in Android 4.1+ and OpenJDK 7+ (with the npn-boot extension). It + * also requires a recent version of {@code DeflaterOutputStream} that is + * public API in Java 7 and callable via reflection in Android 4.1+. + */ +public class Platform { + private static final Platform PLATFORM = findPlatform(); + + private Constructor deflaterConstructor; + + public static Platform get() { + return PLATFORM; + } + + /** Prefix used on custom headers. */ + public String getPrefix() { + return "OkHttp"; + } + + public void logW(String warning) { + System.out.println(warning); + } + + public void tagSocket(Socket socket) throws SocketException { + } + + public void untagSocket(Socket socket) throws SocketException { + } + + public URI toUriLenient(URL url) throws URISyntaxException { + return url.toURI(); // this isn't as good as the built-in toUriLenient + } + + /** + * Attempt a TLS connection with useful extensions enabled. This mode + * supports more features, but is less likely to be compatible with older + * HTTPS servers. + */ + public void enableTlsExtensions(SSLSocket socket, String uriHost) { + } + + /** + * Attempt a secure connection with basic functionality to maximize + * compatibility. Currently this uses SSL 3.0. + */ + public void supportTlsIntolerantServer(SSLSocket socket) { + socket.setEnabledProtocols(new String[] {"SSLv3"}); + } + + /** Returns the negotiated protocol, or null if no protocol was negotiated. */ + public byte[] getNpnSelectedProtocol(SSLSocket socket) { + return null; + } + + /** + * Sets client-supported protocols on a socket to send to a server. The + * protocols are only sent if the socket implementation supports NPN. + */ + public void setNpnProtocols(SSLSocket socket, byte[] npnProtocols) { + } + + public void connectSocket(Socket socket, InetSocketAddress address, + int connectTimeout) throws IOException { + socket.connect(address, connectTimeout); + } + + /** + * Returns a deflater output stream that supports SYNC_FLUSH for SPDY name + * value blocks. This throws an {@link UnsupportedOperationException} on + * Java 6 and earlier where there is no built-in API to do SYNC_FLUSH. + */ + public OutputStream newDeflaterOutputStream(OutputStream out, Deflater deflater, + boolean syncFlush) { + try { + Constructor constructor = deflaterConstructor; + if (constructor == null) { + constructor = deflaterConstructor = DeflaterOutputStream.class.getConstructor( + OutputStream.class, Deflater.class, boolean.class); + } + return constructor.newInstance(out, deflater, syncFlush); + } catch (NoSuchMethodException e) { + throw new UnsupportedOperationException("Cannot SPDY; no SYNC_FLUSH available"); + } catch (InvocationTargetException e) { + throw e.getCause() instanceof RuntimeException ? (RuntimeException) e.getCause() + : new RuntimeException(e.getCause()); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new AssertionError(); + } + } + + /** Attempt to match the host runtime to a capable Platform implementation. */ + private static Platform findPlatform() { + // Attempt to find Android 2.3+ APIs. + Class openSslSocketClass; + Method setUseSessionTickets; + Method setHostname; + try { + try { + openSslSocketClass = Class.forName("com.android.org.conscrypt.OpenSSLSocketImpl"); + } catch (ClassNotFoundException ignored) { + // Older platform before being unbundled. + openSslSocketClass = Class.forName( + "org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl"); + } + + setUseSessionTickets = openSslSocketClass.getMethod("setUseSessionTickets", boolean.class); + setHostname = openSslSocketClass.getMethod("setHostname", String.class); + + // Attempt to find Android 4.1+ APIs. + try { + Method setNpnProtocols = openSslSocketClass.getMethod("setNpnProtocols", byte[].class); + Method getNpnSelectedProtocol = openSslSocketClass.getMethod("getNpnSelectedProtocol"); + return new Android41(openSslSocketClass, setUseSessionTickets, setHostname, + setNpnProtocols, getNpnSelectedProtocol); + } catch (NoSuchMethodException ignored) { + return new Android23(openSslSocketClass, setUseSessionTickets, setHostname); + } + } catch (ClassNotFoundException ignored) { + // This isn't an Android runtime. + } catch (NoSuchMethodException ignored) { + // This isn't Android 2.3 or better. + } + + // Attempt to find the Jetty's NPN extension for OpenJDK. + try { + String npnClassName = "org.eclipse.jetty.npn.NextProtoNego"; + Class nextProtoNegoClass = Class.forName(npnClassName); + Class providerClass = Class.forName(npnClassName + "$Provider"); + Class clientProviderClass = Class.forName(npnClassName + "$ClientProvider"); + Class serverProviderClass = Class.forName(npnClassName + "$ServerProvider"); + Method putMethod = nextProtoNegoClass.getMethod("put", SSLSocket.class, providerClass); + Method getMethod = nextProtoNegoClass.getMethod("get", SSLSocket.class); + return new JdkWithJettyNpnPlatform( + putMethod, getMethod, clientProviderClass, serverProviderClass); + } catch (ClassNotFoundException ignored) { + // NPN isn't on the classpath. + } catch (NoSuchMethodException ignored) { + // The NPN version isn't what we expect. + } + + return new Platform(); + } + + /** Android version 2.3 and newer support TLS session tickets and server name indication (SNI). */ + private static class Android23 extends Platform { + protected final Class openSslSocketClass; + private final Method setUseSessionTickets; + private final Method setHostname; + + private Android23( + Class openSslSocketClass, Method setUseSessionTickets, Method setHostname) { + this.openSslSocketClass = openSslSocketClass; + this.setUseSessionTickets = setUseSessionTickets; + this.setHostname = setHostname; + } + + @Override public void connectSocket(Socket socket, InetSocketAddress address, + int connectTimeout) throws IOException { + try { + socket.connect(address, connectTimeout); + } catch (SecurityException se) { + // Before android 4.3, socket.connect could throw a SecurityException + // if opening a socket resulted in an EACCES error. + IOException ioException = new IOException("Exception in connect"); + ioException.initCause(se); + throw ioException; + } + } + + @Override public void enableTlsExtensions(SSLSocket socket, String uriHost) { + super.enableTlsExtensions(socket, uriHost); + if (openSslSocketClass.isInstance(socket)) { + // This is Android: use reflection on OpenSslSocketImpl. + try { + setUseSessionTickets.invoke(socket, true); + setHostname.invoke(socket, uriHost); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new AssertionError(e); + } + } + } + } + + /** Android version 4.1 and newer support NPN. */ + private static class Android41 extends Android23 { + private final Method setNpnProtocols; + private final Method getNpnSelectedProtocol; + + private Android41(Class openSslSocketClass, Method setUseSessionTickets, Method setHostname, + Method setNpnProtocols, Method getNpnSelectedProtocol) { + super(openSslSocketClass, setUseSessionTickets, setHostname); + this.setNpnProtocols = setNpnProtocols; + this.getNpnSelectedProtocol = getNpnSelectedProtocol; + } + + @Override public void setNpnProtocols(SSLSocket socket, byte[] npnProtocols) { + if (!openSslSocketClass.isInstance(socket)) { + return; + } + try { + setNpnProtocols.invoke(socket, new Object[] {npnProtocols}); + } catch (IllegalAccessException e) { + throw new AssertionError(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + @Override public byte[] getNpnSelectedProtocol(SSLSocket socket) { + if (!openSslSocketClass.isInstance(socket)) { + return null; + } + try { + return (byte[]) getNpnSelectedProtocol.invoke(socket); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new AssertionError(e); + } + } + } + + /** OpenJDK 7 plus {@code org.mortbay.jetty.npn/npn-boot} on the boot class path. */ + private static class JdkWithJettyNpnPlatform extends Platform { + private final Method getMethod; + private final Method putMethod; + private final Class clientProviderClass; + private final Class serverProviderClass; + + public JdkWithJettyNpnPlatform(Method putMethod, Method getMethod, Class clientProviderClass, + Class serverProviderClass) { + this.putMethod = putMethod; + this.getMethod = getMethod; + this.clientProviderClass = clientProviderClass; + this.serverProviderClass = serverProviderClass; + } + + @Override public void setNpnProtocols(SSLSocket socket, byte[] npnProtocols) { + try { + List strings = new ArrayList(); + for (int i = 0; i < npnProtocols.length; ) { + int length = npnProtocols[i++]; + strings.add(new String(npnProtocols, i, length, "US-ASCII")); + i += length; + } + Object provider = Proxy.newProxyInstance(Platform.class.getClassLoader(), + new Class[] {clientProviderClass, serverProviderClass}, + new JettyNpnProvider(strings)); + putMethod.invoke(null, socket, provider); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); + } catch (InvocationTargetException e) { + throw new AssertionError(e); + } catch (IllegalAccessException e) { + throw new AssertionError(e); + } + } + + @Override public byte[] getNpnSelectedProtocol(SSLSocket socket) { + try { + JettyNpnProvider provider = + (JettyNpnProvider) Proxy.getInvocationHandler(getMethod.invoke(null, socket)); + if (!provider.unsupported && provider.selected == null) { + Logger logger = Logger.getLogger("com.squareup.okhttp.OkHttpClient"); + logger.log(Level.INFO, + "NPN callback dropped so SPDY is disabled. " + "Is npn-boot on the boot class path?"); + return null; + } + return provider.unsupported ? null : provider.selected.getBytes("US-ASCII"); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } catch (InvocationTargetException e) { + throw new AssertionError(); + } catch (IllegalAccessException e) { + throw new AssertionError(); + } + } + } + + /** + * Handle the methods of NextProtoNego's ClientProvider and ServerProvider + * without a compile-time dependency on those interfaces. + */ + private static class JettyNpnProvider implements InvocationHandler { + private final List protocols; + private boolean unsupported; + private String selected; + + public JettyNpnProvider(List protocols) { + this.protocols = protocols; + } + + @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + String methodName = method.getName(); + Class returnType = method.getReturnType(); + if (args == null) { + args = Util.EMPTY_STRING_ARRAY; + } + if (methodName.equals("supports") && boolean.class == returnType) { + return true; + } else if (methodName.equals("unsupported") && void.class == returnType) { + this.unsupported = true; + return null; + } else if (methodName.equals("protocols") && args.length == 0) { + return protocols; + } else if (methodName.equals("selectProtocol") + && String.class == returnType + && args.length == 1 + && (args[0] == null || args[0] instanceof List)) { + // TODO: use OpenSSL's algorithm which uses both lists + List serverProtocols = (List) args[0]; + this.selected = protocols.get(0); + return selected; + } else if (methodName.equals("protocolSelected") && args.length == 1) { + this.selected = (String) args[0]; + return null; + } else { + return method.invoke(this, args); + } + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java new file mode 100644 index 0000000..74af6fd --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/StrictLineReader.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal; + +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; + +/** + * Buffers input from an {@link InputStream} for reading lines. + * + *

This class is used for buffered reading of lines. For purposes of this class, a line ends with + * "\n" or "\r\n". End of input is reported by throwing {@code EOFException}. Unterminated line at + * end of input is invalid and will be ignored, the caller may use {@code hasUnterminatedLine()} + * to detect it after catching the {@code EOFException}. + * + *

This class is intended for reading input that strictly consists of lines, such as line-based + * cache entries or cache journal. Unlike the {@link java.io.BufferedReader} which in conjunction + * with {@link java.io.InputStreamReader} provides similar functionality, this class uses different + * end-of-input reporting and a more restrictive definition of a line. + * + *

This class supports only charsets that encode '\r' and '\n' as a single byte with value 13 + * and 10, respectively, and the representation of no other character contains these values. + * We currently check in constructor that the charset is one of US-ASCII, UTF-8 and ISO-8859-1. + * The default charset is US_ASCII. + */ +public class StrictLineReader implements Closeable { + private static final byte CR = (byte) '\r'; + private static final byte LF = (byte) '\n'; + + private final InputStream in; + private final Charset charset; + + /* + * Buffered data is stored in {@code buf}. As long as no exception occurs, 0 <= pos <= end + * and the data in the range [pos, end) is buffered for reading. At end of input, if there is + * an unterminated line, we set end == -1, otherwise end == pos. If the underlying + * {@code InputStream} throws an {@code IOException}, end may remain as either pos or -1. + */ + private byte[] buf; + private int pos; + private int end; + + /** + * Constructs a new {@code LineReader} with the specified charset and the default capacity. + * + * @param in the {@code InputStream} to read data from. + * @param charset the charset used to decode data. Only US-ASCII, UTF-8 and ISO-8859-1 are + * supported. + * @throws NullPointerException if {@code in} or {@code charset} is null. + * @throws IllegalArgumentException if the specified charset is not supported. + */ + public StrictLineReader(InputStream in, Charset charset) { + this(in, 8192, charset); + } + + /** + * Constructs a new {@code LineReader} with the specified capacity and charset. + * + * @param in the {@code InputStream} to read data from. + * @param capacity the capacity of the buffer. + * @param charset the charset used to decode data. Only US-ASCII, UTF-8 and ISO-8859-1 are + * supported. + * @throws NullPointerException if {@code in} or {@code charset} is null. + * @throws IllegalArgumentException if {@code capacity} is negative or zero + * or the specified charset is not supported. + */ + public StrictLineReader(InputStream in, int capacity, Charset charset) { + if (in == null || charset == null) { + throw new NullPointerException(); + } + if (capacity < 0) { + throw new IllegalArgumentException("capacity <= 0"); + } + if (!(charset.equals(Util.US_ASCII))) { + throw new IllegalArgumentException("Unsupported encoding"); + } + + this.in = in; + this.charset = charset; + buf = new byte[capacity]; + } + + /** + * Closes the reader by closing the underlying {@code InputStream} and + * marking this reader as closed. + * + * @throws IOException for errors when closing the underlying {@code InputStream}. + */ + public void close() throws IOException { + synchronized (in) { + if (buf != null) { + buf = null; + in.close(); + } + } + } + + /** + * Reads the next line. A line ends with {@code "\n"} or {@code "\r\n"}, + * this end of line marker is not included in the result. + * + * @return the next line from the input. + * @throws IOException for underlying {@code InputStream} errors. + * @throws EOFException for the end of source stream. + */ + public String readLine() throws IOException { + synchronized (in) { + if (buf == null) { + throw new IOException("LineReader is closed"); + } + + // Read more data if we are at the end of the buffered data. + // Though it's an error to read after an exception, we will let {@code fillBuf()} + // throw again if that happens; thus we need to handle end == -1 as well as end == pos. + if (pos >= end) { + fillBuf(); + } + // Try to find LF in the buffered data and return the line if successful. + for (int i = pos; i != end; ++i) { + if (buf[i] == LF) { + int lineEnd = (i != pos && buf[i - 1] == CR) ? i - 1 : i; + String res = new String(buf, pos, lineEnd - pos, charset.name()); + pos = i + 1; + return res; + } + } + + // Let's anticipate up to 80 characters on top of those already read. + ByteArrayOutputStream out = new ByteArrayOutputStream(end - pos + 80) { + @Override public String toString() { + int length = (count > 0 && buf[count - 1] == CR) ? count - 1 : count; + try { + return new String(buf, 0, length, charset.name()); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); // Since we control the charset this will never happen. + } + } + }; + + while (true) { + out.write(buf, pos, end - pos); + // Mark unterminated line in case fillBuf throws EOFException or IOException. + end = -1; + fillBuf(); + // Try to find LF in the buffered data and return the line if successful. + for (int i = pos; i != end; ++i) { + if (buf[i] == LF) { + if (i != pos) { + out.write(buf, pos, i - pos); + } + pos = i + 1; + return out.toString(); + } + } + } + } + } + + /** + * Read an {@code int} from a line containing its decimal representation. + * + * @return the value of the {@code int} from the next line. + * @throws IOException for underlying {@code InputStream} errors or conversion error. + * @throws EOFException for the end of source stream. + */ + public int readInt() throws IOException { + String intString = readLine(); + try { + return Integer.parseInt(intString); + } catch (NumberFormatException e) { + throw new IOException("expected an int but was \"" + intString + "\""); + } + } + + /** + * Reads new input data into the buffer. Call only with pos == end or end == -1, + * depending on the desired outcome if the function throws. + */ + private void fillBuf() throws IOException { + int result = in.read(buf, 0, buf.length); + if (result == -1) { + throw new EOFException(); + } + pos = 0; + end = result; + } +} + diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java new file mode 100644 index 0000000..9c5b008 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/Util.java @@ -0,0 +1,394 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal; + +import java.io.Closeable; +import java.io.EOFException; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Reader; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.net.Socket; +import java.net.ServerSocket; +import java.net.URI; +import java.net.URL; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicReference; + +/** Junk drawer of utility methods. */ +public final class Util { + public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + public static final String[] EMPTY_STRING_ARRAY = new String[0]; + + /** A cheap and type-safe constant for the ISO-8859-1 Charset. */ + public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); + + /** A cheap and type-safe constant for the US-ASCII Charset. */ + public static final Charset US_ASCII = Charset.forName("US-ASCII"); + + /** A cheap and type-safe constant for the UTF-8 Charset. */ + public static final Charset UTF_8 = Charset.forName("UTF-8"); + private static AtomicReference skipBuffer = new AtomicReference(); + + private static final char[] DIGITS = + { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + private Util() { + } + + public static int getEffectivePort(URI uri) { + return getEffectivePort(uri.getScheme(), uri.getPort()); + } + + public static int getEffectivePort(URL url) { + return getEffectivePort(url.getProtocol(), url.getPort()); + } + + private static int getEffectivePort(String scheme, int specifiedPort) { + return specifiedPort != -1 ? specifiedPort : getDefaultPort(scheme); + } + + public static int getDefaultPort(String scheme) { + if ("http".equalsIgnoreCase(scheme)) { + return 80; + } else if ("https".equalsIgnoreCase(scheme)) { + return 443; + } else { + return -1; + } + } + + public static void checkOffsetAndCount(int arrayLength, int offset, int count) { + if ((offset | count) < 0 || offset > arrayLength || arrayLength - offset < count) { + throw new ArrayIndexOutOfBoundsException(); + } + } + + public static void pokeInt(byte[] dst, int offset, int value, ByteOrder order) { + if (order == ByteOrder.BIG_ENDIAN) { + dst[offset++] = (byte) ((value >> 24) & 0xff); + dst[offset++] = (byte) ((value >> 16) & 0xff); + dst[offset++] = (byte) ((value >> 8) & 0xff); + dst[offset] = (byte) ((value >> 0) & 0xff); + } else { + dst[offset++] = (byte) ((value >> 0) & 0xff); + dst[offset++] = (byte) ((value >> 8) & 0xff); + dst[offset++] = (byte) ((value >> 16) & 0xff); + dst[offset] = (byte) ((value >> 24) & 0xff); + } + } + + /** Returns true if two possibly-null objects are equal. */ + public static boolean equal(Object a, Object b) { + return a == b || (a != null && a.equals(b)); + } + + /** + * Closes {@code closeable}, ignoring any checked exceptions. Does nothing + * if {@code closeable} is null. + */ + public static void closeQuietly(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + } + } + } + + /** + * Closes {@code socket}, ignoring any checked exceptions. Does nothing if + * {@code socket} is null. + */ + public static void closeQuietly(Socket socket) { + if (socket != null) { + try { + socket.close(); + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + } + } + } + + /** + * Closes {@code serverSocket}, ignoring any checked exceptions. Does nothing if + * {@code serverSocket} is null. + */ + public static void closeQuietly(ServerSocket serverSocket) { + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (RuntimeException rethrown) { + throw rethrown; + } catch (Exception ignored) { + } + } + } + + /** + * Closes {@code a} and {@code b}. If either close fails, this completes + * the other close and rethrows the first encountered exception. + */ + public static void closeAll(Closeable a, Closeable b) throws IOException { + Throwable thrown = null; + try { + a.close(); + } catch (Throwable e) { + thrown = e; + } + try { + b.close(); + } catch (Throwable e) { + if (thrown == null) thrown = e; + } + if (thrown == null) return; + if (thrown instanceof IOException) throw (IOException) thrown; + if (thrown instanceof RuntimeException) throw (RuntimeException) thrown; + if (thrown instanceof Error) throw (Error) thrown; + throw new AssertionError(thrown); + } + + /** + * Deletes the contents of {@code dir}. Throws an IOException if any file + * could not be deleted, or if {@code dir} is not a readable directory. + */ + public static void deleteContents(File dir) throws IOException { + File[] files = dir.listFiles(); + if (files == null) { + throw new IOException("not a readable directory: " + dir); + } + for (File file : files) { + if (file.isDirectory()) { + deleteContents(file); + } + if (!file.delete()) { + throw new IOException("failed to delete file: " + file); + } + } + } + + /** + * Implements InputStream.read(int) in terms of InputStream.read(byte[], int, int). + * InputStream assumes that you implement InputStream.read(int) and provides default + * implementations of the others, but often the opposite is more efficient. + */ + public static int readSingleByte(InputStream in) throws IOException { + byte[] buffer = new byte[1]; + int result = in.read(buffer, 0, 1); + return (result != -1) ? buffer[0] & 0xff : -1; + } + + /** + * Implements OutputStream.write(int) in terms of OutputStream.write(byte[], int, int). + * OutputStream assumes that you implement OutputStream.write(int) and provides default + * implementations of the others, but often the opposite is more efficient. + */ + public static void writeSingleByte(OutputStream out, int b) throws IOException { + byte[] buffer = new byte[1]; + buffer[0] = (byte) (b & 0xff); + out.write(buffer); + } + + /** + * Fills 'dst' with bytes from 'in', throwing EOFException if insufficient bytes are available. + */ + public static void readFully(InputStream in, byte[] dst) throws IOException { + readFully(in, dst, 0, dst.length); + } + + /** + * Reads exactly 'byteCount' bytes from 'in' (into 'dst' at offset 'offset'), and throws + * EOFException if insufficient bytes are available. + * + * Used to implement {@link java.io.DataInputStream#readFully(byte[], int, int)}. + */ + public static void readFully(InputStream in, byte[] dst, int offset, int byteCount) + throws IOException { + if (byteCount == 0) { + return; + } + if (in == null) { + throw new NullPointerException("in == null"); + } + if (dst == null) { + throw new NullPointerException("dst == null"); + } + checkOffsetAndCount(dst.length, offset, byteCount); + while (byteCount > 0) { + int bytesRead = in.read(dst, offset, byteCount); + if (bytesRead < 0) { + throw new EOFException(); + } + offset += bytesRead; + byteCount -= bytesRead; + } + } + + /** Returns the remainder of 'reader' as a string, closing it when done. */ + public static String readFully(Reader reader) throws IOException { + try { + StringWriter writer = new StringWriter(); + char[] buffer = new char[1024]; + int count; + while ((count = reader.read(buffer)) != -1) { + writer.write(buffer, 0, count); + } + return writer.toString(); + } finally { + reader.close(); + } + } + + public static void skipAll(InputStream in) throws IOException { + do { + in.skip(Long.MAX_VALUE); + } while (in.read() != -1); + } + + /** + * Call {@code in.read()} repeatedly until either the stream is exhausted or + * {@code byteCount} bytes have been read. + * + *

This method reuses the skip buffer but is careful to never use it at + * the same time that another stream is using it. Otherwise streams that use + * the caller's buffer for consistency checks like CRC could be clobbered by + * other threads. A thread-local buffer is also insufficient because some + * streams may call other streams in their skip() method, also clobbering the + * buffer. + */ + public static long skipByReading(InputStream in, long byteCount) throws IOException { + if (byteCount == 0) return 0L; + + // acquire the shared skip buffer. + byte[] buffer = skipBuffer.getAndSet(null); + if (buffer == null) { + buffer = new byte[4096]; + } + + long skipped = 0; + while (skipped < byteCount) { + int toRead = (int) Math.min(byteCount - skipped, buffer.length); + int read = in.read(buffer, 0, toRead); + if (read == -1) { + break; + } + skipped += read; + if (read < toRead) { + break; + } + } + + // release the shared skip buffer. + skipBuffer.set(buffer); + + return skipped; + } + + /** + * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. + * Returns the total number of bytes transferred. + */ + public static int copy(InputStream in, OutputStream out) throws IOException { + int total = 0; + byte[] buffer = new byte[8192]; + int c; + while ((c = in.read(buffer)) != -1) { + total += c; + out.write(buffer, 0, c); + } + return total; + } + + /** + * Returns the ASCII characters up to but not including the next "\r\n", or + * "\n". + * + * @throws java.io.EOFException if the stream is exhausted before the next newline + * character. + */ + public static String readAsciiLine(InputStream in) throws IOException { + // TODO: support UTF-8 here instead + StringBuilder result = new StringBuilder(80); + while (true) { + int c = in.read(); + if (c == -1) { + throw new EOFException(); + } else if (c == '\n') { + break; + } + + result.append((char) c); + } + int length = result.length(); + if (length > 0 && result.charAt(length - 1) == '\r') { + result.setLength(length - 1); + } + return result.toString(); + } + + /** Returns a 32 character string containing a hash of {@code s}. */ + public static String hash(String s) { + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + byte[] md5bytes = messageDigest.digest(s.getBytes("UTF-8")); + return bytesToHexString(md5bytes); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); + } + } + + private static String bytesToHexString(byte[] bytes) { + char[] digits = DIGITS; + char[] buf = new char[bytes.length * 2]; + int c = 0; + for (byte b : bytes) { + buf[c++] = digits[(b >> 4) & 0xf]; + buf[c++] = digits[b & 0xf]; + } + return new String(buf); + } + + /** Returns an immutable copy of {@code list}. */ + public static List immutableList(List list) { + return Collections.unmodifiableList(new ArrayList(list)); + } + + public static ThreadFactory daemonThreadFactory(final String name) { + return new ThreadFactory() { + @Override public Thread newThread(Runnable runnable) { + Thread result = new Thread(runnable, name); + result.setDaemon(true); + return result; + } + }; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java new file mode 100644 index 0000000..a5d39b3 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/AbstractHttpInputStream.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.internal.Util; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.CacheRequest; + +/** + * An input stream for the body of an HTTP response. + * + *

Since a single socket's input stream may be used to read multiple HTTP + * responses from the same server, subclasses shouldn't close the socket stream. + * + *

A side effect of reading an HTTP response is that the response cache + * is populated. If the stream is closed early, that cache entry will be + * invalidated. + */ +abstract class AbstractHttpInputStream extends InputStream { + protected final InputStream in; + protected final HttpEngine httpEngine; + private final CacheRequest cacheRequest; + private final OutputStream cacheBody; + protected boolean closed; + + AbstractHttpInputStream(InputStream in, HttpEngine httpEngine, CacheRequest cacheRequest) + throws IOException { + this.in = in; + this.httpEngine = httpEngine; + + OutputStream cacheBody = cacheRequest != null ? cacheRequest.getBody() : null; + + // some apps return a null body; for compatibility we treat that like a null cache request + if (cacheBody == null) { + cacheRequest = null; + } + + this.cacheBody = cacheBody; + this.cacheRequest = cacheRequest; + } + + /** + * read() is implemented using read(byte[], int, int) so subclasses only + * need to override the latter. + */ + @Override public final int read() throws IOException { + return Util.readSingleByte(this); + } + + protected final void checkNotClosed() throws IOException { + if (closed) { + throw new IOException("stream closed"); + } + } + + protected final void cacheWrite(byte[] buffer, int offset, int count) throws IOException { + if (cacheBody != null) { + cacheBody.write(buffer, offset, count); + } + } + + /** + * Closes the cache entry and makes the socket available for reuse. This + * should be invoked when the end of the body has been reached. + */ + protected final void endOfInput() throws IOException { + if (cacheRequest != null) { + cacheBody.close(); + } + httpEngine.release(false); + } + + /** + * Calls abort on the cache entry and disconnects the socket. This + * should be invoked when the connection is closed unexpectedly to + * invalidate the cache entry and to prevent the HTTP connection from + * being reused. HTTP messages are sent in serial so whenever a message + * cannot be read to completion, subsequent messages cannot be read + * either and the connection must be discarded. + * + *

An earlier implementation skipped the remaining bytes, but this + * requires that the entire transfer be completed. If the intention was + * to cancel the transfer, closing the connection is the only solution. + */ + protected final void unexpectedEndOfInput() { + if (cacheRequest != null) { + cacheRequest.abort(); + } + httpEngine.release(true); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java new file mode 100644 index 0000000..d5f0f4f --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HeaderParser.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +final class HeaderParser { + + public interface CacheControlHandler { + void handle(String directive, String parameter); + } + + /** Parse a comma-separated list of cache control header values. */ + public static void parseCacheControl(String value, CacheControlHandler handler) { + int pos = 0; + while (pos < value.length()) { + int tokenStart = pos; + pos = skipUntil(value, pos, "=,;"); + String directive = value.substring(tokenStart, pos).trim(); + + if (pos == value.length() || value.charAt(pos) == ',' || value.charAt(pos) == ';') { + pos++; // consume ',' or ';' (if necessary) + handler.handle(directive, null); + continue; + } + + pos++; // consume '=' + pos = skipWhitespace(value, pos); + + String parameter; + + // quoted string + if (pos < value.length() && value.charAt(pos) == '\"') { + pos++; // consume '"' open quote + int parameterStart = pos; + pos = skipUntil(value, pos, "\""); + parameter = value.substring(parameterStart, pos); + pos++; // consume '"' close quote (if necessary) + + // unquoted string + } else { + int parameterStart = pos; + pos = skipUntil(value, pos, ",;"); + parameter = value.substring(parameterStart, pos).trim(); + } + + handler.handle(directive, parameter); + } + } + + /** + * Returns the next index in {@code input} at or after {@code pos} that + * contains a character from {@code characters}. Returns the input length if + * none of the requested characters can be found. + */ + public static int skipUntil(String input, int pos, String characters) { + for (; pos < input.length(); pos++) { + if (characters.indexOf(input.charAt(pos)) != -1) { + break; + } + } + return pos; + } + + /** + * Returns the next non-whitespace character in {@code input} that is white + * space. Result is undefined if input contains newline characters. + */ + public static int skipWhitespace(String input, int pos) { + for (; pos < input.length(); pos++) { + char c = input.charAt(pos); + if (c != ' ' && c != '\t') { + break; + } + } + return pos; + } + + /** + * Returns {@code value} as a positive integer, or 0 if it is negative, or + * -1 if it cannot be parsed. + */ + public static int parseSeconds(String value) { + try { + long seconds = Long.parseLong(value); + if (seconds > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else if (seconds < 0) { + return 0; + } else { + return (int) seconds; + } + } catch (NumberFormatException e) { + return -1; + } + } + + private HeaderParser() { + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java new file mode 100644 index 0000000..1ad3689 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpAuthenticator.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2012 Square, Inc. + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.OkAuthenticator; +import com.squareup.okhttp.OkAuthenticator.Challenge; +import java.io.IOException; +import java.net.Authenticator; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; +import java.net.Proxy; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import static com.squareup.okhttp.OkAuthenticator.Credential; +import static java.net.HttpURLConnection.HTTP_PROXY_AUTH; +import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; + +/** Handles HTTP authentication headers from origin and proxy servers. */ +public final class HttpAuthenticator { + /** Uses the global authenticator to get the password. */ + public static final OkAuthenticator SYSTEM_DEFAULT = new OkAuthenticator() { + @Override public Credential authenticate( + Proxy proxy, URL url, List challenges) throws IOException { + for (Challenge challenge : challenges) { + if (!"Basic".equalsIgnoreCase(challenge.getScheme())) { + continue; + } + + PasswordAuthentication auth = Authenticator.requestPasswordAuthentication(url.getHost(), + getConnectToInetAddress(proxy, url), url.getPort(), url.getProtocol(), + challenge.getRealm(), challenge.getScheme(), url, Authenticator.RequestorType.SERVER); + if (auth != null) { + return Credential.basic(auth.getUserName(), new String(auth.getPassword())); + } + } + return null; + } + + @Override public Credential authenticateProxy( + Proxy proxy, URL url, List challenges) throws IOException { + for (Challenge challenge : challenges) { + if (!"Basic".equalsIgnoreCase(challenge.getScheme())) { + continue; + } + + InetSocketAddress proxyAddress = (InetSocketAddress) proxy.address(); + PasswordAuthentication auth = Authenticator.requestPasswordAuthentication( + proxyAddress.getHostName(), getConnectToInetAddress(proxy, url), proxyAddress.getPort(), + url.getProtocol(), challenge.getRealm(), challenge.getScheme(), url, + Authenticator.RequestorType.PROXY); + if (auth != null) { + return Credential.basic(auth.getUserName(), new String(auth.getPassword())); + } + } + return null; + } + + private InetAddress getConnectToInetAddress(Proxy proxy, URL url) throws IOException { + return (proxy != null && proxy.type() != Proxy.Type.DIRECT) + ? ((InetSocketAddress) proxy.address()).getAddress() + : InetAddress.getByName(url.getHost()); + } + }; + + private HttpAuthenticator() { + } + + /** + * React to a failed authorization response by looking up new credentials. + * + * @return true if credentials have been added to successorRequestHeaders + * and another request should be attempted. + */ + public static boolean processAuthHeader(OkAuthenticator authenticator, int responseCode, + RawHeaders responseHeaders, RawHeaders successorRequestHeaders, Proxy proxy, URL url) + throws IOException { + String responseField; + String requestField; + if (responseCode == HTTP_UNAUTHORIZED) { + responseField = "WWW-Authenticate"; + requestField = "Authorization"; + } else if (responseCode == HTTP_PROXY_AUTH) { + responseField = "Proxy-Authenticate"; + requestField = "Proxy-Authorization"; + } else { + throw new IllegalArgumentException(); // TODO: ProtocolException? + } + List challenges = parseChallenges(responseHeaders, responseField); + if (challenges.isEmpty()) { + return false; // Could not find a challenge so end the request cycle. + } + Credential credential = responseHeaders.getResponseCode() == HTTP_PROXY_AUTH + ? authenticator.authenticateProxy(proxy, url, challenges) + : authenticator.authenticate(proxy, url, challenges); + if (credential == null) { + return false; // Could not satisfy the challenge so end the request cycle. + } + // Add authorization credentials, bypassing the already-connected check. + successorRequestHeaders.set(requestField, credential.getHeaderValue()); + return true; + } + + /** + * Parse RFC 2617 challenges. This API is only interested in the scheme + * name and realm. + */ + private static List parseChallenges(RawHeaders responseHeaders, + String challengeHeader) { + // auth-scheme = token + // auth-param = token "=" ( token | quoted-string ) + // challenge = auth-scheme 1*SP 1#auth-param + // realm = "realm" "=" realm-value + // realm-value = quoted-string + List result = new ArrayList(); + for (int h = 0; h < responseHeaders.length(); h++) { + if (!challengeHeader.equalsIgnoreCase(responseHeaders.getFieldName(h))) { + continue; + } + String value = responseHeaders.getValue(h); + int pos = 0; + while (pos < value.length()) { + int tokenStart = pos; + pos = HeaderParser.skipUntil(value, pos, " "); + + String scheme = value.substring(tokenStart, pos).trim(); + pos = HeaderParser.skipWhitespace(value, pos); + + // TODO: This currently only handles schemes with a 'realm' parameter; + // It needs to be fixed to handle any scheme and any parameters + // http://code.google.com/p/android/issues/detail?id=11140 + + if (!value.regionMatches(true, pos, "realm=\"", 0, "realm=\"".length())) { + break; // Unexpected challenge parameter; give up! + } + + pos += "realm=\"".length(); + int realmStart = pos; + pos = HeaderParser.skipUntil(value, pos, "\""); + String realm = value.substring(realmStart, pos); + pos++; // Consume '"' close quote. + pos = HeaderParser.skipUntil(value, pos, ","); + pos++; // Consume ',' comma. + pos = HeaderParser.skipWhitespace(value, pos); + result.add(new Challenge(scheme, realm)); + } + } + return result; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java new file mode 100644 index 0000000..b4d2c7c --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpDate.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +/** + * Best-effort parser for HTTP dates. + */ +final class HttpDate { + + /** + * Most websites serve cookies in the blessed format. Eagerly create the parser to ensure such + * cookies are on the fast path. + */ + private static final ThreadLocal STANDARD_DATE_FORMAT = + new ThreadLocal() { + @Override protected DateFormat initialValue() { + DateFormat rfc1123 = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); + rfc1123.setTimeZone(TimeZone.getTimeZone("GMT")); + return rfc1123; + } + }; + + /** If we fail to parse a date in a non-standard format, try each of these formats in sequence. */ + private static final String[] BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS = new String[] { + "EEEE, dd-MMM-yy HH:mm:ss zzz", // RFC 1036 + "EEE MMM d HH:mm:ss yyyy", // ANSI C asctime() + "EEE, dd-MMM-yyyy HH:mm:ss z", "EEE, dd-MMM-yyyy HH-mm-ss z", "EEE, dd MMM yy HH:mm:ss z", + "EEE dd-MMM-yyyy HH:mm:ss z", "EEE dd MMM yyyy HH:mm:ss z", "EEE dd-MMM-yyyy HH-mm-ss z", + "EEE dd-MMM-yy HH:mm:ss z", "EEE dd MMM yy HH:mm:ss z", "EEE,dd-MMM-yy HH:mm:ss z", + "EEE,dd-MMM-yyyy HH:mm:ss z", "EEE, dd-MM-yyyy HH:mm:ss z", + + /* RI bug 6641315 claims a cookie of this format was once served by www.yahoo.com */ + "EEE MMM d yyyy HH:mm:ss z", }; + + private static final DateFormat[] BROWSER_COMPATIBLE_DATE_FORMATS = + new DateFormat[BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS.length]; + + /** Returns the date for {@code value}. Returns null if the value couldn't be parsed. */ + public static Date parse(String value) { + try { + return STANDARD_DATE_FORMAT.get().parse(value); + } catch (ParseException ignored) { + } + synchronized (BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS) { + for (int i = 0, count = BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS.length; i < count; i++) { + DateFormat format = BROWSER_COMPATIBLE_DATE_FORMATS[i]; + if (format == null) { + format = new SimpleDateFormat(BROWSER_COMPATIBLE_DATE_FORMAT_STRINGS[i], Locale.US); + BROWSER_COMPATIBLE_DATE_FORMATS[i] = format; + } + try { + return format.parse(value); + } catch (ParseException ignored) { + } + } + } + return null; + } + + /** Returns the string for {@code value}. */ + public static String format(Date value) { + return STANDARD_DATE_FORMAT.get().format(value); + } + + private HttpDate() { + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java new file mode 100644 index 0000000..4a2dad4 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpEngine.java @@ -0,0 +1,686 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.Address; +import com.squareup.okhttp.Connection; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.OkResponseCache; +import com.squareup.okhttp.ResponseSource; +import com.squareup.okhttp.TunnelRequest; +import com.squareup.okhttp.internal.Dns; +import com.squareup.okhttp.internal.Platform; +import com.squareup.okhttp.internal.Util; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.CacheRequest; +import java.net.CacheResponse; +import java.net.CookieHandler; +import java.net.HttpURLConnection; +import java.net.Proxy; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.GZIPInputStream; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSocketFactory; + +import static com.squareup.okhttp.internal.Util.EMPTY_BYTE_ARRAY; +import static com.squareup.okhttp.internal.Util.getDefaultPort; +import static com.squareup.okhttp.internal.Util.getEffectivePort; + +/** + * Handles a single HTTP request/response pair. Each HTTP engine follows this + * lifecycle: + *

    + *
  1. It is created. + *
  2. The HTTP request message is sent with sendRequest(). Once the request + * is sent it is an error to modify the request headers. After + * sendRequest() has been called the request body can be written to if + * it exists. + *
  3. The HTTP response message is read with readResponse(). After the + * response has been read the response headers and body can be read. + * All responses have a response body input stream, though in some + * instances this stream is empty. + *
+ * + *

The request and response may be served by the HTTP response cache, by the + * network, or by both in the event of a conditional GET. + * + *

This class may hold a socket connection that needs to be released or + * recycled. By default, this socket connection is held when the last byte of + * the response is consumed. To release the connection when it is no longer + * required, use {@link #automaticallyReleaseConnectionToPool()}. + */ +public class HttpEngine { + private static final CacheResponse GATEWAY_TIMEOUT_RESPONSE = new CacheResponse() { + @Override public Map> getHeaders() throws IOException { + Map> result = new HashMap>(); + result.put(null, Collections.singletonList("HTTP/1.1 504 Gateway Timeout")); + return result; + } + @Override public InputStream getBody() throws IOException { + return new ByteArrayInputStream(EMPTY_BYTE_ARRAY); + } + }; + public static final int HTTP_CONTINUE = 100; + + protected final Policy policy; + protected final OkHttpClient client; + + protected final String method; + + private ResponseSource responseSource; + + protected Connection connection; + protected RouteSelector routeSelector; + private OutputStream requestBodyOut; + + private Transport transport; + + private InputStream responseTransferIn; + private InputStream responseBodyIn; + + private CacheResponse cacheResponse; + private CacheRequest cacheRequest; + + /** The time when the request headers were written, or -1 if they haven't been written yet. */ + long sentRequestMillis = -1; + + /** Whether the connection has been established. */ + boolean connected; + + /** + * True if this client added an "Accept-Encoding: gzip" header field and is + * therefore responsible for also decompressing the transfer stream. + */ + private boolean transparentGzip; + + final URI uri; + + final RequestHeaders requestHeaders; + + /** Null until a response is received from the network or the cache. */ + ResponseHeaders responseHeaders; + + // The cache response currently being validated on a conditional get. Null + // if the cached response doesn't exist or doesn't need validation. If the + // conditional get succeeds, these will be used for the response headers and + // body. If it fails, these be closed and set to null. + private ResponseHeaders cachedResponseHeaders; + private InputStream cachedResponseBody; + + /** + * True if the socket connection should be released to the connection pool + * when the response has been fully read. + */ + private boolean automaticallyReleaseConnectionToPool; + + /** True if the socket connection is no longer needed by this engine. */ + private boolean connectionReleased; + + /** + * @param requestHeaders the client's supplied request headers. This class + * creates a private copy that it can mutate. + * @param connection the connection used for an intermediate response + * immediately prior to this request/response pair, such as a same-host + * redirect. This engine assumes ownership of the connection and must + * release it when it is unneeded. + */ + public HttpEngine(OkHttpClient client, Policy policy, String method, RawHeaders requestHeaders, + Connection connection, RetryableOutputStream requestBodyOut) throws IOException { + this.client = client; + this.policy = policy; + this.method = method; + this.connection = connection; + this.requestBodyOut = requestBodyOut; + + try { + uri = Platform.get().toUriLenient(policy.getURL()); + } catch (URISyntaxException e) { + throw new IOException(e.getMessage()); + } + + this.requestHeaders = new RequestHeaders(uri, new RawHeaders(requestHeaders)); + } + + public URI getUri() { + return uri; + } + + /** + * Figures out what the response source will be, and opens a socket to that + * source if necessary. Prepares the request headers and gets ready to start + * writing the request body if it exists. + */ + public final void sendRequest() throws IOException { + if (responseSource != null) { + return; + } + + prepareRawRequestHeaders(); + initResponseSource(); + OkResponseCache responseCache = client.getOkResponseCache(); + if (responseCache != null) { + responseCache.trackResponse(responseSource); + } + + // The raw response source may require the network, but the request + // headers may forbid network use. In that case, dispose of the network + // response and use a GATEWAY_TIMEOUT response instead, as specified + // by http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4. + if (requestHeaders.isOnlyIfCached() && responseSource.requiresConnection()) { + if (responseSource == ResponseSource.CONDITIONAL_CACHE) { + Util.closeQuietly(cachedResponseBody); + } + this.responseSource = ResponseSource.CACHE; + this.cacheResponse = GATEWAY_TIMEOUT_RESPONSE; + RawHeaders rawResponseHeaders = RawHeaders.fromMultimap(cacheResponse.getHeaders(), true); + setResponse(new ResponseHeaders(uri, rawResponseHeaders), cacheResponse.getBody()); + } + + if (responseSource.requiresConnection()) { + sendSocketRequest(); + } else if (connection != null) { + client.getConnectionPool().recycle(connection); + connection = null; + } + } + + /** + * Initialize the source for this response. It may be corrected later if the + * request headers forbids network use. + */ + private void initResponseSource() throws IOException { + responseSource = ResponseSource.NETWORK; + if (!policy.getUseCaches()) return; + + OkResponseCache responseCache = client.getOkResponseCache(); + if (responseCache == null) return; + + CacheResponse candidate = responseCache.get( + uri, method, requestHeaders.getHeaders().toMultimap(false)); + if (candidate == null) return; + + Map> responseHeadersMap = candidate.getHeaders(); + cachedResponseBody = candidate.getBody(); + if (!acceptCacheResponseType(candidate) + || responseHeadersMap == null + || cachedResponseBody == null) { + Util.closeQuietly(cachedResponseBody); + return; + } + + RawHeaders rawResponseHeaders = RawHeaders.fromMultimap(responseHeadersMap, true); + cachedResponseHeaders = new ResponseHeaders(uri, rawResponseHeaders); + long now = System.currentTimeMillis(); + this.responseSource = cachedResponseHeaders.chooseResponseSource(now, requestHeaders); + if (responseSource == ResponseSource.CACHE) { + this.cacheResponse = candidate; + setResponse(cachedResponseHeaders, cachedResponseBody); + } else if (responseSource == ResponseSource.CONDITIONAL_CACHE) { + this.cacheResponse = candidate; + } else if (responseSource == ResponseSource.NETWORK) { + Util.closeQuietly(cachedResponseBody); + } else { + throw new AssertionError(); + } + } + + private void sendSocketRequest() throws IOException { + if (connection == null) { + connect(); + } + + if (transport != null) { + throw new IllegalStateException(); + } + + transport = (Transport) connection.newTransport(this); + + if (hasRequestBody() && requestBodyOut == null) { + // Create a request body if we don't have one already. We'll already + // have one if we're retrying a failed POST. + requestBodyOut = transport.createRequestBody(); + } + } + + /** Connect to the origin server either directly or via a proxy. */ + protected final void connect() throws IOException { + if (connection != null) { + return; + } + if (routeSelector == null) { + String uriHost = uri.getHost(); + if (uriHost == null) { + throw new UnknownHostException(uri.toString()); + } + SSLSocketFactory sslSocketFactory = null; + HostnameVerifier hostnameVerifier = null; + if (uri.getScheme().equalsIgnoreCase("https")) { + sslSocketFactory = client.getSslSocketFactory(); + hostnameVerifier = client.getHostnameVerifier(); + } + Address address = new Address(uriHost, getEffectivePort(uri), sslSocketFactory, + hostnameVerifier, client.getAuthenticator(), client.getProxy(), client.getTransports()); + routeSelector = new RouteSelector(address, uri, client.getProxySelector(), + client.getConnectionPool(), Dns.DEFAULT, client.getRoutesDatabase()); + } + connection = routeSelector.next(method); + if (!connection.isConnected()) { + connection.connect(client.getConnectTimeout(), client.getReadTimeout(), getTunnelConfig()); + client.getConnectionPool().maybeShare(connection); + client.getRoutesDatabase().connected(connection.getRoute()); + } else if (!connection.isSpdy()) { + connection.updateReadTimeout(client.getReadTimeout()); + } + connected(connection); + if (connection.getRoute().getProxy() != client.getProxy()) { + // Update the request line if the proxy changed; it may need a host name. + requestHeaders.getHeaders().setRequestLine(getRequestLine()); + } + } + + /** + * Called after a socket connection has been created or retrieved from the + * pool. Subclasses use this hook to get a reference to the TLS data. + */ + protected void connected(Connection connection) { + policy.setSelectedProxy(connection.getRoute().getProxy()); + connected = true; + } + + /** + * Called immediately before the transport transmits HTTP request headers. + * This is used to observe the sent time should the request be cached. + */ + public void writingRequestHeaders() { + if (sentRequestMillis != -1) { + throw new IllegalStateException(); + } + sentRequestMillis = System.currentTimeMillis(); + } + + /** + * @param body the response body, or null if it doesn't exist or isn't + * available. + */ + private void setResponse(ResponseHeaders headers, InputStream body) throws IOException { + if (this.responseBodyIn != null) { + throw new IllegalStateException(); + } + this.responseHeaders = headers; + if (body != null) { + initContentStream(body); + } + } + + boolean hasRequestBody() { + return method.equals("POST") || method.equals("PUT") || method.equals("PATCH"); + } + + /** Returns the request body or null if this request doesn't have a body. */ + public final OutputStream getRequestBody() { + if (responseSource == null) { + throw new IllegalStateException(); + } + return requestBodyOut; + } + + public final boolean hasResponse() { + return responseHeaders != null; + } + + public final RequestHeaders getRequestHeaders() { + return requestHeaders; + } + + public final ResponseHeaders getResponseHeaders() { + if (responseHeaders == null) { + throw new IllegalStateException(); + } + return responseHeaders; + } + + public final int getResponseCode() { + if (responseHeaders == null) { + throw new IllegalStateException(); + } + return responseHeaders.getHeaders().getResponseCode(); + } + + public final InputStream getResponseBody() { + if (responseHeaders == null) { + throw new IllegalStateException(); + } + return responseBodyIn; + } + + public final CacheResponse getCacheResponse() { + return cacheResponse; + } + + public final Connection getConnection() { + return connection; + } + + /** + * Returns true if {@code cacheResponse} is of the right type. This + * condition is necessary but not sufficient for the cached response to + * be used. + */ + protected boolean acceptCacheResponseType(CacheResponse cacheResponse) { + return true; + } + + private void maybeCache() throws IOException { + // Are we caching at all? + if (!policy.getUseCaches()) return; + OkResponseCache responseCache = client.getOkResponseCache(); + if (responseCache == null) return; + + HttpURLConnection connectionToCache = policy.getHttpConnectionToCache(); + + // Should we cache this response for this request? + if (!responseHeaders.isCacheable(requestHeaders)) { + responseCache.maybeRemove(connectionToCache.getRequestMethod(), uri); + return; + } + + // Offer this request to the cache. + cacheRequest = responseCache.put(uri, connectionToCache); + } + + /** + * Cause the socket connection to be released to the connection pool when + * it is no longer needed. If it is already unneeded, it will be pooled + * immediately. Otherwise the connection is held so that redirects can be + * handled by the same connection. + */ + public final void automaticallyReleaseConnectionToPool() { + automaticallyReleaseConnectionToPool = true; + if (connection != null && connectionReleased) { + client.getConnectionPool().recycle(connection); + connection = null; + } + } + + /** + * Releases this engine so that its resources may be either reused or + * closed. Also call {@link #automaticallyReleaseConnectionToPool} unless + * the connection will be used to follow a redirect. + */ + public final void release(boolean streamCanceled) { + // If the response body comes from the cache, close it. + if (responseBodyIn == cachedResponseBody) { + Util.closeQuietly(responseBodyIn); + } + + if (!connectionReleased && connection != null) { + connectionReleased = true; + + if (transport == null + || !transport.makeReusable(streamCanceled, requestBodyOut, responseTransferIn)) { + Util.closeQuietly(connection); + connection = null; + } else if (automaticallyReleaseConnectionToPool) { + client.getConnectionPool().recycle(connection); + connection = null; + } + } + } + + private void initContentStream(InputStream transferStream) throws IOException { + responseTransferIn = transferStream; + if (transparentGzip && responseHeaders.isContentEncodingGzip()) { + // If the response was transparently gzipped, remove the gzip header field + // so clients don't double decompress. http://b/3009828 + // + // Also remove the Content-Length in this case because it contains the + // length 528 of the gzipped response. This isn't terribly useful and is + // dangerous because 529 clients can query the content length, but not + // the content encoding. + responseHeaders.stripContentEncoding(); + responseHeaders.stripContentLength(); + responseBodyIn = new GZIPInputStream(transferStream); + } else { + responseBodyIn = transferStream; + } + } + + /** + * Returns true if the response must have a (possibly 0-length) body. + * See RFC 2616 section 4.3. + */ + public final boolean hasResponseBody() { + int responseCode = responseHeaders.getHeaders().getResponseCode(); + + // HEAD requests never yield a body regardless of the response headers. + if (method.equals("HEAD")) { + return false; + } + + if ((responseCode < HTTP_CONTINUE || responseCode >= 200) + && responseCode != HttpURLConnectionImpl.HTTP_NO_CONTENT + && responseCode != HttpURLConnectionImpl.HTTP_NOT_MODIFIED) { + return true; + } + + // If the Content-Length or Transfer-Encoding headers disagree with the + // response code, the response is malformed. For best compatibility, we + // honor the headers. + if (responseHeaders.getContentLength() != -1 || responseHeaders.isChunked()) { + return true; + } + + return false; + } + + /** + * Populates requestHeaders with defaults and cookies. + * + *

This client doesn't specify a default {@code Accept} header because it + * doesn't know what content types the application is interested in. + */ + private void prepareRawRequestHeaders() throws IOException { + requestHeaders.getHeaders().setRequestLine(getRequestLine()); + + if (requestHeaders.getUserAgent() == null) { + requestHeaders.setUserAgent(getDefaultUserAgent()); + } + + if (requestHeaders.getHost() == null) { + requestHeaders.setHost(getOriginAddress(policy.getURL())); + } + + if ((connection == null || connection.getHttpMinorVersion() != 0) + && requestHeaders.getConnection() == null) { + requestHeaders.setConnection("Keep-Alive"); + } + + if (requestHeaders.getAcceptEncoding() == null) { + transparentGzip = true; + requestHeaders.setAcceptEncoding("gzip"); + } + + if (hasRequestBody() && requestHeaders.getContentType() == null) { + requestHeaders.setContentType("application/x-www-form-urlencoded"); + } + + long ifModifiedSince = policy.getIfModifiedSince(); + if (ifModifiedSince != 0) { + requestHeaders.setIfModifiedSince(new Date(ifModifiedSince)); + } + + CookieHandler cookieHandler = client.getCookieHandler(); + if (cookieHandler != null) { + requestHeaders.addCookies( + cookieHandler.get(uri, requestHeaders.getHeaders().toMultimap(false))); + } + } + + /** + * Returns the request status line, like "GET / HTTP/1.1". This is exposed + * to the application by {@link HttpURLConnectionImpl#getHeaderFields}, so + * it needs to be set even if the transport is SPDY. + */ + String getRequestLine() { + String protocol = + (connection == null || connection.getHttpMinorVersion() != 0) ? "HTTP/1.1" : "HTTP/1.0"; + return method + " " + requestString() + " " + protocol; + } + + private String requestString() { + URL url = policy.getURL(); + if (includeAuthorityInRequestLine()) { + return url.toString(); + } else { + return requestPath(url); + } + } + + /** + * Returns the path to request, like the '/' in 'GET / HTTP/1.1'. Never + * empty, even if the request URL is. Includes the query component if it + * exists. + */ + public static String requestPath(URL url) { + String fileOnly = url.getFile(); + if (fileOnly == null) { + return "/"; + } else if (!fileOnly.startsWith("/")) { + return "/" + fileOnly; + } else { + return fileOnly; + } + } + + /** + * Returns true if the request line should contain the full URL with host + * and port (like "GET http://android.com/foo HTTP/1.1") or only the path + * (like "GET /foo HTTP/1.1"). + * + *

This is non-final because for HTTPS it's never necessary to supply the + * full URL, even if a proxy is in use. + */ + protected boolean includeAuthorityInRequestLine() { + return connection == null + ? policy.usingProxy() // A proxy was requested. + : connection.getRoute().getProxy().type() == Proxy.Type.HTTP; // A proxy was selected. + } + + public static String getDefaultUserAgent() { + String agent = System.getProperty("http.agent"); + return agent != null ? agent : ("Java" + System.getProperty("java.version")); + } + + public static String getOriginAddress(URL url) { + int port = url.getPort(); + String result = url.getHost(); + if (port > 0 && port != getDefaultPort(url.getProtocol())) { + result = result + ":" + port; + } + return result; + } + + /** + * Flushes the remaining request header and body, parses the HTTP response + * headers and starts reading the HTTP response body if it exists. + */ + public final void readResponse() throws IOException { + if (hasResponse()) { + responseHeaders.setResponseSource(responseSource); + return; + } + + if (responseSource == null) { + throw new IllegalStateException("readResponse() without sendRequest()"); + } + + if (!responseSource.requiresConnection()) { + return; + } + + if (sentRequestMillis == -1) { + if (requestBodyOut instanceof RetryableOutputStream) { + int contentLength = ((RetryableOutputStream) requestBodyOut).contentLength(); + requestHeaders.setContentLength(contentLength); + } + transport.writeRequestHeaders(); + } + + if (requestBodyOut != null) { + requestBodyOut.close(); + if (requestBodyOut instanceof RetryableOutputStream) { + transport.writeRequestBody((RetryableOutputStream) requestBodyOut); + } + } + + transport.flushRequest(); + + responseHeaders = transport.readResponseHeaders(); + responseHeaders.setLocalTimestamps(sentRequestMillis, System.currentTimeMillis()); + responseHeaders.setResponseSource(responseSource); + + if (responseSource == ResponseSource.CONDITIONAL_CACHE) { + if (cachedResponseHeaders.validate(responseHeaders)) { + release(false); + ResponseHeaders combinedHeaders = cachedResponseHeaders.combine(responseHeaders); + this.responseHeaders = combinedHeaders; + + // Update the cache after applying the combined headers but before initializing the content + // stream, otherwise the Content-Encoding header (if present) will be stripped from the + // combined headers and not end up in the cache file if transparent gzip compression is + // turned on. + OkResponseCache responseCache = client.getOkResponseCache(); + responseCache.trackConditionalCacheHit(); + responseCache.update(cacheResponse, policy.getHttpConnectionToCache()); + + initContentStream(cachedResponseBody); + return; + } else { + Util.closeQuietly(cachedResponseBody); + } + } + + if (hasResponseBody()) { + maybeCache(); // reentrant. this calls into user code which may call back into this! + } + + initContentStream(transport.getTransferStream(cacheRequest)); + } + + protected TunnelRequest getTunnelConfig() { + return null; + } + + public void receiveHeaders(RawHeaders headers) throws IOException { + CookieHandler cookieHandler = client.getCookieHandler(); + if (cookieHandler != null) { + cookieHandler.put(uri, headers.toMultimap(true)); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java new file mode 100644 index 0000000..c967830 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpTransport.java @@ -0,0 +1,497 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.Connection; +import com.squareup.okhttp.internal.AbstractOutputStream; +import com.squareup.okhttp.internal.Util; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.CacheRequest; +import java.net.ProtocolException; +import java.net.Socket; + +import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; + +public final class HttpTransport implements Transport { + /** + * The timeout to use while discarding a stream of input data. Since this is + * used for connection reuse, this timeout should be significantly less than + * the time it takes to establish a new connection. + */ + private static final int DISCARD_STREAM_TIMEOUT_MILLIS = 100; + + public static final int DEFAULT_CHUNK_LENGTH = 1024; + + private final HttpEngine httpEngine; + private final InputStream socketIn; + private final OutputStream socketOut; + + /** + * This stream buffers the request headers and the request body when their + * combined size is less than MAX_REQUEST_BUFFER_LENGTH. By combining them + * we can save socket writes, which in turn saves a packet transmission. + * This is socketOut if the request size is large or unknown. + */ + private OutputStream requestOut; + + public HttpTransport(HttpEngine httpEngine, OutputStream outputStream, InputStream inputStream) { + this.httpEngine = httpEngine; + this.socketOut = outputStream; + this.requestOut = outputStream; + this.socketIn = inputStream; + } + + @Override public OutputStream createRequestBody() throws IOException { + boolean chunked = httpEngine.requestHeaders.isChunked(); + if (!chunked + && httpEngine.policy.getChunkLength() > 0 + && httpEngine.connection.getHttpMinorVersion() != 0) { + httpEngine.requestHeaders.setChunked(); + chunked = true; + } + + // Stream a request body of unknown length. + if (chunked) { + int chunkLength = httpEngine.policy.getChunkLength(); + if (chunkLength == -1) { + chunkLength = DEFAULT_CHUNK_LENGTH; + } + writeRequestHeaders(); + return new ChunkedOutputStream(requestOut, chunkLength); + } + + // Stream a request body of a known length. + long fixedContentLength = httpEngine.policy.getFixedContentLength(); + if (fixedContentLength != -1) { + httpEngine.requestHeaders.setContentLength(fixedContentLength); + writeRequestHeaders(); + return new FixedLengthOutputStream(requestOut, fixedContentLength); + } + + long contentLength = httpEngine.requestHeaders.getContentLength(); + if (contentLength > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Use setFixedLengthStreamingMode() or " + + "setChunkedStreamingMode() for requests larger than 2 GiB."); + } + + // Buffer a request body of a known length. + if (contentLength != -1) { + writeRequestHeaders(); + return new RetryableOutputStream((int) contentLength); + } + + // Buffer a request body of an unknown length. Don't write request + // headers until the entire body is ready; otherwise we can't set the + // Content-Length header correctly. + return new RetryableOutputStream(); + } + + @Override public void flushRequest() throws IOException { + requestOut.flush(); + requestOut = socketOut; + } + + @Override public void writeRequestBody(RetryableOutputStream requestBody) throws IOException { + requestBody.writeToSocket(requestOut); + } + + /** + * Prepares the HTTP headers and sends them to the server. + * + *

For streaming requests with a body, headers must be prepared + * before the output stream has been written to. Otherwise + * the body would need to be buffered! + * + *

For non-streaming requests with a body, headers must be prepared + * after the output stream has been written to and closed. + * This ensures that the {@code Content-Length} header field receives the + * proper value. + */ + public void writeRequestHeaders() throws IOException { + httpEngine.writingRequestHeaders(); + RawHeaders headersToSend = httpEngine.requestHeaders.getHeaders(); + byte[] bytes = headersToSend.toBytes(); + requestOut.write(bytes); + } + + @Override public ResponseHeaders readResponseHeaders() throws IOException { + RawHeaders rawHeaders = RawHeaders.fromBytes(socketIn); + httpEngine.connection.setHttpMinorVersion(rawHeaders.getHttpMinorVersion()); + httpEngine.receiveHeaders(rawHeaders); + + ResponseHeaders headers = new ResponseHeaders(httpEngine.uri, rawHeaders); + headers.setTransport("http/1.1"); + return headers; + } + + public boolean makeReusable(boolean streamCanceled, OutputStream requestBodyOut, + InputStream responseBodyIn) { + if (streamCanceled) { + return false; + } + + // We cannot reuse sockets that have incomplete output. + if (requestBodyOut != null && !((AbstractOutputStream) requestBodyOut).isClosed()) { + return false; + } + + // If the request specified that the connection shouldn't be reused, don't reuse it. + if (httpEngine.requestHeaders.hasConnectionClose()) { + return false; + } + + // If the response specified that the connection shouldn't be reused, don't reuse it. + if (httpEngine.responseHeaders != null && httpEngine.responseHeaders.hasConnectionClose()) { + return false; + } + + if (responseBodyIn instanceof UnknownLengthHttpInputStream) { + return false; + } + + if (responseBodyIn != null) { + return discardStream(httpEngine, responseBodyIn); + } + + return true; + } + + /** + * Discards the response body so that the connection can be reused. This + * needs to be done judiciously, since it delays the current request in + * order to speed up a potential future request that may never occur. + * + *

A stream may be discarded to encourage response caching (a response + * cannot be cached unless it is consumed completely) or to enable connection + * reuse. + */ + private static boolean discardStream(HttpEngine httpEngine, InputStream responseBodyIn) { + Connection connection = httpEngine.connection; + if (connection == null) return false; + Socket socket = connection.getSocket(); + if (socket == null) return false; + try { + int socketTimeout = socket.getSoTimeout(); + socket.setSoTimeout(DISCARD_STREAM_TIMEOUT_MILLIS); + try { + Util.skipAll(responseBodyIn); + return true; + } finally { + socket.setSoTimeout(socketTimeout); + } + } catch (IOException e) { + return false; + } + } + + @Override public InputStream getTransferStream(CacheRequest cacheRequest) throws IOException { + if (!httpEngine.hasResponseBody()) { + return new FixedLengthInputStream(socketIn, cacheRequest, httpEngine, 0); + } + + if (httpEngine.responseHeaders.isChunked()) { + return new ChunkedInputStream(socketIn, cacheRequest, this); + } + + if (httpEngine.responseHeaders.getContentLength() != -1) { + return new FixedLengthInputStream(socketIn, cacheRequest, httpEngine, + httpEngine.responseHeaders.getContentLength()); + } + + // Wrap the input stream from the connection (rather than just returning + // "socketIn" directly here), so that we can control its use after the + // reference escapes. + return new UnknownLengthHttpInputStream(socketIn, cacheRequest, httpEngine); + } + + /** An HTTP body with a fixed length known in advance. */ + private static final class FixedLengthOutputStream extends AbstractOutputStream { + private final OutputStream socketOut; + private long bytesRemaining; + + private FixedLengthOutputStream(OutputStream socketOut, long bytesRemaining) { + this.socketOut = socketOut; + this.bytesRemaining = bytesRemaining; + } + + @Override public void write(byte[] buffer, int offset, int count) throws IOException { + checkNotClosed(); + checkOffsetAndCount(buffer.length, offset, count); + if (count > bytesRemaining) { + throw new ProtocolException("expected " + bytesRemaining + " bytes but received " + count); + } + socketOut.write(buffer, offset, count); + bytesRemaining -= count; + } + + @Override public void flush() throws IOException { + if (closed) { + return; // don't throw; this stream might have been closed on the caller's behalf + } + socketOut.flush(); + } + + @Override public void close() throws IOException { + if (closed) { + return; + } + closed = true; + if (bytesRemaining > 0) { + throw new ProtocolException("unexpected end of stream"); + } + } + } + + /** + * An HTTP body with alternating chunk sizes and chunk bodies. Chunks are + * buffered until {@code maxChunkLength} bytes are ready, at which point the + * chunk is written and the buffer is cleared. + */ + private static final class ChunkedOutputStream extends AbstractOutputStream { + private static final byte[] CRLF = { '\r', '\n' }; + private static final byte[] HEX_DIGITS = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; + private static final byte[] FINAL_CHUNK = new byte[] { '0', '\r', '\n', '\r', '\n' }; + + /** Scratch space for up to 8 hex digits, and then a constant CRLF. */ + private final byte[] hex = { 0, 0, 0, 0, 0, 0, 0, 0, '\r', '\n' }; + + private final OutputStream socketOut; + private final int maxChunkLength; + private final ByteArrayOutputStream bufferedChunk; + + private ChunkedOutputStream(OutputStream socketOut, int maxChunkLength) { + this.socketOut = socketOut; + this.maxChunkLength = Math.max(1, dataLength(maxChunkLength)); + this.bufferedChunk = new ByteArrayOutputStream(maxChunkLength); + } + + /** + * Returns the amount of data that can be transmitted in a chunk whose total + * length (data+headers) is {@code dataPlusHeaderLength}. This is presumably + * useful to match sizes with wire-protocol packets. + */ + private int dataLength(int dataPlusHeaderLength) { + int headerLength = 4; // "\r\n" after the size plus another "\r\n" after the data + for (int i = dataPlusHeaderLength - headerLength; i > 0; i >>= 4) { + headerLength++; + } + return dataPlusHeaderLength - headerLength; + } + + @Override public synchronized void write(byte[] buffer, int offset, int count) + throws IOException { + checkNotClosed(); + checkOffsetAndCount(buffer.length, offset, count); + + while (count > 0) { + int numBytesWritten; + + if (bufferedChunk.size() > 0 || count < maxChunkLength) { + // fill the buffered chunk and then maybe write that to the stream + numBytesWritten = Math.min(count, maxChunkLength - bufferedChunk.size()); + // TODO: skip unnecessary copies from buffer->bufferedChunk? + bufferedChunk.write(buffer, offset, numBytesWritten); + if (bufferedChunk.size() == maxChunkLength) { + writeBufferedChunkToSocket(); + } + } else { + // write a single chunk of size maxChunkLength to the stream + numBytesWritten = maxChunkLength; + writeHex(numBytesWritten); + socketOut.write(buffer, offset, numBytesWritten); + socketOut.write(CRLF); + } + + offset += numBytesWritten; + count -= numBytesWritten; + } + } + + /** + * Equivalent to, but cheaper than writing Integer.toHexString().getBytes() + * followed by CRLF. + */ + private void writeHex(int i) throws IOException { + int cursor = 8; + do { + hex[--cursor] = HEX_DIGITS[i & 0xf]; + } while ((i >>>= 4) != 0); + socketOut.write(hex, cursor, hex.length - cursor); + } + + @Override public synchronized void flush() throws IOException { + if (closed) { + return; // don't throw; this stream might have been closed on the caller's behalf + } + writeBufferedChunkToSocket(); + socketOut.flush(); + } + + @Override public synchronized void close() throws IOException { + if (closed) { + return; + } + closed = true; + writeBufferedChunkToSocket(); + socketOut.write(FINAL_CHUNK); + } + + private void writeBufferedChunkToSocket() throws IOException { + int size = bufferedChunk.size(); + if (size <= 0) { + return; + } + + writeHex(size); + bufferedChunk.writeTo(socketOut); + bufferedChunk.reset(); + socketOut.write(CRLF); + } + } + + /** An HTTP body with a fixed length specified in advance. */ + private static class FixedLengthInputStream extends AbstractHttpInputStream { + private long bytesRemaining; + + public FixedLengthInputStream(InputStream is, CacheRequest cacheRequest, HttpEngine httpEngine, + long length) throws IOException { + super(is, httpEngine, cacheRequest); + bytesRemaining = length; + if (bytesRemaining == 0) { + endOfInput(); + } + } + + @Override public int read(byte[] buffer, int offset, int count) throws IOException { + checkOffsetAndCount(buffer.length, offset, count); + checkNotClosed(); + if (bytesRemaining == 0) { + return -1; + } + int read = in.read(buffer, offset, (int) Math.min(count, bytesRemaining)); + if (read == -1) { + unexpectedEndOfInput(); // the server didn't supply the promised content length + throw new ProtocolException("unexpected end of stream"); + } + bytesRemaining -= read; + cacheWrite(buffer, offset, read); + if (bytesRemaining == 0) { + endOfInput(); + } + return read; + } + + @Override public int available() throws IOException { + checkNotClosed(); + return bytesRemaining == 0 ? 0 : (int) Math.min(in.available(), bytesRemaining); + } + + @Override public void close() throws IOException { + if (closed) { + return; + } + if (bytesRemaining != 0 && !discardStream(httpEngine, this)) { + unexpectedEndOfInput(); + } + closed = true; + } + } + + /** An HTTP body with alternating chunk sizes and chunk bodies. */ + private static class ChunkedInputStream extends AbstractHttpInputStream { + private static final int NO_CHUNK_YET = -1; + private final HttpTransport transport; + private int bytesRemainingInChunk = NO_CHUNK_YET; + private boolean hasMoreChunks = true; + + ChunkedInputStream(InputStream is, CacheRequest cacheRequest, HttpTransport transport) + throws IOException { + super(is, transport.httpEngine, cacheRequest); + this.transport = transport; + } + + @Override public int read(byte[] buffer, int offset, int count) throws IOException { + checkOffsetAndCount(buffer.length, offset, count); + checkNotClosed(); + + if (!hasMoreChunks) { + return -1; + } + if (bytesRemainingInChunk == 0 || bytesRemainingInChunk == NO_CHUNK_YET) { + readChunkSize(); + if (!hasMoreChunks) { + return -1; + } + } + int read = in.read(buffer, offset, Math.min(count, bytesRemainingInChunk)); + if (read == -1) { + unexpectedEndOfInput(); // the server didn't supply the promised chunk length + throw new IOException("unexpected end of stream"); + } + bytesRemainingInChunk -= read; + cacheWrite(buffer, offset, read); + return read; + } + + private void readChunkSize() throws IOException { + // read the suffix of the previous chunk + if (bytesRemainingInChunk != NO_CHUNK_YET) { + Util.readAsciiLine(in); + } + String chunkSizeString = Util.readAsciiLine(in); + int index = chunkSizeString.indexOf(";"); + if (index != -1) { + chunkSizeString = chunkSizeString.substring(0, index); + } + try { + bytesRemainingInChunk = Integer.parseInt(chunkSizeString.trim(), 16); + } catch (NumberFormatException e) { + throw new ProtocolException("Expected a hex chunk size but was " + chunkSizeString); + } + if (bytesRemainingInChunk == 0) { + hasMoreChunks = false; + RawHeaders rawResponseHeaders = httpEngine.responseHeaders.getHeaders(); + RawHeaders.readHeaders(transport.socketIn, rawResponseHeaders); + httpEngine.receiveHeaders(rawResponseHeaders); + endOfInput(); + } + } + + @Override public int available() throws IOException { + checkNotClosed(); + if (!hasMoreChunks || bytesRemainingInChunk == NO_CHUNK_YET) { + return 0; + } + return Math.min(in.available(), bytesRemainingInChunk); + } + + @Override public void close() throws IOException { + if (closed) { + return; + } + if (hasMoreChunks && !discardStream(httpEngine, this)) { + unexpectedEndOfInput(); + } + closed = true; + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java new file mode 100644 index 0000000..fb4a704 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java @@ -0,0 +1,590 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.Connection; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.internal.Platform; +import com.squareup.okhttp.internal.Util; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpRetryException; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.ProtocolException; +import java.net.Proxy; +import java.net.SocketPermission; +import java.net.URL; +import java.security.Permission; +import java.security.cert.CertificateException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.net.ssl.SSLHandshakeException; + +import static com.squareup.okhttp.internal.Util.getEffectivePort; + +/** + * This implementation uses HttpEngine to send requests and receive responses. + * This class may use multiple HttpEngines to follow redirects, authentication + * retries, etc. to retrieve the final response body. + * + *

What does 'connected' mean?

+ * This class inherits a {@code connected} field from the superclass. That field + * is not used to indicate not whether this URLConnection is + * currently connected. Instead, it indicates whether a connection has ever been + * attempted. Once a connection has been attempted, certain properties (request + * header fields, request method, etc.) are immutable. Test the {@code + * connection} field on this class for null/non-null to determine of an instance + * is currently connected to a server. + */ +public class HttpURLConnectionImpl extends HttpURLConnection implements Policy { + + /** Numeric status code, 307: Temporary Redirect. */ + public static final int HTTP_TEMP_REDIRECT = 307; + + /** + * How many redirects should we follow? Chrome follows 21; Firefox, curl, + * and wget follow 20; Safari follows 16; and HTTP/1.0 recommends 5. + */ + private static final int MAX_REDIRECTS = 20; + + final OkHttpClient client; + + private final RawHeaders rawRequestHeaders = new RawHeaders(); + /** Like the superclass field of the same name, but a long and available on all platforms. */ + private long fixedContentLength = -1; + private int redirectionCount; + protected IOException httpEngineFailure; + protected HttpEngine httpEngine; + private Proxy selectedProxy; + + public HttpURLConnectionImpl(URL url, OkHttpClient client) { + super(url); + this.client = client; + } + + @Override public final void connect() throws IOException { + initHttpEngine(); + boolean success; + do { + success = execute(false); + } while (!success); + } + + @Override public final void disconnect() { + // Calling disconnect() before a connection exists should have no effect. + if (httpEngine != null) { + // We close the response body here instead of in + // HttpEngine.release because that is called when input + // has been completely read from the underlying socket. + // However the response body can be a GZIPInputStream that + // still has unread data. + if (httpEngine.hasResponse()) { + Util.closeQuietly(httpEngine.getResponseBody()); + } + httpEngine.release(true); + } + } + + /** + * Returns an input stream from the server in the case of error such as the + * requested file (txt, htm, html) is not found on the remote server. + */ + @Override public final InputStream getErrorStream() { + try { + HttpEngine response = getResponse(); + if (response.hasResponseBody() && response.getResponseCode() >= HTTP_BAD_REQUEST) { + return response.getResponseBody(); + } + return null; + } catch (IOException e) { + return null; + } + } + + /** + * Returns the value of the field at {@code position}. Returns null if there + * are fewer than {@code position} headers. + */ + @Override public final String getHeaderField(int position) { + try { + return getResponse().getResponseHeaders().getHeaders().getValue(position); + } catch (IOException e) { + return null; + } + } + + /** + * Returns the value of the field corresponding to the {@code fieldName}, or + * null if there is no such field. If the field has multiple values, the + * last value is returned. + */ + @Override public final String getHeaderField(String fieldName) { + try { + RawHeaders rawHeaders = getResponse().getResponseHeaders().getHeaders(); + return fieldName == null ? rawHeaders.getStatusLine() : rawHeaders.get(fieldName); + } catch (IOException e) { + return null; + } + } + + @Override public final String getHeaderFieldKey(int position) { + try { + return getResponse().getResponseHeaders().getHeaders().getFieldName(position); + } catch (IOException e) { + return null; + } + } + + @Override public final Map> getHeaderFields() { + try { + return getResponse().getResponseHeaders().getHeaders().toMultimap(true); + } catch (IOException e) { + return Collections.emptyMap(); + } + } + + @Override public final Map> getRequestProperties() { + if (connected) { + throw new IllegalStateException( + "Cannot access request header fields after connection is set"); + } + return rawRequestHeaders.toMultimap(false); + } + + @Override public final InputStream getInputStream() throws IOException { + if (!doInput) { + throw new ProtocolException("This protocol does not support input"); + } + + HttpEngine response = getResponse(); + + // if the requested file does not exist, throw an exception formerly the + // Error page from the server was returned if the requested file was + // text/html this has changed to return FileNotFoundException for all + // file types + if (getResponseCode() >= HTTP_BAD_REQUEST) { + throw new FileNotFoundException(url.toString()); + } + + InputStream result = response.getResponseBody(); + if (result == null) { + throw new ProtocolException("No response body exists; responseCode=" + getResponseCode()); + } + return result; + } + + @Override public final OutputStream getOutputStream() throws IOException { + connect(); + + OutputStream out = httpEngine.getRequestBody(); + if (out == null) { + throw new ProtocolException("method does not support a request body: " + method); + } else if (httpEngine.hasResponse()) { + throw new ProtocolException("cannot write request body after response has been read"); + } + + return out; + } + + @Override public final Permission getPermission() throws IOException { + String hostName = getURL().getHost(); + int hostPort = Util.getEffectivePort(getURL()); + if (usingProxy()) { + InetSocketAddress proxyAddress = (InetSocketAddress) client.getProxy().address(); + hostName = proxyAddress.getHostName(); + hostPort = proxyAddress.getPort(); + } + return new SocketPermission(hostName + ":" + hostPort, "connect, resolve"); + } + + @Override public final String getRequestProperty(String field) { + if (field == null) { + return null; + } + return rawRequestHeaders.get(field); + } + + @Override public void setConnectTimeout(int timeoutMillis) { + client.setConnectTimeout(timeoutMillis, TimeUnit.MILLISECONDS); + } + + @Override public int getConnectTimeout() { + return client.getConnectTimeout(); + } + + @Override public void setReadTimeout(int timeoutMillis) { + client.setReadTimeout(timeoutMillis, TimeUnit.MILLISECONDS); + } + + @Override public int getReadTimeout() { + return client.getReadTimeout(); + } + + private void initHttpEngine() throws IOException { + if (httpEngineFailure != null) { + throw httpEngineFailure; + } else if (httpEngine != null) { + return; + } + + connected = true; + try { + if (doOutput) { + if (method.equals("GET")) { + // they are requesting a stream to write to. This implies a POST method + method = "POST"; + } else if (!method.equals("POST") && !method.equals("PUT") && !method.equals("PATCH")) { + // If the request method is neither POST nor PUT nor PATCH, then you're not writing + throw new ProtocolException(method + " does not support writing"); + } + } + httpEngine = newHttpEngine(method, rawRequestHeaders, null, null); + } catch (IOException e) { + httpEngineFailure = e; + throw e; + } + } + + @Override public HttpURLConnection getHttpConnectionToCache() { + return this; + } + + private HttpEngine newHttpEngine(String method, RawHeaders requestHeaders, + Connection connection, RetryableOutputStream requestBody) throws IOException { + if (url.getProtocol().equals("http")) { + return new HttpEngine(client, this, method, requestHeaders, connection, requestBody); + } else if (url.getProtocol().equals("https")) { + return new HttpsEngine(client, this, method, requestHeaders, connection, requestBody); + } else { + throw new AssertionError(); + } + } + + /** + * Aggressively tries to get the final HTTP response, potentially making + * many HTTP requests in the process in order to cope with redirects and + * authentication. + */ + private HttpEngine getResponse() throws IOException { + initHttpEngine(); + + if (httpEngine.hasResponse()) { + return httpEngine; + } + + while (true) { + if (!execute(true)) { + continue; + } + + Retry retry = processResponseHeaders(); + if (retry == Retry.NONE) { + httpEngine.automaticallyReleaseConnectionToPool(); + return httpEngine; + } + + // The first request was insufficient. Prepare for another... + String retryMethod = method; + OutputStream requestBody = httpEngine.getRequestBody(); + + // Although RFC 2616 10.3.2 specifies that a HTTP_MOVED_PERM + // redirect should keep the same method, Chrome, Firefox and the + // RI all issue GETs when following any redirect. + int responseCode = httpEngine.getResponseCode(); + if (responseCode == HTTP_MULT_CHOICE + || responseCode == HTTP_MOVED_PERM + || responseCode == HTTP_MOVED_TEMP + || responseCode == HTTP_SEE_OTHER) { + retryMethod = "GET"; + requestBody = null; + } + + if (requestBody != null && !(requestBody instanceof RetryableOutputStream)) { + throw new HttpRetryException("Cannot retry streamed HTTP body", responseCode); + } + + if (retry == Retry.DIFFERENT_CONNECTION) { + httpEngine.automaticallyReleaseConnectionToPool(); + } + + httpEngine.release(false); + + httpEngine = newHttpEngine(retryMethod, rawRequestHeaders, httpEngine.getConnection(), + (RetryableOutputStream) requestBody); + + if (requestBody == null) { + // Drop the Content-Length header when redirected from POST to GET. + httpEngine.getRequestHeaders().removeContentLength(); + } + } + } + + /** + * Sends a request and optionally reads a response. Returns true if the + * request was successfully executed, and false if the request can be + * retried. Throws an exception if the request failed permanently. + */ + private boolean execute(boolean readResponse) throws IOException { + try { + httpEngine.sendRequest(); + if (readResponse) { + httpEngine.readResponse(); + } + + return true; + } catch (IOException e) { + if (handleFailure(e)) { + return false; + } else { + throw e; + } + } + } + + /** + * Report and attempt to recover from {@code e}. Returns true if the HTTP + * engine was replaced and the request should be retried. Otherwise the + * failure is permanent. + */ + private boolean handleFailure(IOException e) throws IOException { + RouteSelector routeSelector = httpEngine.routeSelector; + if (routeSelector != null && httpEngine.connection != null) { + routeSelector.connectFailed(httpEngine.connection, e); + } + + OutputStream requestBody = httpEngine.getRequestBody(); + boolean canRetryRequestBody = requestBody == null + || requestBody instanceof RetryableOutputStream; + if (routeSelector == null && httpEngine.connection == null // No connection. + || routeSelector != null && !routeSelector.hasNext() // No more routes to attempt. + || !isRecoverable(e) + || !canRetryRequestBody) { + httpEngineFailure = e; + return false; + } + + httpEngine.release(true); + RetryableOutputStream retryableOutputStream = (RetryableOutputStream) requestBody; + httpEngine = newHttpEngine(method, rawRequestHeaders, null, retryableOutputStream); + httpEngine.routeSelector = routeSelector; // Keep the same routeSelector. + return true; + } + + private boolean isRecoverable(IOException e) { + // If the problem was a CertificateException from the X509TrustManager, + // do not retry, we didn't have an abrupt server initiated exception. + boolean sslFailure = + e instanceof SSLHandshakeException && e.getCause() instanceof CertificateException; + boolean protocolFailure = e instanceof ProtocolException; + return !sslFailure && !protocolFailure; + } + + public HttpEngine getHttpEngine() { + return httpEngine; + } + + enum Retry { + NONE, + SAME_CONNECTION, + DIFFERENT_CONNECTION + } + + /** + * Returns the retry action to take for the current response headers. The + * headers, proxy and target URL for this connection may be adjusted to + * prepare for a follow up request. + */ + private Retry processResponseHeaders() throws IOException { + Proxy selectedProxy = httpEngine.connection != null + ? httpEngine.connection.getRoute().getProxy() + : client.getProxy(); + final int responseCode = getResponseCode(); + switch (responseCode) { + case HTTP_PROXY_AUTH: + if (selectedProxy.type() != Proxy.Type.HTTP) { + throw new ProtocolException("Received HTTP_PROXY_AUTH (407) code while not using proxy"); + } + // fall-through + case HTTP_UNAUTHORIZED: + boolean credentialsFound = HttpAuthenticator.processAuthHeader(client.getAuthenticator(), + getResponseCode(), httpEngine.getResponseHeaders().getHeaders(), rawRequestHeaders, + selectedProxy, url); + return credentialsFound ? Retry.SAME_CONNECTION : Retry.NONE; + + case HTTP_MULT_CHOICE: + case HTTP_MOVED_PERM: + case HTTP_MOVED_TEMP: + case HTTP_SEE_OTHER: + case HTTP_TEMP_REDIRECT: + if (!getInstanceFollowRedirects()) { + return Retry.NONE; + } + if (++redirectionCount > MAX_REDIRECTS) { + throw new ProtocolException("Too many redirects: " + redirectionCount); + } + if (responseCode == HTTP_TEMP_REDIRECT && !method.equals("GET") && !method.equals("HEAD")) { + // "If the 307 status code is received in response to a request other than GET or HEAD, + // the user agent MUST NOT automatically redirect the request" + return Retry.NONE; + } + String location = getHeaderField("Location"); + if (location == null) { + return Retry.NONE; + } + URL previousUrl = url; + url = new URL(previousUrl, location); + if (!url.getProtocol().equals("https") && !url.getProtocol().equals("http")) { + return Retry.NONE; // Don't follow redirects to unsupported protocols. + } + boolean sameProtocol = previousUrl.getProtocol().equals(url.getProtocol()); + if (!sameProtocol && !client.getFollowProtocolRedirects()) { + return Retry.NONE; // This client doesn't follow redirects across protocols. + } + boolean sameHost = previousUrl.getHost().equals(url.getHost()); + boolean samePort = getEffectivePort(previousUrl) == getEffectivePort(url); + if (sameHost && samePort && sameProtocol) { + return Retry.SAME_CONNECTION; + } else { + return Retry.DIFFERENT_CONNECTION; + } + + default: + return Retry.NONE; + } + } + + /** @see java.net.HttpURLConnection#setFixedLengthStreamingMode(int) */ + @Override public final long getFixedContentLength() { + return fixedContentLength; + } + + @Override public final int getChunkLength() { + return chunkLength; + } + + @Override public final boolean usingProxy() { + if (selectedProxy != null) { + return isValidNonDirectProxy(selectedProxy); + } + + // This behavior is a bit odd (but is probably justified by the + // oddness of the APIs involved). Before a connection is established, + // this method will return true only if this connection was explicitly + // opened with a Proxy. We don't attempt to query the ProxySelector + // at all. + return isValidNonDirectProxy(client.getProxy()); + } + + private static boolean isValidNonDirectProxy(Proxy proxy) { + return proxy != null && proxy.type() != Proxy.Type.DIRECT; + } + + @Override public String getResponseMessage() throws IOException { + return getResponse().getResponseHeaders().getHeaders().getResponseMessage(); + } + + @Override public final int getResponseCode() throws IOException { + return getResponse().getResponseCode(); + } + + @Override public final void setRequestProperty(String field, String newValue) { + if (connected) { + throw new IllegalStateException("Cannot set request property after connection is made"); + } + if (field == null) { + throw new NullPointerException("field == null"); + } + if (newValue == null) { + // Silently ignore null header values for backwards compatibility with older + // android versions as well as with other URLConnection implementations. + // + // Some implementations send a malformed HTTP header when faced with + // such requests, we respect the spec and ignore the header. + Platform.get().logW("Ignoring header " + field + " because its value was null."); + return; + } + + if ("X-Android-Transports".equals(field)) { + setTransports(newValue, false /* append */); + } else { + rawRequestHeaders.set(field, newValue); + } + } + + @Override public final void addRequestProperty(String field, String value) { + if (connected) { + throw new IllegalStateException("Cannot add request property after connection is made"); + } + if (field == null) { + throw new NullPointerException("field == null"); + } + if (value == null) { + // Silently ignore null header values for backwards compatibility with older + // android versions as well as with other URLConnection implementations. + // + // Some implementations send a malformed HTTP header when faced with + // such requests, we respect the spec and ignore the header. + Platform.get().logW("Ignoring header " + field + " because its value was null."); + return; + } + + if ("X-Android-Transports".equals(field)) { + setTransports(value, true /* append */); + } else { + rawRequestHeaders.add(field, value); + } + } + + /* + * Splits and validates a comma-separated string of transports. + * When append == false, we require that the transport list contains "http/1.1". + */ + private void setTransports(String transportsString, boolean append) { + List transportsList = new ArrayList(); + if (append) { + transportsList.addAll(client.getTransports()); + } + for (String transport : transportsString.split(",", -1)) { + transportsList.add(transport); + } + client.setTransports(transportsList); + } + + @Override public void setFixedLengthStreamingMode(int contentLength) { + setFixedLengthStreamingMode((long) contentLength); + } + + // @Override Don't override: this overload method doesn't exist prior to Java 1.7. + public void setFixedLengthStreamingMode(long contentLength) { + if (super.connected) throw new IllegalStateException("Already connected"); + if (chunkLength > 0) throw new IllegalStateException("Already in chunked mode"); + if (contentLength < 0) throw new IllegalArgumentException("contentLength < 0"); + this.fixedContentLength = contentLength; + super.fixedContentLength = (int) Math.min(contentLength, Integer.MAX_VALUE); + } + + @Override public final void setSelectedProxy(Proxy proxy) { + this.selectedProxy = proxy; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java new file mode 100644 index 0000000..2bc1d68 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsEngine.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.Connection; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.TunnelRequest; +import java.io.IOException; +import java.net.CacheResponse; +import java.net.SecureCacheResponse; +import java.net.URL; +import javax.net.ssl.SSLSocket; + +import static com.squareup.okhttp.internal.Util.getEffectivePort; + +public final class HttpsEngine extends HttpEngine { + /** + * Stash of HttpsEngine.connection.socket to implement requests like {@code + * HttpsURLConnection#getCipherSuite} even after the connection has been + * recycled. + */ + private SSLSocket sslSocket; + + public HttpsEngine(OkHttpClient client, Policy policy, String method, RawHeaders requestHeaders, + Connection connection, RetryableOutputStream requestBody) throws IOException { + super(client, policy, method, requestHeaders, connection, requestBody); + this.sslSocket = connection != null ? (SSLSocket) connection.getSocket() : null; + } + + @Override protected void connected(Connection connection) { + this.sslSocket = (SSLSocket) connection.getSocket(); + super.connected(connection); + } + + @Override protected boolean acceptCacheResponseType(CacheResponse cacheResponse) { + return cacheResponse instanceof SecureCacheResponse; + } + + @Override protected boolean includeAuthorityInRequestLine() { + // Even if there is a proxy, it isn't involved. Always request just the path. + return false; + } + + public SSLSocket getSslSocket() { + return sslSocket; + } + + @Override protected TunnelRequest getTunnelConfig() { + String userAgent = requestHeaders.getUserAgent(); + if (userAgent == null) { + userAgent = getDefaultUserAgent(); + } + + URL url = policy.getURL(); + return new TunnelRequest(url.getHost(), getEffectivePort(url), userAgent, + requestHeaders.getProxyAuthorization()); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java new file mode 100644 index 0000000..e64fb98 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/HttpsURLConnectionImpl.java @@ -0,0 +1,366 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package com.squareup.okhttp.internal.http; + +import android.annotation.SuppressLint; +import com.squareup.okhttp.OkHttpClient; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.ProtocolException; +import java.net.SecureCacheResponse; +import java.net.URL; +import java.security.Permission; +import java.security.Principal; +import java.security.cert.Certificate; +import java.util.List; +import java.util.Map; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLPeerUnverifiedException; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +public final class HttpsURLConnectionImpl extends HttpsURLConnection { + + /** HttpUrlConnectionDelegate allows reuse of HttpURLConnectionImpl. */ + private final HttpUrlConnectionDelegate delegate; + + public HttpsURLConnectionImpl(URL url, OkHttpClient client) { + super(url); + delegate = new HttpUrlConnectionDelegate(url, client); + } + + @Override public String getCipherSuite() { + SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); + if (cacheResponse != null) { + return cacheResponse.getCipherSuite(); + } + SSLSocket sslSocket = getSslSocket(); + if (sslSocket != null) { + return sslSocket.getSession().getCipherSuite(); + } + return null; + } + + @Override public Certificate[] getLocalCertificates() { + SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); + if (cacheResponse != null) { + List result = cacheResponse.getLocalCertificateChain(); + return result != null ? result.toArray(new Certificate[result.size()]) : null; + } + SSLSocket sslSocket = getSslSocket(); + if (sslSocket != null) { + return sslSocket.getSession().getLocalCertificates(); + } + return null; + } + + @Override public Certificate[] getServerCertificates() throws SSLPeerUnverifiedException { + SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); + if (cacheResponse != null) { + List result = cacheResponse.getServerCertificateChain(); + return result != null ? result.toArray(new Certificate[result.size()]) : null; + } + SSLSocket sslSocket = getSslSocket(); + if (sslSocket != null) { + return sslSocket.getSession().getPeerCertificates(); + } + return null; + } + + @Override public Principal getPeerPrincipal() throws SSLPeerUnverifiedException { + SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); + if (cacheResponse != null) { + return cacheResponse.getPeerPrincipal(); + } + SSLSocket sslSocket = getSslSocket(); + if (sslSocket != null) { + return sslSocket.getSession().getPeerPrincipal(); + } + return null; + } + + @Override public Principal getLocalPrincipal() { + SecureCacheResponse cacheResponse = delegate.getSecureCacheResponse(); + if (cacheResponse != null) { + return cacheResponse.getLocalPrincipal(); + } + SSLSocket sslSocket = getSslSocket(); + if (sslSocket != null) { + return sslSocket.getSession().getLocalPrincipal(); + } + return null; + } + + public HttpEngine getHttpEngine() { + return delegate.getHttpEngine(); + } + + private SSLSocket getSslSocket() { + if (delegate.httpEngine == null || !delegate.httpEngine.connected) { + throw new IllegalStateException("Connection has not yet been established"); + } + return delegate.httpEngine instanceof HttpsEngine + ? ((HttpsEngine) delegate.httpEngine).getSslSocket() + : null; // Not HTTPS! Probably an https:// to http:// redirect. + } + + @Override public void disconnect() { + delegate.disconnect(); + } + + @Override public InputStream getErrorStream() { + return delegate.getErrorStream(); + } + + @Override public String getRequestMethod() { + return delegate.getRequestMethod(); + } + + @Override public int getResponseCode() throws IOException { + return delegate.getResponseCode(); + } + + @Override public String getResponseMessage() throws IOException { + return delegate.getResponseMessage(); + } + + @Override public void setRequestMethod(String method) throws ProtocolException { + delegate.setRequestMethod(method); + } + + @Override public boolean usingProxy() { + return delegate.usingProxy(); + } + + @Override public boolean getInstanceFollowRedirects() { + return delegate.getInstanceFollowRedirects(); + } + + @Override public void setInstanceFollowRedirects(boolean followRedirects) { + delegate.setInstanceFollowRedirects(followRedirects); + } + + @Override public void connect() throws IOException { + connected = true; + delegate.connect(); + } + + @Override public boolean getAllowUserInteraction() { + return delegate.getAllowUserInteraction(); + } + + @Override public Object getContent() throws IOException { + return delegate.getContent(); + } + + @SuppressWarnings("unchecked") // Spec does not generify + @Override public Object getContent(Class[] types) throws IOException { + return delegate.getContent(types); + } + + @Override public String getContentEncoding() { + return delegate.getContentEncoding(); + } + + @Override public int getContentLength() { + return delegate.getContentLength(); + } + + @Override public String getContentType() { + return delegate.getContentType(); + } + + @Override public long getDate() { + return delegate.getDate(); + } + + @Override public boolean getDefaultUseCaches() { + return delegate.getDefaultUseCaches(); + } + + @Override public boolean getDoInput() { + return delegate.getDoInput(); + } + + @Override public boolean getDoOutput() { + return delegate.getDoOutput(); + } + + @Override public long getExpiration() { + return delegate.getExpiration(); + } + + @Override public String getHeaderField(int pos) { + return delegate.getHeaderField(pos); + } + + @Override public Map> getHeaderFields() { + return delegate.getHeaderFields(); + } + + @Override public Map> getRequestProperties() { + return delegate.getRequestProperties(); + } + + @Override public void addRequestProperty(String field, String newValue) { + delegate.addRequestProperty(field, newValue); + } + + @Override public String getHeaderField(String key) { + return delegate.getHeaderField(key); + } + + @Override public long getHeaderFieldDate(String field, long defaultValue) { + return delegate.getHeaderFieldDate(field, defaultValue); + } + + @Override public int getHeaderFieldInt(String field, int defaultValue) { + return delegate.getHeaderFieldInt(field, defaultValue); + } + + @Override public String getHeaderFieldKey(int position) { + return delegate.getHeaderFieldKey(position); + } + + @Override public long getIfModifiedSince() { + return delegate.getIfModifiedSince(); + } + + @Override public InputStream getInputStream() throws IOException { + return delegate.getInputStream(); + } + + @Override public long getLastModified() { + return delegate.getLastModified(); + } + + @Override public OutputStream getOutputStream() throws IOException { + return delegate.getOutputStream(); + } + + @Override public Permission getPermission() throws IOException { + return delegate.getPermission(); + } + + @Override public String getRequestProperty(String field) { + return delegate.getRequestProperty(field); + } + + @Override public URL getURL() { + return delegate.getURL(); + } + + @Override public boolean getUseCaches() { + return delegate.getUseCaches(); + } + + @Override public void setAllowUserInteraction(boolean newValue) { + delegate.setAllowUserInteraction(newValue); + } + + @Override public void setDefaultUseCaches(boolean newValue) { + delegate.setDefaultUseCaches(newValue); + } + + @Override public void setDoInput(boolean newValue) { + delegate.setDoInput(newValue); + } + + @Override public void setDoOutput(boolean newValue) { + delegate.setDoOutput(newValue); + } + + @Override public void setIfModifiedSince(long newValue) { + delegate.setIfModifiedSince(newValue); + } + + @Override public void setRequestProperty(String field, String newValue) { + delegate.setRequestProperty(field, newValue); + } + + @Override public void setUseCaches(boolean newValue) { + delegate.setUseCaches(newValue); + } + + @Override public void setConnectTimeout(int timeoutMillis) { + delegate.setConnectTimeout(timeoutMillis); + } + + @Override public int getConnectTimeout() { + return delegate.getConnectTimeout(); + } + + @Override public void setReadTimeout(int timeoutMillis) { + delegate.setReadTimeout(timeoutMillis); + } + + @Override public int getReadTimeout() { + return delegate.getReadTimeout(); + } + + @Override public String toString() { + return delegate.toString(); + } + + @Override public void setFixedLengthStreamingMode(int contentLength) { + delegate.setFixedLengthStreamingMode(contentLength); + } + + @Override public void setChunkedStreamingMode(int chunkLength) { + delegate.setChunkedStreamingMode(chunkLength); + } + + @Override public void setHostnameVerifier(HostnameVerifier hostnameVerifier) { + delegate.client.setHostnameVerifier(hostnameVerifier); + } + + @Override public HostnameVerifier getHostnameVerifier() { + return delegate.client.getHostnameVerifier(); + } + + @Override public void setSSLSocketFactory(SSLSocketFactory sslSocketFactory) { + delegate.client.setSslSocketFactory(sslSocketFactory); + } + + @Override public SSLSocketFactory getSSLSocketFactory() { + return delegate.client.getSslSocketFactory(); + } + + @SuppressLint("NewApi") + @Override public void setFixedLengthStreamingMode(long contentLength) { + delegate.setFixedLengthStreamingMode(contentLength); + } + + private final class HttpUrlConnectionDelegate extends HttpURLConnectionImpl { + private HttpUrlConnectionDelegate(URL url, OkHttpClient client) { + super(url, client); + } + + @Override public HttpURLConnection getHttpConnectionToCache() { + return HttpsURLConnectionImpl.this; + } + + public SecureCacheResponse getSecureCacheResponse() { + return httpEngine instanceof HttpsEngine + ? (SecureCacheResponse) httpEngine.getCacheResponse() + : null; + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java new file mode 100644 index 0000000..5335c2b --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/OkResponseCacheAdapter.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.OkResponseCache; +import com.squareup.okhttp.ResponseSource; +import java.io.IOException; +import java.net.CacheRequest; +import java.net.CacheResponse; +import java.net.HttpURLConnection; +import java.net.ResponseCache; +import java.net.URI; +import java.net.URLConnection; +import java.util.List; +import java.util.Map; + +public final class OkResponseCacheAdapter implements OkResponseCache { + private final ResponseCache responseCache; + public OkResponseCacheAdapter(ResponseCache responseCache) { + this.responseCache = responseCache; + } + + @Override public CacheResponse get(URI uri, String requestMethod, + Map> requestHeaders) throws IOException { + return responseCache.get(uri, requestMethod, requestHeaders); + } + + @Override public CacheRequest put(URI uri, URLConnection urlConnection) throws IOException { + return responseCache.put(uri, urlConnection); + } + + @Override public void maybeRemove(String requestMethod, URI uri) throws IOException { + } + + @Override public void update(CacheResponse conditionalCacheHit, HttpURLConnection connection) + throws IOException { + } + + @Override public void trackConditionalCacheHit() { + } + + @Override public void trackResponse(ResponseSource source) { + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java new file mode 100644 index 0000000..0a29d4b --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Policy.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.http; + +import java.net.HttpURLConnection; +import java.net.Proxy; +import java.net.URL; + +public interface Policy { + /** Returns true if HTTP response caches should be used. */ + boolean getUseCaches(); + + /** Returns the HttpURLConnection instance to store in the cache. */ + HttpURLConnection getHttpConnectionToCache(); + + /** Returns the current destination URL, possibly a redirect. */ + URL getURL(); + + /** Returns the If-Modified-Since timestamp, or 0 if none is set. */ + long getIfModifiedSince(); + + /** Returns true if a non-direct proxy is specified. */ + boolean usingProxy(); + + /** @see java.net.HttpURLConnection#setChunkedStreamingMode(int) */ + int getChunkLength(); + + /** @see java.net.HttpURLConnection#setFixedLengthStreamingMode(int) */ + long getFixedContentLength(); + + /** + * Sets the current proxy that this connection is using. + * @see java.net.HttpURLConnection#usingProxy + */ + void setSelectedProxy(Proxy proxy); +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java new file mode 100644 index 0000000..8b45320 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RawHeaders.java @@ -0,0 +1,447 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.internal.Util; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.ProtocolException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * The HTTP status and unparsed header fields of a single HTTP message. Values + * are represented as uninterpreted strings; use {@link RequestHeaders} and + * {@link ResponseHeaders} for interpreted headers. This class maintains the + * order of the header fields within the HTTP message. + * + *

This class tracks fields line-by-line. A field with multiple comma- + * separated values on the same line will be treated as a field with a single + * value by this class. It is the caller's responsibility to detect and split + * on commas if their field permits multiple values. This simplifies use of + * single-valued fields whose values routinely contain commas, such as cookies + * or dates. + * + *

This class trims whitespace from values. It never returns values with + * leading or trailing whitespace. + */ +public final class RawHeaders { + private static final Comparator FIELD_NAME_COMPARATOR = new Comparator() { + // @FindBugsSuppressWarnings("ES_COMPARING_PARAMETER_STRING_WITH_EQ") + @Override public int compare(String a, String b) { + if (a == b) { + return 0; + } else if (a == null) { + return -1; + } else if (b == null) { + return 1; + } else { + return String.CASE_INSENSITIVE_ORDER.compare(a, b); + } + } + }; + + private final List namesAndValues = new ArrayList(20); + private String requestLine; + private String statusLine; + private int httpMinorVersion = 1; + private int responseCode = -1; + private String responseMessage; + + public RawHeaders() { + } + + public RawHeaders(RawHeaders copyFrom) { + namesAndValues.addAll(copyFrom.namesAndValues); + requestLine = copyFrom.requestLine; + statusLine = copyFrom.statusLine; + httpMinorVersion = copyFrom.httpMinorVersion; + responseCode = copyFrom.responseCode; + responseMessage = copyFrom.responseMessage; + } + + /** Sets the request line (like "GET / HTTP/1.1"). */ + public void setRequestLine(String requestLine) { + requestLine = requestLine.trim(); + this.requestLine = requestLine; + } + + /** Sets the response status line (like "HTTP/1.0 200 OK"). */ + public void setStatusLine(String statusLine) throws IOException { + // H T T P / 1 . 1 2 0 0 T e m p o r a r y R e d i r e c t + // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 + if (this.responseMessage != null) { + throw new IllegalStateException("statusLine is already set"); + } + // We allow empty message without leading white space since some servers + // do not send the white space when the message is empty. + boolean hasMessage = statusLine.length() > 13; + if (!statusLine.startsWith("HTTP/1.") + || statusLine.length() < 12 + || statusLine.charAt(8) != ' ' + || (hasMessage && statusLine.charAt(12) != ' ')) { + throw new ProtocolException("Unexpected status line: " + statusLine); + } + int httpMinorVersion = statusLine.charAt(7) - '0'; + if (httpMinorVersion < 0 || httpMinorVersion > 9) { + throw new ProtocolException("Unexpected status line: " + statusLine); + } + int responseCode; + try { + responseCode = Integer.parseInt(statusLine.substring(9, 12)); + } catch (NumberFormatException e) { + throw new ProtocolException("Unexpected status line: " + statusLine); + } + this.responseMessage = hasMessage ? statusLine.substring(13) : ""; + this.responseCode = responseCode; + this.statusLine = statusLine; + this.httpMinorVersion = httpMinorVersion; + } + + /** + * @param method like "GET", "POST", "HEAD", etc. + * @param path like "/foo/bar.html" + * @param version like "HTTP/1.1" + * @param host like "www.android.com:1234" + * @param scheme like "https" + */ + public void addSpdyRequestHeaders(String method, String path, String version, String host, + String scheme) { + // TODO: populate the statusLine for the client's benefit? + add(":method", method); + add(":scheme", scheme); + add(":path", path); + add(":version", version); + add(":host", host); + } + + public String getStatusLine() { + return statusLine; + } + + /** + * Returns the status line's HTTP minor version. This returns 0 for HTTP/1.0 + * and 1 for HTTP/1.1. This returns 1 if the HTTP version is unknown. + */ + public int getHttpMinorVersion() { + return httpMinorVersion != -1 ? httpMinorVersion : 1; + } + + /** Returns the HTTP status code or -1 if it is unknown. */ + public int getResponseCode() { + return responseCode; + } + + /** Returns the HTTP status message or null if it is unknown. */ + public String getResponseMessage() { + return responseMessage; + } + + /** + * Add an HTTP header line containing a field name, a literal colon, and a + * value. This works around empty header names and header names that start + * with a colon (created by old broken SPDY versions of the response cache). + */ + public void addLine(String line) { + int index = line.indexOf(":", 1); + if (index != -1) { + addLenient(line.substring(0, index), line.substring(index + 1)); + } else if (line.startsWith(":")) { + addLenient("", line.substring(1)); // Empty header name. + } else { + addLenient("", line); // No header name. + } + } + + /** Add a field with the specified value. */ + public void add(String fieldName, String value) { + if (fieldName == null) throw new IllegalArgumentException("fieldname == null"); + if (value == null) throw new IllegalArgumentException("value == null"); + if (fieldName.length() == 0 || fieldName.indexOf('\0') != -1 || value.indexOf('\0') != -1) { + throw new IllegalArgumentException("Unexpected header: " + fieldName + ": " + value); + } + addLenient(fieldName, value); + } + + /** + * Add a field with the specified value without any validation. Only + * appropriate for headers from the remote peer. + */ + private void addLenient(String fieldName, String value) { + namesAndValues.add(fieldName); + namesAndValues.add(value.trim()); + } + + public void removeAll(String fieldName) { + for (int i = 0; i < namesAndValues.size(); i += 2) { + if (fieldName.equalsIgnoreCase(namesAndValues.get(i))) { + namesAndValues.remove(i); // field name + namesAndValues.remove(i); // value + } + } + } + + public void addAll(String fieldName, List headerFields) { + for (String value : headerFields) { + add(fieldName, value); + } + } + + /** + * Set a field with the specified value. If the field is not found, it is + * added. If the field is found, the existing values are replaced. + */ + public void set(String fieldName, String value) { + removeAll(fieldName); + add(fieldName, value); + } + + /** Returns the number of field values. */ + public int length() { + return namesAndValues.size() / 2; + } + + /** Returns the field at {@code position} or null if that is out of range. */ + public String getFieldName(int index) { + int fieldNameIndex = index * 2; + if (fieldNameIndex < 0 || fieldNameIndex >= namesAndValues.size()) { + return null; + } + return namesAndValues.get(fieldNameIndex); + } + + /** Returns an immutable case-insensitive set of header names. */ + public Set names() { + TreeSet result = new TreeSet(String.CASE_INSENSITIVE_ORDER); + for (int i = 0; i < length(); i++) { + result.add(getFieldName(i)); + } + return Collections.unmodifiableSet(result); + } + + /** Returns the value at {@code index} or null if that is out of range. */ + public String getValue(int index) { + int valueIndex = index * 2 + 1; + if (valueIndex < 0 || valueIndex >= namesAndValues.size()) { + return null; + } + return namesAndValues.get(valueIndex); + } + + /** Returns the last value corresponding to the specified field, or null. */ + public String get(String fieldName) { + for (int i = namesAndValues.size() - 2; i >= 0; i -= 2) { + if (fieldName.equalsIgnoreCase(namesAndValues.get(i))) { + return namesAndValues.get(i + 1); + } + } + return null; + } + + /** Returns an immutable list of the header values for {@code name}. */ + public List values(String name) { + List result = null; + for (int i = 0; i < length(); i++) { + if (name.equalsIgnoreCase(getFieldName(i))) { + if (result == null) result = new ArrayList(2); + result.add(getValue(i)); + } + } + return result != null + ? Collections.unmodifiableList(result) + : Collections.emptyList(); + } + + /** @param fieldNames a case-insensitive set of HTTP header field names. */ + public RawHeaders getAll(Set fieldNames) { + RawHeaders result = new RawHeaders(); + for (int i = 0; i < namesAndValues.size(); i += 2) { + String fieldName = namesAndValues.get(i); + if (fieldNames.contains(fieldName)) { + result.add(fieldName, namesAndValues.get(i + 1)); + } + } + return result; + } + + /** Returns bytes of a request header for sending on an HTTP transport. */ + public byte[] toBytes() throws UnsupportedEncodingException { + StringBuilder result = new StringBuilder(256); + result.append(requestLine).append("\r\n"); + for (int i = 0; i < namesAndValues.size(); i += 2) { + result.append(namesAndValues.get(i)) + .append(": ") + .append(namesAndValues.get(i + 1)) + .append("\r\n"); + } + result.append("\r\n"); + return result.toString().getBytes("ISO-8859-1"); + } + + /** Parses bytes of a response header from an HTTP transport. */ + public static RawHeaders fromBytes(InputStream in) throws IOException { + RawHeaders headers; + do { + headers = new RawHeaders(); + headers.setStatusLine(Util.readAsciiLine(in)); + readHeaders(in, headers); + } while (headers.getResponseCode() == HttpEngine.HTTP_CONTINUE); + return headers; + } + + /** Reads headers or trailers into {@code out}. */ + public static void readHeaders(InputStream in, RawHeaders out) throws IOException { + // parse the result headers until the first blank line + String line; + while ((line = Util.readAsciiLine(in)).length() != 0) { + out.addLine(line); + } + } + + /** + * Returns an immutable map containing each field to its list of values. The + * status line is mapped to null. + */ + public Map> toMultimap(boolean response) { + Map> result = new TreeMap>(FIELD_NAME_COMPARATOR); + for (int i = 0; i < namesAndValues.size(); i += 2) { + String fieldName = namesAndValues.get(i); + String value = namesAndValues.get(i + 1); + + List allValues = new ArrayList(); + List otherValues = result.get(fieldName); + if (otherValues != null) { + allValues.addAll(otherValues); + } + allValues.add(value); + result.put(fieldName, Collections.unmodifiableList(allValues)); + } + if (response && statusLine != null) { + result.put(null, Collections.unmodifiableList(Collections.singletonList(statusLine))); + } else if (requestLine != null) { + result.put(null, Collections.unmodifiableList(Collections.singletonList(requestLine))); + } + return Collections.unmodifiableMap(result); + } + + /** + * Creates a new instance from the given map of fields to values. If + * present, the null field's last element will be used to set the status + * line. + */ + public static RawHeaders fromMultimap(Map> map, boolean response) + throws IOException { + if (!response) throw new UnsupportedOperationException(); + RawHeaders result = new RawHeaders(); + for (Entry> entry : map.entrySet()) { + String fieldName = entry.getKey(); + List values = entry.getValue(); + if (fieldName != null) { + for (String value : values) { + result.addLenient(fieldName, value); + } + } else if (!values.isEmpty()) { + result.setStatusLine(values.get(values.size() - 1)); + } + } + return result; + } + + /** + * Returns a list of alternating names and values. Names are all lower case. + * No names are repeated. If any name has multiple values, they are + * concatenated using "\0" as a delimiter. + */ + public List toNameValueBlock() { + Set names = new HashSet(); + List result = new ArrayList(); + for (int i = 0; i < namesAndValues.size(); i += 2) { + String name = namesAndValues.get(i).toLowerCase(Locale.US); + String value = namesAndValues.get(i + 1); + + // Drop headers that are forbidden when layering HTTP over SPDY. + if (name.equals("connection") + || name.equals("host") + || name.equals("keep-alive") + || name.equals("proxy-connection") + || name.equals("transfer-encoding")) { + continue; + } + + // If we haven't seen this name before, add the pair to the end of the list... + if (names.add(name)) { + result.add(name); + result.add(value); + continue; + } + + // ...otherwise concatenate the existing values and this value. + for (int j = 0; j < result.size(); j += 2) { + if (name.equals(result.get(j))) { + result.set(j + 1, result.get(j + 1) + "\0" + value); + break; + } + } + } + return result; + } + + /** Returns headers for a name value block containing a SPDY response. */ + public static RawHeaders fromNameValueBlock(List nameValueBlock) throws IOException { + if (nameValueBlock.size() % 2 != 0) { + throw new IllegalArgumentException("Unexpected name value block: " + nameValueBlock); + } + String status = null; + String version = null; + RawHeaders result = new RawHeaders(); + for (int i = 0; i < nameValueBlock.size(); i += 2) { + String name = nameValueBlock.get(i); + String values = nameValueBlock.get(i + 1); + for (int start = 0; start < values.length(); ) { + int end = values.indexOf('\0', start); + if (end == -1) { + end = values.length(); + } + String value = values.substring(start, end); + if (":status".equals(name)) { + status = value; + } else if (":version".equals(name)) { + version = value; + } else { + result.namesAndValues.add(name); + result.namesAndValues.add(value); + } + start = end + 1; + } + } + if (status == null) throw new ProtocolException("Expected ':status' header not present"); + if (version == null) throw new ProtocolException("Expected ':version' header not present"); + result.setStatusLine(version + " " + status); + return result; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java new file mode 100644 index 0000000..71c3cd0 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RequestHeaders.java @@ -0,0 +1,317 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import java.net.URI; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** Parsed HTTP request headers. */ +public final class RequestHeaders { + private final URI uri; + private final RawHeaders headers; + + /** Don't use a cache to satisfy this request. */ + private boolean noCache; + private int maxAgeSeconds = -1; + private int maxStaleSeconds = -1; + private int minFreshSeconds = -1; + + /** + * This field's name "only-if-cached" is misleading. It actually means "do + * not use the network". It is set by a client who only wants to make a + * request if it can be fully satisfied by the cache. Cached responses that + * would require validation (ie. conditional gets) are not permitted if this + * header is set. + */ + private boolean onlyIfCached; + + /** + * True if the request contains an authorization field. Although this isn't + * necessarily a shared cache, it follows the spec's strict requirements for + * shared caches. + */ + private boolean hasAuthorization; + + private long contentLength = -1; + private String transferEncoding; + private String userAgent; + private String host; + private String connection; + private String acceptEncoding; + private String contentType; + private String ifModifiedSince; + private String ifNoneMatch; + private String proxyAuthorization; + + public RequestHeaders(URI uri, RawHeaders headers) { + this.uri = uri; + this.headers = headers; + + HeaderParser.CacheControlHandler handler = new HeaderParser.CacheControlHandler() { + @Override public void handle(String directive, String parameter) { + if ("no-cache".equalsIgnoreCase(directive)) { + noCache = true; + } else if ("max-age".equalsIgnoreCase(directive)) { + maxAgeSeconds = HeaderParser.parseSeconds(parameter); + } else if ("max-stale".equalsIgnoreCase(directive)) { + maxStaleSeconds = HeaderParser.parseSeconds(parameter); + } else if ("min-fresh".equalsIgnoreCase(directive)) { + minFreshSeconds = HeaderParser.parseSeconds(parameter); + } else if ("only-if-cached".equalsIgnoreCase(directive)) { + onlyIfCached = true; + } + } + }; + + for (int i = 0; i < headers.length(); i++) { + String fieldName = headers.getFieldName(i); + String value = headers.getValue(i); + if ("Cache-Control".equalsIgnoreCase(fieldName)) { + HeaderParser.parseCacheControl(value, handler); + } else if ("Pragma".equalsIgnoreCase(fieldName)) { + if ("no-cache".equalsIgnoreCase(value)) { + noCache = true; + } + } else if ("If-None-Match".equalsIgnoreCase(fieldName)) { + ifNoneMatch = value; + } else if ("If-Modified-Since".equalsIgnoreCase(fieldName)) { + ifModifiedSince = value; + } else if ("Authorization".equalsIgnoreCase(fieldName)) { + hasAuthorization = true; + } else if ("Content-Length".equalsIgnoreCase(fieldName)) { + try { + contentLength = Integer.parseInt(value); + } catch (NumberFormatException ignored) { + } + } else if ("Transfer-Encoding".equalsIgnoreCase(fieldName)) { + transferEncoding = value; + } else if ("User-Agent".equalsIgnoreCase(fieldName)) { + userAgent = value; + } else if ("Host".equalsIgnoreCase(fieldName)) { + host = value; + } else if ("Connection".equalsIgnoreCase(fieldName)) { + connection = value; + } else if ("Accept-Encoding".equalsIgnoreCase(fieldName)) { + acceptEncoding = value; + } else if ("Content-Type".equalsIgnoreCase(fieldName)) { + contentType = value; + } else if ("Proxy-Authorization".equalsIgnoreCase(fieldName)) { + proxyAuthorization = value; + } + } + } + + public boolean isChunked() { + return "chunked".equalsIgnoreCase(transferEncoding); + } + + public boolean hasConnectionClose() { + return "close".equalsIgnoreCase(connection); + } + + public URI getUri() { + return uri; + } + + public RawHeaders getHeaders() { + return headers; + } + + public boolean isNoCache() { + return noCache; + } + + public int getMaxAgeSeconds() { + return maxAgeSeconds; + } + + public int getMaxStaleSeconds() { + return maxStaleSeconds; + } + + public int getMinFreshSeconds() { + return minFreshSeconds; + } + + public boolean isOnlyIfCached() { + return onlyIfCached; + } + + public boolean hasAuthorization() { + return hasAuthorization; + } + + public long getContentLength() { + return contentLength; + } + + public String getTransferEncoding() { + return transferEncoding; + } + + public String getUserAgent() { + return userAgent; + } + + public String getHost() { + return host; + } + + public String getConnection() { + return connection; + } + + public String getAcceptEncoding() { + return acceptEncoding; + } + + public String getContentType() { + return contentType; + } + + public String getIfModifiedSince() { + return ifModifiedSince; + } + + public String getIfNoneMatch() { + return ifNoneMatch; + } + + public String getProxyAuthorization() { + return proxyAuthorization; + } + + public void setChunked() { + if (this.transferEncoding != null) { + headers.removeAll("Transfer-Encoding"); + } + headers.add("Transfer-Encoding", "chunked"); + this.transferEncoding = "chunked"; + } + + public void setContentLength(long contentLength) { + if (this.contentLength != -1) { + headers.removeAll("Content-Length"); + } + headers.add("Content-Length", Long.toString(contentLength)); + this.contentLength = contentLength; + } + + /** + * Remove the Content-Length headers. Call this when dropping the body on a + * request or response, such as when a redirect changes the method from POST + * to GET. + */ + public void removeContentLength() { + if (contentLength != -1) { + headers.removeAll("Content-Length"); + contentLength = -1; + } + } + + public void setUserAgent(String userAgent) { + if (this.userAgent != null) { + headers.removeAll("User-Agent"); + } + headers.add("User-Agent", userAgent); + this.userAgent = userAgent; + } + + public void setHost(String host) { + if (this.host != null) { + headers.removeAll("Host"); + } + headers.add("Host", host); + this.host = host; + } + + public void setConnection(String connection) { + if (this.connection != null) { + headers.removeAll("Connection"); + } + headers.add("Connection", connection); + this.connection = connection; + } + + public void setAcceptEncoding(String acceptEncoding) { + if (this.acceptEncoding != null) { + headers.removeAll("Accept-Encoding"); + } + headers.add("Accept-Encoding", acceptEncoding); + this.acceptEncoding = acceptEncoding; + } + + public void setContentType(String contentType) { + if (this.contentType != null) { + headers.removeAll("Content-Type"); + } + headers.add("Content-Type", contentType); + this.contentType = contentType; + } + + public void setIfModifiedSince(Date date) { + if (ifModifiedSince != null) { + headers.removeAll("If-Modified-Since"); + } + String formattedDate = HttpDate.format(date); + headers.add("If-Modified-Since", formattedDate); + ifModifiedSince = formattedDate; + } + + public void setIfNoneMatch(String ifNoneMatch) { + if (this.ifNoneMatch != null) { + headers.removeAll("If-None-Match"); + } + headers.add("If-None-Match", ifNoneMatch); + this.ifNoneMatch = ifNoneMatch; + } + + /** + * Returns true if the request contains conditions that save the server from + * sending a response that the client has locally. When the caller adds + * conditions, this cache won't participate in the request. + */ + public boolean hasConditions() { + return ifModifiedSince != null || ifNoneMatch != null; + } + + public void addCookies(Map> allCookieHeaders) { + for (Map.Entry> entry : allCookieHeaders.entrySet()) { + String key = entry.getKey(); + if (("Cookie".equalsIgnoreCase(key) || "Cookie2".equalsIgnoreCase(key)) + && !entry.getValue().isEmpty()) { + headers.add(key, buildCookieHeader(entry.getValue())); + } + } + } + + /** + * Send all cookies in one big header, as recommended by + * RFC 6265. + */ + private String buildCookieHeader(List cookies) { + if (cookies.size() == 1) return cookies.get(0); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < cookies.size(); i++) { + if (i > 0) sb.append("; "); + sb.append(cookies.get(i)); + } + return sb.toString(); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java new file mode 100644 index 0000000..69e8656 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/ResponseHeaders.java @@ -0,0 +1,512 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.ResponseSource; +import com.squareup.okhttp.internal.Platform; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.TimeUnit; + +import static com.squareup.okhttp.internal.Util.equal; + +/** Parsed HTTP response headers. */ +public final class ResponseHeaders { + + /** HTTP header name for the local time when the request was sent. */ + private static final String SENT_MILLIS = Platform.get().getPrefix() + "-Sent-Millis"; + + /** HTTP header name for the local time when the response was received. */ + private static final String RECEIVED_MILLIS = Platform.get().getPrefix() + "-Received-Millis"; + + /** HTTP synthetic header with the response source. */ + static final String RESPONSE_SOURCE = Platform.get().getPrefix() + "-Response-Source"; + + /** HTTP synthetic header with the selected transport (spdy/3, http/1.1, etc). */ + static final String SELECTED_TRANSPORT = Platform.get().getPrefix() + "-Selected-Transport"; + + private final URI uri; + private final RawHeaders headers; + + /** The server's time when this response was served, if known. */ + private Date servedDate; + + /** The last modified date of the response, if known. */ + private Date lastModified; + + /** + * The expiration date of the response, if known. If both this field and the + * max age are set, the max age is preferred. + */ + private Date expires; + + /** + * Extension header set by HttpURLConnectionImpl specifying the timestamp + * when the HTTP request was first initiated. + */ + private long sentRequestMillis; + + /** + * Extension header set by HttpURLConnectionImpl specifying the timestamp + * when the HTTP response was first received. + */ + private long receivedResponseMillis; + + /** + * In the response, this field's name "no-cache" is misleading. It doesn't + * prevent us from caching the response; it only means we have to validate + * the response with the origin server before returning it. We can do this + * with a conditional get. + */ + private boolean noCache; + + /** If true, this response should not be cached. */ + private boolean noStore; + + /** + * The duration past the response's served date that it can be served + * without validation. + */ + private int maxAgeSeconds = -1; + + /** + * The "s-maxage" directive is the max age for shared caches. Not to be + * confused with "max-age" for non-shared caches, As in Firefox and Chrome, + * this directive is not honored by this cache. + */ + private int sMaxAgeSeconds = -1; + + /** + * This request header field's name "only-if-cached" is misleading. It + * actually means "do not use the network". It is set by a client who only + * wants to make a request if it can be fully satisfied by the cache. + * Cached responses that would require validation (ie. conditional gets) are + * not permitted if this header is set. + */ + private boolean isPublic; + private boolean mustRevalidate; + private String etag; + private int ageSeconds = -1; + + /** Case-insensitive set of field names. */ + private Set varyFields = Collections.emptySet(); + + private String contentEncoding; + private String transferEncoding; + private long contentLength = -1; + private String connection; + private String contentType; + + public ResponseHeaders(URI uri, RawHeaders headers) { + this.uri = uri; + this.headers = headers; + + HeaderParser.CacheControlHandler handler = new HeaderParser.CacheControlHandler() { + @Override public void handle(String directive, String parameter) { + if ("no-cache".equalsIgnoreCase(directive)) { + noCache = true; + } else if ("no-store".equalsIgnoreCase(directive)) { + noStore = true; + } else if ("max-age".equalsIgnoreCase(directive)) { + maxAgeSeconds = HeaderParser.parseSeconds(parameter); + } else if ("s-maxage".equalsIgnoreCase(directive)) { + sMaxAgeSeconds = HeaderParser.parseSeconds(parameter); + } else if ("public".equalsIgnoreCase(directive)) { + isPublic = true; + } else if ("must-revalidate".equalsIgnoreCase(directive)) { + mustRevalidate = true; + } + } + }; + + for (int i = 0; i < headers.length(); i++) { + String fieldName = headers.getFieldName(i); + String value = headers.getValue(i); + if ("Cache-Control".equalsIgnoreCase(fieldName)) { + HeaderParser.parseCacheControl(value, handler); + } else if ("Date".equalsIgnoreCase(fieldName)) { + servedDate = HttpDate.parse(value); + } else if ("Expires".equalsIgnoreCase(fieldName)) { + expires = HttpDate.parse(value); + } else if ("Last-Modified".equalsIgnoreCase(fieldName)) { + lastModified = HttpDate.parse(value); + } else if ("ETag".equalsIgnoreCase(fieldName)) { + etag = value; + } else if ("Pragma".equalsIgnoreCase(fieldName)) { + if ("no-cache".equalsIgnoreCase(value)) { + noCache = true; + } + } else if ("Age".equalsIgnoreCase(fieldName)) { + ageSeconds = HeaderParser.parseSeconds(value); + } else if ("Vary".equalsIgnoreCase(fieldName)) { + // Replace the immutable empty set with something we can mutate. + if (varyFields.isEmpty()) { + varyFields = new TreeSet(String.CASE_INSENSITIVE_ORDER); + } + for (String varyField : value.split(",")) { + varyFields.add(varyField.trim()); + } + } else if ("Content-Encoding".equalsIgnoreCase(fieldName)) { + contentEncoding = value; + } else if ("Transfer-Encoding".equalsIgnoreCase(fieldName)) { + transferEncoding = value; + } else if ("Content-Length".equalsIgnoreCase(fieldName)) { + try { + contentLength = Long.parseLong(value); + } catch (NumberFormatException ignored) { + } + } else if ("Content-Type".equalsIgnoreCase(fieldName)) { + contentType = value; + } else if ("Connection".equalsIgnoreCase(fieldName)) { + connection = value; + } else if (SENT_MILLIS.equalsIgnoreCase(fieldName)) { + sentRequestMillis = Long.parseLong(value); + } else if (RECEIVED_MILLIS.equalsIgnoreCase(fieldName)) { + receivedResponseMillis = Long.parseLong(value); + } + } + } + + public boolean isContentEncodingGzip() { + return "gzip".equalsIgnoreCase(contentEncoding); + } + + public void stripContentEncoding() { + contentEncoding = null; + headers.removeAll("Content-Encoding"); + } + + public void stripContentLength() { + contentLength = -1; + headers.removeAll("Content-Length"); + } + + public boolean isChunked() { + return "chunked".equalsIgnoreCase(transferEncoding); + } + + public boolean hasConnectionClose() { + return "close".equalsIgnoreCase(connection); + } + + public URI getUri() { + return uri; + } + + public RawHeaders getHeaders() { + return headers; + } + + public Date getServedDate() { + return servedDate; + } + + public Date getLastModified() { + return lastModified; + } + + public Date getExpires() { + return expires; + } + + public boolean isNoCache() { + return noCache; + } + + public boolean isNoStore() { + return noStore; + } + + public int getMaxAgeSeconds() { + return maxAgeSeconds; + } + + public int getSMaxAgeSeconds() { + return sMaxAgeSeconds; + } + + public boolean isPublic() { + return isPublic; + } + + public boolean isMustRevalidate() { + return mustRevalidate; + } + + public String getEtag() { + return etag; + } + + public Set getVaryFields() { + return varyFields; + } + + public String getContentEncoding() { + return contentEncoding; + } + + public long getContentLength() { + return contentLength; + } + + public String getContentType() { + return contentType; + } + + public String getConnection() { + return connection; + } + + public void setLocalTimestamps(long sentRequestMillis, long receivedResponseMillis) { + this.sentRequestMillis = sentRequestMillis; + headers.add(SENT_MILLIS, Long.toString(sentRequestMillis)); + this.receivedResponseMillis = receivedResponseMillis; + headers.add(RECEIVED_MILLIS, Long.toString(receivedResponseMillis)); + } + + public void setResponseSource(ResponseSource responseSource) { + headers.set(RESPONSE_SOURCE, responseSource.toString() + " " + headers.getResponseCode()); + } + + public void setTransport(String transport) { + headers.set(SELECTED_TRANSPORT, transport); + } + + /** + * Returns the current age of the response, in milliseconds. The calculation + * is specified by RFC 2616, 13.2.3 Age Calculations. + */ + private long computeAge(long nowMillis) { + long apparentReceivedAge = + servedDate != null ? Math.max(0, receivedResponseMillis - servedDate.getTime()) : 0; + long receivedAge = + ageSeconds != -1 ? Math.max(apparentReceivedAge, TimeUnit.SECONDS.toMillis(ageSeconds)) + : apparentReceivedAge; + long responseDuration = receivedResponseMillis - sentRequestMillis; + long residentDuration = nowMillis - receivedResponseMillis; + return receivedAge + responseDuration + residentDuration; + } + + /** + * Returns the number of milliseconds that the response was fresh for, + * starting from the served date. + */ + private long computeFreshnessLifetime() { + if (maxAgeSeconds != -1) { + return TimeUnit.SECONDS.toMillis(maxAgeSeconds); + } else if (expires != null) { + long servedMillis = servedDate != null ? servedDate.getTime() : receivedResponseMillis; + long delta = expires.getTime() - servedMillis; + return delta > 0 ? delta : 0; + } else if (lastModified != null && uri.getRawQuery() == null) { + // As recommended by the HTTP RFC and implemented in Firefox, the + // max age of a document should be defaulted to 10% of the + // document's age at the time it was served. Default expiration + // dates aren't used for URIs containing a query. + long servedMillis = servedDate != null ? servedDate.getTime() : sentRequestMillis; + long delta = servedMillis - lastModified.getTime(); + return delta > 0 ? (delta / 10) : 0; + } + return 0; + } + + /** + * Returns true if computeFreshnessLifetime used a heuristic. If we used a + * heuristic to serve a cached response older than 24 hours, we are required + * to attach a warning. + */ + private boolean isFreshnessLifetimeHeuristic() { + return maxAgeSeconds == -1 && expires == null; + } + + /** + * Returns true if this response can be stored to later serve another + * request. + */ + public boolean isCacheable(RequestHeaders request) { + // Always go to network for uncacheable response codes (RFC 2616, 13.4), + // This implementation doesn't support caching partial content. + int responseCode = headers.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK + && responseCode != HttpURLConnection.HTTP_NOT_AUTHORITATIVE + && responseCode != HttpURLConnection.HTTP_MULT_CHOICE + && responseCode != HttpURLConnection.HTTP_MOVED_PERM + && responseCode != HttpURLConnection.HTTP_GONE) { + return false; + } + + // Responses to authorized requests aren't cacheable unless they include + // a 'public', 'must-revalidate' or 's-maxage' directive. + if (request.hasAuthorization() && !isPublic && !mustRevalidate && sMaxAgeSeconds == -1) { + return false; + } + + if (noStore) { + return false; + } + + return true; + } + + /** + * Returns true if a Vary header contains an asterisk. Such responses cannot + * be cached. + */ + public boolean hasVaryAll() { + return varyFields.contains("*"); + } + + /** + * Returns true if none of the Vary headers on this response have changed + * between {@code cachedRequest} and {@code newRequest}. + */ + public boolean varyMatches(Map> cachedRequest, + Map> newRequest) { + for (String field : varyFields) { + if (!equal(cachedRequest.get(field), newRequest.get(field))) { + return false; + } + } + return true; + } + + /** Returns the source to satisfy {@code request} given this cached response. */ + public ResponseSource chooseResponseSource(long nowMillis, RequestHeaders request) { + // If this response shouldn't have been stored, it should never be used + // as a response source. This check should be redundant as long as the + // persistence store is well-behaved and the rules are constant. + if (!isCacheable(request)) { + return ResponseSource.NETWORK; + } + + if (request.isNoCache() || request.hasConditions()) { + return ResponseSource.NETWORK; + } + + long ageMillis = computeAge(nowMillis); + long freshMillis = computeFreshnessLifetime(); + + if (request.getMaxAgeSeconds() != -1) { + freshMillis = Math.min(freshMillis, TimeUnit.SECONDS.toMillis(request.getMaxAgeSeconds())); + } + + long minFreshMillis = 0; + if (request.getMinFreshSeconds() != -1) { + minFreshMillis = TimeUnit.SECONDS.toMillis(request.getMinFreshSeconds()); + } + + long maxStaleMillis = 0; + if (!mustRevalidate && request.getMaxStaleSeconds() != -1) { + maxStaleMillis = TimeUnit.SECONDS.toMillis(request.getMaxStaleSeconds()); + } + + if (!noCache && ageMillis + minFreshMillis < freshMillis + maxStaleMillis) { + if (ageMillis + minFreshMillis >= freshMillis) { + headers.add("Warning", "110 HttpURLConnection \"Response is stale\""); + } + long oneDayMillis = 24 * 60 * 60 * 1000L; + if (ageMillis > oneDayMillis && isFreshnessLifetimeHeuristic()) { + headers.add("Warning", "113 HttpURLConnection \"Heuristic expiration\""); + } + return ResponseSource.CACHE; + } + + if (lastModified != null) { + request.setIfModifiedSince(lastModified); + } else if (servedDate != null) { + request.setIfModifiedSince(servedDate); + } + + if (etag != null) { + request.setIfNoneMatch(etag); + } + + return request.hasConditions() ? ResponseSource.CONDITIONAL_CACHE : ResponseSource.NETWORK; + } + + /** + * Returns true if this cached response should be used; false if the + * network response should be used. + */ + public boolean validate(ResponseHeaders networkResponse) { + if (networkResponse.headers.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) { + return true; + } + + // The HTTP spec says that if the network's response is older than our + // cached response, we may return the cache's response. Like Chrome (but + // unlike Firefox), this client prefers to return the newer response. + if (lastModified != null + && networkResponse.lastModified != null + && networkResponse.lastModified.getTime() < lastModified.getTime()) { + return true; + } + + return false; + } + + /** + * Combines this cached header with a network header as defined by RFC 2616, + * 13.5.3. + */ + public ResponseHeaders combine(ResponseHeaders network) throws IOException { + RawHeaders result = new RawHeaders(); + result.setStatusLine(headers.getStatusLine()); + + for (int i = 0; i < headers.length(); i++) { + String fieldName = headers.getFieldName(i); + String value = headers.getValue(i); + if ("Warning".equals(fieldName) && value.startsWith("1")) { + continue; // drop 100-level freshness warnings + } + if (!isEndToEnd(fieldName) || network.headers.get(fieldName) == null) { + result.add(fieldName, value); + } + } + + for (int i = 0; i < network.headers.length(); i++) { + String fieldName = network.headers.getFieldName(i); + if (isEndToEnd(fieldName)) { + result.add(fieldName, network.headers.getValue(i)); + } + } + + return new ResponseHeaders(uri, result); + } + + /** + * Returns true if {@code fieldName} is an end-to-end HTTP header, as + * defined by RFC 2616, 13.5.1. + */ + private static boolean isEndToEnd(String fieldName) { + return !"Connection".equalsIgnoreCase(fieldName) + && !"Keep-Alive".equalsIgnoreCase(fieldName) + && !"Proxy-Authenticate".equalsIgnoreCase(fieldName) + && !"Proxy-Authorization".equalsIgnoreCase(fieldName) + && !"TE".equalsIgnoreCase(fieldName) + && !"Trailers".equalsIgnoreCase(fieldName) + && !"Transfer-Encoding".equalsIgnoreCase(fieldName) + && !"Upgrade".equalsIgnoreCase(fieldName); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java new file mode 100644 index 0000000..5eb6b76 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RetryableOutputStream.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.internal.AbstractOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.ProtocolException; + +import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; + +/** + * An HTTP request body that's completely buffered in memory. This allows + * the post body to be transparently re-sent if the HTTP request must be + * sent multiple times. + */ +final class RetryableOutputStream extends AbstractOutputStream { + private final int limit; + private final ByteArrayOutputStream content; + + public RetryableOutputStream(int limit) { + this.limit = limit; + this.content = new ByteArrayOutputStream(limit); + } + + public RetryableOutputStream() { + this.limit = -1; + this.content = new ByteArrayOutputStream(); + } + + @Override public synchronized void close() throws IOException { + if (closed) { + return; + } + closed = true; + if (content.size() < limit) { + throw new ProtocolException( + "content-length promised " + limit + " bytes, but received " + content.size()); + } + } + + @Override public synchronized void write(byte[] buffer, int offset, int count) + throws IOException { + checkNotClosed(); + checkOffsetAndCount(buffer.length, offset, count); + if (limit != -1 && content.size() > limit - count) { + throw new ProtocolException("exceeded content-length limit of " + limit + " bytes"); + } + content.write(buffer, offset, count); + } + + public synchronized int contentLength() throws IOException { + close(); + return content.size(); + } + + public void writeToSocket(OutputStream socketOut) throws IOException { + content.writeTo(socketOut); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java new file mode 100644 index 0000000..1055e4f --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/RouteSelector.java @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.Address; +import com.squareup.okhttp.Connection; +import com.squareup.okhttp.ConnectionPool; +import com.squareup.okhttp.Route; +import com.squareup.okhttp.RouteDatabase; +import com.squareup.okhttp.internal.Dns; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.ProxySelector; +import java.net.SocketAddress; +import java.net.URI; +import java.net.UnknownHostException; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.NoSuchElementException; + +import static com.squareup.okhttp.internal.Util.getEffectivePort; + +/** + * Selects routes to connect to an origin server. Each connection requires a + * choice of proxy server, IP address, and TLS mode. Connections may also be + * recycled. + */ +public final class RouteSelector { + /** Uses {@link com.squareup.okhttp.internal.Platform#enableTlsExtensions}. */ + private static final int TLS_MODE_MODERN = 1; + /** Uses {@link com.squareup.okhttp.internal.Platform#supportTlsIntolerantServer}. */ + private static final int TLS_MODE_COMPATIBLE = 0; + /** No TLS mode. */ + private static final int TLS_MODE_NULL = -1; + + private final Address address; + private final URI uri; + private final ProxySelector proxySelector; + private final ConnectionPool pool; + private final Dns dns; + private final RouteDatabase routeDatabase; + + /* The most recently attempted route. */ + private Proxy lastProxy; + private InetSocketAddress lastInetSocketAddress; + + /* State for negotiating the next proxy to use. */ + private boolean hasNextProxy; + private Proxy userSpecifiedProxy; + private Iterator proxySelectorProxies; + + /* State for negotiating the next InetSocketAddress to use. */ + private InetAddress[] socketAddresses; + private int nextSocketAddressIndex; + private int socketPort; + + /* State for negotiating the next TLS configuration */ + private int nextTlsMode = TLS_MODE_NULL; + + /* State for negotiating failed routes */ + private final List postponedRoutes; + + public RouteSelector(Address address, URI uri, ProxySelector proxySelector, ConnectionPool pool, + Dns dns, RouteDatabase routeDatabase) { + this.address = address; + this.uri = uri; + this.proxySelector = proxySelector; + this.pool = pool; + this.dns = dns; + this.routeDatabase = routeDatabase; + this.postponedRoutes = new LinkedList(); + + resetNextProxy(uri, address.getProxy()); + } + + /** + * Returns true if there's another route to attempt. Every address has at + * least one route. + */ + public boolean hasNext() { + return hasNextTlsMode() || hasNextInetSocketAddress() || hasNextProxy() || hasNextPostponed(); + } + + /** + * Returns the next route address to attempt. + * + * @throws NoSuchElementException if there are no more routes to attempt. + */ + public Connection next(String method) throws IOException { + // Always prefer pooled connections over new connections. + for (Connection pooled; (pooled = pool.get(address)) != null; ) { + if (method.equals("GET") || pooled.isReadable()) return pooled; + pooled.close(); + } + + // Compute the next route to attempt. + if (!hasNextTlsMode()) { + if (!hasNextInetSocketAddress()) { + if (!hasNextProxy()) { + if (!hasNextPostponed()) { + throw new NoSuchElementException(); + } + return new Connection(nextPostponed()); + } + lastProxy = nextProxy(); + resetNextInetSocketAddress(lastProxy); + } + lastInetSocketAddress = nextInetSocketAddress(); + resetNextTlsMode(); + } + + boolean modernTls = nextTlsMode() == TLS_MODE_MODERN; + Route route = new Route(address, lastProxy, lastInetSocketAddress, modernTls); + if (routeDatabase.shouldPostpone(route)) { + postponedRoutes.add(route); + // We will only recurse in order to skip previously failed routes. They will be + // tried last. + return next(method); + } + + return new Connection(route); + } + + /** + * Clients should invoke this method when they encounter a connectivity + * failure on a connection returned by this route selector. + */ + public void connectFailed(Connection connection, IOException failure) { + Route failedRoute = connection.getRoute(); + if (failedRoute.getProxy().type() != Proxy.Type.DIRECT && proxySelector != null) { + // Tell the proxy selector when we fail to connect on a fresh connection. + proxySelector.connectFailed(uri, failedRoute.getProxy().address(), failure); + } + + routeDatabase.failed(failedRoute, failure); + } + + /** Resets {@link #nextProxy} to the first option. */ + private void resetNextProxy(URI uri, Proxy proxy) { + this.hasNextProxy = true; // This includes NO_PROXY! + if (proxy != null) { + this.userSpecifiedProxy = proxy; + } else { + List proxyList = proxySelector.select(uri); + if (proxyList != null) { + this.proxySelectorProxies = proxyList.iterator(); + } + } + } + + /** Returns true if there's another proxy to try. */ + private boolean hasNextProxy() { + return hasNextProxy; + } + + /** Returns the next proxy to try. May be PROXY.NO_PROXY but never null. */ + private Proxy nextProxy() { + // If the user specifies a proxy, try that and only that. + if (userSpecifiedProxy != null) { + hasNextProxy = false; + return userSpecifiedProxy; + } + + // Try each of the ProxySelector choices until one connection succeeds. If none succeed + // then we'll try a direct connection below. + if (proxySelectorProxies != null) { + while (proxySelectorProxies.hasNext()) { + Proxy candidate = proxySelectorProxies.next(); + if (candidate.type() != Proxy.Type.DIRECT) { + return candidate; + } + } + } + + // Finally try a direct connection. + hasNextProxy = false; + return Proxy.NO_PROXY; + } + + /** Resets {@link #nextInetSocketAddress} to the first option. */ + private void resetNextInetSocketAddress(Proxy proxy) throws UnknownHostException { + socketAddresses = null; // Clear the addresses. Necessary if getAllByName() below throws! + + String socketHost; + if (proxy.type() == Proxy.Type.DIRECT) { + socketHost = uri.getHost(); + socketPort = getEffectivePort(uri); + } else { + SocketAddress proxyAddress = proxy.address(); + if (!(proxyAddress instanceof InetSocketAddress)) { + throw new IllegalArgumentException( + "Proxy.address() is not an " + "InetSocketAddress: " + proxyAddress.getClass()); + } + InetSocketAddress proxySocketAddress = (InetSocketAddress) proxyAddress; + socketHost = proxySocketAddress.getHostName(); + socketPort = proxySocketAddress.getPort(); + } + + // Try each address for best behavior in mixed IPv4/IPv6 environments. + socketAddresses = dns.getAllByName(socketHost); + nextSocketAddressIndex = 0; + } + + /** Returns true if there's another socket address to try. */ + private boolean hasNextInetSocketAddress() { + return socketAddresses != null; + } + + /** Returns the next socket address to try. */ + private InetSocketAddress nextInetSocketAddress() throws UnknownHostException { + InetSocketAddress result = + new InetSocketAddress(socketAddresses[nextSocketAddressIndex++], socketPort); + if (nextSocketAddressIndex == socketAddresses.length) { + socketAddresses = null; // So that hasNextInetSocketAddress() returns false. + nextSocketAddressIndex = 0; + } + + return result; + } + + /** Resets {@link #nextTlsMode} to the first option. */ + private void resetNextTlsMode() { + nextTlsMode = (address.getSslSocketFactory() != null) ? TLS_MODE_MODERN : TLS_MODE_COMPATIBLE; + } + + /** Returns true if there's another TLS mode to try. */ + private boolean hasNextTlsMode() { + return nextTlsMode != TLS_MODE_NULL; + } + + /** Returns the next TLS mode to try. */ + private int nextTlsMode() { + if (nextTlsMode == TLS_MODE_MODERN) { + nextTlsMode = TLS_MODE_COMPATIBLE; + return TLS_MODE_MODERN; + } else if (nextTlsMode == TLS_MODE_COMPATIBLE) { + nextTlsMode = TLS_MODE_NULL; // So that hasNextTlsMode() returns false. + return TLS_MODE_COMPATIBLE; + } else { + throw new AssertionError(); + } + } + + /** Returns true if there is another postponed route to try. */ + private boolean hasNextPostponed() { + return !postponedRoutes.isEmpty(); + } + + /** Returns the next postponed route to try. */ + private Route nextPostponed() { + return postponedRoutes.remove(0); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java new file mode 100644 index 0000000..471539a --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/SpdyTransport.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import com.squareup.okhttp.internal.spdy.ErrorCode; +import com.squareup.okhttp.internal.spdy.SpdyConnection; +import com.squareup.okhttp.internal.spdy.SpdyStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.CacheRequest; +import java.net.URL; +import java.util.List; + +public final class SpdyTransport implements Transport { + private final HttpEngine httpEngine; + private final SpdyConnection spdyConnection; + private SpdyStream stream; + + public SpdyTransport(HttpEngine httpEngine, SpdyConnection spdyConnection) { + this.httpEngine = httpEngine; + this.spdyConnection = spdyConnection; + } + + @Override public OutputStream createRequestBody() throws IOException { + long fixedContentLength = httpEngine.policy.getFixedContentLength(); + if (fixedContentLength != -1) { + httpEngine.requestHeaders.setContentLength(fixedContentLength); + } + // TODO: if we aren't streaming up to the server, we should buffer the whole request + writeRequestHeaders(); + return stream.getOutputStream(); + } + + @Override public void writeRequestHeaders() throws IOException { + if (stream != null) { + return; + } + httpEngine.writingRequestHeaders(); + RawHeaders requestHeaders = httpEngine.requestHeaders.getHeaders(); + String version = httpEngine.connection.getHttpMinorVersion() == 1 ? "HTTP/1.1" : "HTTP/1.0"; + URL url = httpEngine.policy.getURL(); + requestHeaders.addSpdyRequestHeaders(httpEngine.method, HttpEngine.requestPath(url), version, + HttpEngine.getOriginAddress(url), httpEngine.uri.getScheme()); + boolean hasRequestBody = httpEngine.hasRequestBody(); + boolean hasResponseBody = true; + stream = spdyConnection.newStream(requestHeaders.toNameValueBlock(), hasRequestBody, + hasResponseBody); + stream.setReadTimeout(httpEngine.client.getReadTimeout()); + } + + @Override public void writeRequestBody(RetryableOutputStream requestBody) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override public void flushRequest() throws IOException { + stream.getOutputStream().close(); + } + + @Override public ResponseHeaders readResponseHeaders() throws IOException { + List nameValueBlock = stream.getResponseHeaders(); + RawHeaders rawHeaders = RawHeaders.fromNameValueBlock(nameValueBlock); + httpEngine.receiveHeaders(rawHeaders); + + ResponseHeaders headers = new ResponseHeaders(httpEngine.uri, rawHeaders); + headers.setTransport("spdy/3"); + return headers; + } + + @Override public InputStream getTransferStream(CacheRequest cacheRequest) throws IOException { + return new UnknownLengthHttpInputStream(stream.getInputStream(), cacheRequest, httpEngine); + } + + @Override public boolean makeReusable(boolean streamCanceled, OutputStream requestBodyOut, + InputStream responseBodyIn) { + if (streamCanceled) { + if (stream != null) { + stream.closeLater(ErrorCode.CANCEL); + return true; + } else { + // If stream is null, it either means that writeRequestHeaders wasn't called + // or that SpdyConnection#newStream threw an IOException. In both cases there's + // nothing to do here and this stream can't be reused. + return false; + } + } + return true; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java new file mode 100644 index 0000000..d408bfe --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/Transport.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.http; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.CacheRequest; + +interface Transport { + /** + * Returns an output stream where the request body can be written. The + * returned stream will of one of two types: + *

    + *
  • Direct. Bytes are written to the socket and + * forgotten. This is most efficient, particularly for large request + * bodies. The returned stream may be buffered; the caller must call + * {@link #flushRequest} before reading the response.
  • + *
  • Buffered. Bytes are written to an in memory + * buffer, and must be explicitly flushed with a call to {@link + * #writeRequestBody}. This allows HTTP authorization (401, 407) + * responses to be retransmitted transparently.
  • + *
+ */ + // TODO: don't bother retransmitting the request body? It's quite a corner + // case and there's uncertainty whether Firefox or Chrome do this + OutputStream createRequestBody() throws IOException; + + /** This should update the HTTP engine's sentRequestMillis field. */ + void writeRequestHeaders() throws IOException; + + /** + * Sends the request body returned by {@link #createRequestBody} to the + * remote peer. + */ + void writeRequestBody(RetryableOutputStream requestBody) throws IOException; + + /** Flush the request body to the underlying socket. */ + void flushRequest() throws IOException; + + /** Read response headers and update the cookie manager. */ + ResponseHeaders readResponseHeaders() throws IOException; + + // TODO: make this the content stream? + InputStream getTransferStream(CacheRequest cacheRequest) throws IOException; + + /** Returns true if the underlying connection can be recycled. */ + boolean makeReusable(boolean streamCanceled, OutputStream requestBodyOut, + InputStream responseBodyIn); +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java new file mode 100644 index 0000000..ca6bb59 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/http/UnknownLengthHttpInputStream.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * 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. + */ +package com.squareup.okhttp.internal.http; + +import java.io.IOException; +import java.io.InputStream; +import java.net.CacheRequest; + +import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; + +/** An HTTP message body terminated by the end of the underlying stream. */ +final class UnknownLengthHttpInputStream extends AbstractHttpInputStream { + private boolean inputExhausted; + + UnknownLengthHttpInputStream(InputStream in, CacheRequest cacheRequest, HttpEngine httpEngine) + throws IOException { + super(in, httpEngine, cacheRequest); + } + + @Override public int read(byte[] buffer, int offset, int count) throws IOException { + checkOffsetAndCount(buffer.length, offset, count); + checkNotClosed(); + if (in == null || inputExhausted) { + return -1; + } + int read = in.read(buffer, offset, count); + if (read == -1) { + inputExhausted = true; + endOfInput(); + return -1; + } + cacheWrite(buffer, offset, read); + return read; + } + + @Override public int available() throws IOException { + checkNotClosed(); + return in == null ? 0 : in.available(); + } + + @Override public void close() throws IOException { + if (closed) { + return; + } + closed = true; + if (!inputExhausted) { + unexpectedEndOfInput(); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java new file mode 100644 index 0000000..9394b69 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/ErrorCode.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +public enum ErrorCode { + /** Not an error! For SPDY stream resets, prefer null over NO_ERROR. */ + NO_ERROR(0, -1, 0), + + PROTOCOL_ERROR(1, 1, 1), + + /** A subtype of PROTOCOL_ERROR used by SPDY. */ + INVALID_STREAM(1, 2, -1), + + /** A subtype of PROTOCOL_ERROR used by SPDY. */ + UNSUPPORTED_VERSION(1, 4, -1), + + /** A subtype of PROTOCOL_ERROR used by SPDY. */ + STREAM_IN_USE(1, 8, -1), + + /** A subtype of PROTOCOL_ERROR used by SPDY. */ + STREAM_ALREADY_CLOSED(1, 9, -1), + + INTERNAL_ERROR(2, 6, 2), + + FLOW_CONTROL_ERROR(3, 7, -1), + + STREAM_CLOSED(5, -1, -1), + + FRAME_TOO_LARGE(6, 11, -1), + + REFUSED_STREAM(7, 3, -1), + + CANCEL(8, 5, -1), + + COMPRESSION_ERROR(9, -1, -1), + + INVALID_CREDENTIALS(-1, 10, -1); + + public final int httpCode; + public final int spdyRstCode; + public final int spdyGoAwayCode; + + private ErrorCode(int httpCode, int spdyRstCode, int spdyGoAwayCode) { + this.httpCode = httpCode; + this.spdyRstCode = spdyRstCode; + this.spdyGoAwayCode = spdyGoAwayCode; + } + + public static ErrorCode fromSpdy3Rst(int code) { + for (ErrorCode errorCode : ErrorCode.values()) { + if (errorCode.spdyRstCode == code) return errorCode; + } + return null; + } + + public static ErrorCode fromHttp2(int code) { + for (ErrorCode errorCode : ErrorCode.values()) { + if (errorCode.httpCode == code) return errorCode; + } + return null; + } + + public static ErrorCode fromSpdyGoAway(int code) { + for (ErrorCode errorCode : ErrorCode.values()) { + if (errorCode.spdyGoAwayCode == code) return errorCode; + } + return null; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java new file mode 100644 index 0000000..1371262 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameReader.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +/** Reads transport frames for SPDY/3 or HTTP/2.0. */ +public interface FrameReader extends Closeable { + void readConnectionHeader() throws IOException; + boolean nextFrame(Handler handler) throws IOException; + + public interface Handler { + void data(boolean inFinished, int streamId, InputStream in, int length) throws IOException; + /** + * Create or update incoming headers, creating the corresponding streams + * if necessary. Frames that trigger this are SPDY SYN_STREAM, HEADERS, and + * SYN_REPLY, and HTTP/2.0 HEADERS and PUSH_PROMISE. + * + * @param inFinished true if the sender will not send further frames. + * @param outFinished true if the receiver should not send further frames. + * @param streamId the stream owning these headers. + * @param associatedStreamId the stream that triggered the sender to create + * this stream. + * @param priority or -1 for no priority. For SPDY, priorities range from 0 + * (highest) thru 7 (lowest). For HTTP/2.0, priorities range from 0 + * (highest) thru 2**31-1 (lowest). + */ + void headers(boolean outFinished, boolean inFinished, int streamId, int associatedStreamId, + int priority, List nameValueBlock, HeadersMode headersMode); + void rstStream(int streamId, ErrorCode errorCode); + void settings(boolean clearPrevious, Settings settings); + void noop(); + void ping(boolean reply, int payload1, int payload2); + void goAway(int lastGoodStreamId, ErrorCode errorCode); + void windowUpdate(int streamId, int deltaWindowSize, boolean endFlowControl); + void priority(int streamId, int priority); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java new file mode 100644 index 0000000..354f43d --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/FrameWriter.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +import java.io.Closeable; +import java.io.IOException; +import java.util.List; + +/** Writes transport frames for SPDY/3 or HTTP/2.0. */ +public interface FrameWriter extends Closeable { + /** HTTP/2.0 only. */ + void connectionHeader() throws IOException; + + /** SPDY/3 only. */ + void flush() throws IOException; + void synStream(boolean outFinished, boolean inFinished, int streamId, int associatedStreamId, + int priority, int slot, List nameValueBlock) throws IOException; + void synReply(boolean outFinished, int streamId, List nameValueBlock) throws IOException; + void headers(int streamId, List nameValueBlock) throws IOException; + void rstStream(int streamId, ErrorCode errorCode) throws IOException; + void data(boolean outFinished, int streamId, byte[] data) throws IOException; + void data(boolean outFinished, int streamId, byte[] data, int offset, int byteCount) + throws IOException; + void settings(Settings settings) throws IOException; + void noop() throws IOException; + void ping(boolean reply, int payload1, int payload2) throws IOException; + void goAway(int lastGoodStreamId, ErrorCode errorCode) throws IOException; + void windowUpdate(int streamId, int deltaWindowSize) throws IOException; +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java new file mode 100644 index 0000000..e16e176 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/HeadersMode.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.spdy; + +enum HeadersMode { + SPDY_SYN_STREAM, + SPDY_REPLY, + SPDY_HEADERS, + HTTP_20_HEADERS; + + /** Returns true if it is an error these headers to create a new stream. */ + public boolean failIfStreamAbsent() { + return this == SPDY_REPLY || this == SPDY_HEADERS; + } + + /** Returns true if it is an error these headers to update an existing stream. */ + public boolean failIfStreamPresent() { + return this == SPDY_SYN_STREAM; + } + + /** + * Returns true if it is an error these headers to be the initial headers of a + * response. + */ + public boolean failIfHeadersAbsent() { + return this == SPDY_HEADERS; + } + + /** + * Returns true if it is an error these headers to be update existing headers + * of a response. + */ + public boolean failIfHeadersPresent() { + return this == SPDY_REPLY; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java new file mode 100644 index 0000000..9eaeebd --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Hpack.java @@ -0,0 +1,387 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +import java.io.DataInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.List; + +/** + * Read and write HPACK v03. + * http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-03 + */ +final class Hpack { + + static class HeaderEntry { + private final String name; + private final String value; + + HeaderEntry(String name, String value) { + this.name = name; + this.value = value; + } + + // TODO: This needs to be the length in UTF-8 bytes, not the length in chars. + int length() { + return 32 + name.length() + value.length(); + } + } + + static final int PREFIX_5_BITS = 0x1f; + static final int PREFIX_6_BITS = 0x3f; + static final int PREFIX_7_BITS = 0x7f; + static final int PREFIX_8_BITS = 0xff; + + static final List INITIAL_CLIENT_TO_SERVER_HEADER_TABLE = Arrays.asList( + new HeaderEntry(":scheme", "http"), + new HeaderEntry(":scheme", "https"), + new HeaderEntry(":host", ""), + new HeaderEntry(":path", "/"), + new HeaderEntry(":method", "GET"), + new HeaderEntry("accept", ""), + new HeaderEntry("accept-charset", ""), + new HeaderEntry("accept-encoding", ""), + new HeaderEntry("accept-language", ""), + new HeaderEntry("cookie", ""), + new HeaderEntry("if-modified-since", ""), + new HeaderEntry("user-agent", ""), + new HeaderEntry("referer", ""), + new HeaderEntry("authorization", ""), + new HeaderEntry("allow", ""), + new HeaderEntry("cache-control", ""), + new HeaderEntry("connection", ""), + new HeaderEntry("content-length", ""), + new HeaderEntry("content-type", ""), + new HeaderEntry("date", ""), + new HeaderEntry("expect", ""), + new HeaderEntry("from", ""), + new HeaderEntry("if-match", ""), + new HeaderEntry("if-none-match", ""), + new HeaderEntry("if-range", ""), + new HeaderEntry("if-unmodified-since", ""), + new HeaderEntry("max-forwards", ""), + new HeaderEntry("proxy-authorization", ""), + new HeaderEntry("range", ""), + new HeaderEntry("via", "") + ); + + static final List INITIAL_SERVER_TO_CLIENT_HEADER_TABLE = Arrays.asList( + new HeaderEntry(":status", "200"), + new HeaderEntry("age", ""), + new HeaderEntry("cache-control", ""), + new HeaderEntry("content-length", ""), + new HeaderEntry("content-type", ""), + new HeaderEntry("date", ""), + new HeaderEntry("etag", ""), + new HeaderEntry("expires", ""), + new HeaderEntry("last-modified", ""), + new HeaderEntry("server", ""), + new HeaderEntry("set-cookie", ""), + new HeaderEntry("vary", ""), + new HeaderEntry("via", ""), + new HeaderEntry("access-control-allow-origin", ""), + new HeaderEntry("accept-ranges", ""), + new HeaderEntry("allow", ""), + new HeaderEntry("connection", ""), + new HeaderEntry("content-disposition", ""), + new HeaderEntry("content-encoding", ""), + new HeaderEntry("content-language", ""), + new HeaderEntry("content-location", ""), + new HeaderEntry("content-range", ""), + new HeaderEntry("link", ""), + new HeaderEntry("location", ""), + new HeaderEntry("proxy-authenticate", ""), + new HeaderEntry("refresh", ""), + new HeaderEntry("retry-after", ""), + new HeaderEntry("strict-transport-security", ""), + new HeaderEntry("transfer-encoding", ""), + new HeaderEntry("www-authenticate", "") + ); + + // Update these when initial tables change to sum of each entry length. + static final int INITIAL_CLIENT_TO_SERVER_HEADER_TABLE_LENGTH = 1262; + static final int INITIAL_SERVER_TO_CLIENT_HEADER_TABLE_LENGTH = 1304; + + private Hpack() { + } + + static class Reader { + private final long maxBufferSize = 4096; // TODO: needs to come from settings. + private final DataInputStream in; + + private final BitSet referenceSet = new BitSet(); + private final List headerTable; + private final List emittedHeaders = new ArrayList(); + private long bufferSize = 0; + private long bytesLeft = 0; + + Reader(DataInputStream in, boolean client) { + this.in = in; + if (client) { // we are reading from the server + this.headerTable = new ArrayList(INITIAL_SERVER_TO_CLIENT_HEADER_TABLE); + this.bufferSize = INITIAL_SERVER_TO_CLIENT_HEADER_TABLE_LENGTH; + } else { + this.headerTable = new ArrayList(INITIAL_CLIENT_TO_SERVER_HEADER_TABLE); + this.bufferSize = INITIAL_CLIENT_TO_SERVER_HEADER_TABLE_LENGTH; + } + } + + /** + * Read {@code byteCount} bytes of headers from the source stream into the + * set of emitted headers. + */ + public void readHeaders(int byteCount) throws IOException { + bytesLeft += byteCount; + // TODO: limit to 'byteCount' bytes? + + while (bytesLeft > 0) { + int b = readByte(); + + if ((b & 0x80) != 0) { + int index = readInt(b, PREFIX_7_BITS); + readIndexedHeader(index); + } else if (b == 0x60) { + readLiteralHeaderWithoutIndexingNewName(); + } else if ((b & 0xe0) == 0x60) { + int index = readInt(b, PREFIX_5_BITS); + readLiteralHeaderWithoutIndexingIndexedName(index - 1); + } else if (b == 0x40) { + readLiteralHeaderWithIncrementalIndexingNewName(); + } else if ((b & 0xe0) == 0x40) { + int index = readInt(b, PREFIX_5_BITS); + readLiteralHeaderWithIncrementalIndexingIndexedName(index - 1); + } else if (b == 0) { + readLiteralHeaderWithSubstitutionIndexingNewName(); + } else if ((b & 0xc0) == 0) { + int index = readInt(b, PREFIX_6_BITS); + readLiteralHeaderWithSubstitutionIndexingIndexedName(index - 1); + } else { + throw new AssertionError(); + } + } + } + + public void emitReferenceSet() { + for (int i = referenceSet.nextSetBit(0); i != -1; i = referenceSet.nextSetBit(i + 1)) { + emittedHeaders.add(getName(i)); + emittedHeaders.add(getValue(i)); + } + } + + /** + * Returns all headers emitted since they were last cleared, then clears the + * emitted headers. + */ + public List getAndReset() { + List result = new ArrayList(emittedHeaders); + emittedHeaders.clear(); + return result; + } + + private void readIndexedHeader(int index) { + if (referenceSet.get(index)) { + referenceSet.clear(index); + } else { + referenceSet.set(index); + } + } + + private void readLiteralHeaderWithoutIndexingIndexedName(int index) + throws IOException { + String name = getName(index); + String value = readString(); + emittedHeaders.add(name); + emittedHeaders.add(value); + } + + private void readLiteralHeaderWithoutIndexingNewName() + throws IOException { + String name = readString(); + String value = readString(); + emittedHeaders.add(name); + emittedHeaders.add(value); + } + + private void readLiteralHeaderWithIncrementalIndexingIndexedName(int nameIndex) + throws IOException { + String name = getName(nameIndex); + String value = readString(); + int index = headerTable.size(); // append to tail + insertIntoHeaderTable(index, new HeaderEntry(name, value)); + } + + private void readLiteralHeaderWithIncrementalIndexingNewName() throws IOException { + String name = readString(); + String value = readString(); + int index = headerTable.size(); // append to tail + insertIntoHeaderTable(index, new HeaderEntry(name, value)); + } + + private void readLiteralHeaderWithSubstitutionIndexingIndexedName(int nameIndex) + throws IOException { + int index = readInt(readByte(), PREFIX_8_BITS); + String name = getName(nameIndex); + String value = readString(); + insertIntoHeaderTable(index, new HeaderEntry(name, value)); + } + + private void readLiteralHeaderWithSubstitutionIndexingNewName() throws IOException { + String name = readString(); + int index = readInt(readByte(), PREFIX_8_BITS); + String value = readString(); + insertIntoHeaderTable(index, new HeaderEntry(name, value)); + } + + private String getName(int index) { + return headerTable.get(index).name; + } + + private String getValue(int index) { + return headerTable.get(index).value; + } + + private void insertIntoHeaderTable(int index, HeaderEntry entry) { + int delta = entry.length(); + if (index != headerTable.size()) { + delta -= headerTable.get(index).length(); + } + + // if the new or replacement header is too big, drop all entries. + if (delta > maxBufferSize) { + headerTable.clear(); + bufferSize = 0; + // emit the large header to the callback. + emittedHeaders.add(entry.name); + emittedHeaders.add(entry.value); + return; + } + + // Prune headers to the required length. + while (bufferSize + delta > maxBufferSize) { + remove(0); + index--; + } + + if (index < 0) { // we pruned it, so insert at beginning + index = 0; + headerTable.add(index, entry); + } else if (index == headerTable.size()) { // append to the end + headerTable.add(index, entry); + } else { // replace value at same position + headerTable.set(index, entry); + } + + bufferSize += delta; + referenceSet.set(index); + } + + private void remove(int index) { + bufferSize -= headerTable.remove(index).length(); + } + + private int readByte() throws IOException { + bytesLeft--; + return in.readByte() & 0xff; + } + + int readInt(int firstByte, int prefixMask) throws IOException { + int prefix = firstByte & prefixMask; + if (prefix < prefixMask) { + return prefix; // This was a single byte value. + } + + // This is a multibyte value. Read 7 bits at a time. + int result = prefixMask; + int shift = 0; + while (true) { + int b = readByte(); + if ((b & 0x80) != 0) { // Equivalent to (b >= 128) since b is in [0..255]. + result += (b & 0x7f) << shift; + shift += 7; + } else { + result += b << shift; // Last byte. + break; + } + } + return result; + } + + /** + * Reads a UTF-8 encoded string. Since ASCII is a subset of UTF-8, this method + * may be used to read strings that are known to be ASCII-only. + */ + public String readString() throws IOException { + int firstByte = readByte(); + int length = readInt(firstByte, PREFIX_8_BITS); + byte[] encoded = new byte[length]; + bytesLeft -= length; + in.readFully(encoded); + return new String(encoded, "UTF-8"); + } + } + + static class Writer { + private final OutputStream out; + + Writer(OutputStream out) { + this.out = out; + } + + public void writeHeaders(List nameValueBlock) throws IOException { + // TODO: implement a compression strategy. + for (int i = 0, size = nameValueBlock.size(); i < size; i += 2) { + out.write(0x60); // Literal Header without Indexing - New Name. + writeString(nameValueBlock.get(i)); + writeString(nameValueBlock.get(i + 1)); + } + } + + public void writeInt(int value, int prefixMask, int bits) throws IOException { + // Write the raw value for a single byte value. + if (value < prefixMask) { + out.write(bits | value); + return; + } + + // Write the mask to start a multibyte value. + out.write(bits | prefixMask); + value -= prefixMask; + + // Write 7 bits at a time 'til we're done. + while (value >= 0x80) { + int b = value & 0x7f; + out.write(b | 0x80); + value >>>= 7; + } + out.write(value); + } + + /** + * Writes a UTF-8 encoded string. Since ASCII is a subset of UTF-8, this + * method can be used to write strings that are known to be ASCII-only. + */ + public void writeString(String headerName) throws IOException { + byte[] bytes = headerName.getBytes("UTF-8"); + writeInt(bytes.length, PREFIX_8_BITS, 0); + out.write(bytes); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java new file mode 100644 index 0000000..3d53f48 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Http20Draft06.java @@ -0,0 +1,385 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.spdy; + +import com.squareup.okhttp.internal.Util; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.List; + +/** + * Read and write http/2 v06 frames. + * http://tools.ietf.org/html/draft-ietf-httpbis-http2-06 + */ +final class Http20Draft06 implements Variant { + private static final byte[] CONNECTION_HEADER; + static { + try { + CONNECTION_HEADER = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n".getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } + } + + static final int TYPE_DATA = 0x0; + static final int TYPE_HEADERS = 0x1; + static final int TYPE_PRIORITY = 0x2; + static final int TYPE_RST_STREAM = 0x3; + static final int TYPE_SETTINGS = 0x4; + static final int TYPE_PUSH_PROMISE = 0x5; + static final int TYPE_PING = 0x6; + static final int TYPE_GOAWAY = 0x7; + static final int TYPE_WINDOW_UPDATE = 0x9; + static final int TYPE_CONTINUATION = 0xa; + + static final int FLAG_END_STREAM = 0x1; + /** Used for headers, push-promise and continuation. */ + static final int FLAG_END_HEADERS = 0x4; + static final int FLAG_PRIORITY = 0x8; + static final int FLAG_PONG = 0x1; + static final int FLAG_END_FLOW_CONTROL = 0x1; + + @Override public FrameReader newReader(InputStream in, boolean client) { + return new Reader(in, client); + } + + @Override public FrameWriter newWriter(OutputStream out, boolean client) { + return new Writer(out, client); + } + + static final class Reader implements FrameReader { + private final DataInputStream in; + private final boolean client; + private final Hpack.Reader hpackReader; + + Reader(InputStream in, boolean client) { + this.in = new DataInputStream(in); + this.client = client; + this.hpackReader = new Hpack.Reader(this.in, client); + } + + @Override public void readConnectionHeader() throws IOException { + if (client) return; // Nothing to read; servers don't send connection headers! + byte[] connectionHeader = new byte[CONNECTION_HEADER.length]; + in.readFully(connectionHeader); + if (!Arrays.equals(connectionHeader, CONNECTION_HEADER)) { + throw ioException("Expected a connection header but was " + + Arrays.toString(connectionHeader)); + } + } + + @Override public boolean nextFrame(Handler handler) throws IOException { + int w1; + try { + w1 = in.readInt(); + } catch (IOException e) { + return false; // This might be a normal socket close. + } + int w2 = in.readInt(); + + int length = (w1 & 0xffff0000) >> 16; + int type = (w1 & 0xff00) >> 8; + int flags = w1 & 0xff; + // boolean r = (w2 & 0x80000000) != 0; // Reserved. + int streamId = (w2 & 0x7fffffff); + + switch (type) { + case TYPE_DATA: + readData(handler, flags, length, streamId); + return true; + + case TYPE_HEADERS: + readHeaders(handler, flags, length, streamId); + return true; + + case TYPE_PRIORITY: + readPriority(handler, flags, length, streamId); + return true; + + case TYPE_RST_STREAM: + readRstStream(handler, flags, length, streamId); + return true; + + case TYPE_SETTINGS: + readSettings(handler, flags, length, streamId); + return true; + + case TYPE_PUSH_PROMISE: + readPushPromise(handler, flags, length, streamId); + return true; + + case TYPE_PING: + readPing(handler, flags, length, streamId); + return true; + + case TYPE_GOAWAY: + readGoAway(handler, flags, length, streamId); + return true; + + case TYPE_WINDOW_UPDATE: + readWindowUpdate(handler, flags, length, streamId); + return true; + } + + throw new UnsupportedOperationException("TODO"); + } + + private void readHeaders(Handler handler, int flags, int length, int streamId) + throws IOException { + if (streamId == 0) throw ioException("TYPE_HEADERS streamId == 0"); + + boolean inFinished = (flags & FLAG_END_STREAM) != 0; + + while (true) { + hpackReader.readHeaders(length); + + if ((flags & FLAG_END_HEADERS) != 0) { + hpackReader.emitReferenceSet(); + List namesAndValues = hpackReader.getAndReset(); + int priority = -1; // TODO: priority + handler.headers(false, inFinished, streamId, -1, priority, namesAndValues, + HeadersMode.HTTP_20_HEADERS); + return; + } + + // Read another continuation frame. + int w1 = in.readInt(); + int w2 = in.readInt(); + + length = (w1 & 0xffff0000) >> 16; + int newType = (w1 & 0xff00) >> 8; + flags = w1 & 0xff; + + // TODO: remove in draft 8: CONTINUATION no longer sets END_STREAM + inFinished = (flags & FLAG_END_STREAM) != 0; + + // boolean u = (w2 & 0x80000000) != 0; // Unused. + int newStreamId = (w2 & 0x7fffffff); + + if (newType != TYPE_CONTINUATION) { + throw ioException("TYPE_CONTINUATION didn't have FLAG_END_HEADERS"); + } + if (newStreamId != streamId) throw ioException("TYPE_CONTINUATION streamId changed"); + } + } + + private void readData(Handler handler, int flags, int length, int streamId) throws IOException { + boolean inFinished = (flags & FLAG_END_STREAM) != 0; + handler.data(inFinished, streamId, in, length); + } + + private void readPriority(Handler handler, int flags, int length, int streamId) + throws IOException { + if (length != 4) throw ioException("TYPE_PRIORITY length: %d != 4", length); + if (streamId == 0) throw ioException("TYPE_PRIORITY streamId == 0"); + int w1 = in.readInt(); + // boolean r = (w1 & 0x80000000) != 0; // Reserved. + int priority = (w1 & 0x7fffffff); + handler.priority(streamId, priority); + } + + private void readRstStream(Handler handler, int flags, int length, int streamId) + throws IOException { + if (length != 4) throw ioException("TYPE_RST_STREAM length: %d != 4", length); + if (streamId == 0) throw ioException("TYPE_RST_STREAM streamId == 0"); + int errorCodeInt = in.readInt(); + ErrorCode errorCode = ErrorCode.fromHttp2(errorCodeInt); + if (errorCode == null) { + throw ioException("TYPE_RST_STREAM unexpected error code: %d", errorCodeInt); + } + handler.rstStream(streamId, errorCode); + } + + private void readSettings(Handler handler, int flags, int length, int streamId) + throws IOException { + if (length % 8 != 0) throw ioException("TYPE_SETTINGS length %% 8 != 0: %s", length); + if (streamId != 0) throw ioException("TYPE_SETTINGS streamId != 0"); + Settings settings = new Settings(); + for (int i = 0; i < length; i += 8) { + int w1 = in.readInt(); + int value = in.readInt(); + // int r = (w1 & 0xff000000) >>> 24; // Reserved. + int id = w1 & 0xffffff; + settings.set(id, 0, value); + } + handler.settings(false, settings); + } + + private void readPushPromise(Handler handler, int flags, int length, int streamId) { + // TODO: + } + + private void readPing(Handler handler, int flags, int length, int streamId) throws IOException { + if (length != 8) throw ioException("TYPE_PING length != 8: %s", length); + if (streamId != 0) throw ioException("TYPE_PING streamId != 0"); + int payload1 = in.readInt(); + int payload2 = in.readInt(); + boolean reply = (flags & FLAG_PONG) != 0; + handler.ping(reply, payload1, payload2); + } + + private void readGoAway(Handler handler, int flags, int length, int streamId) + throws IOException { + if (length < 8) throw ioException("TYPE_GOAWAY length < 8: %s", length); + int lastStreamId = in.readInt(); + int errorCodeInt = in.readInt(); + int opaqueDataLength = length - 8; + ErrorCode errorCode = ErrorCode.fromHttp2(errorCodeInt); + if (errorCode == null) { + throw ioException("TYPE_RST_STREAM unexpected error code: %d", errorCodeInt); + } + if (Util.skipByReading(in, opaqueDataLength) != opaqueDataLength) { + throw new IOException("TYPE_GOAWAY opaque data was truncated"); + } + handler.goAway(lastStreamId, errorCode); + } + + private void readWindowUpdate(Handler handler, int flags, int length, int streamId) + throws IOException { + int w1 = in.readInt(); + // boolean r = (w1 & 0x80000000) != 0; // Reserved. + int windowSizeIncrement = (w1 & 0x7fffffff); + boolean endFlowControl = (flags & FLAG_END_FLOW_CONTROL) != 0; + handler.windowUpdate(streamId, windowSizeIncrement, endFlowControl); + } + + private static IOException ioException(String message, Object... args) throws IOException { + throw new IOException(String.format(message, args)); + } + + @Override public void close() throws IOException { + in.close(); + } + } + + static final class Writer implements FrameWriter { + private final DataOutputStream out; + private final boolean client; + private final ByteArrayOutputStream hpackBuffer; + private final Hpack.Writer hpackWriter; + + Writer(OutputStream out, boolean client) { + this.out = new DataOutputStream(out); + this.client = client; + this.hpackBuffer = new ByteArrayOutputStream(); + this.hpackWriter = new Hpack.Writer(hpackBuffer); + } + + @Override public synchronized void flush() throws IOException { + out.flush(); + } + + @Override public synchronized void connectionHeader() throws IOException { + if (!client) return; // Nothing to write; servers don't send connection headers! + out.write(CONNECTION_HEADER); + } + + @Override public synchronized void synStream(boolean outFinished, boolean inFinished, + int streamId, int associatedStreamId, int priority, int slot, List nameValueBlock) + throws IOException { + if (inFinished) throw new UnsupportedOperationException(); + headers(outFinished, streamId, priority, nameValueBlock); + } + + @Override public synchronized void synReply(boolean outFinished, int streamId, + List nameValueBlock) throws IOException { + headers(outFinished, streamId, -1, nameValueBlock); + } + + @Override public synchronized void headers(int streamId, List nameValueBlock) + throws IOException { + headers(false, streamId, -1, nameValueBlock); + } + + private void headers(boolean outFinished, int streamId, int priority, + List nameValueBlock) throws IOException { + hpackBuffer.reset(); + hpackWriter.writeHeaders(nameValueBlock); + int type = TYPE_HEADERS; + // TODO: implement CONTINUATION + int length = hpackBuffer.size(); + int flags = FLAG_END_HEADERS; + if (outFinished) flags |= FLAG_END_STREAM; + if (priority != -1) flags |= FLAG_PRIORITY; + out.writeInt((length & 0xffff) << 16 | (type & 0xff) << 8 | (flags & 0xff)); + out.writeInt(streamId & 0x7fffffff); + if (priority != -1) out.writeInt(priority & 0x7fffffff); + hpackBuffer.writeTo(out); + } + + @Override public synchronized void rstStream(int streamId, ErrorCode errorCode) + throws IOException { + throw new UnsupportedOperationException("TODO"); + } + + @Override public void data(boolean outFinished, int streamId, byte[] data) throws IOException { + data(outFinished, streamId, data, 0, data.length); + } + + @Override public synchronized void data(boolean outFinished, int streamId, byte[] data, + int offset, int byteCount) throws IOException { + int type = TYPE_DATA; + int flags = 0; + if (outFinished) flags |= FLAG_END_STREAM; + out.writeInt((byteCount & 0xffff) << 16 | (type & 0xff) << 8 | (flags & 0xff)); + out.writeInt(streamId & 0x7fffffff); + out.write(data, offset, byteCount); + } + + @Override public synchronized void settings(Settings settings) throws IOException { + int type = TYPE_SETTINGS; + int length = settings.size() * 8; + int flags = 0; + int streamId = 0; + out.writeInt((length & 0xffff) << 16 | (type & 0xff) << 8 | (flags & 0xff)); + out.writeInt(streamId & 0x7fffffff); + for (int i = 0; i < Settings.COUNT; i++) { + if (!settings.isSet(i)) continue; + out.writeInt(i & 0xffffff); + out.writeInt(settings.get(i)); + } + } + + @Override public synchronized void noop() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override public synchronized void ping(boolean reply, int payload1, int payload2) + throws IOException { + // TODO + } + + @Override public synchronized void goAway(int lastGoodStreamId, ErrorCode errorCode) + throws IOException { + // TODO + } + + @Override public synchronized void windowUpdate(int streamId, int deltaWindowSize) + throws IOException { + // TODO + } + + @Override public void close() throws IOException { + out.close(); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java new file mode 100644 index 0000000..44d4ea2 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/IncomingStreamHandler.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +import java.io.IOException; + +/** Listener to be notified when a connected peer creates a new stream. */ +public interface IncomingStreamHandler { + IncomingStreamHandler REFUSE_INCOMING_STREAMS = new IncomingStreamHandler() { + @Override public void receive(SpdyStream stream) throws IOException { + stream.close(ErrorCode.REFUSED_STREAM); + } + }; + + /** + * Handle a new stream from this connection's peer. Implementations should + * respond by either {@link SpdyStream#reply replying to the stream} or + * {@link SpdyStream#close closing it}. This response does not need to be + * synchronous. + */ + void receive(SpdyStream stream) throws IOException; +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java new file mode 100644 index 0000000..b731a6d --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/NameValueBlockReader.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +import com.squareup.okhttp.internal.Util; +import java.io.Closeable; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.zip.DataFormatException; +import java.util.zip.Inflater; +import java.util.zip.InflaterInputStream; + +/** + * Reads a SPDY/3 Name/Value header block. This class is made complicated by the + * requirement that we're strict with which bytes we put in the compressed bytes + * buffer. We need to put all compressed bytes into that buffer -- but no other + * bytes. + */ +class NameValueBlockReader implements Closeable { + private final DataInputStream nameValueBlockIn; + private final FillableInflaterInputStream fillableInflaterInputStream; + private int compressedLimit; + + NameValueBlockReader(final InputStream in) { + // Limit the inflater input stream to only those bytes in the Name/Value block. We cut the + // inflater off at its source because we can't predict the ratio of compressed bytes to + // uncompressed bytes. + InputStream throttleStream = new InputStream() { + @Override public int read() throws IOException { + return Util.readSingleByte(this); + } + + @Override public int read(byte[] buffer, int offset, int byteCount) throws IOException { + byteCount = Math.min(byteCount, compressedLimit); + int consumed = in.read(buffer, offset, byteCount); + compressedLimit -= consumed; + return consumed; + } + + @Override public void close() throws IOException { + in.close(); + } + }; + + // Subclass inflater to install a dictionary when it's needed. + Inflater inflater = new Inflater() { + @Override public int inflate(byte[] buffer, int offset, int count) + throws DataFormatException { + int result = super.inflate(buffer, offset, count); + if (result == 0 && needsDictionary()) { + setDictionary(Spdy3.DICTIONARY); + result = super.inflate(buffer, offset, count); + } + return result; + } + }; + + fillableInflaterInputStream = new FillableInflaterInputStream(throttleStream, inflater); + nameValueBlockIn = new DataInputStream(fillableInflaterInputStream); + } + + /** Extend the inflater stream so we can eagerly fill the compressed bytes buffer if necessary. */ + static class FillableInflaterInputStream extends InflaterInputStream { + public FillableInflaterInputStream(InputStream in, Inflater inf) { + super(in, inf); + } + + @Override public void fill() throws IOException { + super.fill(); // This method is protected in the superclass. + } + } + + public List readNameValueBlock(int length) throws IOException { + this.compressedLimit += length; + try { + int numberOfPairs = nameValueBlockIn.readInt(); + if (numberOfPairs < 0) { + throw new IOException("numberOfPairs < 0: " + numberOfPairs); + } + if (numberOfPairs > 1024) { + throw new IOException("numberOfPairs > 1024: " + numberOfPairs); + } + List entries = new ArrayList(numberOfPairs * 2); + for (int i = 0; i < numberOfPairs; i++) { + String name = readString(); + String values = readString(); + if (name.length() == 0) throw new IOException("name.length == 0"); + entries.add(name); + entries.add(values); + } + + doneReading(); + + return entries; + } catch (DataFormatException e) { + throw new IOException(e.getMessage()); + } + } + + private void doneReading() throws IOException { + if (compressedLimit == 0) return; + + // Read any outstanding unread bytes. One side-effect of deflate compression is that sometimes + // there are bytes remaining in the stream after we've consumed all of the content. + fillableInflaterInputStream.fill(); + + if (compressedLimit != 0) { + throw new IOException("compressedLimit > 0: " + compressedLimit); + } + } + + private String readString() throws DataFormatException, IOException { + int length = nameValueBlockIn.readInt(); + byte[] bytes = new byte[length]; + Util.readFully(nameValueBlockIn, bytes); + return new String(bytes, 0, length, "UTF-8"); + } + + @Override public void close() throws IOException { + nameValueBlockIn.close(); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java new file mode 100644 index 0000000..c585255 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Ping.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.spdy; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * A locally-originated ping. + */ +public final class Ping { + private final CountDownLatch latch = new CountDownLatch(1); + private long sent = -1; + private long received = -1; + + Ping() { + } + + void send() { + if (sent != -1) throw new IllegalStateException(); + sent = System.nanoTime(); + } + + void receive() { + if (received != -1 || sent == -1) throw new IllegalStateException(); + received = System.nanoTime(); + latch.countDown(); + } + + void cancel() { + if (received != -1 || sent == -1) throw new IllegalStateException(); + received = sent - 1; + latch.countDown(); + } + + /** + * Returns the round trip time for this ping in nanoseconds, waiting for the + * response to arrive if necessary. Returns -1 if the response was + * cancelled. + */ + public long roundTripTime() throws InterruptedException { + latch.await(); + return received - sent; + } + + /** + * Returns the round trip time for this ping in nanoseconds, or -1 if the + * response was cancelled, or -2 if the timeout elapsed before the round + * trip completed. + */ + public long roundTripTime(long timeout, TimeUnit unit) throws InterruptedException { + if (latch.await(timeout, unit)) { + return received - sent; + } else { + return -2; + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java new file mode 100644 index 0000000..05380e2 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Settings.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2012 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.spdy; + +final class Settings { + /** + * From the spdy/3 spec, the default initial window size for all streams is + * 64 KiB. (Chrome 25 uses 10 MiB). + */ + static final int DEFAULT_INITIAL_WINDOW_SIZE = 64 * 1024; + + /** Peer request to clear durable settings. */ + static final int FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS = 0x1; + + /** Sent by servers only. The peer requests this setting persisted for future connections. */ + static final int PERSIST_VALUE = 0x1; + /** Sent by clients only. The client is reminding the server of a persisted value. */ + static final int PERSISTED = 0x2; + + /** Sender's estimate of max incoming kbps. */ + static final int UPLOAD_BANDWIDTH = 1; + /** Sender's estimate of max outgoing kbps. */ + static final int DOWNLOAD_BANDWIDTH = 2; + /** Sender's estimate of milliseconds between sending a request and receiving a response. */ + static final int ROUND_TRIP_TIME = 3; + /** Sender's maximum number of concurrent streams. */ + static final int MAX_CONCURRENT_STREAMS = 4; + /** Current CWND in Packets. */ + static final int CURRENT_CWND = 5; + /** Retransmission rate. Percentage */ + static final int DOWNLOAD_RETRANS_RATE = 6; + /** Window size in bytes. */ + static final int INITIAL_WINDOW_SIZE = 7; + /** Window size in bytes. */ + static final int CLIENT_CERTIFICATE_VECTOR_SIZE = 8; + /** Flow control options. */ + static final int FLOW_CONTROL_OPTIONS = 9; + + /** Total number of settings. */ + static final int COUNT = 10; + + /** If set, flow control is disabled for streams directed to the sender of these settings. */ + static final int FLOW_CONTROL_OPTIONS_DISABLED = 0x1; + + /** Bitfield of which flags that values. */ + private int set; + + /** Bitfield of flags that have {@link #PERSIST_VALUE}. */ + private int persistValue; + + /** Bitfield of flags that have {@link #PERSISTED}. */ + private int persisted; + + /** Flag values. */ + private final int[] values = new int[COUNT]; + + void set(int id, int idFlags, int value) { + if (id >= values.length) { + return; // Discard unknown settings. + } + + int bit = 1 << id; + set |= bit; + if ((idFlags & PERSIST_VALUE) != 0) { + persistValue |= bit; + } else { + persistValue &= ~bit; + } + if ((idFlags & PERSISTED) != 0) { + persisted |= bit; + } else { + persisted &= ~bit; + } + + values[id] = value; + } + + /** Returns true if a value has been assigned for the setting {@code id}. */ + boolean isSet(int id) { + int bit = 1 << id; + return (set & bit) != 0; + } + + /** Returns the value for the setting {@code id}, or 0 if unset. */ + int get(int id) { + return values[id]; + } + + /** Returns the flags for the setting {@code id}, or 0 if unset. */ + int flags(int id) { + int result = 0; + if (isPersisted(id)) result |= Settings.PERSISTED; + if (persistValue(id)) result |= Settings.PERSIST_VALUE; + return result; + } + + /** Returns the number of settings that have values assigned. */ + int size() { + return Integer.bitCount(set); + } + + int getUploadBandwidth(int defaultValue) { + int bit = 1 << UPLOAD_BANDWIDTH; + return (bit & set) != 0 ? values[UPLOAD_BANDWIDTH] : defaultValue; + } + + int getDownloadBandwidth(int defaultValue) { + int bit = 1 << DOWNLOAD_BANDWIDTH; + return (bit & set) != 0 ? values[DOWNLOAD_BANDWIDTH] : defaultValue; + } + + int getRoundTripTime(int defaultValue) { + int bit = 1 << ROUND_TRIP_TIME; + return (bit & set) != 0 ? values[ROUND_TRIP_TIME] : defaultValue; + } + + int getMaxConcurrentStreams(int defaultValue) { + int bit = 1 << MAX_CONCURRENT_STREAMS; + return (bit & set) != 0 ? values[MAX_CONCURRENT_STREAMS] : defaultValue; + } + + int getCurrentCwnd(int defaultValue) { + int bit = 1 << CURRENT_CWND; + return (bit & set) != 0 ? values[CURRENT_CWND] : defaultValue; + } + + int getDownloadRetransRate(int defaultValue) { + int bit = 1 << DOWNLOAD_RETRANS_RATE; + return (bit & set) != 0 ? values[DOWNLOAD_RETRANS_RATE] : defaultValue; + } + + int getInitialWindowSize(int defaultValue) { + int bit = 1 << INITIAL_WINDOW_SIZE; + return (bit & set) != 0 ? values[INITIAL_WINDOW_SIZE] : defaultValue; + } + + int getClientCertificateVectorSize(int defaultValue) { + int bit = 1 << CLIENT_CERTIFICATE_VECTOR_SIZE; + return (bit & set) != 0 ? values[CLIENT_CERTIFICATE_VECTOR_SIZE] : defaultValue; + } + + // TODO: honor this setting. + boolean isFlowControlDisabled() { + int bit = 1 << FLOW_CONTROL_OPTIONS; + int value = (bit & set) != 0 ? values[FLOW_CONTROL_OPTIONS] : 0; + return (value & FLOW_CONTROL_OPTIONS_DISABLED) != 0; + } + + /** + * Returns true if this user agent should use this setting in future SPDY + * connections to the same host. + */ + boolean persistValue(int id) { + int bit = 1 << id; + return (persistValue & bit) != 0; + } + + /** Returns true if this setting was persisted. */ + boolean isPersisted(int id) { + int bit = 1 << id; + return (persisted & bit) != 0; + } + + /** + * Writes {@code other} into this. If any setting is populated by this and + * {@code other}, the value and flags from {@code other} will be kept. + */ + void merge(Settings other) { + for (int i = 0; i < COUNT; i++) { + if (!other.isSet(i)) continue; + set(i, other.flags(i), other.get(i)); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java new file mode 100644 index 0000000..5d9a49b --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Spdy3.java @@ -0,0 +1,463 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ +package com.squareup.okhttp.internal.spdy; + +import com.squareup.okhttp.internal.Platform; +import com.squareup.okhttp.internal.Util; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.ProtocolException; +import java.util.List; +import java.util.zip.Deflater; + +final class Spdy3 implements Variant { + static final int TYPE_DATA = 0x0; + static final int TYPE_SYN_STREAM = 0x1; + static final int TYPE_SYN_REPLY = 0x2; + static final int TYPE_RST_STREAM = 0x3; + static final int TYPE_SETTINGS = 0x4; + static final int TYPE_NOOP = 0x5; + static final int TYPE_PING = 0x6; + static final int TYPE_GOAWAY = 0x7; + static final int TYPE_HEADERS = 0x8; + static final int TYPE_WINDOW_UPDATE = 0x9; + static final int TYPE_CREDENTIAL = 0x10; + + static final int FLAG_FIN = 0x1; + static final int FLAG_UNIDIRECTIONAL = 0x2; + + static final int VERSION = 3; + + static final byte[] DICTIONARY; + static { + try { + DICTIONARY = ("\u0000\u0000\u0000\u0007options\u0000\u0000\u0000\u0004hea" + + "d\u0000\u0000\u0000\u0004post\u0000\u0000\u0000\u0003put\u0000\u0000\u0000\u0006dele" + + "te\u0000\u0000\u0000\u0005trace\u0000\u0000\u0000\u0006accept\u0000\u0000\u0000" + + "\u000Eaccept-charset\u0000\u0000\u0000\u000Faccept-encoding\u0000\u0000\u0000\u000Fa" + + "ccept-language\u0000\u0000\u0000\raccept-ranges\u0000\u0000\u0000\u0003age\u0000" + + "\u0000\u0000\u0005allow\u0000\u0000\u0000\rauthorization\u0000\u0000\u0000\rcache-co" + + "ntrol\u0000\u0000\u0000\nconnection\u0000\u0000\u0000\fcontent-base\u0000\u0000" + + "\u0000\u0010content-encoding\u0000\u0000\u0000\u0010content-language\u0000\u0000" + + "\u0000\u000Econtent-length\u0000\u0000\u0000\u0010content-location\u0000\u0000\u0000" + + "\u000Bcontent-md5\u0000\u0000\u0000\rcontent-range\u0000\u0000\u0000\fcontent-type" + + "\u0000\u0000\u0000\u0004date\u0000\u0000\u0000\u0004etag\u0000\u0000\u0000\u0006expe" + + "ct\u0000\u0000\u0000\u0007expires\u0000\u0000\u0000\u0004from\u0000\u0000\u0000" + + "\u0004host\u0000\u0000\u0000\bif-match\u0000\u0000\u0000\u0011if-modified-since" + + "\u0000\u0000\u0000\rif-none-match\u0000\u0000\u0000\bif-range\u0000\u0000\u0000" + + "\u0013if-unmodified-since\u0000\u0000\u0000\rlast-modified\u0000\u0000\u0000\blocati" + + "on\u0000\u0000\u0000\fmax-forwards\u0000\u0000\u0000\u0006pragma\u0000\u0000\u0000" + + "\u0012proxy-authenticate\u0000\u0000\u0000\u0013proxy-authorization\u0000\u0000" + + "\u0000\u0005range\u0000\u0000\u0000\u0007referer\u0000\u0000\u0000\u000Bretry-after" + + "\u0000\u0000\u0000\u0006server\u0000\u0000\u0000\u0002te\u0000\u0000\u0000\u0007trai" + + "ler\u0000\u0000\u0000\u0011transfer-encoding\u0000\u0000\u0000\u0007upgrade\u0000" + + "\u0000\u0000\nuser-agent\u0000\u0000\u0000\u0004vary\u0000\u0000\u0000\u0003via" + + "\u0000\u0000\u0000\u0007warning\u0000\u0000\u0000\u0010www-authenticate\u0000\u0000" + + "\u0000\u0006method\u0000\u0000\u0000\u0003get\u0000\u0000\u0000\u0006status\u0000" + + "\u0000\u0000\u0006200 OK\u0000\u0000\u0000\u0007version\u0000\u0000\u0000\bHTTP/1.1" + + "\u0000\u0000\u0000\u0003url\u0000\u0000\u0000\u0006public\u0000\u0000\u0000\nset-coo" + + "kie\u0000\u0000\u0000\nkeep-alive\u0000\u0000\u0000\u0006origin100101201202205206300" + + "302303304305306307402405406407408409410411412413414415416417502504505203 Non-Authori" + + "tative Information204 No Content301 Moved Permanently400 Bad Request401 Unauthorized" + + "403 Forbidden404 Not Found500 Internal Server Error501 Not Implemented503 Service Un" + + "availableJan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec 00:00:00 Mon, Tue, Wed, Th" + + "u, Fri, Sat, Sun, GMTchunked,text/html,image/png,image/jpg,image/gif,application/xml" + + ",application/xhtml+xml,text/plain,text/javascript,publicprivatemax-age=gzip,deflate," + + "sdchcharset=utf-8charset=iso-8859-1,utf-,*,enq=0.").getBytes(Util.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } + } + + @Override public FrameReader newReader(InputStream in, boolean client) { + return new Reader(in, client); + } + + @Override public FrameWriter newWriter(OutputStream out, boolean client) { + return new Writer(out, client); + } + + /** Read spdy/3 frames. */ + static final class Reader implements FrameReader { + private final DataInputStream in; + private final boolean client; + private final NameValueBlockReader nameValueBlockReader; + + Reader(InputStream in, boolean client) { + this.in = new DataInputStream(in); + this.nameValueBlockReader = new NameValueBlockReader(in); + this.client = client; + } + + @Override public void readConnectionHeader() { + } + + /** + * Send the next frame to {@code handler}. Returns true unless there are no + * more frames on the stream. + */ + @Override public boolean nextFrame(Handler handler) throws IOException { + int w1; + try { + w1 = in.readInt(); + } catch (IOException e) { + return false; // This might be a normal socket close. + } + int w2 = in.readInt(); + + boolean control = (w1 & 0x80000000) != 0; + int flags = (w2 & 0xff000000) >>> 24; + int length = (w2 & 0xffffff); + + if (control) { + int version = (w1 & 0x7fff0000) >>> 16; + int type = (w1 & 0xffff); + + if (version != 3) { + throw new ProtocolException("version != 3: " + version); + } + + switch (type) { + case TYPE_SYN_STREAM: + readSynStream(handler, flags, length); + return true; + + case TYPE_SYN_REPLY: + readSynReply(handler, flags, length); + return true; + + case TYPE_RST_STREAM: + readRstStream(handler, flags, length); + return true; + + case TYPE_SETTINGS: + readSettings(handler, flags, length); + return true; + + case TYPE_NOOP: + if (length != 0) throw ioException("TYPE_NOOP length: %d != 0", length); + handler.noop(); + return true; + + case TYPE_PING: + readPing(handler, flags, length); + return true; + + case TYPE_GOAWAY: + readGoAway(handler, flags, length); + return true; + + case TYPE_HEADERS: + readHeaders(handler, flags, length); + return true; + + case TYPE_WINDOW_UPDATE: + readWindowUpdate(handler, flags, length); + return true; + + case TYPE_CREDENTIAL: + Util.skipByReading(in, length); + throw new UnsupportedOperationException("TODO"); // TODO: implement + + default: + throw new IOException("Unexpected frame"); + } + } else { + int streamId = w1 & 0x7fffffff; + boolean inFinished = (flags & FLAG_FIN) != 0; + handler.data(inFinished, streamId, in, length); + return true; + } + } + + private void readSynStream(Handler handler, int flags, int length) throws IOException { + int w1 = in.readInt(); + int w2 = in.readInt(); + int s3 = in.readShort(); + int streamId = w1 & 0x7fffffff; + int associatedStreamId = w2 & 0x7fffffff; + int priority = (s3 & 0xe000) >>> 13; + int slot = s3 & 0xff; + List nameValueBlock = nameValueBlockReader.readNameValueBlock(length - 10); + + boolean inFinished = (flags & FLAG_FIN) != 0; + boolean outFinished = (flags & FLAG_UNIDIRECTIONAL) != 0; + handler.headers(outFinished, inFinished, streamId, associatedStreamId, priority, + nameValueBlock, HeadersMode.SPDY_SYN_STREAM); + } + + private void readSynReply(Handler handler, int flags, int length) throws IOException { + int w1 = in.readInt(); + int streamId = w1 & 0x7fffffff; + List nameValueBlock = nameValueBlockReader.readNameValueBlock(length - 4); + boolean inFinished = (flags & FLAG_FIN) != 0; + handler.headers(false, inFinished, streamId, -1, -1, nameValueBlock, HeadersMode.SPDY_REPLY); + } + + private void readRstStream(Handler handler, int flags, int length) throws IOException { + if (length != 8) throw ioException("TYPE_RST_STREAM length: %d != 8", length); + int streamId = in.readInt() & 0x7fffffff; + int errorCodeInt = in.readInt(); + ErrorCode errorCode = ErrorCode.fromSpdy3Rst(errorCodeInt); + if (errorCode == null) { + throw ioException("TYPE_RST_STREAM unexpected error code: %d", errorCodeInt); + } + handler.rstStream(streamId, errorCode); + } + + private void readHeaders(Handler handler, int flags, int length) throws IOException { + int w1 = in.readInt(); + int streamId = w1 & 0x7fffffff; + List nameValueBlock = nameValueBlockReader.readNameValueBlock(length - 4); + handler.headers(false, false, streamId, -1, -1, nameValueBlock, HeadersMode.SPDY_HEADERS); + } + + private void readWindowUpdate(Handler handler, int flags, int length) throws IOException { + if (length != 8) throw ioException("TYPE_WINDOW_UPDATE length: %d != 8", length); + int w1 = in.readInt(); + int w2 = in.readInt(); + int streamId = w1 & 0x7fffffff; + int deltaWindowSize = w2 & 0x7fffffff; + handler.windowUpdate(streamId, deltaWindowSize, false); + } + + private void readPing(Handler handler, int flags, int length) throws IOException { + if (length != 4) throw ioException("TYPE_PING length: %d != 4", length); + int id = in.readInt(); + boolean reply = client == ((id % 2) == 1); + handler.ping(reply, id, 0); + } + + private void readGoAway(Handler handler, int flags, int length) throws IOException { + if (length != 8) throw ioException("TYPE_GOAWAY length: %d != 8", length); + int lastGoodStreamId = in.readInt() & 0x7fffffff; + int errorCodeInt = in.readInt(); + ErrorCode errorCode = ErrorCode.fromSpdyGoAway(errorCodeInt); + if (errorCode == null) { + throw ioException("TYPE_GOAWAY unexpected error code: %d", errorCodeInt); + } + handler.goAway(lastGoodStreamId, errorCode); + } + + private void readSettings(Handler handler, int flags, int length) throws IOException { + int numberOfEntries = in.readInt(); + if (length != 4 + 8 * numberOfEntries) { + throw ioException("TYPE_SETTINGS length: %d != 4 + 8 * %d", length, numberOfEntries); + } + Settings settings = new Settings(); + for (int i = 0; i < numberOfEntries; i++) { + int w1 = in.readInt(); + int value = in.readInt(); + int idFlags = (w1 & 0xff000000) >>> 24; + int id = w1 & 0xffffff; + settings.set(id, idFlags, value); + } + boolean clearPrevious = (flags & Settings.FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) != 0; + handler.settings(clearPrevious, settings); + } + + private static IOException ioException(String message, Object... args) throws IOException { + throw new IOException(String.format(message, args)); + } + + @Override public void close() throws IOException { + Util.closeAll(in, nameValueBlockReader); + } + } + + /** Write spdy/3 frames. */ + static final class Writer implements FrameWriter { + private final DataOutputStream out; + private final ByteArrayOutputStream nameValueBlockBuffer; + private final DataOutputStream nameValueBlockOut; + private final boolean client; + + Writer(OutputStream out, boolean client) { + this.out = new DataOutputStream(out); + this.client = client; + + Deflater deflater = new Deflater(); + deflater.setDictionary(DICTIONARY); + nameValueBlockBuffer = new ByteArrayOutputStream(); + nameValueBlockOut = new DataOutputStream( + Platform.get().newDeflaterOutputStream(nameValueBlockBuffer, deflater, true)); + } + + @Override public synchronized void connectionHeader() { + // Do nothing: no connection header for SPDY/3. + } + + @Override public synchronized void flush() throws IOException { + out.flush(); + } + + @Override public synchronized void synStream(boolean outFinished, boolean inFinished, + int streamId, int associatedStreamId, int priority, int slot, List nameValueBlock) + throws IOException { + writeNameValueBlockToBuffer(nameValueBlock); + int length = 10 + nameValueBlockBuffer.size(); + int type = TYPE_SYN_STREAM; + int flags = (outFinished ? FLAG_FIN : 0) | (inFinished ? FLAG_UNIDIRECTIONAL : 0); + + int unused = 0; + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(streamId & 0x7fffffff); + out.writeInt(associatedStreamId & 0x7fffffff); + out.writeShort((priority & 0x7) << 13 | (unused & 0x1f) << 8 | (slot & 0xff)); + nameValueBlockBuffer.writeTo(out); + out.flush(); + } + + @Override public synchronized void synReply( + boolean outFinished, int streamId, List nameValueBlock) throws IOException { + writeNameValueBlockToBuffer(nameValueBlock); + int type = TYPE_SYN_REPLY; + int flags = (outFinished ? FLAG_FIN : 0); + int length = nameValueBlockBuffer.size() + 4; + + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(streamId & 0x7fffffff); + nameValueBlockBuffer.writeTo(out); + out.flush(); + } + + @Override public synchronized void headers(int streamId, List nameValueBlock) + throws IOException { + writeNameValueBlockToBuffer(nameValueBlock); + int flags = 0; + int type = TYPE_HEADERS; + int length = nameValueBlockBuffer.size() + 4; + + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(streamId & 0x7fffffff); + nameValueBlockBuffer.writeTo(out); + out.flush(); + } + + @Override public synchronized void rstStream(int streamId, ErrorCode errorCode) + throws IOException { + if (errorCode.spdyRstCode == -1) throw new IllegalArgumentException(); + int flags = 0; + int type = TYPE_RST_STREAM; + int length = 8; + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(streamId & 0x7fffffff); + out.writeInt(errorCode.spdyRstCode); + out.flush(); + } + + @Override public synchronized void data(boolean outFinished, int streamId, byte[] data) + throws IOException { + data(outFinished, streamId, data, 0, data.length); + } + + @Override public synchronized void data(boolean outFinished, int streamId, byte[] data, + int offset, int byteCount) throws IOException { + int flags = (outFinished ? FLAG_FIN : 0); + out.writeInt(streamId & 0x7fffffff); + out.writeInt((flags & 0xff) << 24 | byteCount & 0xffffff); + out.write(data, offset, byteCount); + } + + private void writeNameValueBlockToBuffer(List nameValueBlock) throws IOException { + nameValueBlockBuffer.reset(); + int numberOfPairs = nameValueBlock.size() / 2; + nameValueBlockOut.writeInt(numberOfPairs); + for (String s : nameValueBlock) { + nameValueBlockOut.writeInt(s.length()); + nameValueBlockOut.write(s.getBytes("UTF-8")); + } + nameValueBlockOut.flush(); + } + + @Override public synchronized void settings(Settings settings) throws IOException { + int type = TYPE_SETTINGS; + int flags = 0; + int size = settings.size(); + int length = 4 + size * 8; + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(size); + for (int i = 0; i <= Settings.COUNT; i++) { + if (!settings.isSet(i)) continue; + int settingsFlags = settings.flags(i); + out.writeInt((settingsFlags & 0xff) << 24 | (i & 0xffffff)); + out.writeInt(settings.get(i)); + } + out.flush(); + } + + @Override public synchronized void noop() throws IOException { + int type = TYPE_NOOP; + int length = 0; + int flags = 0; + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.flush(); + } + + @Override public synchronized void ping(boolean reply, int payload1, int payload2) + throws IOException { + boolean payloadIsReply = client != ((payload1 % 2) == 1); + if (reply != payloadIsReply) throw new IllegalArgumentException("payload != reply"); + int type = TYPE_PING; + int flags = 0; + int length = 4; + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(payload1); + out.flush(); + } + + @Override public synchronized void goAway(int lastGoodStreamId, ErrorCode errorCode) + throws IOException { + if (errorCode.spdyGoAwayCode == -1) throw new IllegalArgumentException(); + int type = TYPE_GOAWAY; + int flags = 0; + int length = 8; + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(lastGoodStreamId); + out.writeInt(errorCode.spdyGoAwayCode); + out.flush(); + } + + @Override public synchronized void windowUpdate(int streamId, int deltaWindowSize) + throws IOException { + int type = TYPE_WINDOW_UPDATE; + int flags = 0; + int length = 8; + out.writeInt(0x80000000 | (VERSION & 0x7fff) << 16 | type & 0xffff); + out.writeInt((flags & 0xff) << 24 | length & 0xffffff); + out.writeInt(streamId); + out.writeInt(deltaWindowSize); + out.flush(); + } + + @Override public void close() throws IOException { + Util.closeAll(out, nameValueBlockOut); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java new file mode 100644 index 0000000..41724f0 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyConnection.java @@ -0,0 +1,599 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +import com.squareup.okhttp.internal.NamedRunnable; +import com.squareup.okhttp.internal.Util; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * A socket connection to a remote peer. A connection hosts streams which can + * send and receive data. + * + *

Many methods in this API are synchronous: the call is + * completed before the method returns. This is typical for Java but atypical + * for SPDY. This is motivated by exception transparency: an IOException that + * was triggered by a certain caller can be caught and handled by that caller. + */ +public final class SpdyConnection implements Closeable { + + // Internal state of this connection is guarded by 'this'. No blocking + // operations may be performed while holding this lock! + // + // Socket writes are guarded by frameWriter. + // + // Socket reads are unguarded but are only made by the reader thread. + // + // Certain operations (like SYN_STREAM) need to synchronize on both the + // frameWriter (to do blocking I/O) and this (to create streams). Such + // operations must synchronize on 'this' last. This ensures that we never + // wait for a blocking operation while holding 'this'. + + private static final ExecutorService executor = new ThreadPoolExecutor(0, + Integer.MAX_VALUE, 60, TimeUnit.SECONDS, new SynchronousQueue(), + Util.daemonThreadFactory("OkHttp SpdyConnection")); + + /** The protocol variant, like SPDY/3 or HTTP-draft-06/2.0. */ + final Variant variant; + + /** True if this peer initiated the connection. */ + final boolean client; + + /** + * User code to run in response to an incoming stream. Callbacks must not be + * run on the callback executor. + */ + private final IncomingStreamHandler handler; + private final FrameReader frameReader; + private final FrameWriter frameWriter; + + private final Map streams = new HashMap(); + private final String hostName; + private int lastGoodStreamId; + private int nextStreamId; + private boolean shutdown; + private long idleStartTimeNs = System.nanoTime(); + + /** Lazily-created map of in-flight pings awaiting a response. Guarded by this. */ + private Map pings; + private int nextPingId; + + /** Lazily-created settings for the peer. */ + Settings settings; + + private SpdyConnection(Builder builder) { + variant = builder.variant; + client = builder.client; + handler = builder.handler; + frameReader = variant.newReader(builder.in, client); + frameWriter = variant.newWriter(builder.out, client); + nextStreamId = builder.client ? 1 : 2; + nextPingId = builder.client ? 1 : 2; + + hostName = builder.hostName; + + new Thread(new Reader(), "Spdy Reader " + hostName).start(); + } + + /** + * Returns the number of {@link SpdyStream#isOpen() open streams} on this + * connection. + */ + public synchronized int openStreamCount() { + return streams.size(); + } + + private synchronized SpdyStream getStream(int id) { + return streams.get(id); + } + + synchronized SpdyStream removeStream(int streamId) { + SpdyStream stream = streams.remove(streamId); + if (stream != null && streams.isEmpty()) { + setIdle(true); + } + return stream; + } + + private synchronized void setIdle(boolean value) { + idleStartTimeNs = value ? System.nanoTime() : Long.MAX_VALUE; + } + + /** Returns true if this connection is idle. */ + public synchronized boolean isIdle() { + return idleStartTimeNs != Long.MAX_VALUE; + } + + /** + * Returns the time in ns when this connection became idle or Long.MAX_VALUE + * if connection is not idle. + */ + public synchronized long getIdleStartTimeNs() { + return idleStartTimeNs; + } + + /** + * Returns a new locally-initiated stream. + * + * @param out true to create an output stream that we can use to send data + * to the remote peer. Corresponds to {@code FLAG_FIN}. + * @param in true to create an input stream that the remote peer can use to + * send data to us. Corresponds to {@code FLAG_UNIDIRECTIONAL}. + */ + public SpdyStream newStream(List requestHeaders, boolean out, boolean in) + throws IOException { + boolean outFinished = !out; + boolean inFinished = !in; + int associatedStreamId = 0; // TODO: permit the caller to specify an associated stream? + int priority = 0; // TODO: permit the caller to specify a priority? + int slot = 0; // TODO: permit the caller to specify a slot? + SpdyStream stream; + int streamId; + + synchronized (frameWriter) { + synchronized (this) { + if (shutdown) { + throw new IOException("shutdown"); + } + streamId = nextStreamId; + nextStreamId += 2; + stream = new SpdyStream( + streamId, this, outFinished, inFinished, priority, requestHeaders, settings); + if (stream.isOpen()) { + streams.put(streamId, stream); + setIdle(false); + } + } + + frameWriter.synStream(outFinished, inFinished, streamId, associatedStreamId, priority, slot, + requestHeaders); + } + + return stream; + } + + void writeSynReply(int streamId, boolean outFinished, List alternating) + throws IOException { + frameWriter.synReply(outFinished, streamId, alternating); + } + + public void writeData(int streamId, boolean outFinished, byte[] buffer, int offset, int byteCount) + throws IOException { + frameWriter.data(outFinished, streamId, buffer, offset, byteCount); + } + + void writeSynResetLater(final int streamId, final ErrorCode errorCode) { + executor.submit(new NamedRunnable("OkHttp SPDY Writer %s stream %d", hostName, streamId) { + @Override public void execute() { + try { + writeSynReset(streamId, errorCode); + } catch (IOException ignored) { + } + } + }); + } + + void writeSynReset(int streamId, ErrorCode statusCode) throws IOException { + frameWriter.rstStream(streamId, statusCode); + } + + void writeWindowUpdateLater(final int streamId, final int deltaWindowSize) { + executor.submit(new NamedRunnable("OkHttp SPDY Writer %s stream %d", hostName, streamId) { + @Override public void execute() { + try { + writeWindowUpdate(streamId, deltaWindowSize); + } catch (IOException ignored) { + } + } + }); + } + + void writeWindowUpdate(int streamId, int deltaWindowSize) throws IOException { + frameWriter.windowUpdate(streamId, deltaWindowSize); + } + + /** + * Sends a ping frame to the peer. Use the returned object to await the + * ping's response and observe its round trip time. + */ + public Ping ping() throws IOException { + Ping ping = new Ping(); + int pingId; + synchronized (this) { + if (shutdown) { + throw new IOException("shutdown"); + } + pingId = nextPingId; + nextPingId += 2; + if (pings == null) pings = new HashMap(); + pings.put(pingId, ping); + } + writePing(false, pingId, 0x4f4b6f6b /* ASCII "OKok" */, ping); + return ping; + } + + private void writePingLater( + final boolean reply, final int payload1, final int payload2, final Ping ping) { + executor.submit(new NamedRunnable("OkHttp SPDY Writer %s ping %08x%08x", + hostName, payload1, payload2) { + @Override public void execute() { + try { + writePing(reply, payload1, payload2, ping); + } catch (IOException ignored) { + } + } + }); + } + + private void writePing(boolean reply, int payload1, int payload2, Ping ping) throws IOException { + synchronized (frameWriter) { + // Observe the sent time immediately before performing I/O. + if (ping != null) ping.send(); + frameWriter.ping(reply, payload1, payload2); + } + } + + private synchronized Ping removePing(int id) { + return pings != null ? pings.remove(id) : null; + } + + /** Sends a noop frame to the peer. */ + public void noop() throws IOException { + frameWriter.noop(); + } + + public void flush() throws IOException { + frameWriter.flush(); + } + + /** + * Degrades this connection such that new streams can neither be created + * locally, nor accepted from the remote peer. Existing streams are not + * impacted. This is intended to permit an endpoint to gracefully stop + * accepting new requests without harming previously established streams. + */ + public void shutdown(ErrorCode statusCode) throws IOException { + synchronized (frameWriter) { + int lastGoodStreamId; + synchronized (this) { + if (shutdown) { + return; + } + shutdown = true; + lastGoodStreamId = this.lastGoodStreamId; + } + frameWriter.goAway(lastGoodStreamId, statusCode); + } + } + + /** + * Closes this connection. This cancels all open streams and unanswered + * pings. It closes the underlying input and output streams and shuts down + * internal executor services. + */ + @Override public void close() throws IOException { + close(ErrorCode.NO_ERROR, ErrorCode.CANCEL); + } + + private void close(ErrorCode connectionCode, ErrorCode streamCode) throws IOException { + assert (!Thread.holdsLock(this)); + IOException thrown = null; + try { + shutdown(connectionCode); + } catch (IOException e) { + thrown = e; + } + + SpdyStream[] streamsToClose = null; + Ping[] pingsToCancel = null; + synchronized (this) { + if (!streams.isEmpty()) { + streamsToClose = streams.values().toArray(new SpdyStream[streams.size()]); + streams.clear(); + setIdle(false); + } + if (pings != null) { + pingsToCancel = pings.values().toArray(new Ping[pings.size()]); + pings = null; + } + } + + if (streamsToClose != null) { + for (SpdyStream stream : streamsToClose) { + try { + stream.close(streamCode); + } catch (IOException e) { + if (thrown != null) thrown = e; + } + } + } + + if (pingsToCancel != null) { + for (Ping ping : pingsToCancel) { + ping.cancel(); + } + } + + try { + frameReader.close(); + } catch (IOException e) { + thrown = e; + } + try { + frameWriter.close(); + } catch (IOException e) { + if (thrown == null) thrown = e; + } + + if (thrown != null) throw thrown; + } + + /** + * Sends a connection header if the current variant requires it. This should + * be called after {@link Builder#build} for all new connections. + */ + public void sendConnectionHeader() throws IOException { + frameWriter.connectionHeader(); + frameWriter.settings(new Settings()); + } + + /** + * Reads a connection header if the current variant requires it. This should + * be called after {@link Builder#build} for all new connections. + */ + public void readConnectionHeader() throws IOException { + frameReader.readConnectionHeader(); + } + + public static class Builder { + private String hostName; + private InputStream in; + private OutputStream out; + private IncomingStreamHandler handler = IncomingStreamHandler.REFUSE_INCOMING_STREAMS; + private Variant variant = Variant.SPDY3; + private boolean client; + + public Builder(boolean client, Socket socket) throws IOException { + this("", client, socket.getInputStream(), socket.getOutputStream()); + } + + public Builder(boolean client, InputStream in, OutputStream out) { + this("", client, in, out); + } + + /** + * @param client true if this peer initiated the connection; false if + * this peer accepted the connection. + */ + public Builder(String hostName, boolean client, Socket socket) throws IOException { + this(hostName, client, socket.getInputStream(), socket.getOutputStream()); + } + + /** + * @param client true if this peer initiated the connection; false if this + * peer accepted the connection. + */ + public Builder(String hostName, boolean client, InputStream in, OutputStream out) { + this.hostName = hostName; + this.client = client; + this.in = in; + this.out = out; + } + + public Builder handler(IncomingStreamHandler handler) { + this.handler = handler; + return this; + } + + public Builder spdy3() { + this.variant = Variant.SPDY3; + return this; + } + + public Builder http20Draft06() { + this.variant = Variant.HTTP_20_DRAFT_06; + return this; + } + + public SpdyConnection build() { + return new SpdyConnection(this); + } + } + + private class Reader implements Runnable, FrameReader.Handler { + @Override public void run() { + ErrorCode connectionErrorCode = ErrorCode.INTERNAL_ERROR; + ErrorCode streamErrorCode = ErrorCode.INTERNAL_ERROR; + try { + while (frameReader.nextFrame(this)) { + } + connectionErrorCode = ErrorCode.NO_ERROR; + streamErrorCode = ErrorCode.CANCEL; + } catch (IOException e) { + connectionErrorCode = ErrorCode.PROTOCOL_ERROR; + streamErrorCode = ErrorCode.PROTOCOL_ERROR; + } finally { + try { + close(connectionErrorCode, streamErrorCode); + } catch (IOException ignored) { + } + } + } + + @Override public void data(boolean inFinished, int streamId, InputStream in, int length) + throws IOException { + SpdyStream dataStream = getStream(streamId); + if (dataStream == null) { + writeSynResetLater(streamId, ErrorCode.INVALID_STREAM); + Util.skipByReading(in, length); + return; + } + dataStream.receiveData(in, length); + if (inFinished) { + dataStream.receiveFin(); + } + } + + @Override public void headers(boolean outFinished, boolean inFinished, int streamId, + int associatedStreamId, int priority, List nameValueBlock, + HeadersMode headersMode) { + SpdyStream stream; + synchronized (SpdyConnection.this) { + // If we're shutdown, don't bother with this stream. + if (shutdown) return; + + stream = getStream(streamId); + + if (stream == null) { + // The headers claim to be for an existing stream, but we don't have one. + if (headersMode.failIfStreamAbsent()) { + writeSynResetLater(streamId, ErrorCode.INVALID_STREAM); + return; + } + + // If the stream ID is less than the last created ID, assume it's already closed. + if (streamId <= lastGoodStreamId) return; + + // If the stream ID is in the client's namespace, assume it's already closed. + if (streamId % 2 == nextStreamId % 2) return; + + // Create a stream. + final SpdyStream newStream = new SpdyStream(streamId, SpdyConnection.this, outFinished, + inFinished, priority, nameValueBlock, settings); + lastGoodStreamId = streamId; + streams.put(streamId, newStream); + executor.submit(new NamedRunnable("OkHttp Callback %s stream %d", hostName, streamId) { + @Override public void execute() { + try { + handler.receive(newStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + return; + } + } + + // The headers claim to be for a new stream, but we already have one. + if (headersMode.failIfStreamPresent()) { + stream.closeLater(ErrorCode.PROTOCOL_ERROR); + removeStream(streamId); + return; + } + + // Update an existing stream. + stream.receiveHeaders(nameValueBlock, headersMode); + if (inFinished) stream.receiveFin(); + } + + @Override public void rstStream(int streamId, ErrorCode errorCode) { + SpdyStream rstStream = removeStream(streamId); + if (rstStream != null) { + rstStream.receiveRstStream(errorCode); + } + } + + @Override public void settings(boolean clearPrevious, Settings newSettings) { + SpdyStream[] streamsToNotify = null; + synchronized (SpdyConnection.this) { + if (settings == null || clearPrevious) { + settings = newSettings; + } else { + settings.merge(newSettings); + } + if (!streams.isEmpty()) { + streamsToNotify = streams.values().toArray(new SpdyStream[streams.size()]); + } + } + if (streamsToNotify != null) { + for (SpdyStream stream : streamsToNotify) { + // The synchronization here is ugly. We need to synchronize on 'this' to guard + // reads to 'settings'. We synchronize on 'stream' to guard the state change. + // And we need to acquire the 'stream' lock first, since that may block. + // TODO: this can block the reader thread until a write completes. That's bad! + synchronized (stream) { + synchronized (SpdyConnection.this) { + stream.receiveSettings(settings); + } + } + } + } + } + + @Override public void noop() { + } + + @Override public void ping(boolean reply, int payload1, int payload2) { + if (reply) { + Ping ping = removePing(payload1); + if (ping != null) { + ping.receive(); + } + } else { + // Send a reply to a client ping if this is a server and vice versa. + writePingLater(true, payload1, payload2, null); + } + } + + @Override public void goAway(int lastGoodStreamId, ErrorCode errorCode) { + synchronized (SpdyConnection.this) { + shutdown = true; + + // Fail all streams created after the last good stream ID. + for (Iterator> i = streams.entrySet().iterator(); + i.hasNext(); ) { + Map.Entry entry = i.next(); + int streamId = entry.getKey(); + if (streamId > lastGoodStreamId && entry.getValue().isLocallyInitiated()) { + entry.getValue().receiveRstStream(ErrorCode.REFUSED_STREAM); + i.remove(); + } + } + } + } + + @Override public void windowUpdate(int streamId, int deltaWindowSize, boolean endFlowControl) { + if (streamId == 0) { + // TODO: honor whole-stream flow control + return; + } + + // TODO: honor endFlowControl + SpdyStream stream = getStream(streamId); + if (stream != null) { + stream.receiveWindowUpdate(deltaWindowSize); + } + } + + @Override public void priority(int streamId, int priority) { + // TODO: honor priority. + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java new file mode 100644 index 0000000..a3ab3a4 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/SpdyStream.java @@ -0,0 +1,684 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +package com.squareup.okhttp.internal.spdy; + +import com.squareup.okhttp.internal.Util; +import java.io.IOException; +import java.io.InputStream; +import java.io.InterruptedIOException; +import java.io.OutputStream; +import java.net.SocketTimeoutException; +import java.util.ArrayList; +import java.util.List; + +import static com.squareup.okhttp.internal.Util.checkOffsetAndCount; + +/** A logical bidirectional stream. */ +public final class SpdyStream { + + // Internal state is guarded by this. No long-running or potentially + // blocking operations are performed while the lock is held. + + /** + * The number of unacknowledged bytes at which the input stream will send + * the peer a {@code WINDOW_UPDATE} frame. Must be less than this client's + * window size, otherwise the remote peer will stop sending data on this + * stream. (Chrome 25 uses 5 MiB.) + */ + public static final int WINDOW_UPDATE_THRESHOLD = Settings.DEFAULT_INITIAL_WINDOW_SIZE / 2; + + private final int id; + private final SpdyConnection connection; + private final int priority; + private long readTimeoutMillis = 0; + private int writeWindowSize; + + /** Headers sent by the stream initiator. Immutable and non null. */ + private final List requestHeaders; + + /** Headers sent in the stream reply. Null if reply is either not sent or not sent yet. */ + private List responseHeaders; + + private final SpdyDataInputStream in = new SpdyDataInputStream(); + private final SpdyDataOutputStream out = new SpdyDataOutputStream(); + + /** + * The reason why this stream was abnormally closed. If there are multiple + * reasons to abnormally close this stream (such as both peers closing it + * near-simultaneously) then this is the first reason known to this peer. + */ + private ErrorCode errorCode = null; + + SpdyStream(int id, SpdyConnection connection, boolean outFinished, boolean inFinished, + int priority, List requestHeaders, Settings settings) { + if (connection == null) throw new NullPointerException("connection == null"); + if (requestHeaders == null) throw new NullPointerException("requestHeaders == null"); + this.id = id; + this.connection = connection; + this.in.finished = inFinished; + this.out.finished = outFinished; + this.priority = priority; + this.requestHeaders = requestHeaders; + + setSettings(settings); + } + + /** + * Returns true if this stream is open. A stream is open until either: + *

    + *
  • A {@code SYN_RESET} frame abnormally terminates the stream. + *
  • Both input and output streams have transmitted all data and + * headers. + *
+ * Note that the input stream may continue to yield data even after a stream + * reports itself as not open. This is because input data is buffered. + */ + public synchronized boolean isOpen() { + if (errorCode != null) { + return false; + } + if ((in.finished || in.closed) && (out.finished || out.closed) && responseHeaders != null) { + return false; + } + return true; + } + + /** Returns true if this stream was created by this peer. */ + public boolean isLocallyInitiated() { + boolean streamIsClient = (id % 2 == 1); + return connection.client == streamIsClient; + } + + public SpdyConnection getConnection() { + return connection; + } + + public List getRequestHeaders() { + return requestHeaders; + } + + /** + * Returns the stream's response headers, blocking if necessary if they + * have not been received yet. + */ + public synchronized List getResponseHeaders() throws IOException { + long remaining = 0; + long start = 0; + if (readTimeoutMillis != 0) { + start = (System.nanoTime() / 1000000); + remaining = readTimeoutMillis; + } + try { + while (responseHeaders == null && errorCode == null) { + if (readTimeoutMillis == 0) { // No timeout configured. + wait(); + } else if (remaining > 0) { + wait(remaining); + remaining = start + readTimeoutMillis - (System.nanoTime() / 1000000); + } else { + throw new SocketTimeoutException("Read response header timeout. readTimeoutMillis: " + + readTimeoutMillis); + } + } + if (responseHeaders != null) { + return responseHeaders; + } + throw new IOException("stream was reset: " + errorCode); + } catch (InterruptedException e) { + InterruptedIOException rethrow = new InterruptedIOException(); + rethrow.initCause(e); + throw rethrow; + } + } + + /** + * Returns the reason why this stream was closed, or null if it closed + * normally or has not yet been closed. + */ + public synchronized ErrorCode getErrorCode() { + return errorCode; + } + + /** + * Sends a reply to an incoming stream. + * + * @param out true to create an output stream that we can use to send data + * to the remote peer. Corresponds to {@code FLAG_FIN}. + */ + public void reply(List responseHeaders, boolean out) throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + boolean outFinished = false; + synchronized (this) { + if (responseHeaders == null) { + throw new NullPointerException("responseHeaders == null"); + } + if (isLocallyInitiated()) { + throw new IllegalStateException("cannot reply to a locally initiated stream"); + } + if (this.responseHeaders != null) { + throw new IllegalStateException("reply already sent"); + } + this.responseHeaders = responseHeaders; + if (!out) { + this.out.finished = true; + outFinished = true; + } + } + connection.writeSynReply(id, outFinished, responseHeaders); + } + + /** + * Sets the maximum time to wait on input stream reads before failing with a + * {@code SocketTimeoutException}, or {@code 0} to wait indefinitely. + */ + public void setReadTimeout(long readTimeoutMillis) { + this.readTimeoutMillis = readTimeoutMillis; + } + + public long getReadTimeoutMillis() { + return readTimeoutMillis; + } + + /** Returns an input stream that can be used to read data from the peer. */ + public InputStream getInputStream() { + return in; + } + + /** + * Returns an output stream that can be used to write data to the peer. + * + * @throws IllegalStateException if this stream was initiated by the peer + * and a {@link #reply} has not yet been sent. + */ + public OutputStream getOutputStream() { + synchronized (this) { + if (responseHeaders == null && !isLocallyInitiated()) { + throw new IllegalStateException("reply before requesting the output stream"); + } + } + return out; + } + + /** + * Abnormally terminate this stream. This blocks until the {@code RST_STREAM} + * frame has been transmitted. + */ + public void close(ErrorCode rstStatusCode) throws IOException { + if (!closeInternal(rstStatusCode)) { + return; // Already closed. + } + connection.writeSynReset(id, rstStatusCode); + } + + /** + * Abnormally terminate this stream. This enqueues a {@code RST_STREAM} + * frame and returns immediately. + */ + public void closeLater(ErrorCode errorCode) { + if (!closeInternal(errorCode)) { + return; // Already closed. + } + connection.writeSynResetLater(id, errorCode); + } + + /** Returns true if this stream was closed. */ + private boolean closeInternal(ErrorCode errorCode) { + assert (!Thread.holdsLock(this)); + synchronized (this) { + if (this.errorCode != null) { + return false; + } + if (in.finished && out.finished) { + return false; + } + this.errorCode = errorCode; + notifyAll(); + } + connection.removeStream(id); + return true; + } + + void receiveHeaders(List headers, HeadersMode headersMode) { + assert (!Thread.holdsLock(SpdyStream.this)); + ErrorCode errorCode = null; + boolean open = true; + synchronized (this) { + if (responseHeaders == null) { + if (headersMode.failIfHeadersAbsent()) { + errorCode = ErrorCode.PROTOCOL_ERROR; + } else { + responseHeaders = headers; + open = isOpen(); + notifyAll(); + } + } else { + if (headersMode.failIfHeadersPresent()) { + errorCode = ErrorCode.STREAM_IN_USE; + } else { + List newHeaders = new ArrayList(); + newHeaders.addAll(responseHeaders); + newHeaders.addAll(headers); + this.responseHeaders = newHeaders; + } + } + } + if (errorCode != null) { + closeLater(errorCode); + } else if (!open) { + connection.removeStream(id); + } + } + + void receiveData(InputStream in, int length) throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + this.in.receive(in, length); + } + + void receiveFin() { + assert (!Thread.holdsLock(SpdyStream.this)); + boolean open; + synchronized (this) { + this.in.finished = true; + open = isOpen(); + notifyAll(); + } + if (!open) { + connection.removeStream(id); + } + } + + synchronized void receiveRstStream(ErrorCode errorCode) { + if (this.errorCode == null) { + this.errorCode = errorCode; + notifyAll(); + } + } + + private void setSettings(Settings settings) { + // TODO: For HTTP/2.0, also adjust the stream flow control window size + // by the difference between the new value and the old value. + assert (Thread.holdsLock(connection)); // Because 'settings' is guarded by 'connection'. + this.writeWindowSize = settings != null + ? settings.getInitialWindowSize(Settings.DEFAULT_INITIAL_WINDOW_SIZE) + : Settings.DEFAULT_INITIAL_WINDOW_SIZE; + } + + void receiveSettings(Settings settings) { + assert (Thread.holdsLock(this)); + setSettings(settings); + notifyAll(); + } + + synchronized void receiveWindowUpdate(int deltaWindowSize) { + out.unacknowledgedBytes -= deltaWindowSize; + notifyAll(); + } + + int getPriority() { + return priority; + } + + /** + * An input stream that reads the incoming data frames of a stream. Although + * this class uses synchronization to safely receive incoming data frames, + * it is not intended for use by multiple readers. + */ + private final class SpdyDataInputStream extends InputStream { + // Store incoming data bytes in a circular buffer. When the buffer is + // empty, pos == -1. Otherwise pos is the first byte to read and limit + // is the first byte to write. + // + // { - - - X X X X - - - } + // ^ ^ + // pos limit + // + // { X X X - - - - X X X } + // ^ ^ + // limit pos + + private final byte[] buffer = new byte[Settings.DEFAULT_INITIAL_WINDOW_SIZE]; + + /** the next byte to be read, or -1 if the buffer is empty. Never buffer.length */ + private int pos = -1; + + /** the last byte to be read. Never buffer.length */ + private int limit; + + /** True if the caller has closed this stream. */ + private boolean closed; + + /** + * True if either side has cleanly shut down this stream. We will + * receive no more bytes beyond those already in the buffer. + */ + private boolean finished; + + /** + * The total number of bytes consumed by the application (with {@link + * #read}), but not yet acknowledged by sending a {@code WINDOW_UPDATE} + * frame. + */ + private int unacknowledgedBytes = 0; + + @Override public int available() throws IOException { + synchronized (SpdyStream.this) { + checkNotClosed(); + if (pos == -1) { + return 0; + } else if (limit > pos) { + return limit - pos; + } else { + return limit + (buffer.length - pos); + } + } + } + + @Override public int read() throws IOException { + return Util.readSingleByte(this); + } + + @Override public int read(byte[] b, int offset, int count) throws IOException { + synchronized (SpdyStream.this) { + checkOffsetAndCount(b.length, offset, count); + waitUntilReadable(); + checkNotClosed(); + + if (pos == -1) { + return -1; + } + + int copied = 0; + + // drain from [pos..buffer.length) + if (limit <= pos) { + int bytesToCopy = Math.min(count, buffer.length - pos); + System.arraycopy(buffer, pos, b, offset, bytesToCopy); + pos += bytesToCopy; + copied += bytesToCopy; + if (pos == buffer.length) { + pos = 0; + } + } + + // drain from [pos..limit) + if (copied < count) { + int bytesToCopy = Math.min(limit - pos, count - copied); + System.arraycopy(buffer, pos, b, offset + copied, bytesToCopy); + pos += bytesToCopy; + copied += bytesToCopy; + } + + // Flow control: notify the peer that we're ready for more data! + unacknowledgedBytes += copied; + if (unacknowledgedBytes >= WINDOW_UPDATE_THRESHOLD) { + connection.writeWindowUpdateLater(id, unacknowledgedBytes); + unacknowledgedBytes = 0; + } + + if (pos == limit) { + pos = -1; + limit = 0; + } + + return copied; + } + } + + /** + * Returns once the input stream is either readable or finished. Throws + * a {@link SocketTimeoutException} if the read timeout elapses before + * that happens. + */ + private void waitUntilReadable() throws IOException { + long start = 0; + long remaining = 0; + if (readTimeoutMillis != 0) { + start = (System.nanoTime() / 1000000); + remaining = readTimeoutMillis; + } + try { + while (pos == -1 && !finished && !closed && errorCode == null) { + if (readTimeoutMillis == 0) { + SpdyStream.this.wait(); + } else if (remaining > 0) { + SpdyStream.this.wait(remaining); + remaining = start + readTimeoutMillis - (System.nanoTime() / 1000000); + } else { + throw new SocketTimeoutException(); + } + } + } catch (InterruptedException e) { + throw new InterruptedIOException(); + } + } + + void receive(InputStream in, int byteCount) throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + + if (byteCount == 0) { + return; + } + + int pos; + int limit; + int firstNewByte; + boolean finished; + boolean flowControlError; + synchronized (SpdyStream.this) { + finished = this.finished; + pos = this.pos; + firstNewByte = this.limit; + limit = this.limit; + flowControlError = byteCount > buffer.length - available(); + } + + // If the peer sends more data than we can handle, discard it and close the connection. + if (flowControlError) { + Util.skipByReading(in, byteCount); + closeLater(ErrorCode.FLOW_CONTROL_ERROR); + return; + } + + // Discard data received after the stream is finished. It's probably a benign race. + if (finished) { + Util.skipByReading(in, byteCount); + return; + } + + // Fill the buffer without holding any locks. First fill [limit..buffer.length) if that + // won't overwrite unread data. Then fill [limit..pos). We can't hold a lock, otherwise + // writes will be blocked until reads complete. + if (pos < limit) { + int firstCopyCount = Math.min(byteCount, buffer.length - limit); + Util.readFully(in, buffer, limit, firstCopyCount); + limit += firstCopyCount; + byteCount -= firstCopyCount; + if (limit == buffer.length) { + limit = 0; + } + } + if (byteCount > 0) { + Util.readFully(in, buffer, limit, byteCount); + limit += byteCount; + } + + synchronized (SpdyStream.this) { + // Update the new limit, and mark the position as readable if necessary. + this.limit = limit; + if (this.pos == -1) { + this.pos = firstNewByte; + SpdyStream.this.notifyAll(); + } + } + } + + @Override public void close() throws IOException { + synchronized (SpdyStream.this) { + closed = true; + SpdyStream.this.notifyAll(); + } + cancelStreamIfNecessary(); + } + + private void checkNotClosed() throws IOException { + if (closed) { + throw new IOException("stream closed"); + } + if (errorCode != null) { + throw new IOException("stream was reset: " + errorCode); + } + } + } + + private void cancelStreamIfNecessary() throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + boolean open; + boolean cancel; + synchronized (this) { + cancel = !in.finished && in.closed && (out.finished || out.closed); + open = isOpen(); + } + if (cancel) { + // RST this stream to prevent additional data from being sent. This + // is safe because the input stream is closed (we won't use any + // further bytes) and the output stream is either finished or closed + // (so RSTing both streams doesn't cause harm). + SpdyStream.this.close(ErrorCode.CANCEL); + } else if (!open) { + connection.removeStream(id); + } + } + + /** + * An output stream that writes outgoing data frames of a stream. This class + * is not thread safe. + */ + private final class SpdyDataOutputStream extends OutputStream { + private final byte[] buffer = new byte[8192]; + private int pos = 0; + + /** True if the caller has closed this stream. */ + private boolean closed; + + /** + * True if either side has cleanly shut down this stream. We shall send + * no more bytes. + */ + private boolean finished; + + /** + * The total number of bytes written out to the peer, but not yet + * acknowledged with an incoming {@code WINDOW_UPDATE} frame. Writes + * block if they cause this to exceed the {@code WINDOW_SIZE}. + */ + private int unacknowledgedBytes = 0; + + @Override public void write(int b) throws IOException { + Util.writeSingleByte(this, b); + } + + @Override public void write(byte[] bytes, int offset, int count) throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + checkOffsetAndCount(bytes.length, offset, count); + checkNotClosed(); + + while (count > 0) { + if (pos == buffer.length) { + writeFrame(false); + } + int bytesToCopy = Math.min(count, buffer.length - pos); + System.arraycopy(bytes, offset, buffer, pos, bytesToCopy); + pos += bytesToCopy; + offset += bytesToCopy; + count -= bytesToCopy; + } + } + + @Override public void flush() throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + checkNotClosed(); + if (pos > 0) { + writeFrame(false); + connection.flush(); + } + } + + @Override public void close() throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + synchronized (SpdyStream.this) { + if (closed) { + return; + } + closed = true; + } + if (!out.finished) { + writeFrame(true); + } + connection.flush(); + cancelStreamIfNecessary(); + } + + private void writeFrame(boolean outFinished) throws IOException { + assert (!Thread.holdsLock(SpdyStream.this)); + + int length = pos; + synchronized (SpdyStream.this) { + waitUntilWritable(length, outFinished); + unacknowledgedBytes += length; + } + connection.writeData(id, outFinished, buffer, 0, pos); + pos = 0; + } + + /** + * Returns once the peer is ready to receive {@code count} bytes. + * + * @throws IOException if the stream was finished or closed, or the + * thread was interrupted. + */ + private void waitUntilWritable(int count, boolean last) throws IOException { + try { + while (unacknowledgedBytes + count >= writeWindowSize) { + SpdyStream.this.wait(); // Wait until we receive a WINDOW_UPDATE. + + // The stream may have been closed or reset while we were waiting! + if (!last && closed) { + throw new IOException("stream closed"); + } else if (finished) { + throw new IOException("stream finished"); + } else if (errorCode != null) { + throw new IOException("stream was reset: " + errorCode); + } + } + } catch (InterruptedException e) { + throw new InterruptedIOException(); + } + } + + private void checkNotClosed() throws IOException { + synchronized (SpdyStream.this) { + if (closed) { + throw new IOException("stream closed"); + } else if (finished) { + throw new IOException("stream finished"); + } else if (errorCode != null) { + throw new IOException("stream was reset: " + errorCode); + } + } + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java new file mode 100644 index 0000000..8f48bcd --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/spdy/Variant.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2013 Square, Inc. + * + * 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. + */ +package com.squareup.okhttp.internal.spdy; + +import java.io.InputStream; +import java.io.OutputStream; + +/** A version and dialect of the framed socket protocol. */ +interface Variant { + Variant SPDY3 = new Spdy3(); + Variant HTTP_20_DRAFT_06 = new Http20Draft06(); + + /** + * @param client true if this is the HTTP client's reader, reading frames from + * a peer SPDY or HTTP/2 server. + */ + FrameReader newReader(InputStream in, boolean client); + + /** + * @param client true if this is the HTTP client's writer, writing frames to a + * peer SPDY or HTTP/2 server. + */ + FrameWriter newWriter(OutputStream out, boolean client); +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java new file mode 100644 index 0000000..e0aef14 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/DistinguishedNameParser.java @@ -0,0 +1,407 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package com.squareup.okhttp.internal.tls; + +import javax.security.auth.x500.X500Principal; + +/** + * A distinguished name (DN) parser. This parser only supports extracting a + * string value from a DN. It doesn't support values in the hex-string style. + */ +final class DistinguishedNameParser { + private final String dn; + private final int length; + private int pos; + private int beg; + private int end; + + /** Temporary variable to store positions of the currently parsed item. */ + private int cur; + + /** Distinguished name characters. */ + private char[] chars; + + public DistinguishedNameParser(X500Principal principal) { + // RFC2253 is used to ensure we get attributes in the reverse + // order of the underlying ASN.1 encoding, so that the most + // significant values of repeated attributes occur first. + this.dn = principal.getName(X500Principal.RFC2253); + this.length = this.dn.length(); + } + + // gets next attribute type: (ALPHA 1*keychar) / oid + private String nextAT() { + // skip preceding space chars, they can present after + // comma or semicolon (compatibility with RFC 1779) + for (; pos < length && chars[pos] == ' '; pos++) { + } + if (pos == length) { + return null; // reached the end of DN + } + + // mark the beginning of attribute type + beg = pos; + + // attribute type chars + pos++; + for (; pos < length && chars[pos] != '=' && chars[pos] != ' '; pos++) { + // we don't follow exact BNF syntax here: + // accept any char except space and '=' + } + if (pos >= length) { + throw new IllegalStateException("Unexpected end of DN: " + dn); + } + + // mark the end of attribute type + end = pos; + + // skip trailing space chars between attribute type and '=' + // (compatibility with RFC 1779) + if (chars[pos] == ' ') { + for (; pos < length && chars[pos] != '=' && chars[pos] == ' '; pos++) { + } + + if (chars[pos] != '=' || pos == length) { + throw new IllegalStateException("Unexpected end of DN: " + dn); + } + } + + pos++; //skip '=' char + + // skip space chars between '=' and attribute value + // (compatibility with RFC 1779) + for (; pos < length && chars[pos] == ' '; pos++) { + } + + // in case of oid attribute type skip its prefix: "oid." or "OID." + // (compatibility with RFC 1779) + if ((end - beg > 4) && (chars[beg + 3] == '.') + && (chars[beg] == 'O' || chars[beg] == 'o') + && (chars[beg + 1] == 'I' || chars[beg + 1] == 'i') + && (chars[beg + 2] == 'D' || chars[beg + 2] == 'd')) { + beg += 4; + } + + return new String(chars, beg, end - beg); + } + + // gets quoted attribute value: QUOTATION *( quotechar / pair ) QUOTATION + private String quotedAV() { + pos++; + beg = pos; + end = beg; + while (true) { + + if (pos == length) { + throw new IllegalStateException("Unexpected end of DN: " + dn); + } + + if (chars[pos] == '"') { + // enclosing quotation was found + pos++; + break; + } else if (chars[pos] == '\\') { + chars[end] = getEscaped(); + } else { + // shift char: required for string with escaped chars + chars[end] = chars[pos]; + } + pos++; + end++; + } + + // skip trailing space chars before comma or semicolon. + // (compatibility with RFC 1779) + for (; pos < length && chars[pos] == ' '; pos++) { + } + + return new String(chars, beg, end - beg); + } + + // gets hex string attribute value: "#" hexstring + private String hexAV() { + if (pos + 4 >= length) { + // encoded byte array must be not less then 4 c + throw new IllegalStateException("Unexpected end of DN: " + dn); + } + + beg = pos; // store '#' position + pos++; + while (true) { + + // check for end of attribute value + // looks for space and component separators + if (pos == length || chars[pos] == '+' || chars[pos] == ',' + || chars[pos] == ';') { + end = pos; + break; + } + + if (chars[pos] == ' ') { + end = pos; + pos++; + // skip trailing space chars before comma or semicolon. + // (compatibility with RFC 1779) + for (; pos < length && chars[pos] == ' '; pos++) { + } + break; + } else if (chars[pos] >= 'A' && chars[pos] <= 'F') { + chars[pos] += 32; //to low case + } + + pos++; + } + + // verify length of hex string + // encoded byte array must be not less then 4 and must be even number + int hexLen = end - beg; // skip first '#' char + if (hexLen < 5 || (hexLen & 1) == 0) { + throw new IllegalStateException("Unexpected end of DN: " + dn); + } + + // get byte encoding from string representation + byte[] encoded = new byte[hexLen / 2]; + for (int i = 0, p = beg + 1; i < encoded.length; p += 2, i++) { + encoded[i] = (byte) getByte(p); + } + + return new String(chars, beg, hexLen); + } + + // gets string attribute value: *( stringchar / pair ) + private String escapedAV() { + beg = pos; + end = pos; + while (true) { + if (pos >= length) { + // the end of DN has been found + return new String(chars, beg, end - beg); + } + + switch (chars[pos]) { + case '+': + case ',': + case ';': + // separator char has been found + return new String(chars, beg, end - beg); + case '\\': + // escaped char + chars[end++] = getEscaped(); + pos++; + break; + case ' ': + // need to figure out whether space defines + // the end of attribute value or not + cur = end; + + pos++; + chars[end++] = ' '; + + for (; pos < length && chars[pos] == ' '; pos++) { + chars[end++] = ' '; + } + if (pos == length || chars[pos] == ',' || chars[pos] == '+' + || chars[pos] == ';') { + // separator char or the end of DN has been found + return new String(chars, beg, cur - beg); + } + break; + default: + chars[end++] = chars[pos]; + pos++; + } + } + } + + // returns escaped char + private char getEscaped() { + pos++; + if (pos == length) { + throw new IllegalStateException("Unexpected end of DN: " + dn); + } + + switch (chars[pos]) { + case '"': + case '\\': + case ',': + case '=': + case '+': + case '<': + case '>': + case '#': + case ';': + case ' ': + case '*': + case '%': + case '_': + //FIXME: escaping is allowed only for leading or trailing space char + return chars[pos]; + default: + // RFC doesn't explicitly say that escaped hex pair is + // interpreted as UTF-8 char. It only contains an example of such DN. + return getUTF8(); + } + } + + // decodes UTF-8 char + // see http://www.unicode.org for UTF-8 bit distribution table + private char getUTF8() { + int res = getByte(pos); + pos++; //FIXME tmp + + if (res < 128) { // one byte: 0-7F + return (char) res; + } else if (res >= 192 && res <= 247) { + + int count; + if (res <= 223) { // two bytes: C0-DF + count = 1; + res = res & 0x1F; + } else if (res <= 239) { // three bytes: E0-EF + count = 2; + res = res & 0x0F; + } else { // four bytes: F0-F7 + count = 3; + res = res & 0x07; + } + + int b; + for (int i = 0; i < count; i++) { + pos++; + if (pos == length || chars[pos] != '\\') { + return 0x3F; //FIXME failed to decode UTF-8 char - return '?' + } + pos++; + + b = getByte(pos); + pos++; //FIXME tmp + if ((b & 0xC0) != 0x80) { + return 0x3F; //FIXME failed to decode UTF-8 char - return '?' + } + + res = (res << 6) + (b & 0x3F); + } + return (char) res; + } else { + return 0x3F; //FIXME failed to decode UTF-8 char - return '?' + } + } + + // Returns byte representation of a char pair + // The char pair is composed of DN char in + // specified 'position' and the next char + // According to BNF syntax: + // hexchar = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" + // / "a" / "b" / "c" / "d" / "e" / "f" + private int getByte(int position) { + if (position + 1 >= length) { + throw new IllegalStateException("Malformed DN: " + dn); + } + + int b1, b2; + + b1 = chars[position]; + if (b1 >= '0' && b1 <= '9') { + b1 = b1 - '0'; + } else if (b1 >= 'a' && b1 <= 'f') { + b1 = b1 - 87; // 87 = 'a' - 10 + } else if (b1 >= 'A' && b1 <= 'F') { + b1 = b1 - 55; // 55 = 'A' - 10 + } else { + throw new IllegalStateException("Malformed DN: " + dn); + } + + b2 = chars[position + 1]; + if (b2 >= '0' && b2 <= '9') { + b2 = b2 - '0'; + } else if (b2 >= 'a' && b2 <= 'f') { + b2 = b2 - 87; // 87 = 'a' - 10 + } else if (b2 >= 'A' && b2 <= 'F') { + b2 = b2 - 55; // 55 = 'A' - 10 + } else { + throw new IllegalStateException("Malformed DN: " + dn); + } + + return (b1 << 4) + b2; + } + + /** + * Parses the DN and returns the most significant attribute value + * for an attribute type, or null if none found. + * + * @param attributeType attribute type to look for (e.g. "ca") + */ + public String findMostSpecific(String attributeType) { + // Initialize internal state. + pos = 0; + beg = 0; + end = 0; + cur = 0; + chars = dn.toCharArray(); + + String attType = nextAT(); + if (attType == null) { + return null; + } + while (true) { + String attValue = ""; + + if (pos == length) { + return null; + } + + switch (chars[pos]) { + case '"': + attValue = quotedAV(); + break; + case '#': + attValue = hexAV(); + break; + case '+': + case ',': + case ';': // compatibility with RFC 1779: semicolon can separate RDNs + //empty attribute value + break; + default: + attValue = escapedAV(); + } + + // Values are ordered from most specific to least specific + // due to the RFC2253 formatting. So take the first match + // we see. + if (attributeType.equalsIgnoreCase(attType)) { + return attValue; + } + + if (pos >= length) { + return null; + } + + if (chars[pos] == ',' || chars[pos] == ';') { + } else if (chars[pos] != '+') { + throw new IllegalStateException("Malformed DN: " + dn); + } + + pos++; + attType = nextAT(); + if (attType == null) { + throw new IllegalStateException("Malformed DN: " + dn); + } + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java new file mode 100644 index 0000000..a08773f --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/com/squareup/okhttp/internal/tls/OkHostnameVerifier.java @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package com.squareup.okhttp.internal.tls; + +import java.security.cert.Certificate; +import java.security.cert.CertificateParsingException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.regex.Pattern; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLSession; +import javax.security.auth.x500.X500Principal; + +/** + * A HostnameVerifier consistent with RFC 2818. + */ +public final class OkHostnameVerifier implements HostnameVerifier { + public static final OkHostnameVerifier INSTANCE = new OkHostnameVerifier(); + + /** + * Quick and dirty pattern to differentiate IP addresses from hostnames. This + * is an approximation of Android's private InetAddress#isNumeric API. + * + *

This matches IPv6 addresses as a hex string containing at least one + * colon, and possibly including dots after the first colon. It matches IPv4 + * addresses as strings containing only decimal digits and dots. This pattern + * matches strings like "a:.23" and "54" that are neither IP addresses nor + * hostnames; they will be verified as IP addresses (which is a more strict + * verification). + */ + private static final Pattern VERIFY_AS_IP_ADDRESS = Pattern.compile( + "([0-9a-fA-F]*:[0-9a-fA-F:.]*)|([\\d.]+)"); + + private static final int ALT_DNS_NAME = 2; + private static final int ALT_IPA_NAME = 7; + + private OkHostnameVerifier() { + } + + public boolean verify(String host, SSLSession session) { + try { + Certificate[] certificates = session.getPeerCertificates(); + return verify(host, (X509Certificate) certificates[0]); + } catch (SSLException e) { + return false; + } + } + + public boolean verify(String host, X509Certificate certificate) { + return verifyAsIpAddress(host) + ? verifyIpAddress(host, certificate) + : verifyHostName(host, certificate); + } + + static boolean verifyAsIpAddress(String host) { + return VERIFY_AS_IP_ADDRESS.matcher(host).matches(); + } + + /** + * Returns true if {@code certificate} matches {@code ipAddress}. + */ + private boolean verifyIpAddress(String ipAddress, X509Certificate certificate) { + for (String altName : getSubjectAltNames(certificate, ALT_IPA_NAME)) { + if (ipAddress.equalsIgnoreCase(altName)) { + return true; + } + } + return false; + } + + /** + * Returns true if {@code certificate} matches {@code hostName}. + */ + private boolean verifyHostName(String hostName, X509Certificate certificate) { + hostName = hostName.toLowerCase(Locale.US); + boolean hasDns = false; + for (String altName : getSubjectAltNames(certificate, ALT_DNS_NAME)) { + hasDns = true; + if (verifyHostName(hostName, altName)) { + return true; + } + } + + if (!hasDns) { + X500Principal principal = certificate.getSubjectX500Principal(); + // RFC 2818 advises using the most specific name for matching. + String cn = new DistinguishedNameParser(principal).findMostSpecific("cn"); + if (cn != null) { + return verifyHostName(hostName, cn); + } + } + + return false; + } + + private List getSubjectAltNames(X509Certificate certificate, int type) { + List result = new ArrayList(); + try { + Collection subjectAltNames = certificate.getSubjectAlternativeNames(); + if (subjectAltNames == null) { + return Collections.emptyList(); + } + for (Object subjectAltName : subjectAltNames) { + List entry = (List) subjectAltName; + if (entry == null || entry.size() < 2) { + continue; + } + Integer altNameType = (Integer) entry.get(0); + if (altNameType == null) { + continue; + } + if (altNameType == type) { + String altName = (String) entry.get(1); + if (altName != null) { + result.add(altName); + } + } + } + return result; + } catch (CertificateParsingException e) { + return Collections.emptyList(); + } + } + + /** + * Returns true if {@code hostName} matches the name or pattern {@code cn}. + * + * @param hostName lowercase host name. + * @param cn certificate host name. May include wildcards like + * {@code *.android.com}. + */ + public boolean verifyHostName(String hostName, String cn) { + // Check length == 0 instead of .isEmpty() to support Java 5. + if (hostName == null || hostName.length() == 0 || cn == null || cn.length() == 0) { + return false; + } + + cn = cn.toLowerCase(Locale.US); + + if (!cn.contains("*")) { + return hostName.equals(cn); + } + + if (cn.startsWith("*.") && hostName.regionMatches(0, cn, 2, cn.length() - 2)) { + return true; // "*.foo.com" matches "foo.com" + } + + int asterisk = cn.indexOf('*'); + int dot = cn.indexOf('.'); + if (asterisk > dot) { + return false; // malformed; wildcard must be in the first part of the cn + } + + if (!hostName.regionMatches(0, cn, 0, asterisk)) { + return false; // prefix before '*' doesn't match + } + + int suffixLength = cn.length() - (asterisk + 1); + int suffixStart = hostName.length() - suffixLength; + if (hostName.indexOf('.', asterisk) < suffixStart) { + // TODO: remove workaround for *.clients.google.com http://b/5426333 + if (!hostName.endsWith(".clients.google.com")) { + return false; // wildcard '*' can't match a '.' + } + } + + if (!hostName.regionMatches(suffixStart, cn, asterisk + 1, suffixLength)) { + return false; // suffix after '*' doesn't match + } + + return true; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/App.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/App.java new file mode 100644 index 0000000..8a11fbd --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/App.java @@ -0,0 +1,331 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.LOG; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.telephony.TelephonyManager; +import android.view.KeyEvent; + +import java.util.HashMap; + +/** + * This class exposes methods in Cordova that can be called from JavaScript. + */ +public class App extends CordovaPlugin { + + public static final String PLUGIN_NAME = "App"; + protected static final String TAG = "CordovaApp"; + private BroadcastReceiver telephonyReceiver; + private CallbackContext messageChannel; + + /** + * Send an event to be fired on the Javascript side. + * + * @param action The name of the event to be fired + */ + public void fireJavascriptEvent(String action) { + sendEventMessage(action); + } + + /** + * Sets the context of the Command. This can then be used to do things like + * get file paths associated with the Activity. + */ + @Override + public void pluginInitialize() { + this.initTelephonyReceiver(); + } + + /** + * Executes the request and returns PluginResult. + * + * @param action The action to execute. + * @param args JSONArry of arguments for the plugin. + * @param callbackContext The callback context from which we were invoked. + * @return A PluginResult object with a status and message. + */ + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + PluginResult.Status status = PluginResult.Status.OK; + String result = ""; + + try { + if (action.equals("clearCache")) { + this.clearCache(); + } + else if (action.equals("show")) { + // This gets called from JavaScript onCordovaReady to show the webview. + // I recommend we change the name of the Message as spinner/stop is not + // indicative of what this actually does (shows the webview). + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + webView.postMessage("spinner", "stop"); + } + }); + } + else if (action.equals("loadUrl")) { + this.loadUrl(args.getString(0), args.optJSONObject(1)); + } + else if (action.equals("cancelLoadUrl")) { + //this.cancelLoadUrl(); + } + else if (action.equals("clearHistory")) { + this.clearHistory(); + } + else if (action.equals("backHistory")) { + this.backHistory(); + } + else if (action.equals("overrideButton")) { + this.overrideButton(args.getString(0), args.getBoolean(1)); + } + else if (action.equals("overrideBackbutton")) { + this.overrideBackbutton(args.getBoolean(0)); + } + else if (action.equals("exitApp")) { + this.exitApp(); + } + else if (action.equals("messageChannel")) { + messageChannel = callbackContext; + return true; + } + + callbackContext.sendPluginResult(new PluginResult(status, result)); + return true; + } catch (JSONException e) { + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); + return false; + } + } + + //-------------------------------------------------------------------------- + // LOCAL METHODS + //-------------------------------------------------------------------------- + + /** + * Clear the resource cache. + */ + public void clearCache() { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + webView.clearCache(true); + } + }); + } + + /** + * Load the url into the webview. + * + * @param url + * @param props Properties that can be passed in to the Cordova activity (i.e. loadingDialog, wait, ...) + * @throws JSONException + */ + public void loadUrl(String url, JSONObject props) throws JSONException { + LOG.d("App", "App.loadUrl("+url+","+props+")"); + int wait = 0; + boolean openExternal = false; + boolean clearHistory = false; + + // If there are properties, then set them on the Activity + HashMap params = new HashMap(); + if (props != null) { + JSONArray keys = props.names(); + for (int i = 0; i < keys.length(); i++) { + String key = keys.getString(i); + if (key.equals("wait")) { + wait = props.getInt(key); + } + else if (key.equalsIgnoreCase("openexternal")) { + openExternal = props.getBoolean(key); + } + else if (key.equalsIgnoreCase("clearhistory")) { + clearHistory = props.getBoolean(key); + } + else { + Object value = props.get(key); + if (value == null) { + + } + else if (value.getClass().equals(String.class)) { + params.put(key, (String)value); + } + else if (value.getClass().equals(Boolean.class)) { + params.put(key, (Boolean)value); + } + else if (value.getClass().equals(Integer.class)) { + params.put(key, (Integer)value); + } + } + } + } + + // If wait property, then delay loading + + if (wait > 0) { + try { + synchronized(this) { + this.wait(wait); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + this.webView.showWebPage(url, openExternal, clearHistory, params); + } + + /** + * Clear page history for the app. + */ + public void clearHistory() { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + webView.clearHistory(); + } + }); + } + + /** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ + public void backHistory() { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + webView.backHistory(); + } + }); + } + + /** + * Override the default behavior of the Android back button. + * If overridden, when the back button is pressed, the "backKeyDown" JavaScript event will be fired. + * + * @param override T=override, F=cancel override + */ + public void overrideBackbutton(boolean override) { + LOG.i("App", "WARNING: Back Button Default Behavior will be overridden. The backbutton event will be fired!"); + webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_BACK, override); + } + + /** + * Override the default behavior of the Android volume buttons. + * If overridden, when the volume button is pressed, the "volume[up|down]button" JavaScript event will be fired. + * + * @param button volumeup, volumedown + * @param override T=override, F=cancel override + */ + public void overrideButton(String button, boolean override) { + LOG.i("App", "WARNING: Volume Button Default Behavior will be overridden. The volume event will be fired!"); + if (button.equals("volumeup")) { + webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_UP, override); + } + else if (button.equals("volumedown")) { + webView.setButtonPlumbedToJs(KeyEvent.KEYCODE_VOLUME_DOWN, override); + } + } + + /** + * Return whether the Android back button is overridden by the user. + * + * @return boolean + */ + public boolean isBackbuttonOverridden() { + return webView.isButtonPlumbedToJs(KeyEvent.KEYCODE_BACK); + } + + /** + * Exit the Android application. + */ + public void exitApp() { + this.webView.postMessage("exit", null); + } + + + /** + * Listen for telephony events: RINGING, OFFHOOK and IDLE + * Send these events to all plugins using + * CordovaActivity.onMessage("telephone", "ringing" | "offhook" | "idle") + */ + private void initTelephonyReceiver() { + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); + //final CordovaInterface mycordova = this.cordova; + this.telephonyReceiver = new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent intent) { + + // If state has changed + if ((intent != null) && intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { + if (intent.hasExtra(TelephonyManager.EXTRA_STATE)) { + String extraData = intent.getStringExtra(TelephonyManager.EXTRA_STATE); + if (extraData.equals(TelephonyManager.EXTRA_STATE_RINGING)) { + LOG.i(TAG, "Telephone RINGING"); + webView.postMessage("telephone", "ringing"); + } + else if (extraData.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { + LOG.i(TAG, "Telephone OFFHOOK"); + webView.postMessage("telephone", "offhook"); + } + else if (extraData.equals(TelephonyManager.EXTRA_STATE_IDLE)) { + LOG.i(TAG, "Telephone IDLE"); + webView.postMessage("telephone", "idle"); + } + } + } + } + }; + + // Register the receiver + webView.getContext().registerReceiver(this.telephonyReceiver, intentFilter); + } + + private void sendEventMessage(String action) { + JSONObject obj = new JSONObject(); + try { + obj.put("action", action); + } catch (JSONException e) { + LOG.e(TAG, "Failed to create event message", e); + } + PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, obj); + pluginResult.setKeepCallback(true); + if (messageChannel != null) { + messageChannel.sendPluginResult(pluginResult); + } + } + + /* + * Unregister the receiver + * + */ + public void onDestroy() + { + webView.getContext().unregisterReceiver(this.telephonyReceiver); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java new file mode 100644 index 0000000..d3a231a --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/AuthenticationToken.java @@ -0,0 +1,69 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +/** + * The Class AuthenticationToken defines the userName and password to be used for authenticating a web resource + */ +public class AuthenticationToken { + private String userName; + private String password; + + /** + * Gets the user name. + * + * @return the user name + */ + public String getUserName() { + return userName; + } + + /** + * Sets the user name. + * + * @param userName + * the new user name + */ + public void setUserName(String userName) { + this.userName = userName; + } + + /** + * Gets the password. + * + * @return the password + */ + public String getPassword() { + return password; + } + + /** + * Sets the password. + * + * @param password + * the new password + */ + public void setPassword(String password) { + this.password = password; + } + + + + +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java new file mode 100644 index 0000000..446c37d --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CallbackContext.java @@ -0,0 +1,144 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import org.json.JSONArray; + +import android.util.Log; + +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PluginResult; +import org.json.JSONObject; + +public class CallbackContext { + private static final String LOG_TAG = "CordovaPlugin"; + + private String callbackId; + private CordovaWebView webView; + private boolean finished; + private int changingThreads; + + public CallbackContext(String callbackId, CordovaWebView webView) { + this.callbackId = callbackId; + this.webView = webView; + } + + public boolean isFinished() { + return finished; + } + + public boolean isChangingThreads() { + return changingThreads > 0; + } + + public String getCallbackId() { + return callbackId; + } + + public void sendPluginResult(PluginResult pluginResult) { + synchronized (this) { + if (finished) { + Log.w(LOG_TAG, "Attempted to send a second callback for ID: " + callbackId + "\nResult was: " + pluginResult.getMessage()); + return; + } else { + finished = !pluginResult.getKeepCallback(); + } + } + webView.sendPluginResult(pluginResult, callbackId); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(JSONObject message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(String message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(JSONArray message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(byte[] message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + * + * @param message The message to add to the success result. + */ + public void success(int message) { + sendPluginResult(new PluginResult(PluginResult.Status.OK, message)); + } + + /** + * Helper for success callbacks that just returns the Status.OK by default + */ + public void success() { + sendPluginResult(new PluginResult(PluginResult.Status.OK)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(JSONObject message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(String message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } + + /** + * Helper for error callbacks that just returns the Status.ERROR by default + * + * @param message The message to add to the error result. + */ + public void error(int message) { + sendPluginResult(new PluginResult(PluginResult.Status.ERROR, message)); + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/Config.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/Config.java new file mode 100644 index 0000000..f13292c --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/Config.java @@ -0,0 +1,122 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova; + +import java.util.List; + +import android.app.Activity; +import android.util.Log; + +@Deprecated // Use Whitelist, CordovaPrefences, etc. directly. +public class Config { + private static final String TAG = "Config"; + + static ConfigXmlParser parser; + + private Config() { + } + + public static void init(Activity action) { + parser = new ConfigXmlParser(); + parser.parse(action); + parser.getPreferences().setPreferencesBundle(action.getIntent().getExtras()); + parser.getPreferences().copyIntoIntentExtras(action); + } + + // Intended to be used for testing only; creates an empty configuration. + public static void init() { + if (parser == null) { + parser = new ConfigXmlParser(); + } + } + + /** + * Add entry to approved list of URLs (whitelist) + * + * @param origin URL regular expression to allow + * @param subdomains T=include all subdomains under origin + */ + public static void addWhiteListEntry(String origin, boolean subdomains) { + if (parser == null) { + Log.e(TAG, "Config was not initialised. Did you forget to Config.init(this)?"); + return; + } + parser.getInternalWhitelist().addWhiteListEntry(origin, subdomains); + } + + /** + * Determine if URL is in approved list of URLs to load. + * + * @param url + * @return true if whitelisted + */ + public static boolean isUrlWhiteListed(String url) { + if (parser == null) { + Log.e(TAG, "Config was not initialised. Did you forget to Config.init(this)?"); + return false; + } + return parser.getInternalWhitelist().isUrlWhiteListed(url); + } + + /** + * Determine if URL is in approved list of URLs to launch external applications. + * + * @param url + * @return true if whitelisted + */ + public static boolean isUrlExternallyWhiteListed(String url) { + if (parser == null) { + Log.e(TAG, "Config was not initialised. Did you forget to Config.init(this)?"); + return false; + } + return parser.getExternalWhitelist().isUrlWhiteListed(url); + } + + public static String getStartUrl() { + if (parser == null) { + return "file:///android_asset/www/index.html"; + } + return parser.getLaunchUrl(); + } + + public static String getErrorUrl() { + return parser.getPreferences().getString("errorurl", null); + } + + public static Whitelist getWhitelist() { + return parser.getInternalWhitelist(); + } + + public static Whitelist getExternalWhitelist() { + return parser.getExternalWhitelist(); + } + + public static List getPluginEntries() { + return parser.getPluginEntries(); + } + + public static CordovaPreferences getPreferences() { + return parser.getPreferences(); + } + + public static boolean isInitialized() { + return parser != null; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java new file mode 100644 index 0000000..1ada1af --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/ConfigXmlParser.java @@ -0,0 +1,181 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +package org.apache.cordova; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.cordova.LOG; +import org.xmlpull.v1.XmlPullParserException; + +import android.app.Activity; +import android.content.res.XmlResourceParser; +import android.util.Log; + +public class ConfigXmlParser { + private static String TAG = "ConfigXmlParser"; + + private String launchUrl = "file:///android_asset/www/index.html"; + private CordovaPreferences prefs = new CordovaPreferences(); + private Whitelist internalWhitelist = new Whitelist(); + private Whitelist externalWhitelist = new Whitelist(); + private ArrayList pluginEntries = new ArrayList(20); + + public Whitelist getInternalWhitelist() { + return internalWhitelist; + } + + public Whitelist getExternalWhitelist() { + return externalWhitelist; + } + + public CordovaPreferences getPreferences() { + return prefs; + } + + public ArrayList getPluginEntries() { + return pluginEntries; + } + + public String getLaunchUrl() { + return launchUrl; + } + + public void parse(Activity action) { + // First checking the class namespace for config.xml + int id = action.getResources().getIdentifier("config", "xml", action.getClass().getPackage().getName()); + if (id == 0) { + // If we couldn't find config.xml there, we'll look in the namespace from AndroidManifest.xml + id = action.getResources().getIdentifier("config", "xml", action.getPackageName()); + if (id == 0) { + LOG.e(TAG, "res/xml/config.xml is missing!"); + return; + } + } + parse(action.getResources().getXml(id)); + } + + public void parse(XmlResourceParser xml) { + int eventType = -1; + String service = "", pluginClass = "", paramType = ""; + boolean onload = false; + boolean insideFeature = false; + ArrayList urlMap = null; + + // Add implicitly allowed URLs + internalWhitelist.addWhiteListEntry("file:///*", false); + internalWhitelist.addWhiteListEntry("content:///*", false); + internalWhitelist.addWhiteListEntry("data:*", false); + + while (eventType != XmlResourceParser.END_DOCUMENT) { + if (eventType == XmlResourceParser.START_TAG) { + String strNode = xml.getName(); + if (strNode.equals("url-filter")) { + Log.w(TAG, "Plugin " + service + " is using deprecated tag "); + if (urlMap == null) { + urlMap = new ArrayList(2); + } + urlMap.add(xml.getAttributeValue(null, "value")); + } else if (strNode.equals("feature")) { + //Check for supported feature sets aka. plugins (Accelerometer, Geolocation, etc) + //Set the bit for reading params + insideFeature = true; + service = xml.getAttributeValue(null, "name"); + } + else if (insideFeature && strNode.equals("param")) { + paramType = xml.getAttributeValue(null, "name"); + if (paramType.equals("service")) // check if it is using the older service param + service = xml.getAttributeValue(null, "value"); + else if (paramType.equals("package") || paramType.equals("android-package")) + pluginClass = xml.getAttributeValue(null,"value"); + else if (paramType.equals("onload")) + onload = "true".equals(xml.getAttributeValue(null, "value")); + } + else if (strNode.equals("access")) { + String origin = xml.getAttributeValue(null, "origin"); + String subdomains = xml.getAttributeValue(null, "subdomains"); + boolean external = (xml.getAttributeValue(null, "launch-external") != null); + if (origin != null) { + if (external) { + externalWhitelist.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0)); + } else { + if ("*".equals(origin)) { + // Special-case * origin to mean http and https when used for internal + // whitelist. This prevents external urls like sms: and geo: from being + // handled internally. + internalWhitelist.addWhiteListEntry("http://*/*", false); + internalWhitelist.addWhiteListEntry("https://*/*", false); + } else { + internalWhitelist.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0)); + } + } + } + } + else if (strNode.equals("preference")) { + String name = xml.getAttributeValue(null, "name").toLowerCase(Locale.ENGLISH); + String value = xml.getAttributeValue(null, "value"); + prefs.set(name, value); + } + else if (strNode.equals("content")) { + String src = xml.getAttributeValue(null, "src"); + if (src != null) { + setStartUrl(src); + } + } + } + else if (eventType == XmlResourceParser.END_TAG) + { + String strNode = xml.getName(); + if (strNode.equals("feature")) { + pluginEntries.add(new PluginEntry(service, pluginClass, onload, urlMap)); + + service = ""; + pluginClass = ""; + insideFeature = false; + onload = false; + urlMap = null; + } + } + try { + eventType = xml.next(); + } catch (XmlPullParserException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void setStartUrl(String src) { + Pattern schemeRegex = Pattern.compile("^[a-z-]+://"); + Matcher matcher = schemeRegex.matcher(src); + if (matcher.find()) { + launchUrl = src; + } else { + if (src.charAt(0) == '/') { + src = src.substring(1); + } + launchUrl = "file:///android_asset/www/" + src; + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java new file mode 100644 index 0000000..cb8f27d --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaActivity.java @@ -0,0 +1,951 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Locale; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.media.AudioManager; +import android.os.Bundle; +import android.util.Log; +import android.view.Display; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.WebViewClient; +import android.widget.LinearLayout; + +/** + * This class is the main Android activity that represents the Cordova + * application. It should be extended by the user to load the specific + * html file that contains the application. + * + * As an example: + * + *

+ *     package org.apache.cordova.examples;
+ *
+ *     import android.os.Bundle;
+ *     import org.apache.cordova.*;
+ *
+ *     public class Example extends CordovaActivity {
+ *       @Override
+ *       public void onCreate(Bundle savedInstanceState) {
+ *         super.onCreate(savedInstanceState);
+ *         super.init();
+ *         // Load your application
+ *         loadUrl(launchUrl);
+ *       }
+ *     }
+ * 
+ * + * Cordova xml configuration: Cordova uses a configuration file at + * res/xml/config.xml to specify its settings. See "The config.xml File" + * guide in cordova-docs at http://cordova.apache.org/docs for the documentation + * for the configuration. The use of the set*Property() methods is + * deprecated in favor of the config.xml file. + * + */ +public class CordovaActivity extends Activity implements CordovaInterface { + public static String TAG = "CordovaActivity"; + + // The webview for our app + protected CordovaWebView appView; + + @Deprecated // unused. + protected CordovaWebViewClient webViewClient; + + @Deprecated // Will be removed. Use findViewById() to retrieve views. + protected LinearLayout root; + + private final ExecutorService threadPool = Executors.newCachedThreadPool(); + + private static int ACTIVITY_STARTING = 0; + private static int ACTIVITY_RUNNING = 1; + private static int ACTIVITY_EXITING = 2; + private int activityState = 0; // 0=starting, 1=running (after 1st resume), 2=shutting down + + // Plugin to call when activity result is received + protected int activityResultRequestCode; + protected CordovaPlugin activityResultCallback; + protected boolean activityResultKeepRunning; + + /* + * The variables below are used to cache some of the activity properties. + */ + + // Draw a splash screen using an image located in the drawable resource directory. + @Deprecated // Use "SplashScreen" preference instead. + protected int splashscreen = 0; + @Deprecated // Use "SplashScreenDelay" preference instead. + protected int splashscreenTime = -1; + + // LoadUrl timeout value in msec (default of 20 sec) + protected int loadUrlTimeoutValue = 20000; + + // Keep app running when pause is received. (default = true) + // If true, then the JavaScript and native code continue to run in the background + // when another application (activity) is started. + protected boolean keepRunning = true; + + private String initCallbackClass; + + // Read from config.xml: + protected CordovaPreferences preferences; + protected Whitelist internalWhitelist; + protected Whitelist externalWhitelist; + protected String launchUrl; + protected ArrayList pluginEntries; + + /** + * Sets the authentication token. + * + * @param authenticationToken + * @param host + * @param realm + */ + public void setAuthenticationToken(AuthenticationToken authenticationToken, String host, String realm) { + if (this.appView != null && this.appView.viewClient != null) { + this.appView.viewClient.setAuthenticationToken(authenticationToken, host, realm); + } + } + + /** + * Removes the authentication token. + * + * @param host + * @param realm + * + * @return the authentication token or null if did not exist + */ + public AuthenticationToken removeAuthenticationToken(String host, String realm) { + if (this.appView != null && this.appView.viewClient != null) { + return this.appView.viewClient.removeAuthenticationToken(host, realm); + } + return null; + } + + /** + * Gets the authentication token. + * + * In order it tries: + * 1- host + realm + * 2- host + * 3- realm + * 4- no host, no realm + * + * @param host + * @param realm + * + * @return the authentication token + */ + public AuthenticationToken getAuthenticationToken(String host, String realm) { + if (this.appView != null && this.appView.viewClient != null) { + return this.appView.viewClient.getAuthenticationToken(host, realm); + } + return null; + } + + /** + * Clear all authentication tokens. + */ + public void clearAuthenticationTokens() { + if (this.appView != null && this.appView.viewClient != null) { + this.appView.viewClient.clearAuthenticationTokens(); + } + } + + /** + * Called when the activity is first created. + */ + @Override + public void onCreate(Bundle savedInstanceState) { + LOG.i(TAG, "Apache Cordova native platform version " + CordovaWebView.CORDOVA_VERSION + " is starting"); + LOG.d(TAG, "CordovaActivity.onCreate()"); + + // need to activate preferences before super.onCreate to avoid "requestFeature() must be called before adding content" exception + loadConfig(); + if(!preferences.getBoolean("ShowTitle", false)) + { + getWindow().requestFeature(Window.FEATURE_NO_TITLE); + } + + if(preferences.getBoolean("SetFullscreen", false)) + { + Log.d(TAG, "The SetFullscreen configuration is deprecated in favor of Fullscreen, and will be removed in a future version."); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } else if (preferences.getBoolean("Fullscreen", false)) { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } else { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); + } + + super.onCreate(savedInstanceState); + + if(savedInstanceState != null) + { + initCallbackClass = savedInstanceState.getString("callbackClass"); + } + } + + @SuppressWarnings("deprecation") + protected void loadConfig() { + ConfigXmlParser parser = new ConfigXmlParser(); + parser.parse(this); + preferences = parser.getPreferences(); + preferences.setPreferencesBundle(getIntent().getExtras()); + preferences.copyIntoIntentExtras(this); + internalWhitelist = parser.getInternalWhitelist(); + externalWhitelist = parser.getExternalWhitelist(); + launchUrl = parser.getLaunchUrl(); + pluginEntries = parser.getPluginEntries(); + Config.parser = parser; + } + + @SuppressWarnings("deprecation") + protected void createViews() { + // This builds the view. We could probably get away with NOT having a LinearLayout, but I like having a bucket! + + LOG.d(TAG, "CordovaActivity.createViews()"); + + Display display = getWindowManager().getDefaultDisplay(); + int width = display.getWidth(); + int height = display.getHeight(); + + root = new LinearLayoutSoftKeyboardDetect(this, width, height); + root.setOrientation(LinearLayout.VERTICAL); + root.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT, 0.0F)); + + appView.setId(100); + appView.setLayoutParams(new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT, + 1.0F)); + + // need to remove appView from any existing parent before invoking root.addView(appView) + ViewParent parent = appView.getParent(); + if ((parent != null) && (parent != root)) { + LOG.d(TAG, "removing appView from existing parent"); + ViewGroup parentGroup = (ViewGroup) parent; + parentGroup.removeView(appView); + } + root.addView((View) appView); + setContentView(root); + + int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK); + root.setBackgroundColor(backgroundColor); + } + + /** + * Get the Android activity. + */ + @Override public Activity getActivity() { + return this; + } + + /** + * Construct the default web view object. + * + * This is intended to be overridable by subclasses of CordovaIntent which + * require a more specialized web view. + */ + protected CordovaWebView makeWebView() { + return new CordovaWebView(CordovaActivity.this); + } + + /** + * Construct the client for the default web view object. + * + * This is intended to be overridable by subclasses of CordovaIntent which + * require a more specialized web view. + * + * @param webView the default constructed web view object + */ + protected CordovaWebViewClient makeWebViewClient(CordovaWebView webView) { + return webView.makeWebViewClient(this); + } + + /** + * Construct the chrome client for the default web view object. + * + * This is intended to be overridable by subclasses of CordovaIntent which + * require a more specialized web view. + * + * @param webView the default constructed web view object + */ + protected CordovaChromeClient makeChromeClient(CordovaWebView webView) { + return webView.makeWebChromeClient(this); + } + + public void init() { + this.init(appView, null, null); + } + + @SuppressLint("NewApi") + @Deprecated // Call init() instead and override makeWebView() to customize. + public void init(CordovaWebView webView, CordovaWebViewClient webViewClient, CordovaChromeClient webChromeClient) { + LOG.d(TAG, "CordovaActivity.init()"); + + if (splashscreenTime >= 0) { + preferences.set("SplashScreenDelay", splashscreenTime); + } + if (splashscreen != 0) { + preferences.set("SplashDrawableId", splashscreen); + } + + appView = webView != null ? webView : makeWebView(); + + // TODO: Have the views set this themselves. + if (preferences.getBoolean("DisallowOverscroll", false)) { + appView.setOverScrollMode(View.OVER_SCROLL_NEVER); + } + createViews(); + + // Init plugins only after creating views + if (appView.pluginManager == null) { + appView.init(this, webViewClient != null ? webViewClient : makeWebViewClient(appView), + webChromeClient != null ? webChromeClient : makeChromeClient(appView), + pluginEntries, internalWhitelist, externalWhitelist, preferences); + } + + // Wire the hardware volume controls to control media if desired. + String volumePref = preferences.getString("DefaultVolumeStream", ""); + if ("media".equals(volumePref.toLowerCase(Locale.ENGLISH))) { + setVolumeControlStream(AudioManager.STREAM_MUSIC); + } + } + + /** + * Load the url into the webview. + */ + public void loadUrl(String url) { + if (appView == null) { + init(); + } + // If keepRunning + this.keepRunning = preferences.getBoolean("KeepRunning", true); + + appView.loadUrlIntoView(url, true); + } + + /** + * Load the url into the webview after waiting for period of time. + * This is used to display the splashscreen for certain amount of time. + * + * @param url + * @param time The number of ms to wait before loading webview + */ + @Deprecated // Use loadUrl(String url) instead. + public void loadUrl(final String url, int time) { + + this.splashscreenTime = time; + this.loadUrl(url); + } + + @Deprecated + public void cancelLoadUrl() { + } + + /** + * Clear the resource cache. + */ + @Deprecated // Call method on appView directly. + public void clearCache() { + if (appView == null) { + init(); + } + this.appView.clearCache(true); + } + + /** + * Clear web history in this web view. + */ + @Deprecated // Call method on appView directly. + public void clearHistory() { + this.appView.clearHistory(); + } + + /** + * Go to previous page in history. (We manage our own history) + * + * @return true if we went back, false if we are already at top + */ + @Deprecated // Call method on appView directly. + public boolean backHistory() { + if (this.appView != null) { + return appView.backHistory(); + } + return false; + } + + /** + * Get boolean property for activity. + */ + @Deprecated // Call method on preferences directly. + public boolean getBooleanProperty(String name, boolean defaultValue) { + return preferences.getBoolean(name, defaultValue); + } + + /** + * Get int property for activity. + */ + @Deprecated // Call method on preferences directly. + public int getIntegerProperty(String name, int defaultValue) { + return preferences.getInteger(name, defaultValue); + } + + /** + * Get string property for activity. + */ + @Deprecated // Call method on preferences directly. + public String getStringProperty(String name, String defaultValue) { + return preferences.getString(name, defaultValue); + } + + /** + * Get double property for activity. + */ + @Deprecated // Call method on preferences directly. + public double getDoubleProperty(String name, double defaultValue) { + return preferences.getDouble(name, defaultValue); + } + + /** + * Set boolean property on activity. + * This method has been deprecated in 3.0 and will be removed at a future + * time. Please use config.xml instead. + * + * @param name + * @param value + * @deprecated + */ + @Deprecated + public void setBooleanProperty(String name, boolean value) { + Log.d(TAG, "Setting boolean properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); + this.getIntent().putExtra(name.toLowerCase(), value); + } + + /** + * Set int property on activity. + * This method has been deprecated in 3.0 and will be removed at a future + * time. Please use config.xml instead. + * + * @param name + * @param value + * @deprecated + */ + @Deprecated + public void setIntegerProperty(String name, int value) { + Log.d(TAG, "Setting integer properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); + this.getIntent().putExtra(name.toLowerCase(), value); + } + + /** + * Set string property on activity. + * This method has been deprecated in 3.0 and will be removed at a future + * time. Please use config.xml instead. + * + * @param name + * @param value + * @deprecated + */ + @Deprecated + public void setStringProperty(String name, String value) { + Log.d(TAG, "Setting string properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); + this.getIntent().putExtra(name.toLowerCase(), value); + } + + /** + * Set double property on activity. + * This method has been deprecated in 3.0 and will be removed at a future + * time. Please use config.xml instead. + * + * @param name + * @param value + * @deprecated + */ + @Deprecated + public void setDoubleProperty(String name, double value) { + Log.d(TAG, "Setting double properties in CordovaActivity will be deprecated in 3.0 on July 2013, please use config.xml"); + this.getIntent().putExtra(name.toLowerCase(), value); + } + + /** + * Called when the system is about to start resuming a previous activity. + */ + @Override + protected void onPause() { + super.onPause(); + + LOG.d(TAG, "Paused the application!"); + + // Don't process pause if shutting down, since onDestroy() will be called + if (this.activityState == ACTIVITY_EXITING) { + return; + } + + if (this.appView == null) { + return; + } + else + { + this.appView.handlePause(this.keepRunning); + } + } + + /** + * Called when the activity receives a new intent + **/ + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + //Forward to plugins + if (this.appView != null) + this.appView.onNewIntent(intent); + } + + /** + * Called when the activity will start interacting with the user. + */ + @Override + protected void onResume() { + super.onResume(); + LOG.d(TAG, "Resuming the App"); + + if (this.activityState == ACTIVITY_STARTING) { + this.activityState = ACTIVITY_RUNNING; + return; + } + + if (this.appView == null) { + return; + } + // Force window to have focus, so application always + // receive user input. Workaround for some devices (Samsung Galaxy Note 3 at least) + this.getWindow().getDecorView().requestFocus(); + + this.appView.handleResume(this.keepRunning, this.activityResultKeepRunning); + + // If app doesn't want to run in background + if (!this.keepRunning || this.activityResultKeepRunning) { + + // Restore multitasking state + if (this.activityResultKeepRunning) { + this.keepRunning = this.activityResultKeepRunning; + this.activityResultKeepRunning = false; + } + } + } + + /** + * The final call you receive before your activity is destroyed. + */ + @Override + public void onDestroy() { + LOG.d(TAG, "CordovaActivity.onDestroy()"); + super.onDestroy(); + + if (this.appView != null) { + appView.handleDestroy(); + } + else { + this.activityState = ACTIVITY_EXITING; + } + } + + /** + * Send a message to all plugins. + */ + public void postMessage(String id, Object data) { + if (this.appView != null) { + this.appView.postMessage(id, data); + } + } + + /** + * @deprecated + * Add services to res/xml/plugins.xml instead. + * + * Add a class that implements a service. + */ + @Deprecated + public void addService(String serviceType, String className) { + if (this.appView != null && this.appView.pluginManager != null) { + this.appView.pluginManager.addService(serviceType, className); + } + } + + /** + * Send JavaScript statement back to JavaScript. + * (This is a convenience method) + * + * @param statement + */ + @Deprecated // Call method on appView directly. + public void sendJavascript(String statement) { + if (this.appView != null) { + this.appView.bridge.getMessageQueue().addJavaScript(statement); + } + } + + /** + * Show the spinner. Must be called from the UI thread. + * + * @param title Title of the dialog + * @param message The message of the dialog + */ + @Deprecated // Call this directly on SplashScreen plugin instead. + public void spinnerStart(final String title, final String message) { + JSONArray args = new JSONArray(); + args.put(title); + args.put(message); + doSplashScreenAction("spinnerStart", args); + } + + /** + * Stop spinner - Must be called from UI thread + */ + @Deprecated // Call this directly on SplashScreen plugin instead. + public void spinnerStop() { + doSplashScreenAction("spinnerStop", null); + } + + /** + * End this activity by calling finish for activity + */ + public void endActivity() { + this.activityState = ACTIVITY_EXITING; + super.finish(); + } + + + /** + * Launch an activity for which you would like a result when it finished. When this activity exits, + * your onActivityResult() method will be called. + * + * @param command The command object + * @param intent The intent to start + * @param requestCode The request code that is passed to callback to identify the activity + */ + public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) { + setActivityResultCallback(command); + this.activityResultKeepRunning = this.keepRunning; + + // If multitasking turned on, then disable it for activities that return results + if (command != null) { + this.keepRunning = false; + } + + try { + startActivityForResult(intent, requestCode); + } catch (RuntimeException e) { // E.g.: ActivityNotFoundException + activityResultCallback = null; + throw e; + } + } + + @Override + public void startActivityForResult(Intent intent, int requestCode, Bundle options) { + // Capture requestCode here so that it is captured in the setActivityResultCallback() case. + activityResultRequestCode = requestCode; + super.startActivityForResult(intent, requestCode, options); + } + + /** + * Called when an activity you launched exits, giving you the requestCode you started it with, + * the resultCode it returned, and any additional data from it. + * + * @param requestCode The request code originally supplied to startActivityForResult(), + * allowing you to identify who this result came from. + * @param resultCode The integer result code returned by the child activity through its setResult(). + * @param intent An Intent, which can return result data to the caller (various data can be attached to Intent "extras"). + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + LOG.d(TAG, "Incoming Result. Request code = " + requestCode); + super.onActivityResult(requestCode, resultCode, intent); + CordovaPlugin callback = this.activityResultCallback; + if(callback == null && initCallbackClass != null) { + // The application was restarted, but had defined an initial callback + // before being shut down. + callback = appView.pluginManager.getPlugin(initCallbackClass); + } + initCallbackClass = null; + activityResultCallback = null; + + if (callback != null) { + LOG.d(TAG, "We have a callback to send this result to"); + callback.onActivityResult(requestCode, resultCode, intent); + } else { + LOG.w(TAG, "Got an activity result, but no plugin was registered to receive it."); + } + } + + public void setActivityResultCallback(CordovaPlugin plugin) { + // Cancel any previously pending activity. + if (activityResultCallback != null) { + activityResultCallback.onActivityResult(activityResultRequestCode, Activity.RESULT_CANCELED, null); + } + this.activityResultCallback = plugin; + } + + /** + * Report an error to the host application. These errors are unrecoverable (i.e. the main resource is unavailable). + * The errorCode parameter corresponds to one of the ERROR_* constants. + * + * @param errorCode The error code corresponding to an ERROR_* value. + * @param description A String describing the error. + * @param failingUrl The url that failed to load. + */ + public void onReceivedError(final int errorCode, final String description, final String failingUrl) { + final CordovaActivity me = this; + + // If errorUrl specified, then load it + final String errorUrl = preferences.getString("errorUrl", null); + if ((errorUrl != null) && (errorUrl.startsWith("file://") || internalWhitelist.isUrlWhiteListed(errorUrl)) && (!failingUrl.equals(errorUrl))) { + + // Load URL on UI thread + me.runOnUiThread(new Runnable() { + public void run() { + me.appView.showWebPage(errorUrl, false, true, null); + } + }); + } + // If not, then display error dialog + else { + final boolean exit = !(errorCode == WebViewClient.ERROR_HOST_LOOKUP); + me.runOnUiThread(new Runnable() { + public void run() { + if (exit) { + me.appView.setVisibility(View.GONE); + me.displayError("Application Error", description + " (" + failingUrl + ")", "OK", exit); + } + } + }); + } + } + + /** + * Display an error dialog and optionally exit application. + */ + public void displayError(final String title, final String message, final String button, final boolean exit) { + final CordovaActivity me = this; + me.runOnUiThread(new Runnable() { + public void run() { + try { + AlertDialog.Builder dlg = new AlertDialog.Builder(me); + dlg.setMessage(message); + dlg.setTitle(title); + dlg.setCancelable(false); + dlg.setPositiveButton(button, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + if (exit) { + me.endActivity(); + } + } + }); + dlg.create(); + dlg.show(); + } catch (Exception e) { + finish(); + } + } + }); + } + + /** + * Determine if URL is in approved list of URLs to load. + */ + @Deprecated // Use whitelist object directly. + public boolean isUrlWhiteListed(String url) { + return internalWhitelist.isUrlWhiteListed(url); + } + + /* + * Hook in Cordova for menu plugins + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + this.postMessage("onCreateOptionsMenu", menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + this.postMessage("onPrepareOptionsMenu", menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + this.postMessage("onOptionsItemSelected", item); + return true; + } + + /** + * Get Activity context. + */ + @Deprecated + public Context getContext() { + LOG.d(TAG, "This will be deprecated December 2012"); + return this; + } + + /** + * Load the specified URL in the Cordova webview or a new browser instance. + * + * NOTE: If openExternal is false, only URLs listed in whitelist can be loaded. + * + * @param url The url to load. + * @param openExternal Load url in browser instead of Cordova webview. + * @param clearHistory Clear the history stack, so new page becomes top of history + * @param params Parameters for new app + */ + @Deprecated // Call method on appView directly. + public void showWebPage(String url, boolean openExternal, boolean clearHistory, HashMap params) { + if (this.appView != null) { + appView.showWebPage(url, openExternal, clearHistory, params); + } + } + + private void doSplashScreenAction(String action, JSONArray args) { + CordovaPlugin p = appView.pluginManager.getPlugin("org.apache.cordova.splashscreeninternal"); + if (p != null) { + args = args == null ? new JSONArray() : args; + try { + p.execute(action, args, null); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + /** + * Removes the Dialog that displays the splash screen + */ + @Deprecated + public void removeSplashScreen() { + doSplashScreenAction("hide", null); + } + + /** + * Shows the splash screen over the full Activity + */ + @SuppressWarnings("deprecation") + @Deprecated + protected void showSplashScreen(final int time) { + preferences.set("SplashScreenDelay", time); + doSplashScreenAction("show", null); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) + { + if (appView != null && (appView.isCustomViewShowing() || appView.getFocusedChild() != null ) && + (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU)) { + return appView.onKeyUp(keyCode, event); + } else { + return super.onKeyUp(keyCode, event); + } + } + + /* + * Android 2.x needs to be able to check where the cursor is. Android 4.x does not + * + * (non-Javadoc) + * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent) + */ + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) + { + //Determine if the focus is on the current view or not + if (appView != null && appView.getFocusedChild() != null && (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU)) { + return appView.onKeyDown(keyCode, event); + } + else + return super.onKeyDown(keyCode, event); + } + + + /** + * Called when a message is sent to plugin. + * + * @param id The message id + * @param data The message data + * @return Object or null + */ + public Object onMessage(String id, Object data) { + if (!"onScrollChanged".equals(id)) { + LOG.d(TAG, "onMessage(" + id + "," + data + ")"); + } + + if ("onReceivedError".equals(id)) { + JSONObject d = (JSONObject) data; + try { + this.onReceivedError(d.getInt("errorCode"), d.getString("description"), d.getString("url")); + } catch (JSONException e) { + e.printStackTrace(); + } + } + else if ("exit".equals(id)) { + this.endActivity(); + } + return null; + } + + public ExecutorService getThreadPool() { + return threadPool; + } + + protected void onSaveInstanceState(Bundle outState) + { + super.onSaveInstanceState(outState); + if(this.activityResultCallback != null) + { + String cClass = this.activityResultCallback.getClass().getName(); + outState.putString("callbackClass", cClass); + } + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java new file mode 100644 index 0000000..d40d26e --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaArgs.java @@ -0,0 +1,113 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.util.Base64; + +public class CordovaArgs { + private JSONArray baseArgs; + + public CordovaArgs(JSONArray args) { + this.baseArgs = args; + } + + + // Pass through the basics to the base args. + public Object get(int index) throws JSONException { + return baseArgs.get(index); + } + + public boolean getBoolean(int index) throws JSONException { + return baseArgs.getBoolean(index); + } + + public double getDouble(int index) throws JSONException { + return baseArgs.getDouble(index); + } + + public int getInt(int index) throws JSONException { + return baseArgs.getInt(index); + } + + public JSONArray getJSONArray(int index) throws JSONException { + return baseArgs.getJSONArray(index); + } + + public JSONObject getJSONObject(int index) throws JSONException { + return baseArgs.getJSONObject(index); + } + + public long getLong(int index) throws JSONException { + return baseArgs.getLong(index); + } + + public String getString(int index) throws JSONException { + return baseArgs.getString(index); + } + + + public Object opt(int index) { + return baseArgs.opt(index); + } + + public boolean optBoolean(int index) { + return baseArgs.optBoolean(index); + } + + public double optDouble(int index) { + return baseArgs.optDouble(index); + } + + public int optInt(int index) { + return baseArgs.optInt(index); + } + + public JSONArray optJSONArray(int index) { + return baseArgs.optJSONArray(index); + } + + public JSONObject optJSONObject(int index) { + return baseArgs.optJSONObject(index); + } + + public long optLong(int index) { + return baseArgs.optLong(index); + } + + public String optString(int index) { + return baseArgs.optString(index); + } + + public boolean isNull(int index) { + return baseArgs.isNull(index); + } + + + // The interesting custom helpers. + public byte[] getArrayBuffer(int index) throws JSONException { + String encoded = baseArgs.getString(index); + return Base64.decode(encoded, Base64.DEFAULT); + } +} + + diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java new file mode 100644 index 0000000..becbd52 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaBridge.java @@ -0,0 +1,192 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import java.security.SecureRandom; + +import org.apache.cordova.PluginManager; +import org.json.JSONArray; +import org.json.JSONException; + +import android.util.Log; + +/** + * Contains APIs that the JS can call. All functions in here should also have + * an equivalent entry in CordovaChromeClient.java, and be added to + * cordova-js/lib/android/plugin/android/promptbasednativeapi.js + */ +public class CordovaBridge { + private static final String LOG_TAG = "CordovaBridge"; + private PluginManager pluginManager; + private NativeToJsMessageQueue jsMessageQueue; + private volatile int expectedBridgeSecret = -1; // written by UI thread, read by JS thread. + private String loadedUrl; + private String appContentUrlPrefix; + + public CordovaBridge(PluginManager pluginManager, NativeToJsMessageQueue jsMessageQueue, String packageName) { + this.pluginManager = pluginManager; + this.jsMessageQueue = jsMessageQueue; + this.appContentUrlPrefix = "content://" + packageName + "."; + } + + public String jsExec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException { + if (!verifySecret("exec()", bridgeSecret)) { + return null; + } + // If the arguments weren't received, send a message back to JS. It will switch bridge modes and try again. See CB-2666. + // We send a message meant specifically for this case. It starts with "@" so no other message can be encoded into the same string. + if (arguments == null) { + return "@Null arguments."; + } + + jsMessageQueue.setPaused(true); + try { + // Tell the resourceApi what thread the JS is running on. + CordovaResourceApi.jsThread = Thread.currentThread(); + + pluginManager.exec(service, action, callbackId, arguments); + String ret = null; + if (!NativeToJsMessageQueue.DISABLE_EXEC_CHAINING) { + ret = jsMessageQueue.popAndEncode(false); + } + return ret; + } catch (Throwable e) { + e.printStackTrace(); + return ""; + } finally { + jsMessageQueue.setPaused(false); + } + } + + public void jsSetNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException { + if (!verifySecret("setNativeToJsBridgeMode()", bridgeSecret)) { + return; + } + jsMessageQueue.setBridgeMode(value); + } + + public String jsRetrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException { + if (!verifySecret("retrieveJsMessages()", bridgeSecret)) { + return null; + } + return jsMessageQueue.popAndEncode(fromOnlineEvent); + } + + private boolean verifySecret(String action, int bridgeSecret) throws IllegalAccessException { + if (!jsMessageQueue.isBridgeEnabled()) { + if (bridgeSecret == -1) { + Log.d(LOG_TAG, action + " call made before bridge was enabled."); + } else { + Log.d(LOG_TAG, "Ignoring " + action + " from previous page load."); + } + return false; + } + // Bridge secret wrong and bridge not due to it being from the previous page. + if (expectedBridgeSecret < 0 || bridgeSecret != expectedBridgeSecret) { + Log.e(LOG_TAG, "Bridge access attempt with wrong secret token, possibly from malicious code. Disabling exec() bridge!"); + clearBridgeSecret(); + throw new IllegalAccessException(); + } + return true; + } + + /** Called on page transitions */ + void clearBridgeSecret() { + expectedBridgeSecret = -1; + } + + /** Called by cordova.js to initialize the bridge. */ + int generateBridgeSecret() { + SecureRandom randGen = new SecureRandom(); + expectedBridgeSecret = randGen.nextInt(Integer.MAX_VALUE); + return expectedBridgeSecret; + } + + public void reset(String loadedUrl) { + jsMessageQueue.reset(); + clearBridgeSecret(); + this.loadedUrl = loadedUrl; + } + + public String promptOnJsPrompt(String origin, String message, String defaultValue) { + if (defaultValue != null && defaultValue.length() > 3 && defaultValue.startsWith("gap:")) { + JSONArray array; + try { + array = new JSONArray(defaultValue.substring(4)); + int bridgeSecret = array.getInt(0); + String service = array.getString(1); + String action = array.getString(2); + String callbackId = array.getString(3); + String r = jsExec(bridgeSecret, service, action, callbackId, message); + return r == null ? "" : r; + } catch (JSONException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + // Sets the native->JS bridge mode. + else if (defaultValue != null && defaultValue.startsWith("gap_bridge_mode:")) { + try { + int bridgeSecret = Integer.parseInt(defaultValue.substring(16)); + jsSetNativeToJsBridgeMode(bridgeSecret, Integer.parseInt(message)); + } catch (NumberFormatException e){ + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + // Polling for JavaScript messages + else if (defaultValue != null && defaultValue.startsWith("gap_poll:")) { + int bridgeSecret = Integer.parseInt(defaultValue.substring(9)); + try { + String r = jsRetrieveJsMessages(bridgeSecret, "1".equals(message)); + return r == null ? "" : r; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return ""; + } + else if (defaultValue != null && defaultValue.startsWith("gap_init:")) { + // Protect against random iframes being able to talk through the bridge. + // Trust only file URLs and the start URL's domain. + // The extra origin.startsWith("http") is to protect against iframes with data: having "" as origin. + if (origin.startsWith("file:") || + origin.startsWith(this.appContentUrlPrefix) || + (origin.startsWith("http") && loadedUrl.startsWith(origin))) { + // Enable the bridge + int bridgeMode = Integer.parseInt(defaultValue.substring(9)); + jsMessageQueue.setBridgeMode(bridgeMode); + // Tell JS the bridge secret. + int secret = generateBridgeSecret(); + return ""+secret; + } else { + Log.e(LOG_TAG, "gap_init called from restricted origin: " + origin); + } + return ""; + } + return null; + } + + public NativeToJsMessageQueue getMessageQueue() { + return jsMessageQueue; + } +} diff --git a/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java new file mode 100644 index 0000000..31759d0 --- /dev/null +++ b/fritteliuhr/platforms/android/CordovaLib/src/org/apache/cordova/CordovaChromeClient.java @@ -0,0 +1,366 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +package org.apache.cordova; + +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.LOG; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.webkit.ConsoleMessage; +import android.webkit.JsPromptResult; +import android.webkit.JsResult; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebStorage; +import android.webkit.WebView; +import android.webkit.GeolocationPermissions.Callback; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; + +/** + * This class is the WebChromeClient that implements callbacks for our web view. + * The kind of callbacks that happen here are on the chrome outside the document, + * such as onCreateWindow(), onConsoleMessage(), onProgressChanged(), etc. Related + * to but different than CordovaWebViewClient. + * + * @see WebChromeClient + * @see WebView guide + * @see CordovaWebViewClient + * @see CordovaWebView + */ +public class CordovaChromeClient extends WebChromeClient { + + public static final int FILECHOOSER_RESULTCODE = 5173; + private String TAG = "CordovaLog"; + private long MAX_QUOTA = 100 * 1024 * 1024; + protected CordovaInterface cordova; + protected CordovaWebView appView; + + // the video progress view + private View mVideoProgressView; + + //Keep track of last AlertDialog showed + private AlertDialog lastHandledDialog; + + @Deprecated + public CordovaChromeClient(CordovaInterface cordova) { + this.cordova = cordova; + } + + public CordovaChromeClient(CordovaInterface ctx, CordovaWebView app) { + this.cordova = ctx; + this.appView = app; + } + + @Deprecated + public void setWebView(CordovaWebView view) { + this.appView = view; + } + + /** + * Tell the client to display a javascript alert dialog. + * + * @param view + * @param url + * @param message + * @param result + * @see Other implementation in the Dialogs plugin. + */ + @Override + public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { + AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity()); + dlg.setMessage(message); + dlg.setTitle("Alert"); + //Don't let alerts break the back button + dlg.setCancelable(true); + dlg.setPositiveButton(android.R.string.ok, + new AlertDialog.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.confirm(); + } + }); + dlg.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + result.cancel(); + } + }); + dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { + //DO NOTHING + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) + { + result.confirm(); + return false; + } + else + return true; + } + }); + lastHandledDialog = dlg.show(); + return true; + } + + /** + * Tell the client to display a confirm dialog to the user. + * + * @param view + * @param url + * @param message + * @param result + * @see Other implementation in the Dialogs plugin. + */ + @Override + public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { + AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity()); + dlg.setMessage(message); + dlg.setTitle("Confirm"); + dlg.setCancelable(true); + dlg.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.confirm(); + } + }); + dlg.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.cancel(); + } + }); + dlg.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + result.cancel(); + } + }); + dlg.setOnKeyListener(new DialogInterface.OnKeyListener() { + //DO NOTHING + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) + { + result.cancel(); + return false; + } + else + return true; + } + }); + lastHandledDialog = dlg.show(); + return true; + } + + /** + * Tell the client to display a prompt dialog to the user. + * If the client returns true, WebView will assume that the client will + * handle the prompt dialog and call the appropriate JsPromptResult method. + * + * Since we are hacking prompts for our own purposes, we should not be using them for + * this purpose, perhaps we should hack console.log to do this instead! + * + * @see Other implementation in the Dialogs plugin. + */ + @Override + public boolean onJsPrompt(WebView view, String origin, String message, String defaultValue, JsPromptResult result) { + // Unlike the @JavascriptInterface bridge, this method is always called on the UI thread. + String handledRet = appView.bridge.promptOnJsPrompt(origin, message, defaultValue); + if (handledRet != null) { + result.confirm(handledRet); + } else { + // Returning false would also show a dialog, but the default one shows the origin (ugly). + final JsPromptResult res = result; + AlertDialog.Builder dlg = new AlertDialog.Builder(this.cordova.getActivity()); + dlg.setMessage(message); + final EditText input = new EditText(this.cordova.getActivity()); + if (defaultValue != null) { + input.setText(defaultValue); + } + dlg.setView(input); + dlg.setCancelable(false); + dlg.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String usertext = input.getText().toString(); + res.confirm(usertext); + } + }); + dlg.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + res.cancel(); + } + }); + lastHandledDialog = dlg.show(); + } + return true; + } + + /** + * Handle database quota exceeded notification. + */ + @Override + public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, + long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) + { + LOG.d(TAG, "onExceededDatabaseQuota estimatedSize: %d currentQuota: %d totalUsedQuota: %d", estimatedSize, currentQuota, totalUsedQuota); + quotaUpdater.updateQuota(MAX_QUOTA); + } + + // console.log in api level 7: http://developer.android.com/guide/developing/debug-tasks.html + // Expect this to not compile in a future Android release! + @SuppressWarnings("deprecation") + @Override + public void onConsoleMessage(String message, int lineNumber, String sourceID) + { + //This is only for Android 2.1 + if(android.os.Build.VERSION.SDK_INT == android.os.Build.VERSION_CODES.ECLAIR_MR1) + { + LOG.d(TAG, "%s: Line %d : %s", sourceID, lineNumber, message); + super.onConsoleMessage(message, lineNumber, sourceID); + } + } + + @TargetApi(8) + @Override + public boolean onConsoleMessage(ConsoleMessage consoleMessage) + { + if (consoleMessage.message() != null) + LOG.d(TAG, "%s: Line %d : %s" , consoleMessage.sourceId() , consoleMessage.lineNumber(), consoleMessage.message()); + return super.onConsoleMessage(consoleMessage); + } + + @Override + /** + * Instructs the client to show a prompt to ask the user to set the Geolocation permission state for the specified origin. + * + * @param origin + * @param callback + */ + public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { + super.onGeolocationPermissionsShowPrompt(origin, callback); + callback.invoke(origin, true, false); + } + + // API level 7 is required for this, see if we could lower this using something else + @Override + public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { + this.appView.showCustomView(view, callback); + } + + @Override + public void onHideCustomView() { + this.appView.hideCustomView(); + } + + @Override + /** + * Ask the host application for a custom progress view to show while + * a

The best way to improve the cache hit rate is by configuring the web + * server to return cacheable responses. Although this client honors all HTTP/1.1 (RFC 2068) cache + * headers, it doesn't cache partial responses. + * + *

4`>GjE$ixdVLRuOaqf2q|0po#FN9t0nD! zV{!h~(UOBeYmwWZ(FpN-m+1p6{nM{3%l(NYd#s%sNFhlExhSujK@L%KIL?c~Vmpyw zd8+L~>)qyV^rYzE%z*qB+puhOHh=zeR=&z^h9c8X3@O+P!S`%IK6Tb|bv&H31ygj)K{o;>xj%TG6xdB-(|@diEr&F@x3C+-+7Yl`CO z_W&x^Gy;ICIjhU?ch?U)(E1tl44e>=+_S z{KjR0g8Lg4K0f{>Pp`2o7j-?gZdV}X{rR(wYVR$)g_au)10Von8EbiIm}N*^zmr((1~F!ahOkSdQ5u+Tp~l~))d@Z+nA%pzV^Y|bp9WB(LnJD?&) z0vRR;h&DK+1o~Zq3GI`8?bjp7-`-UUPBb)5Th@KUSu-9~F+ z6Oiq&7Y)3!n1a53h3pqaKUEfog9mAl+>JmY#DJ5oKVWxgw=Yg?(7m;i&`)q`66!jf>*fv31W`tsqX@_{vdlG=ZJ@n)A^*gcL4z#=P-8L-g&eK1Xt0dB&CYP| z)qTCI11t~C_ZfD$gyVwKzyH$_E3{kmRd?;twmsOuUrQ6&;!m37_WznPtryx6`&8ve z#G#;E3;I`1^HB_oh7Vn?wbTiC922b6+t8O<_*G<5zDk)WA=K=G(S!W^hrmhGDkdf- zDU&8>(P77kJq>n?f0;fMg`6zJNR5*<%+cX7M<<`t7wPOSf)8$pp>`W^fHAY1nhjoA zriU5MUE4t_p38#a>H$4P?mo=e(anYf?zHd?jY;{`(I4*KysKUfEl8s;bMM}A+jgJi z5wBBMSnbiJkfvpP{U^t;9iQSSXtHc_nZ~v>@X=U*2u zW&m}@53;-6_~bHLeuh-XB@~rK1CrdZ{CRESVw!k<4*NYU%sBB9gsi!&lZ3!6S)`yl z0=N`xl%N^!{O+MIkpMdcnVGqi8+zmn_J1lV z%uDvWLK+hTa^qkxu{AtBqN?E6FJIyjU@_z$e{kawYiSX2bz%)EsnBxCXe5)oywHHf zb~gtDwc(958c6;XARJD~_OuY6nRbKYO68r)iJP>*NHCwm2ocWS`b?}KRs*!HeMgNE zt>n58v0bF-{ToQQSoAYy0W95c6xD9(1`Z7ILqcF8W6`K6@%j@UQEq1^V(5LU(k}Gi z1M}V@sqEbM1Zd^t&7d)D-g5HjIkxw|ez{6JV3;{ji=0zDqI7WH5l^VF6TI2Sd7y&l zWD~}N5W*FmuZG#?!9BjofpoCNqOMRBEUHgT%CgN3EU4R^S5L6S z_0cs$J*4_w5E5LUeHFdXOKFeMJ>dA2{&&v*B__dy&!iBUr0W*g?mZmktm30mVRNAzvgEwEdTCpNOi zACSVFS>S-^t8kg-A4Y!6^7(HAKfN{w9;+Y{+my%m9h85 z`H}dY+_pgKN&gWA=22J%obkK&A)EmeR8g=W$^<1hX~cOnf^3MopHX_H^uLL2bcmmy zaep#I9eJ-rMeG5vcJU9rHDm!3pq6SqK(>zFb0qE6*L4WE?QW4+n>L+~;wz{-J zeaJkR1`sDraa-9UVk{_Y!Ho`y--9UlUn%=nGfFQrKo& zL3*5S2MYd=M?=lPzM_4P|7_K3?z7+W%4Eu(|Bj4H>BcnI z)|R_z$V!p2e4GLm@dUr9&vk(U?lxo-a1{{u0=)=y2w5ZU@)CvDX+t00P!uRvwRGa? z=;=QPpxpB4w_8*8@M`+|w-@ASR%p|rzd1?RIbM+Rwl10DAeFv^j{$SEP8!h|yUKk_ ztAsmuVGZKqnilYf;*_bEM^W+L&Jkj#B9tHjGdjS9Q->YQW+wdIVwnJFK@a|I`Q#vY zZ*2uu7&geM{~cxT(w}>8)6X^Utn&bSn7D6HWpBu^4rtWA5|kg~);BIv;HiC+W$= zfvKCV=#E?F4`og*9SMW^VH|Z7Y}`8zBe!I!1ISk|=aTZP&;>3N+ysG+0LqD%TKxG^ zI2I*gyPqqZR^2@E#pEbC@)Q0W875 zF!JIc4hQhP+L7j4@rN#5iRHts40XqXY)OtN*=>PtLgR7)$8NE*kE81}`6AU-=bLs9 z2{GP_e*_j~p?snm_6uN1-v%JdeSkGK5|CeV9XndTh=N0sZXkCq>YeDjNKhD((gU*Q zsIZwR0%{}{N4yL2>HR#c$PbE;)ip046ssR?iMol5{_h=rs_Q-f z(7tL8MKM!=3ZT0oId++$0G=(D;C>#f$(^YlsUOV5ADjm(w^!e;$4-jAVgQ!;!OQKw zE5L3(T+$*mH+kjpV9dD=ym4&6sM6>@Ld;43P3P()Ic`zMf6W;)P!8`>V+U8P=eJJP z>}ptVw1<^oZGyU}p6<^Q!!qw=H6;i`#FQ+8qPK$IJPn+jMt)74+u=cfgS-*qc#B)E zBmaTZCJ&``a}f<1wSD6yacQ-mWjYX4d67XZ4gz;|Ul!}6f9}(X+f8xLw+xO%`>f$Gb)>Q%wQNV0%(IjChco)n(aF3d6* zGnJqDuIVh=@f_2@Wk$ZR-ch?)>{IjgMo&)_22NtC>0_+g~(ku`Gy;k6M&@ ze?)$+n+Yqy{}mCHOU9zf9=(@|@XiWC3${Q>K)WY^n;~LMN@273`(qqcE#qnK&KEjt z!tCH}aXi|5wjhBZsXlq$?v`Qi^nE23kQpT5ml?dF+p?b@IWUXjEf`XAXgya(84c_yL~Gjc{q2thnFL1wt6Sb)bo~>h@;{WQw_PXW0m^(}JQF*| z?|Hn2%FzMCTPXkCRb?3v28h~AT_k7!&#c9a^JPC|y}i|Fd7rx}$+DUPf55j(9FtDJ zgqx=h5l^qdmfj=i7JF|8+Iur;_R?N8UF>D#-jy4{rmjxLJr`;lVX1q|-VfnucCexBT-RT<-rhabWj5#ugT(-+40X5f z@!NFC0^QF@=`m8L9}PMz2`wixVv@@>|F&3Bl8qwSE>w(TVZjEAeza2v%yQ%6sSw3- zUYv|y7Fc!|wOr!V{9w)r$ujzJHZ*A}t%@fHf#lc}GS!!ng(C0E<;tiFP$VP_$3(?D zY~Nx!uGW~zUd<|r(TTn!wKDEr0*Mlqr8ab~ebZ{weHNg7Bmn@2((dj$KPmk#tuHWT}5Y5y}+TO>z9urNH5(`E_I; z$j;Gril*|sG%&i{CHCA*{%5sb0vMl99~~=lzlHkCMY*%%x3)L|YrCj1NI2opiP`#L zNH0khSTJ|hIjYSTqal2pw{dP<+54(Um zRdXlkb~-{DmN|T~SSs{pV>l0BudJG2TWfEj(Urs)FWNSX!WBTtAOR8v^3y z$}s~COmJ&=afdpS@5DK{lBgP$UOa}vKi~yHy94nAr*Xw=9M-#GIp|n8vv#JJGzs<@ z`z_r!gwz9;Kcip5h2`a&6)dQ#c9d(Gov#VH()YNnH@naSKss!|dy*3V#*lw-&uE!g z7A_&>i7YP^9F&QWPk|(Kbe!-zA@WOXgPPH%3nRV|-mHp7k5MQK;dE`F4sSU|5+-&c z|MH(4<_~<*86UL$1dg*+YS#hZb3c!gSPb9|V}UEn>vsBCpl}4T>Lw@8Y<5{2%gnTY zAWQB8R)j`t{4G_x;+_sY()ER0ec~67uQG9eNtqK37gN(t%a0`#!83CnVMrb3GJo{h zbb7knJ*TeG?$N*42b|w*Wr1(3F z4?M4mj-s`7b!=xjfHsOOE_4cg8%#sYYO^s_kM~TWfxaN_GHo|gz-(%^>-^{*QjjbN zxdk@Mq&$>76JRV<=7t(a>BgsrGYV^y&gz!>_pDp6C5e&#KB!iIZ5B|QFD)Q)EkbU2 zM%0m?s?RhvnTO$aA0q{S`rbh<-%c}O*Hsbl^3#d<=mx@PJKj3VpEe2BT3K}eQ!P_r zIuMl?Ra2RCFi2qrXnDwj*%cP_?lr8*ILWE0C$^Gk5p=CNi%Ds}%5QS@st9Ndg1_mi za@X?k>#`Bs6qY7uAmq754$ z%Fxu#O;%~Q;3dBA3i=>skGmheUI)qK${niW|^+=Jd(BFYs+qzadH#DL(jr zlmT{K$Qay={IayPZMGaI`vp|&X&j~Jy?Aq|z8Hl*Yb3%G>X!l^_Vz~bXS(lz18Oqz zivbPMFB+cLX-A+1vexo$uk>HX=N`5b|9>pvg;~l-9_+DT0p@DQIi&v?Dor9-v$R|% zIYbI8LXAsR6Mh}%Ytd*V0Q*gLfcHE3p{Ty<5VRZfi<=%!RfJa9S%QxvwnwI&5dB4e zYPV^_7P;H`Sh9@mK>x61it#--HDK|Cn$M2jOziL`T#U6m)%X&EZjI$Vm~W%mo5qE{ z)Ib^>@S>nhium%MhD~*mVx&#ecZ3pn$}~R7p}f_E2AKS@7OIRmvi^S1Z;V{Fc=pP0R1Me=@MOrU3;~IMVurO|by4ug%t03D0#Kp!ZjSi;G|JmY9`+p=@FI2R2 zlafn$V~#dh`=IZ%ELc2-`?8y)lu=8>XZ0f1%@*U=SWPMkxa_2jLH8Rbe$!J@-RKYH z?P;3Jyl2n-#n(KZ(GWiq4fx>xnqBQUIln?tXSRQr(ZomDTtAo}kuiP&fBW=)fis&N z`)o2J$?AU|#aCZv6MFUi{UhYI3T*RW5xZ*7^R-~B>;PmQtAH>eKyU}9I?4oeEJVD& zi^>X$^C_woZ;-7YQQ$zGo0hh0k`DMn{6KQ8vfKSFGG;3#0Ql?iSoFXx*(PC|u-yMx zjWzlgqLf5BzIMIs?t|9aDJj4emwdzJcOT9P{=*ANiXq^nF#JpX$06hi*3vj?qk#8u z{tdFVY3|@5=L4#$hI`t5U9~uWZY52kP#FrW!mtAkm@F{@i4k_?*;Ws7B+v(gt+y>$ z*9N;Q2s#)(ITYNzF=f=V*QH-azG(2j&4ZR+;KI_7Q_d!|fLu4KdTeN&Isx6U-P{k4 zcvo&>lGiPtc}s~SzAAMFKMk(G=TO=dVwtXoH;viskHmKdX1rf+@I%q4PPS0o+Fy8Y zYA{^?kbmSH^sp-k*CF>lU2;K6DmK68c<;;^FnaMj0MTa_w`76{UfnJvb2^=M*=<3# zZ1-Dq>UtZfKOtXs0AVmD)$-7Dd?00zc6=UjuO4Kz{D0k7OD?#y@e*Mi@7`%eU6J$I z(%GVrOM6~y!~ive<-(I9)Y=lAIb*Tz6UD$3k{aEt*dvzSQI@1$~+vwSrJMZp5v7r7LG6gbIOM zIJp5QwG48pa`V%s13utoEQe*%-6?h7P2a;&u}=EuWT5S@kTGKCGM$c3wfdzSfaEQ% z8mInG`_*TJ;f!IvyqN7~ZLmiIeyE{~)`V`0R?9?Q*OgmU@nmc015FaHcXJGxkbU~6 zN_BMIBc|^R@9F%HWCeJhL^8h$M}{}pZW&c|#hTE|a47odw5~pU0-WT^ z)nal4V#t#mPNF}#oLw^&%ks-vT$itc^6CE-y~H-9pZSDrC*oOUTF{PM^LxojJ8MuXZ^ zGIJ>sw1oao;#pFe;UwZ?*M6jV{Ia+giY(x~74*}}4|WCGjppd=j;EEH0#L3;WCy(p z+WE+YJC0LKf-n^-W_5HPlLD9g!4lmLvX2gH-+78BbH4pNA;cbu2L`NhB|pJ*ip?#kPmYzJYDn{V#O!2NT}R21Q&n1W1N zsYYHfedGZ;o@!`8=?(g|if)1qK=dIfF*gCg2mfvKsPTW`h9}M*YINX8xGjd~L532t z4t%{t#SWu?M_~i0OK?BLshw}=t*RT0!t z+H-}{lH+|qm{0~3&2kx>3c5zt(=w}KcA*4RC-s4cfR$1216w_QX%_-Yr_Uv-wMXBh zOnrUB=dOSh&F5nTo6XMyHJPoYCbpu|XW%5)=409YC@y9Y!W=tE{adsDosX*s;N8~t zq)=Vn-TQCBWAw2sbx*)kU?1@I#I(3|4SwTaXR@V;KAfFZE38vV;TSj3Es4s7wZMhi zjQ8_IS}(q+wm%-9q`lrPYBvQ^0tozqjV^eAFRGRw`O$F zVy2!S`vZlmo2#^nyS1X&6OmKtL@$J6N!VnZoS#>|bnF9xuR6IAxC>5`qi2f)hoTlM zuJQc?ngSsBN2VJEMrznC(8y->={A@SaQ~1a0xK1!qG?CUc26mC+vJHPey}|ziGfLKY5f8PO*I*T z((kJ+$8Fhk>v8VLdBqb4zc~YI$6Dr+Hmf~WHG?H$$B&D%mGHN&_gU%q_@sl48%tC> zv%`ZL=A$*t!l~yTy1@w&DOz400RrFnf>K05@D+wp-^Gx0Wio1b17IxbI7 zSEQO82H*8%1^y;gu@Nz=tHn5KUwOL2%SXO9VM1Y57EeicC!)1rVLJSIdx@gfQ8!5UNb zLpblKgss%yFRS+k@b-ZNjk63dtt!jgr`S;=?64YC-j4jcZHO~T@7d^p7#Q?@LLp1^ zZq8DFz{A@?f|W?7vTDHtJ}OCleS=a4^A^MtZP3eu)mNd}rg(f&>*fGpyH4b#R7^ zw|}Rn$KKXs)C^p*De8(t-8jtI7A84x3cpW{NY^wVh&Xw9nfXH}v5YziU-Ku{mu2eH*6Ch$u%NfXL3XUawM?&&BuP<(yn84^dNZgxO z&u>|N@>;(oX%rm%X|GiG1#f3p=}S6%0AeYMYb%zOBiU?#)DVBj054j1(hH@ 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