pax_global_header00006660000000000000000000000064121476524070014522gustar00rootroot0000000000000052 comment=73edacd536a654d22499845f1a4abc5c47194fc2 maliit-plugins-0.99.0+git20130524+73edacd/000077500000000000000000000000001214765240700173655ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/.gitignore000066400000000000000000000002401214765240700213510ustar00rootroot00000000000000.moc .obj moc_* gen_* *.so* *.a *.o Makefile *-stamp core *.gcov *.gcda *.gcno *~ *.swp *.pro.user *.core *.tar.* *.md5 *.moc /coverage-report /coverage-build maliit-plugins-0.99.0+git20130524+73edacd/LICENSE000066400000000000000000000031131214765240700203700ustar00rootroot00000000000000This file is part of Maliit Plugins Copyright (C) 2010-2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. Contact: Mohammad Anwari Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of Nokia Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. maliit-plugins-0.99.0+git20130524+73edacd/NEWS000066400000000000000000001036221214765240700200700ustar00rootroot000000000000000.99.0 ====== CHANGES SINCE 0.94.0 * Replaced the QGraphicsView renderer with a new renderer based on QtQuick2 and QML, which is more appropriate and better supported for Qt5. - Word candidates are not supported by the QML renderer yet - (Sound) feedback does not work yet * Adapt to maliit-framework changes - Switch to Qt 5 - Replace AbstractSurfaces with QQuickView * Due to QTBUG-18092, Maliit Keyboard will produce warnings when compiling against Qt4. A recent compiler (gcc-4.7) or Qt5 is required. * Documented styling profiles in maliit-keyboard/STYLING. * make check also verifies language layout files against DTD * Improved documentation for AbstractFeedback, WordEngine, AbstractWordEngine, KeyAreaConverter and AbstractTextEditor. * New LanguageFeatures class to deal with language-dependent features such as auto-caps. * New plugin settings: - auto-caps-enabled: Looks for punctuation marks and auto-capitalizes the next letter. - hide-word-ribbon-in-portrait-mode: This can be used to save screen real estate in portrait mode (but disables word prediction). - auto-correct-enabled: Use the primary word candidate instead of what the user typed, if the word is not in dictionary. This haappens on pressing space or return. - word-engine-enabled: This can be used to disable both word prediction and error correction. Notice that if Maliit Keyboard is compiled without preedit support then this setting has no effect. - feedback-enabled: This controls (audio) feedback when pressing keys. The current styling profile needs to provide audio files for this setting to take effect. * Preedit activation allows the user to edit previously entered words and get full word engine support. * Allow preedit styling. * Added a HUNSPELL_DICT_PATH parameter to qmake: - Use this if your distro uses a different path for dictionaries (like Fedora which keeps them in /usr/share/myspell). * Users can add words to custom dictionary by long-pressing the space key for unknown words. Users need to confirm before the new word is added to the| custom dictionary. * Implemented action key overriding: - It is possible to control the label and icon of an action key from the application via Maliit attribute extensions. * New nokia-n9 with Droid fonts style - Use qmake MALIIT_DEFAULT_PROFILE=nokia-n9-droid to activate this. * Allow fonts to be styled: - The font name for each layout can be specified. - If the font is not available system-wide then it is possible to specify a font file. - See new nokia-n9-droid style for example use. * Extended and broke XML language file format: - Instead of using the "extended_labels" attribute of , use an child of . It allows us to specify extended keys with actions, with icons or extended keyboards with several rows. - Instead of using the "shift" and "alt" attributes of , use a child of . This clearly shows that the toplevel is a fallback, when shift is pressed, but no for this modifier was specified. - Allow specifing of a (custom) icon for each key. for instance: This assumes square-smiley.png can be found in the images directory of the current styling profile. The label text is sent to the application as the preedit/commit string, but not the icon. - For a concrete example, please check maliit-keyboard/data/languages/debug/showcase.xml That is a special layout that is only installed in debug mode, to keep regular users safe from it. - All language layout files have been updated to the new format. The maliit-keyboard/tools/update-lang.pl script can be used to convert old language layout files to use the new format. * Added coverage reports. - The build system now compiles the project for coverage in coverage-build and places coverage reports in coverage-reports. To get coverage reports, generate Makefiles with qmake and then run 'make coverage' from the project's toplevel directory. Later, after some changes in source code, you can enter the coverage-build directory and run 'make coverage' to recompile the project, rerun the checks and regenerate the reports. Note that a recent lcov is needed because the older ones might have issues with finding the source files. * More tests - Language and styling directory can be changed for tests. - maliit-keyboard/tests/language-layout-loading tests layouts (including parsing and modelling), basic styling support and pixel perfectness wrt. spacer elements. - maliit-keyboard/tests/editor tests word correction and auto capitalization. - maliit-keyboard/tests/preedit-string now tests the word engine, preedit activation and cursor position. - maliit-keyboard/tests/word-candidates/ now tests word ribbon visibility. - maliit-keyboard/tests/word-candidates/ tests word-engine, preedit, word candidates, auto-correct-on-commit, preedit-enabled. 0.94.0 ====== CHANGES SINCE 0.93.1 * Fix build for Qt 5 qmake. * Fix geometry of fullscreen item after rotation. 0.93.1 ====== CHANGES SINCE 0.93.0 * More Nemo Keyboard improvements - Remove unused KeyStyle and KeyboardStyle. - Make close gesture less sensitive. - More robust key detection. - Code clean ups - Remove executable bit from nemo-keyboard files. - Use QtQuick2 (requires compilation against Qt5). 0.93.0 ====== CHANGES SINCE 0.92.5 * Added 10 new language layouts - Armenian, Bengali, French-Swiss, Gujarati, Hindi, Kannada, Malayalam, Tamil, Telugu and Urdu. * Implemented key actions to switch between language layouts - Use ... to define keys for switching to surrounding language layouts (also known as subviews, from the framework's perspective). * Various improvements to Nemo Keyboard plugin. * Allow to disable either Nemo or Maliit Keybord plugin - Use qmake CONFIG+=disable-[nemo|maliit]-keyboard to prevent building and installation of either the QML or the C++ reference plugin. BUG FIXES * Fixes: MALIIT#195 - Extended key feature does not work with any keys where a width is specified in the layout * Fixes: NEMO#451 - Use a single MouseArea for the whole keyboard 0.92.5 ====== CHANGES SINCE 0.92.4 * Make maliit-framework compile against Qt 5 beta release. * Update OLPC styling profile 0.92.4 ====== BUG FIXES * Fixes: CONFIG+=disable-preedit 0.92.3 ====== CHANGES SINCE 0.92.2 * Add configure option to disable preedit: - In this mode, all text is committed immediately. Works around https://bugzilla.gnome.org/show_bug.cgi?id=680097 and can be used as a "fix" for the corresponding MALIIT#173. - Use qmake CONFIG+=disable-preedit, which is automatically set if neither CONFIG+=enable-hunspell nor CONFIG+=enable-presage is used. 0.92.2 ====== CHANGES SINCE 0.92.1 * Implemented spell checking with Hunspell: - Requires Hunspell's development files. Use qmake CONFIG+=enable-hunspell to enable this feature. - Used best together with presage. * Expose keyboard style as a plugin setting: - Add MALIIT_DEFAULT_PROFILE option to specify default keyboard style. * New Gnome3 style: - Use qmake MALIIT_DEFAULT_PROFILE=gnome3 to activate. * New OLPC XO style: - Use qmake MALIIT_DEFAULT_PROFILE=olpc-xo to activate. * Improved magnifier key styling: - Can specify separate background graphics: "background\magnifier-key", "background\magnifier-key-borders". - Can specify magnifier size: "${style}\[landscape|portrait]\magnifier-key-[width|height]". - Can move text inside magnifier key: "${style}\[landscape|portrait]\magnifier-key-label-offset". - Use "${style}\[landscape|portrait]\vertical-offset" to position both, magnifier key and extended keys. Also moved the style attribute from extended-keys.ini to main.ini. 0.92.1 ====== CHANGES SINCE 0.92.0 * Added simple sound feedback - Requires QtMobility. Use qmake CONFIG+=enable-qt-mobility to enable sound feedback. * Make style self-contained: - Each styling profile has its own directory structure, maliit-keyboard/data/styles/README for more. * Better styling support - Magnifier, word candidates and extended keys gained more styling attributes. Please check maliit-keyboard/data/styles/nokia-n9/[main,extended_keys].ini for details. BUG FIXES * Fixes: MALIIT#115 - Can only dismiss extended panel by selecting one of the letters * Fixes Glass keyExited/keyEntered signals emission * Fixes: MALIIT#Bug 161 - Pre-edit text is not cleared when closing and re-opening VKB * Fixes: MALIIT#114 - Extended panel not closed when closing and re-opening VKB 0.92.0 ====== CHANGES SINCE 0.91.0 * Adapted to maliit-framework plugins API changes * Use new surfaces API. * Added word correction/prediction support - Enable correction support using hunspell with CONFIG+=enable-hunspell - Enable prediction support using presage with CONFIG+=enable-presage * Simplified tests by using QTEST_MAIN * Allow datadirectory for maliit-keyboard to be overriden at runtime BUG FIXES * MALIIT#38 - Maliit Keyboard has no word correction/prediction * Fix QSKIP for Qt 5 * Add QGraphicsView include * Fix test dependencies * Fix commit-string test * Fixes: Non-regular keys are valid even with empty label * Fix extended keys not visible when first shown * Fix extended keys not shown on surface * Fix potential crash when setting surface factory in MaliitKeyboard::Renderer * Fix coding style in MaliitKeyboard::Renderer implementation * Fix variable names in MaliitKeyboard::Renderer implementation * Fix failing make check in out-of-tree build * Remove unused orientation variable 0.91.0 ====== CHANGES SINCE 0.90.0 * Improved build: - Uses qmake "features" instead of pkg-config to find framework - Utilities are installed with the same prefix as the framework unless overridden at configuration * Added Estonian language layout. * Added a "close" action to be used by keys in language layouts: - - If tapped by user, this key will close virtual keyboard. Can be used in parallel to swipe-to-close gesture. BUG FIXES * Fix Windows-specific library prefixes and suffixes * Fix include order of static libs for tests, maliit-keyboard-viewer and maliit-keyboard-plugin * Fixed padding value handling for right margin. 0.90.0 ====== CHANGES SINCE 0.81.3 * Add auto-repeat for backspace (maliit-keyboard only). * Add rotation support to maliit-keyboard-viewer. - This makes it easier to test language layouts in landscape and portrait mode, without requiring a running maliit-server. * Add support for close button in language layouts. - Layouts can now use a special key that will close the keyboard when pressed, if action="close" is used in the key binding. * Add Macedonian language layout. 0.81.3 ====== CHANGES SINCE 0.81.2 * Many improvements to Maliit Keyboard BUG FIXES * Fixes: Tests fail in legacy-mode * Fixes: Tests fail if framework not installed to system dirs * Fixes: MALIIT#39 - Maliit Keyboard doesn't allow input of accented characters * Fixes: MALIIT#56 - libmaliitkeyboard must not use QPixmap 0.81.2 ====== CHANGES SINCE 0.81.1 * New Maliit Keyboard - Can use all MeeGo Keyboard language layouts. - Written in C++, optimized for rendering performance and low latency. - Activate via $ gconftool-2 -s --type list --list-type string /maliit/onscreen/enabled \ "[libmaliit-keyboard-plugin.so,en_gb]" $ gconftool-2 -s --type list --list-type string /maliit/onscreen/active \ "[libmaliit-keyboard-plugin.so,en_gb]" - Further language layouts can be enabled by using the language name as defined in /usr/share/maliit/plugins/languages/ and adding them to the "enabled" string list key. - Simple gesture support to close keyboard (swipe down) and to change language layouts (swipe left/right). BUG FIXES * Fixes: MALIIT#66 - Key Magnifier only works on right-hand side of the keyboard * Fixes: qmake HELP=1 output is not legible. * Fixes: MALIIT#54 – Don’t list symview or [phone]number layouts as language layouts. * Fixes: Build also under Qt5 * Fixes: MALIIT#45 - Maliit Keyboard doesn't have language-specific layouts * Fixes: MALIIT#36 - Improve Maliit Keyboard performance 0.81.1 ====== CHANGES SINCE 0.81.0 * New Nemo Keyboard - Comes with adjusted UX for Nemo Mobile project. - Pure QML plugin, no C++ wrapper required. * Plugins can install data and QML modules properly - Use MALIIT_PLUGINS_DATA_DIR for maliit-plugins - Nemo Keyboard for example installs everything apart from main QML file to /usr/share/maliit/plugins/org/nemomobile/ BUG FIXES * Fixes: MALIIT#35 - The Maliit Keyboard's layout causes grid illusion 0.81.0 ====== CHANGES SINCE 0.80.8 * Remove MeeGo Keyboard - Official reference plugin is the QML plugin, now named Maliit Keyboard. 0.80.8 ====== CHANGES SINCE 0.80.7 * Merge latest Harmattan VKB plugin into Maliit upstream. * QML plugin got a 2-page symview * Use swipe gestures to close QML plugin and switch to other plugins. BUG FIXES * Fixes: BMC#23461 - [CE] No special character in VKB * Fixes: Use rpath to dynamically link Ut_WidgetBar to meego-keyboard lib * Fixes: Key label color in translucent mode * Fixes: Crash after certain thai letters and space. * Fixes: Vietnamese tone position in triphtongs with no diacritics * Fixes: NB#278777 - Error correction not working correctly in Thai (adds unwanted space) * Fixes: Add forgotten license header to Korean engine handler * Fixes: NB#278777 - Error correction not working correctly in Thai (adds unwanted space) * Fixes: Thai and Vietnamese tone input when preedit is off * Fixes: NB#284151 - [TASK] ImhPreferNumbers does not open page 2 on virtual keyboard * Fixes: NB#287913 - [TASK] VKB layouts are not shown as per spec. * Fixes: NB#289053 - Thai VKB is missing "ฎ" and duplicates "ฏ" * Fixes: NB#280695 - Thai above and below characters on numbers etc * Fixes: NB#285309 - No way to input Western Arabic numerals * Fixes: Update styling cache at label font change 0.80.7 ====== CHANGES SINCE 0.80.6 * Merge latest Harmattan VKB plugin into Maliit upstream. * Caps-lock functionlity and dynamic key overrides for QML plugin. BUG FIXES * Fixes: Long-press on shift key always activates caps-lock * Fixes: BMC#23442 - [CE] Caps Lock is inaccessible in virtual keyboard * Fixes: Align Arabic and Farsi symviews with main view * Fixes: Align Hebrew symbol view with "qwerty" view * Fixes: Use bigger font size for Hebrew layout in landscape mode * Fixes: NB#286697 - In landscape mode, backspace key is missing in hebrew vkb layout * Fixes: NB#277439 - Above and below Thai characters input consecutively go above each other * Fixes: NB#281156 - [hwkb] N950 Hardware SYM key causes virtual keyboard to print button label * Fixes: NB#285711 - Accent popup shows two active keys sometimes * Fixes: NB#281474 - Word suggestion list is disappearing when the finger is lifted from the keyboard after long tapping on the space key. * Fixes: sometimes during panning, the next incoming layout snapshot is empty. * Fixes: NB#284540 - The Candidate words is showed next Plugin. * Fixes: NB#280274 - permille symbol shown instead of section of a law in Kazakh * Fixes: NB#282901 - Contact > while editing a contact, Arabic digits appears instead of Hindic on the keypad. * Fixes: NB#272715 - Dead key VKB layout is retaining in a scenario. * Fixes: NB#285297 - Define key widths for Hebrew layout * Fixes: NB#284133, Autocaps doesn't work with English quotation rules * Fixes: NB#285299, Change Farsi keyboard layout name ("Parsi" -> "Farsi") * Fixes: NB#268106, Accents in Thai layouts are not aligned correctly inside a key/pop-up menu * Fixes: NB#281752, Word tracker does not separate words from symbol when typing. * Fixes: NB#284004, Vietnamese VKB is shown as truncated in landscape mode & some keys are missing in portrait mode. * Fixes: NB#275694 - Chinese letters are allowed to enter in email address field. * Fixes: NB#275190. * Fixes: NB#279665 - Input Settings; §qtn_ckb_chinese_keyboards§ layout is wrong. * Fixes: NB#283593 - VKB: Sym Key button is unlocalized and wrong layout for question mark displayed. * Fixes: NB#280952. * Fixes: NB#278294, With the swype keyboard enabled,if all the keyboards are deselected and selected again, unable to change the vkb layouts. * Fixes: NB#281465, With the one installed keyboard and vkb in caps lock state,shift key is shown as inactive when the device is rotated. * Fixes: Signal connection warnings due to flick gesture and key overrides * Fixes: NB#278740 - meego-keyboard-dev package is incomplete * Fixes: NB#271761 - Multi-label keys always have extended keys * Fixes: Check whether BorderPanRecognizer exists * Fixes: NB#255890, Autocaps logic screws up shift state when shift is held down * Fixes: Empty TARGET rule in TouchForwardFilter UT prevents proper installation * Fixes: NB#278596 - Opening new message window is jerky/stuttering * Fixes: Blit children items correctly on widget surface * Fixes: Avoid potential crashes in MImSnapshotItemPixmapItem::grabWidgets * Fixes: For shapshot item, use single painter instance and blit directly onto target pixmap * Fixes: Coding style in MImSnapshotPixmapItem * Fixes: Bug 279089 - Number view in Chinese VKB should not display candidate bar. * Fixes: NB#279536, VKB slide and popup feedbacks need to be updated along with new vibra daemon * Fixes: NB#279903 - The assistant layout notification does not have proper position * Fixes: NB#277776 - [TASK] [Fine Tuning] Panning gesture style * Fixes: NB#279040 - HWR crashed after Zhuyin input in email field of Contacts application * Fixes: NB#252531, Cursor is in the wrong end of textedit in arabic. * Fixes: NB#278443 Input: ITU-T VKB (T9 keyboard) in Hindi number mode has Arabic letters. It should be always Latin letters * Fixes: NB#275406. * Fixes: NB#276954 Focus on textedit causes candidate list to popup unnecessarily 0.80.6 ====== CHANGES SINCE 0.80.5 * Legacy mode config option changed to enable-legacy instead of enable-meegotouch. Enable with: $ qmake -r CONFIG+=enable-legacy The enable-meegotouch config option can be used to build the LMT based keyboard plugin. * qmake HELP=1 will now output a list of build options BUG FIXES * QML keyboard plugin cannot enter alphanumerical characters (regression in 0.80.5) * Remove unwanted debian/ directory (regression in 0.80.5) 0.80.5 ====== CHANGES SINCE 0.80.1 * Added Vietnamese and Thai language layouts. * Replace flick gesture for layout switching with panning gesture: - Allows to preview language layout before switching to it, making this gesture more discoverable than previous one. * Change touchpoint handling to track touchpoint id's again: - Fixes stuck key issues that happened due to key gravity feature. Added a stuck key guard regardless. * Style name overrides for layout sections: - Can override default style name for layout sections in XML files now, allowing for more flexible theming in CSS. BUG FIXES * Fixes: NB#242162, SYM view closes if arabic numbers are typed before 'Space' -key * Fixes: Bug 277056 - Zhuyin; Enter key does not dismiss candidates. * Fixes: NB#277034 Input Methods: The right and left brackets are improperly displayed in Arabic Virtual Keyboard * Fixes: NB#276201, VKB lose latched state after device rotating * Fixes: NB#275477, Backspace key is deleting the text even after rotating the device. * Fixes: disable the panning during vkb is playing vertical animation * Fixes: failed unit tests caused by new the pan gesture * Fixes: NB#257418, space gets stuck in VKB * Fixes: NB#275183. * Fixes: NB#250640. * Fixes: NB#264654, Dimmed custom enter key should disable haptic feedback * Fixes: Bug 272907 - icon is not displayed in the center of the toolbar button * Fixes: Long press test had 'click' incorrectly set up. * Fixes: Bug 274111 - The press down state of Candidate button is not cleared after rotate. * Fixes: Styling for Hebrew CSS * Fixes: MImAbstractKeyArea UT * Fixes: NB#271763 - [FEA] Allow language layout files to specify style class * Fixes: NB#270051, Inputting extended key with dragging does not always work. * Fixes: NB#256681, Unexpected shift and touchpoint behaviour when opening extended key area with shift pressed * Fixes: Fix "MScalableImage: Received request to draw pixmap of invalid size 480x0". * Fixes: Ut_MImAbstractKeyArea was not up-to-date with autocommit behaviour. * Fixes: NB219163 - [TASK] Cyrillic languages phone number layout * Fixes: resolve issue with mouse grabbing 0.80.1 ====== CHANGES SINCE 0.80.0 * Add transition animation for magnifier and extended keys * Improved language switch animation * Added Hebrew language layouts * Legacy mode can be enabled through: $ qmake -r CONFIG+=enable-meegotouch BUG FIXES * Fixes: Don't autocommit previous key if it's the same as the new one. * Fixes: NB#268341, VKB related vibration feedbacks need to be updated * Fixes: NB#265905 - Wrong styles used in Word list dialog * Fixes: NB#261490 - [TASK] Implement transition between magnifier and extended keys * Fixes: "Unconsumed meta data" during dpkg-buildpackage. * Fixes: Syling for 33-keys layouts * Fixes: NB#264297 * Fixes: NB#266879 - No email text input keyboard for Swedish * Fixes: Use Hebrew phonenumber layout, too * Fixes: BMC#17318 - Missing Hebrew virtual keyboard layout * Fixes: NB#265892 - Messaging app hangs or working very slow while writing a message in certain way * Fixes: failed Ut_MKeyboardHost * Fixes: Cangjie toggle key need to be reset. * Fixes: NB#266446 * Fixes: NB#254893 - Search suggestion is not updated for Google... * Fixes: NB#262890 - In the custom toolbar field,buttons present in the vkb toolbar are getting highligtened while the vkb is closing. * Fixes: NB#258652 - Keyboard language notification is not according to layout guide * Fixes: NB#259910, CommonComboBoxIcons missing from Text input settings * Fixes: NB#241979 - VKB; Press down state is not shown in candidate dialog of Chinese Zhuyin input. * Fixes: NB#221453 - Dead key remains highlighted after Keys Pup up is present 0.80.0 ====== CHANGES SINCE 0.6.13 * Now builds LMT-free version by default (a simple but functional QML keyboard) - Use qmake -r CONFIG+=enable-meegotouch to build LMT reference plugin. * Use 0.80 plugins (quick) interface BUG FIXES * Fixes: Send correct input method area for MeeGo Keyboard Quick 0.6.5 ===== * New CSS attributes for MImAbstractkeyAreaStyle: - auto-padding: If true, center-aligns keys in keyboard area. Depends on width of key area's size. * New features: - Extended keys can spread over multiple lines. In the layout files, for example: This will create a 3x2 box holding five labels. is the XML entity representing \n (newline). 0.6.2 ===== * New features: - A QML-based keyboard. Does not depend on libmeegotouch. Installs as a regular plugin by default, next to the MeeGo Keyboard. Activation like so: $ gconftool-2 -s /meegotouch/inputmethods/plugins/onscreen -t string "MeegoKeyboardQuick" 0.6.0 ===== * New features: - Virtual keyboard magnifier shows the currently touched letter. - Extended keys popup on long-press, for keys with the extended_labels attribute in the layout files. 0.5.38 ====== * New CSS attributes for MImAbstractKeyAreaStyle: - enable-overlay-mode: In overlay mode, reactive area of first/last row spawns to top/bottom of display. Does not effect key geometry. 0.5.36 ====== * Spacer elements are no longer inactive. Instead, they count as reactive area for neighbouring keys. 0.5.20 ====== * Internal changes in meego-keyboard: - MImKey: - New geometry API (MImKey::Geometry) - a key's bounding rect is now defined by the key's margins. Geometry can be accessed or modifed through ::geometry(), ::setGeometry(.), although there some convenience functions for key position, key width and key height. Key position refers to the top left corner of the bounding rect. - MImKeyArea: - Changed key layouting. Instead of spacing between keys, the layout is now fully determined by key size and key margins. That is, spacing between two keys only depends on their pairing margins. - MImAbstractKeyArea: - Changes between different style modes (key13 and key30-key45), depending on how many keys a layout has. This gives tighter control over layouts. The old behaviour can be activated through "sync-style-mode-with-key-count: false;" - MImAbstractKeyAreaStyle: - Renamed row-height* to key-height*, because that's closer to reality. - key-height (row-height) was removed, just use key-height-medium instead. - padding behaviour changed: - padding-left overrides key-margin-left of the left-most key in a row, - padding-top overrides key-margin-top of all keys in top row, - padding-right overrides key-margin-right of the right-most key in a row, - padding-bottom overrides key-margin-bottom of all keys in bottom row. - size allows to override height from key area height computation, if > -1. Overriding width is not supported yet. 0.5.15 ======== * Changes in meego-keyboard: - changed signature of following signals in MImAbstractKeyArea: - keyPressed - keyReleased - keyClicked - longKeyPressed 0.5.11 ======== * Changes in meego-keyboard: - changed signature of following signals in MImAbstractKeyArea: - keyPressed - keyReleased - keyClicked - longKeyPressed 0.5.10-1 ======== * Internal changes in meego-keyboard: - MImAbstractKey: - renamed key() => model() - added resetActiveKeys(): will release all stuck keys - added visitActiveKeys(.): takes a functor, and applies it to all active keys. Aborts iteration if functor returns true. - added MImAbstractKeyVisitor interface - added lastActiveKey(): returns most recently pressed key that wasn't released yet. - MImAbstractKeyArea: - renamed updateButtonGeometriesForWith() => updateKeyGeometries() 0.5.9-1 ======= * Speed typing improvements * Internal changes in meego-keyboard: - The following classes were renamed: - KeyButtonArea => MImAbstractKeyArea - KeyButtonAreaStyle => MImAbstractkeyAreaStyle - SingleWidgetButtonArea => MImKeyArea - IKeyButton => MImAbstractKey - SingleWidgetButton => MImKey - VKBDataKey => MImKeyModel - KeyBinding => MImKeyBinding - Cleaned up PopupBase API. It now takes a KeyButtonArea parameter, which enables easier communication between popup and the currently active KeyButtonArea; the interface consists of: - updatePos, cancel, handleKeyPressedOnMainArea, handleLongKeyPressedOnMainArea, isVisible, setEnabled - SingleWidgetButtonArea headers are now exported. * New CSS attributes for KeyButtonAreaStyle: - debugging-related: - draw-button-bounding-rects: [false|true]; - draw-button-rects: [false|true]; - debug-touchpoints: [false|true]; - draw-reactive-areas: [false|true]; - others: - button-bounding-rect-top-adjustment: [int]; - button-bounding-rect-bottom-adjustment: [int]; - idle-vkb-timeout: [int in ms]; 0.5.?-? ======= * New CSS properties: - touchpoint-horizontal-gravity, touchpoint-vertical-gravity: Allows to control how far a finger can slip from the currently touched key button, without releasing it. Distance is measured from button border. 0.5.1-1 ======== * meego-keyboard.schemas is Changed. - /schemas/meegotouch/inputmethods/languages is changed to /schemas/meegotouch/inputmethods/virtualkeyboard/layouts. It stores initial layout file lists for meego-keyboard. - /schemas/meegotouch/inputmethods/languages/default is changed to /schemas/meegotouch/inputmethods/virtualkeyboard/layouts/default. It stores default layout file name for meego-keyboard. * Internal changes in meego-keyboard: - KeyboardData: - layoutFile returns layout file name. - LayoutsManager: - layoutCount returns the count of keyboard layouts. - languageList is removed. Use layoutFileList to instead. - layoutFileList returns the keyboard layout name list. - layout is changed to accepct layout name instead of language code as the input parameter. - defaultLanguage is replaced by defaultLayout. - languagesChanged signal is renamed to layoutsChanged. - loadLanguage is replaced by loadLayout. - keyboardByName is changed to accepct layout file name instead of language code as the input parameter. - MVirtualKeyboard: - selectedLanguage is replaced by selectedLayout. - switchLanguage is replaced by switchLayout. - setLanguage is replaced by setLayout. - languageReset is replaced by keyboardsReset. - languageChanged signal is renamed to layoutChanged. - createMainSectionView and createSectionView are changed to accept layout name instead of language code as the input parameter. - SymbolView: - SymbolView is changed to accept layout name instead of language code as the input parameter. - setLanguage is replaced by setLayout. 0.5.0-1 ======== * New keyboard layouts: - Hungarian, Romanian, Slovak, Ukrainian, Turkish, Indonesian, Malay, Brazilan, Mexican * API changes in meego-keyboard: - New typedef for QSharedPointer - LayoutData::SharedLayoutSection. - Switch to floating points for SWBA geometry computation. - KeyButtonArea: - updateButtonGeometries was replaced by updateButtonGeometriesForWidth, - buttonInformation, buttonSizeByColumn got removed. - LayoutSection: - maxNormalizedWidth returns the row width in logical units, using a key's width attribute. - rowHeight returns the row height, using a row's height attribute. - spacerIndices returns a list with the position of space elements for a given row. - Renamed getVKBKey to vkbKey. - LayoutData: - Changed return type of section (and its overload) to SharedLayoutSection, removing the constness from the contained LayoutSection. - LayoutsManager: - createInstance, ctor now take an (optional) MVirtualKeyboardStyleContainer parameter. - Layout returns an empty LayoutData instance in case the queried layout could not be found. - KeyboardData: - Ctor now takes an (optional) MVirtualKeyboardStyleContainer parameter. - VKBDataKey: - Ctor now takes a StyleType and a SizeType parameter, too. - New getters (style, size, isFixedSize) for current StyleType, SizeType and whether to use fixed key width or (relative) scaling. - normalizedSize returns the key's QSizeF (queried from style and dependend on the SizeType). - SingleWidgetButtonArea, KeyButtonArea: - Removed updateButtonGeometries and made updateButtonGeometriesForWidth a pure virtual instead. - Removed ButtonSizeScheme, ButtonSize takes over (difference: scheme was bound to a whole layout section, size type are flexible). - drawSymKeyBackground removed, drawNormalKeyBackground renamed to drawKeyBackground: styling (per button) can now be done via style. - SymbolView: - loadFunctionRow, setFunctionRowState, updateSymIndicator removed. - FlickupButton: - FlickupButton is removed. - FlickupButtonView: - FlickupButtonView is removed. - FlickUpButtonStyle: - FlickUpButtonStyle and FlickUpButtonStyleContainer are removed. * Keyboard layout files became more expressive: - New style attribute for key elements: normal (default), deadkey, special. The new style types can be referenced from CSS files, allowing for more flexible button styling. - New height attribute for row elements: small, medium (default), large, x-large, xx-large. The height can be used to specify the relative row height in CSS files (no support for fixed height yet). - New fixed attribute for row elements: true, false (default). It defines whether the row height specified in height attributes should be a relative or fixed value. - New width attribute for key elements: small, medium (default), large, x-large, xx-large, stretched. The new width type can be used to specify relative button width in CSS files (no support for fixed width yet). - New fixed attribute for key elements: true, false (default). It defines whether the button width specified in size attributes should be a relative or fixed value. - New spacer element for row elements: Spacers distribute all remaining space of a row among them, after the possible stretcher button has been dealt with. - The section's alignment attributes have been superseded by spacer elements, and therefore, been removed. - New action switch for binding: switch action indicates to switch active symbol page to the next avaliable page. * New CSS properties: - MVirtualKeyboardStyle: - key-width-small, key-width-small-fixed - key-width-medium, key-width-medium-fixed - key-width-large, key-width-large-fixed - key-width-x-large, key-width-x-large-fixed - key-width-xx-large, key-width-xx-large-fixed - key-width-stretched, key-width-stretched-fixed - row-height-small, - row-height-medium, - row-height-large, - row-height-x-large, - row-height-xx-large, - key-background, key-background-pressed, key-background-selected, key-background-pressed-selected - key-background-special, key-background-special-pressed, key-background-special-selected, key-background-special-pressed-selected - key-background-deadkey, key-background-deadkey-pressed, key-background-deadkey-selected, key-background-deadkey-pressed-selected - key-height * Removed CSS properties: - key-background-sym-indicator-sym, key-background-sym-indicator-sym-pressed - key-background-sym-indicator-ace, key-background-sym-indicator-ace-pressed - key-normal-size, key-phone-number-normal-size, key-function-normal-size, key-function-large-size, key-number-function-large-size, key-sym-normal-size: 0.4.13-1 ========= * Direct mode for VKB was temporarily disabled due to NB#176441. maliit-plugins-0.99.0+git20130524+73edacd/README000066400000000000000000000023461214765240700202520ustar00rootroot00000000000000Maliit Maliit provides a flexible and cross-platform input method framework. It has a plugin-based client-server architecture where applications act as clients and communicate with the Maliit server via input context plugins. The communication link currently uses D-Bus. Maliit is an open source framework (LGPL 2) with open source plugins (BSD). These are the Maliit reference plugins. Installing Qt 4.7 must be installed to build the Maliit reference plugins. At a terminal, run: qmake make make install Run qmake HELP=1 to get more information about build options. Running Plugins require a running maliit-server. Active and enabled plugins are controlled via GConf. The reference plugin is configured like so: gconftool-2 -s --type list --list-type string /maliit/onscreen/enabled "[libmaliit-keyboard-plugin.so,en_gb]" gconftool-2 -s --type list --list-type string /maliit/onscreen/active "[libmaliit-keyboard-plugin.so,en_gb]" There can be more than one enabled plugin, but only one can be active at a time. Resources Wiki: http://wiki.maliit.org/ and http://wiki.maliit.org/Plugins IRC: #maliit on chat.freenode.net Announcement mailing list: maliit-announce@lists.maliit.org Discussion mailing list: maliit-discuss@lists.maliit.org maliit-plugins-0.99.0+git20130524+73edacd/VERSION000066400000000000000000000000071214765240700204320ustar00rootroot000000000000000.99.0 maliit-plugins-0.99.0+git20130524+73edacd/config.pri000066400000000000000000000024251214765240700213510ustar00rootroot00000000000000# Linker optimization for release build QMAKE_LFLAGS_RELEASE+=-Wl,--as-needed # Compiler warnings are error if the build type is debug. # Except when we pass a CONFIG+=no-werror as a workaround for QTBUG-18092 no-werror { QMAKE_CXXFLAGS_DEBUG+=-O0 } else { QMAKE_CXXFLAGS_DEBUG+=-Werror -O0 } CONFIG += no_keywords # The feature maliit-defines initializes some variables related for MALIIT, such as installation paths # here have to load it early, to start using the defines immediately !load(maliit-defines) { error(Cannot find $$[QT_INSTALL_DATA]/mkspecs/features/maliit-defines.prf. Probably Maliit framework not installed) } # This enables the maliit library for C++ code CONFIG += maliit-plugins isEmpty(PREFIX) { PREFIX = $$MALIIT_PREFIX } isEmpty(LIBDIR) { LIBDIR = $$PREFIX/lib } isEmpty(MALIIT_DEFAULT_PROFILE) { MALIIT_DEFAULT_PROFILE = nokia-n9 } isEmpty(HUNSPELL_DICT_PATH) { HUNSPELL_DICT_PATH = $$PREFIX/share/hunspell } contains(QT_CONFIG, embedded) { CONFIG += qws } INSTALL_BIN = $$PREFIX/bin INSTALL_LIBS = $$LIBDIR INSTALL_HEADERS = $$PREFIX/include INSTALL_DOCS = $$PREFIX/share/doc enable-opengl { QT += opengl DEFINES += MALIIT_KEYBOARD_HAVE_OPENGL } MALIIT_PACKAGENAME = maliit-plugins MALIIT_VERSION = $$system(cat $$PWD/VERSION) maliit-plugins-0.99.0+git20130524+73edacd/doc/000077500000000000000000000000001214765240700201325ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/doc/.gitignore000066400000000000000000000000531214765240700221200ustar00rootroot00000000000000/html /doxyfile.conf /doxygen_warnings.log maliit-plugins-0.99.0+git20130524+73edacd/doc/doc.pro000066400000000000000000000012311214765240700214160ustar00rootroot00000000000000include(../config.pri) TEMPLATE = lib CONFIG += plugin TARGET = dummy DOXYFILE = doxyfile.conf.in doc.name = doc doc.CONFIG += target_predeps no_link doc.output = html/index.html doc.clean_commands = rm -rf html doc.clean = ${QMAKE_FILE_IN_BASE} doc.input = DOXYFILE doc.commands += sed -e \"s;@VERSION@;$${MALIIT_VERSION};g\" -e \"s;@PWD@;$${PWD};g\" ${QMAKE_FILE_IN} > $${OUT_PWD}/${QMAKE_FILE_IN_BASE} && doc.commands += doxygen $${OUT_PWD}/${QMAKE_FILE_IN_BASE} QMAKE_EXTRA_COMPILERS += doc htmldocs.files = html htmldocs.path = $$INSTALL_DOCS/$$MALIIT_PACKAGENAME htmldocs.CONFIG += no_check_exist directory INSTALLS += htmldocs OTHER_FILES += $$DOXYFILE maliit-plugins-0.99.0+git20130524+73edacd/doc/doxyfile.conf.in000066400000000000000000000162051214765240700232350ustar00rootroot00000000000000DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "Maliit Plugins" PROJECT_NUMBER = @VERSION@ PROJECT_BRIEF = PROJECT_LOGO = OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = @IN_PWD@/.. STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 # This does not work now: # http://sourceforge.net/mailarchive/message.php?msg_id=23227476 ALIASES = "reimp=\cond REIMPLEMENTATION" \ "reimp_end=\endcond" \ "internal=\cond INTERNAL" \ "internal_end=\endcond" TCL_SUBST = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO EXTENSION_MAPPING = MARKDOWN_SUPPORT = YES BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES INLINE_GROUPED_CLASSES = NO INLINE_SIMPLE_STRUCTS = NO TYPEDEF_HIDES_STRUCT = NO SYMBOL_CACHE_SIZE = 0 LOOKUP_CACHE_SIZE = 0 EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_PACKAGE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO SHOW_FILES = YES SHOW_NAMESPACES = YES FILE_VERSION_FILTER = LAYOUT_FILE = CITE_BIB_FILES = QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = doxygen_warnings.log INPUT = @IN_PWD@/../maliit-keyboard INPUT_ENCODING = UTF-8 FILE_PATTERNS = RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = */tests/* \ */moc_*.cpp EXCLUDE_SYMBOLS = MaliitKeyboard::*Private EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO FILTER_SOURCE_PATTERNS = SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_TIMESTAMP = NO HTML_STYLESHEET = HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 HTML_TIMESTAMP = YES HTML_ALIGN_MEMBERS = YES HTML_DYNAMIC_SECTIONS = NO GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO CHM_INDEX_ENCODING = BINARY_TOC = NO TOC_EXPAND = NO GENERATE_QHP = NO QCH_FILE = QHP_NAMESPACE = org.doxygen.Project QHP_VIRTUAL_FOLDER = doc QHP_CUST_FILTER_NAME = QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = QHG_LOCATION = GENERATE_ECLIPSEHELP = NO ECLIPSE_DOC_ID = org.doxygen.Project DISABLE_INDEX = NO GENERATE_TREEVIEW = NO ENUM_VALUES_PER_LINE = 4 USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES USE_MATHJAX = NO MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest MATHJAX_EXTENSIONS = SEARCHENGINE = YES SERVER_BASED_SEARCH = NO GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4 EXTRA_PACKAGES = LATEX_HEADER = LATEX_FOOTER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl CLASS_DIAGRAMS = YES MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO DOT_NUM_THREADS = 0 DOT_FONTNAME = Helvetica DOT_FONTSIZE = 10 DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO UML_LIMIT_NUM_FIELDS = 10 TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png INTERACTIVE_SVG = NO DOT_PATH = DOTFILE_DIRS = MSCFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/000077500000000000000000000000001214765240700224425ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/README000066400000000000000000000007611214765240700233260ustar00rootroot00000000000000Maliit Keyboard =============== This is a C++ based reference plugin. It focuses on good performance and decent usability. Known issues ============ On multi-screen setups, Qt's QDesktopWidget will not always report the invidual screen sizes, but instead only report the full virtual screen size. Since this information is used to position the virtual keyboard, it can somtimes lead to the virtual keyboard ending up in weird places. To workaround this issue, try swapping the monitor layout. maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/STYLING000066400000000000000000000051751214765240700235260ustar00rootroot00000000000000Overview ======== Maliit Keyboard supports styling (also known as theming) via "styling profiles". A styling profile is a self-contained directory with graphical assets, fonts, sounds etc. Users can choose the styling profile through the current_style setting, for instance (requires running maliit-server): $ maliit-exampleapp-settings-python3.py \ $ set libmaliit-keyboard-plugin.so current_style gnome3 The styling profiles are found in "data/styles". For an example style named "my-style", the directory structure would be: ..+- data/ +- styles/ +- my-style/ | +- images/ | +- sounds/ | +- fonts/ | +- main.ini | +- extended-keys.ini The directories "images", "sounds" and "fonts" are used for binary data. The files "main.ini" and "extended-keys.ini" define the styling attributes (one for the regular qwerty area, one for the extended keys that pop up on long-press), such as key size, background graphics etc. Changes will only become visible upon maliit-server restart. INI files for styling ===================== Styling attributes are simple key-value pairs, organized by section. The INI file format offers a perfect match and is simple to read/edit manually. The sections in [main|extended-keys].ini are: [background] - Describes background graphics for different keyboard elements. Keys ending with "-borders" allow for 9-tiling of graphics. The value consists of 4 integers (left, top, right, bottom), separated by spaces. Example: word-ribbon-borders=0 0 0 0 word-ribbon=background.png [icon] - Maps icon names found in layout files to graphics assets. Example: shift=shift-icon.png [sound] - Maps events that support sound to sound files, such as key presses. Example: key-press=typewriter.wav [default] - Contains default values for a layout file, such as key size and key area width, for both landscape and portrait mode orientation. Example: landscape\key-area-width=854 portrait\key-area-width=480 [keys35] - Layout files can specify a style name for each section. If no style name is given, it's computed by the amount of keys found in the section. So a layout file section with 35 keys gets the auto-computed styling id of "keys35". In the INI files, this can be used to define a section of the same name which contains override values for the values of the "default" section. Whenever the layout file section with this id is used (= actively displayed on screen), the override values take precedence over the default values. Example: landscape/key-width-xlarge=118 portrait/key-width-xlarge=64 See data/styles/nokia-n9/main.ini for a complete example and all possible key-value pairs. maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/benchmark/000077500000000000000000000000001214765240700243745ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/benchmark/.gitignore000066400000000000000000000000321214765240700263570ustar00rootroot00000000000000maliit-keyboard-benchmark maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/benchmark/benchmark.pro000066400000000000000000000005351214765240700270530ustar00rootroot00000000000000include(../config.pri) TOP_BUILDDIR = $${OUT_PWD}/../.. TEMPLATE = app TARGET = maliit-keyboard-benchmark target.path = $$INSTALL_BIN INCLUDEPATH += ../lib LIBS += $${TOP_BUILDDIR}/$${MALIIT_KEYBOARD_LIB} PRE_TARGETDEPS += $${TOP_BUILDDIR}/$${MALIIT_KEYBOARD_LIB} SOURCES += main.cpp QT = core INSTALLS += target include(../word-prediction.pri) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/benchmark/main.cpp000066400000000000000000000120751214765240700260310ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "logic/layoutupdater.h" #include #include #include int main(int argc, char ** argv) { QCoreApplication app(argc, argv); double deadline(0); if (argc > 1) { deadline = std::atof(argv[1]); if (deadline < 0) { deadline = 0; } } int mode(0); if (argc > 2) { mode = 1; } MaliitKeyboard::Logic::LayoutHelper layout; MaliitKeyboard::Logic::LayoutUpdater updater; const QStringList ids (updater.keyboardIds()); const int count(ids.size()); // no sense in benchmarking one language - id won't change and no keyboard // loading will happen if (count < 2) { qDebug("No language files found."); return 1; } updater.setLayout(&layout); double total_time(0); double meeting_total_time(0); double missing_total_time(0); const int rounds(1000); int meeting_rounds(0); int missing_rounds(0); int previous_index(-1); QTime overall_mode_timer; int overall_counter(0); std::srand(time(0)); if (mode) { overall_mode_timer.start(); while (overall_mode_timer.elapsed() < deadline * 1000) { int index(std::rand() % count); // we want to be sure that we check different ids everytime. if (index == previous_index) { if (index + 1 == count) { --index; } else { ++index; } } previous_index = index; updater.setActiveKeyboardId(ids[index]); ++overall_counter; } qDebug("Done %d iterations in %f seconds.", overall_counter, deadline); } else { for (int iter(0); iter < rounds; ++iter) { int index(std::rand() % count); // we want to be sure that we check different ids everytime. if (index == previous_index) { if (index + 1 == count) { --index; } else { ++index; } } previous_index = index; QTime timer; timer.start(); updater.setActiveKeyboardId(ids[index]); int this_time = timer.elapsed(); total_time += this_time; if (deadline > 0) { if (this_time > deadline) { ++missing_rounds; missing_total_time += this_time; } else { ++meeting_rounds; meeting_total_time += this_time; } } if (deadline > 0) { qDebug("Deadline: %f", deadline); if (meeting_rounds > 0) { qDebug("Iterations meeting deadline: %d, average %f ms, total time %f ms", meeting_rounds, meeting_total_time / meeting_rounds, meeting_total_time); } if (missing_rounds > 0) { qDebug("Iterations missing deadline: %d, average %f ms. total time %f ms", missing_rounds, missing_total_time / missing_rounds, missing_total_time); } } qDebug("Iterations total: %d, average: %f ms, total time %f ms", rounds, total_time / rounds, total_time); } } } maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/config-plugin.pri000066400000000000000000000001101214765240700257070ustar00rootroot00000000000000# This enables the maliit library for C++ code CONFIG += maliit-plugins maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/config.pri000066400000000000000000000024621214765240700244270ustar00rootroot00000000000000include(../config.pri) MALIIT_KEYBOARD_DATA_DIR = "$${MALIIT_PLUGINS_DATA_DIR}/org/maliit" DEFINES += MALIIT_PLUGINS_DATA_DIR=\\\"$${MALIIT_PLUGINS_DATA_DIR}\\\" DEFINES += MALIIT_KEYBOARD_DATA_DIR=\\\"$${MALIIT_KEYBOARD_DATA_DIR}\\\" unix { MALIIT_STATIC_PREFIX=lib MALIIT_STATIC_SUFFIX=.a MALIIT_DYNAMIC_PREFIX=lib MALIIT_DYNAMIC_SUFFIX=.so } win32 { # qmake puts libraries in subfolders on Windows release { MALIIT_STATIC_PREFIX=release/lib MALIIT_DYNAMIC_PREFIX=release/ } debug { MALIIT_STATIC_PREFIX=debug/lib MALIIT_DYNAMIC_PREFIX=debug/ } MALIIT_STATIC_SUFFIX=.a MALIIT_DYNAMIC_SUFFIX=.dll } defineReplace(maliitStaticLib) { return($${MALIIT_STATIC_PREFIX}$${1}$${MALIIT_STATIC_SUFFIX}) } defineReplace(maliitDynamicLib) { return($${MALIIT_DYNAMIC_PREFIX}$${1}$${MALIIT_DYNAMIC_SUFFIX}) } MALIIT_KEYBOARD_TARGET = maliit-keyboard MALIIT_KEYBOARD_VIEW_TARGET = maliit-keyboard-view MALIIT_KEYBOARD_PLUGIN_TARGET = maliit-keyboard-plugin MALIIT_KEYBOARD_LIB = maliit-keyboard/lib/$$maliitStaticLib($${MALIIT_KEYBOARD_TARGET}) MALIIT_KEYBOARD_VIEW_LIB = maliit-keyboard/view/$$maliitStaticLib($${MALIIT_KEYBOARD_VIEW_TARGET}) MALIIT_KEYBOARD_PLUGIN_LIB = maliit-keyboard/plugin/$$maliitDynamicLib($${MALIIT_KEYBOARD_PLUGIN_TARGET}) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/000077500000000000000000000000001214765240700233535ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/.gitignore000066400000000000000000000000151214765240700253370ustar00rootroot00000000000000libdummy.so* maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/data.pro000066400000000000000000000010431214765240700250040ustar00rootroot00000000000000include(../config.pri) TARGET = dummy TEMPLATE = lib languages.path = $$MALIIT_PLUGINS_DATA_DIR/languages languages.files = languages/*.xml languages/*.dtd # make it available for testing, not intended for proper release though: languages.files += languages/debug/showcase.xml styles.path = $$MALIIT_KEYBOARD_DATA_DIR styles.files = styles INSTALLS += languages styles QMAKE_EXTRA_TARGETS += check check.target = check check.commands = \ xmllint --noout --dtdvalid \"$$PWD/languages/VirtualKeyboardLayout.dtd\" \"$$PWD/languages/\"*.xml maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/000077500000000000000000000000001214765240700253215ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/VirtualKeyboardLayout.dtd000066400000000000000000000053201214765240700323230ustar00rootroot00000000000000 maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/ar.xml000066400000000000000000000066101214765240700264500ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/bg_bg.xml000066400000000000000000000212201214765240700271000ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/bn_in.xml000066400000000000000000000261121214765240700271320ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/cs.xml000066400000000000000000000430521214765240700264540ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/da.xml000066400000000000000000000352511214765240700264350ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/de.xml000066400000000000000000000341501214765240700264360ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/debug/000077500000000000000000000000001214765240700264075ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/debug/showcase.xml000066400000000000000000000322711214765240700307520ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/el_gr.xml000066400000000000000000000230521214765240700271350ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/en_gb.xml000066400000000000000000000321621214765240700271210ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/en_us.xml000066400000000000000000000321311214765240700271540ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/es.xml000066400000000000000000000335431214765240700264620ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/es_mx.xml000066400000000000000000000335661214765240700271730ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/et.xml000066400000000000000000000352231214765240700264600ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/fa.xml000066400000000000000000000060341214765240700264340ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/fi.xml000066400000000000000000000356231214765240700264520ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/fr.xml000066400000000000000000000325331214765240700264600ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/fr_ca.xml000066400000000000000000000326161214765240700271250ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/fr_ch.xml000066400000000000000000000361101214765240700271250ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/gu_in.xml000066400000000000000000000260641214765240700271540ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/he.xml000066400000000000000000000051771214765240700264510ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/hi_in.xml000066400000000000000000000260631214765240700271400ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/hu.xml000066400000000000000000000373211214765240700264650ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/hy_am_alt.xml000066400000000000000000000305111214765240700300000ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/id.xml000066400000000000000000000304261214765240700264440ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/it.xml000066400000000000000000000324431214765240700264650ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/kk.xml000066400000000000000000000231041214765240700264500ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/kn_in.xml000066400000000000000000000251251214765240700271460ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/lt.xml000066400000000000000000000256441214765240700264750ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/mk_mk.xml000066400000000000000000000245361214765240700271530ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/ml_in.xml000066400000000000000000000261361214765240700271510ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/ms.xml000066400000000000000000000304211214765240700264620ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/nl.xml000066400000000000000000000307651214765240700264670ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/no.xml000066400000000000000000000341611214765240700264640ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/number.xml000066400000000000000000000050741214765240700273410ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/number_ar.xml000066400000000000000000000051331214765240700300170ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/number_fa.xml000066400000000000000000000051331214765240700300030ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/phonenumber.xml000066400000000000000000000056501214765240700303730ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/phonenumber_ar.xml000066400000000000000000000056741214765240700310630ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/phonenumber_fa.xml000066400000000000000000000056741214765240700310470ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/phonenumber_he.xml000066400000000000000000000057141214765240700310500ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/phonenumber_ru.xml000066400000000000000000000057641214765240700311070ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/phonenumber_sr.xml000066400000000000000000000057641214765240700311050ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/pl.xml000066400000000000000000000423721214765240700264660ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/pt.xml000066400000000000000000000325121214765240700264710ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/pt_br.xml000066400000000000000000000325301214765240700271540ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/ro.xml000066400000000000000000000405611214765240700264710ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/ru.xml000066400000000000000000000174511214765240700265010ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/sk.xml000066400000000000000000000436401214765240700264670ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/sv.xml000066400000000000000000000352531214765240700265030ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols-35-fi.xml000066400000000000000000000123451214765240700303610ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols-35.xml000066400000000000000000000123451214765240700277650ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols-36-nordic.xml000066400000000000000000000123151214765240700312370ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols-36.xml000066400000000000000000000123151214765240700277630ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols-38.xml000066400000000000000000000130041214765240700277610ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols-39.xml000066400000000000000000000132111214765240700277620ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_ar.xml000066400000000000000000000135461214765240700302260ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_en.xml000066400000000000000000000122001214765240700302100ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_fa.xml000066400000000000000000000135411214765240700302050ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_he.xml000066400000000000000000000122121214765240700302050ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_hy.xml000066400000000000000000000122061214765240700302340ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_kk.xml000066400000000000000000000133031214765240700302200ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_ru_uk.xml000066400000000000000000000132771214765240700307520ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_th.xml000066400000000000000000000132451214765240700302330ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_vi.xml000066400000000000000000000070511214765240700302340ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_zh_cangjie.xml000066400000000000000000000237571214765240700317320ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_zh_pinyin.xml000066400000000000000000000237571214765240700316400ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/symbols_zh_zhuyin.xml000066400000000000000000000311251214765240700316440ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/ta_in.xml000066400000000000000000000275371214765240700271530ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/te_in.xml000066400000000000000000000251271214765240700271500ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/th.xml000066400000000000000000000157661214765240700264750ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/toolbar.xml000066400000000000000000000006251214765240700275100ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/tr.xml000066400000000000000000000174261214765240700265020ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/uk.xml000066400000000000000000000154611214765240700264710ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/ur_pk.xml000066400000000000000000000250141214765240700271650ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/vi.xml000066400000000000000000000163531214765240700264710ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/zh_cn_cangjie.xml000066400000000000000000000126351214765240700306330ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/zh_cn_pinyin.xml000066400000000000000000000263721214765240700305440ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/languages/zh_cn_zhuyin.xml000066400000000000000000000204321214765240700305530ustar00rootroot00000000000000
maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/000077500000000000000000000000001214765240700246765ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/000077500000000000000000000000001214765240700260665ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/extended-keys.ini000066400000000000000000000011371214765240700313420ustar00rootroot00000000000000[background] key-area-borders=12 12 12 12 key-borders=12 12 12 12 key-area=extended-background.png normal=extended-key-background.png normal-pressed=extended-key-background-pressed.png [default] landscape\key-area-width=854 landscape\key-area-paddings=0 landscape\key-margins=0 landscape\key-height=80 landscape\key-width=80 landscape\safety-margin=10 landscape\font-size=40 landscape\font-color=#ffffff portrait\key-area-width=480 portrait\key-area-paddings=0 portrait\key-margins=0 portrait\key-height=80 portrait\key-width=60 portrait\safety-margin=10 portrait\font-size=40 portrait\font-color=#ffffff maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/images/000077500000000000000000000000001214765240700273335ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/images/background.png000066400000000000000000000002551214765240700321620ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME 7>a-IDATXA05s1@zڎ |v ]IENDB`backspace-icon.png000066400000000000000000000011341214765240700326230ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh=JAzHn hJ0$rtXYBjk%g,fffW恏lf33n"BY- +o |S{y q xeYy ] W[=WEɜzS0G5GlS c1PY@@/|h9("-""2S1LM4EA596Ul("mmuXE>?{V\"V^\QNXl:tʚRaTքD}FuإG-4qUQVl%tJC$dx@%WZ &M0`7?sKىIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/images/close-icon.png000066400000000000000000000010141214765240700320700ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME (4aIRIDATh홽J@'"WURio`#((> ٫o`!*S,،09%e?2iMnF+د dlZH xN:{VSꮁi_ %n~^J#pelK%_\@[Nn fC{eGώ%Ԗ+|YQ>پٚ㚜 3oC{jAqAuzN|n`fOh͐mݩWØl^]!Kw_=rZp{/n'Ig}˫8^-\-s_fd{DBg8iE͙yq-Aބ?ɸ/(\#'~F|鐨Q:|}^gX]H#K5uL{YۙaŅyp:lzJ@~N ̨AU"uaÀߺݧC'M4MM@o)IO#+P& 4iIt"=,O1U:{[m#CKՉѿ1;G?feTL0lU9^,P`5$/HC*O̸ecӄP[F]ݏnvj81g `kX\TD$ 1CE2efi 6'1\G Bِ$ &qe@ų5\Y`L7]T@`.cvPx@sVY 8*:^(^8Hi;&?O߮`a,%o1k)fcu{"8uA` bupeK3 PB/WNY ґ 9+4ZAmfL X0@Rңn9ilp40p!J'\ E8b ef< n@j( G,Up1-B1&5-SXedz+ &\3~5(q.u;/he7FHPIpp#x| D{>[YRF~]34{Nj[Q-Dv sKRtr}+ubOl6s0<Ř<+9[{eFFI 8x{>5ٻfum5)KBI VUcmZ&Wdd,6i)T.pꗓ,T3*g}謘i$|d&J g  '&a-dJG>D4/N7PZy9/DzC|5ۑʂ4g ]`hMW5z ӟY c (sVYW;K l;{u,g@فӴ Q͋Y!|anV@5\kc̥혤] tWJuӹNh̊d2pe55\CVF[u@xKrdTۨ5K((h(gƔALPUp(  %IunBCMdFflƚABK8M +P^\/W~ʅ$)Pc"J:  Fe$s(%$nZ _5g h~v`i߫!:'5h/^;^jIQjJ߫m$iXqpu, @F^-gf./g)x~PrZ V( CځitDMðV]zA 5>4 Ϝ  ob&jz5r΄<_*DZq+`OHQPrYƏ+%.wd u[8E<4 Hu ;h\M).p->PjA{dbiB%_ZFU=6م*;c ab4+Edbwyrv(BS]-+B,E[j/[޿#EjGFY|i q:{uA}݃_q(3^C7M C졢eJqyk9wI(hf{f|\V4KbHѐ6qڕc5εL>q3".bn.\Msa0kAQ26}cdpWkߌ{>02R-8&R1ڊ ZS^IBT/̤.[4y@>JBzQYbAEA_+UCDuLI喲DUEoF-^K;lxPZRd0&em_~#L:lrJOԺf賈AQDAB UIw%\ts,*Eo;;=1ʚ޹xaeM\|clM6*C"d3e"8tY+y yF q= T~^ M.Bٌ]l{|V`KӞb6FR#.pju+Wzˑh]ći:m[cŞ8[m!*SEܽ/ QvnfS@j}$֥ȐdW9Wfzu'>">.K 2VxlRXu 'r&AH|$+8E⅍Eӂ}<)zcM5i,G/'~_zeeH0u|0UZLf/ZA;'KTzD))"QנּW_kWqFs g'drU*|dASGCG~ڢuCiGۋgsBYm@gI' /7_(ח65^^~ƓkY3V1Hg[O|}) <]xjg=@<W>CO/9P}4p_l{TmϞ /;o5ntT3j:FXviTc8z~ ˮ<yH}uD;o1^LAHء0mG9Mv^OVMf|I+ښeb0ߌK1bo?O_('E6fsU0V_Ů`f6$6R֕:!3TOH.5ɟ~ ?Yq(#|/?Gxy I9 3p"(NXjھ'Ikhr5 >GW^k'O//#xx?(q{IENDB`extended-key-background-pressed.png000066400000000000000000000012341214765240700361300ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDRZd'sRGB pHYs B(xtIME3 N).IDATxݱQAooK0!&3: 2*.q R"H >V] }C9 gaIٞHK4t-i$WIϒ֒%RJON'$yVKIKƻgǶD,lkc =`&{ݩI;*r38.z~ Ȥ|aQLrȢgr3;7)?xcH eӛ&n| -Ne%{Kc/*l~ø Ҷl[RJ `[(~'hhhh h h&&hhh h h&&hhh h h&&h@©~i~kiM_mKu{Tlh]-zeur9.˦,GUE:^`{] Ŷ$c{xh>L hc$?؞V,lJ͡INGh"N}^KI)/A4&U.:{<^-IENDB`extended-key-background.png000066400000000000000000000002101214765240700344560ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDR szzsRGB pHYs B(xtIME517\(IDATX nH@ WIENDB`key-background-pressed.png000066400000000000000000000023651214765240700343400ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDRC?*usBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<rIDATxKGƟw2&T֊fۚ\RaО' ]z𰭗ZX(5 @o1_ׂm,! ˲Bp_H팮C٤-8Df1ieYR;òVW̳IWfH;2#M:]s 3Ck&2;&:+3 q[xΐM|9z9 $ΌM< ]sCu'r܃O Ҋ8F0 ]4F sί=v[!(18M$biV5Ph H\8RTeww7!$J*(L&S !~k!L&Sp!c~sxx,wRJSTcooGUU^(%v7m>HEQ"]YYycW7mg(*G-Ruiiigaaa39˽9'럚p BfOWWW7O]{jX~MkڀY;X!˫tj[[m+n̻Hڻt~ѲV1=; C_ssFz-ǀl2DD;0T/87߯9ϐ'.?5Xz-OXq`EwLtg5@c1O.|n'FlvDޭ1#7z; I>gum11C01C01C01C01C01C1#_;j~;Sh=Q#G1zwý5a㌾B+8e2퇛@U4yN]C~d\v{bk%&;bxsQjo7Cm~|>8 d򞥲~Ωx.2[!`.IENDB`key-background.png000066400000000000000000000020551214765240700326710ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDRC?*usBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxOoEygwbI(Rn=8=#G !8G\z+ bd N23lúq*fFZzӳzs\A16p:DuE .Pܒ);m,p[KO|: v 8zӬzJPn_w9ϔ|2|Stν{Ƙt.u\*SJ-(sn|{['ZJwƘ^ubD$A|<[ٓf#4Mj cLeY3M1"˲(cNsX0naXn2vr@bѭV+@bD^ ъZ`aQnac ð 7#7#7#ǘ* RʉHaPJ9/ Efތ19 mƈ/'åˤf\L3Fx3pk-g=c |gLd3W g3&13Bx3Fx3f9sw[+~?c"Hess3nZv*z}mm~ppx͚e`_Dތ^.wq&Ќ6rͼ5RVތAPk4;fѼ AE5`0JNVkwkH$I8~Wk}`5^c:NkH\NZ몈|pz\sf izZ$+kijsn9Zss`y&E^%zM)u<yFzs>O%8IENDB`language-icon.png000066400000000000000000000027641214765240700325040ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDR77F pHYs  IDAThmEݶU@,+I j ̶(#˴2 #BÈ>DA0 ԄZB^0)Jg3}u{/o̙3ϝ3syغ~*Tk`\nmj+W3PK2\TC;5;)Ǧpav*;2\()-R9 r[H;z2ULIxqlRZ '-2]KB)!s U`>z 0r}ס?`3@idE)7ƳdDi vDAT֮",7f9$JǽQ쯔/m'`B!M{F'G0Ds$^\-\H4Ú!o̸gi|q)U* |8!FNP)蓿O3i:dmچ'cp W)z$ܡ<ϜAUΔmULyx-h@T>RDg|ȓPZvCԥP/H|@'wr"ZgI(8Ͳ\'Jhy w?eMJxqB&Rc JK g;h /fm8L.+CFRW;D.Vޤ5Is}V4\)Gϕh⾇ATA +!,|q;UC^`|}(iEw`qum 볶ҹvC\B;J3niC .~g_1CM UzuΪ\Ӱ؆k JVx%ͮdpdIK`1[Σ&.\]'+׍M~聨iR?m瞣OA0.@/'-t@֎v5Scm1VY څ-h*(SNHLO`Htd$.|a474&d IK] QcåP\y׾RkWoȝLNl#{-Nծ4K/Pp3 '[8}gm51 ukI"b;j,s3xހb QhHicq4&WIQ*S\tdIH2 :`r:ζ];. .~Lm~ph$#|vQHne9蔃Vpj̅*P;h ʅ]rjU:Vre8,EI5^A"ѵIENDB`magnifier-key-background.png000066400000000000000000000156051214765240700346350ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDRddpTsRGB pHYs B(xtIME')1PIDATx]MQ~6c33'{&cz R! @, x$@2,l y? K YĎ@ -Ŏ"#3zX: rOG}g:Uꩧ5zW Ovqnx7|G}Nz~(Ms|tyW>䏡LL֏۷2݇uߌ0lVmXޘh`dy;ެduь`PVT$_׸~MH;a!] \F@2.Ȱ9XM#+3Y)B)&gs" BIv&#|ZmYɾ|_̺pd ONk.Bwņ7geZ,j0X]HV-ֽzطum +Qtaf{EaE;^o7f7m5Rmg-] xP ݭ3oefO &PMHa4V;; icT l;g,ѽ mTƒmٲKEY3=7@GaT^1uRl\i¾BjXL,B[9AO"f2Z 䦞'ٖA/7 kEq.[Ώ^v2&!fEŭ`7#,w%m&FS TZ4p TFoiYLm5m@K3b6;;;m᷽#$wNNr8[BxܺݎSnv g'tpXVyX Ռ&Om wA@.4YgږDweGz?nL.C˞@:H90=98aβȴn$i85Jb[ۊMű{?I~縨^GIω$|q)e&cvG\xD\q{' [p[ <j} 4qMX׌9Z`q3u&/y73s bcaJ=CT=#&Zپ< |9%&ϜHp|W=!8QH O $B!=f@^DE.Iˎ;uø Y]R8ؔY5`;m>]#Uԅxig&,%;L\c@47Vbe!+3jf!hشUs%fhߖ #D ˮg]52]N=&(pع4/-Qxt&&VZⴶI%8Ǭu,c|њ X-g?=G\.6.hW&{qkP˖S#J 64P>jg̔$' 1Zo.lOM1*/̢]ɡ"+ZPbAetWc:䜸@k6kj٭V Hл~9a TP̺hghg#Kl!5' Ds<Qc"4MQ\fC< ؆-&c=0>no'AqĈӻ:$ƔC|0C2Xf4gV&q e":432"DWB*)'42L~Ҕ r3u!Yz4M#V]t-8$p B(.1L1Ve1ЕqxG zΌ2ɻčPqu(  llF#AWz+3ˢm.d=T-kbn5 ɔ3àȕC= O07< wIJwLbbmX/8*JNb3Yn~irt!pxM8\>H@1Fs,pWg%t,喟# '[.GQ RNNP۽暚E&qL23~ WEKBְH T`TWM4Jcȃy:H4lmQ\+֙S=hLEL@! 0vRB %xA=t41:on CBG3Ty y`19IKΠFjȊYv:.L &Va=$i $Dz|M "`zjTCQvx α:BZ ) tF^KDz5q뱙QV090 DV5gD|]ߤ!8^\dz r]/Z΋ b"sk0],`H=mXZɡAY_IL<k QYâL$f` Wެf*eyGS PҴ4IMX ִ88LĹrOc[fHxx3b2NBwܒxR>SYA@ҎJDI d:Q5u63qt1aDKnꉹu9c2%=0`[}Wfn5JAɒq\F'#Zp $|2Vbi3RvQ. o'ʼnlb sx#j4FWĆmInT2#W{^3iy\!7aRGbIzYf tqHrt^7 .͛ Dv 8X{bL=I09O[nݴ[Τ]-[Fwd gT֊z"sFًh@xkPGWW5 !;Ө#q@yQj`fGbm;S-G+8u!# ()C!BhTE=:y# F] OL= |׹WV&j!9/RivX@~wJEk֤K`Qwd%0Rd7jI[Dz:]b'YQq qEg$Cg"H!(Vw"9M :GV6I'@ ϐH6mS t~P9XHF'xarYpSxNC`1"!ߴZL 4JkSr &Ea2mCά#1]tP2U΁VqT{nCjNxKM%*AwMw*!1_MN ɡU݆ N_W" ҷLU 8=`TݤP/J "+hctZ 80/ŬKcȱXq?y|JOj>`ygfyAWJONv:gh=0x2섑C CruQ{.w,raKẌ́p\.dC29c= 7Q$" 2x6Zf Z.eqYb;;5'ІGjr8w9`yHOC_K5!2B'JlĵNc@_7L8 :e97tfZC6tf2-uZDRrR6NOB\5/$qΈ+aUke:+h9Z}-Z"brį,Q&g|ܾ8O1 =wFzXj_+,hM?ͦsϢbXy}Bx{2Dk1&4o~0|ܴŢvT "I=$RDWȩ !LY3HO 1y"kʶEK[28 ON  펔 zqs *SMJoEn[L*OC Plx(NWdjitIEs2`x}x!KITeoB8|y,yփ-uiAM(|uhaC*8W:'MvR'ݣXr-+H6^J:X'NzjOY4Dbi@Ҙ$aԲ'N &(A+ 7Daz&$TH a4fŔ-Qˉ= tždrT-ToqD0+yVrYd1*'dNOk}457oޚ' 1m@Y-CԞ+\MjW&L`' 9b0. t5`o=Ï~t=,P[z䫜,-+>DI<&4,eDwS0=ggO}#<;3GDX"v쟿-][o00("!~#a֙v| 8G=aAb )d> r-U::U'y 9 ,GJ﫟ˣpr({fKgMr /kH/ʅ<^rǁjs%EzJqju1'22f.7 fhik\t //js.=n;(0ė$#V6DV$*.Ecr"P@X T-ծw6QhQZ^ϟyyS"\q yxP1k3Wa\41i, ׉uR=dONuK2VQ⸵ʚ׋Gm/y9\qU60C>TA}}^.mH@YkNtp>h QQr>fk YF2뤩Oݸv,2?6^w"Qn@SjB KL`v!Pl&dV_>T$PtWQ`ujwLJ 7>q^\'Bi|?x1 HPMHK7u8Kb(~Ͷ1ܳΟDžC=ۯWE(wÉWoO+:Ï< ^?É'}s3̵ƀGg#|zW^k__Ym&9Ȋnlv ˇ?/޵%~> FۭU$x 9>:??q;; {':b0;xcVy&vSGCA<vѽY3|0-yFW=*h8WspppGo 'Kl6~j&H\qf0S![^  #L…qC_,8On<}uDq]a7Z×N$O@ p|_]~A\@Mw4G glsyu2='W_~w<*$e{yxɝ:~ O?Φ%6;|kW>{&]{l1Y 88OGK pU`wS7G\>s^[ח|f1S{{":);s/Yѥ%*WN68ݯJƷp&,YiH~V5.8K~^>ՄX ZIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/images/return-icon.png000066400000000000000000000015301214765240700323050ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThk\UOҤ5-mM%HѶHcj֍ .IAW. .p–ZBX5좸A\ 6P Fcr]i3s=3|yg}}˲ZP7=u3{w $w8n.)\Ɔ1[J$`cxm&p b4ן`)o`UOa#+Ƅv|&|>e<ϱ9L RF.!-?eT F 6<ď ɯ` D[wGI%-|[hc>EaoܽȲ]̲Je?EeHØSq+YntoO~Dm{j̯PfC ,tEYއR%U[?:!\TV@+&o20 SnǩzufKUHq2^ŭ hqD&oДeN?&KY(M销nzf ,ĠjIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/images/shift-icon.png000066400000000000000000000007451214765240700321120ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<bIDATh혿J@KRZrO`aqVXf$~0ff4 cf;P7E"M衖2RRfV5̥$,4gf*~#_HIG2oRf9+fC* ,JvT)ᕬ)C+$b4S+Y$b `l*̤w!kA$N[_M2\}@_x Ob;`Yjk`'*_>ۖ9"%ynR˕қ"Mx3z/q{cB`r Ty+z7E"UIENDB`shift-latched-icon.png000066400000000000000000000010041214765240700334220ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh혿JAɁZieZQ| kk"BI#lfAcnogp?be%,2Kh RfX @#)3 ~kf ?#IIpd¿HI 0 k;L$4.Xu%B*" &VߗuHxG6?  \TJDfADo>pT?vp|4 M-vGyNV~\V썀f"#pڜR& %Bطi}C|+ggZ11k~K5C,,, |](IENDB`word-ribbon-background.png000066400000000000000000000006371214765240700343310ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/imagesPNG  IHDR szzsRGB pHYs B(xtIME . -1IDATXֽ/QZ%HG[4F$!"hZvsyΙ|O1`=l`8oNqs%O v"7~K)'8xa?|8 x^$:Xnm|Xt5-D'a* }%aC,|QItpf^ ۨñVVZJg¬^zIL)~qt͗*Hh?v(a,UH*N-P _yȪ"jZ*]dIIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/main.ini000066400000000000000000000110501214765240700275100ustar00rootroot00000000000000[background] word-ribbon-borders=12 12 12 12 key-area-borders=0 0 0 0 magnifier-key-borders=12 12 12 24 key-borders=12 12 12 12 word-ribbon=word-ribbon-background.png key-area=background.png magnifier-key=magnifier-key-background.png normal=key-background.png normal-pressed=key-background-pressed.png deadkey=key-background-special.png deadkey-pressed=key-background-pressed.png special=key-background-special.png special-pressed=key-background-special-pressed.png [icon] shift=shift-icon.png shift-pressed=shift-icon.png shift-latched=shift-latched-icon.png shift-latched-pressed=shift-latched-icon.png caps-lock=shift-icon.png caps-lock-pressed=shift-icon.png backspace=backspace-icon.png backspace-pressed=backspace-icon.png return=return-icon.png return-pressed=return-icon.png close=close-icon.png close-pressed=close-icon.png left-layout=language-icon.png left-layout-pressed=language-icon.png right-layout=language-icon.png right-layout-pressed=language-icon.png [sound] key-press=typewriter.wav key-release=typewriter.wav layout-change= keyboard-hide= [default] landscape\key-area-width=854 landscape\key-area-paddings=11 landscape\word-ribbon-height=40 landscape\magnifier-key-height=100 landscape\magnifier-key-width=100 landscape\magnifier-key-label-vertical-offset=20 landscape\key-margins=4 landscape\key-height=56 landscape\key-width=76 landscape\key-width-large=93 landscape\key-width-xlarge=178 landscape\key-width-xxlarge=244 landscape\key-width-stretched=244 landscape\vertical-offset=100 landscape\font-size=24 landscape\small-font-size=20 landscape\font-color=#ffffff landscape\magnifier-font-size=50 landscape\candidate-font-size=20 landscape\candidate-font-stretch=60 portrait\key-area-width=480 portrait\key-area-paddings=4 portrait\word-ribbon-height=40 portrait\magnifier-key-height=100 portrait\magnifier-key-width=100 portrait\magnifier-key-label-vertical-offset=20 portrait\key-margins=4 portrait\key-height=80 portrait\key-width=40 portrait\key-width-large=56 portrait\key-width-xlarge=104 portrait\key-width-xxlarge=136 portrait\key-width-stretched=136 portrait\vertical-offset=100 portrait\font-size=24 portrait\small-font-size=20 portrait\font-color=#ffffff portrait\magnifier-font-size=50 portrait\candidate-font-size=20 portrait\candidate-font-stretch=60 [keys35] landscape/key-width-xlarge=118 landscape/key-width-xxlarge=160 portrait/key-width-xlarge=64 portrait/key-width-xxlarge=112 [keys36] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=286 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=112 [keys37] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=202 portrait/key-width-large=64 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=88 [keys38] landscape\key-area-paddings=1 landscape\key-margins=3 landscape\key-width=72 landscape\key-width-large=111 landscape\key-width-xlarge=150 landscape\key-width-xxlarge=189 landscape\key-width-stretched=189 portrait\key-area-paddings=1 portrait\key-margins=3 portrait\key-width=38 portrait\key-width-large=60 portrait\key-width-xlarge=82 portrait\key-width-xxlarge=104 portrait\key-width-stretched=104 [keys39] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-xlarge=111 landscape/key-width-xxlarge=150 landscape/key-width-stretched=150 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-xlarge=60 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys40] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-large=111 landscape/key-width-xlarge=189 landscape/key-width-xxlarge=228 landscape/key-width-stretched=228 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-large=60 portrait/key-width-xlarge=104 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys45] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [keys47] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [hebrew] landscape/font-size=35 landscape/key-width-large=160 landscape/key-width-xlarge=202 landscape/key-width-xxlarge=286 portrait/font-size=35 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=160 maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/sounds/000077500000000000000000000000001214765240700274015ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/sounds/LICENSE000066400000000000000000000002601214765240700304040ustar00rootroot00000000000000typewriter.wav Made by ddohler. (http://www.freesound.org/people/ddohler/) This work is licensed under the Attribution License. (http://creativecommons.org/licenses/by/3.0/) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/gnome3/sounds/typewriter.wav000066400000000000000000005300541214765240700323450ustar00rootroot00000000000000RIFF$WAVEfmt Ddata                                                                                                                                                       !!!!!!##!!####%%##!!!!%%))%%))''''''''%%))''++))--++''----//++--++))))++++--++++----++++))++++----++''))++''++''''%%''##%%##''####!!                IIEE)))) 77CC ''99-- ??QQAA-- ++--AAmm[[RR,,@@AA{{AA++339999zz ;;##--;;??3333EEMMSS99))MMccmm__33 99MM33 %%hhPPZZrr55wwwwII==[[]]OO-- ''3333''|| vvpptt !!~~jjhhtt33;;// %%++//77==;;''!!11==EECC77++  11KK__ggiiaaMM;;##    %%339955!!;;MM]]__SSKK==11 //EE__mmuuggOO// %%--//11//333311''    !!''//11//'' %%++))!! ''''  !!))))++))%%%% %%%%))++--33557711----''%%####%%))--11----''##  ##--775511##!!!!            ''))++))!!            ##%%!!  %%''--##      !!''))## ##''--++%%!!####))'' ##%%!! %%++55;;??77!! //AAKKEE;;//++))%%''))%% ##++77;;55//1155//5511//  EE]]99NN,,<<==mmccyyiiQQxx0088@@AAOOQQJJ..ZZSSWWtt XX33 UUMMjjnnzzdd,,vvuuFF11GGKKKKuuyyggaa[[++33??LLPPDDUU44 FF::kkuu88!!ggwwoo??EE..\\ ))$$OO##PPDDSS99""^^__||RR$$__HH44!!NN6622XXLL..BBTTUUMMDDNN__ DD00 EEddkk::PPYY''ff<>mm55ee..cc!!__  ((MM==00 ##]]mm??HHCCmmXX{{{{>>XX??GGGGRR--FFbb--ll||jj..++ CC''hhAAVVTTkkXXKKXXii,,TT##""OO<<%%qq33kkDDjj""]]22NNnn88gguuBBvvllffFFmm<<uu\\__aaNN HH::eeIIVV==ee++ PPmm!!CC||zzzz{{hhaa NNJJVV==llxxrrdd## UU\\RR@@ii^^((  11^^**oo //||zz??iillxxHHXX++ ''nn&&))@@==''wwӐ||K@K@r@r@a@a@ Ğ!!!!   ..U@U@c@c@I@I@ފжѨ 2 2a@a@c@c@r5r5]]??--||::##||EE77TT""""[$[$**֪PP;;Q@Q@K@K@,,ԴОI3I3@2@2M$M$ }}W W @%@%V-V- " "FFyy33>>gga a _ _ yyhhgg!!!! mmmmUU== --zz,,U U {{P P   X X OONN006 6 **%%++mmww++dd0077$$** Q Q 88TT((//mmwwWWRRUUAAZZZZ mmRRVVbb&&YYEE$$DDvv  ))%%99))ii33 PP44SSrr SS HH""11ZZGGmmcc//??kk``yy ~~ HHHHmmjjppk k HH__s s iiOO  ||)){{xxJJyyVV@@rr// TTD D AAGG.. p p cc$$kkXX__11LLzzzz<<llxxUU88kk<< }} ( ( ' ' GG))LLss..##mm11   bbSS e e AAqqNNuu55KK&&''33@@EE!!AAFF{{W W \ \ jj  | | qq}}WW jjaa^^QQ##}}oomm((x x nn ^^ FFMM2 2 rr__oo9 9 ttGGbbBBRR<<RR \ \   44##{{ppvv99hhssEEMM\\~~PPqqWW44ccBBxx  66ssmmkk//44aa,,++nnLLVV//__b b h h ]]DDDDj j   <>uu((aajjjj33TTUUkkcc++ff''::PP//aaAA..VV9911kk88ww((33ssuu<<55%%CCffzzEE]]||{{!!%%::ZZ RRdd((RRmmRRhh --33 >>``77((OOXXii44,,ff==DDSS55::]]  hhccPP&&8888||EExx__AAtt!!{{  mmUUll..<<[[ffXX2255ii""JJoo(())  GGffLLVVwwaaVVKKSS99IIqqHHRR""!!HHAA--%%WWUU""cc""''bbTTii22!!TT33ii||00QQ99tt ]]__55ii]]GGKKxx00::kk66""55EE11~~kkQQmmhh{{LL RRSS..VV~~**YY**jj[[jjII eepp**ee~~vvYYWWAA88ww-- 44HHccssppff22//ss77  NN]]''OOSSCCPPrr**11AA##''mm[[ff##OO mmxxOOCCEEPPkk99&&TT"" qqVVCC  mmzzZZ22ZZ!!YYVViiRRqq  ""ggSSdd**^^##ssQQjjJJ[[::hh33kk--DDcc||__{{11..9977rr;;JJVVMMTTPPuurr//6688}}EEyyjjqq!!%%NNJJ^^{{8800@@  ,,TT}}\\LL$$bbQQFFjj\\NNxx!!GG  33''00  55++ll66  WW))DDrrLLKK,,  kk||ttHH [[uu%%ttgg++33YY&&jjzznnUU))44WWkk33ddLL ""kkqqOO!!jjFF::AA33FF\\TTTT22rrpp66ccIIIIIIuuMM<>ee""\\ ^^GGNN8866]]RRbbddRR{{ss::$$aaggJJ!!00((NNhhss%%}}GG??ff)) vvzzGGEE{{##hhnnee<<((qqCC||$$xx{{33FFDDwwZZ ""aaTTEEqq ==ggPPQQjj..GG hhkkzz>>yyDDHH]]iiPP ..ttvv""(())//SSHH@@BBXXuu__||ii((BBff kkBB""ccbbxx22EEBB77!!jjHHLLXXzz]]**88KKWWdd88ccggxx&&@@88 FF%%??vvttyySS@@wwdd$$xxFFTTggZZ44WW5500PPBBoorrCCooZZJJRR&&VVoott@@## ttQQPP##GG  ``OOKKkkMM==uudduu88aa33ppHHZZccooss``,,ffIIww>>ffUUoo5555  HH..FFoonnMM  __<<33,, 22oohh 77 __}}FFii77ooeeww''9900uummjjAA##..PPoouuaaddTT&&QQ\\ff__ooTT>>TT&&hh..MMvv FF  44]]AAww  PP@@%%22LLxxBB  //DD%%TTww%% __eeFF }}UU  tt[[00ooffHHDDUU66CCQQ""]]~~++8844DD__PP88zzmm..00RR%%^^ss;;zzuuuuffii==<>@@DD((__zz))))VV==JJ++UU&& JJFFvv //??WWKKaawwwwhhccDDzzHHuuLL!!@@&&}} yy ee44$$qq++UUJJ..      yyWW3322dd  !!VVyy}}bb<<JJ 11EE QQJJ zzZZ }}ssrr>>XXll%%YY//$$&&""22[[LLmm''``ss##**XX <<~~UUaa  55eeRR||ccccHHUU@@mm%%??GG44~~AACC11pppp##SS  nn``PPrrHHmmZZffUU  }}DD&&''AA<<EEqqNN$$\\<<##((%%ff++99||MMhhDD((55//AA!!QQrr++<<DD--""{{mm;;LLqqDDbb@@99ww TTggddGG%%))GGJJSS zz22gg&&PP  ttppyy22__oo??  rrccuuTTSS00{{NN..ggUURR}}%%NNee>>%%77NNSSAABBddyy##~~~~HHMMxxtt''"";;==iiRR<<JJGGkkKKZZNN66ss44NN..zz''33kkppUU  \\rr ++yy]]44GGll44~~MMJJ&& ss))BB8855AAddrrhheeQQoo::XX>>''33oo??jj00##   uu&&((WWOO%%LLJJIIPPRRnnII}}99jj88]]  ))\\UUCC##;;GGjj88zzIIdd::XXoo33HH--JJ** ttww$$ii22ffttaa11uuSS11oo hhttGGii__88}}OOFFssbb22MM00''KKPPDDrr55::GG77ff^^""""KK00RRAA>>__TT FF?? }}@@vv ))ccaaRR\\00IIQQxx||ss22NNzz++wwhhBB!!ff^^YYjj99ZZTT--tt$$[[]]bbvvGGVV``FFBBZZ ggffMM  wwddee  ''%%--FF\\??RR88[[BB22IIrrCCEE##00AA//GGMMCC//77  MMJJLLyy^^LLvvCCaaQQ%% SS22&&,,  $$uu'' %%99[[{{aaXXrr))ssccooooIIvv44++ttPPGG^^PPgguuvv44JJuuBB::bb??<<cc``LL&&DDPPQQ 7777RRZZ{{mmVVpp@@__ii}}MMqqBB44!!mm    ooiiMM gg::llBB~~  ccAA  qq66>>EEJJ22;;{{??YYEE !!\\DDPPrrttFFBBbb!!))ssEEddzzVV4466XXttffBB..ZZ[[;;~~PP@@LL]]kkAA))55MMKKSS}}eeAA??iiaa11uukk HHDD]]ss8888__VV@@RR}}mmAAYY77!!7711nn<>zzdd!!dd^^ddttvvdd||^^JJllGG=='' %%||%%EE55vv//CCEE;;++GG  &&33hhzz==gguuii99UUaa--YYYYII__AA SS;;88@@%%KKII!!VVQQ  hh00dd!!--OOKK++>>ooww##FF%%zzaaQQ99%% JJaa;;II66 !!..LL##GG__ii%%}}FFee00yy}}nn||vvwwVVeeSS HHDD--YY,,ff  qqee11YY NNyyzzpp##    !!HHiiLLOO __xxeekkrrTTllaa  OOGGEE!!KKuu//ttjjrrxxqqqqyyTTXX%%TT--qq>>44zz}}11ee  __ww**AAyy88JJDD<< ccLLgg++CCvvtt99]]GGHH++zz::tt11mm99>>!!xx33  mmvv@@rr!!kkcc!!EE 66TT!!((&&PPJJgg\\^^33''JJDDff77UU55SSqqOO==GGaa~~PP^^ffcc88jj<<QQ^^XXIIkkZZ}}KKiiEEccww]]CC]]KKooqqII//''CCuuii__%%nnZZ;;}}ss));;||VVeeeeGGaaaaCCmmcc//;;!!\\[[DD $$YYSS%%}}FFoouu>>%%LLRR ff;;QQ--ggIIss''bb))~~EE((NN..nn rrYY__<> 4466''WW nn00++33 SSiiEEAAIIxx4466 88))mmqq//jj%%<<cc]])) ;;//jj%%5599??//66!!88ffggZZ..BB``nn~~WW[[RR++ttrrvv ''QQkkGGjj--@@  AA__llPPRRddrrUUjj##ww{{11--__jj//''''77MMUUqq""MMkk((oovv<<//EE((&&//99SSSS//vvWW??ZZ@@nnMMYYOO33 LL%%,,RRttzztt BB88jjPP,,''''xxRRLLdd++zzpp|| MM]]YYUUEE''==== ~~ffnn??MMGG33vvJJjj``TT%%CC !!vvXXll!!}}..  ::XXOO007711__ii66dd::aaCC==++ff}}PPXX``ddDD22))))++44!!ZZ@@%%##MMOO XXII,,@@DD,,44UUNN**eeWWSS==22ii --@@]]}}{{ >>!!zzTT  44hhhhjj<<(( ``227744__ddYY--##??00,,dd8844  ::LL==::  55ff>>%%++00kk{{ EE77yy mm++llTTLLpp^^zzZZii?? ''zzFFjj ooww<>~~VVZZPP..uuZZxx))// 99\\mm{{EE ii}}88##{{OO44mm&&AA{{  ??vvYYVV0099__((  00$$qqdd==++rr!!]]uu[[  ))kkEEOO ::LLYY{{11pp||llll~~##ss((##%%JJ66RR__uu''66VV((ccXXYY]]__''44~~hh!!''++zz~~33VV..llddllll``^^ddVV@@++!!NN;;]]++GGggmmwwWWss""hhll55KKNNrr  [[//KKee  mmEE;;UUmmmmkkmmWW GGyyOOUU]]//!!##%%OOuu99##??QQEE77//pp\\22##VVTT))22** 00FFoo>>NN66 ))FF++ aa::LLss'',,22zz''mm}}YY--UUkkYYmm66@@????AASSWW11++kkgg==33OO]]99   eeOO33EE77hhzzWW??!!11EESS77CC99 rrRRTTllrrNN..++++ ccaa{{ ++ll^^00''DDvv !!''??[[eeeemm[[++??sswwyy~~{{7755]]oo]]GGUUuuiiGG55CCIIEEmmmmAASSAAxxvvJJ<<@@00  **KKCC44TTHH44@@RRHH::EE\\rrdd::..::66  [[zzddDD))##>>NN::0022))####%%BBZZffvvzznnZZPP\\pp  EEMM'' !!7777''!!%%11IIOOQQYYWWUU]]ggggqqssKK''  11__}}$$>>tt]]  **FFnnxxUU{{{{ss[[IIII??))!!))%%3377))%% vv\\44''<>NN^^``FF44//55 ))11////'' QQyyWWCCCCOOUUaaqq}}{{[[YYssggAA++%%  NNvvnnVVhhnn``<Lh fpgms#^gasp= glyf“QqhdmxBhead 5<6hhea S t$hmtx.'loca)Ljmaxp* nameYV0postP'?prep!e ^_<3 Zbm d Zz/Z933f @ [(1ASC@ m J '7+3h{fmhRh=hRhf?R%hbhh`hRhhhqhZhjhj%%?hfhfhfh%m}y9}R+H}}'h'`7PRmm3B)J?^qqHq%%+qq1Z!# R=h3hf'hhDh{hhy3dDRhfRdm{hf1=q%#?BT?,hD}9999>R@y/}}}}}h}7?^?^?^?^?^?^^qHqHqHqHqoqqqqqhfs  ?^?^?^}q}q}q}qyqy/q9Hq9Hq9Hq9Hq9Hq}%%}%%}%%}%%=0RDRR%+HffF}q}q}q}Hq11`1r'hZ'hZ'hZ'hZ'!'!'!7 7PRRPRRPRRLh?^^}s'hZu!m{%BTJ%9PR}R?R}BN'7#h`#hN@7qZq oZqq#qq qqq1qqq9}'hR@+HHu39\HZ}}'#h`H=;?^u3`)HqD^qq) q#m)7y?#Hq3qZ 37 RRRJff?f?{{o Zf7NRNR jh`hDh?hw%NfS3Oqb) Jhfd%whfhfhfhfmo}% ;%/1!Uh%TTf R+?^Bs3VV}q/HF19Hq}o%'/d ) ^9#h}q d}Xq?}q}Pq}o}qhu))//3#\HD J+/D)\D}q}q')77=#)HHHw=3w=3RJ-jqHR?^?^^9HqqHfqHf\HD\H}q}q}q;7   H3/3/#`#qqNFPNP/}q)\o\Z^?^?^?^??^?^?^?^?^?^?^?^9Hq9Hq9Hq9Hq9'H9Hq9Hq9HqRbR}q}q}q}3}q}q}q}q}q}q}q}q/////7 7 7 qjjdsssd1( +    &"  "&   *. . * .  ( '    ' &&&&&& """"" "& . .... &&&     ..          $ ...."""*(****   ...... &&0 &"*$&-  &""" &"& . . -(0&""0$  .* .    &+   *" &+  . &" &" $.  .&&*   &&"""000 '&&&&&&&&&&&&  """"""""""""..&&&                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ~ # O_?M   " & 0 3 : < D  !!!!"!&!.!^"""""""+"H"`"e%  #P`>M   & 0 2 9 < D  !!!!"!&!.!["""""""+"H"`"d%aI1vhcb]gD Xz} Bvt %"iOS`xlhijkopqrstu45]^   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a rdeixpk vj0-s12gw'*).l|!cn,B/(m}b  3:45y KRqNOPzSQL~ # O_?M   " & 0 3 : < D  !!!!"!&!.!^"""""""+"H"`"e%  #P`>M   & 0 2 9 < D  !!!!"!&!.!["""""""+"H"`"d%aI1vhcb]gD Xz} Bvt %"iOS`xlhijkopqrstu45]^@EYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,F#F`F# F`ab# # pE` PXaFY`h:-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY@cTX@C`BYYYYY-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,zE#-@ `@+ F3UU0U0o0`@8F/?O_o@FQ_+s@ F+|@ F/?O@ F/@|P|t t0ttt oooouooKo nnnnKnU?gg/g?gg@fPfff?eeedd@Od Fa_+`_G_P"[[T[[I[;[ZZkZKZ;Z3UU3U?WW/WVFV FTF@mT FRP+?POP_PHHHeHVH:HGGG;G3UU3UUGU+oTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYss^stu++++++++_sssssssssss+++++_sst+++_ssssssssss++++_s^stsst++++_sssstssssststt_s+st+s+_sstt_s+_sstt_ss++sts+st+ss++s+++sss+^ NuJU}qq}}winfoxG:x Zy mmm{Too****o)q)M|D[?e?g = y j 4  t 9 I+|"f8M;Ypik_9w"9'euHH j!!t!"]"#J#$$5$=% %#%~%& &&&'+'e''(*(z((()m)))))* *r******++++D++++,,,6,--4-K-c-|--.x...../////00070N0e0~11$1;1Q1h112 2222223Y3q33333444/4F4^4u4444445i55555566&6=6S6j666666777;77788,8C8Z8q8888899,9C9V9i9999::&:>:Q:t:;;%;;;O;b;y;;<>%>8>L>d>|>>>>>>??*?=?Q?h?z?@;@S@i@@@@@@AA&A9ALAcAzAAAAABBB2BHB{BCDDDDDEEENEEEEFNF{FGG2GGGHHAHHHII(I0I8IjIIIIJ=JEJMJJJJJK)K1KyKKLL LMM)MBMXMnMMMN#NOOPPnPQ Q^QfQR0RrSSSnST7TTUUV.VWW2WKWaWwWWX(X?XXXXXYrYZ/ZFZ]ZZ[[ [[[\\\]][]]]]]]]]^g^o^w^^_;__`=``aeaabebbcecmcd`ddde@eeeff$f,fkfsffg2grghhshiiijSjkjjkLkTk\kuk}klTlllmmTmmmmmmnn(n@n[nvnnnooDorop*ppquqr]s*s2s:smsssttptuvvwAwx~xxyyAypyzzbzz{{-{||}}`}}~~-~p~~~V['ۃNZb $;RfzGt|ۈ>cω.F^u)eڌK@ӎk\ pЕ8Rl,BȗFJ3HVޝ >aD$aϣ3Ѥ&rاD.ЩWkά%hϯ6Og/LlĶwqAɸ'/7Ndʺ(B[t»,ûݻ(08Qi˼.G_%7Pf翚f¢(û(ĄO&ƇljǝDZ '@ZsȍȦ7Piɂɛɴ)@Wnʅʝʳ3Lfˣ "9Qh̘̲1Km͑ͨͿ6Me}Δά4J`xύϥϽ0FZНKѺ/z)Ӓӿ +@  p@  H?2/3/+]33/310!!7!!IhyJh:@ H@  H ?//+3/2]10+#34>32#".Py3"./""/."&5!!5&%5""57@# / o  ?33/3/]]]9/10#!#J)s)-)r)3@X!   P P  H   ?O   /3?399//]332233]22/]33/3/]9293/92393/3/10!!#!#!5!!5!3!3!!!?RTRNA+RR%TT#@}TTHPPH{-6?@34/))/!!p/<753&&'4.'662]T2f`T !W`e/YV*1[OdCB8JX[.+F3][(B1YSFrT7 !BUnJCoS5 *)ZBSkH!7-&b$9/&qYf3 ';?]<>@3<><>(2#(AA  0?>%7!-????/]]99//881032#"#".54>3232#"#".54>32#GPPG$JsOIpL&#IqNKqM'GPPG#JsOJpK&#IqNKqL'՞,JHlv??vllu>>uJIHlv??vllu>>uJm}!S@M'JI,IH G6AGB B6B6B;54.#"2>7%4>7.54>32>73#'#".!4$;V8/B*Vd:bTH }4P7#B`}(MoG<-2^XS[02Tm<`+" )5A'1`l|Nis="AAC%#>@F)$=,Y(6!?HU86[A$NzdV*$MWc9KwS++SwK@m]O$73#.R$JqN%GjENqJ$1}]2w^Z=@ ??]210#>54'3$KqNEjH$NqK$1|Z^w]Rw$@?2/]/^]]10%'%7++wo`f`Fof )@   ` ?32/]]22]10!5!3!!#}}{?y 8@ +  @ H_ //]]+32]]]10%#>7j'/36z|{8=}5RBy@ @//]105!RѨ5@ 4Ddt H//+]]]]1074>32#"."./""/."o&5!!5&%5""5@ ?/382/8310#!Jb'&@o))o  #ss??/]]10#"&&54663232>54.#"3qvs93o~wt:BkMMlEElMMkBݱfffe貖KJᗖJJ5@!@n~ @ ??/^]]]3/3]10!#4>7'3ǰ`+baY"y{+`#<@ #o%%"o! " s"t?2?39/]3/3]3/310!!5>54.#"'>32!p^KvS,"?V5_Ef(\jvA`l;5]K}QL;Z? M54.##532>54.#"'>32.StGAʊmUW]\W)5bYQ~U,$B\8kJ\&]n}Fln8`IxX9 `t@"-.2(JlCDa?(Jf=4R9C6}6)6a? N@, Vn  w_ t??39/322/]3]]9/]33332/]210##!533!4>7#?հ]{  eHH0d8{uf"11.*N@&o,,'$$(h#Y###@ Hs't$s ?3?9//+]3/]]333]3102#".'532>54&#"'!!66!cHDŀ3c[R!!Ybc*O|V.??9Z7' i7lir~C $ %NvQ 9]q +?7@ 1n "AA;o 6u,s's??9//]2]2104>32&&#"3>32#".2>54.#"q5\ƅ./+#X+ZdC* 9L_;_l;>tfdJn#####  h88Y8(888H88C&CVCCC-s;s??9/]]]]]99/]3/]]]]2/]]99102#".54>7.54>32>54.''">54&5TqB(F`8:oW5Cyfnu=-Lh:1V?%Cr DhHFkH$'If?~j}#>W30U?$~,XXClWEL_vI\h86e\Kx`JIZmBWX,5Y?##A\84TH@<Tje9R@34BT6ejj)=5@9o??/n   4u*s%u??9//]3]210#".'532>7##".54>32"32>54.5\ƅ..,#X+f+ 8L`;_l;?sfeJ%.;rjrDNG(TWFoN*/K`0CkBf'>@)))) 4Ddt@  H#/?/+]]32]1074>32#".4>32#"."./""/.""./""/."o&5!!5&%5""5'5!!5'%4""4?f a@/"""" d t P D ;  /   +  @H_ /?/]]+32]3/]]]]]]]10%#>74>32#".j'/3"./""/."6z|{8=}5'5!!5'%4""4fN@0@@o0 Pp?/^]]]q33/]]29=/33/]]10%5d!ff\@= @ {hB9/o/]]3/^]]q/]]]]]]]]3]2105!5!fdTffN@0@@o0 Pp?/^]]]q33/]]39=/33/]]105f dBlfX%%';>@!2(('F F=/= -7Q?3/2/^]9/]9/3/1054>7>54.#"'66324>32#".'B20D+9U8SF?Qa]h86P64B&"./""/."%9\PM*)CEO50O94"*;3`WCiZT/-C?B,&5!!5&%5""5mJWho@?X`'''FF'N1 j@j;@NN, [d@6S@EI/3?99//^]^]322/]]q9///]]10#".'##".54>3232>54.#"32>7#"$&546$3232>77&&#"%9La:-I4!6GY5MwR+;ob-ZRE"+.F/V{ZO=wod+V؂fv7jeU7N2M*Je?>}qaH)2A#%B18eVezD`5D(=hNݘOoR&,fEeՅw-SsE :^x@$FFII@ H/@_ H?2?9/9+/83^]3/8+]q39=/99]]99]]3310!!#3.'ߢg;Dj4 Z$*[pg1111$Zd0 #`y $`"`??9/^]]92]]]9/]]q210!2#!32>54&##!2>54.#ÃB'JmEEyZ4A{oTrF XwI !K|\'Wg>lR7 -OxVdm:J;Y;xh(He=8^C%}#L@@H ` p  @ H %%[f$!_ _?3?3]3/+]]9/+]10"3267#"&&546632&&k{C;vvYN'NUa;LWlON?'QډۖN#ln,* . &@ [gZd``??]10#!!24.##3 `_B~uɢ ^\ՊC$ B@&g  Zd _O _ _??9/^]q229/]10!!!!!!! =< p@@8 H  / Zd _?o@H@H_??9/++^]q2^]3/+]]q9/10!#!!!!}+7@++ )Zg--[ f,+_$_$_??9/]29/10!#"&&546$32.#"32>7!7pvKV_ oXH$SX].zB7x,I>73 ii,*Qډ؜V  =@# Ze   Zd _ ?2?39/^]2]]]210!#!#3!3պfVhRd W@& + { T + ; K   Z@ H  ?2?2/^]+]22_]]]]q10!!57'5!df))ff)h)H{s/@`p/Z    _/?/^]3/]]]10"&'532>533L"N-%K=&;i{ 2XD^ie1 d@- f   /Zd  H@ H ?3?399++2]]]3/8^]33/839]310!##373=yr%3#@Zd_??]]31033!Ǻ=/@69 H9Z@ H H eO  @ H&  Z d H  H ?22+2?33+322]+^]]]993+3+2]+210]]!##!3!#46767##EAJI?9XJw4=GIQ@)(Ze'   Z dH  H ?22+?3+322]]]]2]210!###33&'.531MLA9LLJ CC> }q'4@ [g)))p)/)_)[ f(#__??]]]]10#"&&54663232>54.#"qQ훣LLQ4krrk22jrrl4ݩllkk뫉ۙQQۉڗQQ3F@,[(8Hg@Zd`0@` ??9/]2^]]]]10###!232>54&##37~Ϙj~54.#"q1_]+Zyg3)LLQ4krrk22jrrl4݃ⵄ&^54.##d 1Qh7Z~Q%)SW\W]>q\#EgEHd@h3B@'Y##Zg555`5?5*Z f4*'_$ ` ?3?3992]]]3]10#"&'532654.'.54>32&&#"EsoA"W`f2Iz]YU)@tawJCAXzFsT[\/aj7#"xp6PC?%#ShTX_2-#+q`9SC;!$L`~^@2  O  0 Z@Wgw@  H_??2/+]3/^]]2/]]]]]q10!#!5!!q^_/@ZeoZ d_ ?2?]]]10#".5332>7BɈąDYR(LrĐRMzH6bQ l@ `p@ H/@ H H @  H ?3?33++?3/83+]3/8+]39=/33103#3667'*.Ja[JJa*߶HH@HHH@/H%D%%$%D%T%%% p@ H,o,, ,0,,@ H H %% H% H%?33++3?333++/83^]]]3/8+]q39=///]^]q3+3+3+3+3+3+103>73#&&'&'#3>7)   ~  8pi^&&Zcg1rJ3l/7437/p6\.cb[&%blo1` @  7  8p@ H   /  @(' ?2?399]]/822/83^]3/8+]q39=/3]33]3/8310!##33`ZLN[{/L7s@  @ H@@/OZwO6?3?9]/^]]]92/8]]]33/8]]]]]3+]103#3TBB/R 8@ g  ? O f __?9?92/2^]22/10!!5!5!!TM:ۑ9&@??/]210!!#39k1!?///8338310# J3$@`p ??]2103#5!!3jϕ)%?/3/103#)f%d!NH//3/10!5!NR! @ _/]/10#.'53x#RM?+.0SXQ"QQL^^#2T@)G#U44o40H @ H H V3P*R$P??3?9/22/++^]2210!'##".5467754.#"'6632%2>55%!BN`?EtU07Q4SB@Jdfa0/=hL+ZzI a-A*'Q{TECZ70"(8)Yb&MuOc 9Q3\V?/8-HW11@ I%GT0*P  P?2?3??22+102#".'##33>"32654&^m<32.#"3267ReJLfN268<:Q66{?Ֆۉ>"  %q04@&GU22.H V1+P P?3?3??]2210%##".54>323&'&&53#%2>754.#"T;M`<]n<32!32>7"!4.`nHBxecn;L3WQL'(MQW`r 9XJ҇֕NGnq ۜDqP,p@N`?OG/ OP ???^]32/^]3/]322/]9/]]]10###5754>32&&#"3-U|N;c'/I((:&?KD`kT# 0SAh%^?R^@ 2SG7/`7p777/7/'HYG@M H  0@`````@'@ H'2 7&&5467.54>3232654.##"32654&#"&/_],!)8]Q$A͋kj5'BW/*6@E+G12ba%O@;aH7ZA#L?)\lcdgidcjJq#mEL^5  (!/Pm=Xa4*PqG<[B* R5=Y*?Q`3Yb4 %@.sl.:! ,M`spow{tx2@GU` G TP ?2??322]10!4&#"#33>32\ipQnC ER\0Â4f`2+?*3u%@  GTS??3/22]10!#34632#"&d=-'?,-=J)<6 +:98u!.@# #G  T"S P??3/2/22]10"&'532>534632#"&B0?6#.#"Hm=-'?,-= 'A3M{W/_<6 +:98^@ D@ H/ G T @ H H ??399++?2^]3/8+]333931073##3V%om7i%RZ6d@ GT??]10!#3d^,e@?# G   g w  G,U... .P..GT-#P( ?22??32232^]]]]9/]]]]210!4&#"#4&#"#33>323>32diIfAciMh? BOY.x&IW`2Â/[XÂ4f`J+?*X^/D-3^0@GU` G TP  ?2??32]10!4&#"#33>32\ipQnC ER\0Â4f`J+?*3q-^0@HW!@!!!!H V PP??^]]10#".54>3232654&#"-C}ogGC|ogG'ՑLLՉӑKKӈ?^06@.HW22& G T1 P +P?2???3222]10".'##33>32"32654&;`M; :M`<^m<754.#"".54>32373#46767#5LiAAlQf]n<H;?hK)9GX^3_QJ+P=%Z?^5H@-%GW7?7_777,G V6&)P," P?2?992]2]]]310#"&'532>54.'.54>32&&#"?:m`m;LTY,A[95\HHsP+7dVaH?AGfb8^FHqP*-PxQ(#");$212#4./7#".5#5773!!-*# (04>jM,Ni?  Ne}QNabJ0@GU`G T P??3?3]210!'##".5332>53u ER\0[\/joQnC+?).bi=4e`:Jm@ H H H@ HP/O@ G  ??39]/8^]]]3/8++9=/3+3+10!33>73w  ǼJ!hl``lh!cJ/ù/@ H/ H' @ H  H  H@ HT''@ H[  H'  '-.H.@ H...1 1011@-  'fv?33]3?3]33/83^]]3/8++39=///+]+]3+3+3+3+3+3+10!.'&'##33>733>73   翃  Ĭ   h-24:>?:2j%J-ig[Wa_!k"\_XWhm/H#J @ 6 9k{W:JdtX5E   6@H@Hk{W:J  0        ; K (    ??/]]]]]]]^]]q]]]++]]]q9=///]]]]]]]]]q3]33]]]]q10]]33##u3fL J"d"H@ H$$$$P$$/$O$@ "#P?2?333/83^]]]3/8++9=/331033>73#"&'532>77  ǼNAVtP4L@#0F4%9J(XXR#Va^!c'QZ1 ,@)R5J l@  H@ H ? _   HH?@ HO HO?2+?2+/]+33+]]3/+3+]310!!5!5!!5 }D='@@% '#  #_)??9/]]9/]332/210.54ᒑ4>7-A(M_6}}6_M(A-wssw0=# !GnNNgVVgMNnG! #=0i{ zj-@0@p@??/^]]q103#閖3)@@% $$$# ??9/]]9/]332/2104675&&54.'53"5>5wssw-A(M_6!A`>}6_M(A-;jz {iL0=# !GnN4H-VgNnG! #=0fJZ#<@ %%   @H  ? O o  /]3/+2/]]10.#"563232>7#".%7-)<;8d27C/%7/(<;8c27C !,l  !,l ^A@ H0@ H /^]//+3/2]10+3##".54>32y3#..##..#H&5!!5&%4""4%Z@%F %'@'H 0 @  s!s@ H??99//+33/^]]29/3210$#5.54>753.#"3267vnLWb45aVH.58<;Q6 KljˈK !  %D#(u@ o# H@0 H**!@ H)!u /"""""""""ts??9/]323/+3]3/++399//^]32102&&#"!!!!5>55#534>jBB8K0RY@+ )DaCՉDW_2{#7@#. !p99 $@1 H8  ) 3   ? o  /]]]2/]93]23/+]2]3/]9/]210467'766327'#"&''7&&732>54.#"#b/l<7&&54>32&&#"#"&'532>54.'.7>54.'-:KU7dVaH8AGcf9_FHqN*)4EL;l`l;LTY+E]73^LIsP)?eH#)!AlR/&)3S@-&rT=bD%( ';9.,/ANa>4UD1&mNGoM(! '3--1>NdY%?:7 $.8"&@;9-:3 j 5@! @P 0  /]]32/^]]104632#"&%4632#"&38('::'(8w8(#:&(8s6015522560 &522dD%AUj@C"""&L444WB& /`p-G;Q-?/99//]^]/]q99//3/10"32>7#".54>32&&4>32#".732>54.#"{=^@!=_C69815<#fe36id?;>4a6ahha66ahha6meꅅeeꅅe,SxKNxR+  BzgexC!ha66ahhb55bheeꅅeeDB-N@/-///O///$ `  .-'?99/]2/]]2210'#".5467754&#"'663232>55'/8#+H4c=80Z*03u<}w3D)2*":+R# 3M3flH9d$jz:9+3-,A,1Rs `@ P`   @! H    /3/39=/93333/]]+299//]310%R5uu6tt)NNNNf9@$yVK8 ?/]]]]]]]]]10#!5RBydD:N@}R  E---P;/`p&@4J&??99//]^]q3392/]q99//]^]q929++]10]32654&#####324>32#".732>54.#"H[OSYF-9C5*! _騞6ahha66ahha6meꅅeeꅅeHEJ;0K9( nW%G8`}ha66ahhb55bheeꅅee//3/10!5! {V'C@, ))0@ o #?3/^]]]q/]]104>32#".732>54.#"{2UsAAsV22VsAAsU2{4F((F55F((F4AsV22VsAArU11UrA'E44E'(G55Gf :@!  ` ?32//]]333223]10!5!3!!#5!}}}{1Jm@@ O   @ H@H ??9/+3/+]210!57>54&#"'6632!m9H(B63]-N6RUC;"A@2&^0A!?[92VU[79h0a@<2_222@ H''@ H/_&#, ?3?39/^]9/+3/+]3/9/910#"&'532654&##532654.#"'>32NQEXX(S~VF{9?5bXk`bb\T#/;a3E=DL,EiF#NjjN73#//*?MQ#yLQQ"QXSJ7@" G U `pGTP  ?3???2]21032>53#'##"&'#3djoRnC 0gHj#4e`:ST.*&(#U*6qf7@!0@P    /2?/]]9/^]10####".54>3!fxy=U_m32#"."./""/."&5!!5&%4""4#9@ @ H //9/+9/]33310#"&'532654.'73-1GP.?%Zy9":+all+1# s):?J4@!O@ H 0 ??/]]33/+]103#4>7'3&^J<<8(I`B.@ H!! ?]+10#".54>3232654&#")MmD?jN+)LmD>kN,:KVUKKUVKmSY//YSSX..XSwyywxssTs V@/    @     /3/399=//3333/]]299//3]10'7'7tt6huu5eN\\NbeN\\Nb?&{'J<0@?@@]5]]5]]]55?55,&{'5t3(@@p@]]5]]5]5?5&u'<?<@'8p8P88333d3P303 33L]]]]]]]]5]]55?55DwD^';D@2(('F == F@H ''-7Q/3?2/9/+^]9/3/103267#".54>7>55#".54>32P'A20D+9U7TE@Ra]g85Q64B&#..##..#%:[QL*)CEO50O93#*:3`XDhZT/-C>C+/&5!!5&%4""4s&$CR&%+5+5s&$vR@ !&l%+5+5s&$KR&%+5+55&$RR@ &,%+5+5+&$j!R@ &)%+55+55&$P}1@ P@ %+55]]]]]]]55V@* Z$4T  g@  __ _ O    _?3/?99//^]q2/8329///]]]]}32310!!!#!!!!!!#V%˺=ul;<}&&z O*$ %+5s&(CR &´ %+5+5s&(v?R@ &J %+5+5s&(KR & %+5+5+&(jR@ & %+55+55>ds&,CR & %+5+5Rs&,vxR@ &j %+5+5s&,KR@  & %+5+5@w+&,j R@ & %+55+55/]@:[g! !Zd _?o@H``??9/+^]q3222/2]9/103!2#!#%4.##!!3 /_`B~uP %\^`ՊC$5&1RR@  & !/ %+5+5}qs&2CTR(&.( %+5+5}qs&2vR@ 4&X(. %+5+5}qs&2KR@ (&0( %+5+5}q5&2R}R0&1? %+5+5}q+&2jR@ 1&(< %+55+55-{ H@HH H H HH@0H@  P   Pp ?^]q2323/]3333]10++++++++7'i=Bh?fg?i>gf=g}q&1\@:)*'[ g333p3/3_3[f2)*-"_  -_ ?3?399]]]]9910#"''7&5466327&&#"'32>\[^Q훽NZa[L^BP.0C0rGrl4jX/rErk2c޷lGNd*k*&N QڊTQs&8C=R& %+5+5s&8vR@ $&H %+5+5s&8KyR&  %+5+5+&8j}R@ !&, %+55+557s&<v1R@ &c %+5+53<@![g Zd``    ??99//22]]10###33232>54&##37~Ϙ~54.'.54>54.#"#4>32+?K?+'F98X=!8eUa5AHL%8Q4+H8?U5)>H>)!W~Q'#"-@($;8:#(DCF*6O?6:C,*>)0SANhU%&Lt^!&DC3&93 "%+5+5^!&Dv5@ ?&39 "%+5+5^!&DK@ 3&3;3 "%+5+5^&DR@ ;&)7#"&'#".732>55"!4.^7Q4SB@Jd+3gal9`1UNJ%'KOU1>"L_tJG{Z4aO=hL+ZzI n 7T3ECZ70"(8U]U]Gnq rs6U;'Q{R\V&MuOc 9QcDqP,qo^&FzB /&  %+5q!&HC(&.(%+5+5q!&HvR@ 4&v(.%+5+5q!&HK@ (&0(%+5+5q&Hj@ 1&(<%+55+55g!&CU& %+5+5B!&v0@ &t %+5+5U!&K@ & %+5+5%&j@  &%+55+55o-#'9t@F(H# """ W;@;;;;2H V: #!!-P07P??99//]]339^]]9///9210#".54>327&&''7&&'774.#"326-C}ohG?vif+xZJ(U/FAz;JCoO,"FnKMmF!!GmL=ܘOBww~A;<vQr7{ H,quAݰ8kR2.XUL}Z1&QR@ !&"0 %+5+5q-!&RC &״& %+5+5q-!&RvP@ ,&N & %+5+5q-!&RK &( %+5+5q-&RR(&)7 %+5+5q-&Rj)& 4 %+55+55f+`@0-"Vf(8@( H'  `?3/^]3/]q/3+3]]3/]105!4>32#".4>32#".f)*  *))*  *)#/ /#!//#/ /#!//s/$-\@;'(%H  W/@////H V.('+"P +P??99^]]9910#"''7&&54>327&&#"4'326/C}o}bDP?FC|o?q1DP>EK-D'rH-'ՑL5mJHՉӑKlIIцT3џc{!&XC&! %+5+5!&Xv`@ '&W! %+5+5!&XK@ &# %+5+5&Xj$&/ %+55+55 !&\v@ /&g#)%+5+5? 18@/H W33' GT2,P!P?3?3??2222]10>32#".'##3%"32654&d:M`<^m<>%+5/q'8U@1-G& "&U::6H V9'%O" 3P (P?3?]3?9/32?]29/22210%##".54>323&'&&55!5!533##%2>754.#"T;M`<]n<32\ipQnC{ ER\04f`Չ+?*\5&,RR@ &#%+5+5r&R@  & %+5+5=|&,M"R@ & %+5+5*o&M@ &%+5+50@&,NR@ & %+5+58&N@  &%+5+5RBd&,Q %+5DB&LQ%@ o%%%%+]5Rd7&,OPR@ & %+5+5dJ@ GT??]10!#3dJR{)&,-8@O@H@H!!!P!!!@H+]]]]]++]]5&LM.@ 555_5@5 555@H+]]]]]]]]55H{ds&-KR@ & %+5+5W!&7K@ & %+5+5;&.9s %+5;&N9!Ĵ %+5JI@ D@ H/GT ?2?3992^]3/8+]339310!#373#m3oQhJ5##33&'&&533M"N-%K=&7d{ 2XDMLA9uAA8}4 ^ie1^(:@" G$U**`**GT)P P????32]9/10"&'532>54&#"#33>320?6#.#ipQnC ER\0"Hm 'A3m4f`J+?*M{W/}q&2MR@ *&() %+5+5q-o&RM@ "& ! %+5+5}q@&2NR@ -&2( %+5+5q-&RN%&* %+5+5}qs&2SR@ 4&C(< %+55+55q-!&RSF@ ,&E 4 %+55+55}*[@6Z'' g,,[ f+_O__$__????9/^]q]29/29/]10!!#"&&546632!!!!!"3267&& +[0LLbT>Vrl44kr4Z&&Y lk<QڊۙQXq^*6?d@;?H111 7H%WAAA@A+H V@P?+????.<4P .P?332?3329/^]]]]q29/]29910"&'#".54>326632!32>732654&#"4.#"`A?ƀgGC|oy?r pmmpLՉӑKojipGnq ;bDqP,s&5vTR)&# %+5+5!&Uv@ #&@%+5+5;&59w# %+5`;^&U9%+5s&5LR"&( %+5+5r !&ULp&"%+5+5hs&6v;R@ @&p4:%+5+5Z?!&Vv@ B&]6<%+5+5hs&6KR@ 4&"<4%+5+5Z?!&VK@ 6&>6%+5+5h&6z5:4%+5Z?^&Vz <6%+5hs&6LR@ 9&?4%+5+5Z?!&VL@ ;&A6%+5+5;&79ش%+5!;F&W9]$%+5s&7LR@  &%+5+5!&W8o a$$%+5s@L_ 0@ ZP w1  ` _?2?9/32/^]]]33/]]922/]9]]]q10!5!!!!#!5^_'ٻ3ߤ!b!F%j @7 H'/'?'#G"O OP ??3329/32/^]33]222]3/+33]10%2>7#".55#535#5773!!!!-*# (04>jM,Ni?  NeQNab5&8R`R &!/ %+5+5&XR@ #&$2 %+5+5&8MR& %+5+5o&XM!@ & %+5+5@&8N}R@ &" %+5+5&XN @  &% %+5+5&8P{R@ &" %+55+55&XP @  &% %+55+55s&8SR@ $&6, %+55+55!&XSP@ '&H/ %+55+55B&8Q  % %+5BJ&XQ !!%+5s&:K;R@ +&3+%+5+5!&ZK@ 0&80.%+5+57s&<KR@  & %+5+5 !&\K@ #&+#%+5+57+&<jR@ & %+55+55Rs&=v9R@ &^ %+5+5R5!&]v@ &` %+5+5R7&=O)R@ & %+5+5R5&]O@ & %+5+5Rs&=LR@ & %+5+5R5!&]L@ & %+5+5%@  GT P??]3/1034>32&&#"-U|N;c&/H((:'kT# 0SAN+J@*0-)G 0@`)) #P P??9/32/^]3/3/32/2]10#"&'532>5#5754>32&&#"3-U{N =9(;&-U|N;c&/H((:'D?kT#  0SAKDkT# 0SA#1>@^))**0118    V#f##Yi2o 7 G W  8HX @ H@@@/@@@@ @1 _# H <55<`1 1#<11<#) ?3/9////]]]]]333+/83^]3/8+]q39=/3]]3]]3/]99]99]3/]q3/33/]10#!#&&54>32.'>73#4&#"326P<3Ӝ3: ;R21T># 0/*?MQ#y?21?31 2?F`#y`F3O87O_}.6;<6.=A@AGB4<<43;<^ 1@T`@#UAA/AAA[K K K 7G1Ub?b>H(@: H( H((VaXPP ` p  PP^@FPFFF'$P+8R+2P/]??3?9/23/]9/3/]2/++]2299//3/]10>73#'##".5467754.#"'6632%2>55#".54>324&#"3260/*?MR#xR%!BN`?EtU07Q4SB@Jdfa0/=hL+ZzI a#=T12R;!!;R20T>#u?12?981?=A@AGB\-A*'Q{TECZ70"(8)Yb&MuOc 9Q3\V3Q88O33O87O45<<55<<Vs&v%R &H%+5+5^D!&vu@ ]&qQW%+5+5}qs&vR@ >&X28%+5+5s/!&vP@ :&L.4 %+5+5h;&69ڴ4:%+5Z;?^&V96<%+5!%@_/]32/9=/3310#&&'#5>73y3l46j3yDC;;CE"a77a"LQQ""QQL!%@  _/]32/9=/3310#.'536673EC;;CDy3j64l3yLQP##PQL"a88a"Zo@ _/]/10!!?o!{/@   _/]]2/]10#".'332>7{,MmGImI'l0C,$A3"=eJ)'If?+2 1(u @ 0  /]]/104632#"&=-'?,-=s<6 +:98m1@@-?O_0  ?O__/]^]/]]10#".54>324&#"3261#=T12R; ;R20T>#u?12?981?3Q88O33O87O45<<55<<B^@   ///103267#"&54>734"-@dd/8-+qhZ*K@48@#/  @H@ H /]23/++3/^]]10".#"#>3232673(OLF -0h!5J.*QLE-.i!5J#+#5>73#%>73#//*?MQ#ek0/*?MQ#dLQQ"QXSLQQ"QXS! '@ H@  _  /]/]32+10>73# !-4lMQP!NWV   )f@$$$$$$@ H$$ @' H H  '`/^]]]329//32+3/+3/+]q10>73#'4632#"&%4632#"& 08= R8)#:&)88(#:&(8KOQ$ MPQ%60 &522560 &522&$T0"""%+]5?5H^3@ 4Ddt H//+]]]104>32#"."./""/."&5!!5&%4""4M'(T.H@%g]]4++5?5P&+{T1H@%eo/]]]4++5?5`',Tf@0 @/%p`P@? @H@ H++]]]]]]]]]]5+]]]]]]5?5&2RTG@0-..p.P. ...$.. %PPg777]]]]44+]]]]]]]5?5T'<TKH H@% ?/]]]]]]]5++]+5?5&vZT5@#5 66666%PPg???]]]]4+]]]5?5w&U@$@$ $:%+]]555$%C@ @H/Oo@HZd_??+]3/+_]]10!#ú%hX@ [`p@' H/_o@ H [ H _??3+/+]3/+]9=/3310%!53!&&h»^*.}}1J[ a(R=+}q+S@4"[g----?-o-[f,`'__ ??9/^]]]]]99//10!!%#"&&54663232>54.#"Q훣LLQ4krrk22jrrl49Ellkk뫉ۙQQۉڗQQRd,. _@/@H@ H@ H  @" /O_ H  ?2?3+/8]]2/839=/33+++]10!#&&'#3.*aKK[`/01R c@> ? O o 0 p O  _ _ _??9/^]/]]3/]]]]q2/99//]]10!!!!!5ZRJsdN }q21@Ze o  Zd_?2?]]]10!#!#!{33N Z@ [ H @&H  / o  [/? _ _??9=/3/]32^]3/+99//+10355!!!Nn}Xgf%77<h!.;@P"gZ;!z([g=/======_=0===5[f<";`./`!!!!??99//3232^]]]]]]qq9/]]]33]2210332###5#".54>3332>54.+"33I~<4Txe//exT5=~…J][.)SW99WT(.[]˴^f={nR00Rn{=fę^S;iXNh<32!!5>54.rj2#Q_b@oP.Q욛Q.PnAb_Q#2j)DudA0o^^oǨ0AduD@w+&,j R@ & %+55+557+&<jR@ & %+55+55q!&~T@ J&>D/%+5+5Z\!&T@ F&m:@-%+5+5!&TD@ %&b %+5+5w!&T"&"%+5+5=&U,B%+555q^=8@8G/(??HV>" P8/,P3?3222?3?]22210%2>754.#"".54>32366733267#".'#5LiAAlQf]n<=qdp1 !  2"%A"&?2$ ;M`/bhek7͗HԌՐISU#R!hy~7]<3 '@0"=.u=Y@49H3/333,G W? ?0?"GT>2P333"'PP??29/^]9?2]99//]9102#"&'#4>"32>54.##532>54.w`vC?xm` Jc@@HP/OH@   @ @   ??33?3/83/8^]39=/333/8]^]]+10%#4>733>73`" %` Ǽ>~4*y?>(]ZPR]Z!Lo-2DQ@.F8.3H$WF@FFFF=H.VE$B 88 BP)P ?3?9/993^]]29/9910.54>32.#"#".54>4.'3268]C%3\}JDq`Q#J IQ[3*<'=A)1l~XC=unjzSQEoYI:bgBoQ-Z\^9Y@7#-W;;;;?;_;;4F##GV:P9y9999 1P( P??9/]]93/]]]29/910#"32>7#".54>75.54>32&&#"3)F`73\QG;mql5&?R,+F3:iV5ZRM(?KGls'Hd=[^3E*")1VuC>X>) +>P2FmJ& "&MM-@'qoj39@.F 555 H))V4.P?22/2/]]23/3105!#>54.'.54667#~L( -TxKG_:"++"0[MY\.\l+/(`/{vͳo0Yl@#.;H*-XRK HHC%"Blfl^1@GU` G TP  ????32]104&#"#33>32\ipQnC ER\04f`J+?*Gq+'[@:%GW)))))@))$G V(P$$$$$$$PP??9/^]]]]2^]]]]q210#"&&5466322>7!"!4p~vt83o~vu:+IhE#!DhJGfD#3  mm))lkJߕߕKE͉wH5@#0   `pGTP??^]3/]1032>7#".5Z?H-*$ )04>jM,Hab  NeJ!.h@*") ) )P4D 0`000.@.)PP??9/3?/83^]]3/]]]99=//339310#'.#"566323267#".'.'#5 +=+"2B#JiO?H.&&7%';/%  53)C1 *Y]669 (@.!^aWMOJ?@& G U `pGT P  ?3??33?22]221032>53#'##"&'#3djoRnC 0gHj#4e`:ST.*&(#U*6J;@ GW ?2?3/82^]]q9=/331033>53# ZrB%\uJ!cg\`qojF~@N2;;*AF8--$ F H?H_HHHHH$VG<28P9*IYi8$O9??9/9]]922]]]/^]9/393/310#"#>54.'&&54>75&&54>7##5!#"3#QW--TxKG_:"++"0[M/Nf7er-Ok>"'!U.>7IsG FrQw1UqAN`;".;H*-XRK HHC%""ǵMcC uHfI1&NuN5Q7q-^RJX@8 G/ G/@HT PP???22+]3]3/]3/9/]10%267#"&5!##57!#P/J0qqm݉'/  PJPNF7-^'9@!%HW))@)) GT(P"P?3??22^]]]10#"&'##4>32"32654&-?uhK6AxiawC;6K{}'ՑL--+.'a.ӑKK31qoo^1Q@6''F   3?3_3333HV2(-Q7 (8H $??9]]2]]]23/10#>54.'.54>32.#"-I~aG_:"++"0[MMb7IjN268<:PrI"`yN/.;H*-XRK HHC%"AvI"  9pqJ)6@!$!HW++++++H V*%PP??2]22210#".54>3!!32>54&'#"->zuk}DM΀%A0!GnMLmG!OK;_Z+oPF˅ڊ>)]l|6Ui;7bNY,cfJ:@$   W+;GPP??2/]]]^]210!32>7#".5!57f->$*($ '.5@uY4׆J;R3 MhsJP=J)@GW`GT P??3]10".5332654.'3\d) BfF PmXVc6G}ut==rwKq%^%5^@<1%G&HW7 777o777@777GV6+P 1P$??32?3^]]]]qq9/]3210.54>746324.#">fmK 8N-%?-3Xt@Zf7VhO6I+1%H{Y3C՗S}7`3hr}Goa0^PzِJ&%be35WA;k%N(@hxg w  v7@H4@ H**?*O**%%%%@)'( P#P???9]]?3/833/]^]3/+]3/8]+39=/]]33]3]10233267#".'#&&#"566-I:1{s&4%.9(C_G3ƠG5$>N>\=J &B3 &FfAj>OY  q'L@/G&GW)0)@))))))!GT( &P???32?3^]]9/3210>54.'3#.53VN_4WmoL6ZxBs 7332>5332>54.'3#"&'#Z`2/ /6K-.D,cQ-K6/ /2`Zk RyQHIRbe4)Hb92΁4ebRIHQy˒RW[[Ww&j@ &2*%+55+55=&j'&޴2%+55+55q-!&RT@ ,&= & %+5+5=!&T@ *&$%+5+5q!&T!@ H&`<<@ H=554&#!#!5!!!2/FD' @3!i{^Z]e55_ 3WEst#o1^Yie1s&av3R@ &> %+5+5}&_@@H#p###@$ H##(([f'_ $_  _?3?39/^]2]3/+]]99//+10"!!3267#"&&546632&&_xM t@vqYN'NUa;LWlON?'AzoɊH#ln,* .h6Rd,@w+&,j R@ & %+55+55H{s-*5%+Z @SHZ#######P#####/[g777@ H65_%%%%+_#`+`???9/^]3/+]99//^]]]^]38]+2210#!!#"&'532>7667!3232654.##<~†!"5OnN#J: 0>* '+m~7ww.[]Xap=qQgo; ?bu69:BqFa< !S@2Z ###### Z d"!_   ` ?3?39/^]322]q9/3210#!!#3!33232654.## <~†Hm~7ww.[]Xap=VhBqFa<s@MZUotZ0@Pgw^?O_ _?3?9/2/]]]]]3/]22/]]]^]10!2#4&#!#!5!!#Z]e5i{^1^Yst#s&vR@ &" %+5+5i&6#R@ '& ,"%+5+5 c@AZHG: Ze o  Zd _/33/?3]]]9/]]+]]]]10!!#!3!3Z]$3K@._[g_ Zd_   _`??9/^]2^]9/]10#!!!3232654.##3<~†~7N.[]ap=7!3!! dq/VMA0e.=FM''UijLȷK(@Nf v 7 G W  G  Ziy8HXWgw  p  @& H  @@ ?33?33933/8333^]]]]]]3/8+]q3339/]]]]33]]]23]]10333###%  !<<<H9h@?'[!0!!0[ g;;p?O_: `!x!!!!/,`5`?3?39/^]]]93/]]]9///910#"&'532654&##532>54.#"'>323[}KW^2C͉nU+`cc.Ϻ\a2%D_:nK\&btGmq9`IxX9  9YwH`t@"-$ 'He=6S:C6}6)6ak@ Z e 0 Zd H @# H  &  H H ) ?22^]++?3]++322]]]2210333#46767##ɮլ1>CC JLJ9ALMFi&6R&" %+5+5 ^@!   /   V  @ H Zd ?2?39923+]]]]]3/8^]338310!##335<Bb@;HZPZe!!!! _` ??3?3/^]9/^]]]38]+210!#!#"&'532>7667!!"5OnN#J: 0>* '+qQgo; ?bu69:/0+}q2n33}&7!o@!`p@ H### @ "@ H _ ?2?39+]]3/833]3/8+]393310#"&'532>733>7T&Spo3Z%%Y45RB8  7]{H5V??  !hs`;q ;@!Z Z   Zd _?3/2?3]]]3/10%3#!3!3H@Zep/ Z` p  @ H _ ??39/3/+]]]]210!##".5332673sb]e5i{ZpV,.1_YGst((3 `@BVZgw Ze   P p  Zd _?2?33^]]q9/]]q]10!!3!3!33q@KV  Z  g w   ZZe PpZd  _?3/22?33^]]q2/9/]]q]10%3#!3!3!33R@3 Z[g/?__  _ `??9/^]3/^]q9/]210#!!5!3232654.##<~†7N-\]ap=BqFa<I@+[Ze Zd_  `?3?39/^]2^]9/]10#!33232654.##33<~†~7N.[]ap=BqFa<VJ3H@.[g_@H@ H Zd_  `??9/^]2++^]]10#!33232654.##3<~†~7N.[]ap=BqFa<;D$Q@/ [  g&&&&%_x__?3?39/^]]]3/]99//210"'6632#".'532!5!.^?NOlRR:aVN'NYq Gs'. *,mm#oz@.^@<[  %[g00?0o00000@H Z d/*_ _   _???9/^]?2+]q9/]310#"&&'!#3!>3232>54.#"O喗PV UۑO1glmf00elmg1ݩldVZk뫉ۙQQۉڗQQ@ @$ HZ e? @ HK@ H@&[@Hf`` ?3?9/3^]+]3/8+]3+]q]]932+]q10#.5463!##"33B}7cK,uJsO)'NwQ\>a]J\>aDBiJ(^^Du!#';I@,-H W===@==7HV<2P(P#  H Q?+?9/32^]]]]21046676673>32#".2>54.#"u1hq}f!2{}u,>dH) >Tk@ce2E|hk{B4&#!32>{k8aG)/eq9Sg;8]C&ml>\?5hu$=[?CtV0J@k\H*E M@$< J/@PGTP??]]]3/]10!#! Z\PJ)7Jy@F /? @9     GF U0/FO P?2?22?3/]]]]2/99//]]8]]310#!#3>7!3!#7NVAcC"$:Q4}_P$gSq^HJ@ F     H@$ H0p @  ?33?33933/8333^]]]q3/8^]++3339/]]]]33231033###3XCDX5--5DR^9_@:F99 4G!W;;;;o; ;) V:8P999999/P&P??9/^]]]92]]]99//9102>54&#"'>32#"&'532>54&##5q=dH'slGK?(MRZ5Vi:3F+,R?&5lqm:LWa37`F)'@-MM&" &JmF2M;) ,BZ>CuV1#"*E3^[;J Q@ HFU   H @ H F T   ?33?332++]2+103##Z  JdjJ;&6%& %+5+5J A@#   GT  ?3?393322]3/8]333103##3aKJ-JJL@1FT GU/ PO???3/^]9/]]]q10!#!#"&'532667!@_V17YE3TiuoJ ^@?FU""@"P""FT!;K[ )4DT& ?333]]?33]]32^]]]210!##.'#3>73  9;6P 1;>JG"C<21;A!;J [@GU 0 @ P  @#H G T P/ ?2?39/^]]]2+]q210!3#!#d!߶J9Jq-^RJ-@GU  ` p GTP?2?]10!#!#!ddJ?^Sqo^F)^JX@<  p _ G`pP??2/]3/]]2/^]]q]]]q10!#!5!^5P J\q#")t@K' F I   #HW+ +++++o+@+++HV*&P'P  ??32?32?^]]]]]qq9/]]+332210#.54>734&'66!qLGwrLGy X}P%9Z U}}ȑV $ V~}ǏU < =g^#J[J D@+GG   ` p GT  P??2?3]]3/^]10#!3!33}JPPJ1@ G U`GTP  ?2?9/3]21032>73##".5P-PLM*,PU^:NzR+Jf,0 /TsDFJ f@CG  t g  GU   o @  / GT P ?33?2^]]]]qq9/_]]_]]10%!3!3!3hJPJw@N Gtg GG @/GT  P??22?33^]]qq]2/]9/_]]_]]10#!3!3!33}JPPP)J\@>GWP`?G     P `  P P P ??9/]/^]3/]q2]]10!2#!!5!4.#!!2>H/eq9!A`@7]D&M|X/1B()BPJ a@@G p G UG TP P ?3?39/]2^]]]q9/^]1032#!3#332>54.#d/eqb춶8]C&!A`@M|X/JJ)B01B(J @@)GW pG T P P ??9/]2^]q10!2#!3!2>54.#d/eq98]C&!A`@M|X/J)B01B(7B^&^@> H"W(((@(/@ HX' P/QQ??9/^]]]+q2]]29/10"&'532>7!5!&&#"'>32BY|66RItR0# ;<85@HN&fMQ%(T\   >۝ԊC^&r@KH O !HW((/(((G((/( G T'$P P,   P???9/^]]]]?2]]]q9/]q310#".'!#3!>3232654&#"@xjbuFﶶ HvcbyD)~~'ՑLB|J9tx>Kӈ#JS@GUo@F@HVPP ?2?9/2+3/83^]293103#.54>3!##33#"#-TA(8dS%AZ6kh 0LlGNyQ*T0F.f_q&Hj@ 1&(<%+55+551S@2 G-U33`33#"GT2!O#P)) ))P????]39/322222]910"&'532>54&#"##5353!!3>320?6#.#ipQnC{ ER\0"Hm 'A3D4f`Չ+?*M{W/ !&v@ &E %+5+5qo^"O@1 $$$@$HV#P/Q Q??9/^]]]2]]29/10".54>32.#"!!3267ReJLfN268<:# Q66{?Ֆۉ>"  %Z?^VuL%&j@  &%+55+55uMJ*k@E F%G $  GW,,/,?,_,,,,+$P% PO%P ???9/]3/]99//]]]]21032#!##"&'532667!4.##32>.eqb@_V17YE3+!A`@8]C&M|X/iuo1B()BuJ!S@0GG W###?##GT"PP?2?39/]322]]]]9/3210!332#!!#4.##32>d϶/eqb1!Aa?7]D&J9=M|X/J1B()B!S@2h G!U##`## G T" OP  ?2??]39/322222]9]10!4&#"##5353!!3>32\ipQnC{ ER\04f`Չ+?*\!&v@ & %+5+5 &\6@ (& -#%+5+5J Y@=GvJZ GU  ` p G T P  ?3??3]9/]]]]]10%!3!#!3d}JD@,Z  Zd_ ??3/]]]3/]]103!#ú-- 0@G GT O??3/]3/]10!#!3 Z?J?s&:CR+&1+%+5+5!&ZCL0&60.%+5+5s&:vR@ 7&d+1%+5+5!&Zv@ <&i06.%+5+5+&:j9R4&+?%+55+55&Zj9&0D.%+55+557s&<CrR & %+5+5 !&\CK#&)#%+5+5Ry@  H?/3/+105!R\ѨRy@  H?/3/+105!R\ѨRy@  H?/3/+105!R\Ѩ1N*@  /]/]/33/310!5!5!5!NRR1P %@__o  ?//]3]10'>73%'.46z|{8=|5P %@_ _o?/]/3]10#>7B'/37y}z8<|5?y 5@ H _oH?/+33/]+10%#>7j'/36z|{8=}5R +@__o ?/3/]3]10#.'74.'5|<8z}y7 b@H_o_o P`p_o ?32/]33/]/3/]3]]]10'>73!'>73'.4'.46z|{8=|56z|{8=|5 b@H_oP`p_o _o ?22/33/]/]3/]3]]]10#>7!#>7B'/3H'/37y}z8<|57y}z8<|5? ~@Q 0@`pP`p_ _o@ H ?22/+33/]/]]3/]3]_]]]10%#>7!#>7j'/3H'/36z|{8=}56z|{8=}5{h |@R o  0 @   w j T E &   6 /?222222/]]233]]]]]]]3/33]]]10%#53%h77777K_{}@q @P  zdU6F  P   /222222?222222/^]q333/222233]]]]]]]q23/332]]]q10%%#553%%1L78L//L87L/y"xmF@$/_o_ o  @  H/]]/+]]]]104>32#".$?V21V@%%@V12V?$Gd??dGFd??d'9@v;$;;;;;;;d;t;K;4; ;fv($2222222r2f2K202 222 Td -7#/3322/^]]]/^]]_]]]]]]]]]]q9/]]]]]]]]]]q1074>32#".%4>32#".%4>32#"&"./""/."%"./""/."%#./""/6Io&5!!5&%5""5%&5!!5&%5""5%&5!!5&%5"Bf ';?I]@\@TJ2#(>0<@<<0(@(><((<>EJ_?_O_____  0GYCO?>%7!-?????/]]9///]]]1032#"#".54>3232#"#".54>32#32#"#".54>32GPPG$JsOIpL&#IqNKqM'GPPG#JsOJpK&#IqNKqL'՞,GQQG#JsOJpK&#IqNJrL'JHlv??vllu>>uJIHlv??vllu>>uJIHlv??vllu>>uJ Rs<@ H?//9=/33/]]+210R5uu)NNRs?@( ??//9=/33/]3]/]]10'7uu5eN\\Nbb' /11]]h@ ??/82/8310#h՝+JjA@` @ H  ??32/+2]]]104&#"#33632??-A*i @QD4WAXeP`v@H   0Z `_?o@H _ ??99//+^]32/^]3/]322]3/]99//10!!##53!!!!$ܳ'D#0@ o+'###@> H22)%@ H%u&&)u* *o&***?*O***&*&*ts??299//]]]3232/+33]3/+399//33322102&&#"!!!!!!5>55#535#5354>jBB8K0RY@+ )DaCW_2*5y@1on$@H@, H777@ H+#n$|6u+s"""$5s%$u ???99//322+]3/++]99//32210%2>7#".5#57733####3232>54&##;$#P?5X@$Ak44|̘/{:][.9 "FjHRMӉVLN[M9mg GqQ?J9(6@K H;;,## o."c(((:#`$$,`--_$$$$$--/-_---$-$-7t3_?3?399//]]32323/]332233]3/+39910"!!!!3267#".'#53&45465#53>32&&Ev^CA"K;;[sXXraOP3w'4c[  ) Iy.}ʐN+1++H@ 9F@JpFFFFFF1"J@111 1111B,=6' ????/^]q]q9////8]]833310##".54>3232>54.#"".54>32&&#"3267 ՝+n-PpD?nQ/,PqD>nR/3&<+*<%%<*+<&EyZ45\}H3d !U"g_3Z##cJSW--WSSW--WS3V>##>V34U=!!=U&RZ_R&k tvkw{-:U@2.p#@H##<5(n 06v((0vu  ?3/?9/3322/]329/+10%2>73#".5556674>324#">o 9.d&FiF:jQ0.a14_-@hK6W=!5\|G$7cf ) 6N3w2R;SZ0%Tc y;lS1*OoEch&0Q;!!2E*j!Nby+7;@rZ99,"0@"" 2::/:::g=o===@=  Z d3232654&#"5!v)MmD?kM,)MmD>kN,BHQQGGQQHcMLA9LLJ CC> SY//YSSX..XSqssqrmm%P @] o0@P ğ""/"?""@H"@H H @ H?333/333+323+3/]++]]2229///]]]]]]2210##5!###33#4>7#h @{ell%"I'/ ## NvfH"/;@!#J1/JN+/;///)N N??9/]9//]2210".54>32!32>7.#"yƆE,Lfv?qŽQ@MX.Jt^M"H$Sn;M]53WI<#^nc~\<Oу," 326454&#"5>322>7.#"; AemjS"2Qsb[-DCACKO%}c*5^QC5% );I*>fO:%-FjԼRBnL32>32267&&#""32>54.1+MmB]AFNS+AnO-+NoCU>DOW0BmM+{?l41kE(@,,A|?k73lD'@-.@?rW4is0O8,RuHAsV1kp0N8-RuWa^Z3D&$B2jWa]\3D'&C1#7@#%%   ??/]3]]2]]]102&&#"#"&'532>54>"K=$3B'2Y|J$K>#3E*/Wy 'AT-^V) %@T0'^V(f{%#GK@.AII.  @)1C   @H ;.C?33/+]323/]3]210.#"563232>7#"..#"563232>7#".%7-)<;8d27C/%7/(<;8c27C/%7-)<;8d27C/%7/(<;8a27C !,l  !,l   ,m  -l f@   @O    @{hB9  / o/]]33/^]]q3223233/]]]]]]]]3]299//883}310#5!!5!3!!!'^>yIi{;9f R@2 @ @o0 Pp?/^]]]q33/]]29=/33/]3]210%5 5!d!dfqf R@2  @ @o0 Pp?/^]]]q33/]]39=/33/]3]21055!fdBjfXm? ]@6   @ P  /  /?99=//33/]]]]99333310#3 ?L 1&IL$@P/@//]]]]]]]55&IO"@P!@!!]]]]]]]5?@) 0p 0  @ H/3/+]3/^]3/]]]q10#".'332>71]dgX)2L5,I6"NvQ)'PwP9I)+H5dJ#@ G  T P??2/]10"&'532>53B0?6#.#"Hm 'A3M{W/y @ ? ?/3]10>73# ).`MQP!NVV o;u @  //2/310>73#o ,6bVLTS!MWV!}! @  ?/2/310#5>73 -7bLTS!NVV!%9 *@ O@ H ??/+]1032654&#"#".54>32GQNNNNQG#JsOJpK&#IqNlu>>ullt< J F@*  _@ H   /  ??9/^]32/+]9/33210##5!533!5467}y}  oC*c1 %*(;7f$J@!"" &O&&&@ H @H !??9//++]39/333102#"&'532654&#"'!!66B=kO-?y,<=;U__Y %'%C!9m#DeA LXMU+{%9-8@  !/O///@ H) $??39/3/2+]910#".54>7366322654&#"*NoD@nR/E~n-O`@ cJ6Z@$DTMG'?--=fAoP--XSnm'm@O`;+1%Hi\VRZ)7,I5/Jd8@O@ H??/]+]9/810!5!@b5J{d19q%4Dw@"8!B =2!!,FOFFF@ H&@'H =2K2[2k22225====)5??9]9]99/++]99//9102#"&54>7.54>32654.''">54&R4^F*'4">0*Mi?*8.#+H_bJHJK'7!AB8? -, A7T8%>2(-7E*9]B$s*E8++5>%8S7h;FF;0' "M76*$ #,67!9{%5;@"1 7O777@ H),&! ??9/3/+]9210#"&'532>7##".54>32%"32>54.{!Z@6Sl@ $0=&<`D$)KlCArT0DVJL&?-*>B`[} 5Wr=$%GfABoQ-/a^XLX)3$H;$T #'+/37;?CGS_ox@Y4, 8WQzpotgdd~kpQQQQokkoQ]O_D($ ]PK`KKKA=1 *BF>&2oygppz`zoTHHpooaoo@% Hoo`ZNNx`/`?`o```, 95!/^]3333/33339/]333/33/+]]3/339/333/3/3/3/3/33333/]3/33333/]39///]333/33333/3/3/310!#%5!#533!5353!5!!5!5!#3#35!#35!35!#35#3#3"&54672'2654&#"32##32654&##32654&#532653#"T/0momImmmm0oowoooommH??HEBBmp--83m^{B.$)0;J1%&4 %1}h_=0oo/mmmmmmoo;mmJoooo/yhhg^^ff^^gCS1D D:QYb" "+% *f$2r^dT#/P@(##$ *0*@***O$$$ ##0---''/3/33/3/]3//3/3/33/]3/]3/310 54676654.#"663232654&#"TV!LcM1[Q+ZWR"RD~8?>'REJGFDGGDFGVW/,>:LYEkJ'#".:/1DA5yP;>II>@IIU!&7LP + Ou@GM C>;GCC;GOQQ?Q3G "P)>OONN))0)@)P))N)N8PH8P??99//^]32/]]]3/]39/999910.#"#".54>54&#"'6632324&'.54>323j 9M[0LV.j<@ăoV" 6%%d62E, 0N:C'QYhuKlt=XH8iR3:s7_}E(]YK-! 2D(#V]a-*J620>KxQCpR.TߋH"@$$$@ H"!!@!!!!@D!!   H } k Z O + ;  ZwO! ???99/^]]]2/]]]]]]+qq93/8]]]]]3+]10>7>32&&#"#3=?</5@)#+  # (2662BK,(=' *#Un</`J<@Gg//G,,,,,,7H>>T>d>>>>@>0>>"H0@P@H--'P 2'P?22?229/9/+^]]]_]]q3/]9/_]]]]]910"&54>7!57!##"&'#32>55332>54.') +&ĵj (6K-.D,bR-K6$9}~{8JP8{~}9W[[W6vyz:bN!)Hb9!Nb:zyv6/u&0vyT@ '&K %+5+5!&Pv@ :&z-3+%+5+5&$[ %+55^^&D[ =3 "%+55&2R\@?-5 H!@55 %P@]]]]]]55++55?55s7:@(?O_0  0@P/^]/]]10#".54>324&#"3267#=T12R; ;R20T>#t@12?981@3Q88O33O87O45<<55<<h B@ 0@@ H+      ?O_/]99///]]2/+3]910>73#%467#"& 08>Rxz<9%2/:EKOQ$ MPQ%xNsL.%'F&I'ILD8@&9p9@9/999KpK@KK]]]]]]5]]]]]55&I'IOD6@%9p9@9/999=p=@==]]]]]]5]]]]]5}% 4K@, [+[ g666p6/6_6![f50_ &_??99]]]]3/9910#"&&546632>532>54.#" (?Z?+-Q훣LL爛Q)14krrk22jrrl432>5332654&#"-C}ogGC|od?.4-?V9 $'ՑLLՉӑKGD 7K]3Jx^CA^N$Q@2[#Z&p&&&_&&&Zd% $_??33/3]]]3/]]q33/10>53#".5332>74> 2U[BɈąDYR(2Nd8GiJrĐRMzH6bQy'T@3J!!G'')))))o)) )0)G T(&& P??3?33/3^]]]q3/323/10!'##".5332>53>53u ER\0[\/joQnC4> 2U[+?).bi=4e`:{2Ne8GmH! @ _/]/10#.'53y#QM@+.0SXQ#PQLH! @  _  /]/10>73#H0.+?MR"yLQP#QXSF8@#/  @H@ H /]23/++3/^]]10".#"#>3232673B(OLG-0h!5J.)QME-.h!5I#+#5>54.#"56632y-<" q%<*$242)':)o! l[1}  //104632#"&1>-+?'-><77<+7s&(CR &´ %+5+5s&CBR& %+5+5q!&HC(&.(%+5+5;!&C & %+5+5}^Eq@H9Z%666666A[ gGGGG GPGpGGG.[fF773)_&&" H<3_?322+?33329/^]q9/]]]32910"'6632#"&'##"&&546632&&#"3267332>54.h<^*L;Qw}@?ƈoIKnƁ?@}wQ;L)_733>53#&&5w& w ZrA%\uw  JVW3:AE  !cg\gT 5 !@ Z  @ 'H   H @@ H [g##0#P#`####P#!_ _O` ??99//^]]]]32/]]]q9/++]_q+39/221032#!!5!3!!32654.## ~7<~†<y.[]NBqWap=`@Fa<m'!@ G  @G H GW###p####P P@ H0P ?/]]99//^]q+]32/]q99//+]32210!!2#!#5353!!2>54.#/eq9+7^C&!A`@לM|X/)B01B(-X@/[""**/!Zd.+_'_"!!! _?3??9/^]3322?323}/9///3210"!!3267#"&&'!#3!>32&&m_xM t@uqYN'NVa:RVclON?'AzoɊH#dV\,* .q^)d@9 HO   '+ GT*Q P   /  #Q&?2??9/^]]3322?323}/399//]3210".'!#3!>32.#"!!3267TaO U^N268<;# R65|:{J9r4"  %/ @Iw   p@H@@ _ H  ??339/9+2/83^]]]+]3/8]q39/3]9=/339999]]]]q]q10!###3##'!'.'9;z#5 VJ0LCA%%ACI- ZJ @89Yy+   @ H   H   H@ HP @ P   ?33?9/92/83]]]]3/++389/39=/]33+]+]9999^]]]]]]]10]]#####3.'``q#% %#JJyU`^""_`T) @w @]+{/p"0"P"""" Z d!_  H  ?3?3339/9+3222]3/]839=///^]]]]]83333999999]]10!###!#3!3##'!'.'祁;y#5VVhJ0LCA%%ACI-J@1w  )Iiy     G@ H H @/ ?   T H@, H!!!`!p!!O!! P ?333?39/9322^]]]]]3/++8399//]8339=/]33+]+]2999999]]]]]]10#####!#3!3.'T``鶶Tp#% %#JJ9yT`_""_`Tj#&@"Y% H&@, H% $$Z&     @; H(((((@(P(p((?(#a$ O &_?22?229/^]q332/3^]]]]q3/+]]q39///]39=/333++]]10]3>75!#.####"!{6T|_IaV7z{&6O==O6&{JoUb:狋8bV;H_9H9_H?Z J#&@ v% H&@ H # $$F% & @H   H@? H((((`(((O(# &PR$&$6$$$ O_?22?9/^]33]222/3]]]q3/++q39///+]339=/33]]++]103>75!#.####"! {,BgSShC,{{$0D55F0%z T=eM1 dii1Lg=P6H+ +H6-(+@Y ))Z * H+@3 H*+   (p@4 H----@-/- Zd, +_ !a)    ?2?39/^]3322222]]]]3/+]q39/]]39///^]33++9=/33]]10!667!#3!5!#.####"!3{){JaU7{{&6O=32.#"#".54>32>54.##532>54.#"'667.'53>32&&#"GZ4$=/AaSQ2+B1# 6M51GJ\FhO 1flYQ&9gX\a2%D_:nK\;g762y3a6;CK*/ "00.R~U+3[}KW^2C )$  )H`76S:C6}0KA?:"a8$F8# w)8! ?\vEJwX9  9YwH`t@sRRp@q@ Hhhbl lXFl__R3l3lR_CMGWrrrrr0rr&FC@ HCQPRRRRRbHhR@H@ H^l[P b4+P>HP!??3?33/++39/^]]9=//+^]]]]9=/////]933/33/10+2&&#"#"32>32.#"#".54>32>54&##532>54&#"'667.'53>/ !..-7Y?#3F+,R?&5lqKY/":,2c]S!BG "(, Udo9Xp@"Vn7dL,a=dH'slGK?9kA10,y3b6:CKR w&31EX52M;) ,B[=DtV1&#   .GV)/YF*+E3^['@-MM&"";72"a8$F8#huq}q)O@2%[g++++?+o+$[ f*`O$$$$$$__??9/^]q2]]]]210#"&&5466322>7!"!.qQ훣LL駱Qjk9:kmil=d;iݪllkkGzz†GCuuCq-^!O@3HW#@####H V"P/PP??9/^]]]2]]210#".54>32267!"!&&-C}ogGC|ogG# > 'ՑLLՉӑKKԲDZ@)   /O_ @ `  ?33?3?/83^]]q3/]9=/]q3310"#3667>32&&$5*$'.*=LgK#D5-%HgBa[ONaqb+  Rm@ H H H@ H!!!!P!!/!O!@ O?2??33/83^]]]3/+]9=/+33++1033>7>32&&#"#  V5CX<" &/:J!jna_lg!@^uBPXs&vR&1%+55+55!&vP &4 %+55+55} Z'J@ [8J//7)(@#((@@@@@/@?@@@ 67777@4 H77LLLL/LOLLLLL[ fK8/JJ(DP=6(#__???3?933^]q3/+]899//]]]q3/89=/3310#"&&54663232>54.#"%33>73#"&'532>77LݑGGᙐݕL#/agg`..`gha/C  ǼN@VtP4L@#0F4%9ݪllkk뫉ۙQQۉڗQQ(XXS"Va^!c'QZ1 ,@)qN^&R\o / %+55}1?R@30[gAAAA0AA [f@ 85;_(%_ ?332?3322^]]]]_]]10#"&'.54>766326632>54.'#"&'I|J7;H LJEEǁ H;7J{ʼnJ-WSC51ERW--WRF15CSW-ݕ}?66?}{?13=}tb0&(.btsb2))0aq7T,HW99H9@$ H HV8 2/5P)&#P ?3322?3322^]]]++10#"&'.54>7663266326654&'#"&'9k_ <8:;]n=9lb;:7= [m732>54.#".#"#54632356654.54632?<^*L;Qw}@?ƈgEGgƁ?@}wQ;L)_32.#"326732654&#"'>32#".#"#5463235654.54632Qm++jP_J?mT@<4?)++piIs)19B)ip++)@5   4    >۝Չ?$+$.4#le$*$MsL)3  &&F}^ S@b#GZ3DDDDDD+O[ +gUUUU UPUpUUU<[+fTEEA7_04  ?40J# H#A_&?32+2?33/]339/3329/^]q99//9/]]]32910#'##'##'5"'6632#"&'##"&&546632&&#"3267332>54.R"21#12"P<^*L;Qw}@?ƈoIKnƁ?@}wQ;L)_733>53#&&5R"21#11#P& w ZrA%\uw  gggg\JVW3:AE  !cg\gT 5 }#T@Z@H ` p  @ H %%[f$!_ _??3?3]3/+]]9/+^]10"32>7##"&&546632&&k{C;vv-(%LWlON?'QډۖN bln,* .qo^>@%G@H !_!!!HV QQ ?3??3]]9/+10.54>32.#"3267##JLfN268<;>h#?Ֆۉ>"  Zhy %@g               O@   `p@M H 0       @ H/3/+39////]]]3/q3/q3/93/9]3/2/+]39////]]333310^]]]]%'%7%7%LG㴁FGJ{J;{Z}9IĤ{B  H@ H   /2/2/3/^]33/3++10#"&54>3!6632#,08( %-08*+9,338% -1269)B@ @ H @ /]3/3/+^]3/]102>32#54&#"##5Nwp:m|:.*eyUf$+$el#4.$+$5 @ ?O?O_/]/]29104632&&D;/2%97'>737.'.'57>7'>7'.'7.'7  #a ;  #a #&UWW'*][W%h'UWV'*][W%"PTV(E%ONI#OTV(E%ONI+)'$C342j('%C442#'UWV'*][W%&UWW'*][W%  #a ;  #a )'%D342)'%D342"PTU(F%ONI#OTU(F%ONIh1@H0&&&& &0&&&& Ze333 303 Z d2&@ H,!H@& H& _H H ) ?33^]++?33]++??3/+]322]]]22339/39/]]]q3/10!46767##3333##".'332>7d1׮Ïڦ1]dgX*2L5+I7"8ALMF>CDJLhMwP)'OwP9H),G5%@:4    H F U'''''''' 'P'`'p'@% HFT&@ H   `?22?33??3/+]322+]_]]22+339/39/^]3/10!#333##".'332>7 {zG1]dgX*2L5+I7"jJdP}NvQ)'PwP9I),H5/3!R@,Z  [g#!_ _` ??99//^]]32/9/39/221032#!#5353!!32654.##~7<~†;Š.[]NBqWap=`@Fa<!a@;GW#o####GT"PP@$HP??99//^]q+32322]9/10!!!2#!#5353!2>54.#d/eq97^C&!A`@!M|X/)B01B(3"@O [(8Hg$$@$$ Z d#" `0 @  "` ??9/]999/]39/]9932^]]]]99//39929910'###!23267'76654&##3/K6nj]|j~32'"3267'7654&;`M< ;M`<^n-HԌDN .^^)ek7Lj/ @/@ H?Z  @& H _ / ? O  ?  _ ??9/^]q32/+]^]32]3/+]q9/]10!!!##53P} J n@ 0p GH@! H O O_@H P??9/^]+]32/++]32]3/]9/103#53!!!!\Z&f@A "[(((((@( Zd' _` / ?  ?   _??9/^]q?32/]]]9/10^]"#!!6632#".'53 4.%<G-WRv1ND=?HwC{ \O  y~@ J#\@9 "")" H%%%_%%%GT$ Q PQ???9/^]329/]q9/10]"&'532654&#"#!!6632)Kj.+jBvu>\Z;fL@o % 5J>۝Ո@@W@H H @H H  Z Wgw@ HZt@' H 0`p @  _?22?3393?3/8333^]]_]]]q3/+]q33/+8329/_]]]]3323^]++]++10!##3333#!  ð<<<J@l'7)9& 6 ' 7 '7'7'7@H H @H H  F @ HFH@ H@ H0  @  `?22?3393?3/8333^]]_]+]]qq3/++33/+8329/_]]]]]3323]++]++10]]]]]]]!##3333#CDXXOŮ--5e}HB&HHB %+55DBR^&HB)!%+55@Y@H H*@H H*0@Z Z d @ H H   _ ??3/?399++2]3/^]323/^]]8393]+]+]+]+10%3###3735l=yr%3+J@j@H H*@H H*FvmU+;K  G T  P ?2??3933223/]33^]]]]]]32]+]+]+]+1033###3aKfKJ_}-J@]HP`"2B@ H Z4TW  d/   0@   ?2?399//]99]]]3/^]83339/]]3]22]210+]]+!###3733wwAdbce#J@ H H@W H &/? GT  0@`  ?3?399//933^]q3/]833329/]]]3]22+10++'#3733##mm}P}{J{F I'/@@f@P Z d/_  H@ H ?2?399++9/32]]]3/^]833/833229/]9]310!###53533#73=yr`{3@ GH@5 HT  5  O ???9/32399]3/^]]833329/++q29310353!!373###{%om^ui%RZDW@3 Z 0@   _?2?399]3/^]8333/9/]29310!##!5!73D=yr%3)J g@@ G ` @  P ?3?393]]3/]833]3/9/^]q223103##!5!`LJ-c@?Zt Z @ Z d_    _??3?39/^]2]_]]23/]q10%3##!#3!3gVhJy@RG  G  $0@PGT P/  P?2?39/^]]]?2]_]]q3/]3/]210!!#3!33#߶!J9P}H ]@; Z@    0@`Zd _ _?2?9/^]3/2^]q]q9/210!#!#3!!!gVhJ h@!G G T  @ HP/ ?2?39/^]]]+]q3/9/2210!#!#3!!!;߶!J9ǚ'_@:  Z!!%[)o)$Z%d(`/??%#_&!%_ ?3?3?9/^]q]9/29/10^]6632#".'53 4.#"#!#!I.VRv1NC=?~IwC|kK3{\O  y~@  uJ$w@N ##Gw H &&&O&_&&&&GT% Q PQ?3?3?9/^]]]q9/]]]q29/10]"&'532654&#"#!#!632Kj.+jBvu>d:?fL@o % 5PJ' >۝Ո@}>Rz@PN2I[  5 5 ?[gTTTOT_TTTT+[fSD`N:: :`:p::::&_!20__?3/29?39/]99^]99//]9103267#"'#"&&546632.#"327&54>324.#">o'AU-6Q%FO&2|32&&#"3267&&54>323267 *9H8=>ALE9(bGuz?73Fq  ǼqN.d^OO^d.17@@ HZ w @ H  @8O_ _ ?3?9/9323/^]]]]]]]q83/]]]839///+]]329=/+]103!!#!5!53TB'ٻ&B=X3J@GH@  HPO0@O??33^]2?3/83]]]]]]3/++839/]]329=/10#!5!33>73!Fs  Ǽq cJ.d^OO^d.1@GH           0 HZ  @ H 0 H @@ H @('   _??3?399]]/8333]+]_]]3/^]33+]q/+]q832+]q9=/3_]]10%3###33wZLN[{/L#J9@%Y V  H= )    F @qHjzEUeuJZ@H;K' 4D(; H@I H`euJZ ;K( P  ?3??399/]]]]]]]]]]3/+3+]99//]]]]]]+]]]]]]]]]]]]+9=/32]]]+]10]]333###e3fg}L`@ ZZ@DH/O @P`Z   / _ o  0 @ P  @ H  _ _ ??2?32/+]3/^]2/]^]]]3/+]q3/10%!33#!!5!!q^_)mJ GGH@3 H/O` G`p@H P  P??2?32/+]3/]2/]^]3/++3/10#!!5!!!33m5}P1c@  ZZ@,H/O_Zd_ _???39/3^]3/+3/]210]%###".5332>731:ica1]e5i{-Z^f8V" 1^YGst Ja@  + GG @%H_G TP P??39/3?]3/+]3/210^]!#".5332>733#H,PU^:NzR+-PLM*0 /TsDf+P}p@. Zep/ Z`p@ H _??39/3/22//+]]]]29/^]3210]#".533336673##P!]e5i{ 8vDBw91^YGstX "JV% Jk@B P   $  ZU` ZT 0 @    _??39/3/22/]]29/^]]3210^]10#".533336673##/NzR+}/[32Y2}j/TsDf-0##3P@6 Z e/_o Zd_ ??39/]32]]10^]36632#4&#"#Ǻsb]e5h{-Z_e8--1^Y/su 9J?@" HGU` G TP  ?2?9/32]]10+!4#"#3>32\-PLM*,PU^:NzR+,+J/ /SsDZ=+6d@>2[ g888) """1 [p7 `1O++++%+%+%_,_??399//^]]q32]223/]]210>32!3267#".'"&546733"!4.f [ݍֈ>%?tp[*[i|L\  g[nA%V9[kEz†G,  auz*B>#aA~xuC3^,5@+1H'W7777770H @P@(H6P0+ +    "-P"Q'?2?99//^]]]]32+]q22/]2]]]210".'&&5467333>32!32>7"!4.5kK 11LtZcn;L3WQL'(MQW`r 9YFǁor'?:"/1lu>Gnq ۜDqP,=.9r@FZ"5[ g;;;, %%%4 [p"""":" `4O..?..(.(.(`/_???3399//^]]q32]223/]]29/10>32!3267#.'"&546733"!4.f [ݍֈ>%?tp[%NXd:ĊM g[nA%V9[kEz†G,  smuz*B>#aA~xuC3^-6@0G 2H-$W8888881%H   @ P  @+H 7 %P1++(.P(Q-??33?99//^]]]]32+]q22/]2]]]29/10%#.'&&5467333>32!32>7"!4.BLTc8 11LtZcn;L3WQL'r 9Y5 #uToor'?:"/1lu>Gnq DqP,Rd,i&6R@ & %+5+5&6@ &%+5+5%g@?![  @ H ''@' Zd&_`/ _  @H  ??39/+]33?323]9/+839/10"#3332#".'53 4.FA\(5VRv1NC=?HwC|o<XU엪O  yv: J#r@G "#### H%%_%o%%%%%%!!GT$!Q "Q ?3??39/^]3323]q9/9/q8310]#"&'532654.#"#33+^xE?oWLi/,iCvu#JrN U)j@ДՈ@%j`- PJ V#s@FHZP!""Z# %%%%%%%!_` _????/^]]229/39/^]]]38]+210!!#"&'532>7667!3# !!5OnN#J: 0>* '+Ï٥qQgo; ?bu69:fJX@8F`p4 GU  P OP????/^]]229/39/]]]10!!#"&'532667!3#@_V17YE3Tz{iuoP}K@+ Ze Zd_ _?2??39/^]2]]]29/10".'53265!#3!31ND=?HgR  VhݪO ;Ji@ GU 0@P@(HGTP/Q?2??39/^]]]2+]q29/10"&'532>5!#3!3Li/,iB;[=߶!?o %-aiJ9Ո@R@2 Z @ Z d_    _??3?39/^]2]2229/310%3##!#3!3٦gVhJv@O G  $0@PGT P/  P?2?39/^]]]?2]_]]q]2229/310!!#3!33#߶!{zJ9P}Y@!ZZep/Z` p  @ H _ _ ?3??9/3/+]]]]22/10%#".5332>73##:ica1]e5i{-Z^f8" 1^YGst J'J@@%GGU` G TP P ?3?9/3?]22/10#".5332>73##3H,PU^:NzR+-PLM*0 /TsDf+69@, H H   H9Z! !!! @ H&  Z d _ @ H  H ?33+3??3+22]+^]]2222]+9/3993+3+10]]!##!3!3##4>767##EÐ٦AJI?9Xw=ABGIJ$@Z "##F$!  &&&0&@&P&&&FT%";K[ + P4DT%?2]]?33/]]3?2^]]]]]2229/393310!#.'#3>733#o  ٷ{z9;6P 1;>JG"C<21;A!P}Rd,i&$6!R@ &%+5+5^&D6@ 8&%=3 "%+5+5+&$j!R@ &)%+55+55^&Dj@ <&/3G "%+55+55V^D^i&(6R@ & %+5+5q&H6@ -&2(%+5+5q)I@/$[g++++++@ H%[f*%_/_ __ ?3?9/]2+]210"5>32#"&&55!.2>7!y[*Zi}LTQ薙ׇ>@sC[mB&U),  l髮hkFzGfA~xuDf^'C@)"HW))?)#HV(#PP Q?3?9/]2]]2102#".55!&&#"5>267!nIBxfcn;3WPL'(LQW`s 9X^J҇֕NGnq  %DqP,q+&jFR3&Ӵ*>%+55+55f&j1&(<%+55+55+&jR@ && %+55+55&j&&%+55+55H+&jRC&:N %+55+55DR&jUC&ٴ:N)!%+55+55H r@-[[ @H  [g""p ? O _  _@ Hx` ?3?9/^]]]33+2/]]]9///+10#"&'532654&##5!5!sGC͉nU+`cc.Ϻ{=;5df`t@"-$ ѦuJ$d@>J J$$@H!$$! GW&o&&0&& @ H $!P" H"P ?3?9/+332/+^]]]9///+10#"&'532>54.##5!5!_}IGss:N[f6GwV07cTmAulnI$".W}NV}R'}횅&MR& %+5+5;o&M9& %+5+5+&jR!&, %+55+55;&j%& %+55+55}q+&2jR@ 1&(< %+55+55q-&Rj)& 4 %+55+55}q~q-^}q+&~jR@ 3&*> %+55+55q-&j@ +&"6 %+55+55;D+&jR.&%9 %+55+557B&j80&ʴ';"%+55+55&M'R$&"#%+5+5 o&\M@ %&#$%+5+5+&jR+&"6%+55+55 &\j@ ,&#7%+55+55s&SfR@ .&Q"6%+55+55 !&\S@ /&Z#7%+55+55+&jTR@ &* %+55+55&j@ "&- %+55+55 d@ @5H / O o  @HZZd _ _???2/^]]]+]3/+_]]q10!3##ð J N@2 0  p  GGT P P???2/^]]]]]]3/]103!!3#\ZJ}+&jR@ '&2%+55+55P&j@ '&2 %+55+55/m& <5m J&  <5m&;#H%++5#mJ&[P%+]5`@'FVI Y 69  0? @ p@' H/_ ('   ?3?39/99]]32^]3/+]q833/83/833/8399//]]9=/33]]]]10##!5!33!LNL{^/#J@ 6   9k{W:JdtX5E     6  @H @Hk { W : J  0 9k{X5E O +[k ?3?39/^]]3322/]]]]]]q]]q/]]]++]]]q9=///]]]]]]]]]q33333]]]q99//]10!33!!##!hJJ{f1L@@)Z e[f_?Oo_ ??9/]]]2104>333!".#"337Ϙ~<][.WqBhJ=p_33332>5#"32>5;-[^r+?Rg?Aזzga,H3][-~C[8PQf:aM&?.gr<hpi9P2CkM%>M)qZ2C\@9,8GP...GUEoEEEEE@EE/EAHVD3>P% ,3P ?332??39/^]]]9/]2910%2653#".'##".54>323&'&&53!2>754.#"ob/\[AgQ=D[yQ]n<jN-.^_)ek7ND?@V [ [+%  ++ 3Z6eAAAAAAA A0Ap?O@%`444x0_;`?3?9/^]]]]3/]93/]]]]9///9104.##532>54.#"'>3232653#".)5e]\a2%D_:nK\&btGmq93[}KW^22O7ob8fYWl<MmF!'Hd>6S:C6}6)6aOJwX9  9YwHJhAw-ib./dP^;@#G F16111'G U====0='@)H_'''<6P  &#P,P??39/^]]]3/93/]+]]]q9///91032653#".54&##532>54&#"'>32R1P;i`/_`\d5a=dH'slGK?(MRZ5Vi:3F+2S<"L'I8!5ib.+T{O^['@-MM&" &JmF2M;) )>RN1@T[' " " Zp....Z//333333 303p?O20'`  x   `._??39/^]]]]9?3/]]]]]q3/2/]99//910!#4.##532>54.#"'>323#8g]\a2%D_:nK\&btGmq93[}KW^2CdA 'Hd>6S:C6}6)6aOJwX9  9YwHP^-@ F"G))-G *0*@*`**@H**////@-H_.+"PO_ P)P??39/^]]]]9?3/]+]3/+]2/99//910!4&##532>54&#"'>323#a=dH'slGK?(MRZ5Vi:3F+,R?&+^e'@-MM&" &JmF2M;) ,B[=}1@eZHH1ZP$Z'e3O3o33333 33%%_!`, ?32?9//]]]99//^]]]]3+]+]q2]10!#"&'532>7667!32653#".5 !!5OnN#J: 0>* '+cnob8fYWh:qQgo; ?bu69:сww-ib.,`lJ(\@9F(G$ GU****  P O#?32?9//]99//]]]]]]10!#"&'532667!32653#".5@_V17YE3T1P;i`/_`\f6iuo=AbA 5ib..bi-\@7ZZ e Zd__???39/^]3/2]]]]9/]21032653#".5!#3!3bonc8fYXh:fww-ib.,`l-VhJl@GG GU!! !@!P!!!!!!GT P/ P???39/^]]]3/2]]q9/210!332653#".55!#d!1P;j_/_`[f6߶J9=AbA 5ib..binJ}R*G@)** )[@ Hg,,p,[ f+*_$_$_??39/]]2/+9/10!#"&&546$32.#"32>5!;BޜV_ oXH$SX].zB6pul])V[ii,*Qډ؜VBwdq{^(@Z(( 'G@ HW**$****@*P****H V)(P@H +"P"P??39/^]]]]+]_]]q2/+9/10!#".54>32&&#"32>5!{9xˈDLۏoM><[ae4)V^QtJ#JDȉGOӄӔP%'):mb]p>-PpDe@/Z eOZ@Wgw@ H__??9/2/+]3/^]]2/]]]]1032653#".5!5!!qbonb8fYXi:^_ww-ib.,`l)oJm@J GU0@`G`p PP?2?9//]3/]]2/^]]q]]]q105!!32653#".5)51P;i_/_`\f6AbA 5ib..bi5o 9][4@.H/ ';; [/f:4`x#`&*` ?3?39/^]]]9]2/99//+9104>32&&#"33#"3267#".54>75.;smH{iZ&\Kg9_D&,WWÿ]e5lSSÃB1_WJxT-`Oa6)6}6C:S6>dH'!CeC1+&%7#".54>75.54>32&&#"3)F`73aWML%+5+5q&`R-&6D %+5+5}%&_g\8'5;%+5+5q&`g0'-3 %+5+5&8g/@ ' %+5+5J&Xg'! %+5+5&8fR@ &- %+5+5&Xf@ !&0 %+5+5Ns&avR1&%+%+5+5y!&bv`(. !%+55Ns&aC=R%&+%%+5+5y!&bC.( !%+55N&afRY:%%+55y&bfV=( !%+55N5&aR`R-&G.<%+5+5y&bRN1? !%+55N&ag/('H%+%+5+5y&bg+'E(. !%+5+57&<g ' %+5+5 J&\g2#)%+557&<fqR@ & %+5+5 &\fJ@ )&8#%+5+575&<RR@ & %+5+5 &\R@ +&,:%+5+5q&BҴ:9 #%+5! -@@P?O_/]32/]]9/10#.'53#.'53d#QM?*/0d#RM?*/0SXQ#PQLSXQ#PQLjR@1 @/?O/_  _/]3]29//]99=//]]3310#&&'#56673'>73#d3l46j3e3u00t3N!-j7e"T00T";EE;-.4!3232673o3t00t3d3j65k3d$GE@(*]0A*%JE>(*\0A;EE;"T00T"Z"*20Q;!"+10Q;!s 2@ /   _/]322//3]29/10>73#%#"&'332>7^ -j7eo+MnFl0D,$A3!,.5!7d8j- +MnFl0D,$A3!,g<!5.,7'#'6654&#"5632+MnFl0D,$A3!+".V 8A9,' :dc7'".#"#>3232673+MnFl0D,$A3!/$GE@(*]0A*%JE>(*\0AE 4 Z fNo g .8*f 4 h    *  ,D p  ( F 8 \L \ TDigitized data copyright 2007, Google Corporation.Droid SansRegularAscender - Droid SansVersion 1.00DroidSansDroid is a trademark of Google and may be registered in certain jurisdictions.Ascender CorporationDroid Sans is a humanist sans serif typeface designed for user interfaces and electronic communication.Licensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Digitized data copyright 2007, Google Corporation.Droid SansRegularAscender - Droid SansVersion 1.00 build 113DroidSansDroid is a trademark of Google and may be registered in certain jurisdictions.Ascender CorporationDroid Sans is a humanist sans serif typeface designed for user interfaces and electronic communication.http://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ff  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~.nulluni00AD overscoreperiodcenteredAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflexCdotcdotDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexGdotgdot Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentmacrontonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygrave afii00208 underscoredbl quotereversedminutesecond exclamdbl nsuperior afii08941pesetaEuro afii61248 afii61289 afii61352 estimated oneeighth threeeighths fiveeighths seveneighthsDeltauniFB01uniFB02 cyrillicbrevedotlessjcaroncommaaccent commaaccentcommaaccentrotate zerosuperior foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200BuniFEFFuniFFFCuniFFFDuni01F0uni02BCuni03D1uni03D2uni03D6uni1E3Euni1E3Funi1E00uni1E01uni1F4Duni02F3 dasiaoxiauniFB03uniFB04OhornohornUhornuhornuni0300uni0301uni0303hookdotbelowuni0400uni040Duni0450uni045Duni0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni20ABuni030Fcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecombbrevegravecomb brevehookcombbrevetildecombcyrillichookleftcyrillicbighookUCcyrillicbighookLC  ,latnkern:LZZ 2 "  >$ ~`!6#h'L(h(h(n(h())0)6(h(h)H)V(n)))***L+++.$.$+0f2 "4544$$$$67D7D7D7D7D~88889(h(h(h(h(h(h)H(n>b>b>b>b>l>z>z>z>z>z)H>>>>>@$ 2(h 2(h@B(h "(n(n(n "(nA(h(h(hBR(h(h$BX$ )6A(h(h(h~)H)H~)H)H(n(n(nCB(nDLDLA````)#h*H''M8PN 2(h(nQQJQXQRR&RST(UXXYZ Z]^__`d@de e~eefpj*j0(hjJj*jjjjk(hkzkkll6lDlZlDlllll)Hm,m>)H)Hmnnodrs4sJstudv*vxVy||}JX$~v ڏ 2t,(^ $J(n"h(n(n(n*48>&)))#h*ڡ 2 2t$ (yy􀒔$(~$( $($($ 0ڙ(~(^v*ڙ(ڙڙ^v*$(^ ڙڙڙv*$$sJv*ڙڙڙsJyytt$($($($$($($($( ^^ڙ$((ڙ$($($($(ڙ 2 2 2 2 2 2 2 2 2 2 2 2(h(h(h(h(h(h(h(h$$~)H~)H~)H~)H~)H~)H~)H``#h*#h*#h*$,)7R9R:f;)<R=)FGHJRTW)Y)Z\)\))))R)))))$R&R6f78R9):R;)=)?)C_iqRy~))))RR==R=)R))fffR)(X`jm)rv=)))=R)R)R)R)=R===)=)=)==  ))R)!#%')+-/1368:<>@BDE)G)JLNPRTVXZ\^`oRp)qRr)sRt)-{{{^&*24789:<$&,02468:fmq_al~IKMOQSUWY[]_acegikmoqs7qrvc &*24789:<$&,02468:fmq _al~IKMOQSUWY[]_acegikmoqs,79;<$&8:qEGoqs;) ) )&*24@)`)fm) )_l~IKMOQSUWY[]_K$,79:;<=$&68:;=?C_iq(Xr!#%')+-/13EGoqs9= = )")$9:<@)`)68:C_i= =(Xr!#%')+-/13oqs9) )&*24fm) )_l~IKMOQSUWY[]_9) )&*24fm) )_l~IKMOQSUWY[]_c &*24789:<$&,02468:fmq _al~IKMOQSUWY[]_acegikmoqsK$,79:;<=$&68:;=?C_iq(Xr!#%')+-/13EGoqs533$&;<=q8:;=?C_i(Xr!#%')+-/13oqsK$,79:;<=$&68:;=?C_iq(Xr!#%')+-/13EGoqs 7$&q R R")$&*2467DFGHJPQRSTUVXYZ[\]q  !"#$&79@CDJ_fimqy{~R R(XY_`jlmr~  !"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprt#$C_i(Xr!#%')+-/13R R")$&*24DFGHJPQRSTUVX !#CDJ_fimy{~R R(XY_`jlr~  !"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnf f$&*24DFGHJPQRSTUVX] !#@CDJ_fimy{~f f(XY_`jlr~  !"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjln) )&*24FGHRTfmy~) )_`jl~  68:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`R R")$&*246DFGHJPQRSTUVX[\]q  !"#9@CDJ_fimy{~R R(XY_`jlmr~  !"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprt9) )&*24fm) )_l~IKMOQSUWY[]_ = == =&f fYZ\79f fmprt) )J) ) ) )) )[]@f fDJDf fY"$&(*,.024R RWR RR RIR R6) )R) )`j  JLNPRTVXZ\^`= =I= =2R`j  JLNPRTVXZ\^`qx)qrx DD"&*-^24789:<=;IWYZ\^$&,0246789:;;=;?;fmq^ _alm~IKMOQSUWY[]_acegikmopqrst DD"&*24789:<=;IWYZ\$&,0246789:;;=;?;fmq^ _alm~IKMOQSUWY[]_acegikmopqrst DD"&*-^24789:<=;WYZ\^$&,0246789:;;=;?;fmq^ _alm~IKMOQSUWY[]_acegikmopqrstf f DD"&*-^24789:<=;WYZ\^$&,0246789:;;=;?;fmq^f f  _alm~IKMOQSUWY[]_acegikmopqrst9) )&24=fm=) )_l~IKMOQSUWY[]_7) )&24=fm=) )_l~IKMOQSUWY[]_ $C_i(Xr!#%')+-/13V $,-679:;<=@` "$&68:;=?C_iq(Xr!#%')+-/13EGoqsB$0=D;=?CD_i(XYr!"#$%&'()*+,-./01234.R R = )")$&*-02467'9):@=DFGHIJPQRSTUVXYZ[\]`=q  !"#$'&'679@CDJ_fimq'y{~'R R(XY_`jlmr~'''''  '!"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprt   o oI[]@ a= ="FGHIJRTWy~= =  `j  68:<>@BDJLNPRTVXZ\^`= =I= =d &*-24789:<$&,02468:fmq _al~IKMOQSUWY[]_acegikmoqsf f "@ERKRL=M=NROR`R )=RRRRRR -f:) )&*-R24fm) )_l~IKMOQSUWY[]_B) )0679:;<Y\ "#$&689:q) )mopqrstR R")$&*2467DFGHJPQRSTUVXYZ[\]q  !"#$&79@CDJ_fimqy{~R R(XY_`jlmr~  !"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprtR R = )\")$&*-02467'@=DFGHIJPQRSTUVX[\]`=q  !"#$'&'9@CDJ_fimq'y{~'R R(XY_`jlmr~'''''  '!"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprt) )&*2468FGHRTYZ\ ",02479fmy~) )_`ajlm~  68:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`acegikmprt3R `j  JLNPRTVXZ\^` b)fi)mqrsux)fms _dglpqrtwx$m_bfisvyz{}~qrxy}~)O &*24789:<$&,02468:fmqrsux _aIKMOQSUWY[]_acegikmoqs79;<$&8:glpqrtwxoqsq &*24789:<m}$&,02468:_bfimsvyz{~) _aIKMOQSUWY[]_acegikmoqsR R")$&*24DFGHJPQRSTUVX !#CDJbfmqrsuxy)R R(XY_`!"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnfms)F$,79:;<=$&68:;=?C_bgilpqrtx(X!#%')+-/13EGoqsfms)*) )&*24fms)) )_IKMOQSUWY[]_ ")$&*24789:<DFGHJPQRSTUVX !#$&,02468:CDJfmqrsux (XY_`a!"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoqsfm)F$,79:;<=$&68:;=?C_gilpqrtwx(X!#%')+-/13EGoqs633$&;<=q8:;=?C_bditx(X!#%')+-/13oqs)) )&*24fms)) )_IKMOQSUWY[]_R R")$&*2467DFGHJPQRSTUVXYZ[\]m}q  !"#$&79@CDJ_bfimqsvyz{}~=R R(XY_`!"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprt-m_bfimsvyz{|}~) _bgiqrtwxfmsy|}~ _biqrx,) )&*24fms) )_IKMOQSUWY[]_R R = )\")$&*-02467'@=DFGHIJPQRSTUVX[\]`=m}q  !"#$'&'9@CDJ_bfimsvyz{|}~)R R(XY_`!"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprt)y~y|}) = =I)= = = =y= =yz}~)R Ry}~)R R ) )y~) ) = =I}== == =I= ==~)[]@~)[]@)R RI}))R R[]@R RIyz~)R R[]@y}~)8) )&-=24=) )_l~IKMOQSUWY[]_=  mv|} R R\&*24789:<$&,02468:\\=\R R_ajklmr}~q\ \  \ \\IKMOQSUWY[]_acegikmoqs) )) )l}~m}7) )&*24 )_l~IKMOQSUWY[]_4  v|} 1  v|} m}m) )&*24))) )_jlm}~)  ))IKMOQSUWY[]_gR Rq)\\RqR Rjkr})))))\  \)\ &*24789:<$&,02468:=))))) _al|}~)) ))))IKMOQSUWY[]_acegikmoqs*|} !79;<$&8:voqsR R\\\=\R Rjklmr}~q\ \  \ \\B))))))f)lr|}~)) ))))1= =))))= =l}~))))))&) )) )| L) )&*24=)))) )_l}~))))))IKMOQSUWY[]_V$,79:;<=$&68:;=?C(Xrv!#%')+-/13EGoqsE= =33$&;<=q8:;=?C= =(Xr  !#%')+-/13oqsB) ) )&*24@)`)) )_l}~IKMOQSUWY[]_RR R")$&*2467DFGHJPQRSTUVXYZ[\]q  !"#$&79@CDJqq)RR R(XY_`jklmr}~q    qq!"#$%&'()*+,-./0123468:<>@BDIJKLMNOPQRSTUVWXYZ[\]^_`bdfhjlnprtc= =)qq== =jkr}q    qq*rv.) )=))) )l|}~) ))0)))))f)r|}) ))>=))))=))f)r)|})))))))) )))) q |    | #vv m}!m}$= == =m}){}  ) )) )j}  = == =m}!) )) )j}  "[]@m= == =j  0R RIR Rjm  $= =I= =j  []@}j}  )))f)})))=)f)})))qm}= =q= =m} j  ==!m}m}) )) )j  j  R R\&*24789:<$&,02468:\\=\R R_ajklmr}~q\ \  \ \\IKMOQSUWY[]_acegikmoqs7qr$,)7R9R:f;)<R=)FGHJRTW)Y)Z\))))R)))$R&R6f78R:R;)=)?)C_iqRy~)))RR==R=)R)fffR(X`jrv==R)R)RR=R=======  R)!#%')+-/1368:<>@BDE)G)JLNPRTVXZ\^`oRqRsRE=IfK=L=M=N=O=WfYfZf[)\f])pfrftfE=IfK=L=M=N=O=WfYfZR[)\f]pfrftf   $')) ,, ./ 257>DFHKNN!PR"UW%Y^(mm.}}/06@EKW]clmpqrsvwxyz{}~  !$&',,0022446;==?@CDJJVVZbddfilmo|~ )  *((+XX,``-bb.jj/lr0tt7v|8~?NWYgwxyz~ !!##%%''))++--//11336688::<<>>@@BBDEGGIVXXZZ\\^^`accffhhjjllnt latnLICENSE-DroidSans.txt000066400000000000000000000261361214765240700342130ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/fonts Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/images/000077500000000000000000000000001214765240700306675ustar00rootroot00000000000000background.png000066400000000000000000000103201214765240700334310ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDR szzsRGBbKGD pHYs  tIME*tEXtCommentCreated with GIMPW+IDATX  Xw>3IENDB`backspace-icon.png000066400000000000000000000011341214765240700341570ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh=JAzHn hJ0$rtXYBjk%g,fffW恏lf33n"BY- +o |S{y q xeYy ] W[=WEɜzS0G5GlS c1PY@@/|h9("-""2S1LM4EA596Ul("mmuXE>?{V\"V^\QNXl:tʚRaTքD}FuإG-4qUQVl%tJC$dx@%WZ &M0`7?sKىIENDB`close-icon.png000066400000000000000000000010141214765240700333450ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDR00WsRGBbKGD pHYs B(xtIME (4aIRIDATh홽J@'"WURio`#((> ٫o`!*S,،09%e?2iMnF+د dlZH xN:{VSꮁi_ %n~^J#pelK%_\@[Nn fCM"PP@#-$HlflH|zk7^m`xWkq?\s $َI2]0}~\NSy-zAOM3W@iưAqr3GF)/ߴgbueDŽlt#; N=3y lB " !4X,`=}.CMHƢMB$g:N@:  0^t@+2XHXHHd:20^t@9` L2%:\1򽬐luw|>UDIZ]]-N? jzossznFpW/J+r,|'#NzIENDB`extended-key-background-pressed.png000066400000000000000000000015771214765240700374760ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDRY$_&tFIDATxk\eg~vl3%rL$؀ʅ5Vq۸q%]ɠ ggMČc 1)I::q.Z}s,y$B$VWW?n4z!O V\$s\\ANgV}ޜ6TŇY׍ _P{lZWbEQayy87UB[Y׋>?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?h%-$bQw 7!:tq'p{$ 1P!7' (#xç&wp1{ iƷ zfQ*t 맠7pMFIKx\ c*Uz@΢pOAOwS;Ǧ:j yEVŰMFzcX` lޞ.IQU:Q7bu=TFz,i[&aFpOGYJG棧JGӑ8V:Б8.$H{:1t$=cOG88ı#qt$ JG:DžcOG88ı#qHWБ8t$=J:Б8o!J+3k҄`Ĵ,qRͺ|>۶xh,PTvZYPX@TBV{jnnnX׿wttoN,h\.cccqZ}\ׅ8P{ q/eeX,Q 돷u֟*]fvR3۶*nV{ZV MIENDB`key-background-pressed.png000066400000000000000000000015771214765240700357000ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDRY$_&tFIDATxk\eg~vl3%rL$؀ʅ5Vq۸q%]ɠ ggMČc 1)I::q.Z}s,y$B$VWW?n4z!O V\$s\\ANgV}ޜ6TŇY׍ _P{lZWbEQayy87UB[Y׋>?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?h%-$bQw 7!:tq'p{$ 1P!7' (#xç&wp1{ iƷ zfQ*t 맠7pMFIKx\ c*Uz@΢pOAOwS;Ǧ:j yEVŰMFzcX` lޞ.IQU:Q7bu=TFz,i[&aFpOGYJG棧JGӑ8V:Б8.$H{:1t$=cOG88ı#qt$ JG:DžcOG88ı#qHWБ8t$=J:Б8o!J+3k҄`Ĵ,qRͺ|>۶xh,PTvZYPX@TBV{jnnnX׿wttoN,h\.cccqZ}\ׅ8P{ q/eeX,Q 돷u֟*]fvR3۶*nV{ZV MIENDB`key-background.png000066400000000000000000000015471214765240700342320ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDRY$_&t.IDATx1kGљ/DHQĨZ0 :$&![GWw/]ފh*_dcKV%$*:@&[<, I|>϶ZI|? f 0LH" $VXY:Nt3++++++++X:]K{||tc`G^aǥK; ;. v\: ++++++++X: tc`G^aǥK; ;.X:+xvvvvvvv\:v,xv\:رt#yv,ve; ; ; ; ; ; ; ; ;.IZYYYڳ`yIRj<]r\;YZt:iτ%WbJ8onnxT*տ+'ٽ?{޷Q}v4KjU666~ $h<Bp@IT0y* *˪jZ__WZ}$euI$?{^x\Imb,\..J8=}fCIENDB`return-icon.png000066400000000000000000000015301214765240700335620ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThk\UOҤ5-mM%HѶHcj֍ .IAW. .p–ZBX5좸A\ 6P Fcr]i3s=3|yg}}˲ZP7=u3{w $w8n.)\Ɔ1[J$`cxm&p b4ן`)o`UOa#+Ƅv|&|>e<ϱ9L RF.!-?eT F 6<ď ɯ` D[wGI%-|[hc>EaoܽȲ]̲Je?EeHØSq+YntoO~Dm{j̯PfC ,tEYއR%U[?:!\TV@+&o20 SnǩzufKUHq2^ŭ hqD&oДeN?&KY(M销nzf ,ĠjIENDB`shift-icon.png000066400000000000000000000007451214765240700333670ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<bIDATh혿J@KRZrO`aqVXf$~0ff4 cf;P7E"M衖2RRfV5̥$,4gf*~#_HIG2oRf9+fC* ,JvT)ᕬ)C+$b4S+Y$b `l*̤w!kA$N[_M2\}@_x Ob;`Yjk`'*_>ۖ9"%ynR˕қ"Mx3z/q{cB`r Ty+z7E"UIENDB`shift-latched-icon.png000066400000000000000000000010041214765240700347560ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh혿JAɁZieZQ| kk"BI#lfAcnogp?be%,2Kh RfX @#)3 ~kf ?#IIpd¿HI 0 k;L$4.Xu%B*" &VߗuHxG6?  \TJDfADo>pT?vp|4 M-vGyNV~\V썀f"#pڜR& %Bطi}C|+ggZ11k~K5C,,, |](IENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/main.ini000066400000000000000000000105441214765240700310530ustar00rootroot00000000000000[background] word-ribbon-borders=0 0 0 0 key-area-borders=0 0 0 0 magnifier-key-borders=6 6 6 6 key-borders=6 6 6 6 word-ribbon=background.png key-area=background.png magnifier-key=key-background-pressed.png normal=key-background.png normal-pressed=key-background-pressed.png deadkey=key-background-special.png deadkey-pressed=key-background-pressed.png special=key-background-special.png special-pressed=key-background-special-pressed.png [icon] shift=shift-icon.png shift-pressed=shift-icon.png shift-latched=shift-latched-icon.png shift-latched-pressed=shift-latched-icon.png caps-lock=shift-icon.png caps-lock-pressed=shift-icon.png backspace=backspace-icon.png backspace-pressed=backspace-icon.png return=return-icon.png return-pressed=return-icon.png close=close-icon.png close-pressed=close-icon.png [sound] key-press=typewriter.wav key-release=typewriter.wav layout-change= keyboard-hide= [font] font-files="DroidSans.ttf" [default] landscape\key-area-width=854 landscape\key-area-paddings=11 landscape\word-ribbon-height=40 landscape\magnifier-key-height=96 landscape\magnifier-key-width=116 landscape\key-margins=4 landscape\key-height=56 landscape\key-width=76 landscape\key-width-large=93 landscape\key-width-xlarge=178 landscape\key-width-xxlarge=244 landscape\key-width-stretched=244 landscape\vertical-offset=100 landscape\font-size=24 landscape\small-font-size=20 landscape\font-color=#ffffff landscape\font-name="DroidSans" landscape\magnifier-font-size=50 landscape\candidate-font-size=20 landscape\candidate-font-stretch=60 portrait\key-area-width=480 portrait\key-area-paddings=4 portrait\word-ribbon-height=40 portrait\magnifier-key-height=120 portrait\magnifier-key-width=80 portrait\key-margins=4 portrait\key-height=80 portrait\key-width=40 portrait\key-width-large=56 portrait\key-width-xlarge=104 portrait\key-width-xxlarge=136 portrait\key-width-stretched=136 portrait\vertical-offset=100 portrait\font-size=24 portrait\small-font-size=20 portrait\font-color=#ffffff portrait\magnifier-font-size=50 portrait\candidate-font-size=20 portrait\candidate-font-stretch=60 [keys35] landscape/key-width-xlarge=118 landscape/key-width-xxlarge=160 portrait/key-width-xlarge=64 portrait/key-width-xxlarge=112 [keys36] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=286 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=112 [keys37] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=202 portrait/key-width-large=64 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=88 [keys38] landscape\key-area-paddings=1 landscape\key-margins=3 landscape\key-width=72 landscape\key-width-large=111 landscape\key-width-xlarge=150 landscape\key-width-xxlarge=189 landscape\key-width-stretched=189 portrait\key-area-paddings=1 portrait\key-margins=3 portrait\key-width=38 portrait\key-width-large=60 portrait\key-width-xlarge=82 portrait\key-width-xxlarge=104 portrait\key-width-stretched=104 [keys39] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-xlarge=111 landscape/key-width-xxlarge=150 landscape/key-width-stretched=150 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-xlarge=60 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys40] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-large=111 landscape/key-width-xlarge=189 landscape/key-width-xxlarge=228 landscape/key-width-stretched=228 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-large=60 portrait/key-width-xlarge=104 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys45] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [keys47] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [hebrew] landscape/font-size=35 landscape/key-width-large=160 landscape/key-width-xlarge=202 landscape/key-width-xxlarge=286 portrait/font-size=35 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=160 maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/sounds/000077500000000000000000000000001214765240700307355ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/sounds/LICENSE000066400000000000000000000002601214765240700317400ustar00rootroot00000000000000typewriter.wav Made by ddohler. (http://www.freesound.org/people/ddohler/) This work is licensed under the Attribution License. (http://creativecommons.org/licenses/by/3.0/) typewriter.wav000066400000000000000000005300541214765240700336220ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9-droid/soundsRIFF$WAVEfmt Ddata                                                                                                                                                       !!!!!!##!!####%%##!!!!%%))%%))''''''''%%))''++))--++''----//++--++))))++++--++++----++++))++++----++''))++''++''''%%''##%%##''####!!                IIEE)))) 77CC ''99-- ??QQAA-- ++--AAmm[[RR,,@@AA{{AA++339999zz ;;##--;;??3333EEMMSS99))MMccmm__33 99MM33 %%hhPPZZrr55wwwwII==[[]]OO-- ''3333''|| vvpptt !!~~jjhhtt33;;// %%++//77==;;''!!11==EECC77++  11KK__ggiiaaMM;;##    %%339955!!;;MM]]__SSKK==11 //EE__mmuuggOO// %%--//11//333311''    !!''//11//'' %%++))!! ''''  !!))))++))%%%% %%%%))++--33557711----''%%####%%))--11----''##  ##--775511##!!!!            ''))++))!!            ##%%!!  %%''--##      !!''))## ##''--++%%!!####))'' ##%%!! %%++55;;??77!! //AAKKEE;;//++))%%''))%% ##++77;;55//1155//5511//  EE]]99NN,,<<==mmccyyiiQQxx0088@@AAOOQQJJ..ZZSSWWtt XX33 UUMMjjnnzzdd,,vvuuFF11GGKKKKuuyyggaa[[++33??LLPPDDUU44 FF::kkuu88!!ggwwoo??EE..\\ ))$$OO##PPDDSS99""^^__||RR$$__HH44!!NN6622XXLL..BBTTUUMMDDNN__ DD00 EEddkk::PPYY''ff<>mm55ee..cc!!__  ((MM==00 ##]]mm??HHCCmmXX{{{{>>XX??GGGGRR--FFbb--ll||jj..++ CC''hhAAVVTTkkXXKKXXii,,TT##""OO<<%%qq33kkDDjj""]]22NNnn88gguuBBvvllffFFmm<<uu\\__aaNN HH::eeIIVV==ee++ PPmm!!CC||zzzz{{hhaa NNJJVV==llxxrrdd## UU\\RR@@ii^^((  11^^**oo //||zz??iillxxHHXX++ ''nn&&))@@==''wwӐ||K@K@r@r@a@a@ Ğ!!!!   ..U@U@c@c@I@I@ފжѨ 2 2a@a@c@c@r5r5]]??--||::##||EE77TT""""[$[$**֪PP;;Q@Q@K@K@,,ԴОI3I3@2@2M$M$ }}W W @%@%V-V- " "FFyy33>>gga a _ _ yyhhgg!!!! mmmmUU== --zz,,U U {{P P   X X OONN006 6 **%%++mmww++dd0077$$** Q Q 88TT((//mmwwWWRRUUAAZZZZ mmRRVVbb&&YYEE$$DDvv  ))%%99))ii33 PP44SSrr SS HH""11ZZGGmmcc//??kk``yy ~~ HHHHmmjjppk k HH__s s iiOO  ||)){{xxJJyyVV@@rr// TTD D AAGG.. p p cc$$kkXX__11LLzzzz<<llxxUU88kk<< }} ( ( ' ' GG))LLss..##mm11   bbSS e e AAqqNNuu55KK&&''33@@EE!!AAFF{{W W \ \ jj  | | qq}}WW jjaa^^QQ##}}oomm((x x nn ^^ FFMM2 2 rr__oo9 9 ttGGbbBBRR<<RR \ \   44##{{ppvv99hhssEEMM\\~~PPqqWW44ccBBxx  66ssmmkk//44aa,,++nnLLVV//__b b h h ]]DDDDj j   <>uu((aajjjj33TTUUkkcc++ff''::PP//aaAA..VV9911kk88ww((33ssuu<<55%%CCffzzEE]]||{{!!%%::ZZ RRdd((RRmmRRhh --33 >>``77((OOXXii44,,ff==DDSS55::]]  hhccPP&&8888||EExx__AAtt!!{{  mmUUll..<<[[ffXX2255ii""JJoo(())  GGffLLVVwwaaVVKKSS99IIqqHHRR""!!HHAA--%%WWUU""cc""''bbTTii22!!TT33ii||00QQ99tt ]]__55ii]]GGKKxx00::kk66""55EE11~~kkQQmmhh{{LL RRSS..VV~~**YY**jj[[jjII eepp**ee~~vvYYWWAA88ww-- 44HHccssppff22//ss77  NN]]''OOSSCCPPrr**11AA##''mm[[ff##OO mmxxOOCCEEPPkk99&&TT"" qqVVCC  mmzzZZ22ZZ!!YYVViiRRqq  ""ggSSdd**^^##ssQQjjJJ[[::hh33kk--DDcc||__{{11..9977rr;;JJVVMMTTPPuurr//6688}}EEyyjjqq!!%%NNJJ^^{{8800@@  ,,TT}}\\LL$$bbQQFFjj\\NNxx!!GG  33''00  55++ll66  WW))DDrrLLKK,,  kk||ttHH [[uu%%ttgg++33YY&&jjzznnUU))44WWkk33ddLL ""kkqqOO!!jjFF::AA33FF\\TTTT22rrpp66ccIIIIIIuuMM<>ee""\\ ^^GGNN8866]]RRbbddRR{{ss::$$aaggJJ!!00((NNhhss%%}}GG??ff)) vvzzGGEE{{##hhnnee<<((qqCC||$$xx{{33FFDDwwZZ ""aaTTEEqq ==ggPPQQjj..GG hhkkzz>>yyDDHH]]iiPP ..ttvv""(())//SSHH@@BBXXuu__||ii((BBff kkBB""ccbbxx22EEBB77!!jjHHLLXXzz]]**88KKWWdd88ccggxx&&@@88 FF%%??vvttyySS@@wwdd$$xxFFTTggZZ44WW5500PPBBoorrCCooZZJJRR&&VVoott@@## ttQQPP##GG  ``OOKKkkMM==uudduu88aa33ppHHZZccooss``,,ffIIww>>ffUUoo5555  HH..FFoonnMM  __<<33,, 22oohh 77 __}}FFii77ooeeww''9900uummjjAA##..PPoouuaaddTT&&QQ\\ff__ooTT>>TT&&hh..MMvv FF  44]]AAww  PP@@%%22LLxxBB  //DD%%TTww%% __eeFF }}UU  tt[[00ooffHHDDUU66CCQQ""]]~~++8844DD__PP88zzmm..00RR%%^^ss;;zzuuuuffii==<>@@DD((__zz))))VV==JJ++UU&& JJFFvv //??WWKKaawwwwhhccDDzzHHuuLL!!@@&&}} yy ee44$$qq++UUJJ..      yyWW3322dd  !!VVyy}}bb<<JJ 11EE QQJJ zzZZ }}ssrr>>XXll%%YY//$$&&""22[[LLmm''``ss##**XX <<~~UUaa  55eeRR||ccccHHUU@@mm%%??GG44~~AACC11pppp##SS  nn``PPrrHHmmZZffUU  }}DD&&''AA<<EEqqNN$$\\<<##((%%ff++99||MMhhDD((55//AA!!QQrr++<<DD--""{{mm;;LLqqDDbb@@99ww TTggddGG%%))GGJJSS zz22gg&&PP  ttppyy22__oo??  rrccuuTTSS00{{NN..ggUURR}}%%NNee>>%%77NNSSAABBddyy##~~~~HHMMxxtt''"";;==iiRR<<JJGGkkKKZZNN66ss44NN..zz''33kkppUU  \\rr ++yy]]44GGll44~~MMJJ&& ss))BB8855AAddrrhheeQQoo::XX>>''33oo??jj00##   uu&&((WWOO%%LLJJIIPPRRnnII}}99jj88]]  ))\\UUCC##;;GGjj88zzIIdd::XXoo33HH--JJ** ttww$$ii22ffttaa11uuSS11oo hhttGGii__88}}OOFFssbb22MM00''KKPPDDrr55::GG77ff^^""""KK00RRAA>>__TT FF?? }}@@vv ))ccaaRR\\00IIQQxx||ss22NNzz++wwhhBB!!ff^^YYjj99ZZTT--tt$$[[]]bbvvGGVV``FFBBZZ ggffMM  wwddee  ''%%--FF\\??RR88[[BB22IIrrCCEE##00AA//GGMMCC//77  MMJJLLyy^^LLvvCCaaQQ%% SS22&&,,  $$uu'' %%99[[{{aaXXrr))ssccooooIIvv44++ttPPGG^^PPgguuvv44JJuuBB::bb??<<cc``LL&&DDPPQQ 7777RRZZ{{mmVVpp@@__ii}}MMqqBB44!!mm    ooiiMM gg::llBB~~  ccAA  qq66>>EEJJ22;;{{??YYEE !!\\DDPPrrttFFBBbb!!))ssEEddzzVV4466XXttffBB..ZZ[[;;~~PP@@LL]]kkAA))55MMKKSS}}eeAA??iiaa11uukk HHDD]]ss8888__VV@@RR}}mmAAYY77!!7711nn<>zzdd!!dd^^ddttvvdd||^^JJllGG=='' %%||%%EE55vv//CCEE;;++GG  &&33hhzz==gguuii99UUaa--YYYYII__AA SS;;88@@%%KKII!!VVQQ  hh00dd!!--OOKK++>>ooww##FF%%zzaaQQ99%% JJaa;;II66 !!..LL##GG__ii%%}}FFee00yy}}nn||vvwwVVeeSS HHDD--YY,,ff  qqee11YY NNyyzzpp##    !!HHiiLLOO __xxeekkrrTTllaa  OOGGEE!!KKuu//ttjjrrxxqqqqyyTTXX%%TT--qq>>44zz}}11ee  __ww**AAyy88JJDD<< ccLLgg++CCvvtt99]]GGHH++zz::tt11mm99>>!!xx33  mmvv@@rr!!kkcc!!EE 66TT!!((&&PPJJgg\\^^33''JJDDff77UU55SSqqOO==GGaa~~PP^^ffcc88jj<<QQ^^XXIIkkZZ}}KKiiEEccww]]CC]]KKooqqII//''CCuuii__%%nnZZ;;}}ss));;||VVeeeeGGaaaaCCmmcc//;;!!\\[[DD $$YYSS%%}}FFoouu>>%%LLRR ff;;QQ--ggIIss''bb))~~EE((NN..nn rrYY__<> 4466''WW nn00++33 SSiiEEAAIIxx4466 88))mmqq//jj%%<<cc]])) ;;//jj%%5599??//66!!88ffggZZ..BB``nn~~WW[[RR++ttrrvv ''QQkkGGjj--@@  AA__llPPRRddrrUUjj##ww{{11--__jj//''''77MMUUqq""MMkk((oovv<<//EE((&&//99SSSS//vvWW??ZZ@@nnMMYYOO33 LL%%,,RRttzztt BB88jjPP,,''''xxRRLLdd++zzpp|| MM]]YYUUEE''==== ~~ffnn??MMGG33vvJJjj``TT%%CC !!vvXXll!!}}..  ::XXOO007711__ii66dd::aaCC==++ff}}PPXX``ddDD22))))++44!!ZZ@@%%##MMOO XXII,,@@DD,,44UUNN**eeWWSS==22ii --@@]]}}{{ >>!!zzTT  44hhhhjj<<(( ``227744__ddYY--##??00,,dd8844  ::LL==::  55ff>>%%++00kk{{ EE77yy mm++llTTLLpp^^zzZZii?? ''zzFFjj ooww<>~~VVZZPP..uuZZxx))// 99\\mm{{EE ii}}88##{{OO44mm&&AA{{  ??vvYYVV0099__((  00$$qqdd==++rr!!]]uu[[  ))kkEEOO ::LLYY{{11pp||llll~~##ss((##%%JJ66RR__uu''66VV((ccXXYY]]__''44~~hh!!''++zz~~33VV..llddllll``^^ddVV@@++!!NN;;]]++GGggmmwwWWss""hhll55KKNNrr  [[//KKee  mmEE;;UUmmmmkkmmWW GGyyOOUU]]//!!##%%OOuu99##??QQEE77//pp\\22##VVTT))22** 00FFoo>>NN66 ))FF++ aa::LLss'',,22zz''mm}}YY--UUkkYYmm66@@????AASSWW11++kkgg==33OO]]99   eeOO33EE77hhzzWW??!!11EESS77CC99 rrRRTTllrrNN..++++ ccaa{{ ++ll^^00''DDvv !!''??[[eeeemm[[++??sswwyy~~{{7755]]oo]]GGUUuuiiGG55CCIIEEmmmmAASSAAxxvvJJ<<@@00  **KKCC44TTHH44@@RRHH::EE\\rrdd::..::66  [[zzddDD))##>>NN::0022))####%%BBZZffvvzznnZZPP\\pp  EEMM'' !!7777''!!%%11IIOOQQYYWWUU]]ggggqqssKK''  11__}}$$>>tt]]  **FFnnxxUU{{{{ss[[IIII??))!!))%%3377))%% vv\\44''<>NN^^``FF44//55 ))11////'' QQyyWWCCCCOOUUaaqq}}{{[[YYssggAA++%%  NNvvnnVVhhnn``<3IENDB`backspace-icon.png000066400000000000000000000011341214765240700330600ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh=JAzHn hJ0$rtXYBjk%g,fffW恏lf33n"BY- +o |S{y q xeYy ] W[=WEɜzS0G5GlS c1PY@@/|h9("-""2S1LM4EA596Ul("mmuXE>?{V\"V^\QNXl:tʚRaTքD}FuإG-4qUQVl%tJC$dx@%WZ &M0`7?sKىIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/images/close-icon.png000066400000000000000000000010141214765240700323250ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME (4aIRIDATh홽J@'"WURio`#((> ٫o`!*S,،09%e?2iMnF+د dlZH xN:{VSꮁi_ %n~^J#pelK%_\@[Nn fCM"PP@#-$HlflH|zk7^m`xWkq?\s $َI2]0}~\NSy-zAOM3W@iưAqr3GF)/ߴgbueDŽlt#; N=3y lB " !4X,`=}.CMHƢMB$g:N@:  0^t@+2XHXHHd:20^t@9` L2%:\1򽬐luw|>UDIZ]]-N? jzossznFpW/J+r,|'#NzIENDB`extended-key-background-pressed.png000066400000000000000000000015771214765240700363770ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/imagesPNG  IHDRY$_&tFIDATxk\eg~vl3%rL$؀ʅ5Vq۸q%]ɠ ggMČc 1)I::q.Z}s,y$B$VWW?n4z!O V\$s\\ANgV}ޜ6TŇY׍ _P{lZWbEQayy87UB[Y׋>?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?h%-$bQw 7!:tq'p{$ 1P!7' (#xç&wp1{ iƷ zfQ*t 맠7pMFIKx\ c*Uz@΢pOAOwS;Ǧ:j yEVŰMFzcX` lޞ.IQU:Q7bu=TFz,i[&aFpOGYJG棧JGӑ8V:Б8.$H{:1t$=cOG88ı#qt$ JG:DžcOG88ı#qHWБ8t$=J:Б8o!J+3k҄`Ĵ,qRͺ|>۶xh,PTvZYPX@TBV{jnnnX׿wttoN,h\.cccqZ}\ׅ8P{ q/eeX,Q 돷u֟*]fvR3۶*nV{ZV MIENDB`key-background-pressed.png000066400000000000000000000015771214765240700346010ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/imagesPNG  IHDRY$_&tFIDATxk\eg~vl3%rL$؀ʅ5Vq۸q%]ɠ ggMČc 1)I::q.Z}s,y$B$VWW?n4z!O V\$s\\ANgV}ޜ6TŇY׍ _P{lZWbEQayy87UB[Y׋>?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?h%-$bQw 7!:tq'p{$ 1P!7' (#xç&wp1{ iƷ zfQ*t 맠7pMFIKx\ c*Uz@΢pOAOwS;Ǧ:j yEVŰMFzcX` lޞ.IQU:Q7bu=TFz,i[&aFpOGYJG棧JGӑ8V:Б8.$H{:1t$=cOG88ı#qt$ JG:DžcOG88ı#qHWБ8t$=J:Б8o!J+3k҄`Ĵ,qRͺ|>۶xh,PTvZYPX@TBV{jnnnX׿wttoN,h\.cccqZ}\ׅ8P{ q/eeX,Q 돷u֟*]fvR3۶*nV{ZV MIENDB`key-background.png000066400000000000000000000015471214765240700331330ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/imagesPNG  IHDRY$_&t.IDATx1kGљ/DHQĨZ0 :$&![GWw/]ފh*_dcKV%$*:@&[<, I|>϶ZI|? f 0LH" $VXY:Nt3++++++++X:]K{||tc`G^aǥK; ;. v\: ++++++++X: tc`G^aǥK; ;.X:+xvvvvvvv\:v,xv\:رt#yv,ve; ; ; ; ; ; ; ; ;.IZYYYڳ`yIRj<]r\;YZt:iτ%WbJ8onnxT*տ+'ٽ?{޷Q}v4KjU666~ $h<Bp@IT0y* *˪jZ__WZ}$euI$?{^x\Imb,\..J8=}fCIENDB`language-icon.png000066400000000000000000000027641214765240700327410ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/imagesPNG  IHDR77F pHYs  IDAThmEݶU@,+I j ̶(#˴2 #BÈ>DA0 ԄZB^0)Jg3}u{/o̙3ϝ3syغ~*Tk`\nmj+W3PK2\TC;5;)Ǧpav*;2\()-R9 r[H;z2ULIxqlRZ '-2]KB)!s U`>z 0r}ס?`3@idE)7ƳdDi vDAT֮",7f9$JǽQ쯔/m'`B!M{F'G0Ds$^\-\H4Ú!o̸gi|q)U* |8!FNP)蓿O3i:dmچ'cp W)z$ܡ<ϜAUΔmULyx-h@T>RDg|ȓPZvCԥP/H|@'wr"ZgI(8Ͳ\'Jhy w?eMJxqB&Rc JK g;h /fm8L.+CFRW;D.Vޤ5Is}V4\)Gϕh⾇ATA +!,|q;UC^`|}(iEw`qum 볶ҹvC\B;J3niC .~g_1CM UzuΪ\Ӱ؆k JVx%ͮdpdIK`1[Σ&.\]'+׍M~聨iR?m瞣OA0.@/'-t@֎v5Scm1VY څ-h*(SNHLO`Htd$.|a474&d IK] QcåP\y׾RkWoȝLNl#{-Nծ4K/Pp3 '[8}gm51 ukI"b;j,s3xހb QhHicq4&WIQ*S\tdIH2 :`r:ζ];. .~Lm~ph$#|vQHne9蔃Vpj̅*P;h ʅ]rjU:Vre8,EI5^A"ѵIENDB`return-icon.png000066400000000000000000000015301214765240700324630ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThk\UOҤ5-mM%HѶHcj֍ .IAW. .p–ZBX5좸A\ 6P Fcr]i3s=3|yg}}˲ZP7=u3{w $w8n.)\Ɔ1[J$`cxm&p b4ן`)o`UOa#+Ƅv|&|>e<ϱ9L RF.!-?eT F 6<ď ɯ` D[wGI%-|[hc>EaoܽȲ]̲Je?EeHØSq+YntoO~Dm{j̯PfC ,tEYއR%U[?:!\TV@+&o20 SnǩzufKUHq2^ŭ hqD&oДeN?&KY(M销nzf ,ĠjIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/images/shift-icon.png000066400000000000000000000007451214765240700323470ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<bIDATh혿J@KRZrO`aqVXf$~0ff4 cf;P7E"M衖2RRfV5̥$,4gf*~#_HIG2oRf9+fC* ,JvT)ᕬ)C+$b4S+Y$b `l*̤w!kA$N[_M2\}@_x Ob;`Yjk`'*_>ۖ9"%ynR˕қ"Mx3z/q{cB`r Ty+z7E"UIENDB`shift-latched-icon.png000066400000000000000000000010041214765240700336570ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh혿JAɁZieZQ| kk"BI#lfAcnogp?be%,2Kh RfX @#)3 ~kf ?#IIpd¿HI 0 k;L$4.Xu%B*" &VߗuHxG6?  \TJDfADo>pT?vp|4 M-vGyNV~\V썀f"#pڜR& %Bطi}C|+ggZ11k~K5C,,, |](IENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/images/small-cut.png000066400000000000000000000015241214765240700322010ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGDC pHYs B(xtIME ( e>IDAThZkAfo%w ((.Y)Z+CI,2B@ZY "DPFPcch~|6o1eݝa7} gHVT*Z||9aV $zb5ذlg3PRl`}Qă E<8K+dH恘$r"W@K*#MLDiжIмd9vbU}ZDmb :.8 joパ&FI 5!|<IENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/main.ini000066400000000000000000000107121214765240700277510ustar00rootroot00000000000000[background] word-ribbon-borders=0 0 0 0 key-area-borders=0 0 0 0 magnifier-key-borders=6 6 6 6 key-borders=6 6 6 6 word-ribbon=background.png key-area=background.png magnifier-key=key-background-pressed.png normal=key-background.png normal-pressed=key-background-pressed.png deadkey=key-background-special.png deadkey-pressed=key-background-pressed.png special=key-background-special.png special-pressed=key-background-special-pressed.png [icon] shift=shift-icon.png shift-pressed=shift-icon.png shift-latched=shift-latched-icon.png shift-latched-pressed=shift-latched-icon.png caps-lock=shift-icon.png caps-lock-pressed=shift-icon.png backspace=backspace-icon.png backspace-pressed=backspace-icon.png return=return-icon.png return-pressed=return-icon.png close=close-icon.png close-pressed=close-icon.png left-layout=language-icon.png left-layout-pressed=language-icon.png right-layout=language-icon.png right-layout-pressed=language-icon.png square-smiley=square-smile.png [sound] key-press=typewriter.wav key-release=typewriter.wav layout-change= keyboard-hide= [default] landscape\key-area-width=854 landscape\key-area-paddings=11 landscape\word-ribbon-height=40 landscape\magnifier-key-height=96 landscape\magnifier-key-width=116 landscape\key-margins=4 landscape\key-height=56 landscape\key-width=76 landscape\key-width-large=93 landscape\key-width-xlarge=178 landscape\key-width-xxlarge=244 landscape\key-width-stretched=244 landscape\vertical-offset=100 landscape\font-size=24 landscape\small-font-size=20 landscape\font-color=#ffffff landscape\magnifier-font-size=50 landscape\candidate-font-size=20 landscape\candidate-font-stretch=60 portrait\key-area-width=480 portrait\key-area-paddings=4 portrait\word-ribbon-height=40 portrait\magnifier-key-height=120 portrait\magnifier-key-width=80 portrait\key-margins=4 portrait\key-height=80 portrait\key-width=40 portrait\key-width-large=56 portrait\key-width-xlarge=104 portrait\key-width-xxlarge=136 portrait\key-width-stretched=136 portrait\vertical-offset=100 portrait\font-size=24 portrait\small-font-size=20 portrait\font-color=#ffffff portrait\magnifier-font-size=50 portrait\candidate-font-size=20 portrait\candidate-font-stretch=60 [keys35] landscape/key-width-xlarge=118 landscape/key-width-xxlarge=160 portrait/key-width-xlarge=64 portrait/key-width-xxlarge=112 [keys36] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=286 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=112 [keys37] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=202 portrait/key-width-large=64 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=88 [keys38] landscape\key-area-paddings=1 landscape\key-margins=3 landscape\key-width=72 landscape\key-width-large=111 landscape\key-width-xlarge=150 landscape\key-width-xxlarge=189 landscape\key-width-stretched=189 portrait\key-area-paddings=1 portrait\key-margins=3 portrait\key-width=38 portrait\key-width-large=60 portrait\key-width-xlarge=82 portrait\key-width-xxlarge=104 portrait\key-width-stretched=104 [keys39] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-xlarge=111 landscape/key-width-xxlarge=150 landscape/key-width-stretched=150 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-xlarge=60 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys40] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-large=111 landscape/key-width-xlarge=189 landscape/key-width-xxlarge=228 landscape/key-width-stretched=228 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-large=60 portrait/key-width-xlarge=104 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys45] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [keys47] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [hebrew] landscape/font-size=35 landscape/key-width-large=160 landscape/key-width-xlarge=202 landscape/key-width-xxlarge=286 portrait/font-size=35 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=160 maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/sounds/000077500000000000000000000000001214765240700276365ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/sounds/LICENSE000066400000000000000000000002601214765240700306410ustar00rootroot00000000000000typewriter.wav Made by ddohler. (http://www.freesound.org/people/ddohler/) This work is licensed under the Attribution License. (http://creativecommons.org/licenses/by/3.0/) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/nokia-n9/sounds/typewriter.wav000066400000000000000000005300541214765240700326020ustar00rootroot00000000000000RIFF$WAVEfmt Ddata                                                                                                                                                       !!!!!!##!!####%%##!!!!%%))%%))''''''''%%))''++))--++''----//++--++))))++++--++++----++++))++++----++''))++''++''''%%''##%%##''####!!                IIEE)))) 77CC ''99-- ??QQAA-- ++--AAmm[[RR,,@@AA{{AA++339999zz ;;##--;;??3333EEMMSS99))MMccmm__33 99MM33 %%hhPPZZrr55wwwwII==[[]]OO-- ''3333''|| vvpptt !!~~jjhhtt33;;// %%++//77==;;''!!11==EECC77++  11KK__ggiiaaMM;;##    %%339955!!;;MM]]__SSKK==11 //EE__mmuuggOO// %%--//11//333311''    !!''//11//'' %%++))!! ''''  !!))))++))%%%% %%%%))++--33557711----''%%####%%))--11----''##  ##--775511##!!!!            ''))++))!!            ##%%!!  %%''--##      !!''))## ##''--++%%!!####))'' ##%%!! %%++55;;??77!! //AAKKEE;;//++))%%''))%% ##++77;;55//1155//5511//  EE]]99NN,,<<==mmccyyiiQQxx0088@@AAOOQQJJ..ZZSSWWtt XX33 UUMMjjnnzzdd,,vvuuFF11GGKKKKuuyyggaa[[++33??LLPPDDUU44 FF::kkuu88!!ggwwoo??EE..\\ ))$$OO##PPDDSS99""^^__||RR$$__HH44!!NN6622XXLL..BBTTUUMMDDNN__ DD00 EEddkk::PPYY''ff<>mm55ee..cc!!__  ((MM==00 ##]]mm??HHCCmmXX{{{{>>XX??GGGGRR--FFbb--ll||jj..++ CC''hhAAVVTTkkXXKKXXii,,TT##""OO<<%%qq33kkDDjj""]]22NNnn88gguuBBvvllffFFmm<<uu\\__aaNN HH::eeIIVV==ee++ PPmm!!CC||zzzz{{hhaa NNJJVV==llxxrrdd## UU\\RR@@ii^^((  11^^**oo //||zz??iillxxHHXX++ ''nn&&))@@==''wwӐ||K@K@r@r@a@a@ Ğ!!!!   ..U@U@c@c@I@I@ފжѨ 2 2a@a@c@c@r5r5]]??--||::##||EE77TT""""[$[$**֪PP;;Q@Q@K@K@,,ԴОI3I3@2@2M$M$ }}W W @%@%V-V- " "FFyy33>>gga a _ _ yyhhgg!!!! mmmmUU== --zz,,U U {{P P   X X OONN006 6 **%%++mmww++dd0077$$** Q Q 88TT((//mmwwWWRRUUAAZZZZ mmRRVVbb&&YYEE$$DDvv  ))%%99))ii33 PP44SSrr SS HH""11ZZGGmmcc//??kk``yy ~~ HHHHmmjjppk k HH__s s iiOO  ||)){{xxJJyyVV@@rr// TTD D AAGG.. p p cc$$kkXX__11LLzzzz<<llxxUU88kk<< }} ( ( ' ' GG))LLss..##mm11   bbSS e e AAqqNNuu55KK&&''33@@EE!!AAFF{{W W \ \ jj  | | qq}}WW jjaa^^QQ##}}oomm((x x nn ^^ FFMM2 2 rr__oo9 9 ttGGbbBBRR<<RR \ \   44##{{ppvv99hhssEEMM\\~~PPqqWW44ccBBxx  66ssmmkk//44aa,,++nnLLVV//__b b h h ]]DDDDj j   <>uu((aajjjj33TTUUkkcc++ff''::PP//aaAA..VV9911kk88ww((33ssuu<<55%%CCffzzEE]]||{{!!%%::ZZ RRdd((RRmmRRhh --33 >>``77((OOXXii44,,ff==DDSS55::]]  hhccPP&&8888||EExx__AAtt!!{{  mmUUll..<<[[ffXX2255ii""JJoo(())  GGffLLVVwwaaVVKKSS99IIqqHHRR""!!HHAA--%%WWUU""cc""''bbTTii22!!TT33ii||00QQ99tt ]]__55ii]]GGKKxx00::kk66""55EE11~~kkQQmmhh{{LL RRSS..VV~~**YY**jj[[jjII eepp**ee~~vvYYWWAA88ww-- 44HHccssppff22//ss77  NN]]''OOSSCCPPrr**11AA##''mm[[ff##OO mmxxOOCCEEPPkk99&&TT"" qqVVCC  mmzzZZ22ZZ!!YYVViiRRqq  ""ggSSdd**^^##ssQQjjJJ[[::hh33kk--DDcc||__{{11..9977rr;;JJVVMMTTPPuurr//6688}}EEyyjjqq!!%%NNJJ^^{{8800@@  ,,TT}}\\LL$$bbQQFFjj\\NNxx!!GG  33''00  55++ll66  WW))DDrrLLKK,,  kk||ttHH [[uu%%ttgg++33YY&&jjzznnUU))44WWkk33ddLL ""kkqqOO!!jjFF::AA33FF\\TTTT22rrpp66ccIIIIIIuuMM<>ee""\\ ^^GGNN8866]]RRbbddRR{{ss::$$aaggJJ!!00((NNhhss%%}}GG??ff)) vvzzGGEE{{##hhnnee<<((qqCC||$$xx{{33FFDDwwZZ ""aaTTEEqq ==ggPPQQjj..GG hhkkzz>>yyDDHH]]iiPP ..ttvv""(())//SSHH@@BBXXuu__||ii((BBff kkBB""ccbbxx22EEBB77!!jjHHLLXXzz]]**88KKWWdd88ccggxx&&@@88 FF%%??vvttyySS@@wwdd$$xxFFTTggZZ44WW5500PPBBoorrCCooZZJJRR&&VVoott@@## ttQQPP##GG  ``OOKKkkMM==uudduu88aa33ppHHZZccooss``,,ffIIww>>ffUUoo5555  HH..FFoonnMM  __<<33,, 22oohh 77 __}}FFii77ooeeww''9900uummjjAA##..PPoouuaaddTT&&QQ\\ff__ooTT>>TT&&hh..MMvv FF  44]]AAww  PP@@%%22LLxxBB  //DD%%TTww%% __eeFF }}UU  tt[[00ooffHHDDUU66CCQQ""]]~~++8844DD__PP88zzmm..00RR%%^^ss;;zzuuuuffii==<>@@DD((__zz))))VV==JJ++UU&& JJFFvv //??WWKKaawwwwhhccDDzzHHuuLL!!@@&&}} yy ee44$$qq++UUJJ..      yyWW3322dd  !!VVyy}}bb<<JJ 11EE QQJJ zzZZ }}ssrr>>XXll%%YY//$$&&""22[[LLmm''``ss##**XX <<~~UUaa  55eeRR||ccccHHUU@@mm%%??GG44~~AACC11pppp##SS  nn``PPrrHHmmZZffUU  }}DD&&''AA<<EEqqNN$$\\<<##((%%ff++99||MMhhDD((55//AA!!QQrr++<<DD--""{{mm;;LLqqDDbb@@99ww TTggddGG%%))GGJJSS zz22gg&&PP  ttppyy22__oo??  rrccuuTTSS00{{NN..ggUURR}}%%NNee>>%%77NNSSAABBddyy##~~~~HHMMxxtt''"";;==iiRR<<JJGGkkKKZZNN66ss44NN..zz''33kkppUU  \\rr ++yy]]44GGll44~~MMJJ&& ss))BB8855AAddrrhheeQQoo::XX>>''33oo??jj00##   uu&&((WWOO%%LLJJIIPPRRnnII}}99jj88]]  ))\\UUCC##;;GGjj88zzIIdd::XXoo33HH--JJ** ttww$$ii22ffttaa11uuSS11oo hhttGGii__88}}OOFFssbb22MM00''KKPPDDrr55::GG77ff^^""""KK00RRAA>>__TT FF?? }}@@vv ))ccaaRR\\00IIQQxx||ss22NNzz++wwhhBB!!ff^^YYjj99ZZTT--tt$$[[]]bbvvGGVV``FFBBZZ ggffMM  wwddee  ''%%--FF\\??RR88[[BB22IIrrCCEE##00AA//GGMMCC//77  MMJJLLyy^^LLvvCCaaQQ%% SS22&&,,  $$uu'' %%99[[{{aaXXrr))ssccooooIIvv44++ttPPGG^^PPgguuvv44JJuuBB::bb??<<cc``LL&&DDPPQQ 7777RRZZ{{mmVVpp@@__ii}}MMqqBB44!!mm    ooiiMM gg::llBB~~  ccAA  qq66>>EEJJ22;;{{??YYEE !!\\DDPPrrttFFBBbb!!))ssEEddzzVV4466XXttffBB..ZZ[[;;~~PP@@LL]]kkAA))55MMKKSS}}eeAA??iiaa11uukk HHDD]]ss8888__VV@@RR}}mmAAYY77!!7711nn<>zzdd!!dd^^ddttvvdd||^^JJllGG=='' %%||%%EE55vv//CCEE;;++GG  &&33hhzz==gguuii99UUaa--YYYYII__AA SS;;88@@%%KKII!!VVQQ  hh00dd!!--OOKK++>>ooww##FF%%zzaaQQ99%% JJaa;;II66 !!..LL##GG__ii%%}}FFee00yy}}nn||vvwwVVeeSS HHDD--YY,,ff  qqee11YY NNyyzzpp##    !!HHiiLLOO __xxeekkrrTTllaa  OOGGEE!!KKuu//ttjjrrxxqqqqyyTTXX%%TT--qq>>44zz}}11ee  __ww**AAyy88JJDD<< ccLLgg++CCvvtt99]]GGHH++zz::tt11mm99>>!!xx33  mmvv@@rr!!kkcc!!EE 66TT!!((&&PPJJgg\\^^33''JJDDff77UU55SSqqOO==GGaa~~PP^^ffcc88jj<<QQ^^XXIIkkZZ}}KKiiEEccww]]CC]]KKooqqII//''CCuuii__%%nnZZ;;}}ss));;||VVeeeeGGaaaaCCmmcc//;;!!\\[[DD $$YYSS%%}}FFoouu>>%%LLRR ff;;QQ--ggIIss''bb))~~EE((NN..nn rrYY__<> 4466''WW nn00++33 SSiiEEAAIIxx4466 88))mmqq//jj%%<<cc]])) ;;//jj%%5599??//66!!88ffggZZ..BB``nn~~WW[[RR++ttrrvv ''QQkkGGjj--@@  AA__llPPRRddrrUUjj##ww{{11--__jj//''''77MMUUqq""MMkk((oovv<<//EE((&&//99SSSS//vvWW??ZZ@@nnMMYYOO33 LL%%,,RRttzztt BB88jjPP,,''''xxRRLLdd++zzpp|| MM]]YYUUEE''==== ~~ffnn??MMGG33vvJJjj``TT%%CC !!vvXXll!!}}..  ::XXOO007711__ii66dd::aaCC==++ff}}PPXX``ddDD22))))++44!!ZZ@@%%##MMOO XXII,,@@DD,,44UUNN**eeWWSS==22ii --@@]]}}{{ >>!!zzTT  44hhhhjj<<(( ``227744__ddYY--##??00,,dd8844  ::LL==::  55ff>>%%++00kk{{ EE77yy mm++llTTLLpp^^zzZZii?? ''zzFFjj ooww<>~~VVZZPP..uuZZxx))// 99\\mm{{EE ii}}88##{{OO44mm&&AA{{  ??vvYYVV0099__((  00$$qqdd==++rr!!]]uu[[  ))kkEEOO ::LLYY{{11pp||llll~~##ss((##%%JJ66RR__uu''66VV((ccXXYY]]__''44~~hh!!''++zz~~33VV..llddllll``^^ddVV@@++!!NN;;]]++GGggmmwwWWss""hhll55KKNNrr  [[//KKee  mmEE;;UUmmmmkkmmWW GGyyOOUU]]//!!##%%OOuu99##??QQEE77//pp\\22##VVTT))22** 00FFoo>>NN66 ))FF++ aa::LLss'',,22zz''mm}}YY--UUkkYYmm66@@????AASSWW11++kkgg==33OO]]99   eeOO33EE77hhzzWW??!!11EESS77CC99 rrRRTTllrrNN..++++ ccaa{{ ++ll^^00''DDvv !!''??[[eeeemm[[++??sswwyy~~{{7755]]oo]]GGUUuuiiGG55CCIIEEmmmmAASSAAxxvvJJ<<@@00  **KKCC44TTHH44@@RRHH::EE\\rrdd::..::66  [[zzddDD))##>>NN::0022))####%%BBZZffvvzznnZZPP\\pp  EEMM'' !!7777''!!%%11IIOOQQYYWWUU]]ggggqqssKK''  11__}}$$>>tt]]  **FFnnxxUU{{{{ss[[IIII??))!!))%%3377))%% vv\\44''<>NN^^``FF44//55 ))11////'' QQyyWWCCCCOOUUaaqq}}{{[[YYssggAA++%%  NNvvnnVVhhnn``< A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 32 1 32 2012-09-12T11:09:19 Pixelmator 2.1 +xIBIDATH ұ Au?8Wvo"$yY~>@a$B "PH"+0h>eIENDB`backspace-icon.png000066400000000000000000000013401214765240700330130ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77F pHYs  IDAThXm01q@pRRFRJK0lX..3#FG=HB:pjˇnO͵ʗk%F^^** eLRܤ4mЩUnE4I^?Ѓb#h1b.s[!f|։۹S>~~T978Be%9 =uYn(x` ]#K+EAyWB[7(} + iWsl1O }v0+,KULUʘ*.+$bg +\y0m WaȾF471L( og?-K^мKu'X-͖ i POHGhioTK'݊ͨ6{΃`h [ť!1<md⦫sc5*e X~ݠߵ~݄}g©Tx0fhٗ@QVK6LiKcBnf,`;vG}@k JrSNݜL]~F߃~v},-хO#8,|?k=@FN_C.b,YE'˙͚Xr53V\lj휱Zrf&V\l: {-)kIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/images/close-icon.png000066400000000000000000000021431214765240700322650ustar00rootroot00000000000000PNG  IHDR77F pHYs  IDAThY;kTAv}P)c(Xic+4VAP&h!(b@$A >"4T~ff9df>{25gΙǽZ`ZjWm\{ 8z[.Lx?@c//W\FbޑZ*T?VT63}z`(cay3B4,3>4#JW$q#䯋~u;~Kz[zhhr&N ^~?6mhf8)7 /9m1O(k[Jv.b?;㹈[}ʉrÞt[Ր'wO'-3}PHު-eM)陛BdbQ!<W!HlӮ37fq@I?6%-cߢ%|bG|Ƹ4D M%q+)⻓>O'q2{lNuX5gQE{1jKo|z -ynizj\@” 5K*NQ@W^*ryZ9lo2Oa "78-(ocxOȥ0gq+%lOtʋ.y"Vt}6.a<Ϝΐ~I7f0ZIENDB`extended-background.png000066400000000000000000000100301214765240700340620ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77'EgAMA a AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 55 1 55 2012-09-12T12:09:99 Pixelmator 2.1 0IDATh 0A#ҹ-!X3٣cyl_xW<}oXk%N[%N[%N[%N[%N[%N[%N[%N[%N[%N[%N[,K'4iRY0IENDB`extended-key-background-pressed.png000066400000000000000000000100121214765240700363130ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77'EgAMA a AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 55 1 55 2012-09-12T16:09:53 Pixelmator 2.1 YwIDATh 0 AǕ!ȸC~&,;nI,;nI,;nI,;nI,;nI,;nI,;nI,;nI,;nI,;nI,;nI,;nI|LIENDB`extended-key-background.png000066400000000000000000000077221214765240700346660ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77'EgAMA a AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 55 1 55 2012-09-12T12:09:58 Pixelmator 2.1 O?IDATh1 Om ?@a 0` 0` 0` 0``#IENDB`key-background-pressed.png000066400000000000000000000010261214765240700345220ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77F pHYs  IDATh횡npƯkRS%d/P9b<& $@nU^C kL`N\ڿ"(;KH>Pggv?EQ|WULkE^Gt< r<EmBbK- V:Y֌sml6rDy6scNYIENDB`key-background-special-pressed.png000066400000000000000000000010261214765240700361400ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77F pHYs  IDATh횡npƯkRS%d/P9b<& $@nU^C kL`N\ڿ"(;KH>Pggv?EQ|WULkE^Gt< r<EmBbK- V:Y֌sml6rDy6scNYIENDB`key-background-special.png000066400000000000000000000010451214765240700344760ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77F pHYs  IDATh1P'/iD},s{ qSj9nt:=3˿iJ1W3L^j0].nhdg fc{8.XHp9~6#$8 !ՃÅ&Y NnCSo4ْ9 MdKj64fN-9ԛ9MfNnCSo4ْ9 MdKj64fN-9ԛ9MfNnCSo4ْ9 M}搶 <iC*!a9̐,YnЈ f ssPo~1Zv\.,9Ng995- *bpP >#v<ݷҏ=IENDB`key-background.png000066400000000000000000000010451214765240700330600ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77F pHYs  IDATh1P'/iD},s{ qSj9nt:=3˿iJ1W3L^j0].nhdg fc{8.XHp9~6#$8 !ՃÅ&Y NnCSo4ْ9 MdKj64fN-9ԛ9MfNnCSo4ْ9 MdKj64fN-9ԛ9MfNnCSo4ْ9 M}搶 <iC*!a9̐,YnЈ f ssPo~1Zv\.,9Ng995- *bpP >#v<ݷҏ=IENDB`language-icon.png000066400000000000000000000027641214765240700326750ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77F pHYs  IDAThmEݶU@,+I j ̶(#˴2 #BÈ>DA0 ԄZB^0)Jg3}u{/o̙3ϝ3syغ~*Tk`\nmj+W3PK2\TC;5;)Ǧpav*;2\()-R9 r[H;z2ULIxqlRZ '-2]KB)!s U`>z 0r}ס?`3@idE)7ƳdDi vDAT֮",7f9$JǽQ쯔/m'`B!M{F'G0Ds$^\-\H4Ú!o̸gi|q)U* |8!FNP)蓿O3i:dmچ'cp W)z$ܡ<ϜAUΔmULyx-h@T>RDg|ȓPZvCԥP/H|@'wr"ZgI(8Ͳ\'Jhy w?eMJxqB&Rc JK g;h /fm8L.+CFRW;D.Vޤ5Is}V4\)Gϕh⾇ATA +!,|q;UC^`|}(iEw`qum 볶ҹvC\B;J3niC .~g_1CM UzuΪ\Ӱ؆k JVx%ͮdpdIK`1[Σ&.\]'+׍M~聨iR?m瞣OA0.@/'-t@֎v5Scm1VY څ-h*(SNHLO`Htd$.|a474&d IK] QcåP\y׾RkWoȝLNl#{-Nծ4K/Pp3 '[8}gm51 ukI"b;j,s3xހb QhHicq4&WIQ*S\tdIH2 :`r:ζ];. .~Lm~ph$#|vQHne9蔃Vpj̅*P;h ʅ]rjU:Vre8,EI5^A"ѵIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/images/return-icon.png000066400000000000000000000012621214765240700325000ustar00rootroot00000000000000PNG  IHDR77F pHYs  dIDATh]J0wwDtOy{[q|E"'Xf a6LJfvu4l6T5ÕZݹrVnWY=i3λ&dO"}\b1,{b+ hkK\cf8l֋!y໭;u[ȏz%r+b0'˅cnv<:7a 8̛&P8`CT ^ig E$  yµ5WP`XL!I&]pR0$U{6 3PE0sH]o@ cR~? ErpR0KoKR+tMZpw$Pt%R hHq'>Ԥ䞖xpАVK1 '~+n-W/~vcw|mBm^F[F+-ݜ,!gls  dB%}[-b%.tb mkK ƴ +0 p'h r0!C,ՀCT ㋜J!?)^Ijl ĩڒ;o^as.{\%&!~IENDB`ribbon-background.png000066400000000000000000000077341214765240700335560ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR gAMA a AiCCPICC ProfileH wTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf2:Y~ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 32 1 32 2012-09-12T11:09:41 Pixelmator 2.1 IIDATH ұ A42#&S[rxv4m'IuGI$ `IElD(z4vuIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/images/shift-icon.png000066400000000000000000000012001214765240700322660ustar00rootroot00000000000000PNG  IHDR77F pHYs  2IDAThXQN0 !Cv܀cLI yj4]8m6ْصVJ7.rĈtrv@ ‚䎁f^){q' г3ge'KJJJr2LEn1zI'HNPj 4tAxN."18"dCXWVC͉h G7^D d%Yki`2)4`} Ɗ!E[lb{Ebًs| ?u~C}ЩteӒΦ/2:E#+sS)+d)̀fdzmMu%{_$<$}o\r_7AfaT]@V' j|:T{BGG'#.)S(EX[D'pKjrJ2],z^~׳Ēz, NѤ,CtrYJ'hR!:,jxe^sIENDB`shift-latched-icon.png000066400000000000000000000012421214765240700336170ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/imagesPNG  IHDR77F pHYs  TIDAThXQN0 e!M?N[7 !8AyMSNiXj~_n&EQlmlo*1ȍss\-QI}u,J%pBI=.:~~KĈ̠t/$"fB091ڎFgNYʅ|uO-%KrTRq| 1X2bC0f>Ud1]삵@ ;_81캖3($YX+N+CH(F}LSUc\)^|6[mR|~<8>Bk9>69}$Ag d INVV*y$6arDɘ?e}sh=!SŊX~{]8jH8E|o;⦖uXJV2DkѰAX/Yhrme>F]b/amw ~VTB2[~ކëH-Iwi=sS}H7sB*siוK ~Arsgq[RZK?k 1mٍC'rl1Fe΍]92SF.Vl[QpWsIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/main.ini000066400000000000000000000055031214765240700277070ustar00rootroot00000000000000[background] word-ribbon-borders=0 2 0 0 key-area-borders=0 2 0 0 magnifier-key-borders=6 6 6 6 key-borders=6 6 6 6 word-ribbon=ribbon-background.png key-area=background.png magnifier-key=key-background-pressed.png normal=key-background.png normal-pressed=key-background-pressed.png deadkey=key-background-special.png deadkey-pressed=key-background-pressed.png special=key-background-special.png special-pressed=key-background-special-pressed.png [icon] shift=shift-icon.png shift-pressed=shift-icon.png shift-latched=shift-latched-icon.png shift-latched-pressed=shift-latched-icon.png caps-lock=shift-icon.png caps-lock-pressed=shift-latched-icon.png backspace=backspace-icon.png backspace-pressed=backspace-icon.png return=return-icon.png return-pressed=return-icon.png close=close-icon.png close-pressed=close-icon.png left-layout=language-icon.png left-layout-pressed=language-icon.png right-layout=language-icon.png right-layout-pressed=language-icon.png [sound] key-press=typewriter.wav key-release=typewriter.wav layout-change= keyboard-hide= [default] landscape\key-area-width=1200 landscape\key-area-paddings=5 landscape\word-ribbon-height=4 landscape\magnifier-key-height=0 landscape\magnifier-key-width=0 landscape\magnifier-key-label-vertical-offset=0 landscape\key-margins=5 landscape\key-height=99 landscape\key-width=99 landscape\key-width-small=88 landscape\key-width-large=154 landscape\key-width-xlarge=230 landscape\key-width-xxlarge=424 landscape\key-width-stretched=643 landscape\vertical-offset=122 landscape\font-size=34 landscape\small-font-size=24 landscape\font-color=#ffffff landscape\magnifier-font-size=48 landscape\candidate-font-size=20 landscape\candidate-font-stretch=60 portrait\key-area-width=900 portrait\key-area-paddings=8 portrait\word-ribbon-height=6 portrait\magnifier-key-height=0 portrait\magnifier-key-width=0 portrait\magnifier-key-label-vertical-offset=0 portrait\key-margins=4 portrait\key-height=78 portrait\key-width=73 portrait\key-width-small=65 portrait\key-width-large=115 portrait\key-width-xlarge=170 portrait\key-width-xxlarge=314 portrait\key-width-stretched=475 portrait\vertical-offset=104 portrait\font-size=28 portrait\small-font-size=19 portrait\font-color=#ffffff portrait\magnifier-font-size=48 portrait\candidate-font-size=20 portrait\candidate-font-stretch=60 [ar] landscape\key-width=90 landscape\key-width-small=81 landscape\key-width-large=90 landscape\key-width-xlarge=154 landscape\key-width-xxlarge=463 landscape\key-width-stretched=590 portrait\key-width=66 portrait\key-width-small=59 portrait\key-width-large=70 portrait\key-width-xlarge=115 portrait\key-width-xxlarge=338 portrait\key-width-stretched=440 [vietnamese] landscape\key-width=99 landscape\key-width-small=88 landscape\key-width-large=170 landscape\key-width-xlarge=208 landscape\key-width-xxlarge=426 landscape\key-width-stretched=470 maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/sounds/000077500000000000000000000000001214765240700275725ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/sounds/LICENSE000066400000000000000000000002601214765240700305750ustar00rootroot00000000000000typewriter.wav Made by ddohler. (http://www.freesound.org/people/ddohler/) This work is licensed under the Attribution License. (http://creativecommons.org/licenses/by/3.0/) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/olpc-xo/sounds/typewriter.wav000066400000000000000000005300541214765240700325360ustar00rootroot00000000000000RIFF$WAVEfmt Ddata                                                                                                                                                       !!!!!!##!!####%%##!!!!%%))%%))''''''''%%))''++))--++''----//++--++))))++++--++++----++++))++++----++''))++''++''''%%''##%%##''####!!                IIEE)))) 77CC ''99-- ??QQAA-- ++--AAmm[[RR,,@@AA{{AA++339999zz ;;##--;;??3333EEMMSS99))MMccmm__33 99MM33 %%hhPPZZrr55wwwwII==[[]]OO-- ''3333''|| vvpptt !!~~jjhhtt33;;// %%++//77==;;''!!11==EECC77++  11KK__ggiiaaMM;;##    %%339955!!;;MM]]__SSKK==11 //EE__mmuuggOO// %%--//11//333311''    !!''//11//'' %%++))!! ''''  !!))))++))%%%% %%%%))++--33557711----''%%####%%))--11----''##  ##--775511##!!!!            ''))++))!!            ##%%!!  %%''--##      !!''))## ##''--++%%!!####))'' ##%%!! %%++55;;??77!! //AAKKEE;;//++))%%''))%% ##++77;;55//1155//5511//  EE]]99NN,,<<==mmccyyiiQQxx0088@@AAOOQQJJ..ZZSSWWtt XX33 UUMMjjnnzzdd,,vvuuFF11GGKKKKuuyyggaa[[++33??LLPPDDUU44 FF::kkuu88!!ggwwoo??EE..\\ ))$$OO##PPDDSS99""^^__||RR$$__HH44!!NN6622XXLL..BBTTUUMMDDNN__ DD00 EEddkk::PPYY''ff<>mm55ee..cc!!__  ((MM==00 ##]]mm??HHCCmmXX{{{{>>XX??GGGGRR--FFbb--ll||jj..++ CC''hhAAVVTTkkXXKKXXii,,TT##""OO<<%%qq33kkDDjj""]]22NNnn88gguuBBvvllffFFmm<<uu\\__aaNN HH::eeIIVV==ee++ PPmm!!CC||zzzz{{hhaa NNJJVV==llxxrrdd## UU\\RR@@ii^^((  11^^**oo //||zz??iillxxHHXX++ ''nn&&))@@==''wwӐ||K@K@r@r@a@a@ Ğ!!!!   ..U@U@c@c@I@I@ފжѨ 2 2a@a@c@c@r5r5]]??--||::##||EE77TT""""[$[$**֪PP;;Q@Q@K@K@,,ԴОI3I3@2@2M$M$ }}W W @%@%V-V- " "FFyy33>>gga a _ _ yyhhgg!!!! mmmmUU== --zz,,U U {{P P   X X OONN006 6 **%%++mmww++dd0077$$** Q Q 88TT((//mmwwWWRRUUAAZZZZ mmRRVVbb&&YYEE$$DDvv  ))%%99))ii33 PP44SSrr SS HH""11ZZGGmmcc//??kk``yy ~~ HHHHmmjjppk k HH__s s iiOO  ||)){{xxJJyyVV@@rr// TTD D AAGG.. p p cc$$kkXX__11LLzzzz<<llxxUU88kk<< }} ( ( ' ' GG))LLss..##mm11   bbSS e e AAqqNNuu55KK&&''33@@EE!!AAFF{{W W \ \ jj  | | qq}}WW jjaa^^QQ##}}oomm((x x nn ^^ FFMM2 2 rr__oo9 9 ttGGbbBBRR<<RR \ \   44##{{ppvv99hhssEEMM\\~~PPqqWW44ccBBxx  66ssmmkk//44aa,,++nnLLVV//__b b h h ]]DDDDj j   <>uu((aajjjj33TTUUkkcc++ff''::PP//aaAA..VV9911kk88ww((33ssuu<<55%%CCffzzEE]]||{{!!%%::ZZ RRdd((RRmmRRhh --33 >>``77((OOXXii44,,ff==DDSS55::]]  hhccPP&&8888||EExx__AAtt!!{{  mmUUll..<<[[ffXX2255ii""JJoo(())  GGffLLVVwwaaVVKKSS99IIqqHHRR""!!HHAA--%%WWUU""cc""''bbTTii22!!TT33ii||00QQ99tt ]]__55ii]]GGKKxx00::kk66""55EE11~~kkQQmmhh{{LL RRSS..VV~~**YY**jj[[jjII eepp**ee~~vvYYWWAA88ww-- 44HHccssppff22//ss77  NN]]''OOSSCCPPrr**11AA##''mm[[ff##OO mmxxOOCCEEPPkk99&&TT"" qqVVCC  mmzzZZ22ZZ!!YYVViiRRqq  ""ggSSdd**^^##ssQQjjJJ[[::hh33kk--DDcc||__{{11..9977rr;;JJVVMMTTPPuurr//6688}}EEyyjjqq!!%%NNJJ^^{{8800@@  ,,TT}}\\LL$$bbQQFFjj\\NNxx!!GG  33''00  55++ll66  WW))DDrrLLKK,,  kk||ttHH [[uu%%ttgg++33YY&&jjzznnUU))44WWkk33ddLL ""kkqqOO!!jjFF::AA33FF\\TTTT22rrpp66ccIIIIIIuuMM<>ee""\\ ^^GGNN8866]]RRbbddRR{{ss::$$aaggJJ!!00((NNhhss%%}}GG??ff)) vvzzGGEE{{##hhnnee<<((qqCC||$$xx{{33FFDDwwZZ ""aaTTEEqq ==ggPPQQjj..GG hhkkzz>>yyDDHH]]iiPP ..ttvv""(())//SSHH@@BBXXuu__||ii((BBff kkBB""ccbbxx22EEBB77!!jjHHLLXXzz]]**88KKWWdd88ccggxx&&@@88 FF%%??vvttyySS@@wwdd$$xxFFTTggZZ44WW5500PPBBoorrCCooZZJJRR&&VVoott@@## ttQQPP##GG  ``OOKKkkMM==uudduu88aa33ppHHZZccooss``,,ffIIww>>ffUUoo5555  HH..FFoonnMM  __<<33,, 22oohh 77 __}}FFii77ooeeww''9900uummjjAA##..PPoouuaaddTT&&QQ\\ff__ooTT>>TT&&hh..MMvv FF  44]]AAww  PP@@%%22LLxxBB  //DD%%TTww%% __eeFF }}UU  tt[[00ooffHHDDUU66CCQQ""]]~~++8844DD__PP88zzmm..00RR%%^^ss;;zzuuuuffii==<>@@DD((__zz))))VV==JJ++UU&& JJFFvv //??WWKKaawwwwhhccDDzzHHuuLL!!@@&&}} yy ee44$$qq++UUJJ..      yyWW3322dd  !!VVyy}}bb<<JJ 11EE QQJJ zzZZ }}ssrr>>XXll%%YY//$$&&""22[[LLmm''``ss##**XX <<~~UUaa  55eeRR||ccccHHUU@@mm%%??GG44~~AACC11pppp##SS  nn``PPrrHHmmZZffUU  }}DD&&''AA<<EEqqNN$$\\<<##((%%ff++99||MMhhDD((55//AA!!QQrr++<<DD--""{{mm;;LLqqDDbb@@99ww TTggddGG%%))GGJJSS zz22gg&&PP  ttppyy22__oo??  rrccuuTTSS00{{NN..ggUURR}}%%NNee>>%%77NNSSAABBddyy##~~~~HHMMxxtt''"";;==iiRR<<JJGGkkKKZZNN66ss44NN..zz''33kkppUU  \\rr ++yy]]44GGll44~~MMJJ&& ss))BB8855AAddrrhheeQQoo::XX>>''33oo??jj00##   uu&&((WWOO%%LLJJIIPPRRnnII}}99jj88]]  ))\\UUCC##;;GGjj88zzIIdd::XXoo33HH--JJ** ttww$$ii22ffttaa11uuSS11oo hhttGGii__88}}OOFFssbb22MM00''KKPPDDrr55::GG77ff^^""""KK00RRAA>>__TT FF?? }}@@vv ))ccaaRR\\00IIQQxx||ss22NNzz++wwhhBB!!ff^^YYjj99ZZTT--tt$$[[]]bbvvGGVV``FFBBZZ ggffMM  wwddee  ''%%--FF\\??RR88[[BB22IIrrCCEE##00AA//GGMMCC//77  MMJJLLyy^^LLvvCCaaQQ%% SS22&&,,  $$uu'' %%99[[{{aaXXrr))ssccooooIIvv44++ttPPGG^^PPgguuvv44JJuuBB::bb??<<cc``LL&&DDPPQQ 7777RRZZ{{mmVVpp@@__ii}}MMqqBB44!!mm    ooiiMM gg::llBB~~  ccAA  qq66>>EEJJ22;;{{??YYEE !!\\DDPPrrttFFBBbb!!))ssEEddzzVV4466XXttffBB..ZZ[[;;~~PP@@LL]]kkAA))55MMKKSS}}eeAA??iiaa11uukk HHDD]]ss8888__VV@@RR}}mmAAYY77!!7711nn<>zzdd!!dd^^ddttvvdd||^^JJllGG=='' %%||%%EE55vv//CCEE;;++GG  &&33hhzz==gguuii99UUaa--YYYYII__AA SS;;88@@%%KKII!!VVQQ  hh00dd!!--OOKK++>>ooww##FF%%zzaaQQ99%% JJaa;;II66 !!..LL##GG__ii%%}}FFee00yy}}nn||vvwwVVeeSS HHDD--YY,,ff  qqee11YY NNyyzzpp##    !!HHiiLLOO __xxeekkrrTTllaa  OOGGEE!!KKuu//ttjjrrxxqqqqyyTTXX%%TT--qq>>44zz}}11ee  __ww**AAyy88JJDD<< ccLLgg++CCvvtt99]]GGHH++zz::tt11mm99>>!!xx33  mmvv@@rr!!kkcc!!EE 66TT!!((&&PPJJgg\\^^33''JJDDff77UU55SSqqOO==GGaa~~PP^^ffcc88jj<<QQ^^XXIIkkZZ}}KKiiEEccww]]CC]]KKooqqII//''CCuuii__%%nnZZ;;}}ss));;||VVeeeeGGaaaaCCmmcc//;;!!\\[[DD $$YYSS%%}}FFoouu>>%%LLRR ff;;QQ--ggIIss''bb))~~EE((NN..nn rrYY__<> 4466''WW nn00++33 SSiiEEAAIIxx4466 88))mmqq//jj%%<<cc]])) ;;//jj%%5599??//66!!88ffggZZ..BB``nn~~WW[[RR++ttrrvv ''QQkkGGjj--@@  AA__llPPRRddrrUUjj##ww{{11--__jj//''''77MMUUqq""MMkk((oovv<<//EE((&&//99SSSS//vvWW??ZZ@@nnMMYYOO33 LL%%,,RRttzztt BB88jjPP,,''''xxRRLLdd++zzpp|| MM]]YYUUEE''==== ~~ffnn??MMGG33vvJJjj``TT%%CC !!vvXXll!!}}..  ::XXOO007711__ii66dd::aaCC==++ff}}PPXX``ddDD22))))++44!!ZZ@@%%##MMOO XXII,,@@DD,,44UUNN**eeWWSS==22ii --@@]]}}{{ >>!!zzTT  44hhhhjj<<(( ``227744__ddYY--##??00,,dd8844  ::LL==::  55ff>>%%++00kk{{ EE77yy mm++llTTLLpp^^zzZZii?? ''zzFFjj ooww<>~~VVZZPP..uuZZxx))// 99\\mm{{EE ii}}88##{{OO44mm&&AA{{  ??vvYYVV0099__((  00$$qqdd==++rr!!]]uu[[  ))kkEEOO ::LLYY{{11pp||llll~~##ss((##%%JJ66RR__uu''66VV((ccXXYY]]__''44~~hh!!''++zz~~33VV..llddllll``^^ddVV@@++!!NN;;]]++GGggmmwwWWss""hhll55KKNNrr  [[//KKee  mmEE;;UUmmmmkkmmWW GGyyOOUU]]//!!##%%OOuu99##??QQEE77//pp\\22##VVTT))22** 00FFoo>>NN66 ))FF++ aa::LLss'',,22zz''mm}}YY--UUkkYYmm66@@????AASSWW11++kkgg==33OO]]99   eeOO33EE77hhzzWW??!!11EESS77CC99 rrRRTTllrrNN..++++ ccaa{{ ++ll^^00''DDvv !!''??[[eeeemm[[++??sswwyy~~{{7755]]oo]]GGUUuuiiGG55CCIIEEmmmmAASSAAxxvvJJ<<@@00  **KKCC44TTHH44@@RRHH::EE\\rrdd::..::66  [[zzddDD))##>>NN::0022))####%%BBZZffvvzznnZZPP\\pp  EEMM'' !!7777''!!%%11IIOOQQYYWWUU]]ggggqqssKK''  11__}}$$>>tt]]  **FFnnxxUU{{{{ss[[IIII??))!!))%%3377))%% vv\\44''<>NN^^``FF44//55 ))11////'' QQyyWWCCCCOOUUaaqq}}{{[[YYssggAA++%%  NNvvnnVVhhnn``<3IENDB`backspace-icon.png000066400000000000000000000011341214765240700327550ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh=JAzHn hJ0$rtXYBjk%g,fffW恏lf33n"BY- +o |S{y q xeYy ] W[=WEɜzS0G5GlS c1PY@@/|h9("-""2S1LM4EA596Ul("mmuXE>?{V\"V^\QNXl:tʚRaTքD}FuإG-4qUQVl%tJC$dx@%WZ &M0`7?sKىIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/images/close-icon.png000066400000000000000000000010141214765240700322220ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME (4aIRIDATh홽J@'"WURio`#((> ٫o`!*S,،09%e?2iMnF+د dlZH xN:{VSꮁi_ %n~^J#pelK%_\@[Nn fCM"PP@#-$HlflH|zk7^m`xWkq?\s $َI2]0}~\NSy-zAOM3W@iưAqr3GF)/ߴgbueDŽlt#; N=3y lB " !4X,`=}.CMHƢMB$g:N@:  0^t@+2XHXHHd:20^t@9` L2%:\1򽬐luw|>UDIZ]]-N? jzossznFpW/J+r,|'#NzIENDB`extended-key-background-pressed.png000066400000000000000000000015771214765240700362740ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/imagesPNG  IHDRY$_&tFIDATxk\eg~vl3%rL$؀ʅ5Vq۸q%]ɠ ggMČc 1)I::q.Z}s,y$B$VWW?n4z!O V\$s\\ANgV}ޜ6TŇY׍ _P{lZWbEQayy87UB[Y׋>?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?h%-$bQw 7!:tq'p{$ 1P!7' (#xç&wp1{ iƷ zfQ*t 맠7pMFIKx\ c*Uz@΢pOAOwS;Ǧ:j yEVŰMFzcX` lޞ.IQU:Q7bu=TFz,i[&aFpOGYJG棧JGӑ8V:Б8.$H{:1t$=cOG88ı#qt$ JG:DžcOG88ı#qHWБ8t$=J:Б8o!J+3k҄`Ĵ,qRͺ|>۶xh,PTvZYPX@TBV{jnnnX׿wttoN,h\.cccqZ}\ׅ8P{ q/eeX,Q 돷u֟*]fvR3۶*nV{ZV MIENDB`key-background-pressed.png000066400000000000000000000015771214765240700344760ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/imagesPNG  IHDRY$_&tFIDATxk\eg~vl3%rL$؀ʅ5Vq۸q%]ɠ ggMČc 1)I::q.Z}s,y$B$VWW?n4z!O V\$s\\ANgV}ޜ6TŇY׍ _P{lZWbEQayy87UB[Y׋>?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?rQf?ԕ?Yy˵t ͺ>t^444|jMA[!зT[]Oٹ2K50ZSsn;zjo)wNS)JRwH$%pg]=&F+W=Wf|Wt+J`Ť{:=tt|x #^av`3t`GŽ+3x ;.L;tc ;n#^arv?h%-$bQw 7!:tq'p{$ 1P!7' (#xç&wp1{ iƷ zfQ*t 맠7pMFIKx\ c*Uz@΢pOAOwS;Ǧ:j yEVŰMFzcX` lޞ.IQU:Q7bu=TFz,i[&aFpOGYJG棧JGӑ8V:Б8.$H{:1t$=cOG88ı#qt$ JG:DžcOG88ı#qHWБ8t$=J:Б8o!J+3k҄`Ĵ,qRͺ|>۶xh,PTvZYPX@TBV{jnnnX׿wttoN,h\.cccqZ}\ׅ8P{ q/eeX,Q 돷u֟*]fvR3۶*nV{ZV MIENDB`key-background.png000066400000000000000000000015471214765240700330300ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/imagesPNG  IHDRY$_&t.IDATx1kGљ/DHQĨZ0 :$&![GWw/]ފh*_dcKV%$*:@&[<, I|>϶ZI|? f 0LH" $VXY:Nt3++++++++X:]K{||tc`G^aǥK; ;. v\: ++++++++X: tc`G^aǥK; ;.X:+xvvvvvvv\:v,xv\:رt#yv,ve; ; ; ; ; ; ; ; ;.IZYYYڳ`yIRj<]r\;YZt:iτ%WbJ8onnxT*տ+'ٽ?{޷Q}v4KjU666~ $h<Bp@IT0y* *˪jZ__WZ}$euI$?{^x\Imb,\..J8=}fCIENDB`language-icon.png000066400000000000000000000027641214765240700326360ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/imagesPNG  IHDR77F pHYs  IDAThmEݶU@,+I j ̶(#˴2 #BÈ>DA0 ԄZB^0)Jg3}u{/o̙3ϝ3syغ~*Tk`\nmj+W3PK2\TC;5;)Ǧpav*;2\()-R9 r[H;z2ULIxqlRZ '-2]KB)!s U`>z 0r}ס?`3@idE)7ƳdDi vDAT֮",7f9$JǽQ쯔/m'`B!M{F'G0Ds$^\-\H4Ú!o̸gi|q)U* |8!FNP)蓿O3i:dmچ'cp W)z$ܡ<ϜAUΔmULyx-h@T>RDg|ȓPZvCԥP/H|@'wr"ZgI(8Ͳ\'Jhy w?eMJxqB&Rc JK g;h /fm8L.+CFRW;D.Vޤ5Is}V4\)Gϕh⾇ATA +!,|q;UC^`|}(iEw`qum 볶ҹvC\B;J3niC .~g_1CM UzuΪ\Ӱ؆k JVx%ͮdpdIK`1[Σ&.\]'+׍M~聨iR?m瞣OA0.@/'-t@֎v5Scm1VY څ-h*(SNHLO`Htd$.|a474&d IK] QcåP\y׾RkWoȝLNl#{-Nծ4K/Pp3 '[8}gm51 ukI"b;j,s3xހb QhHicq4&WIQ*S\tdIH2 :`r:ζ];. .~Lm~ph$#|vQHne9蔃Vpj̅*P;h ʅ]rjU:Vre8,EI5^A"ѵIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/images/return-icon.png000066400000000000000000000015301214765240700324370ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThk\UOҤ5-mM%HѶHcj֍ .IAW. .p–ZBX5좸A\ 6P Fcr]i3s=3|yg}}˲ZP7=u3{w $w8n.)\Ɔ1[J$`cxm&p b4ן`)o`UOa#+Ƅv|&|>e<ϱ9L RF.!-?eT F 6<ď ɯ` D[wGI%-|[hc>EaoܽȲ]̲Je?EeHØSq+YntoO~Dm{j̯PfC ,tEYއR%U[?:!\TV@+&o20 SnǩzufKUHq2^ŭ hqD&oДeN?&KY(M销nzf ,ĠjIENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/images/shift-icon.png000066400000000000000000000007451214765240700322440ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<bIDATh혿J@KRZrO`aqVXf$~0ff4 cf;P7E"M衖2RRfV5̥$,4gf*~#_HIG2oRf9+fC* ,JvT)ᕬ)C+$b4S+Y$b `l*̤w!kA$N[_M2\}@_x Ob;`Yjk`'*_>ۖ9"%ynR˕қ"Mx3z/q{cB`r Ty+z7E"UIENDB`shift-latched-icon.png000066400000000000000000000010041214765240700335540ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/imagesPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh혿JAɁZieZQ| kk"BI#lfAcnogp?be%,2Kh RfX @#)3 ~kf ?#IIpd¿HI 0 k;L$4.Xu%B*" &VߗuHxG6?  \TJDfADo>pT?vp|4 M-vGyNV~\V썀f"#pڜR& %Bطi}C|+ggZ11k~K5C,,, |](IENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/images/small-cut.png000066400000000000000000000015241214765240700320760ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGDC pHYs B(xtIME ( e>IDAThZkAfo%w ((.Y)Z+CI,2B@ZY "DPFPcch~|6o1eݝa7} gHVT*Z||9aV $zb5ذlg3PRl`}Qă E<8K+dH恘$r"W@K*#MLDiжIмd9vbU}ZDmb :.8 joパ&FI 5!|<IENDB`maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/main.ini000066400000000000000000000107121214765240700276460ustar00rootroot00000000000000[background] word-ribbon-borders=0 0 0 0 key-area-borders=0 0 0 0 magnifier-key-borders=6 6 6 6 key-borders=6 6 6 6 word-ribbon=background.png key-area=background.png magnifier-key=key-background-pressed.png normal=key-background.png normal-pressed=key-background-pressed.png deadkey=key-background-special.png deadkey-pressed=key-background-pressed.png special=key-background-special.png special-pressed=key-background-special-pressed.png [icon] shift=shift-icon.png shift-pressed=shift-icon.png shift-latched=shift-latched-icon.png shift-latched-pressed=shift-latched-icon.png caps-lock=shift-icon.png caps-lock-pressed=shift-icon.png backspace=backspace-icon.png backspace-pressed=backspace-icon.png return=return-icon.png return-pressed=return-icon.png close=close-icon.png close-pressed=close-icon.png square-smiley=square-smile.png left-layout=language-icon.png left-layout-pressed=language-icon.png right-layout=language-icon.png right-layout-pressed=language-icon.png [sound] key-press=typewriter.wav key-release=typewriter.wav layout-change= keyboard-hide= [default] landscape\key-area-width=854 landscape\key-area-paddings=11 landscape\word-ribbon-height=40 landscape\magnifier-key-height=96 landscape\magnifier-key-width=116 landscape\key-margins=4 landscape\key-height=56 landscape\key-width=76 landscape\key-width-large=93 landscape\key-width-xlarge=178 landscape\key-width-xxlarge=244 landscape\key-width-stretched=244 landscape\vertical-offset=100 landscape\font-size=24 landscape\small-font-size=20 landscape\font-color=#ffffff landscape\magnifier-font-size=50 landscape\candidate-font-size=20 landscape\candidate-font-stretch=60 portrait\key-area-width=480 portrait\key-area-paddings=4 portrait\word-ribbon-height=40 portrait\magnifier-key-height=120 portrait\magnifier-key-width=80 portrait\key-margins=4 portrait\key-height=80 portrait\key-width=40 portrait\key-width-large=56 portrait\key-width-xlarge=104 portrait\key-width-xxlarge=136 portrait\key-width-stretched=136 portrait\vertical-offset=100 portrait\font-size=24 portrait\small-font-size=20 portrait\font-color=#ffffff portrait\magnifier-font-size=50 portrait\candidate-font-size=20 portrait\candidate-font-stretch=60 [keys35] landscape/key-width-xlarge=118 landscape/key-width-xxlarge=160 portrait/key-width-xlarge=64 portrait/key-width-xxlarge=112 [keys36] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=286 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=112 [keys37] landscape/key-width-large=118 landscape/key-width-xlarge=160 landscape/key-width-xxlarge=202 portrait/key-width-large=64 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=88 [keys38] landscape\key-area-paddings=1 landscape\key-margins=3 landscape\key-width=72 landscape\key-width-large=111 landscape\key-width-xlarge=150 landscape\key-width-xxlarge=189 landscape\key-width-stretched=189 portrait\key-area-paddings=1 portrait\key-margins=3 portrait\key-width=38 portrait\key-width-large=60 portrait\key-width-xlarge=82 portrait\key-width-xxlarge=104 portrait\key-width-stretched=104 [keys39] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-xlarge=111 landscape/key-width-xxlarge=150 landscape/key-width-stretched=150 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-xlarge=60 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys40] landscape/key-area-paddings=1 landscape/key-margins=3 landscape/key-width=72 landscape/key-width-large=111 landscape/key-width-xlarge=189 landscape/key-width-xxlarge=228 landscape/key-width-stretched=228 portrait/key-area-paddings=1 portrait/key-margins=3 portrait/key-width=38 portrait/key-width-large=60 portrait/key-width-xlarge=104 portrait/key-width-xxlarge=126 portrait/key-width-stretched=126 [keys45] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [keys47] landscape/key-area-paddings=11 landscape/key-margins=4 landscape/key-width=76 landscape/key-width-large=111 landscape/key-width-xlarge=150 landscape/key-width-xxlarge=267 portrait/key-width-xlarge=88 [hebrew] landscape/font-size=35 landscape/key-width-large=160 landscape/key-width-xlarge=202 landscape/key-width-xxlarge=286 portrait/font-size=35 portrait/key-width-large=88 portrait/key-width-xlarge=112 portrait/key-width-xxlarge=160 maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/sounds/000077500000000000000000000000001214765240700275335ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/sounds/LICENSE000066400000000000000000000002601214765240700305360ustar00rootroot00000000000000typewriter.wav Made by ddohler. (http://www.freesound.org/people/ddohler/) This work is licensed under the Attribution License. (http://creativecommons.org/licenses/by/3.0/) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/data/styles/ubuntu/sounds/typewriter.wav000066400000000000000000005300541214765240700324770ustar00rootroot00000000000000RIFF$WAVEfmt Ddata                                                                                                                                                       !!!!!!##!!####%%##!!!!%%))%%))''''''''%%))''++))--++''----//++--++))))++++--++++----++++))++++----++''))++''++''''%%''##%%##''####!!                IIEE)))) 77CC ''99-- ??QQAA-- ++--AAmm[[RR,,@@AA{{AA++339999zz ;;##--;;??3333EEMMSS99))MMccmm__33 99MM33 %%hhPPZZrr55wwwwII==[[]]OO-- ''3333''|| vvpptt !!~~jjhhtt33;;// %%++//77==;;''!!11==EECC77++  11KK__ggiiaaMM;;##    %%339955!!;;MM]]__SSKK==11 //EE__mmuuggOO// %%--//11//333311''    !!''//11//'' %%++))!! ''''  !!))))++))%%%% %%%%))++--33557711----''%%####%%))--11----''##  ##--775511##!!!!            ''))++))!!            ##%%!!  %%''--##      !!''))## ##''--++%%!!####))'' ##%%!! %%++55;;??77!! //AAKKEE;;//++))%%''))%% ##++77;;55//1155//5511//  EE]]99NN,,<<==mmccyyiiQQxx0088@@AAOOQQJJ..ZZSSWWtt XX33 UUMMjjnnzzdd,,vvuuFF11GGKKKKuuyyggaa[[++33??LLPPDDUU44 FF::kkuu88!!ggwwoo??EE..\\ ))$$OO##PPDDSS99""^^__||RR$$__HH44!!NN6622XXLL..BBTTUUMMDDNN__ DD00 EEddkk::PPYY''ff<>mm55ee..cc!!__  ((MM==00 ##]]mm??HHCCmmXX{{{{>>XX??GGGGRR--FFbb--ll||jj..++ CC''hhAAVVTTkkXXKKXXii,,TT##""OO<<%%qq33kkDDjj""]]22NNnn88gguuBBvvllffFFmm<<uu\\__aaNN HH::eeIIVV==ee++ PPmm!!CC||zzzz{{hhaa NNJJVV==llxxrrdd## UU\\RR@@ii^^((  11^^**oo //||zz??iillxxHHXX++ ''nn&&))@@==''wwӐ||K@K@r@r@a@a@ Ğ!!!!   ..U@U@c@c@I@I@ފжѨ 2 2a@a@c@c@r5r5]]??--||::##||EE77TT""""[$[$**֪PP;;Q@Q@K@K@,,ԴОI3I3@2@2M$M$ }}W W @%@%V-V- " "FFyy33>>gga a _ _ yyhhgg!!!! mmmmUU== --zz,,U U {{P P   X X OONN006 6 **%%++mmww++dd0077$$** Q Q 88TT((//mmwwWWRRUUAAZZZZ mmRRVVbb&&YYEE$$DDvv  ))%%99))ii33 PP44SSrr SS HH""11ZZGGmmcc//??kk``yy ~~ HHHHmmjjppk k HH__s s iiOO  ||)){{xxJJyyVV@@rr// TTD D AAGG.. p p cc$$kkXX__11LLzzzz<<llxxUU88kk<< }} ( ( ' ' GG))LLss..##mm11   bbSS e e AAqqNNuu55KK&&''33@@EE!!AAFF{{W W \ \ jj  | | qq}}WW jjaa^^QQ##}}oomm((x x nn ^^ FFMM2 2 rr__oo9 9 ttGGbbBBRR<<RR \ \   44##{{ppvv99hhssEEMM\\~~PPqqWW44ccBBxx  66ssmmkk//44aa,,++nnLLVV//__b b h h ]]DDDDj j   <>uu((aajjjj33TTUUkkcc++ff''::PP//aaAA..VV9911kk88ww((33ssuu<<55%%CCffzzEE]]||{{!!%%::ZZ RRdd((RRmmRRhh --33 >>``77((OOXXii44,,ff==DDSS55::]]  hhccPP&&8888||EExx__AAtt!!{{  mmUUll..<<[[ffXX2255ii""JJoo(())  GGffLLVVwwaaVVKKSS99IIqqHHRR""!!HHAA--%%WWUU""cc""''bbTTii22!!TT33ii||00QQ99tt ]]__55ii]]GGKKxx00::kk66""55EE11~~kkQQmmhh{{LL RRSS..VV~~**YY**jj[[jjII eepp**ee~~vvYYWWAA88ww-- 44HHccssppff22//ss77  NN]]''OOSSCCPPrr**11AA##''mm[[ff##OO mmxxOOCCEEPPkk99&&TT"" qqVVCC  mmzzZZ22ZZ!!YYVViiRRqq  ""ggSSdd**^^##ssQQjjJJ[[::hh33kk--DDcc||__{{11..9977rr;;JJVVMMTTPPuurr//6688}}EEyyjjqq!!%%NNJJ^^{{8800@@  ,,TT}}\\LL$$bbQQFFjj\\NNxx!!GG  33''00  55++ll66  WW))DDrrLLKK,,  kk||ttHH [[uu%%ttgg++33YY&&jjzznnUU))44WWkk33ddLL ""kkqqOO!!jjFF::AA33FF\\TTTT22rrpp66ccIIIIIIuuMM<>ee""\\ ^^GGNN8866]]RRbbddRR{{ss::$$aaggJJ!!00((NNhhss%%}}GG??ff)) vvzzGGEE{{##hhnnee<<((qqCC||$$xx{{33FFDDwwZZ ""aaTTEEqq ==ggPPQQjj..GG hhkkzz>>yyDDHH]]iiPP ..ttvv""(())//SSHH@@BBXXuu__||ii((BBff kkBB""ccbbxx22EEBB77!!jjHHLLXXzz]]**88KKWWdd88ccggxx&&@@88 FF%%??vvttyySS@@wwdd$$xxFFTTggZZ44WW5500PPBBoorrCCooZZJJRR&&VVoott@@## ttQQPP##GG  ``OOKKkkMM==uudduu88aa33ppHHZZccooss``,,ffIIww>>ffUUoo5555  HH..FFoonnMM  __<<33,, 22oohh 77 __}}FFii77ooeeww''9900uummjjAA##..PPoouuaaddTT&&QQ\\ff__ooTT>>TT&&hh..MMvv FF  44]]AAww  PP@@%%22LLxxBB  //DD%%TTww%% __eeFF }}UU  tt[[00ooffHHDDUU66CCQQ""]]~~++8844DD__PP88zzmm..00RR%%^^ss;;zzuuuuffii==<>@@DD((__zz))))VV==JJ++UU&& JJFFvv //??WWKKaawwwwhhccDDzzHHuuLL!!@@&&}} yy ee44$$qq++UUJJ..      yyWW3322dd  !!VVyy}}bb<<JJ 11EE QQJJ zzZZ }}ssrr>>XXll%%YY//$$&&""22[[LLmm''``ss##**XX <<~~UUaa  55eeRR||ccccHHUU@@mm%%??GG44~~AACC11pppp##SS  nn``PPrrHHmmZZffUU  }}DD&&''AA<<EEqqNN$$\\<<##((%%ff++99||MMhhDD((55//AA!!QQrr++<<DD--""{{mm;;LLqqDDbb@@99ww TTggddGG%%))GGJJSS zz22gg&&PP  ttppyy22__oo??  rrccuuTTSS00{{NN..ggUURR}}%%NNee>>%%77NNSSAABBddyy##~~~~HHMMxxtt''"";;==iiRR<<JJGGkkKKZZNN66ss44NN..zz''33kkppUU  \\rr ++yy]]44GGll44~~MMJJ&& ss))BB8855AAddrrhheeQQoo::XX>>''33oo??jj00##   uu&&((WWOO%%LLJJIIPPRRnnII}}99jj88]]  ))\\UUCC##;;GGjj88zzIIdd::XXoo33HH--JJ** ttww$$ii22ffttaa11uuSS11oo hhttGGii__88}}OOFFssbb22MM00''KKPPDDrr55::GG77ff^^""""KK00RRAA>>__TT FF?? }}@@vv ))ccaaRR\\00IIQQxx||ss22NNzz++wwhhBB!!ff^^YYjj99ZZTT--tt$$[[]]bbvvGGVV``FFBBZZ ggffMM  wwddee  ''%%--FF\\??RR88[[BB22IIrrCCEE##00AA//GGMMCC//77  MMJJLLyy^^LLvvCCaaQQ%% SS22&&,,  $$uu'' %%99[[{{aaXXrr))ssccooooIIvv44++ttPPGG^^PPgguuvv44JJuuBB::bb??<<cc``LL&&DDPPQQ 7777RRZZ{{mmVVpp@@__ii}}MMqqBB44!!mm    ooiiMM gg::llBB~~  ccAA  qq66>>EEJJ22;;{{??YYEE !!\\DDPPrrttFFBBbb!!))ssEEddzzVV4466XXttffBB..ZZ[[;;~~PP@@LL]]kkAA))55MMKKSS}}eeAA??iiaa11uukk HHDD]]ss8888__VV@@RR}}mmAAYY77!!7711nn<>zzdd!!dd^^ddttvvdd||^^JJllGG=='' %%||%%EE55vv//CCEE;;++GG  &&33hhzz==gguuii99UUaa--YYYYII__AA SS;;88@@%%KKII!!VVQQ  hh00dd!!--OOKK++>>ooww##FF%%zzaaQQ99%% JJaa;;II66 !!..LL##GG__ii%%}}FFee00yy}}nn||vvwwVVeeSS HHDD--YY,,ff  qqee11YY NNyyzzpp##    !!HHiiLLOO __xxeekkrrTTllaa  OOGGEE!!KKuu//ttjjrrxxqqqqyyTTXX%%TT--qq>>44zz}}11ee  __ww**AAyy88JJDD<< ccLLgg++CCvvtt99]]GGHH++zz::tt11mm99>>!!xx33  mmvv@@rr!!kkcc!!EE 66TT!!((&&PPJJgg\\^^33''JJDDff77UU55SSqqOO==GGaa~~PP^^ffcc88jj<<QQ^^XXIIkkZZ}}KKiiEEccww]]CC]]KKooqqII//''CCuuii__%%nnZZ;;}}ss));;||VVeeeeGGaaaaCCmmcc//;;!!\\[[DD $$YYSS%%}}FFoouu>>%%LLRR ff;;QQ--ggIIss''bb))~~EE((NN..nn rrYY__<> 4466''WW nn00++33 SSiiEEAAIIxx4466 88))mmqq//jj%%<<cc]])) ;;//jj%%5599??//66!!88ffggZZ..BB``nn~~WW[[RR++ttrrvv ''QQkkGGjj--@@  AA__llPPRRddrrUUjj##ww{{11--__jj//''''77MMUUqq""MMkk((oovv<<//EE((&&//99SSSS//vvWW??ZZ@@nnMMYYOO33 LL%%,,RRttzztt BB88jjPP,,''''xxRRLLdd++zzpp|| MM]]YYUUEE''==== ~~ffnn??MMGG33vvJJjj``TT%%CC !!vvXXll!!}}..  ::XXOO007711__ii66dd::aaCC==++ff}}PPXX``ddDD22))))++44!!ZZ@@%%##MMOO XXII,,@@DD,,44UUNN**eeWWSS==22ii --@@]]}}{{ >>!!zzTT  44hhhhjj<<(( ``227744__ddYY--##??00,,dd8844  ::LL==::  55ff>>%%++00kk{{ EE77yy mm++llTTLLpp^^zzZZii?? ''zzFFjj ooww<>~~VVZZPP..uuZZxx))// 99\\mm{{EE ii}}88##{{OO44mm&&AA{{  ??vvYYVV0099__((  00$$qqdd==++rr!!]]uu[[  ))kkEEOO ::LLYY{{11pp||llll~~##ss((##%%JJ66RR__uu''66VV((ccXXYY]]__''44~~hh!!''++zz~~33VV..llddllll``^^ddVV@@++!!NN;;]]++GGggmmwwWWss""hhll55KKNNrr  [[//KKee  mmEE;;UUmmmmkkmmWW GGyyOOUU]]//!!##%%OOuu99##??QQEE77//pp\\22##VVTT))22** 00FFoo>>NN66 ))FF++ aa::LLss'',,22zz''mm}}YY--UUkkYYmm66@@????AASSWW11++kkgg==33OO]]99   eeOO33EE77hhzzWW??!!11EESS77CC99 rrRRTTllrrNN..++++ ccaa{{ ++ll^^00''DDvv !!''??[[eeeemm[[++??sswwyy~~{{7755]]oo]]GGUUuuiiGG55CCIIEEmmmmAASSAAxxvvJJ<<@@00  **KKCC44TTHH44@@RRHH::EE\\rrdd::..::66  [[zzddDD))##>>NN::0022))####%%BBZZffvvzznnZZPP\\pp  EEMM'' !!7777''!!%%11IIOOQQYYWWUU]]ggggqqssKK''  11__}}$$>>tt]]  **FFnnxxUU{{{{ss[[IIII??))!!))%%3377))%% vv\\44''<>NN^^``FF44//55 ))11////'' QQyyWWCCCCOOUUaaqq}}{{[[YYssggAA++%%  NNvvnnVVhhnn``<A=jJ1pW$f=EL%qyfoh<˘bSUՉ:G>>~%x+Py4Lk)U$IJS왹h46XޜeАc{g=D$:pQ|섀e钙'U'o#g/3a8PN ӄ~hYm+ӥCKGYۀ2X Jm=1bR쒒7woSLC ""hI:SFzDB$~prP$3NQg^rgw6⡋3PpV a0x(XQ8kyXGý%Yc|  XdbF_m6!c4G"J?'?4a?)h"T&[׵'@5S|j0xNIMX(%[ô6q~xqr&\V{W(-$jIJ%9p `Tt[xV9򕲻ot815de&DW dT>(>)<YcRf\ y İ1{#ഛ{WŒxe/G$A|P!=B=3ⵤ=L%t;og7OʻR6W_5Mkf=)kg^ձ: iI7jQ;FӍZ5n2a~VxA߳5sde_,E^#Vc fs_'_/y8e\ #h5/ 0w9h|Ӏf;UmZmST-[A}@mXn^ a U\{ [z>٫fJ \bM cE"X40`M*/ʓ/0Qٗ㫣c]NW smpF&8nHϳDjÜ~ W1溅ϧ6dK&(Zk)>X'b8jRT=$-5lZUvZMf- zo{p۠wh;;۠K624ΕqL%40Mh^ JNz^ %2N=RWTJE/[~o_k׋_T~WP/ᯢPK2/rV=PKr@ styles.xmlYmo6_a(C)9I[aEKQ3%sD츿~GRu D^ܑwrnn28!)Ϸ^ #WA2?~ij+ډ+Ul:咋:`G0I.CQxn| )/{"fSeDrN:#4G{,fיK2_*qS7j?ߗ͏_u%4EU$h1{סj{M B>N*"haՌl4>9wh7=j Rp@^elUMEB!KxѺ˦_#ܸ!FrΥ.U`_rikƢ %,rOEnoooPWXI йt-JO&h{tvۅ_C j>d&]u@ۚ/xjq*քg="ZZ"s:a"sLo578Ak.5Z]!- 0D>߬.7UPj5@My;ڭMKO;7OPKE0FPKr@lS@meta.xml Michael Hasselmann2012-05-24T14:54:462012-05-24T16:23:04Michael HasselmannPT00H39M47S3OpenOffice.org/3.2$Unix OpenOffice.org_project/320m12$Build-9483PKr@Thumbnails/thumbnail.pnguX֧7r ޸ [];=;wwwwg#C=~LOWU]j 91 CB\ þ^ƭ9d)ǩNJySʤ\qD_iI _(4UI%i i'GwR/Y/!O-.n;n(B`_3Oaoq21d~A ?] b!D6s66c0}h'r'Tu`Mh.卣|ۿD>p~nnXSzlmKefzn}̔}LgVTyd31biw(H{$EmĨaG6O!d9=.G72 >53s‘fO JfP^5C\um!Fn#]2ѣp'G¾C71u)7;5R|ce>%Q۸V#QE =g/Pc\.'"MYwdcy|NGn% p-aj^90@ֹϻY#ե_Ȓ+<7ʮݗB(_y{f'WM{Lʣ=m=mO{knNҾsMGP OoeFMvx%Y )إ:ݙ{e9=0|bKLRBYRΜ:#WS1U4^fXru򂲘g+X]gc&.:ƞ1hi.Ks?C#ޔ@b>igkn׵N!h/q)PGc:'ăYΗrT.G++ɽGIQ-m846:Sβ3՘=}yURXh+}ƱCq"J!=u>ph( "T/-ЖsKݴT^sDjitV8j<њpt%DxMy/1N&&GyXT9N-7UXXj1Z6Z9By ż37Hdd*v4uz{V}-@i }kW<̫ O+.~뛼<]-u{48O :{3̈4s Zw AY|i4/-v+ rfZ8l"ǧVzYTwa+< RkJ ˀ,XTB&dzE2sRyfrQnJY UszJsD`7J}O!r1t ӗQ6{3SbK-4Ej˦qQ.ZX$g<+Q|/z+m.rec\$9py]K sٰc#Y̭Ʋq4g'me7K`?`.sl{J?v83m|m5EeT `mJ!,.QNv?![q@43x",=^4'!2a'`ge{%fo#3@.PSZ}I/*yb./*y?\ lF՚CUBqئ ;BtVtu6ORއj_fTz}PYo˟lO'->̢y=&1SWZa¦zy@ooK6;>Jɫt~|ωf}~t`j:v#{Nt2fϺS[:ul|fS)<PlcpnD4j6HGz7fz bF/p=x0 dvjz;N%\!l (݌lSO "e|P@k#X;""׾ 8l z"%bZd 9Qml6}2z[dZ+XLsBǦi֔ULV^,@kO九{eInܝ&9reylq#L.B?7cѪw޵wf`;imXqII!zV6L5>nidL@I+"ͩ&2SMS|khHfۉ(PQ1/6jSmuCs ;eJorsk:w6϶[v?$?ķ 1G5"αsupJi`v,.mP0Z̥O,R@Eތf?Dzr6pBY ̤B,UB.N!?iҢ(F!* y-/dŃcIX(@%]+SuBtjY6_Ry|?;qe#@Lʂ)Y8e?@a qvYW{d)5JT19w}ojp>SxG,Nta5`%oPYj\@uTH("b*~ZTY+(~( ֞wD+eUw[{sB!۴dbm.Mk8KX7l[h5aTc,שU])Y$ [XGoQQ2]|"_I|V0LO?ʧ'h%=,8h4㧣$"+W;O_/DLIŠ1;Rw)`إ VhUr.=9-UH_E+o;B'ec`0^ ŵ>( fK k \ Syn@p _?\RlJ~ 4}1u _׶kyCrU,O2d&My#[oOĻnh!L@(~S%u;56)djxXG[{@).^pC2mQжu#6ҵeP4H\k1ohм3P i۔}j+O DEG̩_P9$G^`dGrY)kt2"lcTbWvB6ݲUjʽY.)SRprp\T hB&bh#e CF?LBNГscD-UeˉˢxU&CY4KExD6M||*4.Ol'egZ >-54 YpH+w ٧Q $떯&_& H|\@'DJZ_/UF}< %5P;{Rbac\SGF3=SX YȋJ-m y3‚8;f/iv0͸V+b pݹzKqRؒ\2f& ےIK&3 5wxDnٔaMM8D-ՠu~ ̛Z=eOJ iϻ'P3j$H*v~U΢T]'?F)9DXh4 `T;ub?(÷u$trwvzUl L QP1둻b97iK[2QGvc*)3LQm#ѯŌW>>AYSd8ٵמe>J?ZrBԞ <q^Y'֗9*Ν`>tB:6ȵ'BaNMϦ7oa> :uk< pM~@ -K2~g: շ'ND/YOzcѻinOѕ8%Ojz/ -ݭ݉!0| 1=o8cugWngb0[rl4[{]jE)Ganc(Ll!O"Uv ]& (LD`8Nam'7֥M|w/&6np  w_Ye?Y K^$'sF ,p- My/L_,k4gˬb>!* XIS}-|\1SD)ƨ FvzGBơ#&Eg(+>당$E[ơ+ͯ} EyK3Z9~~I{6/Q"|,\zr-Y*L2?{-l'?Pf|4+ݦ< ilA"h)8kƁRKYN5!z=Y:&*ǹPW-=(sӫɇ-=k 1ދU騅2V:5,QT|بmnΩC;| ~(jӪ JnK/v1R'RH}(ŚߣPOH߼E_`lR@W8@!(G. _ uinG0a* Uzy@̖"^ю>silyt~AP_O˔#llvz\|1DNk!mǔ)ľ9q4?nl{)U!Yzuʢy|F>p2c [NC/$?q[4xHh<:~8]c Qh ռBS -Eײ.Ԧφ(ZêorJpnOepߟۄyMO96Hiw㝹Tn?U+|J[N9;%$Eu3=rΜa:RW0qdUH`N3[So-ۙP߲E'&0iN rokld8>e^=lHIuL9bל)aۡ(y!>j_Aǖ䞰ro@D+6VcV:z' s FF ,xfMl ڹn)x{%]@ {D.{[A0 ^{,M+q.r[hIw٤ZaVd ;,M٤- ɦBgm=ߵʴ2>'l8֟0sA(>F5FY@rB_= tf5ּ ҍgI^08.tF;{=8 $>hBm8B! MD ~F0n yx HHsW_O)PcH*Et0q)kӫ?5.'<nnk%[4f[ikԤx.񝐦3mZ ҫ- ljJݑ6j8}ΙC=cO_-kZ_), DZ6LR[Rk!M@5 >4"85[8ȑ:.9!yтV!8^骚?L%w k2)SƏ&! ˸BXVV]{YxA-z$n-ܕ!@VΓ uΆZ;Jaz wPP@ 6N-"SBcV p\a\CѠ>X#r86tc A.AT$+4ҨsKQ6tٱ?V6ZwZ< lkC{-ˎEm2mz 6]}3x1qOC"N4#(Y[ԛv~@=,|5~au <\uAb~!lF82B'YnfBJrs'GzЃbgJߦa Fn,Ae/ QFV ^#!7[}p*ydư{IVuR x1ocNμ=NZ*>T>`ՠzck,-*0{n"&̅ Z71+kҖ[2@{zSXw5UAixaZ~s7B.z3\5|z2vKAGʖ<Ȯ0dZ+tkS~2ʳRvJyC6,"^^#D2;9rZ2פE˛aU1ęY;H;3Y{u\Xp_ئʿ6&&j-Kؿ1?ebKП Bt9"o߾np$Fc_pﺤKa>Z]4`2!h.Zq̟SzDNʹj\I>WL+7Lt~z$~q[5啲҇Ug!EfВH] FBnV^PS[!pαD&r1wajA|Lzr@9PaTNK t惪mܤsT2!#gO&r:t#'ˋ&bj *kpa6%U.gpFKNJ_ [CsqNΡy= &Ƒ i rG/G %(i#5= v/p: h;{pϡ$*OBhI}z\V*tOw; $!,oՄ;կ7օ{5ꏀ#@]5V8Dd͒pkiG`_B$]_"7xPw,=M0+V058)t.9+\*χYLibBbԨl܆6]c趠gU-ծ]mPY*Ku^dصGj/MK W5q"07E5ylloN=yy0!pPKN0# $PKr@'Configurations2/accelerator/current.xmlPKPKr@Configurations2/progressbar/PKr@Configurations2/floater/PKr@Configurations2/popupmenu/PKr@Configurations2/menubar/PKr@Configurations2/toolbar/PKr@Configurations2/images/Bitmaps/PKr@Configurations2/statusbar/PKr@ settings.xmlYQs8~_OC`뛰Dz$mǾ8Mg]v?}k]~x Xg BRcֳ:=)_ŧ{K\^W] J)sdc+A"t8 @:s0/sg;qlm ێ,>?Cv:O躮l)Da(Y9zC;ouNf`M8?~TAĦ6IgK!5l*TY`hjAʕ5]A^| +eOM`dkMwѰ.~7 ar/ڂ|5:Į7:I2 hy%@kd,JtUf;ywiA_ߑ+ܐQ}(g }6kSO-s4mry.Web(ft@XTD4d +!7ADd@5Q"r䒇EpuK+e#%ؒCR,1p㝀DVۊ0You|\ *S͊%u EaRB|0xP}\]>{#FR"LcF~Kd҅ۊps"7ʀo'1faRwnER~*-}xMS'>Qwx;5G'HP?9d"A ~ͷ)cǴPrFDO%%.➊HI+F%RxDAuvP$$1ҩ**J%0^QNβ1-V4 ^Hَ;ӊ>&Lj[$\k$lgH[ҾŅq}'/OyZ͵ 0ȄZoKDTquથI ٖz4"'[xȮCi|35I` l"~veW]MPKҼ)>PKr@META-INF/manifest.xmlMn0">q˪Z'I?ynH[;^{ks$ tʷ|/uXYpC<(}.Fjv`jVZEzTZ/+!0J>l`|ʽkV5(Dv,Irr)RȻ0Xܦ)xt3%>ٱކmvnhC*~n,w:ݧxzS>Jb|"#m!@g<0rC CM<`{ -HM5#w⬒T6m<|ּ~PKDՀJhPKr@l9..mimetypePKr@2/rV= Tcontent.xmlPKr@E0F %styles.xmlPKr@lS@. meta.xmlPKr@N0# $FThumbnails/thumbnail.pngPKr@'4Configurations2/accelerator/current.xmlPKr@5Configurations2/progressbar/PKr@M5Configurations2/floater/PKr@5Configurations2/popupmenu/PKr@5Configurations2/menubar/PKr@5Configurations2/toolbar/PKr@'6Configurations2/images/Bitmaps/PKr@d6Configurations2/statusbar/PKr@Ҽ)> 6settings.xmlPKr@DՀJh:META-INF/manifest.xmlPK!<maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/000077500000000000000000000000001214765240700232105ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/coreutils.cpp000066400000000000000000000062751214765240700257370ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "coreutils.h" #include "models/key.h" namespace MaliitKeyboard { namespace CoreUtils { namespace { const char *const g_action_key_id = "actionKey"; } // unnamed namespace const QString &pluginDataDirectory() { static const QByteArray env_data_directory = qgetenv("MALIIT_PLUGINS_DATADIR"); static const QString data_directory = QString::fromUtf8(env_data_directory.isEmpty() ? MALIIT_PLUGINS_DATA_DIR : env_data_directory); return data_directory; } const QString &maliitKeyboardDataDirectory() { static const QByteArray env_data_directory = qgetenv("MALIIT_KEYBOARD_DATADIR"); static const QString data_directory = QString::fromUtf8(env_data_directory.isEmpty() ? MALIIT_KEYBOARD_DATA_DIR : env_data_directory); return data_directory; } const QString &maliitKeyboardStyleProfilesDirectory() { static const QString styles_profiles_directory(maliitKeyboardDataDirectory() + "/styles"); return styles_profiles_directory; } QString idFromKey(const Key &key) { switch (key.action()) { case Key::ActionReturn: return g_action_key_id; case Key::ActionInsert: return key.label().text(); default: // TODO: handle more key actions if needed. return QString(); } } }} // namespace CoreUtils, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/coreutils.h000066400000000000000000000040241214765240700253720ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef UTILS_H #define UTILS_H #include namespace MaliitKeyboard { class Key; namespace CoreUtils { const QString &pluginDataDirectory(); const QString &maliitKeyboardDataDirectory(); const QString &maliitKeyboardStyleProfilesDirectory(); QString idFromKey(const Key &key); }} // namespace MaliitKeyboard, CoreUtils #endif // UTILS_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/lib.pro000066400000000000000000000004331214765240700245000ustar00rootroot00000000000000include(../config.pri) VERSION = 0.2.0 TARGET = $${MALIIT_KEYBOARD_TARGET} TEMPLATE = lib QT = core CONFIG += staticlib include(models/models.pri) include(logic/logic.pri) include(parser/parser.pri) HEADERS += coreutils.h SOURCES += coreutils.cpp include(../word-prediction.pri) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/000077500000000000000000000000001214765240700243055ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/abstractlanguagefeatures.cpp000066400000000000000000000035471214765240700320700ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "abstractlanguagefeatures.h" namespace MaliitKeyboard { namespace Logic { AbstractLanguageFeatures::AbstractLanguageFeatures(QObject *parent) : QObject(parent) { } AbstractLanguageFeatures::~AbstractLanguageFeatures() { } }} // namespace MaliitKeyboard, Logic maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/abstractlanguagefeatures.h000066400000000000000000000044341214765240700315310ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_ABSTRACTLANGUAGEFEATURES_H #define MALIIT_KEYBOARD_ABSTRACTLANGUAGEFEATURES_H #include namespace MaliitKeyboard { namespace Logic { class AbstractLanguageFeatures : public QObject { Q_OBJECT Q_DISABLE_COPY(AbstractLanguageFeatures) // FIXME: Add a language/locale property (also for AbstractWordEngine) public: explicit AbstractLanguageFeatures(QObject *parent = 0); virtual ~AbstractLanguageFeatures(); virtual bool activateAutoCaps(const QString &preedit) const = 0; virtual QString appendixForReplacedPreedit(const QString &preedit) const = 0; }; }} // namespace MaliitKeyboard, Logic #endif // MALIIT_KEYBOARD_ABSTRACTLANGUAGEFEATURES_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/abstractwordengine.cpp000066400000000000000000000125521214765240700307030ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "abstractwordengine.h" namespace MaliitKeyboard { namespace Logic { //! \class AbstractWordEngine //! \brief Provides word candidates based on text model. //! //! Derived classes need to provide an implementation for //! fetchCandidates() and, optionally, addToUserDictionary(). //! \sa Model::Text, computeCandidates(). //! \fn void AbstractWordEngine::enabledChanged(bool enabled) //! \brief Emitted when word engine toggles word candidate updates on/off. //! \param enabled Whether word engine is enabled. //! \fn void AbstractWordEngine::candidatesChanged(const WordCandidateList &candidates) //! \brief Emitted when new candidates have been computed. //! \param candidates The list of updated candidates. //! \fn WordCandidateList AbstractWordEngine::fetchCandidates(Model::Text *text) //! \brief Returns a list of candidates. //! \param text The text model. //! //! Needs to be implemented by derived classes. Will not be called if engine //! is disabled or text model has no preedit. //! \property AbstractWordEngine::enabled //! \brief Whether the engine provides updates for word candidates. class AbstractWordEnginePrivate { public: bool enabled; explicit AbstractWordEnginePrivate(); }; AbstractWordEnginePrivate::AbstractWordEnginePrivate() : enabled(false) {} //! \brief Constructor. //! \param parent The owner of this instance. Can be 0, in case QObject //! ownership is not required. AbstractWordEngine::AbstractWordEngine(QObject *parent) : QObject(parent) , d_ptr(new AbstractWordEnginePrivate) {} //! \brief Destructor. //! //! Needs to be implemented in derived classes. AbstractWordEngine::~AbstractWordEngine() {} //! \brief Returns whether the word engine is enabled. //! \sa AbstractWordEngine::enabled bool AbstractWordEngine::isEnabled() const { Q_D(const AbstractWordEngine); return d->enabled; } //! \brief Set whether the engine should be enabled. //! \param enabled Setting to true will be ignored if there's no word //! prediction or error correction backend available. //! \sa AbstractWordEngine::enabled void AbstractWordEngine::setEnabled(bool enabled) { Q_D(AbstractWordEngine); if (d->enabled != enabled) { clearCandidates(); d->enabled = enabled; Q_EMIT enabledChanged(d->enabled); } } //! \brief Clears the current candidates. //! //! Only has an effect when word engine is enabled, in which case //! candidatesCanged() is emitted. void AbstractWordEngine::clearCandidates() { if (isEnabled()) { Q_EMIT candidatesChanged(WordCandidateList()); } } //! \brief Computes new candidates, based on text model. //! \param text The text model. //! //! Can trigger emission of candidatesChanged(). void AbstractWordEngine::computeCandidates(Model::Text *text) { // FIXME: add possiblity to turn off the error correction for // entries that does not need it (like password entries). Also, // with that we probably will want to turn off preedit styling at // all. if (not isEnabled() || not text || text->preedit().isEmpty() || not text->preedit().at(text->preedit().length() - 1).isLetterOrNumber()) { // FIXME: We should here set some special preedit face in text // model (say Disabled or None) which would be interpreted by // editor to send no formatting informations along with // preedit string. When this is done, preedit-string test // needs to be adapted. return; } Q_EMIT candidatesChanged(fetchCandidates(text)); } //! \brief Adds a word to user dictionary. //! \param word A word. //! //! Needs to be implemented in derived classes. This does nothing. void AbstractWordEngine::addToUserDictionary(const QString &word) { Q_UNUSED(word); } }} // namespace MaliitKeyboard, Logic maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/abstractwordengine.h000066400000000000000000000054051214765240700303470ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_ABSTRACTWORDENGINE_H #define MALIIT_KEYBOARD_ABSTRACTWORDENGINE_H #include "models/text.h" #include "models/wordcandidate.h" #include namespace MaliitKeyboard { namespace Logic { class AbstractWordEnginePrivate; class AbstractWordEngine : public QObject { Q_OBJECT Q_DISABLE_COPY(AbstractWordEngine) Q_DECLARE_PRIVATE(AbstractWordEngine) Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) public: explicit AbstractWordEngine(QObject *parent = 0); virtual ~AbstractWordEngine(); virtual bool isEnabled() const; Q_SLOT virtual void setEnabled(bool enabled); Q_SIGNAL void enabledChanged(bool enabled); void clearCandidates(); void computeCandidates(Model::Text *text); Q_SIGNAL void candidatesChanged(const WordCandidateList &candidates); virtual void addToUserDictionary(const QString &word); private: virtual WordCandidateList fetchCandidates(Model::Text *text) = 0; const QScopedPointer d_ptr; }; }} // namespace MaliitKeyboard, Logic #endif // MALIIT_KEYBOARD_ABSTRACTWORDENGINE_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/eventhandler.cpp000066400000000000000000000131311214765240700274670ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "eventhandler.h" #include "layoutupdater.h" #include "models/layout.h" namespace MaliitKeyboard { namespace Logic { class EventHandlerPrivate { public: Model::Layout * const layout; LayoutUpdater * const updater; explicit EventHandlerPrivate(Model::Layout * const new_layout, LayoutUpdater * const new_updater); }; EventHandlerPrivate::EventHandlerPrivate(Model::Layout *const new_layout, LayoutUpdater *const new_updater) : layout(new_layout) , updater(new_updater) { Q_ASSERT(new_layout != 0); Q_ASSERT(new_updater != 0); } //! \brief Performs event handling for Model::Layout instance, using a LayoutUpdater instance. //! //! Does not take ownership of either layout or updater. EventHandler::EventHandler(Model::Layout * const layout, LayoutUpdater * const updater, QObject *parent) : QObject(parent) , d_ptr(new EventHandlerPrivate(layout, updater)) {} EventHandler::~EventHandler() {} void EventHandler::onExtendedKeysShown(const Key &key) { Q_D(EventHandler); d->updater->onExtendedKeysShown(key); } void EventHandler::onEntered(int index) { Q_D(EventHandler); const QVector &keys(d->layout->keyArea().keys()); if (index >= keys.count()) { qWarning() << __PRETTY_FUNCTION__ << "Invalid index:" << index << "Keys available:" << keys.count(); return; } const Key &key(keys.at(index)); const Key pressed_key(d->updater->modifyKey(key, KeyDescription::PressedState)); d->layout->replaceKey(index, pressed_key); d->updater->onKeyEntered(key); Q_EMIT keyEntered(key); } void EventHandler::onExited(int index) { Q_D(EventHandler); const QVector &keys(d->layout->keyArea().keys()); if (index >= keys.count()) { qWarning() << __PRETTY_FUNCTION__ << "Invalid index:" << index << "Keys available:" << keys.count(); return; } const Key &key(keys.at(index)); const Key normal_key(d->updater->modifyKey(key, KeyDescription::NormalState)); d->layout->replaceKey(index, normal_key); d->updater->onKeyExited(normal_key); Q_EMIT keyExited(key); } void EventHandler::onPressed(int index) { Q_D(EventHandler); const QVector &keys(d->layout->keyArea().keys()); if (index >= keys.count()) { qWarning() << __PRETTY_FUNCTION__ << "Invalid index:" << index << "Keys available:" << keys.count(); return; } const Key &key(keys.at(index)); const Key pressed_key(d->updater->modifyKey(key, KeyDescription::PressedState)); d->layout->replaceKey(index, pressed_key); d->updater->onKeyPressed(pressed_key); Q_EMIT keyPressed(pressed_key); } void EventHandler::onReleased(int index) { Q_D(EventHandler); const QVector &keys(d->layout->keyArea().keys()); if (index >= keys.count()) { qWarning() << __PRETTY_FUNCTION__ << "Invalid index:" << index << "Keys available:" << keys.count(); return; } const Key &key(keys.at(index)); const Key normal_key(d->updater->modifyKey(key, KeyDescription::NormalState)); d->layout->replaceKey(index, normal_key); d->updater->onKeyReleased(normal_key); Q_EMIT keyReleased(normal_key); } void EventHandler::onPressAndHold(int index) { Q_D(EventHandler); const QVector &keys(d->layout->keyArea().keys()); if (index >= keys.count()) { qWarning() << __PRETTY_FUNCTION__ << "Invalid index:" << index << "Keys available:" << keys.count(); return; } const Key &key(keys.at(index)); // FIXME: long-press on space needs to work again to save words to dictionary! if (key.hasExtendedKeys()) { Q_EMIT extendedKeysShown(key); } Q_EMIT keyLongPressed(key); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/eventhandler.h000066400000000000000000000055411214765240700271420ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_EVENTHANDLER_H #define MALIIT_KEYBOARD_EVENTHANDLER_H #include namespace MaliitKeyboard { class Key; namespace Model { class Layout; } namespace Logic { class LayoutUpdater; class EventHandlerPrivate; class EventHandler : public QObject { Q_OBJECT Q_DISABLE_COPY(EventHandler) Q_DECLARE_PRIVATE(EventHandler) public: explicit EventHandler(Model::Layout * const layout, LayoutUpdater * const updater, QObject *parent = 0); virtual ~EventHandler(); Q_SLOT void onExtendedKeysShown(const Key &key); Q_SIGNAL void extendedKeysShown(const Key &key); Q_INVOKABLE void onEntered(int index); Q_INVOKABLE void onExited(int index); Q_INVOKABLE void onPressed(int index); Q_INVOKABLE void onReleased(int index); Q_INVOKABLE void onPressAndHold(int index); // Key signals: Q_SIGNAL void keyPressed(const Key &key); Q_SIGNAL void keyLongPressed(const Key &key); Q_SIGNAL void keyReleased(const Key &key); Q_SIGNAL void keyEntered(const Key &key); Q_SIGNAL void keyExited(const Key &key); private: const QScopedPointer d_ptr; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_EVENTHANDLER_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/hitlogic.cpp000066400000000000000000000116731214765240700266230ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "hitlogic.h" namespace MaliitKeyboard { namespace Logic { namespace { //! Find whether pos hit an filtered element, with its rectangle being //! translated to origin. //! \param filtered the list of filtered elements. //! \param origin the origin to use for translation. //! \param pos the position to test against the element bounding box. template T findFilteredElement(const QVector &filtered, const QPoint &origin, const QPoint &pos) { Q_FOREACH (const T ¤t, filtered) { if (current.rect().translated(origin).contains(pos)) { return current; } } // No filtered element found: return T(); } //! From a list of elements of type T, find out whether pos (in same coordinate //! system as geometry) hits one of the elements, if their bounding box is //! translated to geometry's top left corner. //! Returns the found element or a default constructed elment, if pos did //! not hit any of the provided elements. //! \param elements the list of provided elements. //! \param geometry the geometry that pos relates to. //! \param pos the position to test on whether it hit an element. //! \param filtered the list of filtered elements. //! \param behaviour controls the behaviour of elements in filtered list, //! whether to ignore any hit element that is also in filtered //! list, or whether to only accept if hit element is in //! filtered list. template T elementHit(const QVector &elements, const QRect &geometry, const QPoint &pos, const QVector &filtered, FilterBehaviour behaviour) { // TODO: assume pos in screen coordinates and translate here? if (geometry.contains(pos)) { const QPoint &origin(geometry.topLeft()); // FIXME: use binary range search Q_FOREACH (const T ¤t, elements) { const T &from_filter = findFilteredElement(filtered, origin, pos); if (current.rect().translated(origin).contains(pos)) { switch (behaviour) { case IgnoreIfInFilter: if (current != from_filter) { return current; } break; case AcceptIfInFilter: if (current == from_filter) { return current; } break; } } } } // No element hit: return T(); } } //! \sa elementHit Key keyHit(const QVector &keys, const QRect &geometry, const QPoint &pos, const QVector &filtered_keys, FilterBehaviour behaviour) { return elementHit(keys, geometry, pos, filtered_keys, behaviour); } //! \sa elementHit WordCandidate wordCandidateHit(const QVector &candidates, const QRect &geometry, const QPoint &pos, const QVector &filtered_candidates, FilterBehaviour behaviour) { return elementHit(candidates, geometry, pos, filtered_candidates, behaviour); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/hitlogic.h000066400000000000000000000050601214765240700262610ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_HITLOGIC_H #define MALIIT_KEYBOARD_HITLOGIC_H #include "models/key.h" #include "models/wordcandidate.h" #include namespace MaliitKeyboard { namespace Logic { enum FilterBehaviour { IgnoreIfInFilter, AcceptIfInFilter }; Key keyHit(const QVector &keys, const QRect &geometry, const QPoint &pos, const QVector &filtered_keys = QVector(), FilterBehaviour behaviour = IgnoreIfInFilter); WordCandidate wordCandidateHit(const QVector &candidates, const QRect &geometry, const QPoint &pos, const QVector &filtered_candidates = QVector(), FilterBehaviour behaviour = IgnoreIfInFilter); }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_HITLOGIC_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/keyareaconverter.cpp000066400000000000000000000250711214765240700303670ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "keyareaconverter.h" #include "models/styleattributes.h" #include "models/area.h" #include "models/keyarea.h" #include "models/key.h" #include "logic/keyboardloader.h" #include namespace MaliitKeyboard { namespace Logic { //! \class KeyAreaConverter //! Reads keyboard layouts and converts them into key areas. It can apply //! styling attributes, making the key areas ready for rendering. //! Explicit functions are used for the different key areas, instead of a //! generic lookup. This makes the class easier to use and better documents //! the valid combinations. namespace { //! \brief Creates a key area from a keyboard. //! \param attributes The styling attributes that get applied to the key area. //! \param source The keyboard layout used for the key area. //! \param orientation The layout orientation. //! \param is_extended_keyarea Whether the resulting key area is used for //! extended keys (optional). KeyArea createFromKeyboard(StyleAttributes *attributes, const Keyboard &source, LayoutHelper::Orientation orientation, bool is_extended_keyarea = false) { // An ad-hoc geometry updater that also uses styling information. KeyArea ka; Keyboard kb(source); if (not attributes) { qCritical() << __PRETTY_FUNCTION__ << "No style given, aborting."; return ka; } attributes->setStyleName(kb.style_name); Font font; font.setName(attributes->fontName(orientation)); font.setSize(attributes->fontSize(orientation)); font.setColor(attributes->fontColor(orientation)); Font small_font(font); small_font.setSize(attributes->smallFontSize(orientation)); static const QMargins bg_margins(attributes->keyBackgroundBorders()); const qreal max_width(attributes->keyAreaWidth(orientation)); const qreal key_height(attributes->keyHeight(orientation)); const qreal margin = attributes->keyMargin(orientation); const qreal padding = attributes->keyAreaPadding(orientation); QPoint pos(0, 0); QVector row_indices; int spacer_count = 0; qreal consumed_width = 0; for (int index = 0; index < kb.keys.count(); ++index) { row_indices.append(index); Key &key(kb.keys[index]); const KeyDescription &desc(kb.key_descriptions.at(index)); int width = 0; pos.setY(key_height * desc.row); bool at_row_start((index == 0) || (kb.key_descriptions.at(index - 1).row < desc.row)); bool at_row_end((index + 1 == kb.keys.count()) || (index + 1 < kb.keys.count() && kb.key_descriptions.at(index + 1).row > desc.row)); if (desc.left_spacer || desc.right_spacer) { ++spacer_count; } width = attributes->keyWidth(orientation, desc.width); const qreal key_margin((at_row_start || at_row_end) ? margin + padding : margin * 2); Area area; area.setBackground(attributes->keyBackground(key.style(), KeyDescription::NormalState)); area.setBackgroundBorders(bg_margins); area.setSize(QSize(width + key_margin, key_height)); key.setArea(area); key.setOrigin(pos); key.setMargins(QMargins(at_row_start ? padding : margin, margin, at_row_end ? padding : margin, margin)); const QString &text(key.label().text()); key.rLabel().setFont(text.count() > 1 ? small_font : font); if (key.icon().isEmpty()) { key.setIcon(attributes->icon(desc.icon, KeyDescription::NormalState)); } else { key.setIcon(attributes->customIcon(key.icon())); } pos.rx() += key.rect().width(); if (at_row_end) { if (not is_extended_keyarea && spacer_count > 0 && pos.x() < max_width + 1) { const int spacer_width = qMax(0, max_width - pos.x()) / spacer_count; pos.setX(0); int right_x = 0; Q_FOREACH (int row_index, row_indices) { Key &k(kb.keys[row_index]); const KeyDescription &d(kb.key_descriptions.at(row_index)); QRect r(k.rect()); QMargins m(k.margins()); int extra_width = 0; if (d.left_spacer) { m.setLeft(m.left() + spacer_width); extra_width += spacer_width; } if (d.right_spacer) { m.setRight(m.right() + spacer_width); extra_width += spacer_width; } k.setMargins(m); r.translate(right_x - r.left(), 0); r.setWidth(r.width() + extra_width); k.setOrigin(r.topLeft()); k.rArea().setSize(r.size()); right_x = r.x() + r.width(); } } consumed_width = qMax(consumed_width, key.rect().x() + key.rect().width() + padding); row_indices.clear(); pos.setX(0); spacer_count = 0; } } Area area; area.setBackground(attributes->keyAreaBackground()); area.setBackgroundBorders(attributes->keyAreaBackgroundBorders()); area.setSize(QSize((is_extended_keyarea ? consumed_width : max_width), pos.y() + key_height)); ka.setArea(area); ka.setOrigin(is_extended_keyarea ? QPoint(0, -attributes->verticalOffset(orientation)) : QPoint(0, attributes->wordRibbonHeight(orientation))); ka.setKeys(kb.keys); return ka; } } //! \param attributes The styling attributes that should be applied to the //! created key areas. //! \param loader The keyboard layout loader. KeyAreaConverter::KeyAreaConverter(StyleAttributes *attributes, KeyboardLoader *loader) : m_attributes(attributes) , m_loader(loader) , m_orientation(LayoutHelper::Landscape) { if (not attributes || not loader) { qFatal("Neither attributes nor loader can be null."); } } KeyAreaConverter::~KeyAreaConverter() {} //! \brief Sets the layout orientation used for creating key areas. //! \param orientation The layout orientation. Default: landscape. void KeyAreaConverter::setLayoutOrientation(LayoutHelper::Orientation orientation) { m_orientation = orientation; } //! \brief Returns the main key area. KeyArea KeyAreaConverter::keyArea() const { return createFromKeyboard(m_attributes, m_loader->keyboard(), m_orientation); } //! \brief Returns the next key area (right of main key area). KeyArea KeyAreaConverter::nextKeyArea() const { return createFromKeyboard(m_attributes, m_loader->nextKeyboard(), m_orientation); } //! \brief Returns the previous key area (left of main key area). KeyArea KeyAreaConverter::previousKeyArea() const { return createFromKeyboard(m_attributes, m_loader->previousKeyboard(), m_orientation); } //! \brief Returns the main key area with shift bindings activated. KeyArea KeyAreaConverter::shiftedKeyArea() const { return createFromKeyboard(m_attributes, m_loader->shiftedKeyboard(), m_orientation); } //! \brief Returns the symbols key area. //! \param page The symbols page to return (optional). KeyArea KeyAreaConverter::symbolsKeyArea(int page) const { return createFromKeyboard(m_attributes, m_loader->symbolsKeyboard(page), m_orientation); } //! \brief Returns the main key area with dead key bindings activated. //! \param dead The key used to look up the dead keys. KeyArea KeyAreaConverter::deadKeyArea(const Key &dead) const { return createFromKeyboard(m_attributes, m_loader->deadKeyboard(dead), m_orientation); } //! \brief Returns the main key area with dead key bindings activated. //! \param dead The key used to look up the dead keys. KeyArea KeyAreaConverter::shiftedDeadKeyArea(const Key &dead) const { return createFromKeyboard(m_attributes, m_loader->shiftedDeadKeyboard(dead), m_orientation); } //! Returns an extended key area. //! \param key The key used to look up the extended key binding. KeyArea KeyAreaConverter::extendedKeyArea(const Key &key) const { return createFromKeyboard(m_attributes, m_loader->extendedKeyboard(key), m_orientation, true); } //! Returns the number key area. KeyArea KeyAreaConverter::numberKeyArea() const { return createFromKeyboard(m_attributes, m_loader->numberKeyboard(), m_orientation); } //! Returns the phone number key area. KeyArea KeyAreaConverter::phoneNumberKeyArea() const { return createFromKeyboard(m_attributes, m_loader->phoneNumberKeyboard(), m_orientation); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/keyareaconverter.h000066400000000000000000000056001214765240700300300ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_KEYAREACONVERTER_H #define MALIIT_KEYBOARD_KEYAREACONVERTER_H #include "logic/layouthelper.h" #include namespace MaliitKeyboard { class StyleAttributes; class KeyboardLoader; class KeyArea; class Key; namespace Logic { class KeyAreaConverter { private: StyleAttributes * const m_attributes; KeyboardLoader * const m_loader; LayoutHelper::Orientation m_orientation; public: explicit KeyAreaConverter(StyleAttributes *attributes, KeyboardLoader *loader); virtual ~KeyAreaConverter(); void setLayoutOrientation(LayoutHelper::Orientation orientation); virtual KeyArea keyArea() const; virtual KeyArea nextKeyArea() const; virtual KeyArea previousKeyArea() const; virtual KeyArea shiftedKeyArea() const; virtual KeyArea symbolsKeyArea(int page = 0) const; virtual KeyArea deadKeyArea(const Key &dead) const; virtual KeyArea shiftedDeadKeyArea(const Key &dead) const; virtual KeyArea extendedKeyArea(const Key &key) const; virtual KeyArea numberKeyArea() const; virtual KeyArea phoneNumberKeyArea() const; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_KEYAREACONVERTER_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/keyboardloader.cpp000066400000000000000000000506351214765240700300110ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include #include "parser/layoutparser.h" #include "coreutils.h" #include "keyboardloader.h" namespace { using namespace MaliitKeyboard; // For getting languages directory we use a function instead of global constant // because global constants are initialized before main runs. In this case that // would mean that CoreUtils::pluginDataDirectory is ran before any code in main // and it sets its static variable once. We want to be able to set the // environment variable altering behaviour of pluginDataDirectory for testing // purposes. QString getLanguagesDir() { static QString languages_dir; if (languages_dir.isEmpty()) { // From http://doc.qt.nokia.com/4.7/qdir.html#separator: If you always // use "/", Qt will translate your paths to conform to the underlying // operating system. languages_dir = CoreUtils::pluginDataDirectory() + "/languages"; } return languages_dir; } typedef const QStringList (LayoutParser::*ParserFunc)() const; TagKeyboardPtr getTagKeyboard(const QString &id) { if (id.isEmpty()) { return TagKeyboardPtr(); } const QString path(getLanguagesDir() + "/" + id + ".xml"); QFile file(path); if (file.exists()) { file.open(QIODevice::ReadOnly); LayoutParser parser(&file); const bool result(parser.parse()); file.close(); if (result) { return parser.keyboard(); } else { qWarning() << __PRETTY_FUNCTION__ << "Could not parse file:" << path << ", error:" << parser.errorString(); } } else { qWarning() << __PRETTY_FUNCTION__ << "File not found:" << path; } return TagKeyboardPtr(); } QPair keyAndDescFromTags(const TagKeyPtr &key, const TagBindingPtr &binding, int row) { Key skey; KeyDescription skey_description; skey.setExtendedKeysEnabled(key->extended()); skey.rLabel().setText(binding->label()); if (binding->dead()) { // TODO: document it. skey.setAction(Key::ActionDead); } else { skey.setAction(static_cast(binding->action())); } skey.setCommandSequence(binding->sequence()); skey.setIcon(binding->icon().toUtf8()); skey.setStyle(static_cast(key->style())); skey_description.row = row; skey_description.use_rtl_icon = key->rtl(); skey_description.left_spacer = false; skey_description.right_spacer = false; skey_description.width = static_cast(key->width()); switch (skey.action()) { case Key::ActionBackspace: skey_description.icon = KeyDescription::BackspaceIcon; break; case Key::ActionReturn: skey_description.icon = KeyDescription::ReturnIcon; break; case Key::ActionShift: skey_description.icon = KeyDescription::ShiftIcon; break; case Key::ActionClose: skey_description.icon = KeyDescription::CloseIcon; break; case Key::ActionLeftLayout: skey_description.icon = KeyDescription::LeftLayoutIcon; break; case Key::ActionRightLayout: skey_description.icon = KeyDescription::RightLayoutIcon; break; default: if (skey.icon().isEmpty()) { skey_description.icon = KeyDescription::NoIcon; } else { skey_description.icon = KeyDescription::CustomIcon; } break; } skey_description.font_group = KeyDescription::NormalFontGroup; return qMakePair(skey, skey_description); } Keyboard getKeyboard(const TagKeyboardPtr &keyboard, bool shifted = false, int page = 0, const QString &dead_label = "") { Keyboard skeyboard; const QChar dead_key((dead_label.size() == 1) ? dead_label[0] : QChar::Null); if (keyboard) { TagLayoutPtrs layouts(keyboard->layouts()); if (not layouts.isEmpty()) { const TagSectionPtrs sections(layouts.first()->sections()); // sections cannot be empty - parser does not allow that. const TagSectionPtr section(sections[page % sections.size()]); const TagRowPtrs rows(section->rows()); int row_num(0); QString section_style(section->style()); int key_count(0); Q_FOREACH (const TagRowPtr &row, rows) { const TagRowElementPtrs elements(row->elements()); bool spacer_met(false); Q_FOREACH (const TagRowElementPtr &element, elements) { if (element->element_type() == TagRowElement::Key) { const TagKeyPtr key(element.staticCast()); const TagBindingPtr binding(key->binding()); TagBindingPtr the_binding; const TagModifiersPtrs all_modifiers(binding->modifiers()); ++key_count; if (not shifted or all_modifiers.isEmpty()) { the_binding = binding; } else { Q_FOREACH (const TagModifiersPtr &modifiers, all_modifiers) { if (modifiers->keys() == TagModifiers::Shift) { the_binding = modifiers->binding(); } } if (not the_binding) { the_binding = binding; } } const int index(dead_key.isNull() ? -1 : the_binding->accents().indexOf(dead_key)); QPair key_and_desc(keyAndDescFromTags(key, the_binding, row_num)); key_and_desc.first.rLabel().setText(index < 0 ? the_binding->label() : the_binding->accented_labels().at(index)); key_and_desc.second.left_spacer = spacer_met; key_and_desc.second.right_spacer = false; skeyboard.keys.append(key_and_desc.first); skeyboard.key_descriptions.append(key_and_desc.second); spacer_met = false; } else { // spacer if (not skeyboard.key_descriptions.isEmpty()) { KeyDescription &previous_skey_description(skeyboard.key_descriptions.last()); if (previous_skey_description.row == row_num) { previous_skey_description.right_spacer = true; } } spacer_met = true; } } ++row_num; } if (section_style.isEmpty()) { section_style = "keys" + QString::number(key_count); } skeyboard.style_name = section_style; } } return skeyboard; } QPair getTagKeyAndBinding(const TagKeyboardPtr &keyboard, const QString &label, bool *shifted) { QPair pair; if (keyboard) { TagLayoutPtrs layouts(keyboard->layouts()); if (not layouts.isEmpty()) { // sections cannot be empty - parser does not allow that. TagRowPtrs rows(layouts.first()->sections().first()->rows()); Q_FOREACH (const TagRowPtr &row, rows) { TagRowElementPtrs elements(row->elements()); Q_FOREACH (const TagRowElementPtr &element, elements) { if (element->element_type() == TagRowElement::Key) { TagKeyPtr key(element.staticCast()); TagBindingPtr the_binding; TagBindingPtr binding(key->binding()); // Hotfix for suppressing long-press on space bringing // up extended keys if another key has empty label, in // given layout. // FIXME: Make extended keyboard/keyarea part of key // model instead, to avoid wrong lookups. if (binding->action() == TagBinding::Space) { continue; } if (binding->label() == label) { the_binding = binding; *shifted = false; } else { const TagModifiersPtrs all_modifiers(binding->modifiers()); Q_FOREACH (const TagModifiersPtr &modifiers, all_modifiers) { const TagBindingPtr mod_binding(modifiers->binding()); if (mod_binding->label() == label) { the_binding = mod_binding; *shifted = (modifiers->keys() == TagModifiers::Shift); break; } } } if (the_binding) { pair.first = key; pair.second = the_binding; return pair; } } } } } } return pair; } Keyboard getImportedKeyboard(const QString &id, ParserFunc func, const QString &file_prefix, const QString &default_file, int page = 0) { QString path(getLanguagesDir() + "/" + id + ".xml"); QFile file(path); if (file.exists()) { file.open(QIODevice::ReadOnly); LayoutParser parser(&file); const bool result(parser.parse()); file.close(); if (result) { const QStringList f_results((parser.*func)()); Q_FOREACH (const QString &f_result, f_results) { const QFileInfo file_info(getLanguagesDir() + "/" + f_result); if (file_info.exists() and file_info.isFile()) { const TagKeyboardPtr keyboard(getTagKeyboard(file_info.baseName())); return getKeyboard(keyboard, false, page); } } // If we got there then it means that we got xml layout file that does not use // new syntax or just does not specify explicitly which file to import. // In this case we have to search imports list for entry with filename beginning // with file_prefix. const QStringList imports(parser.imports()); const QRegExp file_regexp("^(" + file_prefix + ".*).xml$"); Q_FOREACH (const QString &import, imports) { if (file_regexp.exactMatch(import)) { QFileInfo file_info(getLanguagesDir() + "/" + import); if (file_info.exists() and file_info.isFile()) { const TagKeyboardPtr keyboard(getTagKeyboard(file_regexp.cap(1))); return getKeyboard(keyboard, false, page); } } } // If we got there then we try to just load a file with name in default_file. QFileInfo file_info(getLanguagesDir() + "/" + default_file); if (file_info.exists() and file_info.isFile()) { const TagKeyboardPtr keyboard(getTagKeyboard(file_info.baseName())); return getKeyboard(keyboard, false); } } else { qWarning() << __PRETTY_FUNCTION__ << "Could not parse file:" << path << ", error:" << parser.errorString(); } } else { qWarning() << __PRETTY_FUNCTION__ << "File not found:" << path; } return Keyboard(); } } // anonymous namespace namespace MaliitKeyboard { class KeyboardLoaderPrivate { public: QString active_id; }; KeyboardLoader::KeyboardLoader(QObject *parent) : QObject(parent) , d_ptr(new KeyboardLoaderPrivate) {} KeyboardLoader::~KeyboardLoader() {} QStringList KeyboardLoader::ids() const { QStringList ids; QDir dir(getLanguagesDir(), "*.xml", QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::NoSymLinks | QDir::Readable); if (dir.exists()) { QFileInfoList file_infos(dir.entryInfoList()); Q_FOREACH (const QFileInfo &file_info, file_infos) { QFile file(file_info.filePath()); file.open(QIODevice::ReadOnly); LayoutParser parser(&file); if (parser.isLanguageFile()) { ids.append(file_info.baseName()); } } } return ids; } QString KeyboardLoader::activeId() const { Q_D(const KeyboardLoader); return d->active_id; } void KeyboardLoader::setActiveId(const QString &id) { Q_D(KeyboardLoader); if (d->active_id != id) { d->active_id = id; // FIXME: Emit only after parsing new keyboard. Q_EMIT keyboardsChanged(); } } QString KeyboardLoader::title(const QString &id) const { const TagKeyboardPtr keyboard(getTagKeyboard(id)); if (keyboard) { return keyboard->title(); } return QString(); } Keyboard KeyboardLoader::keyboard() const { Q_D(const KeyboardLoader); TagKeyboardPtr keyboard(getTagKeyboard(d->active_id)); return getKeyboard(keyboard); } Keyboard KeyboardLoader::nextKeyboard() const { Q_D(const KeyboardLoader); const QStringList all_ids(ids()); if (all_ids.isEmpty()) { return Keyboard(); } int next_index(all_ids.indexOf(d->active_id) + 1); if (next_index >= all_ids.size()) { next_index = 0; } TagKeyboardPtr keyboard(getTagKeyboard(all_ids[next_index])); return getKeyboard(keyboard); } Keyboard KeyboardLoader::previousKeyboard() const { Q_D(const KeyboardLoader); const QStringList all_ids(ids()); if (all_ids.isEmpty()) { return Keyboard(); } int previous_index(all_ids.indexOf(d->active_id) - 1); if (previous_index < 0) { previous_index = 0; } TagKeyboardPtr keyboard(getTagKeyboard(all_ids[previous_index])); return getKeyboard(keyboard); } Keyboard KeyboardLoader::shiftedKeyboard() const { Q_D(const KeyboardLoader); TagKeyboardPtr keyboard(getTagKeyboard(d->active_id)); return getKeyboard(keyboard, true); } Keyboard KeyboardLoader::symbolsKeyboard(int page) const { Q_D(const KeyboardLoader); return getImportedKeyboard(d->active_id, &LayoutParser::symviews, "symbols", "symbols_en.xml", page); } Keyboard KeyboardLoader::deadKeyboard(const Key &dead) const { Q_D(const KeyboardLoader); TagKeyboardPtr keyboard(getTagKeyboard(d->active_id)); return getKeyboard(keyboard, false, 0, dead.label().text()); } Keyboard KeyboardLoader::shiftedDeadKeyboard(const Key &dead) const { Q_D(const KeyboardLoader); TagKeyboardPtr keyboard(getTagKeyboard(d->active_id)); return getKeyboard(keyboard, true, 0, dead.label().text()); } Keyboard KeyboardLoader::extendedKeyboard(const Key &key) const { // Hotfix for suppressing long-press on space bringing up extended keys if // another key has empty label, in given layout. // FIXME: Make extended keyboard/keyarea part of key model instead, to // avoid wrong lookups. if (key.action() == Key::ActionSpace) { return Keyboard(); } Q_D(const KeyboardLoader); const TagKeyboardPtr keyboard(getTagKeyboard(d->active_id)); bool shifted(false); const QPair pair(getTagKeyAndBinding(keyboard, key.label().text(), &shifted)); Keyboard skeyboard; if (pair.first and pair.second) { const TagExtendedPtr extended(pair.first->extended()); if (extended) { const TagRowPtrs rows(extended->rows()); int row_index(0); Q_FOREACH (const TagRowPtr &row, rows) { const TagRowElementPtrs elements(row->elements()); Q_FOREACH (const TagRowElementPtr &element, elements) { switch (element->element_type()) { case TagRowElement::Key: { const TagKeyPtr key(element.staticCast()); const TagBindingPtr binding(key->binding()); TagBindingPtr the_binding; if (shifted) { const TagModifiersPtrs all_modifiers(binding->modifiers()); Q_FOREACH(const TagModifiersPtr &modifiers, all_modifiers) { if (modifiers->keys() == TagModifiers::Shift) { the_binding = modifiers->binding(); } } } if (not the_binding) { the_binding = binding; } QPair key_and_desc(keyAndDescFromTags(key, the_binding, row_index)); skeyboard.keys.append(key_and_desc.first); skeyboard.key_descriptions.append(key_and_desc.second); } break; case TagRowElement::Spacer: break; } } ++row_index; } // I don't like this prepending source key idea - it should be done // in language layout file. if (row_index == 1 and not key.label().text().isEmpty() and key.action() == Key::ActionInsert) { Key first_key(skeyboard.keys.first()); KeyDescription first_desc(skeyboard.key_descriptions.first()); first_key.rLabel().setText(key.label().text()); first_key.setIcon(key.icon()); skeyboard.keys.prepend(first_key); skeyboard.key_descriptions.prepend(first_desc); } } } return skeyboard; } Keyboard KeyboardLoader::numberKeyboard() const { Q_D(const KeyboardLoader); return getImportedKeyboard(d->active_id, &LayoutParser::numbers, "number", "number.xml"); } Keyboard KeyboardLoader::phoneNumberKeyboard() const { Q_D(const KeyboardLoader); return getImportedKeyboard(d->active_id, &LayoutParser::phonenumbers, "phonenumber", "phonenumber.xml"); } } // namespace MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/keyboardloader.h000066400000000000000000000060261214765240700274510ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_KEYBOARDLOADER_H #define MALIIT_KEYBOARD_KEYBOARDLOADER_H #include "models/key.h" #include "models/keyboard.h" #include namespace MaliitKeyboard { class KeyboardLoaderPrivate; class KeyboardLoader : public QObject { Q_OBJECT Q_DISABLE_COPY(KeyboardLoader) Q_DECLARE_PRIVATE(KeyboardLoader) public: explicit KeyboardLoader(QObject *parent = 0); virtual ~KeyboardLoader(); virtual QStringList ids() const; virtual QString activeId() const; virtual void setActiveId(const QString &id); virtual QString title(const QString &id) const; virtual Keyboard keyboard() const; virtual Keyboard nextKeyboard() const; virtual Keyboard previousKeyboard() const; virtual Keyboard shiftedKeyboard() const; virtual Keyboard symbolsKeyboard(int page = 0) const; virtual Keyboard deadKeyboard(const Key &dead) const; virtual Keyboard shiftedDeadKeyboard(const Key &dead) const; virtual Keyboard extendedKeyboard(const Key &key) const; virtual Keyboard numberKeyboard() const; virtual Keyboard phoneNumberKeyboard() const; Q_SIGNAL void keyboardsChanged() const; private: const QScopedPointer d_ptr; }; } // namespace MaliitKeyboard #endif // MALIIT_KEYBOARD_KEYBOARDLOADER_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/languagefeatures.cpp000066400000000000000000000050671214765240700303430ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "languagefeatures.h" #include namespace MaliitKeyboard { namespace Logic { LanguageFeatures::LanguageFeatures(QObject *parent) : AbstractLanguageFeatures(parent) { } LanguageFeatures::~LanguageFeatures() { } bool LanguageFeatures::activateAutoCaps(const QString &preedit) const { static const QString sentenceBreak = QString::fromUtf8("!.?:"); if (preedit.isEmpty()) { return false; } if (sentenceBreak.contains(preedit.right(1))) { return true; } return false; } QString LanguageFeatures::appendixForReplacedPreedit(const QString &preedit) const { // Get punctation chars at the end of preedit string QString appendix; for (int i = preedit.size() - 1; i >= 0; i--) { if (not preedit.at(i).isPunct()) { appendix = preedit.right(preedit.size() - i - 1); break; } } appendix.append(" "); return appendix; } } // namespace Logic } // namespace MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/languagefeatures.h000066400000000000000000000042251214765240700300030ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2012-2013 Canonical Ltd * * Contact: maliit-discuss@lists.maliit.org * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIITKEYBOARD_LANGUAGEFEATURES_H #define MALIITKEYBOARD_LANGUAGEFEATURES_H #include "abstractlanguagefeatures.h" namespace MaliitKeyboard { namespace Logic { class LanguageFeatures : public AbstractLanguageFeatures { Q_OBJECT public: explicit LanguageFeatures(QObject *parent = 0); virtual ~LanguageFeatures(); virtual bool activateAutoCaps(const QString &preedit) const; virtual QString appendixForReplacedPreedit(const QString &preedit) const; }; } // namespace Logic } // namespace MaliitKeyboard #endif // MALIITKEYBOARD_LANGUAGEFEATURES_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/layouthelper.cpp000066400000000000000000000305151214765240700275320ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include #include #include "layouthelper.h" #include "coreutils.h" namespace MaliitKeyboard { namespace Logic { namespace { bool removeKey(QVector *keys, const Key &key) { if (not keys) { return false; } for (int index = 0; index < keys->count(); ++index) { const Key ¤t(keys->at(index)); if (current.origin() == key.origin() && current.label() == key.label()) { keys->remove(index); return true; } } return false; } struct KeyPredicate { KeyPredicate(const QSet &changed_ids) : m_changed_ids(changed_ids) {} bool operator()(Key &key) { return (m_changed_ids.constFind(CoreUtils::idFromKey(key)) != m_changed_ids.constEnd()); } const QSet &m_changed_ids; }; } // namespace typedef std::tr1::function EmitFunc; class LayoutHelperPrivate { public: QSize screen_size; QPoint origin; LayoutHelper::Orientation orientation; LayoutHelper::Alignment alignment; LayoutHelper::Panel active_panel; KeyArea left; KeyArea right; KeyArea center; KeyArea extended; // TODO: Make WordCandidates part of KeyArea WordRibbon ribbon; // TODO: Store active keys in KeyArea struct { QVector left; QVector right; QVector center; QVector extended; } active_keys; Key magnifier_key; KeyOverrides overriden_keys; explicit LayoutHelperPrivate(); KeyArea lookup(LayoutHelper::Panel panel) const; QPoint panelOrigin() const; void overrideCheck(const QSet &changed_ids, KeyArea &key_area, const EmitFunc& func); }; LayoutHelperPrivate::LayoutHelperPrivate() : screen_size() , orientation(LayoutHelper::Landscape) , alignment(LayoutHelper::Bottom) , active_panel(LayoutHelper::CenterPanel) , left() , right() , center() , extended() , ribbon() , active_keys() , magnifier_key() , overriden_keys() {} KeyArea LayoutHelperPrivate::lookup(LayoutHelper::Panel panel) const { switch(panel) { case LayoutHelper::LeftPanel: return left; case LayoutHelper::RightPanel: return right; case LayoutHelper::CenterPanel: return center; case LayoutHelper::ExtendedPanel: return extended; case LayoutHelper::NumPanels: break; } qCritical() << __PRETTY_FUNCTION__ << "Should not be reached, invalid panel:" << panel; return KeyArea(); } QPoint LayoutHelperPrivate::panelOrigin() const { return QPoint(0, ribbon.area().size().height()); } void LayoutHelperPrivate::overrideCheck(const QSet &changed_ids, KeyArea &key_area, const EmitFunc &func) { QVector &keys(key_area.rKeys()); KeyPredicate predicate(changed_ids); if (std::find_if(keys.begin(), keys.end(), predicate) != keys.end()) { func(key_area, overriden_keys); } } LayoutHelper::LayoutHelper(QObject *parent) : QObject(parent) , d_ptr(new LayoutHelperPrivate) {} LayoutHelper::~LayoutHelper() {} QSize LayoutHelper::screenSize() const { Q_D(const LayoutHelper); return d->screen_size; } void LayoutHelper::setScreenSize(const QSize &size) { Q_D(LayoutHelper); if (d->screen_size != size) { d->screen_size = size; Q_EMIT screenSizeChanged(d->screen_size); } } LayoutHelper::Orientation LayoutHelper::orientation() const { Q_D(const LayoutHelper); return d->orientation; } void LayoutHelper::setOrientation(Orientation orientation) { Q_D(LayoutHelper); if (d->orientation != orientation) { d->orientation = orientation; Q_EMIT orientationChanged(d->orientation); } } LayoutHelper::Alignment LayoutHelper::alignment() const { Q_D(const LayoutHelper); return d->alignment; } void LayoutHelper::setAlignment(Alignment alignment) { Q_D(LayoutHelper); if (d->alignment != alignment) { d->alignment = alignment; Q_EMIT alignmentChanged(d->alignment); } } LayoutHelper::Panel LayoutHelper::activePanel() const { Q_D(const LayoutHelper); return d->active_panel; } void LayoutHelper::setActivePanel(Panel panel) { Q_D(LayoutHelper); if (panel != NumPanels && d->active_panel != panel) { d->active_panel = panel; Q_EMIT activePanelChanged(d->active_panel); } } KeyArea LayoutHelper::activeKeyArea() const { Q_D(const LayoutHelper); return d->lookup(activePanel()); } QRect LayoutHelper::activeKeyAreaGeometry() const { Q_D(const LayoutHelper); switch(d->active_panel) { case LeftPanel: return d->left.rect(); case RightPanel: return d->right.rect(); case CenterPanel: return d->center.rect(); // FIXME: Dirty hack, because we don't want the glass to take extended key origin into account: case ExtendedPanel: return QRect(QPoint(), d->extended.area().size()); default: break; } qCritical() << __PRETTY_FUNCTION__ << "Should not be reached, invalid panel:" << d->active_panel; return QRect(); } KeyArea LayoutHelper::leftPanel() const { Q_D(const LayoutHelper); return d->left; } void LayoutHelper::setLeftPanel(const KeyArea &left) { Q_D(LayoutHelper); if (d->left != left) { d->left = left; Q_EMIT leftPanelChanged(d->left, d->overriden_keys); } } KeyArea LayoutHelper::rightPanel() const { Q_D(const LayoutHelper); return d->right; } void LayoutHelper::setRightPanel(const KeyArea &right) { Q_D(LayoutHelper); if (d->right != right) { d->right = right; Q_EMIT rightPanelChanged(d->right, d->overriden_keys); } } KeyArea LayoutHelper::centerPanel() const { Q_D(const LayoutHelper); return d->center; } void LayoutHelper::setCenterPanel(const KeyArea ¢er) { Q_D(LayoutHelper); if (d->center != center) { d->center = center; Q_EMIT centerPanelChanged(d->center, d->overriden_keys); } } KeyArea LayoutHelper::extendedPanel() const { Q_D(const LayoutHelper); return d->extended; } void LayoutHelper::setExtendedPanel(const KeyArea &extended) { Q_D(LayoutHelper); if (d->extended != extended) { d->extended = extended; Q_EMIT extendedPanelChanged(d->extended, d->overriden_keys); } } WordRibbon LayoutHelper::wordRibbon() const { Q_D(const LayoutHelper); return d->ribbon; } void LayoutHelper::setWordRibbon(const WordRibbon &ribbon) { Q_D(LayoutHelper); if (d->ribbon != ribbon) { d->ribbon = ribbon; Q_EMIT wordRibbonChanged(d->ribbon); } } QVector LayoutHelper::activeKeys() const { Q_D(const LayoutHelper); switch (d->active_panel) { case LeftPanel: return d->active_keys.left; case RightPanel: return d->active_keys.right; case CenterPanel: return d->active_keys.center; case ExtendedPanel: return d->active_keys.extended; case NumPanels: break; } return QVector(); } void LayoutHelper::clearActiveKeys() { Q_D(LayoutHelper); d->active_keys.left.clear(); d->active_keys.right.clear(); d->active_keys.center.clear(); d->active_keys.extended.clear(); QVector empty; KeyOverrides empty_overrides; Q_EMIT activeKeysChanged(empty, empty_overrides); Q_EMIT activeExtendedKeysChanged(empty, empty_overrides); } void LayoutHelper::appendActiveKey(const Key &key) { Q_D(LayoutHelper); switch (d->active_panel) { case LeftPanel: case RightPanel: case NumPanels: break; case CenterPanel: d->active_keys.center.append(key); Q_EMIT activeKeysChanged(d->active_keys.center, d->overriden_keys); break; case ExtendedPanel: d->active_keys.extended.append(key); Q_EMIT activeExtendedKeysChanged(d->active_keys.extended, d->overriden_keys); break; } } void LayoutHelper::removeActiveKey(const Key &key) { Q_D(LayoutHelper); switch (d->active_panel) { case LeftPanel: case RightPanel: case NumPanels: break; case CenterPanel: if (removeKey(&d->active_keys.center, key)) { Q_EMIT activeKeysChanged(d->active_keys.center, d->overriden_keys); } break; case ExtendedPanel: if (removeKey(&d->active_keys.extended, key)) { Q_EMIT activeExtendedKeysChanged(d->active_keys.extended, d->overriden_keys); } break; } } Key LayoutHelper::magnifierKey() const { Q_D(const LayoutHelper); return d->magnifier_key; } void LayoutHelper::setMagnifierKey(const Key &key) { Q_D(LayoutHelper); if (d->magnifier_key != key) { d->magnifier_key = key; Key magnifier(d->magnifier_key); magnifier.setOrigin(d->magnifier_key.origin()); // FIXME: Avoid this silly conversion by changing the API (also in LayoutUpdater) to take a KeyArea instead. KeyArea area; area.setOrigin(magnifier.origin()); magnifier.setOrigin(QPoint()); area.setArea(magnifier.area()); magnifier.rArea().setBackground(QByteArray()); area.rKeys().append(magnifier); Q_EMIT magnifierChanged(area); } } void LayoutHelper::clearMagnifierKey() { setMagnifierKey(Key()); } void LayoutHelper::onKeysOverriden(const KeyOverrides &overriden_keys, bool update) { Q_D(LayoutHelper); QSet changed_ids; if (update) { for (KeyOverrides::const_iterator i(overriden_keys.begin()), e(overriden_keys.end()); i != e; ++i) { KeyOverrides::iterator override(d->overriden_keys.find(i.key())); if (override != d->overriden_keys.end() && override.value() != i.value()) { override.value() = i.value(); changed_ids.insert(i.key()); } } } else if (d->overriden_keys != overriden_keys) { changed_ids = QSet::fromList(d->overriden_keys.keys()).unite(QSet::fromList(overriden_keys.keys())); d->overriden_keys = overriden_keys; } using std::tr1::placeholders::_1; using std::tr1::placeholders::_2; d->overrideCheck(changed_ids, d->left, std::tr1::bind(&LayoutHelper::leftPanelChanged, this, _1, _2)); d->overrideCheck(changed_ids, d->right, std::tr1::bind(&LayoutHelper::rightPanelChanged, this, _1, _2)); d->overrideCheck(changed_ids, d->center, std::tr1::bind(&LayoutHelper::centerPanelChanged, this, _1, _2)); d->overrideCheck(changed_ids, d->extended, std::tr1::bind(&LayoutHelper::extendedPanelChanged, this, _1, _2)); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/layouthelper.h000066400000000000000000000122131214765240700271720ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_LAYOUT_HELPER_H #define MALIIT_KEYBOARD_LAYOUT_HELPER_H #include "models/key.h" #include "models/keyarea.h" #include "models/wordribbon.h" #include namespace MaliitKeyboard { namespace Logic { typedef QMap KeyOverrides; class LayoutHelperPrivate; // TODO: Implement hit test on Layout, one to check whether key was hit, one to check whether word candidate was hit. // Should return invalid key/wc, or found key/wc. // Would be used by Glass. class LayoutHelper : public QObject { Q_OBJECT Q_DISABLE_COPY(LayoutHelper) Q_DECLARE_PRIVATE(LayoutHelper) public: enum Orientation { Landscape, Portrait }; enum Alignment { Left, Top, Right, Bottom, Floating }; enum Panel { LeftPanel, RightPanel, CenterPanel, ExtendedPanel, NumPanels }; Q_ENUMS(Orientation) Q_ENUMS(Panel) explicit LayoutHelper(QObject *parent = 0); virtual ~LayoutHelper(); QSize screenSize() const; void setScreenSize(const QSize &size); Q_SIGNAL void screenSizeChanged(const QSize &size); Orientation orientation() const; void setOrientation(Orientation orientation); Q_SIGNAL void orientationChanged(Orientation orientation); Alignment alignment() const; void setAlignment(Alignment alignment); Q_SIGNAL void alignmentChanged(Alignment alignment); Panel activePanel() const; void setActivePanel(Panel panel); Q_SIGNAL void activePanelChanged(Panel panel); KeyArea activeKeyArea() const; QRect activeKeyAreaGeometry() const; KeyArea leftPanel() const; void setLeftPanel(const KeyArea &left); Q_SIGNAL void leftPanelChanged(const KeyArea &left, const Logic::KeyOverrides &overrides); KeyArea rightPanel() const; void setRightPanel(const KeyArea &right); Q_SIGNAL void rightPanelChanged(const KeyArea &right, const Logic::KeyOverrides &overrides); KeyArea centerPanel() const; void setCenterPanel(const KeyArea ¢er); Q_SIGNAL void centerPanelChanged(const KeyArea ¢er, const Logic::KeyOverrides &overrides); KeyArea extendedPanel() const; void setExtendedPanel(const KeyArea &extended); Q_SIGNAL void extendedPanelChanged(const KeyArea &extended, const Logic::KeyOverrides &overrides); WordRibbon wordRibbon() const; void setWordRibbon(const WordRibbon &ribbon); Q_SIGNAL void wordRibbonChanged(const WordRibbon &ribbon); QVector activeKeys() const; void clearActiveKeys(); void appendActiveKey(const Key &key); void removeActiveKey(const Key &key); Q_SIGNAL void activeKeysChanged(const QVector &keys, const Logic::KeyOverrides &overrides); Q_SIGNAL void activeExtendedKeysChanged(const QVector &keys, const Logic::KeyOverrides &overrides); Key magnifierKey() const; void setMagnifierKey(const Key &key); void clearMagnifierKey(); Q_SIGNAL void magnifierChanged(const KeyArea &area); Q_SLOT void onKeysOverriden(const Logic::KeyOverrides &overriden_keys, bool update); private: const QScopedPointer d_ptr; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_LAYOUT_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/layoutupdater.cpp000066400000000000000000000576161214765240700277320ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "layoutupdater.h" #include "style.h" #include "models/area.h" #include "models/keyboard.h" #include "models/keydescription.h" #include "models/wordribbon.h" #include "models/wordcandidate.h" #include "models/text.h" #include "models/styleattributes.h" #include "logic/keyareaconverter.h" #include "logic/state-machines/shiftmachine.h" #include "logic/state-machines/viewmachine.h" #include "logic/state-machines/deadkeymachine.h" namespace MaliitKeyboard { namespace Logic { enum ActivationPolicy { ActivateElement, DeactivateElement }; Key modifyKey(const Key &key, KeyDescription::State state, const StyleAttributes *attributes) { if (not attributes) { return key; } Key k(key); k.rArea().setBackground(attributes->keyBackground(key.style(), state)); k.rArea().setBackgroundBorders(attributes->keyBackgroundBorders()); return k; } void applyStyleToCandidate(WordCandidate *candidate, const StyleAttributes *attributes, LayoutHelper::Orientation orientation, ActivationPolicy policy) { if (not candidate || not attributes) { return; } Label &label(candidate->rLabel()); Font f(label.font()); f.setSize(attributes->candidateFontSize(orientation)); f.setStretch(attributes->candidateFontStretch(orientation)); QByteArray color; switch(policy) { case ActivateElement: color = QByteArray("#fff"); break; case DeactivateElement: color = QByteArray("#ddd"); break; } f.setColor(color); label.setFont(f); } // FIXME: Make word candidates fit word ribbon also after orientation change. void applyStyleToWordRibbon(WordRibbon *ribbon, const SharedStyle &style, LayoutHelper::Orientation orientation) { if (not ribbon || style.isNull()) { return; } Area area; StyleAttributes *const a(style->attributes()); area.setBackground(a->wordRibbonBackground()); area.setBackgroundBorders(a->wordRibbonBackgroundBorders()); area.setSize(QSize(a->keyAreaWidth(orientation), a->wordRibbonHeight(orientation))); ribbon->setArea(area); } bool updateWordRibbon(LayoutHelper *layout, const WordCandidate &candidate, const StyleAttributes *attributes, ActivationPolicy policy) { if (not layout || not attributes) { return false; } WordRibbon ribbon(layout->wordRibbon()); QVector &candidates(ribbon.rCandidates()); for (int index = 0; index < candidates.count(); ++index) { WordCandidate ¤t(candidates[index]); if (current.label().text() == candidate.label().text() && current.rect() == candidate.rect()) { applyStyleToCandidate(¤t, attributes, layout->orientation(), policy); layout->setWordRibbon(ribbon); return true; } } return false; } QRect adjustedRect(const QRect &rect, const QMargins &margins) { return rect.adjusted(margins.left(), margins.top(), -margins.right(), -margins.bottom()); } Key magnifyKey(const Key &key, const StyleAttributes *attributes, LayoutHelper::Orientation orientation, const QRectF &key_area_rect) { Font magnifier_font; magnifier_font.setName(attributes->fontName(orientation)); magnifier_font.setColor(attributes->fontColor(orientation)); magnifier_font.setSize(attributes->magnifierFontSize(orientation)); if (key.action() != Key::ActionInsert) { return Key(); } const QRect adjusted_key_rect(adjustedRect(key.rect(), key.margins())); QRect magnifier_rect(adjusted_key_rect.topLeft(), QSize(attributes->magnifierKeyWidth(orientation), attributes->magnifierKeyHeight(orientation))); magnifier_rect.translate((adjusted_key_rect.width() - magnifier_rect.width()) / 2, -1 * attributes->verticalOffset(orientation)); const QRect &mapped(magnifier_rect.translated(key_area_rect.topLeft().toPoint())); const int delta_left(mapped.left() - (key_area_rect.left() + attributes->safetyMargin(orientation))); const int delta_right((key_area_rect.x() + key_area_rect.width() - attributes->safetyMargin(orientation)) - (mapped.x() + mapped.width())); if (delta_left < 0) { magnifier_rect.translate(qAbs(delta_left), 0); } else if (delta_right < 0) { magnifier_rect.translate(delta_right, 0); } Key magnifier(key); magnifier.setOrigin(magnifier_rect.topLeft()); magnifier.rArea().setBackground(attributes->magnifierKeyBackground()); magnifier.rArea().setSize(magnifier_rect.size()); magnifier.rArea().setBackgroundBorders(attributes->magnifierKeyBackgroundBorders()); magnifier.rLabel().setFont(magnifier_font); // Compute label rectangle, contains the text: const qreal label_offset(attributes->magnifierKeyLabelVerticalOffset(orientation)); const QSize &magnifier_size(magnifier.area().size()); const QRect label_rect(0, 0, magnifier_size.width(), magnifier_size.height() - label_offset); magnifier.rLabel().setRect(label_rect); magnifier.setMargins(QMargins()); return magnifier; } class LayoutUpdaterPrivate { public: bool initialized; LayoutHelper *layout; KeyboardLoader loader; ShiftMachine shift_machine; ViewMachine view_machine; DeadkeyMachine deadkey_machine; SharedStyle style; bool word_ribbon_visible; LayoutHelper::Panel close_extended_on_release; explicit LayoutUpdaterPrivate() : initialized(false) , layout(0) , loader() , shift_machine() , view_machine() , deadkey_machine() , style() , word_ribbon_visible(false) , close_extended_on_release(LayoutHelper::NumPanels) // NumPanels counts as invalid panel. {} bool inShiftedState() const { return (shift_machine.inState(ShiftMachine::shift_state) or shift_machine.inState(ShiftMachine::caps_lock_state) or shift_machine.inState(ShiftMachine::latched_shift_state)); } bool arePrimarySymbolsShown() const { return view_machine.inState(ViewMachine::symbols0_state); } bool areSecondarySymbolsShown() const { return view_machine.inState(ViewMachine::symbols1_state); } bool areSymbolsShown() const { return arePrimarySymbolsShown() or areSecondarySymbolsShown(); } bool inDeadkeyState() const { return (deadkey_machine.inState(DeadkeyMachine::deadkey_state) or deadkey_machine.inState(DeadkeyMachine::latched_deadkey_state)); } const StyleAttributes * activeStyleAttributes() const { return (layout->activePanel() == LayoutHelper::ExtendedPanel ? style->extendedKeysAttributes() : style->attributes()); } }; LayoutUpdater::LayoutUpdater(QObject *parent) : QObject(parent) , d_ptr(new LayoutUpdaterPrivate) { connect(&d_ptr->loader, SIGNAL(keyboardsChanged()), this, SLOT(onKeyboardsChanged()), Qt::UniqueConnection); } LayoutUpdater::~LayoutUpdater() {} void LayoutUpdater::init() { Q_D(LayoutUpdater); d->shift_machine.setup(this); d->view_machine.setup(this); d->deadkey_machine.setup(this); } QStringList LayoutUpdater::keyboardIds() const { Q_D(const LayoutUpdater); return d->loader.ids(); } QString LayoutUpdater::activeKeyboardId() const { Q_D(const LayoutUpdater); return d->loader.activeId(); } void LayoutUpdater::setActiveKeyboardId(const QString &id) { Q_D(LayoutUpdater); d->loader.setActiveId(id); } QString LayoutUpdater::keyboardTitle(const QString &id) const { Q_D(const LayoutUpdater); return d->loader.title(id); } void LayoutUpdater::setLayout(LayoutHelper *layout) { Q_D(LayoutUpdater); d->layout = layout; if (not d->initialized) { init(); d->initialized = true; } } void LayoutUpdater::setOrientation(LayoutHelper::Orientation orientation) { Q_D(LayoutUpdater); if (d->layout && d->style && d->layout->orientation() != orientation) { d->layout->setOrientation(orientation); KeyAreaConverter converter(d->style->attributes(), &d->loader); converter.setLayoutOrientation(orientation); d->layout->setCenterPanel(d->inShiftedState() ? converter.shiftedKeyArea() : converter.keyArea()); if (isWordRibbonVisible()) { WordRibbon ribbon(d->layout->wordRibbon()); applyStyleToWordRibbon(&ribbon, d->style, orientation); d->layout->setWordRibbon(ribbon); } clearActiveKeysAndMagnifier(); } } void LayoutUpdater::setStyle(const SharedStyle &style) { Q_D(LayoutUpdater); d->style = style; } bool LayoutUpdater::isWordRibbonVisible() const { Q_D(const LayoutUpdater); return d->word_ribbon_visible; } void LayoutUpdater::setWordRibbonVisible(bool visible) { Q_D(LayoutUpdater); if (d->word_ribbon_visible != visible) { d->word_ribbon_visible = visible; if (d->layout && d->style && d->word_ribbon_visible) { WordRibbon ribbon; applyStyleToWordRibbon(&ribbon, d->style, d->layout->orientation()); d->layout->setWordRibbon(ribbon); } else if (d->layout) { d->layout->setWordRibbon(WordRibbon()); } Q_EMIT wordRibbonVisibleChanged(visible); } } //! \brief Modify visual appearance of a key, depending on state. //! //! Uses the currently active style and the key action to decide the visual //! appearance. Can be used to make a key appear pressed or a shift key appear //! locked. //! //! \param key The key to modify. //! \param state The key state (normal, pressed, disabled, highlighted). Key LayoutUpdater::modifyKey(const Key &key, KeyDescription::State state) const { Q_D(const LayoutUpdater); return MaliitKeyboard::Logic::modifyKey(key, state, d->activeStyleAttributes()); } void LayoutUpdater::onKeyPressed(const Key &key) { Q_D(LayoutUpdater); if (not d->layout) { return; } d->layout->appendActiveKey(MaliitKeyboard::Logic::modifyKey(key, KeyDescription::PressedState, d->activeStyleAttributes())); if (d->layout->activePanel() == LayoutHelper::CenterPanel) { d->layout->setMagnifierKey(magnifyKey(key, d->activeStyleAttributes(), d->layout->orientation(), d->layout->centerPanel().rect())); } switch (key.action()) { case Key::ActionShift: Q_EMIT shiftPressed(); break; case Key::ActionDead: d->deadkey_machine.setAccentKey(key); Q_EMIT deadkeyPressed(); break; default: break; } } void LayoutUpdater::onKeyLongPressed(const Key &key) { Q_UNUSED(key); Q_D(LayoutUpdater); if (not d->layout || d->style.isNull()) { return; } clearActiveKeysAndMagnifier(); const LayoutHelper::Orientation orientation(d->layout->orientation()); StyleAttributes * const extended_attributes(d->style->extendedKeysAttributes()); const qreal vertical_offset(d->style->attributes()->verticalOffset(orientation)); KeyAreaConverter converter(extended_attributes, &d->loader); converter.setLayoutOrientation(orientation); KeyArea ext_ka(converter.extendedKeyArea(key)); if (not ext_ka.hasKeys()) { if (key.action() == Key::ActionSpace) { Q_EMIT addToUserDictionary(); } return; } const QSize &ext_panel_size(ext_ka.area().size()); const QSize ¢er_panel_size(d->layout->centerPanel().area().size()); const QPointF &key_center(key.rect().center()); const qreal safety_margin(extended_attributes->safetyMargin(orientation)); QPoint offset(qMax(safety_margin, key_center.x() - ext_panel_size.width() / 2), key.rect().top() - vertical_offset); if (offset.x() + ext_panel_size.width() > center_panel_size.width()) { offset.rx() = center_panel_size.width() - ext_panel_size.width() - safety_margin; } ext_ka.setOrigin(offset); d->layout->setExtendedPanel(ext_ka); d->layout->setActivePanel(LayoutHelper::ExtendedPanel); } void LayoutUpdater::onKeyReleased(const Key &key) { Q_D(const LayoutUpdater); if (not d->layout) { return; } d->layout->removeActiveKey(key); d->layout->clearMagnifierKey(); if (d->layout->activePanel() == LayoutHelper::ExtendedPanel) { d->layout->clearActiveKeys(); d->layout->setExtendedPanel(KeyArea()); d->layout->setActivePanel(LayoutHelper::CenterPanel); return; } switch (key.action()) { case Key::ActionShift: Q_EMIT shiftReleased(); break; case Key::ActionInsert: if (d->shift_machine.inState(ShiftMachine::latched_shift_state)) { Q_EMIT shiftCancelled(); } if (d->deadkey_machine.inState(DeadkeyMachine::latched_deadkey_state)) { Q_EMIT deadkeyCancelled(); } break; case Key::ActionSym: Q_EMIT symKeyReleased(); break; case Key::ActionSwitch: Q_EMIT symSwitcherReleased(); break; case Key::ActionDead: Q_EMIT deadkeyReleased(); break; default: break; } } void LayoutUpdater::onKeyAreaPressed(LayoutHelper::Panel panel) { Q_D(LayoutUpdater); if (not d->layout) { return; } if (d->layout->activePanel() == LayoutHelper::ExtendedPanel && panel != LayoutHelper::ExtendedPanel) { d->close_extended_on_release = panel; } } void LayoutUpdater::onKeyAreaReleased(LayoutHelper::Panel panel) { Q_D(LayoutUpdater); if (not d->layout) { return; } if (d->close_extended_on_release == panel) { d->layout->setExtendedPanel(KeyArea()); d->layout->setActivePanel(LayoutHelper::CenterPanel); } d->close_extended_on_release = LayoutHelper::NumPanels; } void LayoutUpdater::onKeyEntered(const Key &key) { Q_D(const LayoutUpdater); if (not d->layout) { return; } d->layout->appendActiveKey(MaliitKeyboard::Logic::modifyKey(key, KeyDescription::PressedState, d->activeStyleAttributes())); if (d->layout->activePanel() == LayoutHelper::CenterPanel) { d->layout->setMagnifierKey(magnifyKey(key, d->activeStyleAttributes(), d->layout->orientation(), d->layout->centerPanel().rect())); } } void LayoutUpdater::onKeyExited(const Key &key) { Q_D(const LayoutUpdater); if (not d->layout) { return; } d->layout->removeActiveKey(key); d->layout->clearMagnifierKey(); // FIXME: This is in a race with onKeyEntered. } void LayoutUpdater::clearActiveKeysAndMagnifier() { Q_D(const LayoutUpdater); if (not d->layout) { qCritical() << __PRETTY_FUNCTION__ << "No layout specified."; return; } d->layout->clearActiveKeys(); d->layout->clearMagnifierKey(); } void LayoutUpdater::resetOnKeyboardClosed() { Q_D(const LayoutUpdater); clearActiveKeysAndMagnifier(); d->layout->setExtendedPanel(KeyArea()); d->layout->setActivePanel(LayoutHelper::CenterPanel); } void LayoutUpdater::onWordCandidatesChanged(const WordCandidateList &candidates) { Q_D(LayoutUpdater); if (not d->layout || not isWordRibbonVisible()) { qWarning() << __PRETTY_FUNCTION__ << "No layout specified or word ribbon not visible."; return; } // Copy WordRibbon instance in order to preserve geometry and styling: WordRibbon ribbon(d->layout->wordRibbon()); ribbon.clearCandidates(); const StyleAttributes * const attributes(d->activeStyleAttributes()); const LayoutHelper::Orientation orientation(d->layout->orientation()); const int candidate_width(attributes->keyAreaWidth(orientation) / (orientation == LayoutHelper::Landscape ? 6 : 4)); for (int index = 0; index < candidates.count(); ++index) { WordCandidate word_candidate(candidates.at(index)); // FIXME candidate height needs to come from word ribbon height word_candidate.rArea().setSize(QSize(word_candidate.source() == WordCandidate::SourceUser ? attributes->keyAreaWidth(orientation) : candidate_width, 56)); word_candidate.setOrigin(QPoint(index * candidate_width, 0)); applyStyleToCandidate(&word_candidate, d->activeStyleAttributes(), orientation, DeactivateElement); ribbon.appendCandidate(word_candidate); } d->layout->setWordRibbon(ribbon); } void LayoutUpdater::onExtendedKeysShown(const Key &main_key) { Q_D(LayoutUpdater); if (not d->layout || d->style.isNull()) { return; } clearActiveKeysAndMagnifier(); const LayoutHelper::Orientation orientation(d->layout->orientation()); StyleAttributes * const extended_attributes(d->style->extendedKeysAttributes()); const qreal vertical_offset(d->style->attributes()->verticalOffset(orientation)); KeyAreaConverter converter(extended_attributes, &d->loader); converter.setLayoutOrientation(orientation); KeyArea ext_ka(converter.extendedKeyArea(main_key)); if (not ext_ka.hasKeys()) { if (main_key.action() == Key::ActionSpace) { Q_EMIT addToUserDictionary(); } return; } const QSize &ext_panel_size(ext_ka.area().size()); const QSize ¢er_panel_size(d->layout->centerPanel().area().size()); const QPointF &key_center(main_key.rect().center()); const qreal safety_margin(extended_attributes->safetyMargin(orientation)); QPoint offset(qMax(safety_margin, key_center.x() - ext_panel_size.width() / 2), main_key.rect().top() - vertical_offset); if (offset.x() + ext_panel_size.width() > center_panel_size.width()) { offset.rx() = center_panel_size.width() - ext_panel_size.width() - safety_margin; } ext_ka.setOrigin(offset); d->layout->setExtendedPanel(ext_ka); d->layout->setActivePanel(LayoutHelper::ExtendedPanel); } void LayoutUpdater::onWordCandidatePressed(const WordCandidate &candidate) { Q_D(LayoutUpdater); if (d->layout && isWordRibbonVisible() && updateWordRibbon(d->layout, candidate, d->activeStyleAttributes(), ActivateElement)) { } } void LayoutUpdater::onWordCandidateReleased(const WordCandidate &candidate) { Q_D(LayoutUpdater); if (d->layout && isWordRibbonVisible() && updateWordRibbon(d->layout, candidate, d->activeStyleAttributes(), DeactivateElement)) { if (candidate.source() == WordCandidate::SourcePrediction || candidate.source() == WordCandidate::SourceSpellChecking) { Q_EMIT wordCandidateSelected(candidate.word()); } else if (candidate.source() == WordCandidate::SourceUser) { Q_EMIT userCandidateSelected(candidate.word()); } } } void LayoutUpdater::syncLayoutToView() { Q_D(const LayoutUpdater); if (not d->layout) { return; } // Symbols do not care about shift state. if (d->areSymbolsShown()) { return; } if (d->inDeadkeyState()) { switchToAccentedView(); } else { switchToMainView(); } } void LayoutUpdater::onKeyboardsChanged() { Q_D(LayoutUpdater); // Resetting state machines should reset layout also. // FIXME: Most probably reloading will happen three // times, which is not what we want. d->shift_machine.restart(); d->deadkey_machine.restart(); d->view_machine.restart(); Q_EMIT keyboardTitleChanged(d->loader.title(d->loader.activeId())); } void LayoutUpdater::switchToMainView() { Q_D(LayoutUpdater); if (not d->layout || d->style.isNull()) { return; } d->layout->clearActiveKeys(); d->layout->clearMagnifierKey(); const LayoutHelper::Orientation orientation(d->layout->orientation()); if (d->word_ribbon_visible) { WordRibbon ribbon(d->layout->wordRibbon()); applyStyleToWordRibbon(&ribbon, d->style, orientation); d->layout->setWordRibbon(ribbon); } KeyAreaConverter converter(d->style->attributes(), &d->loader); converter.setLayoutOrientation(orientation); d->layout->setCenterPanel(d->inShiftedState() ? converter.shiftedKeyArea() : converter.keyArea()); } void LayoutUpdater::switchToPrimarySymView() { Q_D(LayoutUpdater); if (not d->layout || d->style.isNull()) { return; } const LayoutHelper::Orientation orientation(d->layout->orientation()); KeyAreaConverter converter(d->style->attributes(), &d->loader); converter.setLayoutOrientation(orientation); d->layout->setCenterPanel(converter.symbolsKeyArea(0)); // Reset shift state machine, also see switchToMainView. d->shift_machine.restart(); } void LayoutUpdater::switchToSecondarySymView() { Q_D(LayoutUpdater); if (not d->layout || d->style.isNull()) { return; } const LayoutHelper::Orientation orientation(d->layout->orientation()); KeyAreaConverter converter(d->style->attributes(), &d->loader); converter.setLayoutOrientation(orientation); d->layout->setCenterPanel(converter.symbolsKeyArea(1)); } void LayoutUpdater::switchToAccentedView() { Q_D(LayoutUpdater); if (not d->layout || d->style.isNull()) { return; } const LayoutHelper::Orientation orientation(d->layout->orientation()); KeyAreaConverter converter(d->style->attributes(), &d->loader); converter.setLayoutOrientation(orientation); const Key accent(d->deadkey_machine.accentKey()); d->layout->setCenterPanel(d->inShiftedState() ? converter.shiftedDeadKeyArea(accent) : converter.deadKeyArea(accent)); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/layoutupdater.h000066400000000000000000000113731214765240700273650ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_LAYOUTUPDATER_H #define MALIIT_KEYBOARD_LAYOUTUPDATER_H #include "keyboardloader.h" #include "models/key.h" #include "models/wordcandidate.h" #include "logic/layouthelper.h" #include "logic/style.h" #include namespace MaliitKeyboard { namespace Logic { class LayoutUpdaterPrivate; class LayoutUpdater : public QObject { Q_OBJECT Q_DISABLE_COPY(LayoutUpdater) Q_DECLARE_PRIVATE(LayoutUpdater) Q_PROPERTY(bool wordRibbonVisible READ isWordRibbonVisible WRITE setWordRibbonVisible NOTIFY wordRibbonVisibleChanged) public: explicit LayoutUpdater(QObject *parent = 0); virtual ~LayoutUpdater(); void init(); QStringList keyboardIds() const; QString activeKeyboardId() const; void setActiveKeyboardId(const QString &id); QString keyboardTitle(const QString &id) const; void setLayout(LayoutHelper *layout); Q_SLOT void setOrientation(LayoutHelper::Orientation orientation); void setStyle(const SharedStyle &style); bool isWordRibbonVisible() const; Q_SLOT void setWordRibbonVisible(bool visible); Q_SIGNAL void wordRibbonVisibleChanged(bool visible); Key modifyKey(const Key &key, KeyDescription::State state) const; // Key signal handlers: Q_SLOT void onKeyPressed(const Key &key); Q_SLOT void onKeyLongPressed(const Key &key); Q_SLOT void onKeyReleased(const Key &key); Q_SLOT void onKeyAreaPressed(Logic::LayoutHelper::Panel panel); Q_SLOT void onKeyAreaReleased(Logic::LayoutHelper::Panel panel); Q_SLOT void onKeyEntered(const Key &key); Q_SLOT void onKeyExited(const Key &key); Q_SLOT void clearActiveKeysAndMagnifier(); Q_SLOT void resetOnKeyboardClosed(); Q_SLOT void onWordCandidatesChanged(const WordCandidateList &candidates); // ExtendedKeyArea signal handlers: Q_SLOT void onExtendedKeysShown(const Key &main_key); // WordCandidate signal handlers: Q_SLOT void onWordCandidatePressed(const WordCandidate &candidate); Q_SLOT void onWordCandidateReleased(const WordCandidate &candidate); Q_SIGNAL void wordCandidateSelected(const QString &candidate); Q_SIGNAL void userCandidateSelected(const QString &candidate); Q_SIGNAL void addToUserDictionary(); Q_SIGNAL void keyboardTitleChanged(const QString &title); private: Q_SIGNAL void shiftPressed(); Q_SIGNAL void shiftReleased(); Q_SIGNAL void autoCapsActivated(); Q_SIGNAL void shiftCancelled(); Q_SLOT void syncLayoutToView(); Q_SLOT void onKeyboardsChanged(); Q_SIGNAL void symKeyReleased(); Q_SIGNAL void symSwitcherReleased(); Q_SLOT void switchToMainView(); Q_SLOT void switchToPrimarySymView(); Q_SLOT void switchToSecondarySymView(); Q_SIGNAL void deadkeyPressed(); Q_SIGNAL void deadkeyReleased(); Q_SIGNAL void deadkeyCancelled(); Q_SLOT void switchToAccentedView(); const QScopedPointer d_ptr; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_LAYOUTUPDATER_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/logic.pri000066400000000000000000000015631214765240700261230ustar00rootroot00000000000000LOGIC_DIR = ./logic HEADERS += \ logic/hitlogic.h \ logic/layouthelper.h \ logic/layoutupdater.h \ logic/keyboardloader.h \ logic/keyareaconverter.h \ logic/style.h \ logic/spellchecker.h \ logic/abstractwordengine.h \ logic/wordengine.h \ logic/abstractlanguagefeatures.h \ logic/languagefeatures.h \ logic/eventhandler.h \ SOURCES += \ logic/hitlogic.cpp \ logic/layouthelper.cpp \ logic/layoutupdater.cpp \ logic/keyboardloader.cpp \ logic/keyareaconverter.cpp \ logic/style.cpp \ logic/spellchecker.cpp \ logic/abstractwordengine.cpp \ logic/wordengine.cpp \ logic/abstractlanguagefeatures.cpp \ logic/languagefeatures.cpp \ logic/eventhandler.cpp \ DEFINES += HUNSPELL_DICT_PATH=\\\"$$HUNSPELL_DICT_PATH\\\" DEPENDPATH += $$LOGIC_DIR include(state-machines/state-machines.pri) maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/spellchecker.cpp000066400000000000000000000162541214765240700274650ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "spellchecker.h" #ifdef HAVE_HUNSPELL #include "hunspell/hunspell.hxx" #else class Hunspell { public: Hunspell(const char *, const char *, const char * = NULL) : encoding("UTF-8") {} int add_dic (const char *, const char * = NULL) { return 0; } char *get_dic_encoding() { return encoding.data(); } int spell(const char *, int * = NULL, char ** = NULL) { return 1; } int suggest(char *** lst, const char *) { if (lst) { *lst = NULL; } return 0; } void free_list(char ***, int) {} int add(const char *) { return 0; } private: // Using QByteArray here instead of just returning "UTF-8" in get_dic_encoding // to avoid a following warning: // warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] QByteArray encoding; }; #endif #include #include #include #include #include namespace MaliitKeyboard { namespace Logic { //! \class SpellChecker //! Checks spelling and suggest words. Currently Spellchecker is //! implemented by using Hunspell. struct SpellCheckerPrivate { Hunspell hunspell; //!< The spellchecker backend, Hunspell. QTextCodec *codec; //!< Which codec to use. bool enabled; //!< Whether the spellchecker is enabled. QSet ignored_words; //!< The words to ignore. QString user_dictionary_file; SpellCheckerPrivate(const QString &dictionary_path, const QString &user_dictionary); }; SpellCheckerPrivate::SpellCheckerPrivate(const QString &dictionary_path, const QString &user_dictionary) // XXX: toUtf8? toLatin1? toAscii? toLocal8Bit? : hunspell((dictionary_path + ".aff").toUtf8().constData(), (dictionary_path + ".dic").toUtf8().constData()) , codec(QTextCodec::codecForName(hunspell.get_dic_encoding())) , enabled(false) , ignored_words() , user_dictionary_file(user_dictionary) { if (not codec) { qWarning () << __PRETTY_FUNCTION__ << ":Could not find codec for" << hunspell.get_dic_encoding() << "- turning off spellchecking and suggesting."; return; } if (not user_dictionary.isEmpty() and QFile::exists(user_dictionary)) { QFile file(user_dictionary); if (file.open(QFile::ReadOnly)) { QTextStream stream(&file); while (!stream.atEnd()) { hunspell.add(codec->fromUnicode(stream.readLine())); } } } enabled = true; } SpellChecker::~SpellChecker() {} //! \param dictionary_path The directory path to the (system) dictionaries. //! \param user_dictionary The file path to the user's own dictionary. SpellChecker::SpellChecker(const QString &dictionary_path, const QString &user_dictionary) : d_ptr(new SpellCheckerPrivate(dictionary_path, user_dictionary)) {} //! \brief Checks whether given word is spelled correctly. //! //! Ignored words are treated as having correct spelling. \sa ignoreWord. //! \param word word to check for spelling. //! \return \c true if the word has correct spelling (or is ignored), //! otherwise \c false. bool SpellChecker::spell(const QString &word) { Q_D(SpellChecker); if (not d->enabled or d->ignored_words.contains(word)) { return true; } return d->hunspell.spell(d->codec->fromUnicode(word)); } //! \brief Gives suggestions for a given word. //! \param word Base for suggestions. //! \param limit Suggestion count limit (-1 for no limits). //! \return a list of suggestions. QStringList SpellChecker::suggest(const QString &word, int limit) { Q_D(SpellChecker); if (not d->enabled) { return QStringList(); } char** suggestions = NULL; const int suggestions_count = d->hunspell.suggest(&suggestions, d->codec->fromUnicode(word)); // Less than zero means some error. if (suggestions_count < 0) { qWarning() << __PRETTY_FUNCTION__ << ": Failed to get suggestions for" << word << "."; return QStringList(); } QStringList result; const int final_limit((limit < 0) ? suggestions_count : qMin(limit, suggestions_count)); for (int index(0); index < final_limit; ++index) { result << d->codec->toUnicode(suggestions[index]); } d->hunspell.free_list(&suggestions, suggestions_count); return result; } //! \brief Marks a given word as ignored. //! \param word The word to ignore - it will not be checked for spelling. void SpellChecker::ignoreWord(const QString &word) { Q_D(SpellChecker); if (not d->enabled) { return; } d->ignored_words.insert(word); } //! \brief Adds a given word to user dictionary. //! \param word The word to be added to user dictionary - it will be used for //! spellchecking and suggesting. void SpellChecker::addToUserWordlist(const QString &word) { Q_D(SpellChecker); if (not d->enabled) { return; } QFile user_dictionary(d->user_dictionary_file); QDir::home().mkpath(QFileInfo(user_dictionary).absolutePath()); if (user_dictionary.open(QFile::Append)) { QTextStream stream(&user_dictionary); stream << word << endl; } // Non-zero return value means some error. if (d->hunspell.add(d->codec->fromUnicode(word))) { qWarning() << __PRETTY_FUNCTION__ << ": Failed to add '" << word << "' to user dictionary."; } } // static QString SpellChecker::dictPath() { return QString(HUNSPELL_DICT_PATH); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/spellchecker.h000066400000000000000000000053051214765240700271250ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_SPELLCHECKER_H #define MALIIT_KEYBOARD_SPELLCHECKER_H #include namespace MaliitKeyboard { namespace Logic { class SpellCheckerPrivate; class SpellChecker { Q_DISABLE_COPY(SpellChecker) Q_DECLARE_PRIVATE(SpellChecker) public: // FIXME: Find better way to discover default dictionaries. // FIXME: Allow changing languages in between. explicit SpellChecker(const QString &dictionary_path = QString("%1/en_GB").arg(SpellChecker::dictPath()), const QString &user_dictionary = QString("%1/.config/maliit/userwords.txt").arg(QDir::homePath())); ~SpellChecker(); bool spell(const QString &word); QStringList suggest(const QString &word, int limit = -1); void ignoreWord(const QString &word); void addToUserWordlist(const QString &word); static QString dictPath(); private: const QScopedPointer d_ptr; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_SPELLCHECKER_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/000077500000000000000000000000001214765240700272125ustar00rootroot00000000000000abstractstatemachine.cpp000066400000000000000000000046551214765240700340420ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "abstractstatemachine.h" #include namespace MaliitKeyboard { namespace Logic { AbstractStateMachine::AbstractStateMachine() {} AbstractStateMachine::~AbstractStateMachine() {} bool AbstractStateMachine::inState(const QString &name) const { if (const QStateMachine *sm = dynamic_cast(this)) { Q_FOREACH (QAbstractState *state, sm->configuration()) { if (state->objectName() == name) { return true; } } } return false; } void AbstractStateMachine::restart() { if (QStateMachine *sm = dynamic_cast(this)) { sm->stop(); QTimer::singleShot(0, sm, SLOT(start())); } } }} // namespace Logic, MaliitKeyboard abstractstatemachine.h000066400000000000000000000043001214765240700334720ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_ABSTRACTSTATEMACHINE_H #define MALIIT_KEYBOARD_ABSTRACTSTATEMACHINE_H class QString; namespace MaliitKeyboard { namespace Logic { class LayoutUpdater; class AbstractStateMachine { public: explicit AbstractStateMachine(); virtual ~AbstractStateMachine() = 0; virtual void setup(LayoutUpdater *updater) = 0; virtual bool inState(const QString &name) const; virtual void restart(); }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_ABSTRACTSTATEMACHINE_H deadkeymachine.cpp000066400000000000000000000100541214765240700325720ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "deadkeymachine.h" #include "logic/layoutupdater.h" namespace MaliitKeyboard { namespace Logic { const char *const DeadkeyMachine::no_deadkey_state = "no-deadkey"; const char *const DeadkeyMachine::latched_deadkey_state = "latched-deadkey"; const char *const DeadkeyMachine::deadkey_state = "deadkey"; class DeadkeyMachinePrivate { public: Key accent_key; explicit DeadkeyMachinePrivate() : accent_key() {} }; DeadkeyMachine::DeadkeyMachine(QObject *parent) : QStateMachine(parent) , d_ptr(new DeadkeyMachinePrivate) {} DeadkeyMachine::~DeadkeyMachine() {} void DeadkeyMachine::setup(LayoutUpdater *updater) { if (not updater) { qCritical() << __PRETTY_FUNCTION__ << "No updater specified. Aborting setup."; return; } setChildMode(QState::ExclusiveStates); QState *no_deadkey = 0; QState *deadkey = 0; QState *latched_deadkey = 0; // addState makes state machine to be a parent of passed state, // so we don't have to care about deleting states explicitly. addState(no_deadkey = new QState); addState(deadkey = new QState); addState(latched_deadkey = new QState); setInitialState(no_deadkey); no_deadkey->setObjectName(no_deadkey_state); deadkey->setObjectName(deadkey_state); latched_deadkey->setObjectName(latched_deadkey_state); no_deadkey->addTransition(updater, SIGNAL(deadkeyPressed()), deadkey); connect(no_deadkey, SIGNAL(entered()), updater, SLOT(switchToMainView())); deadkey->addTransition(updater, SIGNAL(deadkeyCancelled()), no_deadkey); deadkey->addTransition(updater, SIGNAL(deadkeyReleased()), latched_deadkey); connect(deadkey, SIGNAL(entered()), updater, SLOT(switchToAccentedView())); latched_deadkey->addTransition(updater, SIGNAL(deadkeyCancelled()), no_deadkey); latched_deadkey->addTransition(updater, SIGNAL(deadkeyPressed()), no_deadkey); // Defer to first main loop iteration: QTimer::singleShot(0, this, SLOT(start())); } void DeadkeyMachine::setAccentKey(const Key &accent_key) { Q_D(DeadkeyMachine); d->accent_key = accent_key; } Key DeadkeyMachine::accentKey() const { Q_D(const DeadkeyMachine); return d->accent_key; } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/deadkeymachine.h000066400000000000000000000062541214765240700323250ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_DEADKEYMACHINE_H #define MALIIT_KEYBOARD_DEADKEYMACHINE_H #include "abstractstatemachine.h" #include "models/key.h" #include namespace MaliitKeyboard { namespace Logic { class DeadkeyMachinePrivate; class DeadkeyMachine : public QStateMachine , public AbstractStateMachine { Q_OBJECT Q_DISABLE_COPY(DeadkeyMachine) Q_DECLARE_PRIVATE(DeadkeyMachine) public: explicit DeadkeyMachine(QObject *parent = 0); virtual ~DeadkeyMachine(); virtual void setup(LayoutUpdater *updater); virtual void setAccentKey(const Key &accent_key); Key accentKey() const; //! This state means that deadkey wasn't pressed. No accented //! characters may be entered now. This is initial state. static const char *const no_deadkey_state; //! This state means that deadkey was pressed but not yet released. //! In this state either single accented character can be entered //! or deadkey can be released to latch it. static const char *const deadkey_state; //! This state means that deadkey was pressed and released and thus //! several accented characters can be entered. Pressing deadkey //! again switches to initial state. static const char *const latched_deadkey_state; private: const QScopedPointer d_ptr; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_DEADKEYMACHINE_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/shiftmachine.cpp000066400000000000000000000077661214765240700324000ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "shiftmachine.h" #include "logic/layoutupdater.h" namespace MaliitKeyboard { namespace Logic { const char *const ShiftMachine::no_shift_state = "no-shift"; const char *const ShiftMachine::shift_state = "shift"; const char *const ShiftMachine::latched_shift_state = "latched-shift"; const char *const ShiftMachine::caps_lock_state = "caps-lock"; ShiftMachine::ShiftMachine(QObject *parent) : QStateMachine(parent) {} ShiftMachine::~ShiftMachine() {} void ShiftMachine::setup(LayoutUpdater *updater) { if (not updater) { qCritical() << __PRETTY_FUNCTION__ << "No updater specified. Aborting setup."; return; } setChildMode(QState::ExclusiveStates); QState *no_shift = 0; QState *shift = 0; QState *latched_shift = 0; QState *caps_lock = 0; // addState makes state machine to be a parent of passed state, // so we don't have to care about deleting states explicitly. addState(no_shift = new QState); addState(shift = new QState); addState(latched_shift = new QState); addState(caps_lock = new QState); setInitialState(no_shift); no_shift->setObjectName(no_shift_state); shift->setObjectName(shift_state); latched_shift->setObjectName(latched_shift_state); caps_lock->setObjectName(caps_lock_state); no_shift->addTransition(updater, SIGNAL(shiftPressed()), shift); no_shift->addTransition(updater, SIGNAL(autoCapsActivated()), latched_shift); connect(no_shift, SIGNAL(entered()), updater, SLOT(syncLayoutToView())); shift->addTransition(updater, SIGNAL(shiftCancelled()), no_shift); shift->addTransition(updater, SIGNAL(shiftReleased()), latched_shift); connect(shift, SIGNAL(entered()), updater, SLOT(syncLayoutToView())); latched_shift->addTransition(updater, SIGNAL(shiftCancelled()), no_shift); latched_shift->addTransition(updater, SIGNAL(shiftReleased()), caps_lock); connect(latched_shift, SIGNAL(entered()), updater, SLOT(syncLayoutToView())); caps_lock->addTransition(updater, SIGNAL(shiftReleased()), no_shift); // Defer to first main loop iteration: QTimer::singleShot(0, this, SLOT(start())); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/shiftmachine.h000066400000000000000000000057331214765240700320350ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_SHIFTMACHINE_H #define MALIIT_KEYBOARD_SHIFTMACHINE_H #include "abstractstatemachine.h" #include namespace MaliitKeyboard { namespace Logic { class LayoutUpdater; class ShiftMachine : public QStateMachine , public AbstractStateMachine { Q_OBJECT Q_DISABLE_COPY(ShiftMachine) public: explicit ShiftMachine(QObject *parent = 0); virtual ~ShiftMachine(); virtual void setup(LayoutUpdater *updater); //! This state means that neither shift nor caps-lock wasn't pressed. //! Entered characters are lowercased. This is initial state. static const char *const no_shift_state; //! This state means that shift was pressed but not yet released. //! Now user can either release shift state to latch it or press //! a key to enter one uppercased character. static const char *const shift_state; //! This state means that shift was pressed and released and thus //! user can enter several uppercased characters. static const char *const latched_shift_state; //! Same as latched shift? static const char *const caps_lock_state; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_SHIFTMACHINE_H state-machines.pri000066400000000000000000000007321214765240700325560ustar00rootroot00000000000000maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machinesSTATE_MACHINES_DIR = $$LOGIC_DIR/state-machines HEADERS += \ logic/state-machines/abstractstatemachine.h \ logic/state-machines/shiftmachine.h \ logic/state-machines/viewmachine.h \ logic/state-machines/deadkeymachine.h \ SOURCES += \ logic/state-machines/abstractstatemachine.cpp \ logic/state-machines/shiftmachine.cpp \ logic/state-machines/viewmachine.cpp \ logic/state-machines/deadkeymachine.cpp \ DEPENDPATH += $$STATE_MACHINES_DIR maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/viewmachine.cpp000066400000000000000000000071751214765240700322270ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "viewmachine.h" #include "logic/layoutupdater.h" namespace MaliitKeyboard { namespace Logic { const char *const ViewMachine::main_state = "main"; const char *const ViewMachine::symbols0_state = "symbols0"; const char *const ViewMachine::symbols1_state = "symbols1"; ViewMachine::ViewMachine(QObject *parent) : QStateMachine(parent) {} ViewMachine::~ViewMachine() {} void ViewMachine::setup(LayoutUpdater *updater) { if (not updater) { qCritical() << __PRETTY_FUNCTION__ << "No updater specified. Aborting setup."; return; } setChildMode(QState::ExclusiveStates); QState *main = 0; QState *symbols0 = 0; QState *symbols1 = 0; // addState makes state machine to be a parent of passed state, // so we don't have to care about deleting states explicitly. addState(main = new QState); addState(symbols0 = new QState); addState(symbols1 = new QState); setInitialState(main); main->setObjectName(main_state); symbols0->setObjectName(symbols0_state); symbols1->setObjectName(symbols1_state); main->addTransition(updater, SIGNAL(symKeyReleased()), symbols0); connect(main, SIGNAL(entered()), updater, SLOT(switchToMainView())); symbols0->addTransition(updater, SIGNAL(symKeyReleased()), main); symbols0->addTransition(updater, SIGNAL(symSwitcherReleased()), symbols1); connect(symbols0, SIGNAL(entered()), updater, SLOT(switchToPrimarySymView())); symbols1->addTransition(updater, SIGNAL(symKeyReleased()), main); symbols1->addTransition(updater, SIGNAL(symSwitcherReleased()), symbols0); connect(symbols1, SIGNAL(entered()), updater, SLOT(switchToSecondarySymView())); // Defer to first main loop iteration: QTimer::singleShot(0, this, SLOT(start())); } }} // namespace Logic, MaliitKeyboard maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/state-machines/viewmachine.h000066400000000000000000000053141214765240700316650ustar00rootroot00000000000000// -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; c-file-offsets: ((innamespace . 0)); -*- /* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef MALIIT_KEYBOARD_VIEWMACHINE_H #define MALIIT_KEYBOARD_VIEWMACHINE_H #include "abstractstatemachine.h" #include namespace MaliitKeyboard { namespace Logic { class LayoutUpdater; class ViewMachine : public QStateMachine , public AbstractStateMachine { Q_OBJECT Q_DISABLE_COPY(ViewMachine) public: explicit ViewMachine(QObject *parent = 0); virtual ~ViewMachine(); virtual void setup(LayoutUpdater *updater); //! This state means that main layout is currently active. //! This is initial state. static const char *const main_state; //! This state means that first page of symbols layout is //! currently active. static const char *const symbols0_state; //! This state means that second page of symbols layout is //! currently active. static const char *const symbols1_state; }; }} // namespace Logic, MaliitKeyboard #endif // MALIIT_KEYBOARD_VIEWMACHINE_H maliit-plugins-0.99.0+git20130524+73edacd/maliit-keyboard/lib/logic/style.cpp000066400000000000000000000153461214765240700261620ustar00rootroot00000000000000/* * This file is part of Maliit Plugins * * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. * Copyright (C) 2012 One Laptop per Child Association * Copyright (C) 2012-2013 Canonical Ltd * * Contact: Mohammad Anwari * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of Nokia Corporation nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "style.h" #include "coreutils.h" namespace MaliitKeyboard { //! \class Style //! Style is a container for StyleAttributes, which can read style attributes //! from INI files. Style makes sure that the proper style directories are //! used, depending on the given profile. It also maps the known INI files to //! the StyleAttributes instances. //! //! This class is uncopyable; use SharedStyle instead. namespace { const QString g_main_fn_format("%1/%2/main.ini"); const QString g_extended_keys_fn_format("%1/%2/extended-keys.ini"); const QString g_profile_image_directory_path_format("%1/%2/images"); const QString g_profile_sounds_directory_path_format("%1/%2/sounds"); const QString g_profile_fonts_directory_path_format("%1/%2/fonts"); } // unnamed namespace //! \class StylePrivate //! \brief The private Style data. class StylePrivate { public: QString profile; //!< The profile name. QString style_name; //!< The active style name. QScopedPointer attributes; //!< The main style attributes. QScopedPointer extended_keys_attributes; //!< The extended keys style attributes. explicit StylePrivate() : profile() , style_name() , attributes() , extended_keys_attributes() {} }; //! \param parent The owner of this instance (optional). Style::Style(QObject *parent) : QObject(parent), d_ptr(new StylePrivate) {} Style::~Style() {} //! \brief Sets the style profile. //! //! Invalidates previous StyleAttributes instances and creates new ones. //! \param profile The name of the profile, must be a valid sub directory in //! data/styles and contain at least a main.ini file. void Style::setProfile(const QString &profile) { Q_D(Style); d->profile = profile; StyleAttributes *attributes = 0; StyleAttributes *extended_keys_attributes = 0; if (not d->profile.isEmpty()) { const QString main_file_name(g_main_fn_format .arg(CoreUtils::maliitKeyboardStyleProfilesDirectory()) .arg(profile)); const QString extended_keys_file_name(g_extended_keys_fn_format .arg(CoreUtils::maliitKeyboardStyleProfilesDirectory()) .arg(profile)); attributes = new StyleAttributes( new QSettings(main_file_name, QSettings::IniFormat)); extended_keys_attributes = new StyleAttributes( new QSettings(extended_keys_file_name, QSettings::IniFormat)); } d->attributes.reset(attributes); d->extended_keys_attributes.reset(extended_keys_attributes); Q_EMIT profileChanged(); } //! \brief Returns the active style profile. QString Style::profile() const { Q_D(const Style); return d->profile; } //! \brief Returns a list of available profiles. QStringList Style::availableProfiles() const { static const QDir styles_dir(CoreUtils::maliitKeyboardStyleProfilesDirectory()); return styles_dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name); } //! \brief Query the profile-dependent directory path for images, sounds, etc. //! @param directory The directory enum value for which we want to know the //! directory path. //! @returns The directory. Will be empty if for instance profile is empty. QString Style::directory(Directory directory) const { Q_D(const Style); if (d->profile.isEmpty()) { return QString(); } switch (directory) { case Images: return g_profile_image_directory_path_format .arg(CoreUtils::maliitKeyboardStyleProfilesDirectory()) .arg(d->profile); case Sounds: return g_profile_sounds_directory_path_format .arg(CoreUtils::maliitKeyboardStyleProfilesDirectory()) .arg(d->profile); case Fonts: return g_profile_fonts_directory_path_format .arg(CoreUtils::maliitKeyboardStyleProfilesDirectory()) .arg(d->profile); } return QString(); } //! \brief Query the main style attributes. //! @returns The style attributes used for the main key area. Returns empty //! attributes in case no valid profile is not set. StyleAttributes * Style::attributes() const { Q_D(const Style); if (d->attributes.isNull()) { Style *s = const_cast