diff options
author | Dan Finlay <dan@danfinlay.com> | 2017-07-04 07:09:17 +0800 |
---|---|---|
committer | Dan Finlay <dan@danfinlay.com> | 2017-07-04 07:16:53 +0800 |
commit | e285f2cae958437160f86171f1fccfec66799883 (patch) | |
tree | 49cf0e2d1805d0c36d53ae6920d63f614da1e9ad /ui | |
parent | 5eb3d5d485b17b98b19443d8def2f03dec9b38ef (diff) | |
download | tangerine-wallet-browser-e285f2cae958437160f86171f1fccfec66799883.tar tangerine-wallet-browser-e285f2cae958437160f86171f1fccfec66799883.tar.gz tangerine-wallet-browser-e285f2cae958437160f86171f1fccfec66799883.tar.bz2 tangerine-wallet-browser-e285f2cae958437160f86171f1fccfec66799883.tar.lz tangerine-wallet-browser-e285f2cae958437160f86171f1fccfec66799883.tar.xz tangerine-wallet-browser-e285f2cae958437160f86171f1fccfec66799883.tar.zst tangerine-wallet-browser-e285f2cae958437160f86171f1fccfec66799883.zip |
Get duplicate UI template working
Diffstat (limited to 'ui')
125 files changed, 13679 insertions, 5 deletions
diff --git a/ui/classic/app/actions.js b/ui/classic/app/actions.js index d99291e46..2c60448dd 100644 --- a/ui/classic/app/actions.js +++ b/ui/classic/app/actions.js @@ -1,4 +1,4 @@ -const getBuyEthUrl = require('../../app/scripts/lib/buy-eth-url') +const getBuyEthUrl = require('../../../app/scripts/lib/buy-eth-url') var actions = { _setBackgroundConnection: _setBackgroundConnection, diff --git a/ui/classic/app/components/pending-tx.js b/ui/classic/app/components/pending-tx.js index d7d602f31..962680d30 100644 --- a/ui/classic/app/components/pending-tx.js +++ b/ui/classic/app/components/pending-tx.js @@ -6,7 +6,7 @@ const clone = require('clone') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN -const hexToBn = require('../../../app/scripts/lib/hex-to-bn') +const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') const util = require('../util') const MiniAccountPanel = require('./mini-account-panel') const Copyable = require('./copyable') diff --git a/ui/classic/app/conf-tx.js b/ui/classic/app/conf-tx.js index 747d3ce2b..63b77ef7f 100644 --- a/ui/classic/app/conf-tx.js +++ b/ui/classic/app/conf-tx.js @@ -6,7 +6,7 @@ const connect = require('react-redux').connect const actions = require('./actions') const NetworkIndicator = require('./components/network') const txHelper = require('../lib/tx-helper') -const isPopupOrNotification = require('../../app/scripts/lib/is-popup-or-notification') +const isPopupOrNotification = require('../../../app/scripts/lib/is-popup-or-notification') const PendingTx = require('./components/pending-tx') const PendingMsg = require('./components/pending-msg') diff --git a/ui/classic/css.js b/ui/classic/css.js index 043363cd7..7c394a87b 100644 --- a/ui/classic/css.js +++ b/ui/classic/css.js @@ -9,8 +9,8 @@ var cssFiles = { 'lib.css': fs.readFileSync(path.join(__dirname, '/app/css/lib.css'), 'utf8'), 'index.css': fs.readFileSync(path.join(__dirname, '/app/css/index.css'), 'utf8'), 'transitions.css': fs.readFileSync(path.join(__dirname, '/app/css/transitions.css'), 'utf8'), - 'react-tooltip-component.css': fs.readFileSync(path.join(__dirname, '..', 'node_modules', 'react-tooltip-component', 'dist', 'react-tooltip-component.css'), 'utf8'), - 'react-css': fs.readFileSync(path.join(__dirname, '..', 'node_modules', 'react-select', 'dist', 'react-select.css'), 'utf8'), + 'react-tooltip-component.css': fs.readFileSync(path.join(__dirname, '..', '..', 'node_modules', 'react-tooltip-component', 'dist', 'react-tooltip-component.css'), 'utf8'), + 'react-css': fs.readFileSync(path.join(__dirname, '..', '..', 'node_modules', 'react-select', 'dist', 'react-select.css'), 'utf8'), } function bundleCss () { diff --git a/ui/responsive/.gitignore b/ui/responsive/.gitignore new file mode 100644 index 000000000..c6b1254b5 --- /dev/null +++ b/ui/responsive/.gitignore @@ -0,0 +1,66 @@ + +# Created by https://www.gitignore.io/api/osx,node + +### OSX ### +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon
+ +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +### Node ### +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git +node_modules + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + diff --git a/ui/responsive/app/account-detail.js b/ui/responsive/app/account-detail.js new file mode 100644 index 000000000..bed05a7fb --- /dev/null +++ b/ui/responsive/app/account-detail.js @@ -0,0 +1,311 @@ +const inherits = require('util').inherits +const extend = require('xtend') +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const CopyButton = require('./components/copyButton') +const AccountInfoLink = require('./components/account-info-link') +const actions = require('./actions') +const ReactCSSTransitionGroup = require('react-addons-css-transition-group') +const valuesFor = require('./util').valuesFor + +const Identicon = require('./components/identicon') +const EthBalance = require('./components/eth-balance') +const TransactionList = require('./components/transaction-list') +const ExportAccountView = require('./components/account-export') +const ethUtil = require('ethereumjs-util') +const EditableLabel = require('./components/editable-label') +const Tooltip = require('./components/tooltip') +const TabBar = require('./components/tab-bar') +const TokenList = require('./components/token-list') + +module.exports = connect(mapStateToProps)(AccountDetailScreen) + +function mapStateToProps (state) { + return { + metamask: state.metamask, + identities: state.metamask.identities, + accounts: state.metamask.accounts, + address: state.metamask.selectedAddress, + accountDetail: state.appState.accountDetail, + network: state.metamask.network, + unapprovedMsgs: valuesFor(state.metamask.unapprovedMsgs), + shapeShiftTxList: state.metamask.shapeShiftTxList, + transactions: state.metamask.selectedAddressTxList || [], + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + currentAccountTab: state.metamask.currentAccountTab, + tokens: state.metamask.tokens, + } +} + +inherits(AccountDetailScreen, Component) +function AccountDetailScreen () { + Component.call(this) +} + +AccountDetailScreen.prototype.render = function () { + var props = this.props + var selected = props.address || Object.keys(props.accounts)[0] + var checksumAddress = selected && ethUtil.toChecksumAddress(selected) + var identity = props.identities[selected] + var account = props.accounts[selected] + const { network, conversionRate, currentCurrency } = props + + return ( + + h('.account-detail-section', [ + + // identicon, label, balance, etc + h('.account-data-subsection', { + style: { + margin: '0 20px', + }, + }, [ + + // header - identicon + nav + h('div', { + style: { + paddingTop: '20px', + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'flex-start', + }, + }, [ + + // large identicon and addresses + h('.identicon-wrapper.select-none', [ + h(Identicon, { + diameter: 62, + address: selected, + }), + ]), + h('flex-column', { + style: { + lineHeight: '10px', + marginLeft: '15px', + }, + }, [ + h(EditableLabel, { + textValue: identity ? identity.name : '', + state: { + isEditingLabel: false, + }, + saveText: (text) => { + props.dispatch(actions.saveAccountLabel(selected, text)) + }, + }, [ + + // What is shown when not editing + edit text: + h('label.editing-label', [h('.edit-text', 'edit')]), + h('h2.font-medium.color-forest', {name: 'edit'}, identity && identity.name), + ]), + h('.flex-row', { + style: { + width: '15em', + justifyContent: 'space-between', + alignItems: 'baseline', + }, + }, [ + + // address + + h('div', { + style: { + overflow: 'hidden', + textOverflow: 'ellipsis', + paddingTop: '3px', + width: '5em', + fontSize: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + marginTop: '10px', + marginBottom: '15px', + color: '#AEAEAE', + }, + }, checksumAddress), + + // copy and export + + h('.flex-row', { + style: { + justifyContent: 'flex-end', + }, + }, [ + + h(AccountInfoLink, { selected, network }), + + h(CopyButton, { + value: checksumAddress, + }), + + h(Tooltip, { + title: 'QR Code', + }, [ + h('i.fa.fa-qrcode.pointer.pop-hover', { + onClick: () => props.dispatch(actions.showQrView(selected, identity ? identity.name : '')), + style: { + fontSize: '18px', + position: 'relative', + color: 'rgb(247, 134, 28)', + top: '5px', + marginLeft: '3px', + marginRight: '3px', + }, + }), + ]), + + h(Tooltip, { + title: 'Export Private Key', + }, [ + h('div', { + style: { + display: 'flex', + alignItems: 'center', + }, + }, [ + h('img.cursor-pointer.color-orange', { + src: 'images/key-32.png', + onClick: () => this.requestAccountExport(selected), + style: { + height: '19px', + }, + }), + ]), + ]), + ]), + ]), + + // account ballence + + ]), + ]), + h('.flex-row', { + style: { + justifyContent: 'space-between', + alignItems: 'flex-start', + }, + }, [ + + h(EthBalance, { + value: account && account.balance, + conversionRate, + currentCurrency, + style: { + lineHeight: '7px', + marginTop: '10px', + }, + }), + + h('button', { + onClick: () => props.dispatch(actions.buyEthView(selected)), + style: { + marginBottom: '20px', + marginRight: '8px', + position: 'absolute', + left: '219px', + }, + }, 'BUY'), + + h('button', { + onClick: () => props.dispatch(actions.showSendPage()), + style: { + marginBottom: '20px', + marginRight: '8px', + }, + }, 'SEND'), + + ]), + ]), + + // subview (tx history, pk export confirm, buy eth warning) + h(ReactCSSTransitionGroup, { + className: 'css-transition-group', + transitionName: 'main', + transitionEnterTimeout: 300, + transitionLeaveTimeout: 300, + }, [ + this.subview(), + ]), + + ]) + ) +} + +AccountDetailScreen.prototype.subview = function () { + var subview + try { + subview = this.props.accountDetail.subview + } catch (e) { + subview = null + } + + switch (subview) { + case 'transactions': + return this.tabSections() + case 'export': + var state = extend({key: 'export'}, this.props) + return h(ExportAccountView, state) + default: + return this.tabSections() + } +} + +AccountDetailScreen.prototype.tabSections = function () { + const { currentAccountTab } = this.props + + return h('section.tabSection', [ + + h(TabBar, { + tabs: [ + { content: 'Sent', key: 'history' }, + { content: 'Tokens', key: 'tokens' }, + ], + defaultTab: currentAccountTab || 'history', + tabSelected: (key) => { + this.props.dispatch(actions.setCurrentAccountTab(key)) + }, + }), + + this.tabSwitchView(), + ]) +} + +AccountDetailScreen.prototype.tabSwitchView = function () { + const props = this.props + const { address, network } = props + const { currentAccountTab, tokens } = this.props + + switch (currentAccountTab) { + case 'tokens': + return h(TokenList, { + userAddress: address, + network, + tokens, + addToken: () => this.props.dispatch(actions.showAddTokenPage()), + }) + default: + return this.transactionList() + } +} + +AccountDetailScreen.prototype.transactionList = function () { + const {transactions, unapprovedMsgs, address, + network, shapeShiftTxList, conversionRate } = this.props + + return h(TransactionList, { + transactions: transactions.sort((a, b) => b.time - a.time), + network, + unapprovedMsgs, + conversionRate, + address, + shapeShiftTxList, + viewPendingTx: (txId) => { + this.props.dispatch(actions.viewPendingTx(txId)) + }, + }) +} + +AccountDetailScreen.prototype.requestAccountExport = function () { + this.props.dispatch(actions.requestExportAccount()) +} diff --git a/ui/responsive/app/accounts/account-list-item.js b/ui/responsive/app/accounts/account-list-item.js new file mode 100644 index 000000000..10a0b6cc7 --- /dev/null +++ b/ui/responsive/app/accounts/account-list-item.js @@ -0,0 +1,91 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ethUtil = require('ethereumjs-util') + +const EthBalance = require('../components/eth-balance') +const CopyButton = require('../components/copyButton') +const Identicon = require('../components/identicon') + +module.exports = AccountListItem + +inherits(AccountListItem, Component) +function AccountListItem () { + Component.call(this) +} + +AccountListItem.prototype.render = function () { + const { identity, selectedAddress, accounts, onShowDetail, + conversionRate, currentCurrency } = this.props + + const checksumAddress = identity && identity.address && ethUtil.toChecksumAddress(identity.address) + const isSelected = selectedAddress === identity.address + const account = accounts[identity.address] + const selectedClass = isSelected ? '.selected' : '' + + return ( + h(`.accounts-list-option.flex-row.flex-space-between.pointer.hover-white${selectedClass}`, { + key: `account-panel-${identity.address}`, + onClick: (event) => onShowDetail(identity.address, event), + }, [ + + h('.identicon-wrapper.flex-column.flex-center.select-none', [ + this.pendingOrNot(), + this.indicateIfLoose(), + h(Identicon, { + address: identity.address, + imageify: true, + }), + ]), + + // account address, balance + h('.identity-data.flex-column.flex-justify-center.flex-grow.select-none', { + style: { + width: '200px', + }, + }, [ + h('span', identity.name), + h('span.font-small', { + style: { + overflow: 'hidden', + textOverflow: 'ellipsis', + }, + }, checksumAddress), + h(EthBalance, { + value: account && account.balance, + currentCurrency, + conversionRate, + style: { + lineHeight: '7px', + marginTop: '10px', + }, + }), + ]), + + // copy button + h('.identity-copy.flex-column', { + style: { + margin: '0 20px', + }, + }, [ + h(CopyButton, { + value: checksumAddress, + }), + ]), + ]) + ) +} + +AccountListItem.prototype.indicateIfLoose = function () { + try { // Sometimes keyrings aren't loaded yet: + const type = this.props.keyring.type + const isLoose = type !== 'HD Key Tree' + return isLoose ? h('.keyring-label', 'LOOSE') : null + } catch (e) { return } +} + +AccountListItem.prototype.pendingOrNot = function () { + const pending = this.props.pending + if (pending.length === 0) return null + return h('.pending-dot', pending.length) +} diff --git a/ui/responsive/app/accounts/import/index.js b/ui/responsive/app/accounts/import/index.js new file mode 100644 index 000000000..97b387229 --- /dev/null +++ b/ui/responsive/app/accounts/import/index.js @@ -0,0 +1,100 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../actions') +import Select from 'react-select' + +// Subviews +const JsonImportView = require('./json.js') +const PrivateKeyImportView = require('./private-key.js') + +const menuItems = [ + 'Private Key', + 'JSON File', +] + +module.exports = connect(mapStateToProps)(AccountImportSubview) + +function mapStateToProps (state) { + return { + menuItems, + } +} + +inherits(AccountImportSubview, Component) +function AccountImportSubview () { + Component.call(this) +} + +AccountImportSubview.prototype.render = function () { + const props = this.props + const state = this.state || {} + const { menuItems } = props + const { type } = state + + return ( + h('div', { + style: { + }, + }, [ + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + props.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Import Accounts'), + ]), + h('div', { + style: { + padding: '10px', + color: 'rgb(174, 174, 174)', + }, + }, [ + + h('h3', { style: { padding: '3px' } }, 'SELECT TYPE'), + + h('style', ` + .has-value.Select--single > .Select-control .Select-value .Select-value-label, .Select-value-label { + color: rgb(174,174,174); + } + `), + + h(Select, { + name: 'import-type-select', + clearable: false, + value: type || menuItems[0], + options: menuItems.map((type) => { + return { + value: type, + label: type, + } + }), + onChange: (opt) => { + this.setState({ type: opt.value }) + }, + }), + ]), + + this.renderImportView(), + ]) + ) +} + +AccountImportSubview.prototype.renderImportView = function () { + const props = this.props + const state = this.state || {} + const { type } = state + const { menuItems } = props + const current = type || menuItems[0] + + switch (current) { + case 'Private Key': + return h(PrivateKeyImportView) + case 'JSON File': + return h(JsonImportView) + default: + return h(JsonImportView) + } +} diff --git a/ui/responsive/app/accounts/import/json.js b/ui/responsive/app/accounts/import/json.js new file mode 100644 index 000000000..158a3c923 --- /dev/null +++ b/ui/responsive/app/accounts/import/json.js @@ -0,0 +1,100 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../actions') +const FileInput = require('react-simple-file-input').default + +const HELP_LINK = 'https://github.com/MetaMask/faq/blob/master/README.md#q-i-cant-use-the-import-feature-for-uploading-a-json-file-the-window-keeps-closing-when-i-try-to-select-a-file' + +module.exports = connect(mapStateToProps)(JsonImportSubview) + +function mapStateToProps (state) { + return { + error: state.appState.warning, + } +} + +inherits(JsonImportSubview, Component) +function JsonImportSubview () { + Component.call(this) +} + +JsonImportSubview.prototype.render = function () { + const { error } = this.props + + return ( + h('div', { + style: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + padding: '5px 15px 0px 15px', + }, + }, [ + + h('p', 'Used by a variety of different clients'), + h('a.warning', { href: HELP_LINK, target: '_blank' }, 'File import not working? Click here!'), + + h(FileInput, { + readAs: 'text', + onLoad: this.onLoad.bind(this), + style: { + margin: '20px 0px 12px 20px', + fontSize: '15px', + }, + }), + + h('input.large-input.letter-spacey', { + type: 'password', + placeholder: 'Enter password', + id: 'json-password-box', + onKeyPress: this.createKeyringOnEnter.bind(this), + style: { + width: 260, + marginTop: 12, + }, + }), + + h('button.primary', { + onClick: this.createNewKeychain.bind(this), + style: { + margin: 12, + }, + }, 'Import'), + + error ? h('span.error', error) : null, + ]) + ) +} + +JsonImportSubview.prototype.onLoad = function (event, file) { + this.setState({file: file, fileContents: event.target.result}) +} + +JsonImportSubview.prototype.createKeyringOnEnter = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.createNewKeychain() + } +} + +JsonImportSubview.prototype.createNewKeychain = function () { + const state = this.state + const { fileContents } = state + + if (!fileContents) { + const message = 'You must select a file to import.' + return this.props.dispatch(actions.displayWarning(message)) + } + + const passwordInput = document.getElementById('json-password-box') + const password = passwordInput.value + + if (!password) { + const message = 'You must enter a password for the selected file.' + return this.props.dispatch(actions.displayWarning(message)) + } + + this.props.dispatch(actions.importNewAccount('JSON File', [ fileContents, password ])) +} diff --git a/ui/responsive/app/accounts/import/private-key.js b/ui/responsive/app/accounts/import/private-key.js new file mode 100644 index 000000000..68ccee58e --- /dev/null +++ b/ui/responsive/app/accounts/import/private-key.js @@ -0,0 +1,67 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../actions') + +module.exports = connect(mapStateToProps)(PrivateKeyImportView) + +function mapStateToProps (state) { + return { + error: state.appState.warning, + } +} + +inherits(PrivateKeyImportView, Component) +function PrivateKeyImportView () { + Component.call(this) +} + +PrivateKeyImportView.prototype.render = function () { + const { error } = this.props + + return ( + h('div', { + style: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + padding: '5px 15px 0px 15px', + }, + }, [ + h('span', 'Paste your private key string here'), + + h('input.large-input.letter-spacey', { + type: 'password', + id: 'private-key-box', + onKeyPress: this.createKeyringOnEnter.bind(this), + style: { + width: 260, + marginTop: 12, + }, + }), + + h('button.primary', { + onClick: this.createNewKeychain.bind(this), + style: { + margin: 12, + }, + }, 'Import'), + + error ? h('span.error', error) : null, + ]) + ) +} + +PrivateKeyImportView.prototype.createKeyringOnEnter = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.createNewKeychain() + } +} + +PrivateKeyImportView.prototype.createNewKeychain = function () { + const input = document.getElementById('private-key-box') + const privateKey = input.value + this.props.dispatch(actions.importNewAccount('Private Key', [ privateKey ])) +} diff --git a/ui/responsive/app/accounts/import/seed.js b/ui/responsive/app/accounts/import/seed.js new file mode 100644 index 000000000..b4a7c0afa --- /dev/null +++ b/ui/responsive/app/accounts/import/seed.js @@ -0,0 +1,30 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(SeedImportSubview) + +function mapStateToProps (state) { + return {} +} + +inherits(SeedImportSubview, Component) +function SeedImportSubview () { + Component.call(this) +} + +SeedImportSubview.prototype.render = function () { + return ( + h('div', { + style: { + }, + }, [ + `Paste your seed phrase here!`, + h('textarea'), + h('br'), + h('button', 'Submit'), + ]) + ) +} + diff --git a/ui/responsive/app/accounts/index.js b/ui/responsive/app/accounts/index.js new file mode 100644 index 000000000..ac2615cd7 --- /dev/null +++ b/ui/responsive/app/accounts/index.js @@ -0,0 +1,164 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../actions') +const valuesFor = require('../util').valuesFor +const findDOMNode = require('react-dom').findDOMNode +const AccountListItem = require('./account-list-item') + +module.exports = connect(mapStateToProps)(AccountsScreen) + +function mapStateToProps (state) { + const pendingTxs = valuesFor(state.metamask.unapprovedTxs) + .filter(txMeta => txMeta.metamaskNetworkId === state.metamask.network) + const pendingMsgs = valuesFor(state.metamask.unapprovedMsgs) + const pending = pendingTxs.concat(pendingMsgs) + + return { + accounts: state.metamask.accounts, + identities: state.metamask.identities, + unapprovedTxs: state.metamask.unapprovedTxs, + selectedAddress: state.metamask.selectedAddress, + scrollToBottom: state.appState.scrollToBottom, + pending, + keyrings: state.metamask.keyrings, + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + } +} + +inherits(AccountsScreen, Component) +function AccountsScreen () { + Component.call(this) +} + +AccountsScreen.prototype.render = function () { + const props = this.props + const { keyrings, conversionRate, currentCurrency } = props + const identityList = valuesFor(props.identities) + const unapprovedTxList = valuesFor(props.unapprovedTxs) + + return ( + + h('.accounts-section.flex-grow', [ + + // subtitle and nav + h('.section-title.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: this.goHome.bind(this), + }), + h('h2.page-subtitle', 'Select Account'), + ]), + + h('hr.horizontal-line'), + + // identity selection + h('section.identity-section', { + style: { + height: '418px', + overflowY: 'auto', + overflowX: 'hidden', + }, + }, + [ + identityList.map((identity) => { + const pending = this.props.pending.filter((txOrMsg) => { + if ('txParams' in txOrMsg) { + return txOrMsg.txParams.from === identity.address + } else if ('msgParams' in txOrMsg) { + return txOrMsg.msgParams.from === identity.address + } else { + return false + } + }) + + const simpleAddress = identity.address.substring(2).toLowerCase() + const keyring = keyrings.find((kr) => { + return kr.accounts.includes(simpleAddress) || + kr.accounts.includes(identity.address) + }) + + return h(AccountListItem, { + key: `acct-panel-${identity.address}`, + identity, + selectedAddress: this.props.selectedAddress, + conversionRate, + currentCurrency, + accounts: this.props.accounts, + onShowDetail: this.onShowDetail.bind(this), + pending, + keyring, + }) + }), + + h('hr.horizontal-line'), + h('div.footer.hover-white.pointer', { + key: 'reveal-account-bar', + onClick: () => { + this.addNewAccount() + }, + style: { + display: 'flex', + height: '40px', + padding: '10px', + justifyContent: 'center', + alignItems: 'center', + }, + }, [ + h('i.fa.fa-plus.fa-lg', {key: ''}), + ]), + h('hr.horizontal-line'), + ]), + + unapprovedTxList.length ? ( + + h('.unconftx-link.flex-row.flex-center', { + onClick: this.navigateToConfTx.bind(this), + }, [ + h('span', 'Unconfirmed Txs'), + h('i.fa.fa-arrow-right.fa-lg'), + ]) + + ) : ( + null + ), + ]) + ) +} + +// If a new account was revealed, scroll to the bottom +AccountsScreen.prototype.componentDidUpdate = function () { + const scrollToBottom = this.props.scrollToBottom + + if (scrollToBottom) { + var container = findDOMNode(this) + var scrollable = container.querySelector('.identity-section') + scrollable.scrollTop = scrollable.scrollHeight + } +} + +AccountsScreen.prototype.navigateToConfTx = function () { + event.stopPropagation() + this.props.dispatch(actions.showConfTxPage()) +} + +AccountsScreen.prototype.onShowDetail = function (address, event) { + event.stopPropagation() + this.props.dispatch(actions.showAccountDetail(address)) +} + +AccountsScreen.prototype.addNewAccount = function () { + this.props.dispatch(actions.addNewAccount(0)) +} + +/* An optional view proposed in this design: + * https://consensys.quip.com/zZVrAysM5znY +AccountsScreen.prototype.addNewAccount = function () { + this.props.dispatch(actions.navigateToNewAccountScreen()) +} +*/ + +AccountsScreen.prototype.goHome = function () { + this.props.dispatch(actions.goHome()) +} diff --git a/ui/responsive/app/actions.js b/ui/responsive/app/actions.js new file mode 100644 index 000000000..2c60448dd --- /dev/null +++ b/ui/responsive/app/actions.js @@ -0,0 +1,1031 @@ +const getBuyEthUrl = require('../../../app/scripts/lib/buy-eth-url') + +var actions = { + _setBackgroundConnection: _setBackgroundConnection, + + GO_HOME: 'GO_HOME', + goHome: goHome, + // menu state + getNetworkStatus: 'getNetworkStatus', + // transition state + TRANSITION_FORWARD: 'TRANSITION_FORWARD', + TRANSITION_BACKWARD: 'TRANSITION_BACKWARD', + transitionForward, + transitionBackward, + // remote state + UPDATE_METAMASK_STATE: 'UPDATE_METAMASK_STATE', + updateMetamaskState: updateMetamaskState, + // notices + MARK_NOTICE_READ: 'MARK_NOTICE_READ', + markNoticeRead: markNoticeRead, + SHOW_NOTICE: 'SHOW_NOTICE', + showNotice: showNotice, + CLEAR_NOTICES: 'CLEAR_NOTICES', + clearNotices: clearNotices, + markAccountsFound, + // intialize screen + CREATE_NEW_VAULT_IN_PROGRESS: 'CREATE_NEW_VAULT_IN_PROGRESS', + SHOW_CREATE_VAULT: 'SHOW_CREATE_VAULT', + SHOW_RESTORE_VAULT: 'SHOW_RESTORE_VAULT', + FORGOT_PASSWORD: 'FORGOT_PASSWORD', + forgotPassword: forgotPassword, + SHOW_INIT_MENU: 'SHOW_INIT_MENU', + SHOW_NEW_VAULT_SEED: 'SHOW_NEW_VAULT_SEED', + SHOW_INFO_PAGE: 'SHOW_INFO_PAGE', + SHOW_IMPORT_PAGE: 'SHOW_IMPORT_PAGE', + unlockMetamask: unlockMetamask, + unlockFailed: unlockFailed, + showCreateVault: showCreateVault, + showRestoreVault: showRestoreVault, + showInitializeMenu: showInitializeMenu, + showImportPage, + createNewVaultAndKeychain: createNewVaultAndKeychain, + createNewVaultAndRestore: createNewVaultAndRestore, + createNewVaultInProgress: createNewVaultInProgress, + addNewKeyring, + importNewAccount, + addNewAccount, + NEW_ACCOUNT_SCREEN: 'NEW_ACCOUNT_SCREEN', + navigateToNewAccountScreen, + showNewVaultSeed: showNewVaultSeed, + showInfoPage: showInfoPage, + // seed recovery actions + REVEAL_SEED_CONFIRMATION: 'REVEAL_SEED_CONFIRMATION', + revealSeedConfirmation: revealSeedConfirmation, + requestRevealSeed: requestRevealSeed, + // unlock screen + UNLOCK_IN_PROGRESS: 'UNLOCK_IN_PROGRESS', + UNLOCK_FAILED: 'UNLOCK_FAILED', + UNLOCK_METAMASK: 'UNLOCK_METAMASK', + LOCK_METAMASK: 'LOCK_METAMASK', + tryUnlockMetamask: tryUnlockMetamask, + lockMetamask: lockMetamask, + unlockInProgress: unlockInProgress, + // error handling + displayWarning: displayWarning, + DISPLAY_WARNING: 'DISPLAY_WARNING', + HIDE_WARNING: 'HIDE_WARNING', + hideWarning: hideWarning, + // accounts screen + SET_SELECTED_ACCOUNT: 'SET_SELECTED_ACCOUNT', + SHOW_ACCOUNT_DETAIL: 'SHOW_ACCOUNT_DETAIL', + SHOW_ACCOUNTS_PAGE: 'SHOW_ACCOUNTS_PAGE', + SHOW_CONF_TX_PAGE: 'SHOW_CONF_TX_PAGE', + SHOW_CONF_MSG_PAGE: 'SHOW_CONF_MSG_PAGE', + SET_CURRENT_FIAT: 'SET_CURRENT_FIAT', + setCurrentCurrency: setCurrentCurrency, + setCurrentAccountTab, + // account detail screen + SHOW_SEND_PAGE: 'SHOW_SEND_PAGE', + showSendPage: showSendPage, + ADD_TO_ADDRESS_BOOK: 'ADD_TO_ADDRESS_BOOK', + addToAddressBook: addToAddressBook, + REQUEST_ACCOUNT_EXPORT: 'REQUEST_ACCOUNT_EXPORT', + requestExportAccount: requestExportAccount, + EXPORT_ACCOUNT: 'EXPORT_ACCOUNT', + exportAccount: exportAccount, + SHOW_PRIVATE_KEY: 'SHOW_PRIVATE_KEY', + showPrivateKey: showPrivateKey, + SAVE_ACCOUNT_LABEL: 'SAVE_ACCOUNT_LABEL', + saveAccountLabel: saveAccountLabel, + // tx conf screen + COMPLETED_TX: 'COMPLETED_TX', + TRANSACTION_ERROR: 'TRANSACTION_ERROR', + NEXT_TX: 'NEXT_TX', + PREVIOUS_TX: 'PREV_TX', + signMsg: signMsg, + cancelMsg: cancelMsg, + signPersonalMsg, + cancelPersonalMsg, + sendTx: sendTx, + signTx: signTx, + updateAndApproveTx, + cancelTx: cancelTx, + completedTx: completedTx, + txError: txError, + nextTx: nextTx, + previousTx: previousTx, + viewPendingTx: viewPendingTx, + VIEW_PENDING_TX: 'VIEW_PENDING_TX', + // app messages + confirmSeedWords: confirmSeedWords, + showAccountDetail: showAccountDetail, + BACK_TO_ACCOUNT_DETAIL: 'BACK_TO_ACCOUNT_DETAIL', + backToAccountDetail: backToAccountDetail, + showAccountsPage: showAccountsPage, + showConfTxPage: showConfTxPage, + // config screen + SHOW_CONFIG_PAGE: 'SHOW_CONFIG_PAGE', + SET_RPC_TARGET: 'SET_RPC_TARGET', + SET_DEFAULT_RPC_TARGET: 'SET_DEFAULT_RPC_TARGET', + SET_PROVIDER_TYPE: 'SET_PROVIDER_TYPE', + USE_ETHERSCAN_PROVIDER: 'USE_ETHERSCAN_PROVIDER', + useEtherscanProvider: useEtherscanProvider, + showConfigPage, + SHOW_ADD_TOKEN_PAGE: 'SHOW_ADD_TOKEN_PAGE', + showAddTokenPage, + addToken, + setRpcTarget: setRpcTarget, + setDefaultRpcTarget: setDefaultRpcTarget, + setProviderType: setProviderType, + // loading overlay + SHOW_LOADING: 'SHOW_LOADING_INDICATION', + HIDE_LOADING: 'HIDE_LOADING_INDICATION', + showLoadingIndication: showLoadingIndication, + hideLoadingIndication: hideLoadingIndication, + // buy Eth with coinbase + BUY_ETH: 'BUY_ETH', + buyEth: buyEth, + buyEthView: buyEthView, + BUY_ETH_VIEW: 'BUY_ETH_VIEW', + COINBASE_SUBVIEW: 'COINBASE_SUBVIEW', + coinBaseSubview: coinBaseSubview, + SHAPESHIFT_SUBVIEW: 'SHAPESHIFT_SUBVIEW', + shapeShiftSubview: shapeShiftSubview, + PAIR_UPDATE: 'PAIR_UPDATE', + pairUpdate: pairUpdate, + coinShiftRquest: coinShiftRquest, + SHOW_SUB_LOADING_INDICATION: 'SHOW_SUB_LOADING_INDICATION', + showSubLoadingIndication: showSubLoadingIndication, + HIDE_SUB_LOADING_INDICATION: 'HIDE_SUB_LOADING_INDICATION', + hideSubLoadingIndication: hideSubLoadingIndication, +// QR STUFF: + SHOW_QR: 'SHOW_QR', + showQrView: showQrView, + reshowQrCode: reshowQrCode, + SHOW_QR_VIEW: 'SHOW_QR_VIEW', +// FORGOT PASSWORD: + BACK_TO_INIT_MENU: 'BACK_TO_INIT_MENU', + goBackToInitView: goBackToInitView, + RECOVERY_IN_PROGRESS: 'RECOVERY_IN_PROGRESS', + BACK_TO_UNLOCK_VIEW: 'BACK_TO_UNLOCK_VIEW', + backToUnlockView: backToUnlockView, + // SHOWING KEYCHAIN + SHOW_NEW_KEYCHAIN: 'SHOW_NEW_KEYCHAIN', + showNewKeychain: showNewKeychain, + + callBackgroundThenUpdate, + forceUpdateMetamaskState, +} + +module.exports = actions + +var background = null +function _setBackgroundConnection (backgroundConnection) { + background = backgroundConnection +} + +function goHome () { + return { + type: actions.GO_HOME, + } +} + +// async actions + +function tryUnlockMetamask (password) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + dispatch(actions.unlockInProgress()) + log.debug(`background.submitPassword`) + background.submitPassword(password, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.unlockFailed(err.message)) + } else { + dispatch(actions.transitionForward()) + forceUpdateMetamaskState(dispatch) + } + }) + } +} + +function transitionForward () { + return { + type: this.TRANSITION_FORWARD, + } +} + +function transitionBackward () { + return { + type: this.TRANSITION_BACKWARD, + } +} + +function confirmSeedWords () { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.clearSeedWordCache`) + background.clearSeedWordCache((err, account) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + + log.info('Seed word cache cleared. ' + account) + dispatch(actions.showAccountDetail(account)) + }) + } +} + +function createNewVaultAndRestore (password, seed) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.createNewVaultAndRestore`) + background.createNewVaultAndRestore(password, seed, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) return dispatch(actions.displayWarning(err.message)) + dispatch(actions.showAccountsPage()) + }) + } +} + +function createNewVaultAndKeychain (password) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.createNewVaultAndKeychain`) + background.createNewVaultAndKeychain(password, (err) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + log.debug(`background.placeSeedWords`) + background.placeSeedWords((err) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch(actions.hideLoadingIndication()) + forceUpdateMetamaskState(dispatch) + }) + }) + } +} + +function revealSeedConfirmation () { + return { + type: this.REVEAL_SEED_CONFIRMATION, + } +} + +function requestRevealSeed (password) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.submitPassword`) + background.submitPassword(password, (err) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + log.debug(`background.placeSeedWords`) + background.placeSeedWords((err, result) => { + if (err) return dispatch(actions.displayWarning(err.message)) + dispatch(actions.hideLoadingIndication()) + dispatch(actions.showNewVaultSeed(result)) + }) + }) + } +} + +function addNewKeyring (type, opts) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.addNewKeyring`) + background.addNewKeyring(type, opts, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) return dispatch(actions.displayWarning(err.message)) + dispatch(actions.showAccountsPage()) + }) + } +} + +function importNewAccount (strategy, args) { + return (dispatch) => { + dispatch(actions.showLoadingIndication('This may take a while, be patient.')) + log.debug(`background.importAccountWithStrategy`) + background.importAccountWithStrategy(strategy, args, (err) => { + if (err) return dispatch(actions.displayWarning(err.message)) + log.debug(`background.getState`) + background.getState((err, newState) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch(actions.updateMetamaskState(newState)) + dispatch({ + type: actions.SHOW_ACCOUNT_DETAIL, + value: newState.selectedAddress, + }) + }) + }) + } +} + +function navigateToNewAccountScreen () { + return { + type: this.NEW_ACCOUNT_SCREEN, + } +} + +function addNewAccount () { + log.debug(`background.addNewAccount`) + return callBackgroundThenUpdate(background.addNewAccount) +} + +function showInfoPage () { + return { + type: actions.SHOW_INFO_PAGE, + } +} + +function setCurrentCurrency (currencyCode) { + return (dispatch) => { + dispatch(this.showLoadingIndication()) + log.debug(`background.setCurrentCurrency`) + background.setCurrentCurrency(currencyCode, (err, data) => { + dispatch(this.hideLoadingIndication()) + if (err) { + log.error(err.stack) + return dispatch(actions.displayWarning(err.message)) + } + dispatch({ + type: this.SET_CURRENT_FIAT, + value: { + currentCurrency: data.currentCurrency, + conversionRate: data.conversionRate, + conversionDate: data.conversionDate, + }, + }) + }) + } +} + +function signMsg (msgData) { + log.debug('action - signMsg') + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + + log.debug(`actions calling background.signMessage`) + background.signMessage(msgData, (err, newState) => { + log.debug('signMessage called back') + dispatch(actions.updateMetamaskState(newState)) + dispatch(actions.hideLoadingIndication()) + + if (err) log.error(err) + if (err) return dispatch(actions.displayWarning(err.message)) + + dispatch(actions.completedTx(msgData.metamaskId)) + }) + } +} + +function signPersonalMsg (msgData) { + log.debug('action - signPersonalMsg') + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + + log.debug(`actions calling background.signPersonalMessage`) + background.signPersonalMessage(msgData, (err, newState) => { + log.debug('signPersonalMessage called back') + dispatch(actions.updateMetamaskState(newState)) + dispatch(actions.hideLoadingIndication()) + + if (err) log.error(err) + if (err) return dispatch(actions.displayWarning(err.message)) + + dispatch(actions.completedTx(msgData.metamaskId)) + }) + } +} + +function signTx (txData) { + return (dispatch) => { + global.ethQuery.sendTransaction(txData, (err, data) => { + dispatch(actions.hideLoadingIndication()) + if (err) return dispatch(actions.displayWarning(err.message)) + dispatch(actions.hideWarning()) + }) + dispatch(this.showConfTxPage()) + } +} + +function sendTx (txData) { + log.info(`actions - sendTx: ${JSON.stringify(txData.txParams)}`) + return (dispatch) => { + log.debug(`actions calling background.approveTransaction`) + background.approveTransaction(txData.id, (err) => { + if (err) { + dispatch(actions.txError(err)) + return log.error(err.message) + } + dispatch(actions.completedTx(txData.id)) + }) + } +} + +function updateAndApproveTx (txData) { + log.info('actions: updateAndApproveTx: ' + JSON.stringify(txData)) + return (dispatch) => { + log.debug(`actions calling background.updateAndApproveTx`) + background.updateAndApproveTransaction(txData, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.txError(err)) + return log.error(err.message) + } + dispatch(actions.completedTx(txData.id)) + }) + } +} + +function completedTx (id) { + return { + type: actions.COMPLETED_TX, + value: id, + } +} + +function txError (err) { + return { + type: actions.TRANSACTION_ERROR, + message: err.message, + } +} + +function cancelMsg (msgData) { + log.debug(`background.cancelMessage`) + background.cancelMessage(msgData.id) + return actions.completedTx(msgData.id) +} + +function cancelPersonalMsg (msgData) { + const id = msgData.id + background.cancelPersonalMessage(id) + return actions.completedTx(id) +} + +function cancelTx (txData) { + log.debug(`background.cancelTransaction`) + background.cancelTransaction(txData.id) + return actions.completedTx(txData.id) +} + +// +// initialize screen +// + +function showCreateVault () { + return { + type: actions.SHOW_CREATE_VAULT, + } +} + +function showRestoreVault () { + return { + type: actions.SHOW_RESTORE_VAULT, + } +} + +function forgotPassword () { + return { + type: actions.FORGOT_PASSWORD, + } +} + +function showInitializeMenu () { + return { + type: actions.SHOW_INIT_MENU, + } +} + +function showImportPage () { + return { + type: actions.SHOW_IMPORT_PAGE, + } +} + +function createNewVaultInProgress () { + return { + type: actions.CREATE_NEW_VAULT_IN_PROGRESS, + } +} + +function showNewVaultSeed (seed) { + return { + type: actions.SHOW_NEW_VAULT_SEED, + value: seed, + } +} + +function backToUnlockView () { + return { + type: actions.BACK_TO_UNLOCK_VIEW, + } +} + +function showNewKeychain () { + return { + type: actions.SHOW_NEW_KEYCHAIN, + } +} + +// +// unlock screen +// + +function unlockInProgress () { + return { + type: actions.UNLOCK_IN_PROGRESS, + } +} + +function unlockFailed (message) { + return { + type: actions.UNLOCK_FAILED, + value: message, + } +} + +function unlockMetamask (account) { + return { + type: actions.UNLOCK_METAMASK, + value: account, + } +} + +function updateMetamaskState (newState) { + return { + type: actions.UPDATE_METAMASK_STATE, + value: newState, + } +} + +function lockMetamask () { + log.debug(`background.setLocked`) + return callBackgroundThenUpdate(background.setLocked) +} + +function setCurrentAccountTab (newTabName) { + log.debug(`background.setCurrentAccountTab: ${newTabName}`) + return callBackgroundThenUpdateNoSpinner(background.setCurrentAccountTab, newTabName) +} + +function showAccountDetail (address) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.setSelectedAddress`) + background.setSelectedAddress(address, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch({ + type: actions.SHOW_ACCOUNT_DETAIL, + value: address, + }) + }) + } +} + +function backToAccountDetail (address) { + return { + type: actions.BACK_TO_ACCOUNT_DETAIL, + value: address, + } +} + +function showAccountsPage () { + return { + type: actions.SHOW_ACCOUNTS_PAGE, + } +} + +function showConfTxPage (transForward = true) { + return { + type: actions.SHOW_CONF_TX_PAGE, + transForward: transForward, + } +} + +function nextTx () { + return { + type: actions.NEXT_TX, + } +} + +function viewPendingTx (txId) { + return { + type: actions.VIEW_PENDING_TX, + value: txId, + } +} + +function previousTx () { + return { + type: actions.PREVIOUS_TX, + } +} + +function showConfigPage (transitionForward = true) { + return { + type: actions.SHOW_CONFIG_PAGE, + value: transitionForward, + } +} + +function showAddTokenPage (transitionForward = true) { + return { + type: actions.SHOW_ADD_TOKEN_PAGE, + value: transitionForward, + } +} + +function addToken (address, symbol, decimals) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + background.addToken(address, symbol, decimals, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + setTimeout(() => { + dispatch(actions.goHome()) + }, 250) + }) + } +} + +function goBackToInitView () { + return { + type: actions.BACK_TO_INIT_MENU, + } +} + +// +// notice +// + +function markNoticeRead (notice) { + return (dispatch) => { + dispatch(this.showLoadingIndication()) + log.debug(`background.markNoticeRead`) + background.markNoticeRead(notice, (err, notice) => { + dispatch(this.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err)) + } + if (notice) { + return dispatch(actions.showNotice(notice)) + } else { + dispatch(this.clearNotices()) + return { + type: actions.SHOW_ACCOUNTS_PAGE, + } + } + }) + } +} + +function showNotice (notice) { + return { + type: actions.SHOW_NOTICE, + value: notice, + } +} + +function clearNotices () { + return { + type: actions.CLEAR_NOTICES, + } +} + +function markAccountsFound () { + log.debug(`background.markAccountsFound`) + return callBackgroundThenUpdate(background.markAccountsFound) +} + +// +// config +// + +// default rpc target refers to localhost:8545 in this instance. +function setDefaultRpcTarget (rpcList) { + log.debug(`background.setDefaultRpcTarget`) + return (dispatch) => { + background.setDefaultRpc((err, result) => { + if (err) { + log.error(err) + return dispatch(self.displayWarning('Had a problem changing networks.')) + } + }) + } +} + +function setRpcTarget (newRpc) { + log.debug(`background.setRpcTarget`) + return (dispatch) => { + background.setCustomRpc(newRpc, (err, result) => { + if (err) { + log.error(err) + return dispatch(self.displayWarning('Had a problem changing networks!')) + } + }) + } +} + +// Calls the addressBookController to add a new address. +function addToAddressBook (recipient, nickname) { + log.debug(`background.addToAddressBook`) + return (dispatch) => { + background.setAddressBook(recipient, nickname, (err, result) => { + if (err) { + log.error(err) + return dispatch(self.displayWarning('Address book failed to update')) + } + }) + } +} + +function setProviderType (type) { + log.debug(`background.setProviderType`) + background.setProviderType(type) + return { + type: actions.SET_PROVIDER_TYPE, + value: type, + } +} + +function useEtherscanProvider () { + log.debug(`background.useEtherscanProvider`) + background.useEtherscanProvider() + return { + type: actions.USE_ETHERSCAN_PROVIDER, + } +} + +function showLoadingIndication (message) { + return { + type: actions.SHOW_LOADING, + value: message, + } +} + +function hideLoadingIndication () { + return { + type: actions.HIDE_LOADING, + } +} + +function showSubLoadingIndication () { + return { + type: actions.SHOW_SUB_LOADING_INDICATION, + } +} + +function hideSubLoadingIndication () { + return { + type: actions.HIDE_SUB_LOADING_INDICATION, + } +} + +function displayWarning (text) { + return { + type: actions.DISPLAY_WARNING, + value: text, + } +} + +function hideWarning () { + return { + type: actions.HIDE_WARNING, + } +} + +function requestExportAccount () { + return { + type: actions.REQUEST_ACCOUNT_EXPORT, + } +} + +function exportAccount (password, address) { + var self = this + + return function (dispatch) { + dispatch(self.showLoadingIndication()) + + log.debug(`background.submitPassword`) + background.submitPassword(password, function (err) { + if (err) { + log.error('Error in submiting password.') + dispatch(self.hideLoadingIndication()) + return dispatch(self.displayWarning('Incorrect Password.')) + } + log.debug(`background.exportAccount`) + background.exportAccount(address, function (err, result) { + dispatch(self.hideLoadingIndication()) + + if (err) { + log.error(err) + return dispatch(self.displayWarning('Had a problem exporting the account.')) + } + + dispatch(self.showPrivateKey(result)) + }) + }) + } +} + +function showPrivateKey (key) { + return { + type: actions.SHOW_PRIVATE_KEY, + value: key, + } +} + +function saveAccountLabel (account, label) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.saveAccountLabel`) + background.saveAccountLabel(account, label, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch({ + type: actions.SAVE_ACCOUNT_LABEL, + value: { account, label }, + }) + }) + } +} + +function showSendPage () { + return { + type: actions.SHOW_SEND_PAGE, + } +} + +function buyEth (opts) { + return (dispatch) => { + const url = getBuyEthUrl(opts) + global.platform.openWindow({ url }) + dispatch({ + type: actions.BUY_ETH, + }) + } +} + +function buyEthView (address) { + return { + type: actions.BUY_ETH_VIEW, + value: address, + } +} + +function coinBaseSubview () { + return { + type: actions.COINBASE_SUBVIEW, + } +} + +function pairUpdate (coin) { + return (dispatch) => { + dispatch(actions.showSubLoadingIndication()) + dispatch(actions.hideWarning()) + shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => { + dispatch(actions.hideSubLoadingIndication()) + dispatch({ + type: actions.PAIR_UPDATE, + value: { + marketinfo: mktResponse, + }, + }) + }) + } +} + +function shapeShiftSubview (network) { + var pair = 'btc_eth' + + return (dispatch) => { + dispatch(actions.showSubLoadingIndication()) + shapeShiftRequest('marketinfo', {pair}, (mktResponse) => { + shapeShiftRequest('getcoins', {}, (response) => { + dispatch(actions.hideSubLoadingIndication()) + if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) + dispatch({ + type: actions.SHAPESHIFT_SUBVIEW, + value: { + marketinfo: mktResponse, + coinOptions: response, + }, + }) + }) + }) + } +} + +function coinShiftRquest (data, marketData) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + shapeShiftRequest('shift', { method: 'POST', data}, (response) => { + dispatch(actions.hideLoadingIndication()) + if (response.error) return dispatch(actions.displayWarning(response.error)) + var message = ` + Deposit your ${response.depositType} to the address bellow:` + log.debug(`background.createShapeShiftTx`) + background.createShapeShiftTx(response.deposit, response.depositType) + dispatch(actions.showQrView(response.deposit, [message].concat(marketData))) + }) + } +} + +function showQrView (data, message) { + return { + type: actions.SHOW_QR_VIEW, + value: { + message: message, + data: data, + }, + } +} +function reshowQrCode (data, coin) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => { + if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) + + var message = [ + `Deposit your ${coin} to the address bellow:`, + `Deposit Limit: ${mktResponse.limit}`, + `Deposit Minimum:${mktResponse.minimum}`, + ] + + dispatch(actions.hideLoadingIndication()) + return dispatch(actions.showQrView(data, message)) + }) + } +} + +function shapeShiftRequest (query, options, cb) { + var queryResponse, method + !options ? options = {} : null + options.method ? method = options.method : method = 'GET' + + var requestListner = function (request) { + queryResponse = JSON.parse(this.responseText) + cb ? cb(queryResponse) : null + return queryResponse + } + + var shapShiftReq = new XMLHttpRequest() + shapShiftReq.addEventListener('load', requestListner) + shapShiftReq.open(method, `https://shapeshift.io/${query}/${options.pair ? options.pair : ''}`, true) + + if (options.method === 'POST') { + var jsonObj = JSON.stringify(options.data) + shapShiftReq.setRequestHeader('Content-Type', 'application/json') + return shapShiftReq.send(jsonObj) + } else { + return shapShiftReq.send() + } +} + +// Call Background Then Update +// +// A function generator for a common pattern wherein: +// We show loading indication. +// We call a background method. +// We hide loading indication. +// If it errored, we show a warning. +// If it didn't, we update the state. +function callBackgroundThenUpdateNoSpinner (method, ...args) { + return (dispatch) => { + method.call(background, ...args, (err) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + forceUpdateMetamaskState(dispatch) + }) + } +} + +function callBackgroundThenUpdate (method, ...args) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + method.call(background, ...args, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + forceUpdateMetamaskState(dispatch) + }) + } +} + +function forceUpdateMetamaskState (dispatch) { + log.debug(`background.getState`) + background.getState((err, newState) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch(actions.updateMetamaskState(newState)) + }) +} diff --git a/ui/responsive/app/add-token.js b/ui/responsive/app/add-token.js new file mode 100644 index 000000000..b303b5c0d --- /dev/null +++ b/ui/responsive/app/add-token.js @@ -0,0 +1,219 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('./actions') + +const ethUtil = require('ethereumjs-util') +const abi = require('human-standard-token-abi') +const Eth = require('ethjs-query') +const EthContract = require('ethjs-contract') + +const emptyAddr = '0x0000000000000000000000000000000000000000' + +module.exports = connect(mapStateToProps)(AddTokenScreen) + +function mapStateToProps (state) { + return { + } +} + +inherits(AddTokenScreen, Component) +function AddTokenScreen () { + this.state = { + warning: null, + address: null, + symbol: 'TOKEN', + decimals: 18, + } + Component.call(this) +} + +AddTokenScreen.prototype.render = function () { + const state = this.state + const props = this.props + const { warning, symbol, decimals } = state + + return ( + h('.flex-column.flex-grow', [ + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + props.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Add Token'), + ]), + + h('.error', { + style: { + display: warning ? 'block' : 'none', + padding: '0 20px', + textAlign: 'center', + }, + }, warning), + + // conf view + h('.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-space-around', { + style: { + padding: '20px', + }, + }, [ + + h('div', [ + h('span', { + style: { fontWeight: 'bold', paddingRight: '10px'}, + }, 'Token Address'), + ]), + + h('section.flex-row.flex-center', [ + h('input#token-address', { + name: 'address', + placeholder: 'Token Address', + onChange: this.tokenAddressDidChange.bind(this), + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + }), + ]), + + h('div', [ + h('span', { + style: { fontWeight: 'bold', paddingRight: '10px'}, + }, 'Token Sybmol'), + ]), + + h('div', { style: {display: 'flex'} }, [ + h('input#token_symbol', { + placeholder: `Like "ETH"`, + value: symbol, + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + onChange: (event) => { + var element = event.target + var symbol = element.value + this.setState({ symbol }) + }, + }), + ]), + + h('div', [ + h('span', { + style: { fontWeight: 'bold', paddingRight: '10px'}, + }, 'Decimals of Precision'), + ]), + + h('div', { style: {display: 'flex'} }, [ + h('input#token_decimals', { + value: decimals, + type: 'number', + min: 0, + max: 36, + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + onChange: (event) => { + var element = event.target + var decimals = element.value.trim() + this.setState({ decimals }) + }, + }), + ]), + + h('button', { + style: { + alignSelf: 'center', + }, + onClick: (event) => { + const valid = this.validateInputs() + if (!valid) return + + const { address, symbol, decimals } = this.state + this.props.dispatch(actions.addToken(address.trim(), symbol.trim(), decimals)) + }, + }, 'Add'), + ]), + ]), + ]) + ) +} + +AddTokenScreen.prototype.componentWillMount = function () { + if (typeof global.ethereumProvider === 'undefined') return + + this.eth = new Eth(global.ethereumProvider) + this.contract = new EthContract(this.eth) + this.TokenContract = this.contract(abi) +} + +AddTokenScreen.prototype.tokenAddressDidChange = function (event) { + const el = event.target + const address = el.value.trim() + if (ethUtil.isValidAddress(address) && address !== emptyAddr) { + this.setState({ address }) + this.attemptToAutoFillTokenParams(address) + } +} + +AddTokenScreen.prototype.validateInputs = function () { + let msg = '' + const state = this.state + const { address, symbol, decimals } = state + + const validAddress = ethUtil.isValidAddress(address) + if (!validAddress) { + msg += 'Address is invalid. ' + } + + const validDecimals = decimals >= 0 && decimals < 36 + if (!validDecimals) { + msg += 'Decimals must be at least 0, and not over 36. ' + } + + const symbolLen = symbol.trim().length + const validSymbol = symbolLen > 0 && symbolLen < 10 + if (!validSymbol) { + msg += 'Symbol must be between 0 and 10 characters.' + } + + const isValid = validAddress && validDecimals + + if (!isValid) { + this.setState({ + warning: msg, + }) + } else { + this.setState({ warning: null }) + } + + return isValid +} + +AddTokenScreen.prototype.attemptToAutoFillTokenParams = async function (address) { + const contract = this.TokenContract.at(address) + + const results = await Promise.all([ + contract.symbol(), + contract.decimals(), + ]) + + const [ symbol, decimals ] = results + if (symbol && decimals) { + console.log('SETTING SYMBOL AND DECIMALS', { symbol, decimals }) + this.setState({ symbol: symbol[0], decimals: decimals[0].toString() }) + } +} + diff --git a/ui/responsive/app/app.js b/ui/responsive/app/app.js new file mode 100644 index 000000000..1a63002e1 --- /dev/null +++ b/ui/responsive/app/app.js @@ -0,0 +1,591 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('./actions') +const ReactCSSTransitionGroup = require('react-addons-css-transition-group') +// init +const InitializeMenuScreen = require('./first-time/init-menu') +const NewKeyChainScreen = require('./new-keychain') +// unlock +const UnlockScreen = require('./unlock') +// accounts +const AccountsScreen = require('./accounts') +const AccountDetailScreen = require('./account-detail') +const SendTransactionScreen = require('./send') +const ConfirmTxScreen = require('./conf-tx') +// notice +const NoticeScreen = require('./components/notice') +const generateLostAccountsNotice = require('../lib/lost-accounts-notice') +// other views +const ConfigScreen = require('./config') +const AddTokenScreen = require('./add-token') +const Import = require('./accounts/import') +const InfoScreen = require('./info') +const Loading = require('./components/loading') +const SandwichExpando = require('sandwich-expando') +const MenuDroppo = require('menu-droppo') +const DropMenuItem = require('./components/drop-menu-item') +const NetworkIndicator = require('./components/network') +const Tooltip = require('./components/tooltip') +const BuyView = require('./components/buy-button-subview') +const QrView = require('./components/qr-code') +const HDCreateVaultComplete = require('./keychains/hd/create-vault-complete') +const HDRestoreVaultScreen = require('./keychains/hd/restore-vault') +const RevealSeedConfirmation = require('./keychains/hd/recover-seed/confirmation') + +module.exports = connect(mapStateToProps)(App) + +inherits(App, Component) +function App () { Component.call(this) } + +function mapStateToProps (state) { + return { + // state from plugin + isLoading: state.appState.isLoading, + loadingMessage: state.appState.loadingMessage, + noActiveNotices: state.metamask.noActiveNotices, + isInitialized: state.metamask.isInitialized, + isUnlocked: state.metamask.isUnlocked, + currentView: state.appState.currentView, + activeAddress: state.appState.activeAddress, + transForward: state.appState.transForward, + seedWords: state.metamask.seedWords, + unapprovedTxs: state.metamask.unapprovedTxs, + unapprovedMsgs: state.metamask.unapprovedMsgs, + menuOpen: state.appState.menuOpen, + network: state.metamask.network, + provider: state.metamask.provider, + forgottenPassword: state.appState.forgottenPassword, + lastUnreadNotice: state.metamask.lastUnreadNotice, + lostAccounts: state.metamask.lostAccounts, + frequentRpcList: state.metamask.frequentRpcList || [], + } +} + +App.prototype.render = function () { + var props = this.props + const { isLoading, loadingMessage, transForward, network } = props + const isLoadingNetwork = network === 'loading' && props.currentView.name !== 'config' + const loadMessage = loadingMessage || isLoadingNetwork ? + `Connecting to ${this.getNetworkName()}` : null + + log.debug('Main ui render function') + + return ( + + h('.flex-column.flex-grow.full-height', { + style: { + // Windows was showing a vertical scroll bar: + overflow: 'hidden', + position: 'relative', + }, + }, [ + + // app bar + this.renderAppBar(), + this.renderNetworkDropdown(), + this.renderDropdown(), + + h(Loading, { + isLoading: isLoading || isLoadingNetwork, + loadingMessage: loadMessage, + }), + + // panel content + h('.app-primary.flex-grow' + (transForward ? '.from-right' : '.from-left'), { + style: { + height: '380px', + width: '360px', + }, + }, [ + h(ReactCSSTransitionGroup, { + className: 'css-transition-group', + transitionName: 'main', + transitionEnterTimeout: 300, + transitionLeaveTimeout: 300, + }, [ + this.renderPrimary(), + ]), + ]), + ]) + ) +} + +App.prototype.renderAppBar = function () { + if (window.METAMASK_UI_TYPE === 'notification') { + return null + } + + const props = this.props + const state = this.state || {} + const isNetworkMenuOpen = state.isNetworkMenuOpen || false + + return ( + + h('div', [ + + h('.app-header.flex-row.flex-space-between', { + style: { + alignItems: 'center', + visibility: props.isUnlocked ? 'visible' : 'none', + background: props.isUnlocked ? 'white' : 'none', + height: '36px', + position: 'relative', + zIndex: 12, + }, + }, [ + + h('div.left-menu-section', { + style: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + }, [ + + // mini logo + h('img', { + height: 24, + width: 24, + src: '/images/icon-128.png', + }), + + h(NetworkIndicator, { + network: this.props.network, + provider: this.props.provider, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + this.setState({ isNetworkMenuOpen: !isNetworkMenuOpen }) + }, + }), + ]), + + // metamask name + props.isUnlocked && h('h1', { + style: { + position: 'relative', + left: '9px', + }, + }, 'MetaMask'), + + props.isUnlocked && h('div', { + style: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + }, [ + + // small accounts nav + props.isUnlocked && h(Tooltip, { title: 'Switch Accounts' }, [ + h('img.cursor-pointer.color-orange', { + src: 'images/switch_acc.svg', + style: { + width: '23.5px', + marginRight: '8px', + }, + onClick: (event) => { + event.stopPropagation() + this.props.dispatch(actions.showAccountsPage()) + }, + }), + ]), + + // hamburger + props.isUnlocked && h(SandwichExpando, { + width: 16, + barHeight: 2, + padding: 0, + isOpen: state.isMainMenuOpen, + color: 'rgb(247,146,30)', + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + this.setState({ isMainMenuOpen: !state.isMainMenuOpen }) + }, + }), + ]), + ]), + ]) + ) +} + +App.prototype.renderNetworkDropdown = function () { + const props = this.props + const rpcList = props.frequentRpcList + const state = this.state || {} + const isOpen = state.isNetworkMenuOpen + + return h(MenuDroppo, { + isOpen, + onClickOutside: (event) => { + this.setState({ isNetworkMenuOpen: !isOpen }) + }, + zIndex: 11, + style: { + position: 'absolute', + left: 0, + top: '36px', + }, + innerStyle: { + background: 'white', + boxShadow: '1px 1px 2px rgba(0,0,0,0.1)', + }, + }, [ // DROP MENU ITEMS + h('style', ` + .drop-menu-item:hover { background:rgb(235, 235, 235); } + .drop-menu-item i { margin: 11px; } + `), + + h(DropMenuItem, { + label: 'Main Ethereum Network', + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => props.dispatch(actions.setProviderType('mainnet')), + icon: h('.menu-icon.diamond'), + activeNetworkRender: props.network, + provider: props.provider, + }), + + h(DropMenuItem, { + label: 'Ropsten Test Network', + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => props.dispatch(actions.setProviderType('ropsten')), + icon: h('.menu-icon.red-dot'), + activeNetworkRender: props.network, + provider: props.provider, + }), + + h(DropMenuItem, { + label: 'Kovan Test Network', + closeMenu: () => this.setState({ isNetworkMenuOpen: false}), + action: () => props.dispatch(actions.setProviderType('kovan')), + icon: h('.menu-icon.hollow-diamond'), + activeNetworkRender: props.network, + provider: props.provider, + }), + + h(DropMenuItem, { + label: 'Rinkeby Test Network', + closeMenu: () => this.setState({ isNetworkMenuOpen: false}), + action: () => props.dispatch(actions.setProviderType('rinkeby')), + icon: h('.menu-icon.golden-square'), + activeNetworkRender: props.network, + provider: props.provider, + }), + + h(DropMenuItem, { + label: 'Localhost 8545', + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => props.dispatch(actions.setDefaultRpcTarget(rpcList)), + icon: h('i.fa.fa-question-circle.fa-lg'), + activeNetworkRender: props.provider.rpcTarget, + }), + + this.renderCustomOption(props.provider), + this.renderCommonRpc(rpcList, props.provider), + + h(DropMenuItem, { + label: 'Custom RPC', + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => this.props.dispatch(actions.showConfigPage()), + icon: h('i.fa.fa-question-circle.fa-lg'), + }), + + ]) +} + +App.prototype.renderDropdown = function () { + const state = this.state || {} + const isOpen = state.isMainMenuOpen + + return h(MenuDroppo, { + isOpen: isOpen, + zIndex: 11, + onClickOutside: (event) => { + this.setState({ isMainMenuOpen: !isOpen }) + }, + style: { + position: 'absolute', + right: 0, + top: '36px', + }, + innerStyle: { + background: 'white', + boxShadow: '1px 1px 2px rgba(0,0,0,0.1)', + }, + }, [ // DROP MENU ITEMS + h('style', ` + .drop-menu-item:hover { background:rgb(235, 235, 235); } + .drop-menu-item i { margin: 11px; } + `), + + h(DropMenuItem, { + label: 'Settings', + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + action: () => this.props.dispatch(actions.showConfigPage()), + icon: h('i.fa.fa-gear.fa-lg'), + }), + + h(DropMenuItem, { + label: 'Import Account', + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + action: () => this.props.dispatch(actions.showImportPage()), + icon: h('i.fa.fa-arrow-circle-o-up.fa-lg'), + }), + + h(DropMenuItem, { + label: 'Lock', + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + action: () => this.props.dispatch(actions.lockMetamask()), + icon: h('i.fa.fa-lock.fa-lg'), + }), + + h(DropMenuItem, { + label: 'Info/Help', + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + action: () => this.props.dispatch(actions.showInfoPage()), + icon: h('i.fa.fa-question.fa-lg'), + }), + ]) +} + +App.prototype.renderBackButton = function (style, justArrow = false) { + var props = this.props + return ( + h('.flex-row', { + key: 'leftArrow', + style: style, + onClick: () => props.dispatch(actions.goBackToInitView()), + }, [ + h('i.fa.fa-arrow-left.cursor-pointer'), + justArrow ? null : h('div.cursor-pointer', { + style: { + marginLeft: '3px', + }, + onClick: () => props.dispatch(actions.goBackToInitView()), + }, 'BACK'), + ]) + ) +} + +App.prototype.renderPrimary = function () { + log.debug('rendering primary') + var props = this.props + + // notices + if (!props.noActiveNotices) { + log.debug('rendering notice screen for unread notices.') + return h(NoticeScreen, { + notice: props.lastUnreadNotice, + key: 'NoticeScreen', + onConfirm: () => props.dispatch(actions.markNoticeRead(props.lastUnreadNotice)), + }) + } else if (props.lostAccounts && props.lostAccounts.length > 0) { + log.debug('rendering notice screen for lost accounts view.') + return h(NoticeScreen, { + notice: generateLostAccountsNotice(props.lostAccounts), + key: 'LostAccountsNotice', + onConfirm: () => props.dispatch(actions.markAccountsFound()), + }) + } + + if (props.seedWords) { + log.debug('rendering seed words') + return h(HDCreateVaultComplete, {key: 'HDCreateVaultComplete'}) + } + + // show initialize screen + if (!props.isInitialized || props.forgottenPassword) { + // show current view + log.debug('rendering an initialize screen') + switch (props.currentView.name) { + + case 'restoreVault': + log.debug('rendering restore vault screen') + return h(HDRestoreVaultScreen, {key: 'HDRestoreVaultScreen'}) + + default: + log.debug('rendering menu screen') + return h(InitializeMenuScreen, {key: 'menuScreenInit'}) + } + } + + // show unlock screen + if (!props.isUnlocked) { + switch (props.currentView.name) { + + case 'restoreVault': + log.debug('rendering restore vault screen') + return h(HDRestoreVaultScreen, {key: 'HDRestoreVaultScreen'}) + + case 'config': + log.debug('rendering config screen from unlock screen.') + return h(ConfigScreen, {key: 'config'}) + + default: + log.debug('rendering locked screen') + return h(UnlockScreen, {key: 'locked'}) + } + } + + // show current view + switch (props.currentView.name) { + + case 'accounts': + log.debug('rendering accounts screen') + return h(AccountsScreen, {key: 'accounts'}) + + case 'accountDetail': + log.debug('rendering account detail screen') + return h(AccountDetailScreen, {key: 'account-detail'}) + + case 'sendTransaction': + log.debug('rendering send tx screen') + return h(SendTransactionScreen, {key: 'send-transaction'}) + + case 'newKeychain': + log.debug('rendering new keychain screen') + return h(NewKeyChainScreen, {key: 'new-keychain'}) + + case 'confTx': + log.debug('rendering confirm tx screen') + return h(ConfirmTxScreen, {key: 'confirm-tx'}) + + case 'add-token': + log.debug('rendering add-token screen from unlock screen.') + return h(AddTokenScreen, {key: 'add-token'}) + + case 'config': + log.debug('rendering config screen') + return h(ConfigScreen, {key: 'config'}) + + case 'import-menu': + log.debug('rendering import screen') + return h(Import, {key: 'import-menu'}) + + case 'reveal-seed-conf': + log.debug('rendering reveal seed confirmation screen') + return h(RevealSeedConfirmation, {key: 'reveal-seed-conf'}) + + case 'info': + log.debug('rendering info screen') + return h(InfoScreen, {key: 'info'}) + + case 'buyEth': + log.debug('rendering buy ether screen') + return h(BuyView, {key: 'buyEthView'}) + + case 'qr': + log.debug('rendering show qr screen') + return h('div', { + style: { + position: 'absolute', + height: '100%', + top: '0px', + left: '0px', + }, + }, [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', { + onClick: () => props.dispatch(actions.backToAccountDetail(props.activeAddress)), + style: { + marginLeft: '10px', + marginTop: '50px', + }, + }), + h('div', { + style: { + position: 'absolute', + left: '44px', + width: '285px', + }, + }, [ + h(QrView, {key: 'qr'}), + ]), + ]) + + default: + log.debug('rendering default, account detail screen') + return h(AccountDetailScreen, {key: 'account-detail'}) + } +} + +App.prototype.toggleMetamaskActive = function () { + if (!this.props.isUnlocked) { + // currently inactive: redirect to password box + var passwordBox = document.querySelector('input[type=password]') + if (!passwordBox) return + passwordBox.focus() + } else { + // currently active: deactivate + this.props.dispatch(actions.lockMetamask(false)) + } +} + +App.prototype.renderCustomOption = function (provider) { + const { rpcTarget, type } = provider + if (type !== 'rpc') return null + + // Concatenate long URLs + let label = rpcTarget + if (rpcTarget.length > 31) { + label = label.substr(0, 34) + '...' + } + + switch (rpcTarget) { + + case 'http://localhost:8545': + return null + + default: + return h(DropMenuItem, { + label, + key: rpcTarget, + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + icon: h('i.fa.fa-question-circle.fa-lg'), + activeNetworkRender: 'custom', + }) + } +} + +App.prototype.getNetworkName = function () { + const { provider } = this.props + const providerName = provider.type + + let name + + if (providerName === 'mainnet') { + name = 'Main Ethereum Network' + } else if (providerName === 'ropsten') { + name = 'Ropsten Test Network' + } else if (providerName === 'kovan') { + name = 'Kovan Test Network' + } else if (providerName === 'rinkeby') { + name = 'Rinkeby Test Network' + } else { + name = 'Unknown Private Network' + } + + return name +} + +App.prototype.renderCommonRpc = function (rpcList, provider) { + const { rpcTarget } = provider + const props = this.props + + return rpcList.map((rpc) => { + if ((rpc === 'http://localhost:8545') || (rpc === rpcTarget)) { + return null + } else { + return h(DropMenuItem, { + label: rpc, + key: rpc, + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => props.dispatch(actions.setRpcTarget(rpc)), + icon: h('i.fa.fa-question-circle.fa-lg'), + activeNetworkRender: rpc, + }) + } + }) +} diff --git a/ui/responsive/app/components/account-export.js b/ui/responsive/app/components/account-export.js new file mode 100644 index 000000000..394d878f7 --- /dev/null +++ b/ui/responsive/app/components/account-export.js @@ -0,0 +1,122 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const copyToClipboard = require('copy-to-clipboard') +const actions = require('../actions') +const ethUtil = require('ethereumjs-util') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(ExportAccountView) + +inherits(ExportAccountView, Component) +function ExportAccountView () { + Component.call(this) +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +ExportAccountView.prototype.render = function () { + var state = this.props + var accountDetail = state.accountDetail + + if (!accountDetail) return h('div') + var accountExport = accountDetail.accountExport + + var notExporting = accountExport === 'none' + var exportRequested = accountExport === 'requested' + var accountExported = accountExport === 'completed' + + if (notExporting) return h('div') + + if (exportRequested) { + var warning = `Export private keys at your own risk.` + return ( + h('div', { + style: { + display: 'inline-block', + textAlign: 'center', + }, + }, + [ + h('div', { + key: 'exporting', + style: { + margin: '0 20px', + }, + }, [ + h('p.error', warning), + h('input#exportAccount.sizing-input', { + type: 'password', + placeholder: 'confirm password', + onKeyPress: this.onExportKeyPress.bind(this), + style: { + position: 'relative', + top: '1.5px', + marginBottom: '7px', + }, + }), + ]), + h('div', { + key: 'buttons', + style: { + margin: '0 20px', + }, + }, + [ + h('button', { + onClick: () => this.onExportKeyPress({ key: 'Enter', preventDefault: () => {} }), + style: { + marginRight: '10px', + }, + }, 'Submit'), + h('button', { + onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), + }, 'Cancel'), + ]), + (this.props.warning) && ( + h('span.error', { + style: { + margin: '20px', + }, + }, this.props.warning.split('-')) + ), + ]) + ) + } + + if (accountExported) { + return h('div.privateKey', { + style: { + margin: '0 20px', + }, + }, [ + h('label', 'Your private key (click to copy):'), + h('p.error.cursor-pointer', { + style: { + textOverflow: 'ellipsis', + overflow: 'hidden', + webkitUserSelect: 'text', + width: '100%', + }, + onClick: function (event) { + copyToClipboard(ethUtil.stripHexPrefix(accountDetail.privateKey)) + }, + }, ethUtil.stripHexPrefix(accountDetail.privateKey)), + h('button', { + onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), + }, 'Done'), + ]) + } +} + +ExportAccountView.prototype.onExportKeyPress = function (event) { + if (event.key !== 'Enter') return + event.preventDefault() + + var input = document.getElementById('exportAccount').value + this.props.dispatch(actions.exportAccount(input, this.props.address)) +} diff --git a/ui/responsive/app/components/account-info-link.js b/ui/responsive/app/components/account-info-link.js new file mode 100644 index 000000000..6526ab502 --- /dev/null +++ b/ui/responsive/app/components/account-info-link.js @@ -0,0 +1,41 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const Tooltip = require('./tooltip') +const genAccountLink = require('../../lib/account-link') + +module.exports = AccountInfoLink + +inherits(AccountInfoLink, Component) +function AccountInfoLink () { + Component.call(this) +} + +AccountInfoLink.prototype.render = function () { + const { selected, network } = this.props + const title = 'View account on Etherscan' + const url = genAccountLink(selected, network) + + if (!url) { + return null + } + + return h('.account-info-link', { + style: { + display: 'flex', + alignItems: 'center', + }, + }, [ + + h(Tooltip, { + title, + }, [ + h('i.fa.fa-info-circle.cursor-pointer.color-orange', { + style: { + margin: '5px', + }, + onClick () { global.platform.openWindow({ url }) }, + }), + ]), + ]) +} diff --git a/ui/responsive/app/components/account-panel.js b/ui/responsive/app/components/account-panel.js new file mode 100644 index 000000000..abaaf8163 --- /dev/null +++ b/ui/responsive/app/components/account-panel.js @@ -0,0 +1,86 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const Identicon = require('./identicon') +const formatBalance = require('../util').formatBalance +const addressSummary = require('../util').addressSummary + +module.exports = AccountPanel + + +inherits(AccountPanel, Component) +function AccountPanel () { + Component.call(this) +} + +AccountPanel.prototype.render = function () { + var state = this.props + var identity = state.identity || {} + var account = state.account || {} + var isFauceting = state.isFauceting + + var panelState = { + key: `accountPanel${identity.address}`, + identiconKey: identity.address, + identiconLabel: identity.name || '', + attributes: [ + { + key: 'ADDRESS', + value: addressSummary(identity.address), + }, + balanceOrFaucetingIndication(account, isFauceting), + ], + } + + return ( + + h('.identity-panel.flex-row.flex-space-between', { + style: { + flex: '1 0 auto', + cursor: panelState.onClick ? 'pointer' : undefined, + }, + onClick: panelState.onClick, + }, [ + + // account identicon + h('.identicon-wrapper.flex-column.select-none', [ + h(Identicon, { + address: panelState.identiconKey, + imageify: state.imageifyIdenticons, + }), + h('span.font-small', panelState.identiconLabel.substring(0, 7) + '...'), + ]), + + // account address, balance + h('.identity-data.flex-column.flex-justify-center.flex-grow.select-none', [ + + panelState.attributes.map((attr) => { + return h('.flex-row.flex-space-between', { + key: '' + Math.round(Math.random() * 1000000), + }, [ + h('label.font-small.no-select', attr.key), + h('span.font-small', attr.value), + ]) + }), + ]), + + ]) + + ) +} + +function balanceOrFaucetingIndication (account, isFauceting) { + // Temporarily deactivating isFauceting indication + // because it shows fauceting for empty restored accounts. + if (/* isFauceting*/ false) { + return { + key: 'Account is auto-funding.', + value: 'Please wait.', + } + } else { + return { + key: 'BALANCE', + value: formatBalance(account.balance), + } + } +} diff --git a/ui/responsive/app/components/balance.js b/ui/responsive/app/components/balance.js new file mode 100644 index 000000000..57ca84564 --- /dev/null +++ b/ui/responsive/app/components/balance.js @@ -0,0 +1,89 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const formatBalance = require('../util').formatBalance +const generateBalanceObject = require('../util').generateBalanceObject +const Tooltip = require('./tooltip.js') +const FiatValue = require('./fiat-value.js') + +module.exports = EthBalanceComponent + +inherits(EthBalanceComponent, Component) +function EthBalanceComponent () { + Component.call(this) +} + +EthBalanceComponent.prototype.render = function () { + var props = this.props + let { value } = props + var style = props.style + var needsParse = this.props.needsParse !== undefined ? this.props.needsParse : true + value = value ? formatBalance(value, 6, needsParse) : '...' + var width = props.width + + return ( + + h('.ether-balance.ether-balance-amount', { + style: style, + }, [ + h('div', { + style: { + display: 'inline', + width: width, + }, + }, this.renderBalance(value)), + ]) + + ) +} +EthBalanceComponent.prototype.renderBalance = function (value) { + var props = this.props + if (value === 'None') return value + if (value === '...') return value + var balanceObj = generateBalanceObject(value, props.shorten ? 1 : 3) + var balance + var splitBalance = value.split(' ') + var ethNumber = splitBalance[0] + var ethSuffix = splitBalance[1] + const showFiat = 'showFiat' in props ? props.showFiat : true + + if (props.shorten) { + balance = balanceObj.shortBalance + } else { + balance = balanceObj.balance + } + + var label = balanceObj.label + + return ( + h(Tooltip, { + position: 'bottom', + title: `${ethNumber} ${ethSuffix}`, + }, h('div.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('div', { + style: { + width: '100%', + textAlign: 'right', + }, + }, this.props.incoming ? `+${balance}` : balance), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + }, + }, label), + ]), + + showFiat ? h(FiatValue, { value: props.value }) : null, + ])) + ) +} diff --git a/ui/responsive/app/components/binary-renderer.js b/ui/responsive/app/components/binary-renderer.js new file mode 100644 index 000000000..0b6a1f5c2 --- /dev/null +++ b/ui/responsive/app/components/binary-renderer.js @@ -0,0 +1,46 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ethUtil = require('ethereumjs-util') +const extend = require('xtend') + +module.exports = BinaryRenderer + +inherits(BinaryRenderer, Component) +function BinaryRenderer () { + Component.call(this) +} + +BinaryRenderer.prototype.render = function () { + const props = this.props + const { value, style } = props + const text = this.hexToText(value) + + const defaultStyle = extend({ + width: '315px', + maxHeight: '210px', + resize: 'none', + border: 'none', + background: 'white', + padding: '3px', + }, style) + + return ( + h('textarea.font-small', { + readOnly: true, + style: defaultStyle, + defaultValue: text, + }) + ) +} + +BinaryRenderer.prototype.hexToText = function (hex) { + try { + const stripped = ethUtil.stripHexPrefix(hex) + const buff = Buffer.from(stripped, 'hex') + return buff.toString('utf8') + } catch (e) { + return hex + } +} + diff --git a/ui/responsive/app/components/bn-as-decimal-input.js b/ui/responsive/app/components/bn-as-decimal-input.js new file mode 100644 index 000000000..f3ace4720 --- /dev/null +++ b/ui/responsive/app/components/bn-as-decimal-input.js @@ -0,0 +1,174 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ethUtil = require('ethereumjs-util') +const BN = ethUtil.BN +const extend = require('xtend') + +module.exports = BnAsDecimalInput + +inherits(BnAsDecimalInput, Component) +function BnAsDecimalInput () { + this.state = { invalid: null } + Component.call(this) +} + +/* Bn as Decimal Input + * + * A component for allowing easy, decimal editing + * of a passed in bn string value. + * + * On change, calls back its `onChange` function parameter + * and passes it an updated bn string. + */ + +BnAsDecimalInput.prototype.render = function () { + const props = this.props + const state = this.state + + const { value, scale, precision, onChange, min, max } = props + + const suffix = props.suffix + const style = props.style + const valueString = value.toString(10) + const newValue = this.downsize(valueString, scale, precision) + + return ( + h('.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('input.hex-input', { + type: 'number', + step: 'any', + required: true, + min, + max, + style: extend({ + display: 'block', + textAlign: 'right', + backgroundColor: 'transparent', + border: '1px solid #bdbdbd', + + }, style), + value: newValue, + onBlur: (event) => { + this.updateValidity(event) + }, + onChange: (event) => { + this.updateValidity(event) + const value = (event.target.value === '') ? '' : event.target.value + + + const scaledNumber = this.upsize(value, scale, precision) + const precisionBN = new BN(scaledNumber, 10) + onChange(precisionBN, event.target.checkValidity()) + }, + onInvalid: (event) => { + const msg = this.constructWarning() + if (msg === state.invalid) { + return + } + this.setState({ invalid: msg }) + event.preventDefault() + return false + }, + }), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + marginRight: '6px', + width: '20px', + }, + }, suffix), + ]), + + state.invalid ? h('span.error', { + style: { + position: 'absolute', + right: '0px', + textAlign: 'right', + transform: 'translateY(26px)', + padding: '3px', + background: 'rgba(255,255,255,0.85)', + zIndex: '1', + textTransform: 'capitalize', + border: '2px solid #E20202', + }, + }, state.invalid) : null, + ]) + ) +} + +BnAsDecimalInput.prototype.setValid = function (message) { + this.setState({ invalid: null }) +} + +BnAsDecimalInput.prototype.updateValidity = function (event) { + const target = event.target + const value = this.props.value + const newValue = target.value + + if (value === newValue) { + return + } + + const valid = target.checkValidity() + + if (valid) { + this.setState({ invalid: null }) + } +} + +BnAsDecimalInput.prototype.constructWarning = function () { + const { name, min, max } = this.props + let message = name ? name + ' ' : '' + + if (min && max) { + message += `must be greater than or equal to ${min} and less than or equal to ${max}.` + } else if (min) { + message += `must be greater than or equal to ${min}.` + } else if (max) { + message += `must be less than or equal to ${max}.` + } else { + message += 'Invalid input.' + } + + return message +} + + +BnAsDecimalInput.prototype.downsize = function (number, scale, precision) { + // if there is no scaling, simply return the number + if (scale === 0) { + return Number(number) + } else { + // if the scale is the same as the precision, account for this edge case. + var decimals = (scale === precision) ? -1 : scale - precision + return Number(number.slice(0, -scale) + '.' + number.slice(-scale, decimals)) + } +} + +BnAsDecimalInput.prototype.upsize = function (number, scale, precision) { + var stringArray = number.toString().split('.') + var decimalLength = stringArray[1] ? stringArray[1].length : 0 + var newString = stringArray[0] + + // If there is scaling and decimal parts exist, integrate them in. + if ((scale !== 0) && (decimalLength !== 0)) { + newString += stringArray[1].slice(0, precision) + } + + // Add 0s to account for the upscaling. + for (var i = decimalLength; i < scale; i++) { + newString += '0' + } + return newString +} diff --git a/ui/responsive/app/components/buy-button-subview.js b/ui/responsive/app/components/buy-button-subview.js new file mode 100644 index 000000000..87084f92d --- /dev/null +++ b/ui/responsive/app/components/buy-button-subview.js @@ -0,0 +1,197 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const connect = require('react-redux').connect +const actions = require('../actions') +const CoinbaseForm = require('./coinbase-form') +const ShapeshiftForm = require('./shapeshift-form') +const Loading = require('./loading') +const AccountPanel = require('./account-panel') +const RadioList = require('./custom-radio-list') + +module.exports = connect(mapStateToProps)(BuyButtonSubview) + +function mapStateToProps (state) { + return { + identity: state.appState.identity, + account: state.metamask.accounts[state.appState.buyView.buyAddress], + warning: state.appState.warning, + buyView: state.appState.buyView, + network: state.metamask.network, + provider: state.metamask.provider, + context: state.appState.currentView.context, + isSubLoading: state.appState.isSubLoading, + } +} + +inherits(BuyButtonSubview, Component) +function BuyButtonSubview () { + Component.call(this) +} + +BuyButtonSubview.prototype.render = function () { + const props = this.props + const isLoading = props.isSubLoading + + return ( + h('.buy-eth-section.flex-column', { + style: { + alignItems: 'center', + }, + }, [ + // back button + h('.flex-row', { + style: { + alignItems: 'center', + justifyContent: 'center', + }, + }, [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', { + onClick: this.backButtonContext.bind(this), + style: { + position: 'absolute', + left: '10px', + }, + }), + h('h2.text-transform-uppercase.flex-center', { + style: { + width: '100vw', + background: 'rgb(235, 235, 235)', + color: 'rgb(174, 174, 174)', + paddingTop: '4px', + paddingBottom: '4px', + }, + }, 'Buy Eth'), + ]), + h('div', { + style: { + position: 'absolute', + top: '57vh', + left: '49vw', + }, + }, [ + h(Loading, {isLoading}), + ]), + h('div', { + style: { + width: '80%', + }, + }, [ + h(AccountPanel, { + showFullAddress: true, + identity: props.identity, + account: props.account, + }), + ]), + h('h3.text-transform-uppercase', { + style: { + paddingLeft: '15px', + fontFamily: 'Montserrat Light', + width: '100vw', + background: 'rgb(235, 235, 235)', + color: 'rgb(174, 174, 174)', + paddingTop: '4px', + paddingBottom: '4px', + }, + }, 'Select Service'), + h('.flex-row.selected-exchange', { + style: { + position: 'relative', + right: '35px', + marginTop: '20px', + marginBottom: '20px', + }, + }, [ + h(RadioList, { + defaultFocus: props.buyView.subview, + labels: [ + 'Coinbase', + 'ShapeShift', + ], + subtext: { + 'Coinbase': 'Crypto/FIAT (USA only)', + 'ShapeShift': 'Crypto', + }, + onClick: this.radioHandler.bind(this), + }), + ]), + h('h3.text-transform-uppercase', { + style: { + paddingLeft: '15px', + fontFamily: 'Montserrat Light', + width: '100vw', + background: 'rgb(235, 235, 235)', + color: 'rgb(174, 174, 174)', + paddingTop: '4px', + paddingBottom: '4px', + }, + }, props.buyView.subview), + this.formVersionSubview(), + ]) + ) +} + +BuyButtonSubview.prototype.formVersionSubview = function () { + const network = this.props.network + if (network === '1') { + if (this.props.buyView.formView.coinbase) { + return h(CoinbaseForm, this.props) + } else if (this.props.buyView.formView.shapeshift) { + return h(ShapeshiftForm, this.props) + } + } else { + return h('div.flex-column', { + style: { + alignItems: 'center', + margin: '50px', + }, + }, [ + h('h3.text-transform-uppercase', { + style: { + width: '225px', + marginBottom: '15px', + }, + }, 'In order to access this feature, please switch to the Main Network'), + ((network === '3') || (network === '4') || (network === '42')) ? h('h3.text-transform-uppercase', 'or go to the') : null, + (network === '3') ? h('button.text-transform-uppercase', { + onClick: () => this.props.dispatch(actions.buyEth({ network })), + style: { + marginTop: '15px', + }, + }, 'Ropsten Test Faucet') : null, + (network === '4') ? h('button.text-transform-uppercase', { + onClick: () => this.props.dispatch(actions.buyEth({ network })), + style: { + marginTop: '15px', + }, + }, 'Rinkeby Test Faucet') : null, + (network === '42') ? h('button.text-transform-uppercase', { + onClick: () => this.props.dispatch(actions.buyEth({ network })), + style: { + marginTop: '15px', + }, + }, 'Kovan Test Faucet') : null, + ]) + } +} + +BuyButtonSubview.prototype.navigateTo = function (url) { + global.platform.openWindow({ url }) +} + +BuyButtonSubview.prototype.backButtonContext = function () { + if (this.props.context === 'confTx') { + this.props.dispatch(actions.showConfTxPage(false)) + } else { + this.props.dispatch(actions.goHome()) + } +} + +BuyButtonSubview.prototype.radioHandler = function (event) { + switch (event.target.title) { + case 'Coinbase': + return this.props.dispatch(actions.coinBaseSubview()) + case 'ShapeShift': + return this.props.dispatch(actions.shapeShiftSubview(this.props.provider.type)) + } +} diff --git a/ui/responsive/app/components/coinbase-form.js b/ui/responsive/app/components/coinbase-form.js new file mode 100644 index 000000000..f44d86045 --- /dev/null +++ b/ui/responsive/app/components/coinbase-form.js @@ -0,0 +1,63 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const connect = require('react-redux').connect +const actions = require('../actions') + +module.exports = connect(mapStateToProps)(CoinbaseForm) + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +inherits(CoinbaseForm, Component) + +function CoinbaseForm () { + Component.call(this) +} + +CoinbaseForm.prototype.render = function () { + var props = this.props + + return h('.flex-column', { + style: { + marginTop: '35px', + padding: '25px', + width: '100%', + }, + }, [ + h('.flex-row', { + style: { + justifyContent: 'space-around', + margin: '33px', + marginTop: '0px', + }, + }, [ + h('button.btn-green', { + onClick: this.toCoinbase.bind(this), + }, 'Continue to Coinbase'), + + h('button.btn-red', { + onClick: () => props.dispatch(actions.backTobuyView(props.accounts.address)), + }, 'Cancel'), + ]), + ]) +} + +CoinbaseForm.prototype.toCoinbase = function () { + const props = this.props + const address = props.buyView.buyAddress + props.dispatch(actions.buyEth({ network: '1', address, amount: 0 })) +} + +CoinbaseForm.prototype.renderLoading = function () { + return h('img', { + style: { + width: '27px', + marginRight: '-27px', + }, + src: 'images/loading.svg', + }) +} diff --git a/ui/responsive/app/components/copyButton.js b/ui/responsive/app/components/copyButton.js new file mode 100644 index 000000000..a25d0719c --- /dev/null +++ b/ui/responsive/app/components/copyButton.js @@ -0,0 +1,59 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const copyToClipboard = require('copy-to-clipboard') + +const Tooltip = require('./tooltip') + +module.exports = CopyButton + +inherits(CopyButton, Component) +function CopyButton () { + Component.call(this) +} + +// As parameters, accepts: +// "value", which is the value to copy (mandatory) +// "title", which is the text to show on hover (optional, defaults to 'Copy') +CopyButton.prototype.render = function () { + const props = this.props + const state = this.state || {} + + const value = props.value + const copied = state.copied + + const message = copied ? 'Copied' : props.title || ' Copy ' + + return h('.copy-button', { + style: { + display: 'flex', + alignItems: 'center', + }, + }, [ + + h(Tooltip, { + title: message, + }, [ + h('i.fa.fa-clipboard.cursor-pointer.color-orange', { + style: { + margin: '5px', + }, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + copyToClipboard(value) + this.debounceRestore() + }, + }), + ]), + + ]) +} + +CopyButton.prototype.debounceRestore = function () { + this.setState({ copied: true }) + clearTimeout(this.timeout) + this.timeout = setTimeout(() => { + this.setState({ copied: false }) + }, 850) +} diff --git a/ui/responsive/app/components/copyable.js b/ui/responsive/app/components/copyable.js new file mode 100644 index 000000000..a4f6f4bc6 --- /dev/null +++ b/ui/responsive/app/components/copyable.js @@ -0,0 +1,46 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const Tooltip = require('./tooltip') +const copyToClipboard = require('copy-to-clipboard') + +module.exports = Copyable + +inherits(Copyable, Component) +function Copyable () { + Component.call(this) + this.state = { + copied: false, + } +} + +Copyable.prototype.render = function () { + const props = this.props + const state = this.state + const { value, children } = props + const { copied } = state + + return h(Tooltip, { + title: copied ? 'Copied!' : 'Copy', + position: 'bottom', + }, h('span', { + style: { + cursor: 'pointer', + }, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + copyToClipboard(value) + this.debounceRestore() + }, + }, children)) +} + +Copyable.prototype.debounceRestore = function () { + this.setState({ copied: true }) + clearTimeout(this.timeout) + this.timeout = setTimeout(() => { + this.setState({ copied: false }) + }, 850) +} diff --git a/ui/responsive/app/components/custom-radio-list.js b/ui/responsive/app/components/custom-radio-list.js new file mode 100644 index 000000000..a4c525396 --- /dev/null +++ b/ui/responsive/app/components/custom-radio-list.js @@ -0,0 +1,60 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = RadioList + +inherits(RadioList, Component) +function RadioList () { + Component.call(this) +} + +RadioList.prototype.render = function () { + const props = this.props + const activeClass = '.custom-radio-selected' + const inactiveClass = '.custom-radio-inactive' + const { + labels, + defaultFocus, + } = props + + + return ( + h('.flex-row', { + style: { + fontSize: '12px', + }, + }, [ + h('.flex-column.custom-radios', { + style: { + marginRight: '5px', + }, + }, + labels.map((lable, i) => { + let isSelcted = (this.state !== null) + isSelcted = isSelcted ? (this.state.selected === lable) : (defaultFocus === lable) + return h(isSelcted ? activeClass : inactiveClass, { + title: lable, + onClick: (event) => { + this.setState({selected: event.target.title}) + props.onClick(event) + }, + }) + }) + ), + h('.text', {}, + labels.map((lable) => { + if (props.subtext) { + return h('.flex-row', {}, [ + h('.radio-titles', lable), + h('.radio-titles-subtext', `- ${props.subtext[lable]}`), + ]) + } else { + return h('.radio-titles', lable) + } + }) + ), + ]) + ) +} + diff --git a/ui/responsive/app/components/drop-menu-item.js b/ui/responsive/app/components/drop-menu-item.js new file mode 100644 index 000000000..e42948209 --- /dev/null +++ b/ui/responsive/app/components/drop-menu-item.js @@ -0,0 +1,59 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = DropMenuItem + +inherits(DropMenuItem, Component) +function DropMenuItem () { + Component.call(this) +} + +DropMenuItem.prototype.render = function () { + return h('li.drop-menu-item', { + onClick: () => { + this.props.closeMenu() + this.props.action() + }, + style: { + listStyle: 'none', + padding: '6px 16px 6px 5px', + fontFamily: 'Montserrat Regular', + color: 'rgb(125, 128, 130)', + cursor: 'pointer', + display: 'flex', + justifyContent: 'flex-start', + }, + }, [ + this.props.icon, + this.props.label, + this.activeNetworkRender(), + ]) +} + +DropMenuItem.prototype.activeNetworkRender = function () { + const activeNetwork = this.props.activeNetworkRender + const { provider } = this.props + const providerType = provider ? provider.type : null + if (activeNetwork === undefined) return + + switch (this.props.label) { + case 'Main Ethereum Network': + if (providerType === 'mainnet') return h('.check', '✓') + break + case 'Ropsten Test Network': + if (providerType === 'ropsten') return h('.check', '✓') + break + case 'Kovan Test Network': + if (providerType === 'kovan') return h('.check', '✓') + break + case 'Rinkeby Test Network': + if (providerType === 'rinkeby') return h('.check', '✓') + break + case 'Localhost 8545': + if (activeNetwork === 'http://localhost:8545') return h('.check', '✓') + break + default: + if (activeNetwork === 'custom') return h('.check', '✓') + } +} diff --git a/ui/responsive/app/components/editable-label.js b/ui/responsive/app/components/editable-label.js new file mode 100644 index 000000000..41936f5e0 --- /dev/null +++ b/ui/responsive/app/components/editable-label.js @@ -0,0 +1,51 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const findDOMNode = require('react-dom').findDOMNode + +module.exports = EditableLabel + +inherits(EditableLabel, Component) +function EditableLabel () { + Component.call(this) +} + +EditableLabel.prototype.render = function () { + const props = this.props + const state = this.state + + if (state && state.isEditingLabel) { + return h('div.editable-label', [ + h('input.sizing-input', { + defaultValue: props.textValue, + maxLength: '20', + onKeyPress: (event) => { + this.saveIfEnter(event) + }, + }), + h('button.editable-button', { + onClick: () => this.saveText(), + }, 'Save'), + ]) + } else { + return h('div.name-label', { + onClick: (event) => { + this.setState({ isEditingLabel: true }) + }, + }, this.props.children) + } +} + +EditableLabel.prototype.saveIfEnter = function (event) { + if (event.key === 'Enter') { + this.saveText() + } +} + +EditableLabel.prototype.saveText = function () { + var container = findDOMNode(this) + var text = container.querySelector('.editable-label input').value + var truncatedText = text.substring(0, 20) + this.props.saveText(truncatedText) + this.setState({ isEditingLabel: false, textLabel: truncatedText }) +} diff --git a/ui/responsive/app/components/ens-input.js b/ui/responsive/app/components/ens-input.js new file mode 100644 index 000000000..3a33ebf74 --- /dev/null +++ b/ui/responsive/app/components/ens-input.js @@ -0,0 +1,170 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const extend = require('xtend') +const debounce = require('debounce') +const copyToClipboard = require('copy-to-clipboard') +const ENS = require('ethjs-ens') +const networkMap = require('ethjs-ens/lib/network-map.json') +const ensRE = /.+\.eth$/ +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + + +module.exports = EnsInput + +inherits(EnsInput, Component) +function EnsInput () { + Component.call(this) +} + +EnsInput.prototype.render = function () { + const props = this.props + const opts = extend(props, { + list: 'addresses', + onChange: () => { + const network = this.props.network + const networkHasEnsSupport = getNetworkEnsSupport(network) + if (!networkHasEnsSupport) return + + const recipient = document.querySelector('input[name="address"]').value + if (recipient.match(ensRE) === null) { + return this.setState({ + loadingEns: false, + ensResolution: null, + ensFailure: null, + }) + } + + this.setState({ + loadingEns: true, + }) + this.checkName() + }, + }) + return h('div', { + style: { width: '100%' }, + }, [ + h('input.large-input', opts), + // The address book functionality. + h('datalist#addresses', + [ + // Corresponds to the addresses owned. + Object.keys(props.identities).map((key) => { + const identity = props.identities[key] + return h('option', { + value: identity.address, + label: identity.name, + key: identity.address, + }) + }), + // Corresponds to previously sent-to addresses. + props.addressBook.map((identity) => { + return h('option', { + value: identity.address, + label: identity.name, + key: identity.address, + }) + }), + ]), + this.ensIcon(), + ]) +} + +EnsInput.prototype.componentDidMount = function () { + const network = this.props.network + const networkHasEnsSupport = getNetworkEnsSupport(network) + this.setState({ ensResolution: ZERO_ADDRESS }) + + if (networkHasEnsSupport) { + const provider = global.ethereumProvider + this.ens = new ENS({ provider, network }) + this.checkName = debounce(this.lookupEnsName.bind(this), 200) + } +} + +EnsInput.prototype.lookupEnsName = function () { + const recipient = document.querySelector('input[name="address"]').value + const { ensResolution } = this.state + + log.info(`ENS attempting to resolve name: ${recipient}`) + this.ens.lookup(recipient.trim()) + .then((address) => { + if (address === ZERO_ADDRESS) throw new Error('No address has been set for this name.') + if (address !== ensResolution) { + this.setState({ + loadingEns: false, + ensResolution: address, + nickname: recipient.trim(), + hoverText: address + '\nClick to Copy', + ensFailure: false, + }) + } + }) + .catch((reason) => { + log.error(reason) + return this.setState({ + loadingEns: false, + ensResolution: ZERO_ADDRESS, + ensFailure: true, + hoverText: reason.message, + }) + }) +} + +EnsInput.prototype.componentDidUpdate = function (prevProps, prevState) { + const state = this.state || {} + const ensResolution = state.ensResolution + // If an address is sent without a nickname, meaning not from ENS or from + // the user's own accounts, a default of a one-space string is used. + const nickname = state.nickname || ' ' + if (prevState && ensResolution && this.props.onChange && + ensResolution !== prevState.ensResolution) { + this.props.onChange(ensResolution, nickname) + } +} + +EnsInput.prototype.ensIcon = function (recipient) { + const { hoverText } = this.state || {} + return h('span', { + title: hoverText, + style: { + position: 'absolute', + padding: '9px', + transform: 'translatex(-40px)', + }, + }, this.ensIconContents(recipient)) +} + +EnsInput.prototype.ensIconContents = function (recipient) { + const { loadingEns, ensFailure, ensResolution } = this.state || { ensResolution: ZERO_ADDRESS} + + if (loadingEns) { + return h('img', { + src: 'images/loading.svg', + style: { + width: '30px', + height: '30px', + transform: 'translateY(-6px)', + }, + }) + } + + if (ensFailure) { + return h('i.fa.fa-warning.fa-lg.warning') + } + + if (ensResolution && (ensResolution !== ZERO_ADDRESS)) { + return h('i.fa.fa-check-circle.fa-lg.cursor-pointer', { + style: { color: 'green' }, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + copyToClipboard(ensResolution) + }, + }) + } +} + +function getNetworkEnsSupport (network) { + return Boolean(networkMap[network]) +} diff --git a/ui/responsive/app/components/eth-balance.js b/ui/responsive/app/components/eth-balance.js new file mode 100644 index 000000000..4f538fd31 --- /dev/null +++ b/ui/responsive/app/components/eth-balance.js @@ -0,0 +1,89 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const formatBalance = require('../util').formatBalance +const generateBalanceObject = require('../util').generateBalanceObject +const Tooltip = require('./tooltip.js') +const FiatValue = require('./fiat-value.js') + +module.exports = EthBalanceComponent + +inherits(EthBalanceComponent, Component) +function EthBalanceComponent () { + Component.call(this) +} + +EthBalanceComponent.prototype.render = function () { + var props = this.props + let { value } = props + const { style, width } = props + var needsParse = this.props.needsParse !== undefined ? this.props.needsParse : true + value = value ? formatBalance(value, 6, needsParse) : '...' + + return ( + + h('.ether-balance.ether-balance-amount', { + style, + }, [ + h('div', { + style: { + display: 'inline', + width, + }, + }, this.renderBalance(value)), + ]) + + ) +} +EthBalanceComponent.prototype.renderBalance = function (value) { + var props = this.props + const { conversionRate, shorten, incoming, currentCurrency } = props + if (value === 'None') return value + if (value === '...') return value + var balanceObj = generateBalanceObject(value, shorten ? 1 : 3) + var balance + var splitBalance = value.split(' ') + var ethNumber = splitBalance[0] + var ethSuffix = splitBalance[1] + const showFiat = 'showFiat' in props ? props.showFiat : true + + if (shorten) { + balance = balanceObj.shortBalance + } else { + balance = balanceObj.balance + } + + var label = balanceObj.label + + return ( + h(Tooltip, { + position: 'bottom', + title: `${ethNumber} ${ethSuffix}`, + }, h('div.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('div', { + style: { + width: '100%', + textAlign: 'right', + }, + }, incoming ? `+${balance}` : balance), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + }, + }, label), + ]), + + showFiat ? h(FiatValue, { value: props.value, conversionRate, currentCurrency }) : null, + ])) + ) +} diff --git a/ui/responsive/app/components/fiat-value.js b/ui/responsive/app/components/fiat-value.js new file mode 100644 index 000000000..8a64a1cfc --- /dev/null +++ b/ui/responsive/app/components/fiat-value.js @@ -0,0 +1,63 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const formatBalance = require('../util').formatBalance + +module.exports = FiatValue + +inherits(FiatValue, Component) +function FiatValue () { + Component.call(this) +} + +FiatValue.prototype.render = function () { + const props = this.props + const { conversionRate, currentCurrency } = props + + const value = formatBalance(props.value, 6) + + if (value === 'None') return value + var fiatDisplayNumber, fiatTooltipNumber + var splitBalance = value.split(' ') + + if (conversionRate !== 0) { + fiatTooltipNumber = Number(splitBalance[0]) * conversionRate + fiatDisplayNumber = fiatTooltipNumber.toFixed(2) + } else { + fiatDisplayNumber = 'N/A' + fiatTooltipNumber = 'Unknown' + } + + return fiatDisplay(fiatDisplayNumber, currentCurrency) +} + +function fiatDisplay (fiatDisplayNumber, fiatSuffix) { + if (fiatDisplayNumber !== 'N/A') { + return h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('div', { + style: { + width: '100%', + textAlign: 'right', + fontSize: '12px', + color: '#333333', + }, + }, fiatDisplayNumber), + h('div', { + style: { + color: '#AEAEAE', + marginLeft: '5px', + fontSize: '12px', + }, + }, fiatSuffix), + ]) + } else { + return h('div') + } +} diff --git a/ui/responsive/app/components/hex-as-decimal-input.js b/ui/responsive/app/components/hex-as-decimal-input.js new file mode 100644 index 000000000..4a71e9585 --- /dev/null +++ b/ui/responsive/app/components/hex-as-decimal-input.js @@ -0,0 +1,154 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ethUtil = require('ethereumjs-util') +const BN = ethUtil.BN +const extend = require('xtend') + +module.exports = HexAsDecimalInput + +inherits(HexAsDecimalInput, Component) +function HexAsDecimalInput () { + this.state = { invalid: null } + Component.call(this) +} + +/* Hex as Decimal Input + * + * A component for allowing easy, decimal editing + * of a passed in hex string value. + * + * On change, calls back its `onChange` function parameter + * and passes it an updated hex string. + */ + +HexAsDecimalInput.prototype.render = function () { + const props = this.props + const state = this.state + + const { value, onChange, min, max } = props + + const toEth = props.toEth + const suffix = props.suffix + const decimalValue = decimalize(value, toEth) + const style = props.style + + return ( + h('.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('input.hex-input', { + type: 'number', + required: true, + min: min, + max: max, + style: extend({ + display: 'block', + textAlign: 'right', + backgroundColor: 'transparent', + border: '1px solid #bdbdbd', + + }, style), + value: parseInt(decimalValue), + onBlur: (event) => { + this.updateValidity(event) + }, + onChange: (event) => { + this.updateValidity(event) + const hexString = (event.target.value === '') ? '' : hexify(event.target.value) + onChange(hexString) + }, + onInvalid: (event) => { + const msg = this.constructWarning() + if (msg === state.invalid) { + return + } + this.setState({ invalid: msg }) + event.preventDefault() + return false + }, + }), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + marginRight: '6px', + width: '20px', + }, + }, suffix), + ]), + + state.invalid ? h('span.error', { + style: { + position: 'absolute', + right: '0px', + textAlign: 'right', + transform: 'translateY(26px)', + padding: '3px', + background: 'rgba(255,255,255,0.85)', + zIndex: '1', + textTransform: 'capitalize', + border: '2px solid #E20202', + }, + }, state.invalid) : null, + ]) + ) +} + +HexAsDecimalInput.prototype.setValid = function (message) { + this.setState({ invalid: null }) +} + +HexAsDecimalInput.prototype.updateValidity = function (event) { + const target = event.target + const value = this.props.value + const newValue = target.value + + if (value === newValue) { + return + } + + const valid = target.checkValidity() + if (valid) { + this.setState({ invalid: null }) + } +} + +HexAsDecimalInput.prototype.constructWarning = function () { + const { name, min, max } = this.props + let message = name ? name + ' ' : '' + + if (min && max) { + message += `must be greater than or equal to ${min} and less than or equal to ${max}.` + } else if (min) { + message += `must be greater than or equal to ${min}.` + } else if (max) { + message += `must be less than or equal to ${max}.` + } else { + message += 'Invalid input.' + } + + return message +} + +function hexify (decimalString) { + const hexBN = new BN(parseInt(decimalString), 10) + return '0x' + hexBN.toString('hex') +} + +function decimalize (input, toEth) { + if (input === '') { + return '' + } else { + const strippedInput = ethUtil.stripHexPrefix(input) + const inputBN = new BN(strippedInput, 'hex') + return inputBN.toString(10) + } +} diff --git a/ui/responsive/app/components/identicon.js b/ui/responsive/app/components/identicon.js new file mode 100644 index 000000000..c754bc6ba --- /dev/null +++ b/ui/responsive/app/components/identicon.js @@ -0,0 +1,72 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const isNode = require('detect-node') +const findDOMNode = require('react-dom').findDOMNode +const jazzicon = require('jazzicon') +const iconFactoryGen = require('../../lib/icon-factory') +const iconFactory = iconFactoryGen(jazzicon) + +module.exports = IdenticonComponent + +inherits(IdenticonComponent, Component) +function IdenticonComponent () { + Component.call(this) + + this.defaultDiameter = 46 +} + +IdenticonComponent.prototype.render = function () { + var props = this.props + var diameter = props.diameter || this.defaultDiameter + return ( + h('div', { + key: 'identicon-' + this.props.address, + style: { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + height: diameter, + width: diameter, + borderRadius: diameter / 2, + overflow: 'hidden', + }, + }) + ) +} + +IdenticonComponent.prototype.componentDidMount = function () { + var props = this.props + const { address } = props + + if (!address) return + + var container = findDOMNode(this) + + var diameter = props.diameter || this.defaultDiameter + if (!isNode) { + var img = iconFactory.iconForAddress(address, diameter) + container.appendChild(img) + } +} + +IdenticonComponent.prototype.componentDidUpdate = function () { + var props = this.props + const { address } = props + + if (!address) return + + var container = findDOMNode(this) + + var children = container.children + for (var i = 0; i < children.length; i++) { + container.removeChild(children[i]) + } + + var diameter = props.diameter || this.defaultDiameter + if (!isNode) { + var img = iconFactory.iconForAddress(address, diameter) + container.appendChild(img) + } +} + diff --git a/ui/responsive/app/components/loading.js b/ui/responsive/app/components/loading.js new file mode 100644 index 000000000..87d6f5d20 --- /dev/null +++ b/ui/responsive/app/components/loading.js @@ -0,0 +1,53 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const ReactCSSTransitionGroup = require('react-addons-css-transition-group') + + +inherits(LoadingIndicator, Component) +module.exports = LoadingIndicator + +function LoadingIndicator () { + Component.call(this) +} + +LoadingIndicator.prototype.render = function () { + const { isLoading, loadingMessage } = this.props + + return ( + h(ReactCSSTransitionGroup, { + className: 'css-transition-group', + transitionName: 'loader', + transitionEnterTimeout: 150, + transitionLeaveTimeout: 150, + }, [ + + isLoading ? h('div', { + style: { + zIndex: 10, + position: 'absolute', + flexDirection: 'column', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + height: '100%', + width: '100%', + background: 'rgba(255, 255, 255, 0.8)', + }, + }, [ + h('img', { + src: 'images/loading.svg', + }), + + h('br'), + + showMessageIfAny(loadingMessage), + ]) : null, + ]) + ) +} + +function showMessageIfAny (loadingMessage) { + if (!loadingMessage) return null + return h('span', loadingMessage) +} diff --git a/ui/responsive/app/components/mascot.js b/ui/responsive/app/components/mascot.js new file mode 100644 index 000000000..973ec2cad --- /dev/null +++ b/ui/responsive/app/components/mascot.js @@ -0,0 +1,59 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const metamaskLogo = require('metamask-logo') +const debounce = require('debounce') + +module.exports = Mascot + +inherits(Mascot, Component) +function Mascot () { + Component.call(this) + this.logo = metamaskLogo({ + followMouse: true, + pxNotRatio: true, + width: 200, + height: 200, + }) + + this.refollowMouse = debounce(this.logo.setFollowMouse.bind(this.logo, true), 1000) + this.unfollowMouse = this.logo.setFollowMouse.bind(this.logo, false) +} + +Mascot.prototype.render = function () { + // this is a bit hacky + // the event emitter is on `this.props` + // and we dont get that until render + this.handleAnimationEvents() + + return h('#metamask-mascot-container', { + style: { zIndex: 0 }, + }) +} + +Mascot.prototype.componentDidMount = function () { + var targetDivId = 'metamask-mascot-container' + var container = document.getElementById(targetDivId) + container.appendChild(this.logo.container) +} + +Mascot.prototype.componentWillUnmount = function () { + this.animations = this.props.animationEventEmitter + this.animations.removeAllListeners() + this.logo.container.remove() + this.logo.stopAnimation() +} + +Mascot.prototype.handleAnimationEvents = function () { + // only setup listeners once + if (this.animations) return + this.animations = this.props.animationEventEmitter + this.animations.on('point', this.lookAt.bind(this)) + this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo)) +} + +Mascot.prototype.lookAt = function (target) { + this.unfollowMouse() + this.logo.lookAt(target) + this.refollowMouse() +} diff --git a/ui/responsive/app/components/mini-account-panel.js b/ui/responsive/app/components/mini-account-panel.js new file mode 100644 index 000000000..c09cf5b7a --- /dev/null +++ b/ui/responsive/app/components/mini-account-panel.js @@ -0,0 +1,74 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const Identicon = require('./identicon') + +module.exports = AccountPanel + + +inherits(AccountPanel, Component) +function AccountPanel () { + Component.call(this) +} + +AccountPanel.prototype.render = function () { + var props = this.props + var picOrder = props.picOrder || 'left' + const { imageSeed } = props + + return ( + + h('.identity-panel.flex-row.flex-left', { + style: { + cursor: props.onClick ? 'pointer' : undefined, + }, + onClick: props.onClick, + }, [ + + this.genIcon(imageSeed, picOrder), + + h('div.flex-column.flex-justify-center', { + style: { + lineHeight: '15px', + order: 2, + display: 'flex', + alignItems: picOrder === 'left' ? 'flex-begin' : 'flex-end', + }, + }, this.props.children), + ]) + ) +} + +AccountPanel.prototype.genIcon = function (seed, picOrder) { + const props = this.props + + // When there is no seed value, this is a contract creation. + // We then show the contract icon. + if (!seed) { + return h('.identicon-wrapper.flex-column.select-none', { + style: { + order: picOrder === 'left' ? 1 : 3, + }, + }, [ + h('i.fa.fa-file-text-o.fa-lg', { + style: { + fontSize: '42px', + transform: 'translate(0px, -16px)', + }, + }), + ]) + } + + // If there was a seed, we return an identicon for that address. + return h('.identicon-wrapper.flex-column.select-none', { + style: { + order: picOrder === 'left' ? 1 : 3, + }, + }, [ + h(Identicon, { + address: seed, + imageify: props.imageifyIdenticons, + }), + ]) +} + diff --git a/ui/responsive/app/components/network.js b/ui/responsive/app/components/network.js new file mode 100644 index 000000000..d5d3e18cd --- /dev/null +++ b/ui/responsive/app/components/network.js @@ -0,0 +1,125 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = Network + +inherits(Network, Component) + +function Network () { + Component.call(this) +} + +Network.prototype.render = function () { + const props = this.props + const networkNumber = props.network + let providerName + try { + providerName = props.provider.type + } catch (e) { + providerName = null + } + let iconName, hoverText + + if (networkNumber === 'loading') { + return h('span', { + style: { + display: 'flex', + alignItems: 'center', + flexDirection: 'row', + }, + onClick: (event) => this.props.onClick(event), + }, [ + h('img', { + title: 'Attempting to connect to blockchain.', + style: { + width: '27px', + }, + src: 'images/loading.svg', + }), + h('i.fa.fa-sort-desc'), + ]) + + } else if (providerName === 'mainnet') { + hoverText = 'Main Ethereum Network' + iconName = 'ethereum-network' + } else if (providerName === 'ropsten') { + hoverText = 'Ropsten Test Network' + iconName = 'ropsten-test-network' + } else if (parseInt(networkNumber) === 3) { + hoverText = 'Ropsten Test Network' + iconName = 'ropsten-test-network' + } else if (providerName === 'kovan') { + hoverText = 'Kovan Test Network' + iconName = 'kovan-test-network' + } else if (providerName === 'rinkeby') { + hoverText = 'Rinkeby Test Network' + iconName = 'rinkeby-test-network' + } else { + hoverText = 'Unknown Private Network' + iconName = 'unknown-private-network' + } + + return ( + h('#network_component.pointer', { + title: hoverText, + onClick: (event) => this.props.onClick(event), + }, [ + (function () { + switch (iconName) { + case 'ethereum-network': + return h('.network-indicator', [ + h('.menu-icon.diamond'), + h('.network-name', { + style: { + color: '#039396', + }}, + 'Ethereum Main Net'), + ]) + case 'ropsten-test-network': + return h('.network-indicator', [ + h('.menu-icon.red-dot'), + h('.network-name', { + style: { + color: '#ff6666', + }}, + 'Ropsten Test Net'), + ]) + case 'kovan-test-network': + return h('.network-indicator', [ + h('.menu-icon.hollow-diamond'), + h('.network-name', { + style: { + color: '#690496', + }}, + 'Kovan Test Net'), + ]) + case 'rinkeby-test-network': + return h('.network-indicator', [ + h('.menu-icon.golden-square'), + h('.network-name', { + style: { + color: '#e7a218', + }}, + 'Rinkeby Test Net'), + ]) + default: + return h('.network-indicator', [ + h('i.fa.fa-question-circle.fa-lg', { + style: { + margin: '10px', + color: 'rgb(125, 128, 130)', + }, + }), + + h('.network-name', { + style: { + color: '#AEAEAE', + }}, + 'Private Network'), + ]) + } + })(), + ]) + ) +} diff --git a/ui/responsive/app/components/notice.js b/ui/responsive/app/components/notice.js new file mode 100644 index 000000000..d9f0067cd --- /dev/null +++ b/ui/responsive/app/components/notice.js @@ -0,0 +1,126 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const ReactMarkdown = require('react-markdown') +const linker = require('extension-link-enabler') +const findDOMNode = require('react-dom').findDOMNode + +module.exports = Notice + +inherits(Notice, Component) +function Notice () { + Component.call(this) +} + +Notice.prototype.render = function () { + const { notice, onConfirm } = this.props + const { title, date, body } = notice + const state = this.state || { disclaimerDisabled: true } + const disabled = state.disclaimerDisabled + + return ( + h('.flex-column.flex-center.flex-grow', [ + h('h3.flex-center.text-transform-uppercase.terms-header', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + width: '100%', + fontSize: '20px', + textAlign: 'center', + padding: 6, + }, + }, [ + title, + ]), + + h('h5.flex-center.text-transform-uppercase.terms-header', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginBottom: 24, + width: '100%', + fontSize: '20px', + textAlign: 'center', + padding: 6, + }, + }, [ + date, + ]), + + h('style', ` + + .markdown { + overflow-x: hidden; + } + + .markdown h1, .markdown h2, .markdown h3 { + margin: 10px 0; + font-weight: bold; + } + + .markdown strong { + font-weight: bold; + } + .markdown em { + font-style: italic; + } + + .markdown p { + margin: 10px 0; + } + + .markdown a { + color: #df6b0e; + } + + `), + + h('div.markdown', { + onScroll: (e) => { + var object = e.currentTarget + if (object.offsetHeight + object.scrollTop + 100 >= object.scrollHeight) { + this.setState({disclaimerDisabled: false}) + } + }, + style: { + background: 'rgb(235, 235, 235)', + height: '310px', + padding: '6px', + width: '90%', + overflowY: 'scroll', + scroll: 'auto', + }, + }, [ + h(ReactMarkdown, { + className: 'notice-box', + source: body, + skipHtml: true, + }), + ]), + + h('button', { + disabled, + onClick: () => { + this.setState({disclaimerDisabled: true}) + onConfirm() + }, + style: { + marginTop: '18px', + }, + }, 'Accept'), + ]) + ) +} + +Notice.prototype.componentDidMount = function () { + var node = findDOMNode(this) + linker.setupListener(node) + if (document.getElementsByClassName('notice-box')[0].clientHeight < 310) { + this.setState({disclaimerDisabled: false}) + } +} + +Notice.prototype.componentWillUnmount = function () { + var node = findDOMNode(this) + linker.teardownListener(node) +} diff --git a/ui/responsive/app/components/pending-msg-details.js b/ui/responsive/app/components/pending-msg-details.js new file mode 100644 index 000000000..16308d121 --- /dev/null +++ b/ui/responsive/app/components/pending-msg-details.js @@ -0,0 +1,50 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const AccountPanel = require('./account-panel') + +module.exports = PendingMsgDetails + +inherits(PendingMsgDetails, Component) +function PendingMsgDetails () { + Component.call(this) +} + +PendingMsgDetails.prototype.render = function () { + var state = this.props + var msgData = state.txData + + var msgParams = msgData.msgParams || {} + var address = msgParams.from || state.selectedAddress + var identity = state.identities[address] || { address: address } + var account = state.accounts[address] || { address: address } + + return ( + h('div', { + key: msgData.id, + style: { + margin: '10px 20px', + }, + }, [ + + // account that will sign + h(AccountPanel, { + showFullAddress: true, + identity: identity, + account: account, + imageifyIdenticons: state.imageifyIdenticons, + }), + + // message data + h('.tx-data.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-row.flex-space-between', [ + h('label.font-small', 'MESSAGE'), + h('span.font-small', msgParams.data), + ]), + ]), + + ]) + ) +} + diff --git a/ui/responsive/app/components/pending-msg.js b/ui/responsive/app/components/pending-msg.js new file mode 100644 index 000000000..b2cac164a --- /dev/null +++ b/ui/responsive/app/components/pending-msg.js @@ -0,0 +1,56 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const PendingTxDetails = require('./pending-msg-details') + +module.exports = PendingMsg + +inherits(PendingMsg, Component) +function PendingMsg () { + Component.call(this) +} + +PendingMsg.prototype.render = function () { + var state = this.props + var msgData = state.txData + + return ( + + h('div', { + key: msgData.id, + }, [ + + // header + h('h3', { + style: { + fontWeight: 'bold', + textAlign: 'center', + }, + }, 'Sign Message'), + + h('.error', { + style: { + margin: '10px', + }, + }, `Signing this message can have + dangerous side effects. Only sign messages from + sites you fully trust with your entire account. + This will be fixed in a future version.`), + + // message details + h(PendingTxDetails, state), + + // sign + cancel + h('.flex-row.flex-space-around', [ + h('button', { + onClick: state.cancelMessage, + }, 'Cancel'), + h('button', { + onClick: state.signMessage, + }, 'Sign'), + ]), + ]) + + ) +} + diff --git a/ui/responsive/app/components/pending-personal-msg-details.js b/ui/responsive/app/components/pending-personal-msg-details.js new file mode 100644 index 000000000..1050513f2 --- /dev/null +++ b/ui/responsive/app/components/pending-personal-msg-details.js @@ -0,0 +1,60 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const AccountPanel = require('./account-panel') +const BinaryRenderer = require('./binary-renderer') + +module.exports = PendingMsgDetails + +inherits(PendingMsgDetails, Component) +function PendingMsgDetails () { + Component.call(this) +} + +PendingMsgDetails.prototype.render = function () { + var state = this.props + var msgData = state.txData + + var msgParams = msgData.msgParams || {} + var address = msgParams.from || state.selectedAddress + var identity = state.identities[address] || { address: address } + var account = state.accounts[address] || { address: address } + + var { data } = msgParams + + return ( + h('div', { + key: msgData.id, + style: { + margin: '10px 20px', + }, + }, [ + + // account that will sign + h(AccountPanel, { + showFullAddress: true, + identity: identity, + account: account, + imageifyIdenticons: state.imageifyIdenticons, + }), + + // message data + h('div', { + style: { + height: '260px', + }, + }, [ + h('label.font-small', { style: { display: 'block' } }, 'MESSAGE'), + h(BinaryRenderer, { + value: data, + style: { + height: '215px', + }, + }), + ]), + + ]) + ) +} + diff --git a/ui/responsive/app/components/pending-personal-msg.js b/ui/responsive/app/components/pending-personal-msg.js new file mode 100644 index 000000000..4542adb28 --- /dev/null +++ b/ui/responsive/app/components/pending-personal-msg.js @@ -0,0 +1,47 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const PendingTxDetails = require('./pending-personal-msg-details') + +module.exports = PendingMsg + +inherits(PendingMsg, Component) +function PendingMsg () { + Component.call(this) +} + +PendingMsg.prototype.render = function () { + var state = this.props + var msgData = state.txData + + return ( + + h('div', { + key: msgData.id, + }, [ + + // header + h('h3', { + style: { + fontWeight: 'bold', + textAlign: 'center', + }, + }, 'Sign Message'), + + // message details + h(PendingTxDetails, state), + + // sign + cancel + h('.flex-row.flex-space-around', [ + h('button', { + onClick: state.cancelPersonalMessage, + }, 'Cancel'), + h('button', { + onClick: state.signPersonalMessage, + }, 'Sign'), + ]), + ]) + + ) +} + diff --git a/ui/responsive/app/components/pending-tx.js b/ui/responsive/app/components/pending-tx.js new file mode 100644 index 000000000..962680d30 --- /dev/null +++ b/ui/responsive/app/components/pending-tx.js @@ -0,0 +1,480 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const actions = require('../actions') +const clone = require('clone') + +const ethUtil = require('ethereumjs-util') +const BN = ethUtil.BN +const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') +const util = require('../util') +const MiniAccountPanel = require('./mini-account-panel') +const Copyable = require('./copyable') +const EthBalance = require('./eth-balance') +const addressSummary = util.addressSummary +const nameForAddress = require('../../lib/contract-namer') +const BNInput = require('./bn-as-decimal-input') + +const MIN_GAS_PRICE_GWEI_BN = new BN(2) +const GWEI_FACTOR = new BN(1e9) +const MIN_GAS_PRICE_BN = MIN_GAS_PRICE_GWEI_BN.mul(GWEI_FACTOR) +const MIN_GAS_LIMIT_BN = new BN(21000) + +module.exports = PendingTx +inherits(PendingTx, Component) +function PendingTx () { + Component.call(this) + this.state = { + valid: true, + txData: null, + submitting: false, + } +} + +PendingTx.prototype.render = function () { + const props = this.props + const { currentCurrency, blockGasLimit } = props + + const conversionRate = props.conversionRate + const txMeta = this.gatherTxMeta() + const txParams = txMeta.txParams || {} + + // Account Details + const address = txParams.from || props.selectedAddress + const identity = props.identities[address] || { address: address } + const account = props.accounts[address] + const balance = account ? account.balance : '0x0' + + // recipient check + const isValidAddress = !txParams.to || util.isValidAddress(txParams.to) + + // Gas + const gas = txParams.gas + const gasBn = hexToBn(gas) + const gasLimit = new BN(parseInt(blockGasLimit)) + const safeGasLimit = this.bnMultiplyByFraction(gasLimit, 19, 20).toString(10) + + // Gas Price + const gasPrice = txParams.gasPrice || MIN_GAS_PRICE_BN.toString(16) + const gasPriceBn = hexToBn(gasPrice) + + const txFeeBn = gasBn.mul(gasPriceBn) + const valueBn = hexToBn(txParams.value) + const maxCost = txFeeBn.add(valueBn) + + const dataLength = txParams.data ? (txParams.data.length - 2) / 2 : 0 + + const balanceBn = hexToBn(balance) + const insufficientBalance = balanceBn.lt(maxCost) + + this.inputs = [] + + return ( + + h('div', { + key: txMeta.id, + }, [ + + h('form#pending-tx-form', { + onSubmit: this.onSubmit.bind(this), + + }, [ + + // tx info + h('div', [ + + h('.flex-row.flex-center', { + style: { + maxWidth: '100%', + }, + }, [ + + h(MiniAccountPanel, { + imageSeed: address, + picOrder: 'right', + }, [ + h('span.font-small', { + style: { + fontFamily: 'Montserrat Bold, Montserrat, sans-serif', + }, + }, identity.name), + + h(Copyable, { + value: ethUtil.toChecksumAddress(address), + }, [ + h('span.font-small', { + style: { + fontFamily: 'Montserrat Light, Montserrat, sans-serif', + }, + }, addressSummary(address, 6, 4, false)), + ]), + + h('span.font-small', { + style: { + fontFamily: 'Montserrat Light, Montserrat, sans-serif', + }, + }, [ + h(EthBalance, { + value: balance, + conversionRate, + currentCurrency, + inline: true, + labelColor: '#F7861C', + }), + ]), + ]), + + forwardCarrat(), + + this.miniAccountPanelForRecipient(), + ]), + + h('style', ` + .table-box { + margin: 7px 0px 0px 0px; + width: 100%; + } + .table-box .row { + margin: 0px; + background: rgb(236,236,236); + display: flex; + justify-content: space-between; + font-family: Montserrat Light, sans-serif; + font-size: 13px; + padding: 5px 25px; + } + .table-box .row .value { + font-family: Montserrat Regular; + } + `), + + h('.table-box', [ + + // Ether Value + // Currently not customizable, but easily modified + // in the way that gas and gasLimit currently are. + h('.row', [ + h('.cell.label', 'Amount'), + h(EthBalance, { value: txParams.value, currentCurrency, conversionRate }), + ]), + + // Gas Limit (customizable) + h('.cell.row', [ + h('.cell.label', 'Gas Limit'), + h('.cell.value', { + }, [ + h(BNInput, { + name: 'Gas Limit', + value: gasBn, + precision: 0, + scale: 0, + // The hard lower limit for gas. + min: MIN_GAS_LIMIT_BN.toString(10), + max: safeGasLimit, + suffix: 'UNITS', + style: { + position: 'relative', + top: '5px', + }, + onChange: this.gasLimitChanged.bind(this), + + ref: (hexInput) => { this.inputs.push(hexInput) }, + }), + ]), + ]), + + // Gas Price (customizable) + h('.cell.row', [ + h('.cell.label', 'Gas Price'), + h('.cell.value', { + }, [ + h(BNInput, { + name: 'Gas Price', + value: gasPriceBn, + precision: 9, + scale: 9, + suffix: 'GWEI', + min: MIN_GAS_PRICE_GWEI_BN.toString(10), + style: { + position: 'relative', + top: '5px', + }, + onChange: this.gasPriceChanged.bind(this), + ref: (hexInput) => { this.inputs.push(hexInput) }, + }), + ]), + ]), + + // Max Transaction Fee (calculated) + h('.cell.row', [ + h('.cell.label', 'Max Transaction Fee'), + h(EthBalance, { value: txFeeBn.toString(16), currentCurrency, conversionRate }), + ]), + + h('.cell.row', { + style: { + fontFamily: 'Montserrat Regular', + background: 'white', + padding: '10px 25px', + }, + }, [ + h('.cell.label', 'Max Total'), + h('.cell.value', { + style: { + display: 'flex', + alignItems: 'center', + }, + }, [ + h(EthBalance, { + value: maxCost.toString(16), + currentCurrency, + conversionRate, + inline: true, + labelColor: 'black', + fontSize: '16px', + }), + ]), + ]), + + // Data size row: + h('.cell.row', { + style: { + background: '#f7f7f7', + paddingBottom: '0px', + }, + }, [ + h('.cell.label'), + h('.cell.value', { + style: { + fontFamily: 'Montserrat Light', + fontSize: '11px', + }, + }, `Data included: ${dataLength} bytes`), + ]), + ]), // End of Table + + ]), + + h('style', ` + .conf-buttons button { + margin-left: 10px; + text-transform: uppercase; + } + `), + + txMeta.simulationFails ? + h('.error', { + style: { + marginLeft: 50, + fontSize: '0.9em', + }, + }, 'Transaction Error. Exception thrown in contract code.') + : null, + + !isValidAddress ? + h('.error', { + style: { + marginLeft: 50, + fontSize: '0.9em', + }, + }, 'Recipient address is invalid. Sending this transaction will result in a loss of ETH.') + : null, + + insufficientBalance ? + h('span.error', { + style: { + marginLeft: 50, + fontSize: '0.9em', + }, + }, 'Insufficient balance for transaction') + : null, + + // send + cancel + h('.flex-row.flex-space-around.conf-buttons', { + style: { + display: 'flex', + justifyContent: 'flex-end', + margin: '14px 25px', + }, + }, [ + + + insufficientBalance ? + h('button.btn-green', { + onClick: props.buyEth, + }, 'Buy Ether') + : null, + + h('button', { + onClick: (event) => { + this.resetGasFields() + event.preventDefault() + }, + }, 'Reset'), + + // Accept Button + h('input.confirm.btn-green', { + type: 'submit', + value: 'SUBMIT', + style: { marginLeft: '10px' }, + disabled: insufficientBalance || !this.state.valid || !isValidAddress || this.state.submitting, + }), + + h('button.cancel.btn-red', { + onClick: props.cancelTransaction, + }, 'Reject'), + ]), + ]), + ]) + ) +} + +PendingTx.prototype.miniAccountPanelForRecipient = function () { + const props = this.props + const txData = props.txData + const txParams = txData.txParams || {} + const isContractDeploy = !('to' in txParams) + + // If it's not a contract deploy, send to the account + if (!isContractDeploy) { + return h(MiniAccountPanel, { + imageSeed: txParams.to, + picOrder: 'left', + }, [ + + h('span.font-small', { + style: { + fontFamily: 'Montserrat Bold, Montserrat, sans-serif', + }, + }, nameForAddress(txParams.to, props.identities)), + + h(Copyable, { + value: ethUtil.toChecksumAddress(txParams.to), + }, [ + h('span.font-small', { + style: { + fontFamily: 'Montserrat Light, Montserrat, sans-serif', + }, + }, addressSummary(txParams.to, 6, 4, false)), + ]), + + ]) + } else { + return h(MiniAccountPanel, { + picOrder: 'left', + }, [ + + h('span.font-small', { + style: { + fontFamily: 'Montserrat Bold, Montserrat, sans-serif', + }, + }, 'New Contract'), + + ]) + } +} + +PendingTx.prototype.gasPriceChanged = function (newBN, valid) { + log.info(`Gas price changed to: ${newBN.toString(10)}`) + const txMeta = this.gatherTxMeta() + txMeta.txParams.gasPrice = '0x' + newBN.toString('hex') + this.setState({ + txData: clone(txMeta), + valid, + }) +} + +PendingTx.prototype.gasLimitChanged = function (newBN, valid) { + log.info(`Gas limit changed to ${newBN.toString(10)}`) + const txMeta = this.gatherTxMeta() + txMeta.txParams.gas = '0x' + newBN.toString('hex') + this.setState({ + txData: clone(txMeta), + valid, + }) +} + +PendingTx.prototype.resetGasFields = function () { + log.debug(`pending-tx resetGasFields`) + + this.inputs.forEach((hexInput) => { + if (hexInput) { + hexInput.setValid() + } + }) + + this.setState({ + txData: null, + valid: true, + }) +} + +PendingTx.prototype.onSubmit = function (event) { + event.preventDefault() + const txMeta = this.gatherTxMeta() + const valid = this.checkValidity() + this.setState({ valid, submitting: true }) + if (valid && this.verifyGasParams()) { + this.props.sendTransaction(txMeta, event) + } else { + this.props.dispatch(actions.displayWarning('Invalid Gas Parameters')) + this.setState({ submitting: false }) + } +} + +PendingTx.prototype.checkValidity = function () { + const form = this.getFormEl() + const valid = form.checkValidity() + return valid +} + +PendingTx.prototype.getFormEl = function () { + const form = document.querySelector('form#pending-tx-form') + // Stub out form for unit tests: + if (!form) { + return { checkValidity () { return true } } + } + return form +} + +// After a customizable state value has been updated, +PendingTx.prototype.gatherTxMeta = function () { + log.debug(`pending-tx gatherTxMeta`) + const props = this.props + const state = this.state + const txData = clone(state.txData) || clone(props.txData) + + log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) + return txData +} + +PendingTx.prototype.verifyGasParams = function () { + // We call this in case the gas has not been modified at all + if (!this.state) { return true } + return ( + this._notZeroOrEmptyString(this.state.gas) && + this._notZeroOrEmptyString(this.state.gasPrice) + ) +} + +PendingTx.prototype._notZeroOrEmptyString = function (obj) { + return obj !== '' && obj !== '0x0' +} + +PendingTx.prototype.bnMultiplyByFraction = function (targetBN, numerator, denominator) { + const numBN = new BN(numerator) + const denomBN = new BN(denominator) + return targetBN.mul(numBN).div(denomBN) +} + +function forwardCarrat () { + return ( + h('img', { + src: 'images/forward-carrat.svg', + style: { + padding: '5px 6px 0px 10px', + height: '37px', + }, + }) + ) +} diff --git a/ui/responsive/app/components/qr-code.js b/ui/responsive/app/components/qr-code.js new file mode 100644 index 000000000..06b9aed9b --- /dev/null +++ b/ui/responsive/app/components/qr-code.js @@ -0,0 +1,79 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const qrCode = require('qrcode-npm').qrcode +const inherits = require('util').inherits +const connect = require('react-redux').connect +const isHexPrefixed = require('ethereumjs-util').isHexPrefixed +const CopyButton = require('./copyButton') + +module.exports = connect(mapStateToProps)(QrCodeView) + +function mapStateToProps (state) { + return { + Qr: state.appState.Qr, + buyView: state.appState.buyView, + warning: state.appState.warning, + } +} + +inherits(QrCodeView, Component) + +function QrCodeView () { + Component.call(this) +} + +QrCodeView.prototype.render = function () { + const props = this.props + const Qr = props.Qr + const address = `${isHexPrefixed(Qr.data) ? 'ethereum:' : ''}${Qr.data}` + const qrImage = qrCode(4, 'M') + qrImage.addData(address) + qrImage.make() + return h('.main-container.flex-column', { + key: 'qr', + style: { + justifyContent: 'center', + paddingBottom: '45px', + paddingLeft: '45px', + paddingRight: '45px', + alignItems: 'center', + }, + }, [ + Array.isArray(Qr.message) ? h('.message-container', this.renderMultiMessage()) : h('.qr-header', Qr.message), + + this.props.warning ? this.props.warning && h('span.error.flex-center', { + style: { + textAlign: 'center', + width: '229px', + height: '82px', + }, + }, + this.props.warning) : null, + + h('#qr-container.flex-column', { + style: { + marginTop: '25px', + marginBottom: '15px', + }, + dangerouslySetInnerHTML: { + __html: qrImage.createTableTag(4), + }, + }), + h('.flex-row', [ + h('h3.ellip-address', { + style: { + width: '247px', + }, + }, Qr.data), + h(CopyButton, { + value: Qr.data, + }), + ]), + ]) +} + +QrCodeView.prototype.renderMultiMessage = function () { + var Qr = this.props.Qr + var multiMessage = Qr.message.map((message) => h('.qr-message', message)) + return multiMessage +} diff --git a/ui/responsive/app/components/range-slider.js b/ui/responsive/app/components/range-slider.js new file mode 100644 index 000000000..823f5eb01 --- /dev/null +++ b/ui/responsive/app/components/range-slider.js @@ -0,0 +1,58 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = RangeSlider + +inherits(RangeSlider, Component) +function RangeSlider () { + Component.call(this) +} + +RangeSlider.prototype.render = function () { + const state = this.state || {} + const props = this.props + const onInput = props.onInput || function () {} + const name = props.name + const { + min = 0, + max = 100, + increment = 1, + defaultValue = 50, + mirrorInput = false, + } = this.props.options + const {container, input, range} = props.style + + return ( + h('.flex-row', { + style: container, + }, [ + h('input', { + type: 'range', + name: name, + min: min, + max: max, + step: increment, + style: range, + value: state.value || defaultValue, + onChange: mirrorInput ? this.mirrorInputs.bind(this, event) : onInput, + }), + + // Mirrored input for range + mirrorInput ? h('input.large-input', { + type: 'number', + name: `${name}Mirror`, + min: min, + max: max, + value: state.value || defaultValue, + step: increment, + style: input, + onChange: this.mirrorInputs.bind(this, event), + }) : null, + ]) + ) +} + +RangeSlider.prototype.mirrorInputs = function (event) { + this.setState({value: event.target.value}) +} diff --git a/ui/responsive/app/components/shapeshift-form.js b/ui/responsive/app/components/shapeshift-form.js new file mode 100644 index 000000000..e0a720426 --- /dev/null +++ b/ui/responsive/app/components/shapeshift-form.js @@ -0,0 +1,306 @@ +const PersistentForm = require('../../lib/persistent-form') +const h = require('react-hyperscript') +const inherits = require('util').inherits +const connect = require('react-redux').connect +const ReactCSSTransitionGroup = require('react-addons-css-transition-group') +const actions = require('../actions') +const Qr = require('./qr-code') +const isValidAddress = require('../util').isValidAddress +module.exports = connect(mapStateToProps)(ShapeshiftForm) + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + isSubLoading: state.appState.isSubLoading, + qrRequested: state.appState.qrRequested, + } +} + +inherits(ShapeshiftForm, PersistentForm) + +function ShapeshiftForm () { + PersistentForm.call(this) + this.persistentFormParentId = 'shapeshift-buy-form' +} + +ShapeshiftForm.prototype.render = function () { + return h(ReactCSSTransitionGroup, { + className: 'css-transition-group', + transitionName: 'main', + transitionEnterTimeout: 300, + transitionLeaveTimeout: 300, + }, [ + this.props.qrRequested ? h(Qr, {key: 'qr'}) : this.renderMain(), + ]) +} + +ShapeshiftForm.prototype.renderMain = function () { + const marketinfo = this.props.buyView.formView.marketinfo + const coinOptions = this.props.buyView.formView.coinOptions + var coin = marketinfo.pair.split('_')[0].toUpperCase() + + return h('.flex-column', { + style: { + // marginTop: '10px', + padding: '25px', + paddingTop: '5px', + width: '100%', + minHeight: '215px', + alignItems: 'center', + overflowY: 'auto', + }, + }, [ + h('.flex-row', { + style: { + justifyContent: 'center', + alignItems: 'baseline', + height: '42px', + }, + }, [ + h('img', { + src: coinOptions[coin].image, + width: '25px', + height: '25px', + style: { + marginRight: '5px', + }, + }), + + h('.input-container', [ + h('input#fromCoin.buy-inputs.ex-coins', { + type: 'text', + list: 'coinList', + autoFocus: true, + dataset: { + persistentFormId: 'input-coin', + }, + style: { + boxSizing: 'border-box', + }, + onChange: this.handleLiveInput.bind(this), + defaultValue: 'BTC', + }), + + this.renderCoinList(), + + h('i.fa.fa-pencil-square-o.edit-text', { + style: { + fontSize: '12px', + color: '#F7861C', + position: 'relative', + bottom: '48px', + left: '106px', + }, + }), + ]), + + h('.icon-control', [ + h('i.fa.fa-refresh.fa-4.orange', { + style: { + bottom: '5px', + left: '5px', + color: '#F7861C', + }, + onClick: this.updateCoin.bind(this), + }), + h('i.fa.fa-chevron-right.fa-4.orange', { + style: { + position: 'relative', + bottom: '26px', + left: '10px', + color: '#F7861C', + }, + onClick: this.updateCoin.bind(this), + }), + ]), + + h('#toCoin.ex-coins', marketinfo.pair.split('_')[1].toUpperCase()), + + h('img', { + src: coinOptions[marketinfo.pair.split('_')[1].toUpperCase()].image, + width: '25px', + height: '25px', + style: { + marginLeft: '5px', + }, + }), + ]), + h('.flex-column', { + style: { + alignItems: 'flex-start', + }, + }, [ + this.props.warning ? this.props.warning && h('span.error.flex-center', { + style: { + textAlign: 'center', + width: '229px', + height: '82px', + }, + }, + this.props.warning) : this.renderInfo(), + ]), + + h(this.activeToggle('.input-container'), { + style: { + padding: '10px', + paddingTop: '0px', + width: '100%', + }, + }, [ + + h('div', `${coin} Address:`), + + h('input#fromCoinAddress.buy-inputs', { + type: 'text', + placeholder: `Your ${coin} Refund Address`, + dataset: { + persistentFormId: 'refund-address', + }, + style: { + boxSizing: 'border-box', + width: '227px', + height: '30px', + padding: ' 5px ', + }, + }), + + h('i.fa.fa-pencil-square-o.edit-text', { + style: { + fontSize: '12px', + color: '#F7861C', + position: 'relative', + bottom: '10px', + right: '11px', + }, + }), + h('.flex-row', { + style: { + justifyContent: 'flex-end', + }, + }, [ + h('button', { + onClick: this.shift.bind(this), + style: { + marginTop: '10px', + position: 'relative', + bottom: '40px', + }, + }, + 'Submit'), + ]), + ]), + ]) +} + +ShapeshiftForm.prototype.shift = function () { + var props = this.props + var withdrawal = this.props.buyView.buyAddress + var returnAddress = document.getElementById('fromCoinAddress').value + var pair = this.props.buyView.formView.marketinfo.pair + var data = { + 'withdrawal': withdrawal, + 'pair': pair, + 'returnAddress': returnAddress, + // Public api key + 'apiKey': '803d1f5df2ed1b1476e4b9e6bcd089e34d8874595dda6a23b67d93c56ea9cc2445e98a6748b219b2b6ad654d9f075f1f1db139abfa93158c04e825db122c14b6', + } + var message = [ + `Deposit Limit: ${props.buyView.formView.marketinfo.limit}`, + `Deposit Minimum:${props.buyView.formView.marketinfo.minimum}`, + ] + if (isValidAddress(withdrawal)) { + this.props.dispatch(actions.coinShiftRquest(data, message)) + } +} + +ShapeshiftForm.prototype.renderCoinList = function () { + var list = Object.keys(this.props.buyView.formView.coinOptions).map((item) => { + return h('option', { + value: item, + }, item) + }) + + return h('datalist#coinList', { + onClick: (event) => { + event.preventDefault() + }, + }, list) +} + +ShapeshiftForm.prototype.updateCoin = function (event) { + event.preventDefault() + const props = this.props + var coinOptions = this.props.buyView.formView.coinOptions + var coin = document.getElementById('fromCoin').value + + if (!coinOptions[coin.toUpperCase()] || coin.toUpperCase() === 'ETH') { + var message = 'Not a valid coin' + return props.dispatch(actions.displayWarning(message)) + } else { + return props.dispatch(actions.pairUpdate(coin)) + } +} + +ShapeshiftForm.prototype.handleLiveInput = function () { + const props = this.props + var coinOptions = this.props.buyView.formView.coinOptions + var coin = document.getElementById('fromCoin').value + + if (!coinOptions[coin.toUpperCase()] || coin.toUpperCase() === 'ETH') { + return null + } else { + return props.dispatch(actions.pairUpdate(coin)) + } +} + +ShapeshiftForm.prototype.renderInfo = function () { + const marketinfo = this.props.buyView.formView.marketinfo + const coinOptions = this.props.buyView.formView.coinOptions + var coin = marketinfo.pair.split('_')[0].toUpperCase() + + return h('span', { + style: { + }, + }, [ + h('h3.flex-row.text-transform-uppercase', { + style: { + color: '#868686', + paddingTop: '4px', + justifyContent: 'space-around', + textAlign: 'center', + fontSize: '17px', + }, + }, `Market Info for ${marketinfo.pair.replace('_', ' to ').toUpperCase()}:`), + h('.marketinfo', ['Status : ', `${coinOptions[coin].status}`]), + h('.marketinfo', ['Exchange Rate: ', `${marketinfo.rate}`]), + h('.marketinfo', ['Limit: ', `${marketinfo.limit}`]), + h('.marketinfo', ['Minimum : ', `${marketinfo.minimum}`]), + ]) +} + +ShapeshiftForm.prototype.activeToggle = function (elementType) { + if (!this.props.buyView.formView.response || this.props.warning) return elementType + return `${elementType}.inactive` +} + +ShapeshiftForm.prototype.renderLoading = function () { + return h('span', { + style: { + position: 'absolute', + left: '70px', + bottom: '194px', + background: 'transparent', + width: '229px', + height: '82px', + display: 'flex', + justifyContent: 'center', + }, + }, [ + h('img', { + style: { + width: '60px', + }, + src: 'images/loading.svg', + }), + ]) +} diff --git a/ui/responsive/app/components/shift-list-item.js b/ui/responsive/app/components/shift-list-item.js new file mode 100644 index 000000000..32bfbeda4 --- /dev/null +++ b/ui/responsive/app/components/shift-list-item.js @@ -0,0 +1,204 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const vreme = new (require('vreme')) +const explorerLink = require('../../lib/explorer-link') +const actions = require('../actions') +const addressSummary = require('../util').addressSummary + +const CopyButton = require('./copyButton') +const EthBalance = require('./eth-balance') +const Tooltip = require('./tooltip') + + +module.exports = connect(mapStateToProps)(ShiftListItem) + +function mapStateToProps (state) { + return { + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + } +} + +inherits(ShiftListItem, Component) + +function ShiftListItem () { + Component.call(this) +} + +ShiftListItem.prototype.render = function () { + return ( + h('.transaction-list-item.flex-row', { + style: { + paddingTop: '20px', + paddingBottom: '20px', + justifyContent: 'space-around', + alignItems: 'center', + }, + }, [ + h('div', { + style: { + width: '0px', + position: 'relative', + bottom: '19px', + }, + }, [ + h('img', { + src: 'https://info.shapeshift.io/sites/default/files/logo.png', + style: { + height: '35px', + width: '132px', + position: 'absolute', + clip: 'rect(0px,23px,34px,0px)', + }, + }), + ]), + + this.renderInfo(), + this.renderUtilComponents(), + ]) + ) +} + +function formatDate (date) { + return vreme.format(new Date(date), 'March 16 2014 14:30') +} + +ShiftListItem.prototype.renderUtilComponents = function () { + var props = this.props + const { conversionRate, currentCurrency } = props + + switch (props.response.status) { + case 'no_deposits': + return h('.flex-row', [ + h(CopyButton, { + value: this.props.depositAddress, + }), + h(Tooltip, { + title: 'QR Code', + }, [ + h('i.fa.fa-qrcode.pointer.pop-hover', { + onClick: () => props.dispatch(actions.reshowQrCode(props.depositAddress, props.depositType)), + style: { + margin: '5px', + marginLeft: '23px', + marginRight: '12px', + fontSize: '20px', + color: '#F7861C', + }, + }), + ]), + ]) + case 'received': + return h('.flex-row') + + case 'complete': + return h('.flex-row', [ + h(CopyButton, { + value: this.props.response.transaction, + }), + h(EthBalance, { + value: `${props.response.outgoingCoin}`, + conversionRate, + currentCurrency, + width: '55px', + shorten: true, + needsParse: false, + incoming: true, + style: { + fontSize: '15px', + color: '#01888C', + }, + }), + ]) + + case 'failed': + return '' + default: + return '' + } +} + +ShiftListItem.prototype.renderInfo = function () { + var props = this.props + switch (props.response.status) { + case 'no_deposits': + return h('.flex-column', { + style: { + width: '200px', + overflow: 'hidden', + }, + }, [ + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, `${props.depositType} to ETH via ShapeShift`), + h('div', 'No deposits received'), + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, formatDate(props.time)), + ]) + case 'received': + return h('.flex-column', { + style: { + width: '200px', + overflow: 'hidden', + }, + }, [ + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, `${props.depositType} to ETH via ShapeShift`), + h('div', 'Conversion in progress'), + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, formatDate(props.time)), + ]) + case 'complete': + var url = explorerLink(props.response.transaction, parseInt('1')) + + return h('.flex-column.pointer', { + style: { + width: '200px', + overflow: 'hidden', + }, + onClick: () => global.platform.openWindow({ url }), + }, [ + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, 'From ShapeShift'), + h('div', formatDate(props.time)), + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, addressSummary(props.response.transaction)), + ]) + + case 'failed': + return h('span.error', '(Failed)') + default: + return '' + } +} diff --git a/ui/responsive/app/components/tab-bar.js b/ui/responsive/app/components/tab-bar.js new file mode 100644 index 000000000..6295e7dd9 --- /dev/null +++ b/ui/responsive/app/components/tab-bar.js @@ -0,0 +1,36 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = TabBar + +inherits(TabBar, Component) +function TabBar () { + Component.call(this) +} + +TabBar.prototype.render = function () { + const props = this.props + const state = this.state || {} + const { tabs = [], defaultTab, tabSelected } = props + const { subview = defaultTab } = state + + return ( + h('.flex-row.space-around.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + paddingTop: '4px', + }, + }, tabs.map((tab) => { + const { key, content } = tab + return h(subview === key ? '.activeForm' : '.inactiveForm.pointer', { + onClick: () => { + this.setState({ subview: key }) + tabSelected(key) + }, + }, content) + })) + ) +} + diff --git a/ui/responsive/app/components/template.js b/ui/responsive/app/components/template.js new file mode 100644 index 000000000..b6ed8eaa0 --- /dev/null +++ b/ui/responsive/app/components/template.js @@ -0,0 +1,18 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = NewComponent + +inherits(NewComponent, Component) +function NewComponent () { + Component.call(this) +} + +NewComponent.prototype.render = function () { + const props = this.props + + return ( + h('span', props.message) + ) +} diff --git a/ui/responsive/app/components/token-cell.js b/ui/responsive/app/components/token-cell.js new file mode 100644 index 000000000..19d7139bb --- /dev/null +++ b/ui/responsive/app/components/token-cell.js @@ -0,0 +1,72 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const Identicon = require('./identicon') +const prefixForNetwork = require('../../lib/etherscan-prefix-for-network') + +module.exports = TokenCell + +inherits(TokenCell, Component) +function TokenCell () { + Component.call(this) +} + +TokenCell.prototype.render = function () { + const props = this.props + const { address, symbol, string, network, userAddress } = props + + return ( + h('li.token-cell', { + style: { cursor: network === '1' ? 'pointer' : 'default' }, + onClick: this.view.bind(this, address, userAddress, network), + }, [ + + h(Identicon, { + diameter: 50, + address, + network, + }), + + h('h3', `${string || 0} ${symbol}`), + + h('span', { style: { flex: '1 0 auto' } }), + + /* + h('button', { + onClick: this.send.bind(this, address), + }, 'SEND'), + */ + + ]) + ) +} + +TokenCell.prototype.send = function (address, event) { + event.preventDefault() + event.stopPropagation() + const url = tokenFactoryFor(address) + if (url) { + navigateTo(url) + } +} + +TokenCell.prototype.view = function (address, userAddress, network, event) { + const url = etherscanLinkFor(address, userAddress, network) + if (url) { + navigateTo(url) + } +} + +function navigateTo (url) { + global.platform.openWindow({ url }) +} + +function etherscanLinkFor (tokenAddress, address, network) { + const prefix = prefixForNetwork(network) + return `https://${prefix}etherscan.io/token/${tokenAddress}?a=${address}` +} + +function tokenFactoryFor (tokenAddress) { + return `https://tokenfactory.surge.sh/#/token/${tokenAddress}` +} + diff --git a/ui/responsive/app/components/token-list.js b/ui/responsive/app/components/token-list.js new file mode 100644 index 000000000..fed7e9f7a --- /dev/null +++ b/ui/responsive/app/components/token-list.js @@ -0,0 +1,194 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const TokenTracker = require('eth-token-tracker') +const TokenCell = require('./token-cell.js') +const normalizeAddress = require('eth-sig-util').normalize + +const defaultTokens = [] +/* +const contracts = require('eth-contract-metadata') +for (const address in contracts) { + const contract = contracts[address] + if (contract.erc20) { + contract.address = address + defaultTokens.push(contract) + } +} +*/ + +module.exports = TokenList + +inherits(TokenList, Component) +function TokenList () { + this.state = { + tokens: [], + isLoading: true, + network: null, + } + Component.call(this) +} + +TokenList.prototype.render = function () { + const state = this.state + const { tokens, isLoading, error } = state + const { userAddress, network } = this.props + + if (isLoading) { + return this.message('Loading') + } + + if (error) { + log.error(error) + return this.message('There was a problem loading your token balances.') + } + + const tokenViews = tokens.map((tokenData) => { + tokenData.network = network + tokenData.userAddress = userAddress + return h(TokenCell, tokenData) + }) + + return h('div', [ + h('ol', { + style: { + height: '260px', + overflowY: 'auto', + display: 'flex', + flexDirection: 'column', + }, + }, [ + h('style', ` + + li.token-cell { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px; + } + + li.token-cell > h3 { + margin-left: 12px; + } + + li.token-cell:hover { + background: white; + cursor: pointer; + } + + `), + ...tokenViews, + tokenViews.length ? null : this.message('No Tokens Found.'), + ]), + this.addTokenButtonElement(), + ]) +} + +TokenList.prototype.addTokenButtonElement = function () { + return h('div', [ + h('div.footer.hover-white.pointer', { + key: 'reveal-account-bar', + onClick: () => { + this.props.addToken() + }, + style: { + display: 'flex', + height: '40px', + padding: '10px', + justifyContent: 'center', + alignItems: 'center', + }, + }, [ + h('i.fa.fa-plus.fa-lg'), + ]), + ]) +} + +TokenList.prototype.message = function (body) { + return h('div', { + style: { + display: 'flex', + height: '250px', + alignItems: 'center', + justifyContent: 'center', + padding: '30px', + }, + }, body) +} + +TokenList.prototype.componentDidMount = function () { + this.createFreshTokenTracker() +} + +TokenList.prototype.createFreshTokenTracker = function () { + if (this.tracker) { + // Clean up old trackers when refreshing: + this.tracker.stop() + this.tracker.removeListener('update', this.balanceUpdater) + this.tracker.removeListener('error', this.showError) + } + + if (!global.ethereumProvider) return + const { userAddress } = this.props + this.tracker = new TokenTracker({ + userAddress, + provider: global.ethereumProvider, + tokens: uniqueMergeTokens(defaultTokens, this.props.tokens), + pollingInterval: 8000, + }) + + + // Set up listener instances for cleaning up + this.balanceUpdater = this.updateBalances.bind(this) + this.showError = (error) => { + this.setState({ error, isLoading: false }) + } + this.tracker.on('update', this.balanceUpdater) + this.tracker.on('error', this.showError) + + this.tracker.updateBalances() + .then(() => { + this.updateBalances(this.tracker.serialize()) + }) + .catch((reason) => { + log.error(`Problem updating balances`, reason) + this.setState({ isLoading: false }) + }) +} + +TokenList.prototype.componentWillUpdate = function (nextProps) { + if (nextProps.network === 'loading') return + const oldNet = this.props.network + const newNet = nextProps.network + + if (oldNet && newNet && newNet !== oldNet) { + this.setState({ isLoading: true }) + this.createFreshTokenTracker() + } +} + +TokenList.prototype.updateBalances = function (tokens) { + const heldTokens = tokens.filter(token => { + return token.balance !== '0' && token.string !== '0.000' + }) + this.setState({ tokens: heldTokens, isLoading: false }) +} + +TokenList.prototype.componentWillUnmount = function () { + if (!this.tracker) return + this.tracker.stop() +} + +function uniqueMergeTokens (tokensA, tokensB) { + const uniqueAddresses = [] + const result = [] + tokensA.concat(tokensB).forEach((token) => { + const normal = normalizeAddress(token.address) + if (!uniqueAddresses.includes(normal)) { + uniqueAddresses.push(normal) + result.push(token) + } + }) + return result +} + diff --git a/ui/responsive/app/components/tooltip.js b/ui/responsive/app/components/tooltip.js new file mode 100644 index 000000000..edbc074bb --- /dev/null +++ b/ui/responsive/app/components/tooltip.js @@ -0,0 +1,22 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ReactTooltip = require('react-tooltip-component') + +module.exports = Tooltip + +inherits(Tooltip, Component) +function Tooltip () { + Component.call(this) +} + +Tooltip.prototype.render = function () { + const props = this.props + const { position, title, children } = props + + return h(ReactTooltip, { + position: position || 'left', + title, + fixed: false, + }, children) +} diff --git a/ui/responsive/app/components/transaction-list-item-icon.js b/ui/responsive/app/components/transaction-list-item-icon.js new file mode 100644 index 000000000..431054340 --- /dev/null +++ b/ui/responsive/app/components/transaction-list-item-icon.js @@ -0,0 +1,68 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const Tooltip = require('./tooltip') + +const Identicon = require('./identicon') + +module.exports = TransactionIcon + +inherits(TransactionIcon, Component) +function TransactionIcon () { + Component.call(this) +} + +TransactionIcon.prototype.render = function () { + const { transaction, txParams, isMsg } = this.props + switch (transaction.status) { + case 'unapproved': + return h(!isMsg ? '.unapproved-tx-icon' : 'i.fa.fa-certificate.fa-lg') + + case 'rejected': + return h('i.fa.fa-exclamation-triangle.fa-lg.warning', { + style: { + width: '24px', + }, + }) + + case 'failed': + return h('i.fa.fa-exclamation-triangle.fa-lg.error', { + style: { + width: '24px', + }, + }) + + case 'submitted': + return h(Tooltip, { + title: 'Pending', + position: 'bottom', + }, [ + h('i.fa.fa-ellipsis-h', { + style: { + fontSize: '27px', + }, + }), + ]) + } + + if (isMsg) { + return h('i.fa.fa-certificate.fa-lg', { + style: { + width: '24px', + }, + }) + } + + if (txParams.to) { + return h(Identicon, { + diameter: 24, + address: txParams.to || transaction.hash, + }) + } else { + return h('i.fa.fa-file-text-o.fa-lg', { + style: { + width: '24px', + }, + }) + } +} diff --git a/ui/responsive/app/components/transaction-list-item.js b/ui/responsive/app/components/transaction-list-item.js new file mode 100644 index 000000000..dbda66a31 --- /dev/null +++ b/ui/responsive/app/components/transaction-list-item.js @@ -0,0 +1,165 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const EthBalance = require('./eth-balance') +const addressSummary = require('../util').addressSummary +const explorerLink = require('../../lib/explorer-link') +const CopyButton = require('./copyButton') +const vreme = new (require('vreme')) +const Tooltip = require('./tooltip') +const numberToBN = require('number-to-bn') + +const TransactionIcon = require('./transaction-list-item-icon') +const ShiftListItem = require('./shift-list-item') +module.exports = TransactionListItem + +inherits(TransactionListItem, Component) +function TransactionListItem () { + Component.call(this) +} + +TransactionListItem.prototype.render = function () { + const { transaction, network, conversionRate, currentCurrency } = this.props + if (transaction.key === 'shapeshift') { + if (network === '1') return h(ShiftListItem, transaction) + } + var date = formatDate(transaction.time) + + let isLinkable = false + const numericNet = parseInt(network) + isLinkable = numericNet === 1 || numericNet === 3 || numericNet === 4 || numericNet === 42 + + var isMsg = ('msgParams' in transaction) + var isTx = ('txParams' in transaction) + var isPending = transaction.status === 'unapproved' + let txParams + if (isTx) { + txParams = transaction.txParams + } else if (isMsg) { + txParams = transaction.msgParams + } + + const nonce = txParams.nonce ? numberToBN(txParams.nonce).toString(10) : '' + + const isClickable = ('hash' in transaction && isLinkable) || isPending + return ( + h(`.transaction-list-item.flex-row.flex-space-between${isClickable ? '.pointer' : ''}`, { + onClick: (event) => { + if (isPending) { + this.props.showTx(transaction.id) + } + event.stopPropagation() + if (!transaction.hash || !isLinkable) return + var url = explorerLink(transaction.hash, parseInt(network)) + global.platform.openWindow({ url }) + }, + style: { + padding: '20px 0', + }, + }, [ + + h('.identicon-wrapper.flex-column.flex-center.select-none', [ + h('.pop-hover', { + onClick: (event) => { + event.stopPropagation() + if (!isTx || isPending) return + var url = `https://metamask.github.io/eth-tx-viz/?tx=${transaction.hash}` + global.platform.openWindow({ url }) + }, + }, [ + h(TransactionIcon, { txParams, transaction, isTx, isMsg }), + ]), + ]), + + h(Tooltip, { + title: 'Transaction Number', + position: 'bottom', + }, [ + h('span', { + style: { + display: 'flex', + cursor: 'normal', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + padding: '10px', + }, + }, nonce), + ]), + + h('.flex-column', {style: {width: '200px', overflow: 'hidden'}}, [ + domainField(txParams), + h('div', date), + recipientField(txParams, transaction, isTx, isMsg), + ]), + + // Places a copy button if tx is successful, else places a placeholder empty div. + transaction.hash ? h(CopyButton, { value: transaction.hash }) : h('div', {style: { display: 'flex', alignItems: 'center', width: '26px' }}), + + isTx ? h(EthBalance, { + value: txParams.value, + conversionRate, + currentCurrency, + width: '55px', + shorten: true, + showFiat: false, + style: {fontSize: '15px'}, + }) : h('.flex-column'), + ]) + ) +} + +function domainField (txParams) { + return h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + overflow: 'hidden', + textOverflow: 'ellipsis', + width: '100%', + }, + }, [ + txParams.origin, + ]) +} + +function recipientField (txParams, transaction, isTx, isMsg) { + let message + + if (isMsg) { + message = 'Signature Requested' + } else if (txParams.to) { + message = addressSummary(txParams.to) + } else { + message = 'Contract Published' + } + + return h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + }, + }, [ + message, + failIfFailed(transaction), + ]) +} + +function formatDate (date) { + return vreme.format(new Date(date), 'March 16 2014 14:30') +} + +function failIfFailed (transaction) { + if (transaction.status === 'rejected') { + return h('span.error', ' (Rejected)') + } + if (transaction.err) { + return h(Tooltip, { + title: transaction.err.message, + position: 'bottom', + }, [ + h('span.error', ' (Failed)'), + ]) + } +} diff --git a/ui/responsive/app/components/transaction-list.js b/ui/responsive/app/components/transaction-list.js new file mode 100644 index 000000000..3b4ba741e --- /dev/null +++ b/ui/responsive/app/components/transaction-list.js @@ -0,0 +1,79 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const TransactionListItem = require('./transaction-list-item') + +module.exports = TransactionList + + +inherits(TransactionList, Component) +function TransactionList () { + Component.call(this) +} + +TransactionList.prototype.render = function () { + const { transactions, network, unapprovedMsgs, conversionRate } = this.props + + var shapeShiftTxList + if (network === '1') { + shapeShiftTxList = this.props.shapeShiftTxList + } + const txsToRender = !shapeShiftTxList ? transactions.concat(unapprovedMsgs) : transactions.concat(unapprovedMsgs, shapeShiftTxList) + .sort((a, b) => b.time - a.time) + + return ( + + h('section.transaction-list', [ + + h('style', ` + .transaction-list .transaction-list-item:not(:last-of-type) { + border-bottom: 1px solid #D4D4D4; + } + .transaction-list .transaction-list-item .ether-balance-label { + display: block !important; + font-size: small; + } + `), + + h('.tx-list', { + style: { + overflowY: 'auto', + height: '300px', + padding: '0 20px', + textAlign: 'center', + }, + }, [ + + txsToRender.length + ? txsToRender.map((transaction, i) => { + let key + switch (transaction.key) { + case 'shapeshift': + const { depositAddress, time } = transaction + key = `shift-tx-${depositAddress}-${time}-${i}` + break + default: + key = `tx-${transaction.id}-${i}` + } + return h(TransactionListItem, { + transaction, i, network, key, + conversionRate, + showTx: (txId) => { + this.props.viewPendingTx(txId) + }, + }) + }) + : h('.flex-center', { + style: { + flexDirection: 'column', + height: '100%', + }, + }, [ + 'No transaction history.', + ]), + ]), + ]) + ) +} + diff --git a/ui/responsive/app/conf-tx.js b/ui/responsive/app/conf-tx.js new file mode 100644 index 000000000..63b77ef7f --- /dev/null +++ b/ui/responsive/app/conf-tx.js @@ -0,0 +1,213 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const ReactCSSTransitionGroup = require('react-addons-css-transition-group') +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('./actions') +const NetworkIndicator = require('./components/network') +const txHelper = require('../lib/tx-helper') +const isPopupOrNotification = require('../../../app/scripts/lib/is-popup-or-notification') + +const PendingTx = require('./components/pending-tx') +const PendingMsg = require('./components/pending-msg') +const PendingPersonalMsg = require('./components/pending-personal-msg') +const Loading = require('./components/loading') + +module.exports = connect(mapStateToProps)(ConfirmTxScreen) + +function mapStateToProps (state) { + return { + identities: state.metamask.identities, + accounts: state.metamask.accounts, + selectedAddress: state.metamask.selectedAddress, + unapprovedTxs: state.metamask.unapprovedTxs, + unapprovedMsgs: state.metamask.unapprovedMsgs, + unapprovedPersonalMsgs: state.metamask.unapprovedPersonalMsgs, + index: state.appState.currentView.context, + warning: state.appState.warning, + network: state.metamask.network, + provider: state.metamask.provider, + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + blockGasLimit: state.metamask.currentBlockGasLimit, + } +} + +inherits(ConfirmTxScreen, Component) +function ConfirmTxScreen () { + Component.call(this) +} + +ConfirmTxScreen.prototype.render = function () { + const props = this.props + const { network, provider, unapprovedTxs, currentCurrency, + unapprovedMsgs, unapprovedPersonalMsgs, conversionRate, blockGasLimit } = props + + var unconfTxList = txHelper(unapprovedTxs, unapprovedMsgs, unapprovedPersonalMsgs, network) + + var txData = unconfTxList[props.index] || {} + var txParams = txData.params || {} + var isNotification = isPopupOrNotification() === 'notification' + + + log.info(`rendering a combined ${unconfTxList.length} unconf msg & txs`) + if (unconfTxList.length === 0) return h(Loading, { isLoading: true }) + + return ( + + h('.flex-column.flex-grow', [ + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + !isNotification ? h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: this.goHome.bind(this), + }) : null, + h('h2.page-subtitle', 'Confirm Transaction'), + isNotification ? h(NetworkIndicator, { + network: network, + provider: provider, + }) : null, + ]), + + h('h3', { + style: { + alignSelf: 'center', + display: unconfTxList.length > 1 ? 'block' : 'none', + }, + }, [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + style: { + display: props.index === 0 ? 'none' : 'inline-block', + }, + onClick: () => props.dispatch(actions.previousTx()), + }), + ` ${props.index + 1} of ${unconfTxList.length} `, + h('i.fa.fa-arrow-right.fa-lg.cursor-pointer', { + style: { + display: props.index + 1 === unconfTxList.length ? 'none' : 'inline-block', + }, + onClick: () => props.dispatch(actions.nextTx()), + }), + ]), + + warningIfExists(props.warning), + + h(ReactCSSTransitionGroup, { + className: 'css-transition-group', + transitionName: 'main', + transitionEnterTimeout: 300, + transitionLeaveTimeout: 300, + }, [ + + currentTxView({ + // Properties + txData: txData, + key: txData.id, + selectedAddress: props.selectedAddress, + accounts: props.accounts, + identities: props.identities, + conversionRate, + currentCurrency, + blockGasLimit, + // Actions + buyEth: this.buyEth.bind(this, txParams.from || props.selectedAddress), + sendTransaction: this.sendTransaction.bind(this), + cancelTransaction: this.cancelTransaction.bind(this, txData), + signMessage: this.signMessage.bind(this, txData), + signPersonalMessage: this.signPersonalMessage.bind(this, txData), + cancelMessage: this.cancelMessage.bind(this, txData), + cancelPersonalMessage: this.cancelPersonalMessage.bind(this, txData), + }), + + ]), + ]) + ) +} + +function currentTxView (opts) { + log.info('rendering current tx view') + const { txData } = opts + const { txParams, msgParams, type } = txData + + if (txParams) { + log.debug('txParams detected, rendering pending tx') + return h(PendingTx, opts) + } else if (msgParams) { + log.debug('msgParams detected, rendering pending msg') + + if (type === 'eth_sign') { + log.debug('rendering eth_sign message') + return h(PendingMsg, opts) + } else if (type === 'personal_sign') { + log.debug('rendering personal_sign message') + return h(PendingPersonalMsg, opts) + } + } +} + +ConfirmTxScreen.prototype.buyEth = function (address, event) { + event.preventDefault() + this.props.dispatch(actions.buyEthView(address)) +} + +ConfirmTxScreen.prototype.sendTransaction = function (txData, event) { + this.stopPropagation(event) + this.props.dispatch(actions.updateAndApproveTx(txData)) +} + +ConfirmTxScreen.prototype.cancelTransaction = function (txData, event) { + this.stopPropagation(event) + event.preventDefault() + this.props.dispatch(actions.cancelTx(txData)) +} + +ConfirmTxScreen.prototype.signMessage = function (msgData, event) { + log.info('conf-tx.js: signing message') + var params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + this.props.dispatch(actions.signMsg(params)) +} + +ConfirmTxScreen.prototype.stopPropagation = function (event) { + if (event.stopPropagation) { + event.stopPropagation() + } +} + +ConfirmTxScreen.prototype.signPersonalMessage = function (msgData, event) { + log.info('conf-tx.js: signing personal message') + var params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + this.props.dispatch(actions.signPersonalMsg(params)) +} + +ConfirmTxScreen.prototype.cancelMessage = function (msgData, event) { + log.info('canceling message') + this.stopPropagation(event) + this.props.dispatch(actions.cancelMsg(msgData)) +} + +ConfirmTxScreen.prototype.cancelPersonalMessage = function (msgData, event) { + log.info('canceling personal message') + this.stopPropagation(event) + this.props.dispatch(actions.cancelPersonalMsg(msgData)) +} + +ConfirmTxScreen.prototype.goHome = function (event) { + this.stopPropagation(event) + this.props.dispatch(actions.goHome()) +} + +function warningIfExists (warning) { + if (warning && + // Do not display user rejections on this screen: + warning.indexOf('User denied transaction signature') === -1) { + return h('.error', { + style: { + margin: 'auto', + }, + }, warning) + } +} diff --git a/ui/responsive/app/config.js b/ui/responsive/app/config.js new file mode 100644 index 000000000..62785c49b --- /dev/null +++ b/ui/responsive/app/config.js @@ -0,0 +1,211 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('./actions') +const currencies = require('./conversion.json').rows +const validUrl = require('valid-url') +const copyToClipboard = require('copy-to-clipboard') + +module.exports = connect(mapStateToProps)(ConfigScreen) + +function mapStateToProps (state) { + return { + metamask: state.metamask, + warning: state.appState.warning, + } +} + +inherits(ConfigScreen, Component) +function ConfigScreen () { + Component.call(this) +} + +ConfigScreen.prototype.render = function () { + var state = this.props + var metamaskState = state.metamask + var warning = state.warning + + return ( + h('.flex-column.flex-grow', [ + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + state.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Settings'), + ]), + + h('.error', { + style: { + display: warning ? 'block' : 'none', + padding: '0 20px', + textAlign: 'center', + }, + }, warning), + + // conf view + h('.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-space-around', { + style: { + padding: '20px', + }, + }, [ + + currentProviderDisplay(metamaskState), + + h('div', { style: {display: 'flex'} }, [ + h('input#new_rpc', { + placeholder: 'New RPC URL', + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + onKeyPress (event) { + if (event.key === 'Enter') { + var element = event.target + var newRpc = element.value + rpcValidation(newRpc, state) + } + }, + }), + h('button', { + style: { + alignSelf: 'center', + }, + onClick (event) { + event.preventDefault() + var element = document.querySelector('input#new_rpc') + var newRpc = element.value + rpcValidation(newRpc, state) + }, + }, 'Save'), + ]), + + h('hr.horizontal-line'), + + currentConversionInformation(metamaskState, state), + + h('hr.horizontal-line'), + + h('div', { + style: { + marginTop: '20px', + }, + }, [ + h('p', { + style: { + fontFamily: 'Montserrat Light', + fontSize: '13px', + }, + }, `State logs contain your public account addresses and sent transactions.`), + h('br'), + h('button', { + style: { + alignSelf: 'center', + }, + onClick (event) { + copyToClipboard(window.logState()) + }, + }, 'Copy State Logs'), + ]), + + h('hr.horizontal-line'), + + h('div', { + style: { + marginTop: '20px', + }, + }, [ + h('button', { + style: { + alignSelf: 'center', + }, + onClick (event) { + event.preventDefault() + state.dispatch(actions.revealSeedConfirmation()) + }, + }, 'Reveal Seed Words'), + ]), + + ]), + ]), + ]) + ) +} + +function rpcValidation (newRpc, state) { + if (validUrl.isWebUri(newRpc)) { + state.dispatch(actions.setRpcTarget(newRpc)) + } else { + var appendedRpc = `http://${newRpc}` + if (validUrl.isWebUri(appendedRpc)) { + state.dispatch(actions.displayWarning('URIs require the appropriate HTTP/HTTPS prefix.')) + } else { + state.dispatch(actions.displayWarning('Invalid RPC URI')) + } + } +} + +function currentConversionInformation (metamaskState, state) { + var currentCurrency = metamaskState.currentCurrency + var conversionDate = metamaskState.conversionDate + return h('div', [ + h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, 'Current Conversion'), + h('span', {style: { fontWeight: 'bold', paddingRight: '10px', fontSize: '13px'}}, `Updated ${Date(conversionDate)}`), + h('select#currentCurrency', { + onChange (event) { + event.preventDefault() + var element = document.getElementById('currentCurrency') + var newCurrency = element.value + state.dispatch(actions.setCurrentCurrency(newCurrency)) + }, + defaultValue: currentCurrency, + }, currencies.map((currency) => { + return h('option', {key: currency.code, value: currency.code}, `${currency.code} - ${currency.name}`) + }) + ), + ]) +} + +function currentProviderDisplay (metamaskState) { + var provider = metamaskState.provider + var title, value + + switch (provider.type) { + + case 'mainnet': + title = 'Current Network' + value = 'Main Ethereum Network' + break + + case 'ropsten': + title = 'Current Network' + value = 'Ropsten Test Network' + break + + case 'kovan': + title = 'Current Network' + value = 'Kovan Test Network' + break + + case 'rinkeby': + title = 'Current Network' + value = 'Rinkeby Test Network' + break + + default: + title = 'Current RPC' + value = metamaskState.provider.rpcTarget + } + + return h('div', [ + h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, title), + h('span', value), + ]) +} diff --git a/ui/responsive/app/conversion.json b/ui/responsive/app/conversion.json new file mode 100644 index 000000000..155ffc4fc --- /dev/null +++ b/ui/responsive/app/conversion.json @@ -0,0 +1,207 @@ +{ + "rows": [ + { + "code": "REP", + "name": "Augur", + "statuses": [ + "primary" + ] + }, + { + "code": "BCN", + "name": "Bytecoin", + "statuses": [ + "primary" + ] + }, + { + "code": "BTC", + "name": "Bitcoin", + "statuses": [ + "primary", + "secondary" + ] + }, + { + "code": "BTS", + "name": "BitShares", + "statuses": [ + "primary", + "secondary" + ] + }, + { + "code": "BLK", + "name": "Blackcoin", + "statuses": [ + "primary" + ] + }, + { + "code": "GBP", + "name": "British Pound Sterling", + "statuses": [ + "secondary" + ] + }, + { + "code": "CAD", + "name": "Canadian Dollar", + "statuses": [ + "secondary" + ] + }, + { + "code": "CNY", + "name": "Chinese Yuan", + "statuses": [ + "secondary" + ] + }, + { + "code": "DSH", + "name": "Dashcoin", + "statuses": [ + "primary" + ] + }, + { + "code": "DOGE", + "name": "Dogecoin", + "statuses": [ + "primary", + "secondary" + ] + }, + { + "code": "ETC", + "name": "Ethereum Classic", + "statuses": [ + "primary" + ] + }, + { + "code": "EUR", + "name": "Euro", + "statuses": [ + "primary", + "secondary" + ] + }, + { + "code": "GNO", + "name": "GNO", + "statuses": [ + "primary" + ] + }, + { + "code": "GNT", + "name": "GNT", + "statuses": [ + "primary" + ] + }, + { + "code": "JPY", + "name": "Japanese Yen", + "statuses": [ + "secondary" + ] + }, + { + "code": "LTC", + "name": "Litecoin", + "statuses": [ + "primary", + "secondary" + ] + }, + { + "code": "MAID", + "name": "MaidSafeCoin", + "statuses": [ + "primary" + ] + }, + { + "code": "XEM", + "name": "NEM", + "statuses": [ + "primary" + ] + }, + { + "code": "XLM", + "name": "Stellar", + "statuses": [ + "primary" + ] + }, + { + "code": "XMR", + "name": "Monero", + "statuses": [ + "primary", + "secondary" + ] + }, + { + "code": "XRP", + "name": "Ripple", + "statuses": [ + "primary" + ] + }, + { + "code": "RUR", + "name": "Ruble", + "statuses": [ + "secondary" + ] + }, + { + "code": "STEEM", + "name": "Steem", + "statuses": [ + "primary" + ] + }, + { + "code": "STRAT", + "name": "STRAT", + "statuses": [ + "primary" + ] + }, + { + "code": "UAH", + "name": "Ukrainian Hryvnia", + "statuses": [ + "secondary" + ] + }, + { + "code": "USD", + "name": "US Dollar", + "statuses": [ + "primary", + "secondary" + ] + }, + { + "code": "WAVES", + "name": "WAVES", + "statuses": [ + "primary" + ] + }, + { + "code": "ZEC", + "name": "Zcash", + "statuses": [ + "primary" + ] + } + ] +} diff --git a/ui/responsive/app/css/debug.css b/ui/responsive/app/css/debug.css new file mode 100644 index 000000000..3e125bcd4 --- /dev/null +++ b/ui/responsive/app/css/debug.css @@ -0,0 +1,21 @@ +/* +debug / dev +*/ + +#app-content { + border: 2px solid green; +} + +#design-container { + position: absolute; + left: 360px; + top: -42px; + width: calc(100vw - 360px); + height: 100vh; + overflow: scroll; +} + +#design-container img { + width: 2000px; + margin-right: 600px; +}
\ No newline at end of file diff --git a/ui/responsive/app/css/fonts.css b/ui/responsive/app/css/fonts.css new file mode 100644 index 000000000..3b9f581b9 --- /dev/null +++ b/ui/responsive/app/css/fonts.css @@ -0,0 +1,36 @@ +@import url(https://fonts.googleapis.com/css?family=Roboto:300,500); +@import url(https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css); + +@font-face { + font-family: 'Montserrat Regular'; + src: url('/fonts/Montserrat/Montserrat-Regular.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-Regular.ttf') format('truetype'); + font-weight: normal; + font-style: normal; + font-size: 'small'; + +} + +@font-face { + font-family: 'Montserrat Bold'; + src: url('/fonts/Montserrat/Montserrat-Bold.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-Bold.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat Light'; + src: url('/fonts/Montserrat/Montserrat-Light.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-Light.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat UltraLight'; + src: url('/fonts/Montserrat/Montserrat-UltraLight.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-UltraLight.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} diff --git a/ui/responsive/app/css/index.css b/ui/responsive/app/css/index.css new file mode 100644 index 000000000..808aafb4c --- /dev/null +++ b/ui/responsive/app/css/index.css @@ -0,0 +1,667 @@ +/* +faint orange (textfield shades) #FAF6F0 +light orange (button shades): #F5C26D +dark orange (text): #F5A623 +borders/font/any gray: #4A4A4A +*/ + +/* +application specific styles +*/ + +* { + box-sizing: border-box; +} + +html, body { + font-family: 'Montserrat Regular', Arial; + color: #4D4D4D; + font-weight: 300; + line-height: 1.4em; + background: #F7F7F7; +} + +input:focus, textarea:focus { + outline: none; +} + +#app-content { + overflow-x: hidden; + min-width: 357px; + width: 360px; + height: 500px; +} + +button, input[type="submit"] { + font-family: 'Montserrat Bold'; + outline: none; + cursor: pointer; + padding: 8px 12px; + border: none; + color: white; + transform-origin: center center; + transition: transform 50ms ease-in; + /* default orange */ + background: rgba(247, 134, 28, 1); + box-shadow: 0px 3px 6px rgba(247, 134, 28, 0.36); +} + +.btn-green, input[type="submit"].btn-green { + background: rgba(106, 195, 96, 1); + box-shadow: 0px 3px 6px rgba(106, 195, 96, 0.36); +} + +.btn-red { + background: rgba(254, 35, 17, 1); + box-shadow: 0px 3px 6px rgba(254, 35, 17, 0.36); +} + +button[disabled], input[type="submit"][disabled] { + cursor: not-allowed; + background: rgba(197, 197, 197, 1); + box-shadow: 0px 3px 6px rgba(197, 197, 197, 0.36); +} + +button.spaced { + margin: 2px; +} + +button:not([disabled]):hover, input[type="submit"]:not([disabled]):hover { + transform: scale(1.1); +} +button:not([disabled]):active, input[type="submit"]:not([disabled]):active { + transform: scale(0.95); +} + +a { + text-decoration: none; + color: inherit; +} + +a:hover{ + color: #df6b0e; +} + +/* +app +*/ + +.active { + color: #909090; +} + +button.primary { + padding: 8px 12px; + background: #F7861C; + box-shadow: 0px 3px 6px rgba(247, 134, 28, 0.36); + color: white; + font-size: 1.1em; + font-family: 'Montserrat Regular'; + text-transform: uppercase; +} + +button.btn-thin { + border: 1px solid; + border-color: #4D4D4D; + color: #4D4D4D; + background: rgb(255, 174, 41); + border-radius: 4px; + min-width: 200px; + margin: 12px 0; + padding: 6px; + font-size: 13px; +} + +.app-header { + padding: 6px 8px; +} + +.app-header h1 { + font-family: 'Montserrat Regular'; + text-transform: uppercase; + color: #AEAEAE; +} + +h2.page-subtitle { + font-family: 'Montserrat Regular'; + text-transform: uppercase; + color: #AEAEAE; + font-size: 1em; + margin: 12px; +} + +.app-primary { + +} + +.app-footer { + padding-bottom: 10px; + align-items: center; +} + +.identicon { + height: 46px; + width: 46px; + background-size: cover; + border-radius: 100%; + border: 3px solid gray; +} + +textarea.twelve-word-phrase { + padding: 12px; + width: 300px; + height: 140px; + font-size: 16px; + background: white; + resize: none; +} + +.network-indicator { + display: flex; + align-items: center; + font-size: 0.6em; + +} + +.network-name { + width: 5.2em; + line-height: 9px; + text-rendering: geometricPrecision; +} + +.check { + margin-left: 7px; + color: #F7861C; + flex: 1 0 auto; + display: flex; + justify-content: flex-end; +} +/* +app sections +*/ + +/* initialize */ + +.initialize-screen hr { + width: 60px; + margin: 12px; + border-color: #F7861C; + border-style: solid; +} + +.initialize-screen label { + margin-top: 20px; +} + +.initialize-screen button.create-vault { + margin-top: 40px; +} + +.initialize-screen .warning { + font-size: 14px; + margin: 0 16px; +} + +/* unlock */ +.error { + color: #E20202; +} + +.warning { + color: #FFAE00; +} + +.lock { + width: 50px; + height: 50px; +} + +.lock.locked { + transform: scale(1.5); + opacity: 0.0; + transition: opacity 400ms ease-in, transform 400ms ease-in; +} +.lock.unlocked { + transform: scale(1); + opacity: 1; + transition: opacity 500ms ease-out, transform 500ms ease-out, background 200ms ease-in; +} + +.lock.locked .lock-top { + transform: scaleX(1) translateX(0); + transition: transform 250ms ease-in; +} +.lock.unlocked .lock-top { + transform: scaleX(-1) translateX(-12px); + transition: transform 250ms ease-in; +} +.lock.unlocked:hover { + border-radius: 4px; + background: #e5e5e5; + border: 1px solid #b1b1b1; +} +.lock.unlocked:active { + background: #c3c3c3; +} + +.section-title .fa-arrow-left { + margin: -2px 8px 0px -8px; +} + +.unlock-screen #metamask-mascot-container { + margin-top: 24px; +} + +.unlock-screen h1 { + margin-top: -28px; + margin-bottom: 42px; +} + +.unlock-screen input[type=password] { + width: 260px; + /*height: 36px; + margin-bottom: 24px; + padding: 8px;*/ +} + +.sizing-input{ + font-size: 14px; + height: 30px; + padding-left: 5px; +} +.editable-label{ + display: flex; +} +/* Webkit */ +.unlock-screen input::-webkit-input-placeholder { + text-align: center; + font-size: 1.2em; +} +/* Firefox 18- */ +.unlock-screen input:-moz-placeholder { + text-align: center; + font-size: 1.2em; +} +/* Firefox 19+ */ +.unlock-screen input::-moz-placeholder { + text-align: center; + font-size: 1.2em; +} +/* IE */ +.unlock-screen input:-ms-input-placeholder { + text-align: center; + font-size: 1.2em; +} + +input.large-input, textarea.large-input { + /*margin-bottom: 24px;*/ + padding: 8px; +} + +input.large-input { + height: 36px; +} + +.letter-spacey { + letter-spacing: 0.1em; +} + + + +/* accounts */ + +.accounts-section { + margin: 0 0px; +} + +.accounts-section .horizontal-line { + margin: 0px 18px; +} + +.accounts-list-option { + height: 120px; +} + +.accounts-list-option .identicon-wrapper { + width: 100px; +} + +.unconftx-link { + margin-top: 24px; + cursor: pointer; +} + +.unconftx-link .fa-arrow-right { + margin: 0px -8px 0px 8px; +} + +/* identity panel */ + +.identity-panel { + font-weight: 500; +} + +.identity-panel .identicon-wrapper { + margin: 4px; + margin-top: 8px; + display: flex; + align-items: center; +} + +.identity-panel .identicon-wrapper span { + margin: 0 auto; +} + +.identity-panel .identity-data { + margin: 8px 8px 8px 18px; +} + +.identity-panel i { + margin-top: 32px; + margin-right: 6px; + color: #B9B9B9; +} + +.identity-panel .arrow-right { + padding-left: 18px; + width: 42px; + min-width: 18px; + height: 100%; +} + +.identity-copy.flex-column { + flex: 0.25 0 auto; + justify-content: center; +} + +/* accounts screen */ + +.identity-section { + +} + +.identity-section .identity-panel { + background: #E9E9E9; + border-bottom: 1px solid #B1B1B1; + cursor: pointer; +} + +.identity-section .identity-panel.selected { + background: white; + color: #F3C83E; +} + +.identity-section .identity-panel.selected .identicon { + border-color: orange; +} + +.identity-section .accounts-list-option:hover, +.identity-section .accounts-list-option.selected { + background:white; +} + +/* account detail screen */ + +.account-detail-section { + +} +.name-label{ + +} + +.unapproved-tx-icon { + height: 16px; + width: 16px; + background: rgb(47, 174, 244); + border-color: #AEAEAE; + border-radius: 13px; +} + +.edit-text { + height: 100%; + visibility: hidden; +} +.editing-label { + display: flex; + justify-content: flex-start; + margin-left: 50px; + margin-bottom: 2px; + font-size: 11px; + text-rendering: geometricPrecision; + color: #F7861C; +} +.name-label:hover .edit-text { + visibility: visible; +} +/* tx confirm */ + +.unconftx-section input[type=password] { + height: 22px; + padding: 2px; + margin: 12px; + margin-bottom: 24px; + border-radius: 4px; + border: 2px solid #F3C83E; + background: #FAF6F0; +} + +/* Send Screen */ + +.send-screen { + +} + +.send-screen section { + margin: 8px 16px; +} + +.send-screen input { + width: 100%; + font-size: 12px; +} + +/* Ether Balance Widget */ + +.ether-balance-amount { + color: #F7861C; +} + +.ether-balance-label { + color: #ABA9AA; +} + +/* Info screen */ +.info-gray{ + font-family: 'Montserrat Regular'; + text-transform: uppercase; + color: #AEAEAE; +} + +.icon-size{ + width: 20px; +} + +.info{ + font-family: 'Montserrat Regular', Arial; + padding-bottom: 10px; + display: inline-block; + padding-left: 5px; +} + +/* buy eth warning screen */ +.custom-radios { + justify-content: space-around; + align-items: center; +} + + +.custom-radio-selected { + width: 17px; + height: 17px; + border: solid; + border-style: double; + border-radius: 15px; + border-width: 5px; + background: rgba(247, 134, 28, 1); + border-color: #F7F7F7; +} + +.custom-radio-inactive { + width: 14px; + height: 14px; + border: solid; + border-width: 1px; + border-radius: 24px; + border-color: #AEAEAE; +} + +.radio-titles { + color: rgba(247, 134, 28, 1); +} + +.radio-titles-subtext { + +} + +.selected-exchange { + +} + +.buy-radio { + +} + +.eth-warning{ + transition: opacity 400ms ease-in, transform 400ms ease-in; +} + +.buy-subview{ + transition: opacity 400ms ease-in, transform 400ms ease-in; +} + +.input-container:hover .edit-text{ + visibility: visible; +} + +.buy-inputs{ + font-family: 'Montserrat Light'; + font-size: 13px; + height: 20px; + background: transparent; + box-sizing: border-box; + border: solid; + border-color: transparent; + border-width: 0.5px; + border-radius: 2px; + +} +.input-container:hover .buy-inputs{ + box-sizing: inherit; + border: solid; + border-color: #F7861C; + border-width: 0.5px; + border-radius: 2px; +} + +.buy-inputs:focus{ + border: solid; + border-color: #F7861C; + border-width: 0.5px; + border-radius: 2px; +} + +.activeForm { + background: #F7F7F7; + border: none; + border-radius: 8px 8px 0px 0px; + width: 50%; + text-align: center; + padding-bottom: 4px; + +} + +.inactiveForm { + border: none; + border-radius: 8px 8px 0px 0px; + width: 50%; + text-align: center; + padding-bottom: 4px; +} + +.ex-coins { + font-family: 'Montserrat Regular'; + text-transform: uppercase; + text-align: center; + font-size: 33px; + width: 118px; + height: 42px; + padding: 1px; + color: #4D4D4D; +} + +.marketinfo{ + font-family: 'Montserrat light'; + color: #AEAEAE; + font-size: 15px; + line-height: 17px; +} + +#fromCoin::-webkit-calendar-picker-indicator { + display: none; +} + +#coinList { + width: 400px; + height: 500px; + overflow: scroll; +} + +.icon-control .fa-refresh{ + visibility: hidden; +} + +.icon-control:hover .fa-refresh{ + visibility: visible; +} + +.icon-control:hover .fa-chevron-right{ + visibility: hidden; +} + +.inactive { + color: #AEAEAE; +} + +.inactive button{ + background: #AEAEAE; + color: white; +} + +.ellip-address { + overflow: hidden; + text-overflow: ellipsis; + width: 5em; + font-size: 14px; + font-family: "Montserrat Light"; + margin-left: 5px; +} + +.qr-header { + font-size: 25px; + margin-top: 40px; +} + +.qr-message { + font-size: 12px; + color: #F7861C; +} + +div.message-container > div:first-child { + margin-top: 18px; + font-size: 15px; + color: #4D4D4D; +} + +.pop-hover:hover { + transform: scale(1.1); +} diff --git a/ui/responsive/app/css/lib.css b/ui/responsive/app/css/lib.css new file mode 100644 index 000000000..910a24ee2 --- /dev/null +++ b/ui/responsive/app/css/lib.css @@ -0,0 +1,268 @@ +/* color */ + +.color-orange { + color: #F7861C; +} + +.color-forest { + color: #0A5448; +} + +/* lib */ + +.full-width { + width: 100%; +} + +.full-height { + height: 100%; +} + +.flex-column { + display: flex; + flex-direction: column; +} + +.space-between { + justify-content: space-between; +} + +.space-around { + justify-content: space-around; +} + +.flex-column-bottom { + display: flex; + flex-direction: column-reverse; +} + +.flex-row { + display: flex; + flex-direction: row; +} + +.flex-space-between { + justify-content: space-between; +} + +.flex-space-around { + justify-content: space-around; +} + +.flex-right { + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.flex-left { + display: flex; + flex-direction: row; + justify-content: flex-start; +} + +.flex-fixed { + flex: none; +} + +.flex-basis-auto { + flex-basis: auto; +} + +.flex-grow { + flex: 1 1 auto; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.flex-center { + display: flex; + justify-content: center; + align-items: center; +} + +.flex-justify-center { + justify-content: center; +} + +.flex-align-center { + align-items: center; +} + +.flex-self-end { + align-self: flex-end; +} + +.flex-self-stretch { + align-self: stretch; +} + +.flex-vertical { + flex-direction: column; +} + +.z-bump { + z-index: 1; +} + +.select-none { + cursor: inherit; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.pointer { + cursor: pointer; +} +.cursor-pointer { + cursor: pointer; + transform-origin: center center; + transition: transform 50ms ease-in-out; +} +.cursor-pointer:hover { + transform: scale(1.1); +} +.cursor-pointer:active { + transform: scale(0.95); +} + +.cursor-disabled { + cursor: not-allowed; +} + +.margin-bottom-sml { + margin-bottom: 20px; +} + +.margin-bottom-med { + margin-bottom: 40px; +} + +.margin-right-left { + margin: 0 20px; +} + +.bold { + font-weight: bold; +} + +.text-transform-uppercase { + text-transform: uppercase; +} + +.font-small { + font-size: 12px; +} + +.font-medium { + font-size: 1.2em; +} + +hr.horizontal-line { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} + +.hover-white:hover { + background: white; +} + +.red-dot { + background: #E91550; + color: white; + border-radius: 10px; +} + +.diamond { + transform: rotate(45deg); + background: #038789; +} + +.hollow-diamond { + transform: rotate(45deg); + border: 3px solid #690496; +} + +.golden-square { + background: #EBB33F; +} + +.pending-dot { + background: red; + left: 14px; + top: 14px; + color: white; + border-radius: 10px; + height: 20px; + min-width: 20px; + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 4px; + z-index: 1; +} + +.keyring-label { + z-index: 1; + font-size: 11px; + background: rgba(255,0,0,0.8); + bottom: -47px; + color: white; + border-radius: 10px; + height: 20px; + min-width: 20px; + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 4px; +} + +.ether-balance { + display: flex; + align-items: center; +} + +.menu-icon { + display: inline-block; + height: 9px; + min-width: 9px; + margin: 13px; +} +.ether-icon { + background: rgb(0, 163, 68); + border-radius: 20px; +} +.testnet-icon { + background: #2465E1; +} + +.drop-menu-item { + display: flex; + align-items: center; +} + +.invisible { + visibility: hidden; +} + +.one-line-concat { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.critical-error { + text-align: center; + margin-top: 20px; + color: red; +} diff --git a/ui/responsive/app/css/reset.css b/ui/responsive/app/css/reset.css new file mode 100644 index 000000000..9ce89e8bc --- /dev/null +++ b/ui/responsive/app/css/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +}
\ No newline at end of file diff --git a/ui/responsive/app/css/transitions.css b/ui/responsive/app/css/transitions.css new file mode 100644 index 000000000..393a944f9 --- /dev/null +++ b/ui/responsive/app/css/transitions.css @@ -0,0 +1,42 @@ +/* universal */ +.app-primary .main-enter { + position: absolute; + width: 100%; +} + +/* center position */ +.app-primary.from-right .main-enter-active, +.app-primary.from-left .main-enter-active { + overflow-x: hidden; + transform: translateX(0px); + transition: transform 300ms ease-in; +} + +/* exited positions */ +.app-primary.from-left .main-leave-active { + transform: translateX(360px); + transition: transform 300ms ease-in; +} +.app-primary.from-right .main-leave-active { + transform: translateX(-360px); + transition: transform 300ms ease-in; +} + +/* loader transitions */ +.loader-enter, .loader-leave-active { + opacity: 0.0; + transition: opacity 150 ease-in; +} +.loader-enter-active, .loader-leave { + opacity: 1.0; + transition: opacity 150 ease-in; +} + +/* entering positions */ +.app-primary.from-right .main-enter:not(.main-enter-active) { + transform: translateX(360px); +} +.app-primary.from-left .main-enter:not(.main-enter-active) { + transform: translateX(-360px); +} + diff --git a/ui/responsive/app/first-time/init-menu.js b/ui/responsive/app/first-time/init-menu.js new file mode 100644 index 000000000..cc7c51bd3 --- /dev/null +++ b/ui/responsive/app/first-time/init-menu.js @@ -0,0 +1,179 @@ +const inherits = require('util').inherits +const EventEmitter = require('events').EventEmitter +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const Mascot = require('../components/mascot') +const actions = require('../actions') +const Tooltip = require('../components/tooltip') +const getCaretCoordinates = require('textarea-caret') + +module.exports = connect(mapStateToProps)(InitializeMenuScreen) + +inherits(InitializeMenuScreen, Component) +function InitializeMenuScreen () { + Component.call(this) + this.animationEventEmitter = new EventEmitter() +} + +function mapStateToProps (state) { + return { + // state from plugin + currentView: state.appState.currentView, + warning: state.appState.warning, + } +} + +InitializeMenuScreen.prototype.render = function () { + var state = this.props + + switch (state.currentView.name) { + + default: + return this.renderMenu(state) + + } +} + +// InitializeMenuScreen.prototype.componentDidMount = function(){ +// document.getElementById('password-box').focus() +// } + +InitializeMenuScreen.prototype.renderMenu = function (state) { + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', [ + + h(Mascot, { + animationEventEmitter: this.animationEventEmitter, + }), + + h('h1', { + style: { + fontSize: '1.3em', + textTransform: 'uppercase', + color: '#7F8082', + marginBottom: 10, + }, + }, 'MetaMask'), + + + h('div', [ + h('h3', { + style: { + fontSize: '0.8em', + color: '#7F8082', + display: 'inline', + }, + }, 'Encrypt your new DEN'), + + h(Tooltip, { + title: 'Your DEN is your password-encrypted storage within MetaMask.', + }, [ + h('i.fa.fa-question-circle.pointer', { + style: { + fontSize: '18px', + position: 'relative', + color: 'rgb(247, 134, 28)', + top: '2px', + marginLeft: '4px', + }, + }), + ]), + ]), + + h('span.in-progress-notification', state.warning), + + // password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box', + placeholder: 'New Password (min 8 chars)', + onInput: this.inputChanged.bind(this), + style: { + width: 260, + marginTop: 12, + }, + }), + + // confirm password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box-confirm', + placeholder: 'Confirm Password', + onKeyPress: this.createVaultOnEnter.bind(this), + onInput: this.inputChanged.bind(this), + style: { + width: 260, + marginTop: 16, + }, + }), + + + h('button.primary', { + onClick: this.createNewVaultAndKeychain.bind(this), + style: { + margin: 12, + }, + }, 'Create'), + + h('.flex-row.flex-center.flex-grow', [ + h('p.pointer', { + onClick: this.showRestoreVault.bind(this), + style: { + fontSize: '0.8em', + color: 'rgb(247, 134, 28)', + textDecoration: 'underline', + }, + }, 'Import Existing DEN'), + ]), + + ]) + ) +} + +InitializeMenuScreen.prototype.createVaultOnEnter = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.createNewVaultAndKeychain() + } +} + +InitializeMenuScreen.prototype.componentDidMount = function () { + document.getElementById('password-box').focus() +} + +InitializeMenuScreen.prototype.showRestoreVault = function () { + this.props.dispatch(actions.showRestoreVault()) +} + +InitializeMenuScreen.prototype.createNewVaultAndKeychain = function () { + var passwordBox = document.getElementById('password-box') + var password = passwordBox.value + var passwordConfirmBox = document.getElementById('password-box-confirm') + var passwordConfirm = passwordConfirmBox.value + + if (password.length < 8) { + this.warning = 'password not long enough' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + if (password !== passwordConfirm) { + this.warning = 'passwords don\'t match' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + + this.props.dispatch(actions.createNewVaultAndKeychain(password)) +} + +InitializeMenuScreen.prototype.inputChanged = function (event) { + // tell mascot to look at page action + var element = event.target + var boundingRect = element.getBoundingClientRect() + var coordinates = getCaretCoordinates(element, element.selectionEnd) + this.animationEventEmitter.emit('point', { + x: boundingRect.left + coordinates.left - element.scrollLeft, + y: boundingRect.top + coordinates.top - element.scrollTop, + }) +} diff --git a/ui/responsive/app/img/identicon-tardigrade.png b/ui/responsive/app/img/identicon-tardigrade.png Binary files differnew file mode 100644 index 000000000..1742a32b8 --- /dev/null +++ b/ui/responsive/app/img/identicon-tardigrade.png diff --git a/ui/responsive/app/img/identicon-walrus.png b/ui/responsive/app/img/identicon-walrus.png Binary files differnew file mode 100644 index 000000000..d58fae912 --- /dev/null +++ b/ui/responsive/app/img/identicon-walrus.png diff --git a/ui/responsive/app/info.js b/ui/responsive/app/info.js new file mode 100644 index 000000000..e8470de97 --- /dev/null +++ b/ui/responsive/app/info.js @@ -0,0 +1,154 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('./actions') + +module.exports = connect(mapStateToProps)(InfoScreen) + +function mapStateToProps (state) { + return {} +} + +inherits(InfoScreen, Component) +function InfoScreen () { + Component.call(this) +} + +InfoScreen.prototype.render = function () { + const state = this.props + const version = global.platform.getVersion() + + return ( + h('.flex-column.flex-grow', [ + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + state.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Info'), + ]), + + // main view + h('.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-space-around', { + style: { + padding: '20px', + }, + }, [ + // current version number + + h('.info.info-gray', [ + h('div', 'Metamask'), + h('div', { + style: { + marginBottom: '10px', + }, + }, `Version: ${version}`), + ]), + + h('div', { + style: { + marginBottom: '5px', + }}, + [ + h('div', [ + h('a', { + href: 'https://metamask.io/privacy.html', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, [ + h('div.info', 'Privacy Policy'), + ]), + ]), + h('div', [ + h('a', { + href: 'https://metamask.io/terms.html', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, [ + h('div.info', 'Terms of Use'), + ]), + ]), + h('div', [ + h('a', { + href: 'https://metamask.io/attributions.html', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, [ + h('div.info', 'Attributions'), + ]), + ]), + ] + ), + + h('hr', { + style: { + margin: '10px 0 ', + width: '7em', + }, + }), + + h('div', { + style: { + paddingLeft: '30px', + }}, + [ + h('div.fa.fa-github', [ + h('a.info', { + href: 'https://github.com/MetaMask/faq', + target: '_blank', + }, 'Need Help? Read our FAQ!'), + ]), + h('div', [ + h('a', { + href: 'https://metamask.io/', + target: '_blank', + }, [ + h('img.icon-size', { + src: 'images/icon-128.png', + style: { + // IE6-9 + filter: 'grayscale(100%)', + // Microsoft Edge and Firefox 35+ + WebkitFilter: 'grayscale(100%)', + }, + }), + h('div.info', 'Visit our web site'), + ]), + ]), + h('div.fa.fa-slack', [ + h('a.info', { + href: 'http://slack.metamask.io', + target: '_blank', + }, 'Join the conversation on Slack'), + ]), + + h('div.fa.fa-twitter', [ + h('a.info', { + href: 'https://twitter.com/metamask_io', + target: '_blank', + }, 'Follow us on Twitter'), + ]), + + h('div.fa.fa-envelope', [ + h('a.info', { + target: '_blank', + style: { width: '85vw' }, + href: 'mailto:help@metamask.io?subject=Feedback', + }, 'Email us!'), + ]), + ]), + ]), + ]), + ]) + ) +} + +InfoScreen.prototype.navigateTo = function (url) { + global.platform.openWindow({ url }) +} + diff --git a/ui/responsive/app/keychains/hd/create-vault-complete.js b/ui/responsive/app/keychains/hd/create-vault-complete.js new file mode 100644 index 000000000..a318a9b50 --- /dev/null +++ b/ui/responsive/app/keychains/hd/create-vault-complete.js @@ -0,0 +1,78 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('../../actions') + +module.exports = connect(mapStateToProps)(CreateVaultCompleteScreen) + +inherits(CreateVaultCompleteScreen, Component) +function CreateVaultCompleteScreen () { + Component.call(this) +} + +function mapStateToProps (state) { + return { + seed: state.appState.currentView.seedWords, + cachedSeed: state.metamask.seedWords, + } +} + +CreateVaultCompleteScreen.prototype.render = function () { + var state = this.props + var seed = state.seed || state.cachedSeed || '' + + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', [ + + // // subtitle and nav + // h('.section-title.flex-row.flex-center', [ + // h('h2.page-subtitle', 'Vault Created'), + // ]), + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginTop: 36, + marginBottom: 8, + width: '100%', + fontSize: '20px', + padding: 6, + }, + }, [ + 'Vault Created', + ]), + + h('div', { + style: { + width: '360px', + height: '78px', + fontSize: '1em', + marginTop: '10px', + textAlign: 'center', + }, + }, [ + h('span.error', 'These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret.'), + ]), + + h('textarea.twelve-word-phrase', { + readOnly: true, + value: seed, + }), + + h('button.primary', { + onClick: () => this.confirmSeedWords(), + style: { + margin: '24px', + fontSize: '0.9em', + }, + }, 'I\'ve copied it somewhere safe'), + ]) + ) +} + +CreateVaultCompleteScreen.prototype.confirmSeedWords = function () { + this.props.dispatch(actions.confirmSeedWords()) +} diff --git a/ui/responsive/app/keychains/hd/recover-seed/confirmation.js b/ui/responsive/app/keychains/hd/recover-seed/confirmation.js new file mode 100644 index 000000000..4ccbec9fc --- /dev/null +++ b/ui/responsive/app/keychains/hd/recover-seed/confirmation.js @@ -0,0 +1,118 @@ +const inherits = require('util').inherits + +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('../../../actions') + +module.exports = connect(mapStateToProps)(RevealSeedConfirmation) + +inherits(RevealSeedConfirmation, Component) +function RevealSeedConfirmation () { + Component.call(this) +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +RevealSeedConfirmation.prototype.render = function () { + const props = this.props + + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', [ + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginBottom: 24, + width: '100%', + fontSize: '20px', + padding: 6, + }, + }, [ + 'Reveal Seed Words', + ]), + + h('.div', { + style: { + display: 'flex', + flexDirection: 'column', + padding: '20px', + justifyContent: 'center', + }, + }, [ + + h('h4', 'Do not recover your seed words in a public place! These words can be used to steal all your accounts.'), + + // confirmation + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box', + placeholder: 'Enter your password to confirm', + onKeyPress: this.checkConfirmation.bind(this), + style: { + width: 260, + marginTop: '12px', + }, + }), + + h('.flex-row.flex-space-between', { + style: { + marginTop: 30, + width: '50%', + }, + }, [ + // cancel + h('button.primary', { + onClick: this.goHome.bind(this), + }, 'CANCEL'), + + // submit + h('button.primary', { + onClick: this.revealSeedWords.bind(this), + }, 'OK'), + + ]), + + (props.warning) && ( + h('span.error', { + style: { + margin: '20px', + }, + }, props.warning.split('-')) + ), + + props.inProgress && ( + h('span.in-progress-notification', 'Generating Seed...') + ), + ]), + ]) + ) +} + +RevealSeedConfirmation.prototype.componentDidMount = function () { + document.getElementById('password-box').focus() +} + +RevealSeedConfirmation.prototype.goHome = function () { + this.props.dispatch(actions.showConfigPage(false)) +} + +// create vault + +RevealSeedConfirmation.prototype.checkConfirmation = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.revealSeedWords() + } +} + +RevealSeedConfirmation.prototype.revealSeedWords = function () { + var password = document.getElementById('password-box').value + this.props.dispatch(actions.requestRevealSeed(password)) +} diff --git a/ui/responsive/app/keychains/hd/restore-vault.js b/ui/responsive/app/keychains/hd/restore-vault.js new file mode 100644 index 000000000..06e51d9b3 --- /dev/null +++ b/ui/responsive/app/keychains/hd/restore-vault.js @@ -0,0 +1,152 @@ +const inherits = require('util').inherits +const PersistentForm = require('../../../lib/persistent-form') +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('../../actions') + +module.exports = connect(mapStateToProps)(RestoreVaultScreen) + +inherits(RestoreVaultScreen, PersistentForm) +function RestoreVaultScreen () { + PersistentForm.call(this) +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + forgottenPassword: state.appState.forgottenPassword, + } +} + +RestoreVaultScreen.prototype.render = function () { + var state = this.props + this.persistentFormParentId = 'restore-vault-form' + + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', [ + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginBottom: 24, + width: '100%', + fontSize: '20px', + padding: 6, + }, + }, [ + 'Restore Vault', + ]), + + // wallet seed entry + h('h3', 'Wallet Seed'), + h('textarea.twelve-word-phrase.letter-spacey', { + dataset: { + persistentFormId: 'wallet-seed', + }, + placeholder: 'Enter your secret twelve word phrase here to restore your vault.', + }), + + // password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box', + placeholder: 'New Password (min 8 chars)', + dataset: { + persistentFormId: 'password', + }, + style: { + width: 260, + marginTop: 12, + }, + }), + + // confirm password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box-confirm', + placeholder: 'Confirm Password', + onKeyPress: this.createOnEnter.bind(this), + dataset: { + persistentFormId: 'password-confirmation', + }, + style: { + width: 260, + marginTop: 16, + }, + }), + + (state.warning) && ( + h('span.error.in-progress-notification', state.warning) + ), + + // submit + + h('.flex-row.flex-space-between', { + style: { + marginTop: 30, + width: '50%', + }, + }, [ + + // cancel + h('button.primary', { + onClick: this.showInitializeMenu.bind(this), + }, 'CANCEL'), + + // submit + h('button.primary', { + onClick: this.createNewVaultAndRestore.bind(this), + }, 'OK'), + + ]), + ]) + + ) +} + +RestoreVaultScreen.prototype.showInitializeMenu = function () { + if (this.props.forgottenPassword) { + this.props.dispatch(actions.backToUnlockView()) + } else { + this.props.dispatch(actions.showInitializeMenu()) + } +} + +RestoreVaultScreen.prototype.createOnEnter = function (event) { + if (event.key === 'Enter') { + this.createNewVaultAndRestore() + } +} + +RestoreVaultScreen.prototype.createNewVaultAndRestore = function () { + // check password + var passwordBox = document.getElementById('password-box') + var password = passwordBox.value + var passwordConfirmBox = document.getElementById('password-box-confirm') + var passwordConfirm = passwordConfirmBox.value + if (password.length < 8) { + this.warning = 'Password not long enough' + + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + if (password !== passwordConfirm) { + this.warning = 'Passwords don\'t match' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + // check seed + var seedBox = document.querySelector('textarea.twelve-word-phrase') + var seed = seedBox.value.trim() + if (seed.split(' ').length !== 12) { + this.warning = 'seed phrases are 12 words long' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + // submit + this.warning = null + this.props.dispatch(actions.displayWarning(this.warning)) + this.props.dispatch(actions.createNewVaultAndRestore(password, seed)) +} diff --git a/ui/responsive/app/new-keychain.js b/ui/responsive/app/new-keychain.js new file mode 100644 index 000000000..cc9633166 --- /dev/null +++ b/ui/responsive/app/new-keychain.js @@ -0,0 +1,29 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(NewKeychain) + +function mapStateToProps (state) { + return {} +} + +inherits(NewKeychain, Component) +function NewKeychain () { + Component.call(this) +} + +NewKeychain.prototype.render = function () { + // const props = this.props + + return ( + h('div', { + style: { + background: 'blue', + }, + }, [ + h('h1', `Here's a list!!!!`), + ]) + ) +} diff --git a/ui/responsive/app/reducers.js b/ui/responsive/app/reducers.js new file mode 100644 index 000000000..11efca529 --- /dev/null +++ b/ui/responsive/app/reducers.js @@ -0,0 +1,52 @@ +const extend = require('xtend') + +// +// Sub-Reducers take in the complete state and return their sub-state +// +const reduceIdentities = require('./reducers/identities') +const reduceMetamask = require('./reducers/metamask') +const reduceApp = require('./reducers/app') + +window.METAMASK_CACHED_LOG_STATE = null + +module.exports = rootReducer + +function rootReducer (state, action) { + // clone + state = extend(state) + + if (action.type === 'GLOBAL_FORCE_UPDATE') { + return action.value + } + + // + // Identities + // + + state.identities = reduceIdentities(state, action) + + // + // MetaMask + // + + state.metamask = reduceMetamask(state, action) + + // + // AppState + // + + state.appState = reduceApp(state, action) + + window.METAMASK_CACHED_LOG_STATE = state + return state +} + +window.logState = function () { + var stateString = JSON.stringify(window.METAMASK_CACHED_LOG_STATE, removeSeedWords, 2) + console.log(stateString) + return stateString +} + +function removeSeedWords (key, value) { + return key === 'seedWords' ? undefined : value +} diff --git a/ui/responsive/app/reducers/app.js b/ui/responsive/app/reducers/app.js new file mode 100644 index 000000000..2fcc9bfe0 --- /dev/null +++ b/ui/responsive/app/reducers/app.js @@ -0,0 +1,585 @@ +const extend = require('xtend') +const actions = require('../actions') +const txHelper = require('../../lib/tx-helper') + +module.exports = reduceApp + + +function reduceApp (state, action) { + log.debug('App Reducer got ' + action.type) + // clone and defaults + const selectedAddress = state.metamask.selectedAddress + const hasUnconfActions = checkUnconfActions(state) + let name = 'accounts' + if (selectedAddress) { + name = 'accountDetail' + } + if (hasUnconfActions) { + log.debug('pending txs detected, defaulting to conf-tx view.') + name = 'confTx' + } + + var defaultView = { + name, + detailView: null, + context: selectedAddress, + } + + // confirm seed words + var seedWords = state.metamask.seedWords + var seedConfView = { + name: 'createVaultComplete', + seedWords, + } + + // default state + var appState = extend({ + shouldClose: false, + menuOpen: false, + currentView: seedWords ? seedConfView : defaultView, + accountDetail: { + subview: 'transactions', + }, + transForward: true, // Used to render transition direction + isLoading: false, // Used to display loading indicator + warning: null, // Used to display error text + }, state.appState) + + switch (action.type) { + + // transition methods + + case actions.TRANSITION_FORWARD: + return extend(appState, { + transForward: true, + }) + + case actions.TRANSITION_BACKWARD: + return extend(appState, { + transForward: false, + }) + + // intialize + + case actions.SHOW_CREATE_VAULT: + return extend(appState, { + currentView: { + name: 'createVault', + }, + transForward: true, + warning: null, + }) + + case actions.SHOW_RESTORE_VAULT: + return extend(appState, { + currentView: { + name: 'restoreVault', + }, + transForward: true, + forgottenPassword: true, + }) + + case actions.FORGOT_PASSWORD: + return extend(appState, { + currentView: { + name: 'restoreVault', + }, + transForward: false, + forgottenPassword: true, + }) + + case actions.SHOW_INIT_MENU: + return extend(appState, { + currentView: defaultView, + transForward: false, + }) + + case actions.SHOW_CONFIG_PAGE: + return extend(appState, { + currentView: { + name: 'config', + context: appState.currentView.context, + }, + transForward: action.value, + }) + + case actions.SHOW_ADD_TOKEN_PAGE: + return extend(appState, { + currentView: { + name: 'add-token', + context: appState.currentView.context, + }, + transForward: action.value, + }) + + case actions.SHOW_IMPORT_PAGE: + + return extend(appState, { + currentView: { + name: 'import-menu', + }, + transForward: true, + }) + + case actions.SHOW_INFO_PAGE: + return extend(appState, { + currentView: { + name: 'info', + context: appState.currentView.context, + }, + transForward: true, + }) + + case actions.CREATE_NEW_VAULT_IN_PROGRESS: + return extend(appState, { + currentView: { + name: 'createVault', + inProgress: true, + }, + transForward: true, + isLoading: true, + }) + + case actions.SHOW_NEW_VAULT_SEED: + return extend(appState, { + currentView: { + name: 'createVaultComplete', + seedWords: action.value, + }, + transForward: true, + isLoading: false, + }) + + case actions.NEW_ACCOUNT_SCREEN: + return extend(appState, { + currentView: { + name: 'new-account', + context: appState.currentView.context, + }, + transForward: true, + }) + + case actions.SHOW_SEND_PAGE: + return extend(appState, { + currentView: { + name: 'sendTransaction', + context: appState.currentView.context, + }, + transForward: true, + warning: null, + }) + + case actions.SHOW_NEW_KEYCHAIN: + return extend(appState, { + currentView: { + name: 'newKeychain', + context: appState.currentView.context, + }, + transForward: true, + }) + + // unlock + + case actions.UNLOCK_METAMASK: + return extend(appState, { + forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, + detailView: {}, + transForward: true, + isLoading: false, + warning: null, + }) + + case actions.LOCK_METAMASK: + return extend(appState, { + currentView: defaultView, + transForward: false, + warning: null, + }) + + case actions.BACK_TO_INIT_MENU: + return extend(appState, { + warning: null, + transForward: false, + forgottenPassword: true, + currentView: { + name: 'InitMenu', + }, + }) + + case actions.BACK_TO_UNLOCK_VIEW: + return extend(appState, { + warning: null, + transForward: true, + forgottenPassword: false, + currentView: { + name: 'UnlockScreen', + }, + }) + // reveal seed words + + case actions.REVEAL_SEED_CONFIRMATION: + return extend(appState, { + currentView: { + name: 'reveal-seed-conf', + }, + transForward: true, + warning: null, + }) + + // accounts + + case actions.SET_SELECTED_ACCOUNT: + return extend(appState, { + activeAddress: action.value, + }) + + case actions.GO_HOME: + return extend(appState, { + currentView: extend(appState.currentView, { + name: 'accountDetail', + }), + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + transForward: false, + warning: null, + }) + + case actions.SHOW_ACCOUNT_DETAIL: + return extend(appState, { + forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, + currentView: { + name: 'accountDetail', + context: action.value, + }, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + transForward: false, + }) + + case actions.BACK_TO_ACCOUNT_DETAIL: + return extend(appState, { + currentView: { + name: 'accountDetail', + context: action.value, + }, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + transForward: false, + }) + + case actions.SHOW_ACCOUNTS_PAGE: + return extend(appState, { + currentView: { + name: seedWords ? 'createVaultComplete' : 'accounts', + seedWords, + }, + transForward: true, + isLoading: false, + warning: null, + scrollToBottom: false, + forgottenPassword: false, + }) + + case actions.SHOW_NOTICE: + return extend(appState, { + transForward: true, + isLoading: false, + }) + + case actions.REVEAL_ACCOUNT: + return extend(appState, { + scrollToBottom: true, + }) + + case actions.SHOW_CONF_TX_PAGE: + return extend(appState, { + currentView: { + name: 'confTx', + context: 0, + }, + transForward: action.transForward, + warning: null, + isLoading: false, + }) + + case actions.SHOW_CONF_MSG_PAGE: + return extend(appState, { + currentView: { + name: hasUnconfActions ? 'confTx' : 'account-detail', + context: 0, + }, + transForward: true, + warning: null, + isLoading: false, + }) + + case actions.COMPLETED_TX: + log.debug('reducing COMPLETED_TX for tx ' + action.value) + const otherUnconfActions = getUnconfActionList(state) + .filter(tx => tx.id !== action.value) + const hasOtherUnconfActions = otherUnconfActions.length > 0 + + if (hasOtherUnconfActions) { + log.debug('reducer detected txs - rendering confTx view') + return extend(appState, { + transForward: false, + currentView: { + name: 'confTx', + context: 0, + }, + warning: null, + }) + } else { + log.debug('attempting to close popup') + return extend(appState, { + // indicate notification should close + shouldClose: true, + transForward: false, + warning: null, + currentView: { + name: 'accountDetail', + context: state.metamask.selectedAddress, + }, + accountDetail: { + subview: 'transactions', + }, + }) + } + + case actions.NEXT_TX: + return extend(appState, { + transForward: true, + currentView: { + name: 'confTx', + context: ++appState.currentView.context, + warning: null, + }, + }) + + case actions.VIEW_PENDING_TX: + const context = indexForPending(state, action.value) + return extend(appState, { + transForward: true, + currentView: { + name: 'confTx', + context, + warning: null, + }, + }) + + case actions.PREVIOUS_TX: + return extend(appState, { + transForward: false, + currentView: { + name: 'confTx', + context: --appState.currentView.context, + warning: null, + }, + }) + + case actions.TRANSACTION_ERROR: + return extend(appState, { + currentView: { + name: 'confTx', + errorMessage: 'There was a problem submitting this transaction.', + }, + }) + + case actions.UNLOCK_FAILED: + return extend(appState, { + warning: action.value || 'Incorrect password. Try again.', + }) + + case actions.SHOW_LOADING: + return extend(appState, { + isLoading: true, + loadingMessage: action.value, + }) + + case actions.HIDE_LOADING: + return extend(appState, { + isLoading: false, + }) + + case actions.SHOW_SUB_LOADING_INDICATION: + return extend(appState, { + isSubLoading: true, + }) + + case actions.HIDE_SUB_LOADING_INDICATION: + return extend(appState, { + isSubLoading: false, + }) + case actions.CLEAR_SEED_WORD_CACHE: + return extend(appState, { + transForward: true, + currentView: {}, + isLoading: false, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + }) + + case actions.DISPLAY_WARNING: + return extend(appState, { + warning: action.value, + isLoading: false, + }) + + case actions.HIDE_WARNING: + return extend(appState, { + warning: undefined, + }) + + case actions.REQUEST_ACCOUNT_EXPORT: + return extend(appState, { + transForward: true, + currentView: { + name: 'accountDetail', + context: appState.currentView.context, + }, + accountDetail: { + subview: 'export', + accountExport: 'requested', + }, + }) + + case actions.EXPORT_ACCOUNT: + return extend(appState, { + accountDetail: { + subview: 'export', + accountExport: 'completed', + }, + }) + + case actions.SHOW_PRIVATE_KEY: + return extend(appState, { + accountDetail: { + subview: 'export', + accountExport: 'completed', + privateKey: action.value, + }, + }) + + case actions.BUY_ETH_VIEW: + return extend(appState, { + transForward: true, + currentView: { + name: 'buyEth', + context: appState.currentView.name, + }, + identity: state.metamask.identities[action.value], + buyView: { + subview: 'Coinbase', + amount: '15.00', + buyAddress: action.value, + formView: { + coinbase: true, + shapeshift: false, + }, + }, + }) + + case actions.COINBASE_SUBVIEW: + return extend(appState, { + buyView: { + subview: 'Coinbase', + formView: { + coinbase: true, + shapeshift: false, + }, + buyAddress: appState.buyView.buyAddress, + amount: appState.buyView.amount, + }, + }) + + case actions.SHAPESHIFT_SUBVIEW: + return extend(appState, { + buyView: { + subview: 'ShapeShift', + formView: { + coinbase: false, + shapeshift: true, + marketinfo: action.value.marketinfo, + coinOptions: action.value.coinOptions, + }, + buyAddress: appState.buyView.buyAddress, + amount: appState.buyView.amount, + }, + }) + + case actions.PAIR_UPDATE: + return extend(appState, { + buyView: { + subview: 'ShapeShift', + formView: { + coinbase: false, + shapeshift: true, + marketinfo: action.value.marketinfo, + coinOptions: appState.buyView.formView.coinOptions, + }, + buyAddress: appState.buyView.buyAddress, + amount: appState.buyView.amount, + warning: null, + }, + }) + + case actions.SHOW_QR: + return extend(appState, { + qrRequested: true, + transForward: true, + + Qr: { + message: action.value.message, + data: action.value.data, + }, + }) + + case actions.SHOW_QR_VIEW: + return extend(appState, { + currentView: { + name: 'qr', + context: appState.currentView.context, + }, + transForward: true, + Qr: { + message: action.value.message, + data: action.value.data, + }, + }) + default: + return appState + } +} + +function checkUnconfActions (state) { + const unconfActionList = getUnconfActionList(state) + const hasUnconfActions = unconfActionList.length > 0 + return hasUnconfActions +} + +function getUnconfActionList (state) { + const { unapprovedTxs, unapprovedMsgs, + unapprovedPersonalMsgs, network } = state.metamask + + const unconfActionList = txHelper(unapprovedTxs, unapprovedMsgs, unapprovedPersonalMsgs, network) + return unconfActionList +} + +function indexForPending (state, txId) { + const unconfTxList = getUnconfActionList(state) + const match = unconfTxList.find((tx) => tx.id === txId) + const index = unconfTxList.indexOf(match) + return index +} diff --git a/ui/responsive/app/reducers/identities.js b/ui/responsive/app/reducers/identities.js new file mode 100644 index 000000000..341a404e7 --- /dev/null +++ b/ui/responsive/app/reducers/identities.js @@ -0,0 +1,15 @@ +const extend = require('xtend') + +module.exports = reduceIdentities + +function reduceIdentities (state, action) { + // clone + defaults + var idState = extend({ + + }, state.identities) + + switch (action.type) { + default: + return idState + } +} diff --git a/ui/responsive/app/reducers/metamask.js b/ui/responsive/app/reducers/metamask.js new file mode 100644 index 000000000..e0c416c2d --- /dev/null +++ b/ui/responsive/app/reducers/metamask.js @@ -0,0 +1,137 @@ +const extend = require('xtend') +const actions = require('../actions') + +module.exports = reduceMetamask + +function reduceMetamask (state, action) { + let newState + + // clone + defaults + var metamaskState = extend({ + isInitialized: false, + isUnlocked: false, + rpcTarget: 'https://rawtestrpc.metamask.io/', + identities: {}, + unapprovedTxs: {}, + noActiveNotices: true, + lastUnreadNotice: undefined, + frequentRpcList: [], + addressBook: [], + }, state.metamask) + + switch (action.type) { + + case actions.SHOW_ACCOUNTS_PAGE: + newState = extend(metamaskState) + delete newState.seedWords + return newState + + case actions.SHOW_NOTICE: + return extend(metamaskState, { + noActiveNotices: false, + lastUnreadNotice: action.value, + }) + + case actions.CLEAR_NOTICES: + return extend(metamaskState, { + noActiveNotices: true, + }) + + case actions.UPDATE_METAMASK_STATE: + return extend(metamaskState, action.value) + + case actions.UNLOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAddress: action.value, + }) + + case actions.LOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: false, + }) + + case actions.SET_RPC_LIST: + return extend(metamaskState, { + frequentRpcList: action.value, + }) + + case actions.SET_RPC_TARGET: + return extend(metamaskState, { + provider: { + type: 'rpc', + rpcTarget: action.value, + }, + }) + + case actions.SET_PROVIDER_TYPE: + return extend(metamaskState, { + provider: { + type: action.value, + }, + }) + + case actions.COMPLETED_TX: + var stringId = String(action.id) + newState = extend(metamaskState, { + unapprovedTxs: {}, + unapprovedMsgs: {}, + }) + for (const id in metamaskState.unapprovedTxs) { + if (id !== stringId) { + newState.unapprovedTxs[id] = metamaskState.unapprovedTxs[id] + } + } + for (const id in metamaskState.unapprovedMsgs) { + if (id !== stringId) { + newState.unapprovedMsgs[id] = metamaskState.unapprovedMsgs[id] + } + } + return newState + + case actions.SHOW_NEW_VAULT_SEED: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: false, + seedWords: action.value, + }) + + case actions.CLEAR_SEED_WORD_CACHE: + newState = extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAddress: action.value, + }) + delete newState.seedWords + return newState + + case actions.SHOW_ACCOUNT_DETAIL: + newState = extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAddress: action.value, + }) + delete newState.seedWords + return newState + + case actions.SAVE_ACCOUNT_LABEL: + const account = action.value.account + const name = action.value.label + var id = {} + id[account] = extend(metamaskState.identities[account], { name }) + var identities = extend(metamaskState.identities, id) + return extend(metamaskState, { identities }) + + case actions.SET_CURRENT_FIAT: + return extend(metamaskState, { + currentCurrency: action.value.currentCurrency, + conversionRate: action.value.conversionRate, + conversionDate: action.value.conversionDate, + }) + + default: + return metamaskState + + } +} diff --git a/ui/responsive/app/root.js b/ui/responsive/app/root.js new file mode 100644 index 000000000..9e7314b20 --- /dev/null +++ b/ui/responsive/app/root.js @@ -0,0 +1,22 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const Provider = require('react-redux').Provider +const h = require('react-hyperscript') +const App = require('./app') + +module.exports = Root + +inherits(Root, Component) +function Root () { Component.call(this) } + +Root.prototype.render = function () { + return ( + + h(Provider, { + store: this.props.store, + }, [ + h(App), + ]) + + ) +} diff --git a/ui/responsive/app/send.js b/ui/responsive/app/send.js new file mode 100644 index 000000000..a21a219eb --- /dev/null +++ b/ui/responsive/app/send.js @@ -0,0 +1,288 @@ +const inherits = require('util').inherits +const PersistentForm = require('../lib/persistent-form') +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const Identicon = require('./components/identicon') +const actions = require('./actions') +const util = require('./util') +const numericBalance = require('./util').numericBalance +const addressSummary = require('./util').addressSummary +const isHex = require('./util').isHex +const EthBalance = require('./components/eth-balance') +const EnsInput = require('./components/ens-input') +const ethUtil = require('ethereumjs-util') +module.exports = connect(mapStateToProps)(SendTransactionScreen) + +function mapStateToProps (state) { + var result = { + address: state.metamask.selectedAddress, + accounts: state.metamask.accounts, + identities: state.metamask.identities, + warning: state.appState.warning, + network: state.metamask.network, + addressBook: state.metamask.addressBook, + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + } + + result.error = result.warning && result.warning.split('.')[0] + + result.account = result.accounts[result.address] + result.identity = result.identities[result.address] + result.balance = result.account ? numericBalance(result.account.balance) : null + + return result +} + +inherits(SendTransactionScreen, PersistentForm) +function SendTransactionScreen () { + PersistentForm.call(this) +} + +SendTransactionScreen.prototype.render = function () { + this.persistentFormParentId = 'send-tx-form' + + const props = this.props + const { + address, + account, + identity, + network, + identities, + addressBook, + conversionRate, + currentCurrency, + } = props + + return ( + + h('.send-screen.flex-column.flex-grow', [ + + // + // Sender Profile + // + + h('.account-data-subsection.flex-row.flex-grow', { + style: { + margin: '0 20px', + }, + }, [ + + // header - identicon + nav + h('.flex-row.flex-space-between', { + style: { + marginTop: '15px', + }, + }, [ + // back button + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', { + onClick: this.back.bind(this), + }), + + // large identicon + h('.identicon-wrapper.flex-column.flex-center.select-none', [ + h(Identicon, { + diameter: 62, + address: address, + }), + ]), + + // invisible place holder + h('i.fa.fa-users.fa-lg.invisible', { + style: { + marginTop: '28px', + }, + }), + + ]), + + // account label + + h('.flex-column', { + style: { + marginTop: '10px', + alignItems: 'flex-start', + }, + }, [ + h('h2.font-medium.color-forest.flex-center', { + style: { + paddingTop: '8px', + marginBottom: '8px', + }, + }, identity && identity.name), + + // address and getter actions + h('.flex-row.flex-center', { + style: { + marginBottom: '8px', + }, + }, [ + + h('div', { + style: { + lineHeight: '16px', + }, + }, addressSummary(address)), + + ]), + + // balance + h('.flex-row.flex-center', [ + + h(EthBalance, { + value: account && account.balance, + conversionRate, + currentCurrency, + }), + + ]), + ]), + ]), + + // + // Required Fields + // + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginTop: '15px', + marginBottom: '16px', + }, + }, [ + 'Send Transaction', + ]), + + // error message + props.error && h('span.error.flex-center', props.error), + + // 'to' field + h('section.flex-row.flex-center', [ + h(EnsInput, { + name: 'address', + placeholder: 'Recipient Address', + onChange: this.recipientDidChange.bind(this), + network, + identities, + addressBook, + }), + ]), + + // 'amount' and send button + h('section.flex-row.flex-center', [ + + h('input.large-input', { + name: 'amount', + placeholder: 'Amount', + type: 'number', + style: { + marginRight: '6px', + }, + dataset: { + persistentFormId: 'tx-amount', + }, + }), + + h('button.primary', { + onClick: this.onSubmit.bind(this), + style: { + textTransform: 'uppercase', + }, + }, 'Next'), + + ]), + + // + // Optional Fields + // + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginTop: '16px', + marginBottom: '16px', + }, + }, [ + 'Transaction Data (optional)', + ]), + + // 'data' field + h('section.flex-column.flex-center', [ + h('input.large-input', { + name: 'txData', + placeholder: '0x01234', + style: { + width: '100%', + resize: 'none', + }, + dataset: { + persistentFormId: 'tx-data', + }, + }), + ]), + ]) + ) +} + +SendTransactionScreen.prototype.navigateToAccounts = function (event) { + event.stopPropagation() + this.props.dispatch(actions.showAccountsPage()) +} + +SendTransactionScreen.prototype.back = function () { + var address = this.props.address + this.props.dispatch(actions.backToAccountDetail(address)) +} + +SendTransactionScreen.prototype.recipientDidChange = function (recipient, nickname) { + this.setState({ + recipient: recipient, + nickname: nickname, + }) +} + +SendTransactionScreen.prototype.onSubmit = function () { + const state = this.state || {} + const recipient = state.recipient || document.querySelector('input[name="address"]').value.replace(/^[.\s]+|[.\s]+$/g, '') + const nickname = state.nickname || ' ' + const input = document.querySelector('input[name="amount"]').value + const value = util.normalizeEthStringToWei(input) + const txData = document.querySelector('input[name="txData"]').value + const balance = this.props.balance + let message + + if (value.gt(balance)) { + message = 'Insufficient funds.' + return this.props.dispatch(actions.displayWarning(message)) + } + + if (input < 0) { + message = 'Can not send negative amounts of ETH.' + return this.props.dispatch(actions.displayWarning(message)) + } + + if ((!util.isValidAddress(recipient) && !txData) || (!recipient && !txData)) { + message = 'Recipient address is invalid.' + return this.props.dispatch(actions.displayWarning(message)) + } + + if (!isHex(ethUtil.stripHexPrefix(txData)) && txData) { + message = 'Transaction data must be hex string.' + return this.props.dispatch(actions.displayWarning(message)) + } + + this.props.dispatch(actions.hideWarning()) + + this.props.dispatch(actions.addToAddressBook(recipient, nickname)) + + var txParams = { + from: this.props.address, + value: '0x' + value.toString(16), + } + + if (recipient) txParams.to = ethUtil.addHexPrefix(recipient) + if (txData) txParams.data = txData + + this.props.dispatch(actions.signTx(txParams)) +} diff --git a/ui/responsive/app/settings.js b/ui/responsive/app/settings.js new file mode 100644 index 000000000..454cc95e0 --- /dev/null +++ b/ui/responsive/app/settings.js @@ -0,0 +1,59 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('./actions') + +module.exports = connect(mapStateToProps)(AppSettingsPage) + +function mapStateToProps (state) { + return {} +} + +inherits(AppSettingsPage, Component) +function AppSettingsPage () { + Component.call(this) +} + +AppSettingsPage.prototype.render = function () { + return ( + + h('.account-detail-section.flex-column.flex-grow', [ + + // subtitle and nav + h('.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: this.navigateToAccounts.bind(this), + }), + h('h2.page-subtitle', 'Settings'), + ]), + + h('label', { + htmlFor: 'settings-rpc-endpoint', + }, 'RPC Endpoint:'), + h('input', { + type: 'url', + id: 'settings-rpc-endpoint', + onKeyPress: this.onKeyPress.bind(this), + }), + + ]) + + ) +} + +AppSettingsPage.prototype.componentDidMount = function () { + document.querySelector('input').focus() +} + +AppSettingsPage.prototype.onKeyPress = function (event) { + // get submit event + if (event.key === 'Enter') { + // this.submitPassword(event) + } +} + +AppSettingsPage.prototype.navigateToAccounts = function (event) { + event.stopPropagation() + this.props.dispatch(actions.showAccountsPage()) +} diff --git a/ui/responsive/app/store.js b/ui/responsive/app/store.js new file mode 100644 index 000000000..ba9e58b49 --- /dev/null +++ b/ui/responsive/app/store.js @@ -0,0 +1,21 @@ +const createStore = require('redux').createStore +const applyMiddleware = require('redux').applyMiddleware +const thunkMiddleware = require('redux-thunk') +const rootReducer = require('./reducers') +const createLogger = require('redux-logger') + +global.METAMASK_DEBUG = 'GULP_METAMASK_DEBUG' + +module.exports = configureStore + +const loggerMiddleware = createLogger({ + predicate: () => global.METAMASK_DEBUG, +}) + +const middlewares = [thunkMiddleware, loggerMiddleware] + +const createStoreWithMiddleware = applyMiddleware(...middlewares)(createStore) + +function configureStore (initialState) { + return createStoreWithMiddleware(rootReducer, initialState) +} diff --git a/ui/responsive/app/template.js b/ui/responsive/app/template.js new file mode 100644 index 000000000..d15b30fd2 --- /dev/null +++ b/ui/responsive/app/template.js @@ -0,0 +1,30 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(COMPONENTNAME) + +function mapStateToProps (state) { + return {} +} + +inherits(COMPONENTNAME, Component) +function COMPONENTNAME () { + Component.call(this) +} + +COMPONENTNAME.prototype.render = function () { + const props = this.props + + return ( + h('div', { + style: { + background: 'blue', + }, + }, [ + `Hello, ${props.sender}`, + ]) + ) +} + diff --git a/ui/responsive/app/unlock.js b/ui/responsive/app/unlock.js new file mode 100644 index 000000000..1aee3c5d0 --- /dev/null +++ b/ui/responsive/app/unlock.js @@ -0,0 +1,118 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('./actions') +const getCaretCoordinates = require('textarea-caret') +const EventEmitter = require('events').EventEmitter + +const Mascot = require('./components/mascot') + +module.exports = connect(mapStateToProps)(UnlockScreen) + +inherits(UnlockScreen, Component) +function UnlockScreen () { + Component.call(this) + this.animationEventEmitter = new EventEmitter() +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +UnlockScreen.prototype.render = function () { + const state = this.props + const warning = state.warning + return ( + h('.flex-column', [ + h('.unlock-screen.flex-column.flex-center.flex-grow', [ + + h(Mascot, { + animationEventEmitter: this.animationEventEmitter, + }), + + h('h1', { + style: { + fontSize: '1.4em', + textTransform: 'uppercase', + color: '#7F8082', + }, + }, 'MetaMask'), + + h('input.large-input', { + type: 'password', + id: 'password-box', + placeholder: 'enter password', + style: { + + }, + onKeyPress: this.onKeyPress.bind(this), + onInput: this.inputChanged.bind(this), + }), + + h('.error', { + style: { + display: warning ? 'block' : 'none', + padding: '0 20px', + textAlign: 'center', + }, + }, warning), + + h('button.primary.cursor-pointer', { + onClick: this.onSubmit.bind(this), + style: { + margin: 10, + }, + }, 'Unlock'), + ]), + + h('.flex-row.flex-center.flex-grow', [ + h('p.pointer', { + onClick: () => this.props.dispatch(actions.forgotPassword()), + style: { + fontSize: '0.8em', + color: 'rgb(247, 134, 28)', + textDecoration: 'underline', + }, + }, 'I forgot my password.'), + ]), + ]) + ) +} + +UnlockScreen.prototype.componentDidMount = function () { + document.getElementById('password-box').focus() +} + +UnlockScreen.prototype.onSubmit = function (event) { + const input = document.getElementById('password-box') + const password = input.value + this.props.dispatch(actions.tryUnlockMetamask(password)) +} + +UnlockScreen.prototype.onKeyPress = function (event) { + if (event.key === 'Enter') { + this.submitPassword(event) + } +} + +UnlockScreen.prototype.submitPassword = function (event) { + var element = event.target + var password = element.value + // reset input + element.value = '' + this.props.dispatch(actions.tryUnlockMetamask(password)) +} + +UnlockScreen.prototype.inputChanged = function (event) { + // tell mascot to look at page action + var element = event.target + var boundingRect = element.getBoundingClientRect() + var coordinates = getCaretCoordinates(element, element.selectionEnd) + this.animationEventEmitter.emit('point', { + x: boundingRect.left + coordinates.left - element.scrollLeft, + y: boundingRect.top + coordinates.top - element.scrollTop, + }) +} diff --git a/ui/responsive/app/util.js b/ui/responsive/app/util.js new file mode 100644 index 000000000..ac3f42c6b --- /dev/null +++ b/ui/responsive/app/util.js @@ -0,0 +1,217 @@ +const ethUtil = require('ethereumjs-util') + +var valueTable = { + wei: '1000000000000000000', + kwei: '1000000000000000', + mwei: '1000000000000', + gwei: '1000000000', + szabo: '1000000', + finney: '1000', + ether: '1', + kether: '0.001', + mether: '0.000001', + gether: '0.000000001', + tether: '0.000000000001', +} +var bnTable = {} +for (var currency in valueTable) { + bnTable[currency] = new ethUtil.BN(valueTable[currency], 10) +} + +module.exports = { + valuesFor: valuesFor, + addressSummary: addressSummary, + miniAddressSummary: miniAddressSummary, + isAllOneCase: isAllOneCase, + isValidAddress: isValidAddress, + numericBalance: numericBalance, + parseBalance: parseBalance, + formatBalance: formatBalance, + generateBalanceObject: generateBalanceObject, + dataSize: dataSize, + readableDate: readableDate, + normalizeToWei: normalizeToWei, + normalizeEthStringToWei: normalizeEthStringToWei, + normalizeNumberToWei: normalizeNumberToWei, + valueTable: valueTable, + bnTable: bnTable, + isHex: isHex, +} + +function valuesFor (obj) { + if (!obj) return [] + return Object.keys(obj) + .map(function (key) { return obj[key] }) +} + +function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includeHex = true) { + if (!address) return '' + let checked = ethUtil.toChecksumAddress(address) + if (!includeHex) { + checked = ethUtil.stripHexPrefix(checked) + } + return checked ? checked.slice(0, firstSegLength) + '...' + checked.slice(checked.length - lastSegLength) : '...' +} + +function miniAddressSummary (address) { + if (!address) return '' + var checked = ethUtil.toChecksumAddress(address) + return checked ? checked.slice(0, 4) + '...' + checked.slice(-4) : '...' +} + +function isValidAddress (address) { + var prefixed = ethUtil.addHexPrefix(address) + if (address === '0x0000000000000000000000000000000000000000') return false + return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) +} + +function isAllOneCase (address) { + if (!address) return true + var lower = address.toLowerCase() + var upper = address.toUpperCase() + return address === lower || address === upper +} + +// Takes wei Hex, returns wei BN, even if input is null +function numericBalance (balance) { + if (!balance) return new ethUtil.BN(0, 16) + var stripped = ethUtil.stripHexPrefix(balance) + return new ethUtil.BN(stripped, 16) +} + +// Takes hex, returns [beforeDecimal, afterDecimal] +function parseBalance (balance) { + var beforeDecimal, afterDecimal + const wei = numericBalance(balance) + var weiString = wei.toString() + const trailingZeros = /0+$/ + + beforeDecimal = weiString.length > 18 ? weiString.slice(0, weiString.length - 18) : '0' + afterDecimal = ('000000000000000000' + wei).slice(-18).replace(trailingZeros, '') + if (afterDecimal === '') { afterDecimal = '0' } + return [beforeDecimal, afterDecimal] +} + +// Takes wei hex, returns an object with three properties. +// Its "formatted" property is what we generally use to render values. +function formatBalance (balance, decimalsToKeep, needsParse = true) { + var parsed = needsParse ? parseBalance(balance) : balance.split('.') + var beforeDecimal = parsed[0] + var afterDecimal = parsed[1] + var formatted = 'None' + if (decimalsToKeep === undefined) { + if (beforeDecimal === '0') { + if (afterDecimal !== '0') { + var sigFigs = afterDecimal.match(/^0*(.{2})/) // default: grabs 2 most significant digits + if (sigFigs) { afterDecimal = sigFigs[0] } + formatted = '0.' + afterDecimal + ' ETH' + } + } else { + formatted = beforeDecimal + '.' + afterDecimal.slice(0, 3) + ' ETH' + } + } else { + afterDecimal += Array(decimalsToKeep).join('0') + formatted = beforeDecimal + '.' + afterDecimal.slice(0, decimalsToKeep) + ' ETH' + } + return formatted +} + + +function generateBalanceObject (formattedBalance, decimalsToKeep = 1) { + var balance = formattedBalance.split(' ')[0] + var label = formattedBalance.split(' ')[1] + var beforeDecimal = balance.split('.')[0] + var afterDecimal = balance.split('.')[1] + var shortBalance = shortenBalance(balance, decimalsToKeep) + + if (beforeDecimal === '0' && afterDecimal.substr(0, 5) === '00000') { + // eslint-disable-next-line eqeqeq + if (afterDecimal == 0) { + balance = '0' + } else { + balance = '<1.0e-5' + } + } else if (beforeDecimal !== '0') { + balance = `${beforeDecimal}.${afterDecimal.slice(0, decimalsToKeep)}` + } + + return { balance, label, shortBalance } +} + +function shortenBalance (balance, decimalsToKeep = 1) { + var truncatedValue + var convertedBalance = parseFloat(balance) + if (convertedBalance > 1000000) { + truncatedValue = (balance / 1000000).toFixed(decimalsToKeep) + return `${truncatedValue}m` + } else if (convertedBalance > 1000) { + truncatedValue = (balance / 1000).toFixed(decimalsToKeep) + return `${truncatedValue}k` + } else if (convertedBalance === 0) { + return '0' + } else if (convertedBalance < 0.001) { + return '<0.001' + } else if (convertedBalance < 1) { + var stringBalance = convertedBalance.toString() + if (stringBalance.split('.')[1].length > 3) { + return convertedBalance.toFixed(3) + } else { + return stringBalance + } + } else { + return convertedBalance.toFixed(decimalsToKeep) + } +} + +function dataSize (data) { + var size = data ? ethUtil.stripHexPrefix(data).length : 0 + return size + ' bytes' +} + +// Takes a BN and an ethereum currency name, +// returns a BN in wei +function normalizeToWei (amount, currency) { + try { + return amount.mul(bnTable.wei).div(bnTable[currency]) + } catch (e) {} + return amount +} + +function normalizeEthStringToWei (str) { + const parts = str.split('.') + let eth = new ethUtil.BN(parts[0], 10).mul(bnTable.wei) + if (parts[1]) { + var decimal = parts[1] + while (decimal.length < 18) { + decimal += '0' + } + const decimalBN = new ethUtil.BN(decimal, 10) + eth = eth.add(decimalBN) + } + return eth +} + +var multiple = new ethUtil.BN('10000', 10) +function normalizeNumberToWei (n, currency) { + var enlarged = n * 10000 + var amount = new ethUtil.BN(String(enlarged), 10) + return normalizeToWei(amount, currency).div(multiple) +} + +function readableDate (ms) { + var date = new Date(ms) + var month = date.getMonth() + var day = date.getDate() + var year = date.getFullYear() + var hours = date.getHours() + var minutes = '0' + date.getMinutes() + var seconds = '0' + date.getSeconds() + + var dateStr = `${month}/${day}/${year}` + var time = `${hours}:${minutes.substr(-2)}:${seconds.substr(-2)}` + return `${dateStr} ${time}` +} + +function isHex (str) { + return Boolean(str.match(/^(0x)?[0-9a-fA-F]+$/)) +} diff --git a/ui/responsive/css.js b/ui/responsive/css.js new file mode 100644 index 000000000..7c394a87b --- /dev/null +++ b/ui/responsive/css.js @@ -0,0 +1,29 @@ +const fs = require('fs') +const path = require('path') + +module.exports = bundleCss + +var cssFiles = { + 'fonts.css': fs.readFileSync(path.join(__dirname, '/app/css/fonts.css'), 'utf8'), + 'reset.css': fs.readFileSync(path.join(__dirname, '/app/css/reset.css'), 'utf8'), + 'lib.css': fs.readFileSync(path.join(__dirname, '/app/css/lib.css'), 'utf8'), + 'index.css': fs.readFileSync(path.join(__dirname, '/app/css/index.css'), 'utf8'), + 'transitions.css': fs.readFileSync(path.join(__dirname, '/app/css/transitions.css'), 'utf8'), + 'react-tooltip-component.css': fs.readFileSync(path.join(__dirname, '..', '..', 'node_modules', 'react-tooltip-component', 'dist', 'react-tooltip-component.css'), 'utf8'), + 'react-css': fs.readFileSync(path.join(__dirname, '..', '..', 'node_modules', 'react-select', 'dist', 'react-select.css'), 'utf8'), +} + +function bundleCss () { + var cssBundle = Object.keys(cssFiles).reduce(function (bundle, fileName) { + var fileContent = cssFiles[fileName] + var output = String() + + output += '/*========== ' + fileName + ' ==========*/\n\n' + output += fileContent + output += '\n\n' + + return bundle + output + }, String()) + + return cssBundle +} diff --git a/ui/responsive/design/00-metamask-SignIn.jpg b/ui/responsive/design/00-metamask-SignIn.jpg Binary files differnew file mode 100644 index 000000000..2becdb032 --- /dev/null +++ b/ui/responsive/design/00-metamask-SignIn.jpg diff --git a/ui/responsive/design/01-metamask-SelectAcc.jpg b/ui/responsive/design/01-metamask-SelectAcc.jpg Binary files differnew file mode 100644 index 000000000..239091a98 --- /dev/null +++ b/ui/responsive/design/01-metamask-SelectAcc.jpg diff --git a/ui/responsive/design/02-metamask-AccDetails.jpg b/ui/responsive/design/02-metamask-AccDetails.jpg Binary files differnew file mode 100644 index 000000000..d7d408ffc --- /dev/null +++ b/ui/responsive/design/02-metamask-AccDetails.jpg diff --git a/ui/responsive/design/02a-metamask-AccDetails-OverToken.jpg b/ui/responsive/design/02a-metamask-AccDetails-OverToken.jpg Binary files differnew file mode 100644 index 000000000..f26ff31e8 --- /dev/null +++ b/ui/responsive/design/02a-metamask-AccDetails-OverToken.jpg diff --git a/ui/responsive/design/02a-metamask-AccDetails-OverTransaction.jpg b/ui/responsive/design/02a-metamask-AccDetails-OverTransaction.jpg Binary files differnew file mode 100644 index 000000000..8a06be6b9 --- /dev/null +++ b/ui/responsive/design/02a-metamask-AccDetails-OverTransaction.jpg diff --git a/ui/responsive/design/02a-metamask-AccDetails.jpg b/ui/responsive/design/02a-metamask-AccDetails.jpg Binary files differnew file mode 100644 index 000000000..c37e0f539 --- /dev/null +++ b/ui/responsive/design/02a-metamask-AccDetails.jpg diff --git a/ui/responsive/design/02b-metamask-AccDetails-Send.jpg b/ui/responsive/design/02b-metamask-AccDetails-Send.jpg Binary files differnew file mode 100644 index 000000000..10f2d27fd --- /dev/null +++ b/ui/responsive/design/02b-metamask-AccDetails-Send.jpg diff --git a/ui/responsive/design/03-metamask-Qr.jpg b/ui/responsive/design/03-metamask-Qr.jpg Binary files differnew file mode 100644 index 000000000..9c09de42f --- /dev/null +++ b/ui/responsive/design/03-metamask-Qr.jpg diff --git a/ui/responsive/design/05-metamask-Menu.jpg b/ui/responsive/design/05-metamask-Menu.jpg Binary files differnew file mode 100644 index 000000000..0a43d7b2a --- /dev/null +++ b/ui/responsive/design/05-metamask-Menu.jpg diff --git a/ui/responsive/design/chromeStorePics/final_screen_dao_accounts.png b/ui/responsive/design/chromeStorePics/final_screen_dao_accounts.png Binary files differnew file mode 100644 index 000000000..805cc96b6 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/final_screen_dao_accounts.png diff --git a/ui/responsive/design/chromeStorePics/final_screen_dao_locked.png b/ui/responsive/design/chromeStorePics/final_screen_dao_locked.png Binary files differnew file mode 100644 index 000000000..9d9e33930 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/final_screen_dao_locked.png diff --git a/ui/responsive/design/chromeStorePics/final_screen_dao_notification.png b/ui/responsive/design/chromeStorePics/final_screen_dao_notification.png Binary files differnew file mode 100644 index 000000000..d56a5ce62 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/final_screen_dao_notification.png diff --git a/ui/responsive/design/chromeStorePics/final_screen_wei_account.png b/ui/responsive/design/chromeStorePics/final_screen_wei_account.png Binary files differnew file mode 100644 index 000000000..d503ff301 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/final_screen_wei_account.png diff --git a/ui/responsive/design/chromeStorePics/final_screen_wei_notification.png b/ui/responsive/design/chromeStorePics/final_screen_wei_notification.png Binary files differnew file mode 100644 index 000000000..3560c51ff --- /dev/null +++ b/ui/responsive/design/chromeStorePics/final_screen_wei_notification.png diff --git a/ui/responsive/design/chromeStorePics/icon-128.png b/ui/responsive/design/chromeStorePics/icon-128.png Binary files differnew file mode 100644 index 000000000..ae687147d --- /dev/null +++ b/ui/responsive/design/chromeStorePics/icon-128.png diff --git a/ui/responsive/design/chromeStorePics/icon-64.png b/ui/responsive/design/chromeStorePics/icon-64.png Binary files differnew file mode 100644 index 000000000..7062cf4f1 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/icon-64.png diff --git a/ui/responsive/design/chromeStorePics/metamask_icon.ai b/ui/responsive/design/chromeStorePics/metamask_icon.ai new file mode 100644 index 000000000..27400c5a4 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/metamask_icon.ai @@ -0,0 +1,2383 @@ +%PDF-1.5
%����
+1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 47428/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c111 79.158366, 2015/09/25-01:12:00 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/" + xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> + <dc:format>application/pdf</dc:format> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">metamask_icon</rdf:li> + </rdf:Alt> + </dc:title> + <xmp:CreatorTool>Adobe Illustrator CC 2015 (Macintosh)</xmp:CreatorTool> + <xmp:CreateDate>2016-06-15T14:23:12-04:00</xmp:CreateDate> + <xmp:ModifyDate>2016-06-15T14:23:12-04:00</xmp:ModifyDate> + <xmp:MetadataDate>2016-06-15T14:23:12-04:00</xmp:MetadataDate> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:width>240</xmpGImg:width> + <xmpGImg:height>256</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADwAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXnP5r/mvB5Tg/RmnAT6/cJyUMKx28bVAkf+ZjT4U+k7UDYuo1HBsObl6bTce5+l5X+Wf5t6jonm
KZtfu5rzTNVcG+lkZpHilACLOAamgUBWC/sgUrxAzEwakxl6uRczUaYSj6eYfS9vcQXEEdxA6ywT
KskUimqsjCqsCOoIObUG3UkUvxQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXln5rfnHb+X1l0bQnWfXCCs0+zR2tfEGoaTwXoO/hmJqNTw7Dm5mm0plvL6fvfO
U889xPJcXEjTTzM0ksshLO7saszMdySTUk5qybdsBSzAl7R+Rv5ni0dPKutTqto5ppNw/KqyOwH1
c0BHFuVVJpTpvUUz9Jnr0n4Ov1mnv1D4ve82LrHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FUn1Pzl5W0yF5r3VLeNI9no4kYfNU5N+GY89XijsZC/mfkHIhpMstxE18h8ynCmqg7iorQ7HMhx
3Yq7FXYq7FXYq7FXjf5v/nG2nPL5e8tXAN9Ro9Rv039A7D04WBp6nUM1Ph7fFXjg6nU16Y83P0ul
v1S5PAWZmYsxJYmpJ3JJzWu0axV2KuxV9Ifkr+Zq67py6FrF1y121+G3eUjlcwKtQeRPxyIAeXci
jbnkc2mlz8Qo83U6vT8J4h9L1PMxwnYq7FXYq7FXYq7FXYq7FXYq7FXYqlN95s8t2I/0jUYQQaFE
b1HHzWPk34Zi5Nbhh9Uh9/3OVi0Waf0xP3fex7UfzX0WEOtjBNdSCoR2AjjPgak8/wDhcwcvbWIf
SDL7B+v7HOxdi5T9REftP6vtYre/mf5ouD+5eK0UdoowxPzMnqfhmsydsZpcqj7h+u3aY+x8Eedy
95/VTFdc803n1dptVv5powSVjeRmqx7IhNMxPEy5jRJPx2cwY8WEWAB8N0l8gRXnm/z/AKXazpXT
7WX65NCo5II4PjHqVrXk3FDX+btXNtodLETDqddqiYH7H1LnQPOuxV2KuxV2KuZlVSzEBQKknYAD
FXhX5t/nOsyzaB5XuCEDBbzVoXZSSrA8Ld0I2qKM/foNt81+o1X8Mfm7LTaT+KXyeI5r3YuxV2Ku
xV2KqtpdXNpdQ3VrI0NzA6yQyoaMroaqwPiCMINboIsUX1j+XH5g6f5w0WOcNHDq0I439irbqwoD
IiklvTaux7dK1GbnBmEx5ukz4DjPky3Lmh2KuxV2KuxV2KuxVKb/AM2eW7CoudQhDA0KI3qMD7rH
yYZjZdbhh9Uh9/3OVi0Waf0xP3fex6//ADY0OHktnbzXTKaKxpFGw8QTyb/hcwMnbWIfSDL7B+Pg
5+PsXKa4iI/afx8WO3/5ra9OJEtYIbVG2RqNJIo/1iQv/C5gZe2sp+kCP2n8fBz8XYuIVxEy+wfj
4sVvdY1a+FLy8muFBLBZJGZQT4KTQZrMmfJP6pE/F2ePBjh9MQPghMqbXYqler+YLPTgUJ9W57Qq
en+se2X4dPKfuaMueMPewW+vrm9uGnuH5Ox2G/FR/KoPQZtYQERQdZOZkbL3L/nG7y8Y7PVPMEqj
lOy2VqxBDBEpJKQSPsszINu6nNpoYbGTqdfPcRe1ZnuvdirsVdirsVeF/n1+Y96l1N5O04+lCERt
Vn35uXAkWBfBOJVmI+1XjsAeWv1ec3wD4uy0eAVxn4PEM17sXYq7FXYq7FXYq7FU18seZNU8uaxD
qumymOeKqsBQh0YUZCGDDceI2O+ESlH6TRYmEZbSFh7bbfmL5mubeO4iv6xSqHQ+lD0YV/kzVy7U
1MTRl9kf1Owj2XpiLEftP61T/Hvmv/lt/wCSUP8AzRkf5W1P877I/qZfyTp/5v2n9bv8e+a/+W3/
AJJQ/wDNGP8AK2p/nfZH9S/yTp/5v2n9bv8AHvmv/lt/5JQ/80Y/ytqf532R/Uv8k6f+b9p/W7/H
vmv/AJbf+SUP/NGP8ran+d9kf1L/ACTp/wCb9p/W7/Hvmv8A5bf+SUP/ADRj/K2p/nfZH9S/yTp/
5v2n9bHtW1/WtUeuoXTz8eiGioCNtkUKv4ZDNqsmX6zbdh0uPF9ApL8ob3Yq7FXYq7FWO695pW0d
rWyo9wtRJKd1Q+A8WH3ZmYNLxby5OJn1PDtHmw6SR5JGkclnclmY9STuTmzArZ1xN7uhhlmmSGJS
8sjBI0HUsxoAPpwhiS+zvLGhxaF5e0/SIiGFlAkTOoIDuB8b0JNOb1bN5jhwxAdBknxSJ70zybB2
KuxV2KpX5o12HQfL2oaxNxK2UDyKjHiHkpSOOu9ObkL9OQyT4Yks8cOKQHe+Nr6+u7+8mvLyVp7q
4cyTTOaszNuSc0ZJJsu/AAFBRwJdirsVdirsVdirsVdirKvI2tmC6OmzN+5uDWEmlFkp03/mp9/z
zX67BY4hzDm6PNR4T1Z5mpdo7FXYq7FXYqg7laSn33y2PJgVLJIdirsVWu6IjO7BUUEsxNAAOpJO
IFqTTD9c81yT1gsGaKIH4px8LtT+Xuo/HNlg0gG8ubrs2qJ2ixzM1w3Yqzz8k/L66z5/s2kAMGmK
2oSAkgkwkCKlO4ldDTwBzJ0sOKfucbVz4YHz2fU+bd0rsVdirsVdirxT/nIzzWi2ll5ZtZ1Mkj/W
dRjQnkqoB6KPTajli9D/ACqcwNbk2EQ7DQ49zIvB81zs3Yq7FXYq7FXYq7FXYq7FW0d0dXRirqQV
YGhBG4IIxItQXp3ljWjqunc5Cv1qI8J1Xb/Van+UPxrmh1WDw5bcnc6fNxx35pvmO5DsVdirsVQ1
2v2W+gnJwYlD5YxdiqheXttZwGe4cRxjap6k+AHc5KEDI0GM5iIssE1fzBeakeB/dWw6Qqevux7n
Nth08Ye91eXPKfuSzL2h2KuxV9If84/eVk03ys+tyEm51lqhSKcIYHdEArv8Zq3uKZtdHjqN97qN
bkuVdz1PMtw3Yq7FXYqp3V1b2ltNdXMgit4EaWaVjRVRByZifAAYCaSBez418169Nr/mPUdYl5Vv
Z2kjVyCyRVpEhIp9iMKv0Zo8k+KRLv8AHDhiB3JVkGbsVdirsVdirsVdirsVdirsVTPy7q50vU45
2J9B/guFHdD36H7J3/DKNTh8SFdejdgy8Er6PUYpY5okljblHIoZGHQqwqDmhIINF3QNiwuwJdir
sVUrlaxH23yUeaCg8tYJfq2t2Wmx/vW5TleUcC/abtv/ACj3OXYsEp8uTVlzRhz5sD1DULm+uGnu
GLE/ZX9lR/KozbY8YgKDqsmQyNlDZNg7FXYqiNN0+51HUbXT7UBrm8mjggUmgLysEWp7bnDEWaRK
VCy+0tM0+307TbXT7YEW9nDHbwgmp4RKEWp+QzfRFCnnpSs2UThQ7FXYq7FXmX59ebIdL8ovpEMw
Goauyx+mrFXW2U8pH2/Zbj6dD15HwOYmryVGupczR4uKd9A+ac1Tt3Yq7FXYq7FXYq7FXYq7FXYq
7FXYqzXyJrSem2lztRgS9sSQAQT8SD3ruPpzV6/Bvxj4ux0Wb+EsxzWuwdirsVadeSlfEEYhDE9b
8zwWLNb24E10pKuK/AhHjTqa9s2ODSme52Dh5tSI7DcsJmmlmkaWVy8jmrOxqTm0AAFB1hJJsrMK
HYq7FXYq9S/5x+8qvqXmp9bkIFtoq1CEV5zTo6IBXb4RVq9jTMzR47lfc4WtyVHh730jm0dS7FXY
q7FXYq+X/wA+dQmuvzGu4JPsWMFvBF/qtGJ/+JTHNTq5Xk9zudHGsY83nmYrlOxV2KuxV2KuxV2K
uxV2KuxV2KtqrMwVQSxNABuSTirN/Lfl9LBVurhQ1626g7iMeA/yvE/R89VqdRx7D6XZ6fT8O55s
tUggEdDuM1zmt4pdirsVYZ5s8s+pLJfWS0lNXmhH7fcsv+V4jv8APrs9JqaHDJ1+p01+qLDM2brn
Yq7FXYq7FX0n/wA48to48kyR2cwfUPrLyanEdmjZvhiA2rwMaAj35ZtdHXBtzdRrr49+XR6hmW4b
sVdirsVdir5I/Ne/+vfmJrs1QeFx6G3/AC7osP8AzLzTag3Mu800axhieUN7sVdirsVdirsVdirs
VdirsVdirMPLHl8wAXt4hE5/uYmFCg/mI8f1ZrdVqL9MeTsdNgr1HmyXMJzEXatWOndf1ZVMbswr
ZFLsVdiqGu13VvoOTgWJYV5o8vFS9/aL8O7XEQ7eLj28c2ml1H8MnXanT/xBi+Z7guxV2KuxVP8A
yLf+abLzPZP5ZDyarI4SO3XdZVO7JKKgenQVYkjiPiqKVFuKUhIcPNqzRiYni5PsKIymJDKFWXiP
UCElQ1N6EgEivtm7dCuxV2KuxV4P+Zn5i/m7o189tNbRaNYszi2urVBOsqEkD/SJAw5bV2VG8QNs
12fNlie4Oy0+DFId5eL3FxPczyXFxI01xMzSTSuSzu7GrMzHckk1JzBJt2AFLMCXYq7FXYq7FXYq
7FXYq7FXYqyvyv5fZWF9ex0IobaNvv5kfq/2s1+q1H8Mfi5+mwfxS+DKswHOdiqrbuVkA7Nsf4ZG
Q2SEZlTN2KuxVTnTlEfbcfRhid0FBZcwYd5k8uNAz3tkg+rdZYl6oe7KKfZ/V8umy02pv0y5uu1G
nr1R5MbzNcN2KuxVnH5Z/mdP5MuXjayhudPu5Fa9cJS6CAEUjkqoIFa8W2/1ak5kYM/B02cbUafx
Ou76X8s+ZdL8x6RDqumGU2s32TLG8R5DZl+IUbi1VJQlajrm1hMSFh1GTGYGimmTYOxV2KqN9HZS
Wk0d8sT2boVuEnCmIodiHDfDT54DVbpF3s+b/wAyfI/kCy9fU/LvmWzJZix0f1BOQSWJWF4OZXsq
q6/N81efFAbxkPc7bBmmdpRPveZZiOY7FXYq7FXYq7FXYq7FXYqybyz5cMhjv7xaRD4oYSPteDN/
k+Hj8uuDqdTXpi5um09+osvzXOwdirsVdiqYIwZA3iMoIZt4pdirsVS9l4sV8DTLg1tEAih6YVYT
5k8vGzY3dsC1qxJdf99knpt+z4ZtNNqOLY83W6jT8O45JBmW4jsVZP8Alp5c07zH5z0/SNQd1tZz
I7rH1f0o2l4V/ZDcNzl2CAlMAtOomYQJD65gggt4I7e3jWGCFRHFFGAqIiiiqqjYADYAZugKdGTa
/FDsVdirHfNvkDyv5rjUava87iNGSC7iYxzRhvBhs1DuA4I9sqyYYz5tuLNKHJ4v5q/5x58xWBlu
NAuE1S1G6270iuQCTtv+7fitN+QJ7LmDk0Uh9O7sMeuifq2eUzQzQTPDMjRTRMUkjcFWVlNCrA7g
g5hkU5oNrMCXYq7FXYq7FXYq7FWR+XfLJuAl5eDjBUGKEjdx4nwX9fy64Wo1NemPNzNPpr9UuTMs
1rsXYq7FXYq7FUVavVSh6jcfLK5hkFfIMnYq7FUHdLSWviK/wyyHJgVLJoWuiOjI4DIwKsp3BB2I
OINKRbB/MPl19Pb6xb1ezY713MZPY+3gfo+e10+o49j9Tq9Rp+DcckkzKcZmP5P3EsH5k6G8cTTM
ZZIyqgkhZIXRm27IrFj7DL9Mf3gcfVC8ZfWWbl0jsVdirsVdirwr87POX5jaTqj6dFIdP0O4VTaX
dorK8o6lXuDusgZTVUI+HrUHfX6rLOJrkHZaTFjkL5l4jmvdi7FXYq7FXYq7FXYqn/lzy6t8purr
kLZTREG3Mg77/wAvbbMTU6jg2HNy9Pp+Lc8maqqooVQFVRRVGwAHYZqyXZAN4q7FXYq7FXYqvhfj
Ip7dD9ORkNkhHZUzdirsVULpKoG/l/jkoFiULlrF2KrJYYpozHKiyRt9pGAIP0HCCQbCCAdiwTzD
obabcB4qm0lJ9M7nif5Sf1ZttPn4xvzdXqMPAduT6E/Jz8tofLejx6pqMStrt+iyNzSj20bLtCOY
DK9G/edN/h7VO+02DhFnmXn9Vn4zQ+kPSMynEdirsVdirsVS7zBoGl6/pM+l6nCJrScUI6MrD7Lo
ezKehyM4CQos4TMTYfKfn3yJq3lDWHs7pWkspCTYX1KJMgp4Vo61oy9vlQ5p82EwNF3WHMMgsMYq
MpbnVGKuxVvFXYqnnlvQDfSfWbhSLRDsP9+MOw9h3zF1Oo4BQ5uVp8HEbPJm6IiIqIoVFACqBQAD
YADNUTbswKXYq7FXYq7FXYq7FXYqjoX5xg9+h+eUyFFmF+BLsVWyLyRl8RtiChAZewdirsVTjyfZ
JeeZ9NidOarOkpUio/dH1Afo45mdnx4s8R5/du4faE+HBI+X37Pds7N4t2KuxV2KuxV2KuxV5Z+Y
esC91gWcZBhsKpUb1kahf7qcfozke2dTx5eEcoff1/U9b2PpuDFxHnP7un62K5p3buxV2KuxV1Bi
qFukowcdDsfnlkCxKhk2LsVdirsVdirsVdirsVRFo/xFfHcZCYZBE5WydirsVQEq8ZGHv+vLgdmB
W4UOxVmH5WQCTzOzn/dFvI4+kqn/ABvm27GiDm90T+h1PbUiMI85D9L17OpeVdirsVdirsVdiqG1
K/i0+wuL2X7ECFyK0qR0Ue7HbKs+UY4GZ6Btw4jkmIjqXh000k0zzSsWkkYu7HqWY1Jzz+UjIknm
XvYxEQAOQWYGTsVdirsVdiq2ROaFfHp88INIKAIIJB6jrlrB2FXYq7FXYq7FXYq7FV0bcXDeBwEJ
CPylm7FXYqhbtTyDdiKfTlkCxKhk2LsVZ7+UduW1S+uO0cCx/TI4P/MvN32HC5yl3Cvn/Y6PtydQ
jHvN/L+16jnSPNuxV2KuxV2KuxVhP5l60IrOPSY6+rccZZj29NSeI+l1r9GaHtzUgQGMc5bn3f2/
c73sTTEzOQ8o7D3/ANn3vOM5d6d2KuxV2KuxV2KuxVCXiFT6iqWB+1Sn8csgejEhBfW4/Bvw/rlv
Chr64n8px4Va+uD+T8ceBWvrv+R+P9mHgVv67/kfj/ZjwK19cP8AL+OPArX1yT+UY8KtfXJfBfx/
rjwhU2s5Ge3Ut9rv/DMeYosgr5FLsVUL3l9WZlFWX4hX26/hkoc0FKDdSnwHyGZPCGKhZ6oLy3We
CTlGxIBoBupKnt4jLMuA45cMhu1Yc0ckeKPJ6F+UmpSxapdQMapPGrGvjG1BT/kYc2vYs6nKPeL+
X9rqO3IeiMu418/7HsA3GdE807FXYq7FXYq7FXi/mfVP0nrl1dA1i5cIaGo9NPhUj/Wpy+nOF7Qz
+LmlLpyHuH4t7jQYPCwxj15n3n8UlWYbmOxV2KuxV2KuxV2KuIB2PTFUDdWaV5caqe/cZbCbAhAy
WjCpQ8h4d8tElUCCDQ9ckrWKpZrHmHTtKUeuxeY9II6F6eJBIoMztJoMmf6dh3nk4Os7Rxaceo2e
4c2Far5x1a+5JE31W3bb04z8RHu/X7qZ0ul7IxYtz6pef6v7XltX2zmy7A8EfL9f9id+R9d9WP8A
Rc5q8YLW7kjdR1Tfeo6j2+WaztrRcJ8WPI8/1/jr73adh6/iHgy5jl7u78dPcy5RyYL4mmc+9GnN
o1HK9iP1ZjzCQisrZOxVp1DoynowIPyOIKscl/dc+ewSvL2p1zNiL5NZNCy888na79QvDa3DgWlw
d2Y0CPTZvDfofo8M67tfQ+LDiiPXH7Q8b2Nr/CnwSPol9h7/ANb2PytcvZ6rYSqwX96odu3FzRq/
Qc5fRZTDPEjvr57PT6/GJ4ZA91/J79A3KJT7Z2bxS/FXYq7FXYqk/m7VRpug3UyvwnkX0oN6Hm+1
V91FWzC7Rz+FhkevIe8/i3N7PweLmiOnM/D8U8azhnt3Yq7FXYq7FXYq7FXYq7FXEAih6Yqg54Ch
5L9j9WWRlbAhQeNHFGFcmChJ9b0DXL6ALpN8lt2kVwysfcSLyI+hfpzP0WqwY5XliZfju/b8HB12
DPkjWKQj+O/9nxYTe/l55tilc+gt11Zpo5VPInc7OUcn6M6XD23pSBvw+RH6rDzGXsXUgnbi8wf1
0Uiu9K1SzAa7s5rdTsGljZAfkWAzZYtTjyfTKMvcQ67Jp8kPqiY+8KNrczWtxHcQNwliYMje4yeX
HGcTGXIscWWWOQlHmHrei39tqUMVzAQyMKuvdGAqVb3GcDqsEsMjGX9vm+g6bUxzQE4/2eSco3Fw
3gcwyHITAEEAjodxlLJ2KXYqx/X7J5UubeJgj3MThHaoVWcFakgHau+Z2kyiMoyPKJH2OPqMZnjl
EcyCEB5f/LjSLBEm1AC+ux1Dbwqd+iftf7KvyGZ2t7dy5DUPRH7fn+p1ej7DxYxc/XL7Pl+tkDoI
3KqAoX7IGwA7UzUg3u7iq2fQWlzGfTbadl4mWJHK+HJQaZ30JcUQe8PAzjwyI7iiskxdirsVdirz
L8y9S9fV4rFSeFmnxj/iySjH/heOcp25n4sogP4R9p/ZT1PYmDhxmZ/iP2D9tsPzSO7dirsVdirs
VdirsVdirsVdiriARQ9MVQc8BT4hun6ssjK2BDdq1JCP5h+IxmNkhF5WydiqAu9A0O8Ltc2FvLJJ
9uQxrzP+zpy/HMnHrc0KEZyAHnt8nGyaPDO+KEST5b/NRsPLOlaYH/R0RgEn205u6kjvRy1D8snn
12TNXiG68h+hjp9Hjw2MYoHzP6VVlZTRhQ5SC5CJt5l4hCaEdK98hKKQVfIMnYqo3dstxEV2DjdG
8DkoSooKhp8jrW2mqJE3UH+XJZB1ChddLSWviMYcmJfQsESwwRxL9mNQo+QFM9BAfPyV+FDsVdiq
jeXdvZ2st1cOEhhUs7HwGQyZIwiZS2AZ48cpyEY7kvD7+7kvL2e7kFHuJGkYDoORrQfLOAzZDOZk
ept73FjEICI6ClDK2x2KuxV2KuxV2KuxV2KuxV2KuxVxAIoeh64qhZIjE4dd0B+7LAbY1SKBBAI6
HplbJ2KuxV2KrJI1kWh69jhBpBCElhaM77jscsErYkK8NwGor/a7HxyEopBV8iydiqhcW5kKyRkL
Mn2GPT3ByUZVz5IbVDcyQLTizuI2U9mYgZZijcuEdWGSXDEnufQeegPn7sVdirsVYb+ZmqGDS4dP
Q/Fdvyk6f3cRBp47tT7s0fbmfhxiA/iP2D9tO67EwcWQzP8ACPtP7LeaZyr1TsVdirsVdirsVdir
sVdirsVdirsVWvJGgq7BR2qaYgEoQc2qW4BVVMn4A/x/DLRiKLVIbscAGQjbpWtPbtgMFtEJIj/Z
NfbvlZFJtdil2KuxVogEUIqMUIWa3K1ZN18O4yyMkEKkFxyoj9ex8cEoqCr5Bk7FUTpEdv8Apmxe
YqkQuYWmZjReIcVJJ2+z3zI0kgMsCeXEPvcfVRJxSA58J+57pnfPBuxV2KuxV5B531M3/mK4INYr
b/R46eEZPL/hy2cV2rn8TOe6O3y/bb2fZeHw8A75b/P9lJDmudi7FXYq7FXYq7FXYq7FXYqoSXtq
nWQE+A3/AFZIQJRaEk1c7iOP5Fj/AAH9csGHvRaFkv7t+shA8F2/VvlgxgLagSSanqckhVtY+UnI
9F3+nBIqjcrQ7FVRZ5V/aqPA75ExCbVUuwdnFPcZEwTauro32SDkCEt4pdiqhNbhqsmzeHY5KMmJ
DoJzXhJs3YnDKPUKCr5Bk7FWd+RvOPp+npOoyfu9ltJ2/Z7CNj4fy+HTpnQ9k9pVWKZ/qn9H6vk8
92r2dd5YD3j9P6/m9CzpXnHYq7FXhnnLS30vzHeW4BWF3M1vQED05PiAX2U1X6M4vX4PDzSHTmPj
+Ke00GfxMMT15H4fi0l5N4nMOnMdybxONK7kfHFXVPjirVT44q6p8cVdU+OKuqcKrZEEiFT9B8Di
DSoB0ZGKt1GWgpW4q7FWwCTQdT0xVHxR+mgXv1Jysm0L8CuxV2KuxV2KqiXEq96jwORMQm1dbpD9
oFfxGQMCm1VWVhVSD8sjSVssSyDfY9jhBpSFkbsh4S9f2W7HCRfJVbIpdir0fyR5zW4WPStRci5A
421wxr6ngjH+bw8fn16jsvtTjrHk+roe/wAvf9/v58x2n2Zw3kx/T1Hd5+77vdym2b50TsVef/m1
pJktbTVY1FYCYJyAa8X3Qk+CtUf7LNH21guImOmx/H45u97Ez1IwPXcfj8cnmOc49G7FXYq7FXYq
7FXYq7FXYqpTw+otR9odMINKgiCDQ9csS1iqItI6vzPRenzyMiqLyCHYq7FXYq7FXYq7FXYq4Eg1
HXFVVLmRdj8Q9+uRMQm1UXETijinz3GR4SE2vRgopXkg6N1p88iUoTWNf0bRoBNqd3Hao1eAc1Zq
UrxQVZqV3oMtw6fJlNQFtWbUQxC5mmMXn5w+TbYqYJbi8J7wRFeP/I4xfhmwx9i6g86j7z+q3Ayd
sYByuXuH66ehfl//AM5Q+UtVuk0rzAH0mT4Y7XUp6GGToo9dgW9JjWpY/B1qV79Tp4zEAJkGQeX1
BgZkwFRe3wzRTRJNC6yRSANHIhDKyncEEbEHL2hC6xpcGq6ZcafOSIp1oWHUEEMp+hgDlWfCMkDA
8i24MxxTExzDwG5t5ra5ltpl4zQO0ci9aMh4kfeM4ecDEkHmHuYTEoiQ5FTyLJ2KuxV2KuxV2Kux
V2KuxVDXMNayL/shkolKGAJIA6nYZNUwRAihR2yolC7FXYq7FXYq7FW1VmPFQWJ6AbnEC+Skgc0V
DpGpzbpbPTxYcR/w1MyIaTLLlEuPPV4o85BEDy3rJNDBT3Lp/A5aOzs3837Q1HtHD/O+wq48pamR
UvCPYs38Fy4dk5e+P4+DSe1sXdL7P1q8Xk+cj97cqp/yVLfrK5ZHsiXWX4+xql2vHpH8farR+Tog
f3l0zDwVAv6y2Wx7IHWX2Ncu1z0j9quvlLTlIPqzVH+Uv/NOWfyTi75fZ+pq/lbL3R+39b5x/OyS
VfzBvrLmWt7JII7ZDT4VeFJW6UrV5Cc2uk00MUKiHV6rUTyyuRYJmS4zsVfU/wDziJp/mFdA1bUJ
72QaC8/oWOnHiUNwqq00+68h8JRBxeh+LkKgHCgvoLFDx/8AM3SBZeYfrMakQ36erWlF9RfhkA8e
zH55yna+Dgy8Q5S+/r+v4vV9kZ+PFwnnHb4dP1fBiOat2rsVdirsVdirsVdirsVdiqvaWF9euUtL
eW4cdViRnI+fEHJ48Up/SCfcwyZYw+oge9PY/wArfMqQrdskahhX0ORaVK+KqD+GbQdkZjGzQdbL
tnCDQstDybIrFJboJKv2k4EkfOrKckOxz1l9jWe2B0j9v7FaLyfbj++uHf8A1AF/XyyyPZEesj+P
m1y7Xl0iPv8A1Ky+U9MBqXlYeBZf4KMsHZWLvl+Pg1HtXKekfx8VceW9G/5Z6+/N/wDmrLv5Ow/z
ftP62r+Uc3877B+pXTSNLQUFrER/lKGP3tXLY6TEP4R8mqWryn+I/NWis7SI1igjjPiqgfqGWRww
jyAHwapZpy5kn4q2WNbsVdirsVdirsVdir5U/O7/AMmdrP8A0bf9QsWZEOTRPmwbJMU28p+XL3zL
5l03QbIH6xqNwkAcKX9NWPxysq78Y0q7ewOKv0B8teXNJ8t6FZ6HpEPoafYpwgjJLHclmZierMzF
ifE4WKZYqxn8wtFj1Hy7PMIw11YqZoHrSiggyj6UB28QM13amAZMJPWO/wCv7HY9l6g48wH8Mtv1
fa8XzkXr3Yq7FXYq7FXYqmOm+Xdc1Ir9SspZkbYS8eMe3/FjUT8cvxaXLk+mJP3fNx82qxY/qkB9
/wAubK9I/KjUpZEfVJ0t4OrRRHnL8q04D51ObTB2LMm8hoeXP9X3usz9tQArGLPny/X9zL9N/L3y
tYgH6r9akH+7Lk+pX5rtH/wubTF2Zgh0s+e/7PsdVm7Tzz60PLb9v2sghhhhiWKFFjiQUSNAFUD2
A2zPjEAUOTgSkSbPNfhQo3NnaXScLmFJV3oHANK+HhjSQUovPKNhIpNo720gHwgMXSvuG5fgcrOM
MxkKQ3fl7zBa1IjW6Qb8o9zT/V+E/cMgcZbBkCXNdCNzHNG8Ug2ZWFCCPHvkKZ2vW4gbo4+nb9eB
VTFLsUOxV2KuxV2KuxVpnVBViAPE4q8U89flBq3mfzvf6yt/b2un3Xo8Kh3mAjhSNqpRF6pt8eWx
nQa5Qsr7b/nH3yssai51C+llH2mjaKNT/sTHIR/wWPiFfDD178qfyf8AKnli6/Ttrp3p35jMVrcT
SPI4jcDm4ViVUsNgwANKjocnC+rXOuj1DJsHYq0yqylWAZWFGU7gg9sVeBa/pbaXrN3YN0gkIQ+K
H4kP0qQc4fVYfDySj3H+x7nS5vExxl3j+1L8ob21VmYKoJYmgA3JOICkp5p3kjzRfjlFYPHHt8c9
IhuKggPQn6Bmbi7OzT5Rr37OFl7RwQ5yv3bsp0z8o3qj6nfLQN8cNupNV9pG40/4DNli7E6zl8B+
v9jrM3bnSEfif1ftZlp3lLy5p9Da2EQdSGWRx6jgjuGfkR9GbbFosOP6Yj7/AL3U5dbmyfVI/d9y
bZlOK7FXYq7FXYq7FXYq7FVKe1tbheM8KSgdA6huvz+WNKCkWoeSdNnFbVjav4CrqfoJr+OQOMNg
yFILvylrlpVolE6AVLQtv16cTRvuyswLYMgSx5b23k9OZWRx1SRSp/GhyBDMFUXUF/aQj5Gv9MaV
VW7ganxUJ7EYFVVZWFVII8RviriQBUmgHUnFUNNfINo/iPiemGlQTu7mrmpxVrFWReVfLr3cyXt0
g+poaorb+ow26fyg9a/LxyyEba5zrZneXNDsVdirsVYV538iXeuajBe2Uscb8PSnEpIFFJKsOIap
3pmo7Q7OlmmJRIG1G3cdndpRwwMZAnexShp35S6ZEQ1/eS3J2PCICJfcGvMn6KZDF2JAfVIy+xnl
7bmfpiI/b+plmk+X9H0lWXT7VYOf22BLMfYsxZqfTmzwabHi+gU6vPqcmX6zaYZe0OxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxVRu7K1vITDcxiSM9j/AjcYCLSDSQ3vkbTpSWtZHtif2f7xfuJDf8NkD
jDMZCkV55O1m3HJEW4UVJMR3FP8AJbifurkDAsxkCXjRtX/5Yrjb/ip/6YOEsuIK40PX5lANpKQO
nIcev+tTHgK8YVB5S8wEf7y/8lI/+asPAUcYVU8ma4w3RE9mcfwrj4ZR4gRlr5EvfXT61NGIK/vP
TLF6eAqoGSGNByBmccaRRrHGOKIAqqOwAoBlrSuxV2Kv/9k=</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID> + <xmpMM:DocumentID>xmp.did:d4d07395-aa96-47c2-a9e5-d0351947bb0c</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:c63c1031-e157-9748-9c58-86481308e954</xmpMM:InstanceID> + <xmpMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>uuid:1abccb90-0c26-4942-b156-fd2eb962e3e1</stRef:instanceID> + <stRef:documentID>xmp.did:58fdc1b8-1448-3a44-9e20-282d8ec1cf95</stRef:documentID> + <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID> + <stRef:renditionClass>proof:pdf</stRef:renditionClass> + </xmpMM:DerivedFrom> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:d4d07395-aa96-47c2-a9e5-d0351947bb0c</stEvt:instanceID> + <stEvt:when>2016-06-15T14:23:10-04:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CC 2015 (Macintosh)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + <illustrator:StartupProfile>Web</illustrator:StartupProfile> + <illustrator:Type>Document</illustrator:Type> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>128.000000</stDim:w> + <stDim:h>128.000000</stDim:h> + <stDim:unit>Pixels</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Cyan</rdf:li> + <rdf:li>Magenta</rdf:li> + <rdf:li>Yellow</rdf:li> + <rdf:li>Black</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>White</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>Black</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Red</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Yellow</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Green</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Cyan</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Blue</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Magenta</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>193</xmpG:red> + <xmpG:green>39</xmpG:green> + <xmpG:blue>45</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>237</xmpG:red> + <xmpG:green>28</xmpG:green> + <xmpG:blue>36</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>241</xmpG:red> + <xmpG:green>90</xmpG:green> + <xmpG:blue>36</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>247</xmpG:red> + <xmpG:green>147</xmpG:green> + <xmpG:blue>30</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>251</xmpG:red> + <xmpG:green>176</xmpG:green> + <xmpG:blue>59</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>252</xmpG:red> + <xmpG:green>238</xmpG:green> + <xmpG:blue>33</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>217</xmpG:red> + <xmpG:green>224</xmpG:green> + <xmpG:blue>33</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>140</xmpG:red> + <xmpG:green>198</xmpG:green> + <xmpG:blue>63</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>57</xmpG:red> + <xmpG:green>181</xmpG:green> + <xmpG:blue>74</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>146</xmpG:green> + <xmpG:blue>69</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>104</xmpG:green> + <xmpG:blue>55</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>34</xmpG:red> + <xmpG:green>181</xmpG:green> + <xmpG:blue>115</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>169</xmpG:green> + <xmpG:blue>157</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>41</xmpG:red> + <xmpG:green>171</xmpG:green> + <xmpG:blue>226</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>113</xmpG:green> + <xmpG:blue>188</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>46</xmpG:red> + <xmpG:green>49</xmpG:green> + <xmpG:blue>146</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>27</xmpG:red> + <xmpG:green>20</xmpG:green> + <xmpG:blue>100</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>102</xmpG:red> + <xmpG:green>45</xmpG:green> + <xmpG:blue>145</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>147</xmpG:red> + <xmpG:green>39</xmpG:green> + <xmpG:blue>143</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>158</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>93</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>212</xmpG:red> + <xmpG:green>20</xmpG:green> + <xmpG:blue>90</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>237</xmpG:red> + <xmpG:green>30</xmpG:green> + <xmpG:blue>121</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>199</xmpG:red> + <xmpG:green>178</xmpG:green> + <xmpG:blue>153</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>153</xmpG:red> + <xmpG:green>134</xmpG:green> + <xmpG:blue>117</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>115</xmpG:red> + <xmpG:green>99</xmpG:green> + <xmpG:blue>87</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>83</xmpG:red> + <xmpG:green>71</xmpG:green> + <xmpG:blue>65</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>198</xmpG:red> + <xmpG:green>156</xmpG:green> + <xmpG:blue>109</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>166</xmpG:red> + <xmpG:green>124</xmpG:green> + <xmpG:blue>82</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>140</xmpG:red> + <xmpG:green>98</xmpG:green> + <xmpG:blue>57</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>117</xmpG:red> + <xmpG:green>76</xmpG:green> + <xmpG:blue>36</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>96</xmpG:red> + <xmpG:green>56</xmpG:green> + <xmpG:blue>19</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>66</xmpG:red> + <xmpG:green>33</xmpG:green> + <xmpG:blue>11</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Grays</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>26</xmpG:red> + <xmpG:green>26</xmpG:green> + <xmpG:blue>26</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>51</xmpG:red> + <xmpG:green>51</xmpG:green> + <xmpG:blue>51</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>77</xmpG:red> + <xmpG:green>77</xmpG:green> + <xmpG:blue>77</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>102</xmpG:red> + <xmpG:green>102</xmpG:green> + <xmpG:blue>102</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>128</xmpG:red> + <xmpG:green>128</xmpG:green> + <xmpG:blue>128</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>153</xmpG:red> + <xmpG:green>153</xmpG:green> + <xmpG:blue>153</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>179</xmpG:red> + <xmpG:green>179</xmpG:green> + <xmpG:blue>179</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>204</xmpG:red> + <xmpG:green>204</xmpG:green> + <xmpG:blue>204</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>230</xmpG:red> + <xmpG:green>230</xmpG:green> + <xmpG:blue>230</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>242</xmpG:red> + <xmpG:green>242</xmpG:green> + <xmpG:blue>242</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Web Color Group</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>63</xmpG:red> + <xmpG:green>169</xmpG:green> + <xmpG:blue>245</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>122</xmpG:red> + <xmpG:green>201</xmpG:green> + <xmpG:blue>67</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>147</xmpG:green> + <xmpG:blue>30</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>29</xmpG:green> + <xmpG:blue>37</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>123</xmpG:green> + <xmpG:blue>172</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>189</xmpG:red> + <xmpG:green>204</xmpG:green> + <xmpG:blue>212</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + <pdf:Producer>Adobe PDF library 15.00</pdf:Producer> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[7 0 R]/Type/Pages>>
endobj
7 0 obj
<</ArtBox[19.792 16.0 109.0 112.0]/BleedBox[0.0 0.0 128.0 128.0]/Contents 8 0 R/Group 9 0 R/LastModified(D:20160615142312-04'00')/MediaBox[0.0 0.0 128.0 128.0]/Parent 3 0 R/PieceInfo<</Illustrator 10 0 R>>/Resources<</ColorSpace<</CS0 11 0 R>>/ExtGState<</GS0 12 0 R>>/ProcSet[/PDF/ImageC]/Properties<</MC0 5 0 R>>/XObject<</Im0 13 0 R>>>>/Thumb 14 0 R/TrimBox[0.0 0.0 128.0 128.0]/Type/Page>>
endobj
8 0 obj
<</Filter/FlateDecode/Length 106>>stream
+H���wV��u6PprqV�*�2��3�4R04S���32�P�4ճ��T(J� +W�*�w6PH/�H�+ +8;W:dYmnJk$j=`^PKX*GV"-/6MPPhMW4o*<SJ[.r.2B:%l2U+:>jFegTA5n:ROqi. +8M?-(/t#IN>re.=TbIMqYWQK1D%b&pOLGa]H?hKs'8Gqa4A/k;[i&\e-=4:h!/H6BW;~>
endstream
endobj
16 0 obj
[/Indexed/DeviceRGB 255 17 0 R]
endobj
17 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
13 0 obj
<</BitsPerComponent 8/ColorSpace 11 0 R/DecodeParms<</BitsPerComponent 4/Colors 3/Columns 880>>/Filter/FlateDecode/Height 947/Intent/RelativeColorimetric/Length 90241/Name/X/SMask 18 0 R/Subtype/Image/Type/XObject/Width 880>>stream
+H����oi���@H�����y�&�����8��_�n�������y��A�'��? +I + +W��<�*�
��'���%���Y��%��V���ma�o!���ǩk�v�>��w�u{=�Q��<\ȃ*fƸm�q���Y%ŏ�R�p� + +i�H�F�'��>hd,��I#��_���ы��Tj�~Q�5�c�R�`�n:�s�
e8�����P���� +WW�zٶ�:��l�g���l�7Ƀ�Hi�J&������/�Ӻg�.�}���C�����'���d�D|V�֪'9TL*�4�I]��6�� +���>�#g���V���-�?}=����Tj��OK�<�>�Nh a�uOB�n�Y#qkB�)����fiQ�@
+� +z���tu��t&���k�s����g1�twuO/�J���>_��9E�zb�(Jr2�h�+�ɓ�)���⇻��A�!�����_:۪.�%��ٱ4�E�3w��~�� �sO��q9��F�$����~��E��<G���J���? +7"P�� 16?w�'����PƔ�P���m?U
A�J�������O�C�/%��-n�� :d�}��_H��R0I�����yc5S�j����V}���nǡ�!��1�I�,�C8���LaP)G�cA��1(�E�4F|���Q#0#0P�W�{� V<��^�F��Lz��@���%����k�����0�u�'�I1����q�<��$p5�SyV(%AǓ8�M��Y�ĶQ�E���Y'd7��2k��/Q;�L&���^1*
e����v<�7V2�Sy�+G� F��"wA +����P&�rA\�9g��J�C� +���c����1Bu��U�U!�h�B +�m����?I��X��q�Bf=�O�-�u���S]*pb�L�p��� +�+Qf1XGbu�.�AL�}�����{��;�j��:�1�X�M;`�m����)ݒr�2���?��?��b��<g�2��|��NDq���)}��s*�[��Sw�LGE�R>ӥ^"�T�.4�{��7���V�:7�cO�
���n���]��&I�Iʴ���]�׳����L&ټ��~�e�?61��8qW6�$�уS-���J+j��� &�H�R#Y(�u3C�"���va������VO ����qˤg���/��{N�d*�� �w4~����8`ਡ�O��D����T +����(� ƃ��(r�Vu��6z�0F�|�i�U�6�������_�Up_� |�7//�y
e2��6�ka��E9JT��h�<'|���� e�\x�y�(�7Q�Q1Z)�7�#�5eoӈ���0��g�+ۨ�wC�xc�X��S�g")�-n�k����E��J��N[��*������ FA�K��L��LR7�R.��L�BME#@�* +�~U���݊�tEEVOt�7�U콊�ؾ�x��Ԝ'�is����jf=��O���[Z��O� ���((��A��>��&��]�r�"��т|f0`A|0�/2}�+58{�:��!ELTǝ�uB�1H��z��GQ0�g����[��|Q_[VSo�r^G���y�?l�D$g=?�ȩՕL�N9�� +���K��*RYģp����u0�%K��'���*�-�l�p�D <P�#�Y�G���}Ũ4�I��ϸ.V��;�I�������Q&+=u ����PaqU����S_�q(R o*B&���Bc�@-٫��m��大+R/������rlpך`m{�ͯ-��Vr�te�O&�^��LOF"��e59��h9��Ą˵�J�ho���q�{5�0����ށ�:���5�8Ƀ*ô�x'/>I��D2Mnݾb��L)��O��Y���ׯ��R3OF"�R �j"�iO8��%�����{��Pqs�?H�e�e}-����XJ��N��m\�-��H/}G�<b"�µŭ�|�x�y}}YM�����>ϩ��Z&���L��/�u>7&�I
wQ)� /�+P�.b�P�"�$N��5��5�B]�=�{�2��`�[������Hnk�?������-��s��\��粓�y*d�qP������9�I����,1���k[������`��^��A�/�n��3��Օ��c��V�n��a�-_�s%Y�S�����M{b �FǠ�oZ����nk�E�%�yt�$mA��s%E���v]������JW������^x�A��
�Xk���0v_���KӉ�� i$��Fߪ�/�u(� j�L�I��������O%�k��/S���<z�YW�nZ� <Q�b�誒��&�[q���Dz1��'��Mwc����U�0s)/�Pz�����R����m����u��/X�����?��O�y��d��R�<��ɇ0��m'hˤ�S!m(/6�o�G���F��"H�Cs� c���f��䐧YBh�ߔ���syڡ��y߿�n���,@2����1crXS>r7B>Y��,7�70����ݙ��s)�]ub�Q9O�Έ�L��1�2$j����n*�2�*쾊O&iV��"s��r��+�2L��j��ȞC������xҜ����J�9:J��ʌ �H(���hx�A&�xk
�i&����Iu$6ԕ�j���:.��E� Q\-^*%V�@V;��R�M���]�d�L��W�<}*�w�&Kߊ{���-7@�-&;. +C�6���6 �@9TB�U�f�I�[#v�1��r�`��,���f/5n����T�Lֹ�ޤ��o�sI�w�T&�����\�ߍ�#�UB��XJ&�uo�����6TE���-E��HL����u[���F���Uf +���x�謖���X���z�{FEr6��q��iV�d>ս�l�� +��\�Uv�^dK�CR&��p�����6�kڄo@)������ɛzx���Z�ZfB��v�5n�F�C��
�`�r�{Lŷ�y���7�g�2H&��;x�@��k�A�SYQ��C,��2�9�Wp� +������c�!{)��r���*��R����j�!���&�#�8ˁScM���}��Zi�*H&��M��f��$�\�P� +Ŵ�\����Id e��DҐIЍ��F1�����|C�eH �ld�Ԭ6i.2K8�t��&�t�(�Q��+��Zf�B*R&��~?g����4�|W�~��!�$����1�[�N��Ikq���S��(T�[�'iͧ4*m����~�@���?���>���KT��)��Ε��J��3t +dE�À.�"!�|��g_��F>";,o)%O�Q�������~Z��2F�B +3����%f_,%.u��;��}�����o�Z��_`>��19�)�ۂ��֙Ĥ
b���-��
2z[&��;BE����z1i6����Cӯ!�G9��h�t��j9��'I#�8�ˁ�B��!�=��*��t-T:zT�����G�\2z;��F3�}Zg����L�h����H�Ӎָ�!�fi�V�L:�,N��0E��wH�V��sR I �!�-U�L�1�����#4���z�v�B�`�V��|�u���4�i�$�\"&^�X�j�bޟ��� m�R���� q6����H �JER�����/-N&�w�'�,�͌ƹ�ӿ�8�!�f�I�|��1T��B����S�?�D%�}�35fW�̊�CȊ\�!/�5n�:VC1�@��#�&R&�����2rÚ�!����"H �<��O"�$;�,Ɣ�G�)�!� �P�i���q��6k^��6垾���n��m��G��ţ��������t�,Q�\W +����Ho�[�]H&�lB���<iΌ�'�)�L��t�`��=C�B>��OS&c1�[p��Uyu�������������N�'v�9 +���L���凍\����L2铥�Akq���q�$��C���k�DyQ�c��O���z�q�*�8� +U_��D"QA�PA�@�I��w�涱��DZ��I�PP�i����G~�;�9���]����6ov��p�3U�$lJ�'�o0�bR��v��L���~�c�I��F��eA[Q��IPY1��o�7xGv����Λ�j�i�$�-I��g�2l�c��.Ť�=I !;e0�'Z�JZ��wzT6�b3;��� )g���S��V�G1�,�� ��xt��������$��(!b1������Ѯ��-������~���$�"�3V[�f�K�@MR�+��3ϟ�ePI��a~�F�p��2�
���Þ�qZ�JZ��� +0 ��'����0$:HJ��\��� ;``pPL�=N���M�.�H1Eb�~�ԓ�vsK`TO�=�h�wѓ +�m��crE�?m}��F!��e_JRPF +7���b1��T}<�x���4z�V��,&���읲ye����T��J=���q����#cz>)�R�v:��5�[Q����Г�O�"���5�o)� �c���^�m��X�y���Tع���T=�%o�-�oK�2���U~c���͠�B���>(h1*��h�|: +�ؐ�<p�D�����Ť��G��|��i-j�zR����E�Qˠ'� +c��'��z>�w�TҺ�辣QEx=��D19��-�d��!}?��d!�}3����Z�#)��nmDz����ly�_|1^��N���d`Q0��l�9'0�Nn<X +�(iC�4P+�$��� +c�T6��^b���-��4��je˷O|�z�S~�?_�q��C�j��R�r̖E˓�>�j��E�k��.C-�n#�E��<�I�O{�vE5�ӄ�&E�N��& �݆ +���w&B����g��w���)#��S���]\Q��V��Q��>�$I_jJ��X�,�\^�Y�S�d|'z��D%�{o1�!䅇qx';q������ڈ�><�a�X��/���/�
�:z�556hz��^�`tN��ʦ]a�r�DhKUvX�eg��f�¤~��u�bU4u�+�&g�b�8��5�I��nݣ�T���c�%N����N~(�d�X���'Bh%���=���f�j-NK�2z]��W�"L�y�'t �l�^fZ��&�a,�- E���K�v|deKhߙ��Ds8�^{2yc�"~tt��o�����`���V�x��h���v۠���d���N�����`�}���ʼnCh�Vr��fg�֭iљ�O ��т�|�,I��@�3&����7�r��~x�]5K~�� <�'�ɸN��j�G=��=`jߖ��}��Ƌ��Wǭn��Z��\Lҳ��o�`M�2iC�ɍ|�a�'BN$�ɸN~(���<'x[)��!t��DJ���`����ɨu�O�&��7���R�,��R��6�=<������{.�q�;!t���&O6v�se�8-@ʨ�m�k���$b������f�a%�܌*� +�s��Mz�C�*�d\'\z�1z�A��D�����d�&<��u�;e]� x�^�,�Yo`Γ�Z�A�>�� +���9��$Y"?L�tzK_��14*Y|�!ԯ)7�$�U���� +L�&\��Pby?�ޓ�u��r!m���� ��FZK�G���brΓͲ��c)�eE�+W�q�yt�T?�w�� �]����]�}["�֫�<O?�Z��I�(B��ڸ���R�9�S�!&[J�9,^ٟ,9�&�G��U +=� +� +7]=�!�I +�AQ�ש'=FE�4b2��&al�6>� +��������h�B��")��;���I��s*�Q����Y9c"�1鲒��z2�k�l�vy07>� +�d�֕MW.o����BgDtʿv(u�X�4�Kp}�G�ߓ��-�8,���]����o��^������ѓ�[J�^�����c����(�N�Y��]$eo�
�h9[�ƣ�:1�v��t��᥌e|��� �q�'��K�����p��4 �b +4��4@ߩ��߿N�N �d� ;�tSl}O��J*I�p����r�G
l?� +ע�(�'㵢đ�gi +����&�������!&;��=���@O���K1Ŏ=��5�:�2J.778&�$��k��4�RJGL*�sͽ�֨+���I�N,�I���ij&}`K���闍�sEvD��R�Ͽ���d�}����O�I�b�_9���3��D��a`�(r\���|��@O�@���Mo��ߎ$�g��i�)���R�~c�b]��_����+$��H!n~�F]1�GL*v��Z�F���i +����� &����NA����@O�t\ᏻNo��V�0�� +'?��Z�t���w +٫ + +���w~L��w�ɰd�_���X�����2�oĂ�ϼ�0aL&5��QP�RK0�0�*���?�%�� +G�C�;��0�SO�!䒢�(m���� @b�c���_v��(J�k�E�@m���K�8���h/M Hhb IY�eI�Q}v�����r�7�b���yH~�Լ�0�q�i_��V�����S��!=����#_�m�L�Ĥg�����i��Ұ����=
������X.�o��7��=�<����Z��d��R����'�4�!����s��d�����q�ak5k�����M�MJ(�PtKx������#�I������ +d���!��թXK��tkc�Z*y��ͅ����(
�w¯<�\�*D��b������,�$=O��V���p'1�K.:|/�lӥ��+<���LZ��dg�4b�5��H�<R����+1�88�{���� x�#����2sI����� +|��?$��d�����}�Q3���]���Aʰ''[�0'�&l�R�3 =�br�NG]>i&o练Ɏ[�U��lL=�t�_w���H�Y���{�D'���C�%A�)Cy�t�)�8�tDzP��ˠ|!B!�D��D���Eg��̓~���WF/��Vs��'�A��\�U/! +.a{��0��Ç� +.�ĕ�#_��u�MLzb)Z���O���V�fc+U�����A����)��" +4�D�'���)58=�2�6L"��>^&Ư~���nc�#�{U��ҭ��'��T����Z�;�
�����$U:r�i�� +_�͒K��쳷x#LJ�4K\��4�^�mΔ�X]�[���X�VB�f�@)5:�'7}OV2L��=�P�i��ϲ�gc��0�Y�h-8�i��ҧ��Vk6�\�o��'�Nq���|$�T��(�$)�y���6A�ߓ�gO"�Hb��1��fl��s�a��rE��tku*F��������?�L$|���)�>� R�����
�Ѹ�oB(L�7H>IwU���h����c������}�[3��;�/��)�go�2�q���CJ�=� R��HO��Y���$B�kѧJ�6�)�b
�F��l{�h-8�թ�rb�V�����yZ��gcF�;�H�Ң���t@ʰߓŤA#v齌�3B�IL��ODxRz��I��;e�5R�kw'w9��O����D� +�y�š��|��%0���Ke��X��\�v�I�ِ�)�H��{�fZ;qR��C�{ �/Dn�y]&�O��k�ꉥU�S��=�l�'凯G��w%)�H�3�c�t:B��xO�����3$�0.e#���P�ɶO +|���XZE�_���\(Z�ODh�<R�^ihIy�)҈; +��rk�'e�����G��!%��
����������:�W!�G��{�DN���h���J\9���\�w��ACl +��w��ϱ��R�>"����j������'�3���J�)_�P��K�w�G���&)�
�w��Z�t���ݠ�Vw��gc�)ßH��aO&nr�#��<r:%�����Bh���;�]�����d�"+�VK���ic�Z�_��
�o���=)C��6Ki&RL�Ye` +U�B.���t/M�O0�tx!D����n�}~�yLҿ�V]=�2�f�^�C�Q��_�u�y���p�%(�I��䈬��!�I-�y�B�s9���5�k��I���A�Qn��ԩ{Sѯ�p篧��G�m�2=d�7���R�&Ӻ4M5����4�<�P��'�|�-��>;=NG��c2nc�R��t��`�����AJ���x��w�&ӷ��4�p#��B��Σ)Óe6���y�0��)��%L^_��rhe�{-G^��O9&%�4��j2�Q/ +L��AHi�L�"C�ɇ�v��M��å��)3�0�Pf�ۿ�Ղ��X�a�0)�QqVgsI����V�^U��B�����~l�� Gސ�p��3� ��L��4�RI�9�&M�?���V�!$)n+�Ye6��\�V0����YO'�j�
������Sm�,�u�^�)�d�w>��R� CҠ/eO� 5`2�� j'#��=%�J��X�H�Pe9zT�w�?�p�f�}iT�n�Qn��tw�R�����)OX�"���pO�%t���T&������Ϗ�]3����)�$�7e�Pf[p�r||l5pnd�ғ+�ĽH9�z���K6]mŤz��Ϳ +�'�}���nM�ty!�/0y�(��[v7t�%�OZ��`bsI=��P'L�'ol���3�{%�R�J��}&����|�DQ�5M,��$)K��B�cuq���\��B銞�����SV�'�Ofw�5����7����'H�#RΘs9���'���R/)�Ȗ1�BrT��k��,pY� +�}�+�;B(Ř���
�ɯGE't�s+�mF\��wO�;���Kl�T�Ȓ_�S�O��c�f@�=-M�//��:GnW?q�P�gE9o +����W�!D��dUb�;�<��s���[#�Vۦ-�����Q�|�_��緍����T��hw��r+��P��KR*��B��@�E` �kR��.I�tia�i�^��Arȥ��kP_ڃ�b��DJ�l�2ˣ�fgI�rlX?gw�>X���<���}�"W� +*e��� �Oh�)�5���Ћ��PŅ����������]lx�h���7&���\�B{������ԭx���hv�R�zE��,�Y0�C��>y����F��� �UJA)����_~��D�<�KT�n33��[jǻ�_�\'���?��^���B������kB�<~�U�c�>���7�D����A��A�$��;)��Q&�%��AG�t)K���^��y4ν*��
o����{M��O8p��r\r@x"B�<��Xt���)�P����ǎ�)Q�'eR�>���qبrۑ�]JƾИ�k7l��J){�'��@o<���q��N�4M[-F��l"N����A��2y:q�!߸f�l
W2��Z�;fj#��SWf��d2S����ׄ����iՓ�Μ)~�.�y�V� �h�G�<y��3�ߎ|�R�����������Cϣw��÷�Ҭ.}�'!3ՑL�L�ri�66v6��y +�0�A���%�Aj-\v(�'��9{-�ҥ6��x{"Zw��(%̝�ٟ(j9�1�5Ʈ#M�&��*=6�ʹX% +����&(%�}-( �$�7���&#M��d1���:�Uˑ ��� ���4�_}�Sd2Y+8�� ��k�7.�٩OK����Sn˧�z�Z�.A�<��dPH {�P&�W�ra3/���B��]� +��E�<X[ ��.[�(�g���5\�dK��<l�f������x�R�3�Jyb�e�b��U�h����bP͍F��'*%���2)��:�ȗ.����y��j����H)�s���FȤ��3AQ<�2���1iQR0"|�*$��l�f�_�JP&��Q��Z�Ka��v-���/�~�^��3P)� �$HPH��L&���R��~h���b�*$�<���=g��}����s����|�R8�$��Pʪ����.�7TJٗFa#����}��d��i��ع�gC��r��6C�����2y�R��hBnҁc��tБ/]�2\���ۑR�H)+6����rB&&|�IJ�V�Q������j9�C� ����29�ereR�-��G�w)̣�Ҟ�&Msz�b�j�R�@6<�I�����0��)a�8r���n1kt��?P&c +�d�����4��<@{�d�b}r�J�4�E�7l�;|@�*�w&�$!���ϧ�Uke2��t��-:��] +�����,�!l]}� +�����O�g6�*�be�C� +$��_���X��;�T�����1��H����I�>~@�C"��a(��R� +�t�R���u�f�:����N�R�eؚ3C�Q��JXkl�����
�c�fS,�h�IC�c���=����u�0_Wf�k����>�k�nL���1�ז�^�����O��> �~����Q�'t���z�`��'#���W�
xV +��t`O���=��?���7������F�{�Nvf��o��wvv�*�Q�J��*0� +�D��?�ޙ�a���
����B� �J_$<��z��;��������i�{w�F#�e=�{��\&C[����r!����7��&��'kn¼~Ѻ{�]���2
@ �*n{�Q�^�Qw�+�e��ǔw�T���>~'�,�U)+�DB�Gbe!��z/�E�"���-|tʌWX�b��v�F�<�6N�H��P&?p��dr�A[��_Wm_��� +5?&P�F����������1�J�'�3p��|R]]�9�M����]9LL2�Q +��LrH�P��<ɤv4��Β�V�^Z���Yv?���`�����vF��RB�(���M(
� +�H4J��oէX)Ϣ �G)�<�Ʈ@�C�*p�&̟���\q7H&5��UQ�^Z�^u���-�R)E�7�?�A�|^�u6�0H%���LϐO���R�����Кr��{$�$�A@�$n|�^v�$�z�n₰WSo_Z�[sSrd�Rޛ�>|��|��R� +�% +X�3��J*%�0|�,ϙ"g��,�3�9!�+��\JdR��"N�tg�Q�^�Ҋ��R����lr�?R)�i���'a,P��*Jyc����q?���DVI��1�?��
�IM�<(��.-i��[�-�g�b�\�~���{�� ֟!ɥO�Z��:,Ø�9{��ٵJ�:3�6p��V�ݕI�I-��o����Ѳ��c���ݷ85���k����k,K�(;�9�g��'
�8�r��[���a/�#<�4+�, +:VInI����(o����d�^r����@ԛ����/��{w?p�_��&�4(e���D�Rc���ё��D>�]+X�kd�qj�2��2y{6��p�dRw +V�Nͪ�^�3�2X)�mP �?s�bֺ�Vf�{�D0�/#�o`�7��Β�Vm_Z������_~��B��pS���E��TTz��aL�tZv��2Z)�8��J���q%�S&�I?�IH�d:A�7�.��ɲ��G��=Pkɳ)�?�(�_��;YDl���g���O_��!�;��FJ*��*e��'� )���2��H&� �����zӏ�z,T�=Y]��=+eQ/��0g��"�c��b|�蛲��I�k���F��$!���Yrڪ�KK��4.��»5��J��j����;>i�:'�:nA){;,n��Xepx}P<�4�MX�y��d�@ +ƏA����)(#��n�a��o�$�<2�cI�GG&/Zw��$��Q ���ھ��ފ��}!iD���_~Ͼz��dÈ4�0 +��$�l��WS/`��_w�t��7������U6?�J)p�0g�%z��*u�#�"�#�eDy�� ����ڔ�ן8�Ȉgg��nW������4c�[��4�R~z�Ű��:�,��,�G� �L}��ʳ���A�H�L�Bo�H��xV����ۗ~�,9ʛ;�`:A)1�0��C�|E"�<g��� !�$�,�����)_E�,���%����L>��E�d�xv��ۭ� +����tb�X:�O�����Z�`
�R�Fyx�Qh$�TIcz���7�8'a0y&�'�2Y�d�̟�L/b�]U/`��_w[Q|$��w +�H\A��=xraOjVD��EI`�N��I&�������Ό�8�隧�ϗ7E69t}�y^�&��+�t���z��/%�v�p��\�ԧ��"�>�A���nB����.����W��C�(�y��S���&��r�t+�Y�H�J
W"U|C�~��KJ�Ǭw�RŔ!�3c[�1
F�d�I2qǐ���xC�o)B�i)��L�N��0�&���%6$5�KL���#x������G�;��n�䟴T%m8�<�9�%��S4���o�����6����� I�@Kq=o�w�;G�nۊ�h�х�|�!�`J�d}�<�v,�Y���l6�I<i�����]`�4M(�,�^�H:;`%5bdɑ�| 4�L^r1鞽���^U6\��g�*
���r��C��a��%��BB��]`��Ir���o��I��~V!I�\������>&�o��zI��k�i[і���p뺤�u1�3O�*�QL�#d��I�'�����LH���;�,��o+R�1����;ϝ� �D�D��X|����
�R�&����K�!�R�]�?y;��i'|�W���KCr0��X�,>��{;P�7`H�dt�~���ìs��VB�F��*�`��V�7����'������9�8���QN;���� +\C�D�}��#Ig�J��E>�B�m����'R�ӆ�"ixؐ���c�χ�n'
��=B��3��]L��It���f-"�`*E�'��G�I���)�\R&'vؒNK)¤V��3,L*>�����E�}��o|�| +�Dң�[+�l���v�u,ޒ�fZ˭+�G����_��2���T$fv��S3DJ�U��z�DJF+�7�����$����;
�S��2[+�K}��t�]��aB���z1e� m������л�~>����R"��eΙFc!��έ�|���F�
W"�%�F�I�� O�)�K��H���rڰ�8�:������3Rƿ$ %R$Z㼩��{W"=�q� �����t�)�p�m�yۊ�d��@�}z����Y:3��JJ�[����F��,��qB���&�$H�����a�os\7h�=$����%�L�&����8�ͤ�j�߹4���n1�ȡ����3��)���틤� % +n����^_�G�,��hZ�m|R��0e"���<9���X�iI�$O.���<�z>>�j�<�3��!�R� �i�^L��L�����rД/15�D6���Ė�mE����l6���u���A�]W6<����=H�"H��k!�<?zo�+�I4�mչt�)�v�u�/��ת@�1v,���u1�3�C���4��3շ^!<X����AR� % +H0i9�0��0����3L�z6<9��� � �2o�����r�PLhĆ�"0�98H���h�;�IL��6�VtД�05.3��תR�#RF��p6��/ +Q��$�E�mHf�DS��ɼ�߽4�Z +&H㑒�#RʆB�l���,� m+ +L�`��ڪ�l��Ѡ��6~T���K�'�'W"�y�0i%�# +�D'a���?t1���<���|�)�z��X��Z�g�z�9x;$�"%�v�)�i�)��юec��^��$R����Ӕ/��7h��Jd��]�kU���ҳg}�q�Ob&3�IYJ�D~Fە3�����0�k���1.��z�mE[�_��=.F���Z�A +V������$�*#�%RJsc���i�$���0�R�.����dL@&�@�@����R���+�Q,�8�+δ�q�h�_=�DX���q(%�8wr⧟����L���ڼj��,��z��IQ��6ǃj\�kNA[f�k�$^���rθ%��r��ď?;��s +2 �h"V� �<4�4^WGú��ZU�6�v���=J��IF.� +w�̈́c�=��M��~�_�ghf��]����S�ɷϩ���`6SV���OV���d�-6秋1�}���ᓈ/�U��#��
�?�?I}�G�����>��;9��G'��#�~,��C��ڹ����I�9�=3z���+�{�a����k��?qz8gd�%�$ +g8����& �D��y����̉��^/�Z���,iU�J +�$ +�< +��J��)H
®���A]T�*Cp�&��N��l�L��nf�U�YT�*�V��%����6a���50C00D�?���Փ+os����9��ؿ�At�jJ|�LG�q'��l/�-~zG�7 0����O�hA�W�\�m5��-�2��V����*Z�<��!��Q�=�d��F���-��V�"`R!Z�Z�Ϳ������ |�;?E�*8��0K�2�HGܲ,K�� +w�0�W�քa��+[�<.�劣SU�Zy���Id� ��h��"�fm�!��a�Ss�,Z����:���ŏ��>��ĵ��.d쑭���J �(h5�iI5˾���:b-#�0o#%�E?+�IF���x�����l��'�Qw`�4sm�H*��3Ͽ���9b#�|�9�.Ī:��Id� .2}'�lY��; {o +{�0y�=k=+�7�8\�ɲE*��'���k_�k>��1+��m;Q�O���� +=Sb#�VS2�H�'���?]�/��}�,�6�P�.� +w�0i�O6s��i"=[Դ�-��=�ұ����7�'#�_G�p[rH������sē%�^ l�J���R� +�$E�F�j�-�3>YM�#D?�V��x<P�|9����w�������( +�C#-�%��4�l���0��V�����E>������љ�x�H$�D�#�=���>��D� +�=�$A�Y�H�\��4:�襑S��O�|#�܊���⟞={����G.\?}�|ٿ�S�+Kڸ'����Kz%QOC)��JJ6sµ���,�LT&)��Ъ��?n�8��d��U��%���璤�䓉D���[E���J���b_y +�s����}�����tHO +�8��T����Ssm���֕$+F�".���P�(��. +Źڬ�6�:T�����Q��ߵ�O"��4TJ͕W��r'x�(9���$ I���O= �����XN�=�? +�+3�8��B0����gS[=%��;ˋ/�qU�b�'D}$�C�*��, +�@�S��8�e1����[� �g��Y�4���U��rgI��(9+ʝ�'%I��t�u�KkK���8�Ӥ<h�'Î��HJL%�'3��]j��� Q��c�D�$�����~H؝ ;A�㩕bA�� U"})i�`�.�|'V(*>�Dt��T0�|������v�Ɛ8�{��bR�I6�eG���X�(�Z9�-��A�:���E1��/'��|�Ŵ���ɲ��n�����w4e驒�����/��t��D�y�C=�n����zu ��������^<CO� /�� Q���L�#�8��K�&<�'A˰ß������ɋ���$;)����r���O����t:�D���姻e�3}l�ߛDOb�h{�@Rb��xi�"�/I)��(�*~���]xA�p��=q���S����C��fT��>��|��{1�~05����$�����I��a6��e����?*��/���W5�������;g���l�k����J<z�s{��]�3�a�nk�GO��[a�d��d���x�|��*��J����S��HS���o֭ +�w��jKЮM�|�< +� ���J�Z��$O|v؟�_ +P�� 3>�o��t���C���,
�U͂d7�;�V %g�I�${r�5Tpi`�ԓ��N�ߛDObZjw��W��,[\{S�D�|���~H(��/)�K�$0���"' +sS��0H���b�<)V:���o(��I�c�\���&��z��b2�|�1�$m����$��;āko�`\}�|0O%_߁Rȧ��E�r��|'�P�uq�n9�d�Ԝ;x��@߇�u��Z�H?���Jm�K]�T�{�I.��;��aC�k����(9 +ji�4�.;�N�ꌒ���i2:�dm\�����x���Ld>�v�`�n�+���̿��>�.ҟ���T�Q�y���$K!�>�^U�+qGp�)�gQ����9�ݔw6��'� +-v��Y`��+�I�ѩ"���[p��������i�4��agi�.����uR1N��<N�#ԧ:�A�a�
�0<I����bA�#����ԝ=O��&����F&u��˝��m.;?z���= �p�0ӗ��ƚ|KK��0H��U��f'xO������u�J슝 ����3�1�h;c��"\#�<�^A��ٺ;`�`��� +�ƾ`b�����h[��4Aix���Cx�!)ICK�7ۋ��TeRֽ�JU�M{�fm�M�'��DiE�ec�s���������飫+�����>gH�v���P��J�Q�I���m���Ho�T���'i�WB�?ZF�|2.u/S(�r���c�*'}����J� +^��s��=hg���6t7��;�=X~|�r�>�v�fT"�x�L�_�?����;�H��ɂ�6eEk��nU�[_�N�dQaUJZk���шv����w1��q�R +�5�mY�����l�Q��lDne�6��$@ڡ�O����?��wd��[:��( +���Vk�k���WX�
�2�.���$���<�<��H��Jf�'oD�\�m��X�"V�s�@�6���2�CR?L��<�M���'�d^��s��0����V���Vt����+z�&�����9&�C���+%�ԤW����d����o�*�x�'�y�'�n�I\\{��-*%�q�'i�*���C��5�r��$�Ef�R�,L[��S�H�i�X�q�E��mG�b�"푯# �W0h��m����߳�Y�
B���~RڦdR��8K����,u�N��{��_�d�H�A�Nmr(��ѩ�hP�5�J�7�d�ޞ�I��E��V�n>y
=����VCy�Y_)���*=���)��$����O�wJ�Roz��j�?D�?��@h�|8և7�7�_��!����xK�}rB�v6�!�f�'�up-0�m�A� ��J���~�̀��|%G|���|RWqTm�ή�tk��C%n�'��O�J��ɕ�X���B�"É�M�Rd�|�O�r��
��i/���@���#��5�<֊@/wy�� ��|ra�yxU�6��������E����)��|�/O�d��^m�sN�̸R�v����I�ٙ^����pN}�I-נ�����
n��vTSST�>�r��O�Zq�,��|2J}��W�B)�mV�J��`ٞ)i�a
Kc=�>��r
6q������vHB�gzf���;�&� +�dK�z9A|X�|/�㬶<X"��M�����:�����z��e&~�:���o|� +��.K�w�������f���Z�� +B�/�G��n���e��^;͓S����uf�����u�G����%A���}�C<�*��xK�V��ߜ(��'5fr�o�o��?������b���,���*^uZ�
v�š��\����>��k�'_27��ɼ�<�ņ�$��x�����t{��]�Y)�V�>�ʜ D �8Ҏ�<��'�gy���'G��&�zʃp�}�0�c�7ӳD�o]��B�G���r����� "$\��x��7������533> +��ol�Mze[nw���h�����y�ɞ�I��>�����j�[�I��J)�����J"`�>e��nX +EZ����U�%�RܨCRe]`���&�Q���0,O����o2����L��~r� ?�L�8�v<��zҍ�wCr��� ��9�{����7'<$H}�ҭ�G�]NÌ���}�m�~r������2K��� +�W�W�%�����6��0��q���9�����~���F�p�9Y~C�i@�2:UւO*+�'�^aqp���Ez;��)*l}��rI�6�v��OƇepD}2�Jޭ�n�(��6��l���*w��64��w��r��RY���Za:?+��V��t&u�u�3=�/;�KKĠ.���`���"ҁ��hڋ�т��Ll���Hh���;�8�l#~�+D{��I?�8��Q�+����M�է|Rc���Z�� +>�V�S>���'�����"+=�r�!cT�V�Pv D)/n_)� +��Y�ʙ +V��rB+>��<���} +�,g�GCO��֗�$���Ħ223؍�{U�Q����0!"z^"eT���*�'�TмM9%��Tkժ����$�e:;_�_r'��8j�)Iԫ���.�]k�#8�O +ϓpC`�:Tjϓ�u4���-Z�C��I�O�K�ÅV7~���������fyu�Jo�yR]e�����Js��Dx2O�-v��Gض��^�DDY�?��p�UΞ���*��b6IY��q�����oe Ӳ�|�x�9 ��7}t�p΅ƻ�DJ�Ҵ%�������-4B����D��e��<��7J�Zs�Oټ�ጭҵ�8��q�
�$�D�AiB<�8DϜ�9l��J�.���fO�'A<On�u�m���'�hDw�r�]zy�_�DD�).gFJ�*�x���N�2A�BO9%�^�Ϸd'�VV�b�g.���v�6qҁD�Jxt�'j�n~|Y�B��9�d/]D� +foq]��� <)�[�]i�y�Hnc��d~v��Q�Wi�˓�(g�~��C�<w��&T�B�6�B3N|�����F�[K^��ԉ"%�&�k�.���@O��̜���2�S+��X.hŇ�.�i�D��d{���T��!鶈w��Zp�I������n���?Y��=�������r�< ���Ojjm����CF�Dz=��n��(1E�9�H���)j�M���D������)���C�N3S´���l�v��<��^ +�@��;eNk���MQ�\��,�B��n/���n�ѵr�$y���KԊ������_��{�X�zdރ><TT^ӜJ�������Gi�!����K����S��NΘ�'U5-1�ĥF��@x2��^vg��x:Fx��(ye)� +U�R����$��A!7�sT6���lws,7�fnz�R˾�c�gǥ3z:�j�) �T<�HϓP�K���a�S�>� ���A��1��d��]-�k�|p"hQ�6ɣ��TaQ�YVeUj��No�2&�I��<�]�HIx2��d�Z��$"�]E�9�H ��fN�-O��i����ş�����b���J�|NW�~1�ӷbS.������J_��rB�P�.�D� +�cA +��� 4��"E���(�@cC㝣2���H������!:�ovj�'+j�'���*��'�n�b�`r�Z�b$"�2�4Rrq��p���U��wL�%@��`_������F��J�Y�AZ��G��̺���>-��I���y�*W��a��q;z�G�h9��@�^�� �;[���q��P���A��C�`���5O�jZ�U6EU3]i&<�/���i�����$�P��s�ra�5P�l��ay2w����r�B/��~�z���8 +�Jm.��Z�s/�Sg~�}g��wC��]p��ia������e��Z��K�|�u��vp�j��'��љ�ضs���O�S������EZk�'UV�'�
xr�������=�� +�qLʖ�O�z$"�J��v(CH�<x��~<Ճs�*!I'�4�B�N|�ME�E�aLE�4T������M����CߘV��tJ�2�0I�j� �w��?�����y�<ȴ��=��1I H�m�c�
v ���JK�r�WI�`��\B�V[�h?L�4E�ک���I�6m��[�\���F�\H��=��<�R��{l���rH���<���c��X=i�A��>IW� +�PJ�P����pL>��L�:���_H��IWi͊� +����5����U���� +{��2����-�n�t���
IHR2�{�r��,�҉�B�܀����1`�u�s��% �L^I�JwM.���/?O¦�x6y��p8����"SgQ����w�����%�a���T���B��6�P!���J�.�Ԙs�F�b�<�w��9٦��d�dJ-7������e7���I݃$$��9 I����*���1&� +I�;џOЧ�Vk��T�̬�+����r���wK��X4O�S�nNF��R�g�?���{��7GE�"{����j]x�"?s��Q3n:�JԐ
�ܥ�+5Vy��ē)�B��g�4���mHB�����Ti�U��+p�*���'��5y{�*�QV-=�AJG��5�gC���kqK��yZ�>J����'�\�����:b҅���E&��V����R]�z94�x
��I�(��3<�)1 ���<�������j��]�V^{-�M��B�$$q���\��j� ��P�C07-�e�m� ɟ�./- O=��z��ݦ6���
ZP<�G�`���u{��L�oIh���p,�5h�M7!�6�fD�@�P�`�sNJ�as�(����3�F�ʔ���dˈ'7���+�}��mHB�� �!%$�B����Ϋ�;��E���4��CVt���*�6<�`؉;@-,?ͫڿ��ü�E�����e�6�f�^"���N�R=�^;8���9��i��y\;�w�bWjO��`��3s��ۙ�+䑇;+o�Q�'U:0R��2[[M<����m�B���;��%�H���ݳ�� �lߑ*�� �5m܉F��Fm����[5��KmI�Ǻ�&w҅�HtO�IA�l�f�3��/��wS�<�؋g;�P��� �����z��?^�Rr�ߣ�z��u�]c���6j�MO�3?��Oj˵�HZcO2�͂'s��O�����Y_��UF�$!�TI R�R� �&aJ��
�Я�U7��5��y'��L��}���Y}�zHTR�N���{��~�%o���Ӌ��B�Q�(��7��BŕJ̭)I�Q�x�Xg�W�����K�4R����|�)�Ժ�-<�������O�d��'Sv���1�C-�IS�#!ل�KRF��`+=ތ��2�U �q�� +4�O�ҋ���c���H��J���{2��c��r���2���l'5)Ry<8��ϡ"�dAqx�-,�On!�L����P�P`�� ɦ��TO\RF�r�!��~� +YO!EJ�h�_?����X��|}���$I�^u��� Ra�Q3n�U�ܶ�,xR�Ӂ'�^O<�j����b
u�� +�$ ��IhR�k��F�H��ڰ� �
�$�eA7j�*��ؕyǪ���& �@�5�:&R��c���i<�f�W�]�wM�g�O�A�?�Et�l���y�]?&#%i0��t�#��ix��{ך�s�E�
73�Α�vSFVqy��z�Cf~5�d�.nC=��+���FBB"$�I)T9��q�S�*�X��B��`#��_ɪ-/ +�9"ɵHɿ�*T#6�m��vv'��
�xy�p���J�5 ���sXh��yҊ&]������kK2�e&c�u�]�$_\aB`�ull%lh�(��6�a3�B3����� <ɽy�'��Y1.~�[��yO���8!�BJN�-Ԩ���--R�>kڸ�9�G�(����j�2��fV-��9��iL7j��.��ޓو[�[E �'��-����D
�e���P�v|�&�o�o8���������>�3}�=�y/�<�2��!/��#ړg���me��_ +��./g��MA~5xR�/��Ynn��e@�=�c$�5!?iH�fU���φ8Ucl���3���]\�<�TfVj�%K�*��o��ـ��[�'G�^ +��B~r���i����~�?5����c�2��� ���$H�CDaAř�$""WW$uwj����fvv���ڭڣf�v������-�P r�p�r�k�췻!�N�Bw߫O��P �����<�}�-O����[�|�'����O����#�e#��g��`RJ�13�C_^�����S�l�F�I?�}I�8��n��f`N�$��|�@ �e�,�y�d�M���U�n$9K�1|N=��@~{ 太7�$��Ż�I_��2���FB���"��l3���~n@♨�z��2|R��ا:���D�x|r])�O�03�[��<+$x�a0��.��uN�3���zގ�Z��k��`��QS���}���m�>�@,��5:,��kQ0�P~"��@��#!���^)�����\3�g����%�N��0O���|�?����Z�}�1I� +D�PÁ2�$��B�G��F��ťs>�7g�O�`����伍r_����`�bc� RJX䨙�m^��CWۘ�Z��=��u��[�͂��\� mR�J�ݦֶ�̗��́{�CG��>�0�����������P� K��q�Q���>�UD��.Ґs�t��Ӣ�SV�����6 &�a�!0�Z�t�Є~wQ>��$��b��U��I��`�����5�`SJ`�qm��N��(`ف��X���{�VF�)���y��}U|R�W���T�"�<����������b?<��ɾRꑙ�-�O,��_2"�Ƽ��Z�Y�k�>��sa��8���� o +��r+9g[�9m��j����6F�O&����@�F�Z�����{->��9�_b�u�R� +'�T�Y��X�Sp��mx�5t�1�۪�O�����d%��N?��`�j�b�9n�yƎ���Dw�Oe$o>9lB��ރ��T1��S�G��%įN�L��&�6�'�$;�ۘ�X�M��Y��L+`����"|2;[2�}r�3�y��e� -/1���1JY+v����"X꫟vC0d�-����1���K�$0�(���\�.�U��i��i�ڗtĒ�eB�ߎ(���i�&��©�Y)��U��j�L�6�E�+E�p%�L
\!@}�co1q�쳢��V���L�ѥ�ϸ���������y��-e>��L�a���9;�\�� :f��Y�JYC=i�[I�qK=�&\CkZn%a�|��J�u>~W-�m��(���S��JT�Ӽغd�Ä���Dl���.��탄���<' �ί��������"�.����2r�A���� �Q�uj2&j�B�W���b��̌��}2�d�.p!v���GZb0��#~�6��z�`����^�[�<3�����-;i��P0�G�ne䝒�_D��*���(�ֻ�)2��Rh-܆Of��۳ådWዄ�7<r����7x9Kr����P�����T����Y'�~�a\��ުPY\zllfLt����'v"<�<�L얚�v��@���"Wʑ +�7���u��U�٨9V/�}y�r�
5H�Մ�.�;>:R�n|Br���KbƊ%3˔�[�_D��r*#��B�}�ĩ�R���_!������/ +]bf���i"��p~}��SL<�'��(%Dp���)��"���<��a��ec���2S���`0[F�J9c%wB-^r˥V�Y;����n�MZ�L��\:\{Z�wL�II=����-3��-����D7k�����r!�nB��KC�@^�8}�I +�|;�d�!�I쓻b0�[�K�家т���>�Uʑj�����ۀ͚�K��hw+V�N�-�=��ƨ_����S�g���M�
�23��L�e��0���/!�ѫx�$#��}���k�.��b+9�@B��RJ.�O-��c���v�����{e�����ߛ��I����3㓐����-���>�UJ`�J +�Z\�z�服`/~�κ�MT�Q�����)=p� ����Ho�J b�!�Orw?tT�ŇC���"b3��L��-��E!r�[�F������CWI_g��4��d`}�]����yyj�I�I +t�C�9O�皇WI����=�f~��"�X�u����>:63;;��n�3>�Њ�<�"��*%,�Z��-��.;гv��`�Vr����ʈ__:\���?��HO9���S�[sK������f^�p)�UDx�ɡ +ꑙ&�5Ԩ����]�U�.������D�*��K����&��NW�l3���|����M�7呜O����T�T�O�-Fx�?֢�hGbm�f;�M)a%�5̮$��y-�5{�.@&A)W8ü�ܝ�j=P��+�?��vu��܉���pH�ʷ��)Sd����t �Կ���E{�RV �\ܧ�w(xXE�X5 ~��O�B�H�����O��鑚�/����دۧ��;��Й��1��s��ZiW�*AY+,��i�)���jʃ" +���<� +v��e�����G��T� +�������^txZ�`vIr��@���1�P^������A���]t3sn������Z�9z��O*O>q�*���e��ɍO������B�,0L�f��Z��mq��'��SV��u��ǖ�֡�&R��j=� ��=�aٳәqG��}'O>w�`�&m�I6�d��`n���ā�����R���i����d!`K�����aS^�x��{�x/c瀵���_]=����ٲ����ŨpqÙ�_p��N���:XG��`��z��·�u�I�wEr?0O��ad�m�jV2���D +s_I��ǘ'�JO��⾑��[��q#�%�O�#V���\/��H�R�D�a�)d���f��hjoeN[�C��By9zR�M)�`�w�>/�%�I ����L�w��zÖ�⪟<�d�|�E�vPB�Kr���Y}���S����ز��Hy�L���Qy�$N�'UR.� �q�Q��3�����'!�a�)#��(�KmXX?%ӡ#xZ�6�6¦��̓�5�#�:���+|I ��}��r9��
^B�^�*Ua�{��.:�ȿ{�WW�\__�����SEǫ6a����ׅ'�����3v�}`� �t�4�'%\<cē*�<��:R�����f��_\.DO�)����n)��i��`t�\t��$��KfK��� +�����Gs����e���_5N[��l�*��Qdw홸�H��'5`�3R�}*��Ӷ���'�l�/�{<Y]]���eS0���̓xB�`0<I 7��Ӵov�'��+�g��ɋ.�+��$�y�e| ��Q�G�m���.1����"�5�"�%KJ�r�Y��#��MmR�����'e�*&���x���v��,��f#@� Y�>9��p_�x;�i�eeH�uJ�n�i]t��EJ������Яxő&4'E� ��{Bv�hZW��y��ڌ���WM����.oz����il2��r�w#>��;YpQu�Ϫ+�>�&ܿ�ۗM[�1���g�t,1湐���T�jג"e�l�a����`F-��xJ�I�$��-�d2�'���1O�uH�d�(0LNe���E�n��r��ow"j��S�<��$e:K �? �(1hN��p�x����I��2i�)̥�]��o��U+M�doa�����1�6�>)a?��R�%��]�E�8)��TI�=�XV�d�)�%EJ���VXp +)���A�dH �L��XZw�y��øE��KЛL��'��jj������E�/���&)��6��*���s�ę�|��,$CJ�`��v1R�k��݄������'%�$zR���K=��'1L2�)��+�����wO"J��SV�s��$��'���I��O�҆I6��5�Gd 2c�nx��'u�dV/8�<��4��_&��5R�Z�CDOr�J�8k�cY)t��Fl�E���A��� h�T9m�r��^9��MO��6MM���{��O +�'?��K6H����2$li��0�g�m�N:��Bk"%&� +�X���8rK���fãÒ��2-w�sh9�Ȓ��U<����Y�����S(}����`0�KvH Y�P|GqL�M&�I���X����7
o$e��a�YH]Z�k'diR���wUO�'u��Z��x��}�c0=f��VĂ��7��̃I�rP���Z)#��EQI��&�� ��x2��!;��w��e�6O&Y}[�A��1��v��k����|�A��y��d��[ �ᕘ"��C�%�H���LTR�]dHi~)��g�ܖ�F�8�W����H���j/r1ϰ�3��w�9gC�>�6�!KR��<�<�^B�>a��BI���k >�Ʀ%���W*aK���k����ջ�)�h7'��k��'�G
��x>�2��{f*�v +�oH�\6_?� +AEdR�����
+�-QO����^��g*J= �\���g�y�h�T�� +ո�ͩ.�;'s���R��r��O^��)���s��2�t"�C��w���U�uŲ�^�c�N譛�g^� +�%�Rq�Y(%m��~ ap�i�nk��_)%�I�I��_)�9N2?�'K�l[��*|2�%�i��/�y���tTw) +Ly +�K@)�IcU�R#O|��\����);�i��(�d=�pm�\?��5Sy[ +��۩D�֢vV)��r��m����jhg�%�d�K��J*��ھ��{� � +�%
o�pV ������Rn��Ǚ3T6(�j��a?!%��Q���O�\��m������� +��X�\�H)i���N�/��wp'����*>�'�0+�O�6d݂�5sP� + +(�R���IQ�!y�|r��3�I��I~3��Odo� +�Z�֛ +���l��Æ�H�F�O=�Ac��7RN��k�% +����g/o��:�l�!
�Wv�)�R&/���<��d ��ux}UE�9D�a�Jg��n�h?�t,�h�2��$�����?�* +hT�`HN�9�0/,��9ck��a��َ��qv�Ѕ����E�qH�#��u�ۀ�,X;�: R>R�嬢p��?�|,��cד0��2���T��
?���/��:
���IF�{rg�k�a�zX�,����E����^-)Ja"��Ŝ�H�F��}�)�:���^�W���{�)������zZ\��i��|w�mL +i���f��ɍI�p��q�!,���iT*X6�},�I�[G"�c�5��9���G��6@�BO�vV �E�#��)qe��ȿb;��$�[�����<?�L��*,]����8�s;���}�P��YL-�-RV��_Q�Tw�@J�V��λ���b�Y�L,y���_/u{� +U-!*a^x����I�cn��e�&7'y~���
Xr��DXF%���ME}�FZ�2}Z�)�9!R�e��i���4QADʇ��8��k�飕����P +�vː�����d���l{��g`��ed{{/pK;�W��+�X�$@�4*.�?_t��j������D��)�Lx�9����!�o�l��S5���(F��ZB�.�b��ΰ�q�ʍ
#!���)��'�%��� ������{�Q��YW��|#��?��YO�}��E��t�Sg'M�қeS��R����Ȧ�H +.mk�iw��|XZ��L�*{(`|��R-���]�}�bJFV�Hy�1���e�;�R��R�4�S� h��y��,q`;���8CF�"#�{� :x��s�r%(�,#�"��
Ci��4�-��k��uV���f}9,��F%�uE��Ġ���D +��p~�gK�仳ls������3�cG��ׂ+ݞ�� כ)X,`Y��Z��t�d�<!�PR�D��>/�p�'�g�"�]��8WvJ:�HJ;�5)��z�֧b3��C����"Ͽb[S��� +ӭ����?��������2��g�+X���iT\$$l��R_0�(�LʠR�u_N�t����)�H�ȓw8Q��w0u�L Ӿ�Eu=x�43�ȋ8�D�q���� #� +J�E�F�Y�����xG��ð��Zڼ�p�6���/�/�g�}�C(Y�0�vf��8��'I��L��p�<�B�*Z��QYK���×��{�A���"�HI�L��eO���w8?��^:��'�Ӿ|EuP����G;�'�Iq��;�6'���Qd�v��T�ɝ9~d��mֿ�,���,&.I#:��Y�vRRi�J�Q�@1)�1�ɹY�I��J�GQ�}S�C6��`ȋ8//�� +�� �� X>egQQ�Le�NV�H���� Po$�dz��H��a���#��f�<IQ}22w��FE)$��3�:ʍ�!��1cc����K�I&ʖAy�'q��^�}
|����Nj�+��뾜^�Y3�����g�O4�N�u�J��DQTO��z�;�G�z�_*^X`{s������d���א�TY��vXj��5%@�`9,��;[2��C����e|;o]L)o�709_V�M �3�{V�jѐ�����r�rc�%FvL���7�vh
U�vX.�ʒ�%Z�]m~�w�����Yg����2IK�5����H�DJo�<\g��Q��(J{>#�Yd�EB�-�� ߛCC*�ƈ��i/ �,S;��3Ku�iQ�Fq����o(u/� ���'%���h���ۛ��(�)F�+�e��ȿb;39���tl`��ܚ�o*�KE�RX����v�~KR +F|��O�o�6r����iw����Ȑh��sv{���ɓN-߳e9,�1
Kp�5�������$L�h�@��֤l�
?ehZ��)��_�$����Z�'���������ъ�����3T��`�0醴*,�<�q�
���a�`���e?R�[桵����)߮뱿�g_v��v��;W_�ׯ�t�G���˿�������ÀGB߃���5S�,n���������,1r����Y����=7�)��RXT㲑қ��ݞ���u���n��� %=S2��&|��
���%R���ݚ�O����.?�]�HZ�^(��W��t��8���c�_\��u�]|ď�|t���0�lh�Xn�a���23�D'u�٪���a���,#U�*���ir�mR���4�ݒ-xO����R�#����}����g�����<����?���|t��>6��툢�,���1rj���]d�Q�����n�pW?��R ��g=�r`0E�$+��H�Ğ��0og��
�N���ߵ��A�C��F����ؙc}4�sȏ�;�{l�[��D]�� +7�D�H�;�~��аL�f +�S�f ��6����D�~^#eA� +�}!ORԤ�{��6X��r�KH�~P.��A^ +�㨨%Dx���`��U�@��4�n��r����Eʙ����rh� +�s�r�
K�U+�m��)�7{b�iƬw"���X��,���w��rI 3 ak�')jB=��D�;�`�)���T��(?����e�t��@��T�+�H����he�/
斗5��~,(Y�ΡoO�rk��W8:�<�}g�7�GQ�_ކ�u��C�4��,A�t��I0�RH)��úlgŅ�\D�W�X�����AI��IQ�L��%�A���8�>�2���I�Xb�e�� +�������<�&)j�����#�H9�`za�>�(jrٰ,*Q�jL6����t�4��.�~��X�DʷY�ѓf�(�*R�J6�� +x�o�M��ɤT!��կ� ? K3���(��/1t�9=���2a�rU6,�a��8�kX6:��;8�bH)o��#e7�����Ii� +�W#R������\_>�_?� "t�94���_��s��]��0�R4R�"B�n��qD�%�H=NJ��%;�dʩ�|�@�yU����М��G�r~���#R���23�D_G��\�*ᠨD9"j �3�i�>��i�b8�
��qR�Ͳ&��kaҡ���8m3�����ug=����r�`�v�u�&�r_}X�<��o8
�pΠ�HY[�-�SE�]��[�5��� +���R�v! 6&��uW,3t�9��Fw*ʃ�{��ٰ�u� +�s.�}��93��e(�;�=a��Ç.4�s���@_5��
`��`V +Y�\e�0��I�:��T�'%�yb�H��͌���Hٽ���T���ۄ�<�BHD��{��(jJ�TPR�2�ϓe�F7TKp8�I9��?ɌO����3L�L9Г�9���z�i#�8ο�vwI�xΜː�V�6j�+5UWiz��jWEj�6Uwە�Y !!`��\�������CU�O�"�c�}�Z. !�m�`n�1$�ߙ��, i�g`~�W����3g,�j.�,Xh�#�&��H������E^��,��e����D8��٤�>���f�u�g����y5sR�宺�_���y(iM���F2�ln��L^U�K��a�+�;���*[�.�2cڙ�%�j>T�y�YI ��SK������cJg��)e�xJ���_7HJ+s�Z��G�~��5�8c�L�2a�~ɁeRZ��X�a P��Җ�Մ��_"��!��1���a�RD�g�T�.�c �5���!`����f����#Mt��'$>�0��r`9-E* �9 M;�6Н�H�'�)�ZL +�MȺ������6����v1z�DR>Փ�.1|(a�K�v��X.�(Xf����j���"C>1�L@d"�'�F�փ(��W+�� +�J|��=jR� ?���~�c�����U>�H��[09�D�ڄ�°��fX·8�2ӫ蒋1�vJw[I{�-�NK�np��6D`6KNs�Kv�9g��{,�����Ťu� +�N8W5�@�/3�2�W�P�-�;E��/��j�R�F�-��,RF����Ń/Zm�ҙ�����_�l�ox�`c���G�vȹ!�#M4�.���c�g���)�p31R��'c&�SA��_ ��Z���>���&�)�O�����ü<<�^�HJǓ�/3�+�a^�< +����Mn������-�M��H�x� .��b��[�k`��&]O�z5^B������뿓1̳��<H�!{;���Ҿ��R�����TP +���^��j����R�V�͉ao���6���pj#MN�b��(���ޟ
���,s�T;T\�K=(��'�HJ��!!8���J�������ng��Do�������i�� r�ǘ�_u����*��� >��r;U:;���P���g�^�\�K��ô'��V>ܨ~{��{-L�u�0l��m �����JD��r�!p��Ow +��{DJУ�j1 + 娟�����C��_�+�gO�'��Z%�;0$l� +΅�s��#%a-Ʋ�������J�d�e����J��Y>�UJ�YIɁ�Ii�V���a�ӽK0��;o�U���0�m)U��c6 +��D�|S�P�S"2�]�%�OK�z۔&%\�w�G�&�a�3-��e��+ɠοI�!�{B_}V��'�$4TK�����dza�HงI9���^�[�bD5�SðX���y�T&e6r���`b6�3` +qX +�*�F0`9��ÁJr��qI � +`�鰼!�o����@U����-@ʁ�L��F��V{�[��De%������:�B�gO<><9P>=�a���� +�+�ԗ�֒�o�x�����ػ��*��b��� R��*�Ű�J� +b��F��oU�pv�h���R��J_ß��<�Ǖ���m�N����yjȸ�+M�5*���+�rgC��<� +�+�e���]���iEO��yXf��A��0��K�o����0,}j�ݳnҐ2�9ُ �ace��(Ս�bt�#��h�)�E���Z�|�t�Q-_��zh������|����w��۰��z�s��r��I��j�������Z�|�]Gc��W�(;�G�q(>f��13ƄdΓp��a5I�J$*��/�&ia'��m�I �����a����XG��K�1���h^�b,]��~�ּ��Yx�����8���(����6T.������f��\��m:�X�-�=�FPbZ4>�ѓ��I(���{�n�d����aبIb0���$-���Ű���z�a 4��ԍN�c�̈ۦ�S˗��Kõ? }��Ю�������sQ1��4z�4�]�rO%�p���Z�ĸ�l�Pb��И)7�'���$Vkf=94tb=x�-�/#n����ȟ#���YaN����M��J��4�n#݊�q�\�K���j�� ���7C{����9��'���n�6�����\:K�w���e'�cυ�u1&)�#z��=i�/��ZN)����t?|0�Lin�w�� )��Z^u ��8`ؔ*�FG�8
(�]ֈ�q�u%ڌgi�Z��x�1\�jx��C{�|7�I��D�b�^ϹC��#��J�I���J�|���蘄F����A�\�/%�����L`����cR�IE�Z�8P>;��M�a��.;�n�I g��"&1,mb:4:�.�11����h�L�F�(9���j�u���W�.�Zط*pd}���;]���9_�t|�\<�\:`�9�������]��&��a46���q��=�Ԟ�V{�ɡ���":����HJ��Ib0�\��&��p.e���}��ıs�H4R7�4�m��k�����_���|���_|�9w��~\��Y�.У�բ�l�p�$�i�F���a�����S�����\�%�2m�g;w�ת��k����������8wkQ� +> +���8)W�`��㥨�b@#�QC�&ƴ���i�1b7�:l��\���T�|W)y#|����峿���^����k.��V��u���8�(4�G���nã\D4hh��{U4�ъ#��Q��4�'�ILF= �H��+ם���@Q�Rql���g�V�����!���?^���.DG�y��Bf�y"�U4�Jq&r���p����wC��k�����{���K��^㟦>�!�q��8ч�-nwk�Q?ߑ�F���FLK�����I<$,���/��rV|��Ơ(j�86�gA���'!ٮ�0�W%����ܞ����h��Kŕ��xr�|f�\�A�����O��������*�s]�o +#�*�T4�{U1��^\���F@E�j�ݨ?x�U�<��6|�Ѩ�'g�Џ8+��=J���u�l��Y��+�I��P����]*
��Y4B�a]�l F�bُC��
U�/��}��G����9��RK��}Y���ې���1��bt�rЈ�9��]M�P�D�����T�1�����Ӫ>r�z�iE-�@��R���t�:%Ȑ��S}�l��2GňhdЍU=�ǔ���e[B��,t����5{u��o�}w���.J=WŁ&a������DbD+���@c܍�oI��b�'�Y������I +Orx����_Gȓ��R�,�� %��.4�>"�Jc,mZ��� +E��w�~=|ts�|�|f�|~7��>���ګ��ˢ��[lF��F0У��q�0���w�8�7O���j�E�L<���^*)a2���F���u�Ⰺ_���u�a��(�Ƹ3�-*��r1?%b7L��b�2�&��;ʑ� \��P��r���տ�~��X�k)��/��z��0�$�F��c��!D�D���^6�w���9t$(R�yRK��`�I6Or�}�"OR��+T`������E�`z�Ъ�@�X�\7��XG#���#���u�Eqf(%o O�$|�Q1^��������K��s��Fi���[끐��W�ց���ح~xA4�)"O��03Ƀ�<X<�^�8,�>bU�=�R��86�gy>Lj�暧��_���dR���ܘ�n�ۀhte�On}�s��������O�Y�[��_{��uI�)���� +^���i�Fr��Lj���.��ub�0� +2�F�C1=�t�G����H��ȓ�'�SSg�
�33��G�L0>v��9�R�Z)����9H̳̚�z��h���P��hԔX�����S�[`/gS��k���4�N�:�S��1�����T,uTKݗEO����������D̍{���~�0�!�vƚgE������'�!33�|��3��
��}R��|��?]S��
f�@���>)2���H�Bn��.�Y%"V���"yЍ��X����.}3\�%\�5T�#x��+{���
���B�:��p�0��%��n��8���=�XO�@ą�Hh�^�ȓX�bR}qxVa��S�-9V���DZ���gä�����:�.U��tA�t�1b7#�a��ܤݬ+t�P�{r�.���5{u���-eRG�����'�y��ch�cg\��R��8E%C��'-�+&�Lr{�1�S�b�$E��8����oS�����\��>N)B�BU~��P��J�4�h[WuhҤ���p��~�i����RPB;��q�qb�qǹl�v�9���>vH������y��$& ����<G_t���|=��ڭ�fO�ֆ�-T��K2$�qI�r`�t��Kṇ���Y�ڜ8�t����u/�N�=����{��G.VG�����{>y�������?������z��~>m�e��)+qe����~j�$����RZ���FJѤ�SkL��=x���@�)v��*����b���hbbLC���I@�W��+6��"~�ر��N�6�;�\ +\�8ꁋ��3!OS�k���?��'�険��Q +��D�!���H _E�*��߮h$l�4.��4/Y��*ɥ�p�EK�X�Q���X�%Q�L�Ȏ�'/�~����7���"m���(. +�V�� +�^~���q|�z�h�=Ԋ�tT|�b�zR�'�7RJk�}>z&[`߾]�ѽZ�9�a�E�x���S�*)�&|/�?S�Qi�]�=µI�4�5����O$��E@c�f��g����`{���G��=���7f�Jf.VF�a�i��%��@�B�͔�O�(�1�f�]�7NŮ�ňnİ5��=�0)�}OJ��l�3�� ��MI�a��f��+1){rf��{yn�V����B���1/���<��X��ġ�>��ױ㿛=���ٿP1�X"G#]�B}
���1��<����V�L���dP\�Y�M�VM����̓k��)�h�ߪ6�ʓ���a�#p��n�2L +oi�ГL��&c��hbP\�b�f�»ӈ�����?��b|e�����oϴTDZF����a��P�0h���'��ꑹ$I�ؓ)���bİ�M���_s۶mR�xR"��0�Up0PY�Չ&C�©R���~��w���h\J�Jfa�&YV�,ͣ�14�%�'E��r�X�9qx[�英�����{gl��H�u:�{6���4�|m���N��>*F��>�h��h����Y��a*J�������IكIv�G������R�i�a�C�(7oieR����=~̭�F3��2i�cIn���TI��F��Y��ӉڭT�GvĎ�v��kцw��e��ÑΏC�&a�N�; +=��j�&Z�y� 7*ѓ��.V��ޣ�f��3.�W$�����dɏR~�,�"*���&=?�B�����D?���o��g�ދtԅ]gB��?�σY��E��[��ҟ���dJ�K�hD7b�Jj����F�2L.)�~�bL6e��=pl �Ё'C{T�&Y��n����(Z6�5?Mz.~����wΞ�=���1:��=�B�s��K�����
Ђ��!�(.�\Tbf(F�,zR���$��� I�)ѓ���h�'�1\�����$y�z��Tݎ�'���j��_���"�j"��p���t��!� ~;U(qb�����2�@/�Q��h%Q��=�T������IY�I�=3����F��"�a�>`$�Rf*ɛU�[�F��;sf]�z봽n��*x[�c=�d8��}�0�����'�=��]��Q�a�:S�'� +��!%�Ub�#�$F�OI���P�0����E)yٚ���0O +w��Հ���Ǖ��/}��e_t���8C��7�#�F��V���j��휜�@���O�$�`$ݪ6�Г����EC����^�ݩ5�-Src�<y�U��x���0�iw]�b���!��P�p�F]�O
ð��Ǔz�F[P o�Y�I8^f�4���I�$���R�%C^����h2�L�h��\i#sr��2kaG"�d����Fo�y�5�e��_�v|5�9��[����a��ē�{���KَIIj�I�_$�f�z%zÔΔn�b�Ye�!�J���H��(I6e���&3�~��j]�`.�w4�썃�ơΦ�.뤻���,�i7l��~.\�{����0��O�ZmA����L�-Rf���2��)��,�L�"t��D(EҒL�5R$�-w-[`$����~�ڜ����<do�lr��������Q�m��v�k���kj��2�lJo�4�g
�a�;5x��T~>�RZ7�dSI4`x]����}��Hi�#oV��)#�1I�I�1^mX�X[vRF>��C��8���vX��p�3��A�m���eO;��j�vx�%����0l}�Oj +�u�I�� ��>��h�ߪ6�'1��%��r�b�Q��uw����k��V(��"͑���L�p��ɦ�
09�n�t��:),G:��ݶq��ɾ�+^;�R���Cðuٺ����Q~~���<�p$��[z�)=v1l��bgXe��⾮���7�^4q�r.U�ai5��c0��cq+�����`�� +�uڂ=-���n���q����p��eO�l�{L��a�غ�$�+(��&����<)��cN�a�'�p���5H����f�p)�A"[2�b�dc�Tj+ �K̋�V�X���/�ߦ�3��o�ʼn��ؾβP4 +]�`/ݺn����nSѴvl�TUh�����N���N]h�R����-����ߝWB� MjqL���~�{ι�c��&��&�y��ս'`��=���1�J�������L��� +�J�r0���~~*��r:�!8MݒB�����I��T*��|R�IT}��,��oa +ec�1a{�m"�n�A#�Y�SݿPM��#��M��|�,\��x@�^[���9�@�'V)�%���@��9��&c���ݒB�P>���I�Z�|_��
�1j�[H�!F�^�P6��.��u֬��l��RKֵ��>12�m�{Nt�u���ϱ%�q����r#ݝ�=�T�'�����%�X�-�A�p��|�{�����>"nyIꪢP(��IQ&u:��K`����5�ׄ����y�)�g�o�X#�!�,��n4�O�3F�J�a���F1�*|�L`lq7v
��!G�o��lN/�[�Xƈ[�v�#�c}�-) +eYJ�'��P�2)�v�~������MM��s�c�5s�� +%쓂Ї��5c���*%�R��� �F���F3��I"�Lj��C悈@2��%����%��zZS�-Y�$�����+��㕜a�z�[E�ǔ�6v���'"ީ���-C���BY{J�'5*�P�2I�Y�Ϛ��[j�Rw7��. +�_33�̭f"�&�l�_�H&�M��wBh�J�o�{�^+��HO�Pؕ�>�N�\��Q�薶��c��u��}�?P��P6�'Eut�Q��*U�BY�P�(��"l�ă�|R�1�n41�')���w����ob���C��*� +��)8�[\�ب���+&|l��
�����������M�!�hO'qK�]jH�*�P(����I�:g�:�F������F�T�����j�~mpH�R%z掯��}h����/��̚쓒�;���d�u��|�R;k�g�z��+ei��kw����L�,�p/sd2�p�c�n6�k��l���x��=���J��-��L����c��c��3�M�P@���t2$yR(�{d��=���!5*�B^UUQY�����R�R1�m������ٽ���~��G^<��{�̟|mg��Y�,^�Af�f��Q5*y�S(_��F�E��t���n�%�(&� +����r
��ADP�oK�8I�(φ��Re�d��Э�̤y�R +�����(���:�F�4���BU]
���ƀF*����ޯ���?x�g��ק�������;p�}��� +�8�ǃ@B��=d��9��a�®���3�6��&���w֬�>Iٸd�5K�s�̭f����u�M����m�!X4�>����!�pp�rl��"�&C6l�|�!���:>?�[�tKNu�O��T�6��:�랈x�� +�R���-�iK�la�X�"A]��+Mx�5�"�!�Hw�x�g"❌�/���U)����QԪspż=�:n���IP�o<����~�٧~��C?=q�D�[�>���I�m(��� b�!S[�ω�� +�$�$.V�H+�j��sݴ�$!�^ ,4����c�O��$>���Ӻ)Hۍ�$mzb�+���ϙu�v�$c;�G��q��{�k_w9��{���*�ֹ�s���m6.��e۲�F6{1�N&C��xLjƬ���1R��+�Dp G�D� _��fS���0���%A,�O�ᓐɎ';N�8u���cǎ=z�ȑc�>��j~�������~���z�g���u�/�������5H��H�bih +�,��d"0���0&y�9�`�-�����Ǽ�!��&�Rp{G�Y���N�ԯ��3�|䓟z��)������|�{����?z���o]u�����:�O�ކ.���!샓q1��-����Fu�o|:q>�o��l���3��t �7\��Ds�$���%��+]UX%�*̾���z�s'�8�N�F�W��R=����np��\Z�J +�����Ps�mA��?�!��3�Ҙ~3C�!����۵$�$��ŸG�'���v�r������{��_k��������� (%&{�v9� �H����0�r�?aL1Ƭ��Q"��6�5Om�E�8��!�E��n�?�0��H&�wK��赑F�w�����?��{��F��P���?�G�"��'�3���thq4R��H@�%�<� ���%�mZ�p����<�aUP����QV��ַ}1���'�f������sL���q\Q���q0���sܻ���
���44R�\���ر�4��Y�����u8d�쳩��Р��\�aF��wS��l*�]#�$�ggq4<��?�7 +uw��cݽ�\wқ�x���Z|J�^�:�/���A�0I8� +#a����`)9��b& ޡ��˩�6\���E�^.9"CI, ���b�}1�Nˑ�xpͱ��<��Z7��xd�a�b�p��[�fJ�x�+�U6?�*������'�ۑk$#���H�0����X��O�0��1�|&<���3���un97<�0.gu��-� Ru�ܒ8�5 +[n4���&i�t,�A��y�>T���I[�i�wQ�^?�6@�W����[�ɤ�"U���8�_jhC�oE�$��.�ؓ�=�Ǿʇ��A�ͦBŨW�Ba��RP�Չ�zxp>Z�<��Ơ����"�ki�2Y�KQ��"�|Jٶ|�9\2|��Uτ��W��ᒱ�<��2i��߹`oh>��FR=�Q�īy��9
Y�W� +��pp*��`z<&�9�L��j�-}�d +�P���-������1/�r!Z�o��|�t1!��Ēhr��,gut2Z:��ޭNד���?�Վ�N�A�fV� +ф�1�E�c�x�+p�k��w�t�ݥ�i$��Uo����>Xe�[�����h�<B� +M
��Z�x2��%��d�?3<�]���vK��� ��r>��ak3�X�rf��%ê���G?$��%�r�!�����!/J�V���E����N���\6c+PQ�Hչ�?�H^�@�-y�L%`2�/�i "��Z���D�WJfS�����\�r� 9��6ܑ�3Í��`!����0(��qت2��nR�C�Rc�%?�ﻥ����������n�ʹ�f���ض��T�^g3�i~��#�l��"��RJ����n�S�[�z'��Tpa$�,�c��ۈ�b�.�W��u�x�R��i���5�!~��5/����M��-�� +����(,⠨8
�d�k�����{W�p^U�����k�}���e�i�H�6���H���,�G�:��g�"Ck�g�[�9��n9<�\Ӆ^B,M�$�$��Y}�Э�&l'������DmP��-����XgR�6ǰǪ�0IC#���_�k?rv��w؋;ZG�m��FR�s1��USG]�XΦ���P1��.gu����%�����JCs���h���! +��s�' �wa/�f���8 +��?�|���"tAB������eQF�#��m��<����hD�ٴ�Mm,�ʆ<0��K���kK�x�KJͲ)���\cY���K& +k��m�W_w�a����IBacU�#�l���A�����h(*Z!�ۇ>�4�^�D�8��o��MӋ������8���A #1��a�b�/�3�.�,��rj}>Q6�Y6����qx�
�f��ga�n��`˽2�%w�`���лc}q�<�#�I��[[HښT��q�hN�%��y��-'(v���������s0��)�EX��VP<��o��9�H"�3����`.'�yoS)-�lkT�5+Q��L�;�(�Oڲ�F�X6�j&�X�k,k`K���� IX�������3��Q����'��d���,_���H�����M:ܽ�=���y��|��������M�����÷'˪��hH� +"Щ$K��y�ǒ�P=ԖeS�լ��{��j{��R2��L|}q������R�O��~V� +��X�F6UMNJ�$I�ӭ-�Yθo�=^?����=$^zO�n�H��AO',������yr{�Ԑw�#2��l����E3R2dw���'Y�C��6����Jc��L��VN���L�D[ޠ�bQI.k�L�c$I��qS���n��0B���_����ѓ�K�K��(�Ey�@����v�sL�xf�$���uH�/��k�)�zw|� +�/`����n�3vY��Z�T�u+jgwy�a����6��WS����bF��fHJ� +S�%̻Յd͊3���*�eϖeS��c����lj'��-U�]Vc��Escq���pZx<�<�%]9y1CM�'��$e�z���0O���O�m�m��à��?�L�#����cw����π*!��Z2��.�*a�UұFV�f,y�W�\��n����Vbcin{Eظ��+[PW;�%�����{��ʥ*�2��t��M�49���1b��B��$��v��Ꭾ+5d��!"0�EX��h�(�k�f���C���rZ�D8�#�K��`F&t���%�6�E}�6d:�R�2;�UƴR�}[���U��닳�em'�/��{)�+SI6�aWgI�h�R
�f����qy��7���'�-���]_����$;a�ݴ� �;� +���H1�WI��+��=���7����+"��dG���o�������O���8(��$y�4�`0c��?Y�^�&j�dђFge�T6��jV܅���e��2�l �N�fbkɭ���`��P�%k�g���]�>/��qW��I��ض�h<e/�=^o�8���j:On��ۇ>�6�)��t ��MRR�^'�#�$u�`����`>�l���Gpf1)h2����|r3�*2�#��C�(����[��N^�-�`˽�-���p@���9�b�$�L)KZ^B��s�Wz着�Քؕ�S
���EX����M����<�{�𭳷���xc0���� ��+0"�ꌭSIں�����s��g��t��Њ �Ll,�5�����liA����$��o��Z&��<�Z�IY�x�����I��V@tI�=��A���|���|�"����8�T� !#1�D +&\�e���b�׀��&`ͿX�_Ƙ�o#�b\�C�ގJN'T��
8Rҹj��q����0R����n�E\��.�$���۳�Z���V.�x���%��ג��ߠ+ڶ젫��To.��[~�T���gI+��|k��Kp�BL^(wѮ:�A��%�TϏ{��z��M.L�´Ur4�d���f`B)��1pH�
�0��e�[0����͵�B*�^�DWfk�I��z�t�&]�o�d�^ʬ��Q�o���L0Y����A��h +X%_z7�HJC� ���������}H�{_|raf8��!��f0#~��-5og�j�˰��2X9���˹�R6*�%����%�d�+������z>��ԼTt�R�
�����Q���5��3 �9�Ҝ���AL[J��_���w�ݧ���r ��UvU��Uv鯺g$O�;��`0���gv�.���,=Z����Z��v`Y2�t$�"p���&[�DWf�ϟ��R +��.��-�m�����Sc9sNR�D
n�x[<@Fx��^��@�=��֒.�k��0R�N'�7��?����%�nҋh��zG0fC)m�p�H6�e���u�A��'�-L���Z>�R0[��H9��ğ-$7�z��*vl�s�W�1[�(��Z�w���Z�Pa����/���y�@��O�G��oH8#Oʷ�F# +n<�����b l�;茷�Yϧ��(ɫ��0�y���rELG�Mk��oh����{Rmy:��`dCH�%����'�� #1�;a��g����e���U2Q��e�Bf:���&�f��sS09/ +&���]�A;������v�7��\�y+�3DL\0��DLW�=8��0����R<ާ`��$�ር©���?���+s5)2��`�7��g��+Æn~XQo<1V��o���[*̎-;�o��&����F���n����������O~���M¤��Z`�N�W�+6u�N(��lǴ���� +L꼷�HXR|��2��L|m> �\����r^¾S��x�dVZ��h^ _��}�H�<)�*�$��89�C?�#�#
�'�gw�ϛ�x��.d$��\/⇔۲k�$��$ +#mq<��� �p`���-$[�7�vL0��`07�X�����gAg��a �U��'��HQ��A*�J�G�G�$�R�Ǽ��o@tǁ>y�%F�?�����$� +�r�ޝ��;�H���e�{쳷쫑;��2�pb$EQu�)������mX �%�Y�KE���C4?|��\�9�b��x���.&�� �j����-`�p��nC�&��ӗ����S~�>�K%����U�|���n +�!�Ü.��������Vi�m����t«���~P"S�g��]���C��(���]*y��g? +EQEQu��F��L +H��
pT���/!&���_aB�A+�ʄb�J���ZDh�jh��b�"Sl��SF[��q��vB�P� +�P�)-��7Bd I�&��;=��&�_����{{�|�!;L���s�w�9�W��=������!�ግ�Pڇ�#��=^v��^���f����V$Ax �6G��<=\�
k�˰n +]��J{�X�/���-�0G�OK�K;ֺW�̷�Baפ
�=R�2��X� + 0M5b�cдp�;NY����#�pMg���|�ӌ�4��W�4,�v_�}&����:�2��Z=lX�͚j0���T�<6�g���2n�}Md~=����}�.��5+�۳��)���H�8�tY��yh��J-�k~'3~,Ϩ�&XƂd�
�Xn�p.ù��Fі��P�>7��`&�&X护�M��5*�~��Z$��{��S:Ǝ���VB�LJ�`Y+T�H$\gR|%��1��닶����4�3h��X�z�4�J��w�@��(������_R�
`_���g,��]Ɯ�rl��Y.8.l�g��;j�Ⱦ�X8w�`�oO:ݔp�Z��D��E��-����#*�5D^A�;LI5�6�(�V�X�
2�"sA����VãT��l��1�qVx��`�L2%
��4����M��T���દp�����uwVUn2"��`C�p�������ٯ���+���s�A�GETdT�Q�X�RP#��m5)hՖg}Ԉ $�!)�f,Q��*>Z�E�Bַ�G0u��jEq@��{u�s�Ig0uf��s��_7����Z��Y�����<k����K1{�&�F�[�g�V���G:�e7�
�˷T���[�5�3�����1�ɊD�Ö�D�y��3w�+�q��!��J��A�(ov +s��i��-q�8���Z�,lQ��7���O�i FYk��}�8b'<n8�YR��8�8k��}���oiL��#�k�y�3�=L,�݆��4.���(�t�n���67�U�x�^_�U�5�w��-�6������2�}�[7ܵ��l�����������"�-]ó��o6�U�f�s��煝��0���/����>��_�z_W�9��.�O�r�?�KS�y���/�?�X?��'�[Ư +�q�'+l魌�~��_�$ۘ�\��z��F��ܠ�=F��_.�L���kQ���G����+YI1�ӠMå���;�o�]���s��y�k.Z�5�����F�Ė�� �.?���Ǐ}��Q$^�k�0p�2�E��~��L�4���Z^�b�7k�'7�-X�x]�#]Z��\)������߽�+k"�I���J�����j�~�ނU7���:�>��"������p�3{+P��֬���&��Y������}4�cI�,ҝ~eݣ�V_�y���{&!���D�qK;�]�F>��pq�O����׳U�Q+f�R�n� ���r���[���m�Ee�Zv�7a�p^k͖wp�R����{YP^�:����y-[W�!��=�Av����Zk^w7n����q��u�����Eٍ+��y�*+�E/lͼn��=�XN|��q�ڏ��ۏ}��k�O��*��lX���Z�u^{�Nj7h���k����
k!��9n���>J��TO�2A���: 8�A߆xm8���Wg��q�ys;[Y5�kmx]������~G��7��K�~ t�"�\Z�j������U���\^��<K;��;�!ni�Vu�C�0������s��TYP��W�*�n;2ov��ޯ����B�lB��:�?Lג�kU��TY�(����|W~j__����w�������+_� ]FR��ZkA�Ɉ��>y����[��s�Μ��~�l�m���}�r�~̜~�=oT��*��ZK��c��2�J�� +��에T{ak�u)�\`��f�+�Q�g�>�q,^y��ײj����v}5���}�_��CC���9�?��5py����¸<{{n��9�Z�Fp���6�99�%�D@�����7��˚�qD��uX7���M�A +��0��PGDr�z-�oD���]]��[,S�g�����h�ۃ,o�)��Z����OX�S�K���[j_M������d��,o�)�
=�d�o���ٽ]�w�:�I߭V�� +�0D�3��ܩI��F�)���
���r�v�7�u2Vysr����5�N�Z_kWG,7����.�����W1n*��I'��c�T�/����#���^ "DA7Y��y#H^G�����N(��JPysR�n�@�ͽZ����Wm�$B��d��8b��n�Py��!X��,o�*�%`��b
���͵v�aD�m9��*k�`����U�7�4\�U�䷌�*��G`�����R�� �7{~��o����ỲI���FAJ�YAj'c�*ay#Pvs�����$^e#'$�;#��%��#�7Btu ���/]��PY��(n6�
}�j2����%��5��J��oN��3o�*�(��S����Q��Z�@�{��`%�(n��~̼*���8��_$�7����5v�Q89m�}3��� +Ny��ʼ0� N�z���$��7k'�{�7�u��v�!D�� ��P���´�����v��Ysv.Jy3wh9�#�<�/���X���卐%:�����鍐m%����>���5��P%���(�-�+�y#d^o���ɡ�7B�����"C�d\¼2k'q�IYi����T������!�J}���q#d!��7'�a�/��:$nVަ��4���A�7'����F��ٯ�X��2�����>��c�:$Ok� +��a�"T�Z�K��X�3@�-�DL�~�sC���BؚJR�a#jdSaSB��=�������P�j�����~>�?���7�}��uݼH�:�ӕ�8P�s�%�!k�Q������}լ��'0�@5�s��7�y�1z�����ޚ��: ��ym184�h�����R3�������݃�̷]�0�@5�O���u�
���|���d��
Ts�Z�B����
t��S%�dN�=���y�cՌ�y��h���
:z˨��o���y:�I9���j�������J� +�
��<S�x��!�q +���ष=lC�*��'�-��g��^�IP���`��4�ŽRߊ� ���M;�� �O8C�<��o ��D~�3��=z�d�=�=�uRup�6p9��Dg��V��_@g*��ep��Z�$F�������QAj��1�ѥ�$DZ�a���4�}��_@g�KR���t#�7H�lm�%���% +pN���Uo�1c�p����������M���C�p���?�!�;��24 ��J9o[o� 8�)�ur>� 8ЩʏG7�$8\)A�n^F��<jO��|��2��}����"�+���tqlgG�[�&���.�ߺ-���c��2�Ӹ8hc��������OP"��ËA' �rg�!�-u��F�zԨ�/��NR1���x=,��x���s�7PC~��E�[�I�7P�q~O��ɇ-e�j8>=3����u��|lR���bz=,�p��%��s�[p��}�h{3t�~�7P$翛h{Ki1rM,oMb����q�E��koM�/��� +���#S��-���3��cyw;߁��\Fo�P�/][o�-?$ +5�|�����k����҆��@1�J��N�Plg���ƶ�f�ҟM�To�8����N�����V�>P�'��z����
��y��(��ɘo�s��|l]k�^.dR�g�s����� +�L"5�7�����B��,泪��q�9tի�K +����0����N���-8$�_��]����)�yt��s�\Y���O�l���ӉX4bBo�ޅ�
t�Pp��
�˛��
�\�s���Z��#N���˚5�[6iHom^�������=v��h�\�gS����r�#7Г\`�|t���P��ߗ�Q߄�VMc�=-4�$��aykh�؟����uPڅu4%���ݔ|�����`Yͷě��=����J=>�K�z�w�R1�j5���L҄�<��Y����no�8�O�l7��B_:���o��no�'���Ǜ�墚o� �kޛK�N`���fz���|����%3z�h;�hK.4�$��c��b.m@o.�Do�+)N���To�\:��ޛG�w�r��R\�-��
�WS��j!?ӛ�z�78��{q����lp��w0�ǯk�T��L*1ӛ�Υ�K�����[x~Ω ���Z�����{#���h�������|w�U+�gR� �uoEb�}�������7���Y��L�m���
��Vog���� +>�~�[V��\�r��g�;�p�mU +�tR��͡Ƴj���lor���7|�H�R̦z�������7��#�ۍ�@1�J�"���9�!w��c��,w{{j�6P�jޛGkNc���Q[��S�Ԫ��lo����Ou'�70�j���b.��7}{s�~L�4 +�2���/��j�y�����i�$�!�C�|.���M{{�
,����� }{si� �7����-��"��z����t+�XC��|>�mo.����5:�h.��E<�ձ7�օj�!�'�3��x�9�܃�
���Gr�x�u������8�{r}��Ft#�7�G���닩�t<���u�!%ߑ�����i���,�e�AT���.¥=�_ +�X��2�q�
etӴ"ݓ��� +��H��9�{�I���5��+�H�7�����*Po�|�s���� ��-�=�z�� �+N�욾��!�yۙ7���G���~��2o(1��Ņ�-���ۅ�U]Ϸ_��t� +qOƲ���J�~�/(Ⱦ�UzC��~R����_����9����<�Pv�ۧ��[,��D�y}vjz��,�]�z�_�cN�M*@o��*��s�Ԅ�������%����3v�%W�U�-�V>PvN�ɿ�X�Xμ��B�k���G������r������ +����M�y��9� +䝛��W�� +꿖�9-g�PA��wo���7T���g��["W�*��k3r�-������� +�ˇ6��ͩߟ��B=�$����1��(#��Ѵn�Ҝ�t��O�����*��i=.�71o���'�up�L{�y4]��'�|�β�h�z�Ğ��G�
�.�Y=��:�$�&Ka�����Ln��٭�0�Yp�L��9 ���p���B,�+���k�Up���W]�(��y�"�D�����?-q��e����t@�x<��({��aހ��t��^�er����ӳn�2zށ���{+[3�А� +(x��@��-��S��z����5���0�6��{xg�F�������?PP��9"Q��]�.�����L������p���e��۵��g +��ƣ�.�3����u��g�[,�<��ӧ�� �-V0��8]55���刭4��O�镅Hj+�
h x��]�,�ݥg�0�OX�l\6˔Az��K&Ɉ�8(��l�f\"s8(�Ƭ�s3 .��3p@c^�����w���?
Pp�|��.��<��M8�|D�E�����8�8+�'\"'��=���>}`��E2�4�t�ۧn{����M9}dB�}|���? +Px��q�K�~�
h.]�[�'_�Z`�8��n$2�yzZ`�\u\$�О� +�#�������Q˙AC�?3�� +�"{�QiL-��s�@7�����V&����7�;��W�Ǟq̓;�Np@w�gܚkM'.�1��孢��k\\$���=��K�lT\"�6qP�u���F�Wc�}KnL�{ +$A��Q���#��+�X � +>x4�� ��"2��h;N��A�* +%
�a)Pa�� HA�) ������;g�Y�����{w�?�;�ݻ��;�{��o4H�z%"�A����D�o)E$��8P"HH�� ��$�����9L�o�8�T9�8��I���"�/��!�S���9R{�K[#�� �#�xV�V�X�)����A�����ȏ�|�� ��NUl��@pPo�&v��PfKo|&�� �]�`���M~��.48q +8'%&���� ���{��Pn�����E$"���4�)��m�77�8&�L��wno��e�p��xo%?L,p�n\�㨷�����1��Ln���+5����q�t�A�7X]6���%x�Prɋ
�`�(��9g���w�re';�Zv��Q.Y��t^T�$�m7 +��O!_�k#��5��ݯ4��c����H���$J�I���z� �j�{.���i +�LoW_�0H�>4��`z8��YtЪ2:ʑn���/q�����Hw7�&yU��]T��]5)��l�y=�5HN�\��o��'`��9r��sGn&�=/���l+�洄nYMj�Jc!�Y�C{쒀,��J�(`b_��_�4߀�vMdd���`��U�,{7�aZ��~�ҏ��1�r~En�$7Ħ7ʯ��<൦��!��x�\o�ou~l�Q�Tl�abo�қ|L�a(�L(p��ݳ2�EFӑ-���z�]\��ш�`b�;�$�B^4�y��V}�[������"�l�{�e���+Oã1��*���-{#$@��@�S�zj�.�l� 6�a�䬮��TΔ�a�}�ܫ)�r��Q i�"��e��Ϳ�?Ckĭ�4z\���*ʡ���ۻgo`pSE�o>gz�>����iJ��bӄz���J����| +�sN���/ߗ��s�)K�.�|"��T�=K��z3H�=��7�t��}wj��jC,"[���_�)ZzD�%�E��_/b������L!8Ӂ����)R&�x�-�w��ޏ/���0�rރ��n�
ʜ�T���$��2�f�R���U�WY.{��j� +������G����md�a��Ҳ��rJVʂ>���l�̘�
n�/Jj����{�S�����ư��5��B��҇��d[�$�g�$�;|gp\���-��AW��-<�>���nT=�"���8�
�y�d�t��|C�}�aL��À����k�A��܄3Q�1.r�?���)x��ұ����[V +h�3 �d����t"�=�T�͖���'�[�wFe��K!�)R��6V +49��������{Yx}�-���m�?�����z��Λ���PQ��;���F�vw���(9�7��u��UK6S����7�M^u��J.*��c�G��ׄ�
.$�S���F�\ˌ_k<��l.=��u�������������u^��Q�p`�N-�R-�°���S�Y�9r ��-�&�a�J��`U5{mx�Zg�F��:�
|qk� +�=gG(�%z+� +�%�QSE�@�E�X�ݒ��?���lVC]�AEإ� +*hE�`�/������ymiiݖ��������7�ܙs?s�W����O��.���X}[2t6���Bm�E����`�6�NBn��n �l��@)��'?X>Y�e
^�#S�?�YB��\�ܑ�n��s�k�l_m��^F�PB-���/+?��f��a�P���!E2�
.�du���p}�R�-Ԩg +�
����Y�1T�.k'��Q��l�o܅φ��oK�ll}�aW%����r���ɳ��&�$���Rx��ؾb��1��1ԁ'lO\�)d9��ҭ)�������>�Mp��]���7�Z���G':u��(��q) +u��$dlM� +'�w��k���S�-|��
O;y�]� +1��ԍ��]7�T5ھ�G�Oݸ�$kT�F���`�O�V|P�čM��]�t���Mc�Y
}�����v,�n \���fcj�{.)�ٚU�ŠrLV$��B@�u*B���7F6y����2��|��rr��;+�\[ιr�pt��r�Cx!��r]��(�P� +�g=��c(�1��
f���B8P +�������G]d�����i9++�m�'A�<���j�n�7�9T�M0�Lٙf�S;��qP��2��� j��@��2�O�ي��P'8��}c��PQ��������猪��s���Qb�or������I`�� +2��bd3o�$�y��Uݸ�뜺�U��MA���W�3]�s�W�L#:$`d3�`�R�J>�UdQ��n��3%�ilr�O���8Ӫ�o+�9�����ETO�iSW��h�r���F���d�w3:�{�ϣ���l�W�����
��.�6��l�Y��{e�x!8t�_��xW�>�mΈ����Ȁ�5{�J=WF�sL��hPv�$}_��RMפ����} +˴{Bz��r�5x��.�U�I�&��$������{C��[��#�Eq��x(կ�a9E�P\�%���w�E�OwS8��q�'^�ӘD��٢�#AJ�S��T�Y�+�v�0��Z�G��M0٪���]�lQ����m>P�vy$+��^D�& �H��}�Bp���8o��/��w��o�$��_��u���.7��Zհ�� ����7��D����-z VwԼ�u�Y���a0�N����@Y�e��囍�'�cmt-�Ɨ�Yk�C�#0�1��*SuS�,٩p܅�[C�_���q�b��hj���F Y.���&�L0W7���O.(Uf�?�U�ʍ��l�E0�%ݹ�@��"��qy*�`�@��v�y�Iy�%Yqp +�~&en��c�*wn��jI�cw�5k���Η@,'k;�}�Y.����Z�.�\�\�)+;=�����V�~�M�+�\�`��I��)�^�*�-O0 !
AB��\��u߃7�%˵
�.��}w���[�<�Ċ�s�d�r��#G�o?"Z-�6��K1 +����$d/��:�0����\}]����7>��� +���vT�UC�:�ˉ�Ae����>�Ś��<���Ov����x�_�'M�8�jd�c�3t�S���˷��}�Å��17{ĨA�L--��3"�\&�������Aڒ��C�(D�9=ڭz��&�b�]�� 0 +H���yTSw�oɞ����c
[���5la�QIBH�ADED���2�mtFOE�.�c��}���0��8��8G�Ng�����9�w���߽��� + +�V��)g�B�0�i�W��8#�8wթ��8_�٥ʨQ����Q�j@�&�A)/��g�>'K�� +�x������- +�ꇆ��n���Q�t�}MA�0�al������S�x ��k�&�^���>�0|>_�'��,�G!"F$H:R��!z��F�Qd?r9�\A&�G���rQ��h������E��]�a�4z�Bg�����E#H �*B=��0H�I��p�p�0MxJ$�D1��D, V���ĭ����KĻ�Y�dE�"E��I2���E�B�G��t�4MzN�����r!YK� ���?%_&�#���(��0J:EAi��Q�(�()ӔWT6U@���P+���!�~��m���D�e�Դ�!��h�Ӧh/��']B/����ҏӿ�?a0n�hF!��X���8����܌k�c&5S�����6�l��Ia�2c�K�M�A�!�E�#��ƒ�d�V��(�k��e���l
����}�}�C�q�9 +N'��)�].�u�J�r� +��w�G� xR^���[�oƜch�g�`>b���$���*~� �:����E���b��~���,m,�-��ݖ,�Y��¬�*�6X�[ݱF�=�3�뭷Y��~dó ���t���i�z�f�6�~`{�v���.�Ng����#{�}�}��������j������c1X6���fm���;'_9 �r�:�8�q�:��˜�O:ϸ8������u��Jq���nv=���M����m����R 4 � +n�3ܣ�k�Gݯz=��[=��=�<�=G</z�^�^j��^�� ޡ�Z�Q�B�0FX'�+������t���<�u�-���{���_�_�ߘ�-G�,�}���/���Hh8�m�W�2p[����AiA��N�#8$X�?�A�KHI�{!7�<q��W�y(!46�-���a�a���a�W�� ��@�@�`l���YĎ��H,�$����(�(Y�h�7��ъ���b<b*b��<�����~�L&Y&9��%�u�M�s�s��NpJP%�M�IJlN<�DHJIڐtCj'�KwKg�C��%�N��d��|�ꙪO=��%�mL���u�v�x:H��oL��!Ȩ��C&13#s$�/Y����������=�Osbs�rn��sO�1��v�=ˏ��ϟ\�h٢���#��¼����oZ<]T�Ut}�`IÒsK��V-���Y,+>TB(�/�S�,]6*�-���W:#��7�*���e��^YDY�}U�j��AyT�`�#�D=���"�b{ų���+�ʯ:�!kJ4G�m��t�}uC�%���K7YV��fF���Y�.�=b��?S��ƕƩ�Ⱥ����y���
چ���k�5%4��m�7�lqlio�Z�lG+�Z�z���mzy��]�����?u�u�w|�"űN���wW&���e֥ﺱ*|����j��5k��yݭ���ǯg��^y�kEk�����l�D_p߶������7Dm����o꿻1m��l�{��Mś�
n�L�l�<9��O +�����z���p���g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?���D���I���N���U���\���d���l���v��ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s����
����2��F���[���p������(��@���X���r������4���P���m��������8���W���w����)���K���m�� +%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 17.0
%%AI8_CreatorVersion: 19.2.1
%%For: (Zachary Mitton) ()
%%Title: (metamask_icon)
%%CreationDate: 6/15/16 2:23 PM
%%Canvassize: 16383
%%BoundingBox: 98 -140 188 -44
%%HiResBoundingBox: 98.7919746568114 -140 188 -44
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 13.0
%AI12_BuildNumber: 147
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_Cropmarks: 79 -156 207 -28
%AI3_TemplateBox: 180.5 -120.5 180.5 -120.5
%AI3_TileBox: -163 -488 449 304
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI17_Begin_Content_if_version_gt:17 1
%AI9_OpenToView: -39.6666666666679 23.666666666667 3 1419 866 18 0 0 -5 38 0 0 0 1 1 0 1 1 0 1
%AI17_Alternate_Content
%AI9_OpenToView: -39.6666666666679 23.666666666667 3 1419 866 18 0 0 -5 38 0 0 0 1 1 0 1 1 0 1
%AI17_End_Versioned_Content
%AI5_OpenViewLayers: 7
%%PageOrigin:-220 -420
%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
24 0 obj
<</Length 22700>>stream
+%%BoundingBox: 98 -140 188 -44
%%HiResBoundingBox: 98.7919746568114 -140 188 -44
%AI7_Thumbnail: 120 128 8
%%BeginData: 22554 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FD24FFA776FD75FFA04A4AA1FD73FFA04A754A75A8FD71FF7C4475
%4A6F4A6FA8FD6FFFA04A754B754B754A75FD6EFF764A6F4A754A6F4A754A
%76FD6CFF764A754B754A754B754A754AA1FD69FFA8754A6F4A754A6F4A75
%4A6F4A6F4AA1FD44FFA7C9A075A8FD1EFFA8754A754B754B754B754B754B
%754B754ACAFD3FFFCFC9C299C1997476FD1EFFA76F4A754A6F4A754A6F4A
%754A6F4A754A4B4AFD3BFFA7C99FC198BB98C198754AA8FD1DFFA8754A75
%4A754B754A754B754A754B754A754B6F76FD37FFC9C99FC198C199C199C1
%99754A75FD1DFFA74B4A754A6F4A754A6F4A754A6F4A754A6F4A754A4A76
%FD31FFA8C9A0C1999998C1999F99C199C1746F4A4A76FD1CFFA1754A754B
%754B754B754B754B754B754B754B754B754B6F7CFD2CFFCAC9C89FC198C1
%99C199C199C199C1C1C175754B754ACAFD1BFF7D4A4A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A6FA8FD27FFCAC9A1C2989998C199C199
%C199C199C199C199C16E4B4A754A75A8FD1AFF7C6F4A754B754A754B754A
%754B754A754B754A754B754A754B754A75FD24FFC9C99FC199C199C199C1
%99C199C199C199C199C1C1994A754B754A6F76FD1AFF764A4A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A76A8FD1DFFA7C9A0C1
%99BB989998C1999F99C1999F99C1999F99C199C199994A4B4A754A6F4AA8
%FD19FF756F4B754B754B754B754B754B754B754B754B754B754B754B754B
%754B754A76FD1AFFCAC299C198C199C199C199C199C199C199C199C199C1
%99C199C199994B754B754B754A7CFD19FF764A4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A99FD04C199C1C1C199C1
%C1C199C1C1C199C1C1C199C1C1C199C198C199C199C199C199C199C199C1
%99C199C199C199C199C199754A754A6F4A754A4A7DFD18FF7C6E4B754A75
%4B754A754B754A754B754A754B754A754B754A754B754A754B754A754BFD
%05C1BBC1C1C1BBC1C1C1BBC1C1C1BBC1C1C1BBC1C1C199C199C199C199C1
%99C199C199C199C199C199C199C199C199754B754A754B754A754BFD19FF
%754A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A4B74C199C199C199C199C199C199C199C199C199C199C199C199
%9F99C1999F99C1999F99C1999F99C1999F99C1999F99C1994B4A754A6F4A
%754A6F4A76FD18FFA14A754B754B754B754B754B754B754B754B754B754B
%754B754B754B754B754B754B754B7599C2FD16C199C199C199C199C199C1
%99C199C199C199C199C199C175754B754B754B754B754B75A1FD18FF4A4B
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A6F99C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C1
%99C199C199C199C199C199C199C199C199C199C16E4B4A6F4A754A6F4A75
%4A6F4AFD18FFA16F4B754A754B754A754B754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B75FD16C199C199C199C199C199C199
%C199C199C199C1999F6F754A754B754A754B754A754A7CFD18FF764A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A9999C199C199C199C199C199C199C199C199C199C199C199
%9F99C1999F99C1999F99C1999F99C199994A6F4A6F4A754A6F4A754A6F4A
%4A7DFD17FFCA4A754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B7575FD17C199C199C199C199C199C1
%99C199C1C1994B754B754B754B754B754B754B754BFD18FF764A4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A4B74C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C1
%99C199C199C199C199C199C199754A6F4A754A6F4A754A6F4A754A6F4A7C
%FD18FF754B754A754B754A754B754A754B754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B7599FD13C1BBC199C199C199C199C1
%99C199C199754A754B754A754B754A754B754A754B75A8FD17FFA04A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A7599C199C199C199C199C199C199C199C199C199
%C199C1999F99C1999F99C199C174754A6F4A754A6F4A754A6F4A754A6F4A
%6F75FD18FF4A754B754B754B754B754B754B754B754B754B754B754B754B
%754B754B754B754B754B754B754B754B754B754A9FFD14C199C199C199C1
%99C199C175754B754B754B754B754B754B754B754B754AA7FD17FF7D4A4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A4B4AC1C1C199C1BBC199C1BBC199C1BBC199
%C1BBC199C199C199C199C199C16F4B4A754A6F4A754A6F4A754A6F4A754A
%6F4A75A8FD17FF764A754A754B754A754B754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B754A754B754A754B7575FD13C199C1
%99C199C1BBC16F754B754A754B754A754B754A754B754A754B6F75FD17FF
%A84A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A4B74C199C199C199C199C199
%C199C199C199C199C199C199C199994A4B4A754A6F4A754A6F4A754A6F4A
%754A6F4A754AA1FD17FF76754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B754B754B754B754B754B754B754B75
%9FFD11C199C199C199994B754B754B754B754B754B754B754B754B754B75
%4B75A8FD16FFA86F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A99C1C1
%99C1BBC199C1BBC199C1BBC199C1BBC199C199994A754A6F4A754A6F4A75
%4A6F4A754A6F4A754A6F4A6F75FD17FFA74A754A754B754A754B754A754B
%754A754B754A754B754A754B754A754B754A754B754A754B754A754B754A
%754B754A754B754AFD13C199754B754A754B754A754B754A754B754A754B
%754A754B754ACAFD16FFCA4A6F4A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A4B4AC1BBC199C199C199C199C199C199C199C1996F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A75FD17FF7D6F4B754B754B754B75
%4B754B754B754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B7599FD10C19F4A754B754B754B754B754B
%754B754B754B754B754B754B6F7CFD17FF764A754A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A6F4A754A7599C1BBC199C1BBC199C1BBC199C1BBC199C1C199
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754AA8FD17FF75754A
%754B754A754B754A754B754A754B754A754B754A754B754A754B754A754B
%754A754B754A754B754A754B754A754B754A7599C199FD12C1994A754B75
%4A754B754A754B754A754B754A754B754A75FD17FFA8754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A7599C1999999C199C199C199C199C199C199
%C199C199C199994A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A7CFD
%17FF75754B754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B754B754B754B7599C199C199FD13C1
%99994B754B754B754B754B754B754B754B754B754B754A7CFD15FFA8754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A7599C199C199C199C1BBC199C1BB
%C199C1BBC199C1BBC199C199C199994A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A76A8FD13FFA84A754B754A754B754A754B754A754B754A75
%4B754A754B754A754B754A754B754A754B754A754B754A754B754A754B75
%99C199C199C199C199FD0FC1BBC199C199994B754A754B754A754B754A75
%4B754A754B754A754AFD14FFA14A4A754A6F4A754A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%75C199C1999F99C199C199C199C199C199C199C199C199C199C199C199C1
%99754A6F4A754A6F4A754A6F4A754A6F4A754A4B4AA8FD14FF7C4A754B75
%4B754B754B754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B7599C199C199C199C199C199FD11C199C199C1
%C1754A754B754B754B754B754B754B754B7576FD12FFA8A151754A6F4A75
%4A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A4B74C199C199C199C199C199C199C1BBC199C1
%BBC199C1BBC199C1BBC199C199C199C199754A754A6F4A754A6F4A754A6F
%4A754A757DFD11FFA14A4A4A754B754A754B754A754B754A754B754A754B
%754A754B754A754B754A754B754A754B754A754B754A754B754A7575C199
%C199C199C199C199C199C1BBFD0FC199C199C199C199754A754B754A754B
%754A754B754A754A4A75CFFD10FFA8754A4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%4B6EC1999F99C1999F99C1999F99C199C199C199C199C199C199C199C199
%C199C199C1999F99C199754A754A6F4A754A6F4A754A6F4A754A4A4ACAFD
%11FFA8754A754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B7575C199C199C199C199C199C199C1
%99C199FD11C199C199C199C199754B754B754B754B754B754B754B754ACA
%FD13FFA87C4A4B4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A756EC199C199C199C199C199C199C199
%C199C199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C199C199754A
%6F4A754A6F4A754A6F4A754AA7FD17FF75754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B754A754B754A754B756FC199C199C1
%99C199C199C199C199C199C199FD11C199C199C199C199C199754B754A75
%4B754A754B754A76FD13FFA8CA7DA176754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A4B6EC199C1999F99
%C1999F99C1999F99C1999F99C199C199C199C199C199C199C199C199C199
%9F99C1999F99C199C198754A6F4A754A6F4A754A4B4AFD12FFA87C4A4A4A
%754B754B754B754B754B754B754B754B754B754B754B754B754B754B754B
%754B754B754B7575C199C199C199C199C199C199C199C199C199C199FD11
%C199C199C199C199C199C199754B754B754B754B754A75FD14FFA8754A4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A4B4A9F99C199C199C199C199C199C199C199C199C199C199C199
%C1BBC199C1BBC199C1BBC199C1BBC199C199C199C199C199C1994B4A754A
%6F4A754A6F4AFD16FFA8A14B754B754A754B754A754B754A754B754A754B
%754A754B754A754B754A754B754A7575C199C199C199C199C199C199C199
%C199C199C199C199C199FD11C199C199C199C199C199C199754A754B754A
%754B6FA7FD18FF516F4A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A4B4AC1999F99C1999F99C1999F99C1999F99C1999F99
%C1999F99C199C199C199C199C199C199C199C199C1999F99C1999F99C199
%9F99C1754B4A754A6F4A6F4AA8FD17FFA1754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B754B754BC1C1C199C199C199C199C1
%99C199C199C199C199C199C199C199FD11C199C199C199C199C199C199C1
%75754B754B754AA7FD15FFA8A14B4A4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A756E9999C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C1BBC199C1BBC199C1BBC199C199
%C199C199C199C199C199C199C174754A6F4AA1FD17FF4B6F4B754A754B75
%4A754B754A754B754A754B754A754B754A754B754A754B754AC1C1C199C1
%99C199C199C199C199C199C199C199C199C199C199C199FD11C199C199C1
%99C199C199C199C199C175754A76FD18FFCA4B4B4A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A6F4A9999C1999F99C1999F99C1
%999F99C1999F99C1999F99C1999F99C1999F99C199C199C199C199C199C1
%99C199C199C1999F99C1999F99C1999F99C199C16E4BA8FD1AFF756F4B75
%4B754B754B754B754B754B754B754B754B754B754B754B756F9F99C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199FD0FC1
%99C199C199C199C199C199C199C199C1A1FD1CFF4B4B4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A4B4A9F99C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C1BBC199C1BBC1
%99C1BBC199C199C199C199C199C199C199C199C198CAFD1CFFCF4A754A75
%4B754A754B754A754B754A754B754A754B754A754B9999C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199FD0FC199C1
%99C199C199C199C199C199C199C1CAFD1DFFA84A6F4A754A6F4A754A6F4A
%754A754A754A754A754A6F4A99999F99C1999F99C1999F99C1999F99C199
%9F99C1999F99C1999F99C1999F99C1999F99C199C199C199C199C199C199
%C199C199C1999F99C1999F99C1999F99C199FD1FFFC299C1C1C19FFD0FC1
%99C1C1C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199FD11C199C199C199C199C199C199C199C2FD1EFFCABBC1
%99C1C1C199C1C1C199C1C1C199C1C1C199C1C1C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C1BBC199C1BBC199C1BBC199C199C199C199C199C199C199C1A0FD1EFF
%FD18C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199FD0FC199C199C199C199C199C199C198C9FD1DFF
%C9C199C199C199C199C199C199C199C199C199C199C199C199C199C1999F
%99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1
%999F99C199C199C199C199C199C199C199C199C1999F99C1999F99C19999
%A1FD1DFFC9BBFD19C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199FD0FC199C199C199C199C199C199C198
%C9FD1DFFC1C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C199C1
%99C199BBA7FD1CFFC9FD1BC199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199FD0FC199C199C199C199C1
%99C199CFFD1CFFC298C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C1999F99C1999F99C1999F99C1999F99C1999F99C1999F
%99C1999F99C1999F99C1999F99C199C199C199C199C199C199C1999F99C1
%999F99C1999F98C1A8FD1CFFFD1EC199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199FD0FC199C199C199C199
%C199C199FD1CFFC9C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199
%C1BBC199C1BBC199C199C199C199C199C199C199C199C199C199C199C199
%C199C1999999C1999999C1999999C1BBC199C1BBC199C1BBC199C1999999
%C19999989999999899A8FD1BFFC2FD1EC1BBC199C199C199C199C199C199
%C1999999C1999999C1999999C199BB99C1999999C1999999FD0DC1999999
%C1999999C1999998C9FD1AFFC998C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199999899999998999999989999
%99989999999899999998BB999998999999989999C199C199C199C199C199
%C199C199C199999899279998999999A0FD1AFFC2FD23C199C199C199C199
%C199C199C199C199C199C199C1999F515299C199C199C199C199FD0DC199
%9999C1992E4BC199C199C2A8FD18FFCAC199C1BBC199C1BBC199C1BBC199
%C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C19999989999
%99989999999899999998C175510528057598999999989999C199C1BBC199
%C1BBC199C1BBC199C19999989927286FBB99C198C9FD18FFC9BBFD25C199
%C199C199C1999999C1999999C1BB994B2E0628272E279999C1999999C199
%FD0DC1BBC199BB992E282E99C199C1A0FD18FF9FC199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C1999F99
%C1999998999999989999BB98752706052827280528279998FD0499C199C1
%99C199C199C199C199C199C1989998990528054B98C198A0A9FD16FFCAFD
%29C199C199C199C199C1999F7552282E272E272E272E272875C199C199C1
%99FD0FC199C1752E062E51C1BBC199FD17FFC998C1BBC199C1BBC199C1BB
%C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199
%C199C199C199C199992706052805280528272805280528989999C199C199
%C199C1BBC199C1BBC199C1BBC199999951057699C199C1999FA8FD16FFFD
%2AC199C199C199C199C199A07576272E2728052E2728272E277599C199C1
%99C199FD0DC199C1759FFD04C199C199CAFD15FFA7C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C1999F99C199C1BBC1C1C1999F7575272827280528057598C1
%999F99C199C199C199C199C199C199C199C198BBC1C199C1999F98BBA7FD
%15FFC2FD2EC199C199C199FD0BC17576512E27C19FC199C199FD0FC199FD
%05C199C199CFFD14FFCA98C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1999F99C1
%999F99C1BBC199C1BBC199FD05C1999F99C199C199C199C199C1BBC199C1
%BBC199C1BBC1999999C199C1BBC198C1CAFD14FFC2FD31C199C199FD11C1
%99C199C199C199FD0DC199C199FD05C199FD14FFA8C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C1999F99C199C199C199C199C199C199C199C199C1
%99C199C1999F99C199C199C199C199C199C199C199C1999999C199C199C1
%CAFD13FFCFFD32C199C199FD15C199C199C199FD0FC1BBC1C1C199FD14FF
%A0C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1
%BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C1BBC1
%99C1BBC199C1BBC199C1BBC199C1BBC199C199C199C1BBC199C1BBC199C1
%BBC199C1999999C199C1CAFD13FFC1BBFD33C199C199FD15C199C199C199
%FD0DC199C1C1C1C2FD13FFC998C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C1999F99C199C199C199C199C199C199C199C198C2FD13FFFD52C199C1
%99FD0DC199C1A1FD12FFA7C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1
%BBC199C1BBC199C199C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C199C199C199C199C1BBC199C1BBC199C1BBC198C9FD12FFC2BBFD35C1
%99C199C199C199FD17C199C199FD0DC1C9FD12FF99C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199999899999998C1999999C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%98C2FD11FFC9FD31C199C199BB99C199BB99C199C199C199C199FD15C199
%C199FD0BC1BAC9FD10FFC2BBC199C1BBC199C1BBC199C1BBC199C1BBC199
%C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C1FD0499
%98999999989999C199C199C199C199C199C199C199C1BBC199C1BBC199C1
%BBC199C1BBC199C1999F99C1BBC199C1BBC199C1BBC198C9FD0EFFCFBBFD
%2BC199C1999999C1999999C1999999C199C199C199C199C199C199C199C1
%99FD11C199C199FD0BC1BAC9FD0DFFA0C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C19999989999
%99989999999899999998FD0499C1999F99C1999F99C1999F99C1999F99C1
%99C199C199C199C199C199C199C199C1999F99C199C199C199C199C199C1
%98C9FD0CFFC299C19FC199C19FC199C19FC199C199C199C199C199C199C1
%99C199C199C199C199C199C199C1999999C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C19FFD0FC199FD
%0CC1CFFD0BFFA79999C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C19999989999999899999998999999
%989999C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%BBC199C1BBC199C1BBC199C199C199C1BBC199C1BBC199C199CFFD0BFF99
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C1999999C1999999C1999999C1999999C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C19FC1BBFD09C199
%FD0CC1CFFD0AFFC2989F99C1999F99C1999F99C1999F99C1999F99C1999F
%99C1999F99C1999F99C1999F99C199C1FD0499989999999899999998FD04
%99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1
%999F99C199C199C199C199C199C199C199C199C199C199C199CFFD09FFCA
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%FD07C199FD0CC1FD0AFF99C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199999899999998999999
%989999C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C1C1C199C1BBC199C1BBC199FD04C1
%FD09FFC999C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C1999999C1999999C1999999C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C1C1C199FD07C19975754B27A8FD07FFA8C1999F99
%C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C199
%9F99C1999F99C199999899999998FD0499C1999F99C1999F99C1999F99C1
%999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F
%99C199C199C199C14A27F827F805F8F8F852A8FD06FF9FC199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C1BBC175270027F82727272027F82752FD05FFCA98C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C1999998999999989999C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C198BB98C198C199C199C199C2A0A0A0
%C9A127F827F827F827F827F827F8F87DFD05FFC299C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C1999999C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C299C199C2A0C3A0C9A1CAA7CAA7CAA8CAA8CAA8A8
%2727F8272727F8272727F8274BFD06FFA0BB999F99C1999F99C1999F99C1
%999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C19999
%98FD0499C1999F99C1999F99C1999F98C1999998C198BB98C1999F99C199
%A09FA1A1A7A1A8A1A8A1A8A8A8A7A8A7A8A1A8A7A8A1A8A7A8A127F827F8
%27F827F827F827F8A8FD06FFCF99C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C29FC199C2A0C9A0C9A0C9A7CAA7CAA7CAA8
%CAA8CAA8CAA8CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA8CA27272027272720
%272727F852FD08FFC299C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C1989998BB99C199C199
%C2A0A0A0C3A0A7A1A8A7A8A1FD07A8A7A8A7A8A1A8A7A8A1A8A7A8A1A8A7
%A8A1A8A7A8A1A8A7A8A1A8A7A8A127F827F827F827F827F827A8FD08FFA1
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C198C2A1C9A0C9A1CAA7CAA7CAA8CAA8CAA8CAA7
%CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8
%CAA7CAA8CAA7CAA8A8FD0427F8272727F82752FD09FFCF98C1999F99C199
%9F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999998
%BB98C1A0C9CAFFAFFFA8A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7
%A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1
%CAA127F827F827F827F827F8A8FD0AFFC299C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C2C9CFFD0AFFA8A8
%A7A8A7CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CA
%A8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8A8FD0427F827F827F87DFD0BFF
%A8C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%989999C9A7CFFD10FFA8A87DA7A1A8A7A8A7CAA7A8A1A8A7A8A1A8A7A8A1
%A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1CAA127F82727
%5252767CA1A8FD0CFF9FC199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C2C9CFFD16FFA8A8A1A8A7A8A7CAA8CAA7CAA8CAA7CA
%A8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7A8527D
%7DA8A7CAA7A8A8FD0DFFC998C1999F99C1999F99C1999F99C1999F99C199
%9F98BB989999C9A7FD1CFFCFA7A87DA17DA8A1A8A1A8A7A8A1A8A7A8A1A8
%A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A1A77DA8A1A77DA7A1A1
%A7FD0EFFCAC199C199C199C199C199C199C199C199C199C199C2A0C9CAFD
%23FFA8CAA1A8A1A8A7A8A7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CA
%A7CAA8CAA7CAA7A8A1A8A1A8A1A8A1A8A8FD10FFA0C199C199C199C199C1
%99C199C199BB98C199C9CAFD29FFA8A77DA7A1A77DA8A1A8A1A8A7A8A7CA
%A7A8A1A8A7A8A1A8A7A8A1CAA7A87DA8A1A77DA8A1A77DA7A1FD11FFCA98
%C199C199C199C199C199C198C2A0C9CAFD2FFFA8A8A1A7A1A8A1A8A1A8A7
%A8A7CAA8CAA7CAA8CAA7CAA8CAA7A8A1A8A1A8A1A8A1A8A1A8A1FD12FFCA
%C198C1999F99C1999998C2A0CAA8FD33FFA8FFA8A87DA77DA77DA77DA77D
%A8A1A8A1A8A7A8A1A8A1A77DA7A1A77DA7A1A77DA7A1FD14FFA0C199C199
%C199C1A0FD3DFFA8A8A1A8A1A8A1A8A1A8A1A8A7A8A7A8A1A8A1A8A1A8A1
%A8A1A8A1A8A1FD15FFCA98BB99C2A0CFFD41FFCFA7A8A1A17DA8A1A77DA8
%A1A77DA8A1A77DA8A1A77DA77DA17DCAFD16FFC9A7FD49FFA8A8A1A8A1A7
%A1A8A1A8A1A8A7A8A1FD04A8FFA8FD66FFA8CAA8A8A8FFA8FFA8FFFFFFA8
%FD12FFFF
%%EndData
endstream
endobj
25 0 obj
<</Length 65536>>stream
+%AI12_CompressedDatax���$��&���?d&�
C�;\;�f���J-���n[[Y����UZ�(�������xd&�,�f� #+3���q98�������O��x�O�q<?������wo��� �~���7_�{ˏ~��/&G4��M~V���ۯ����LG{4����?��o�q����wo^����_����^ޡ��ݻ篞��g�/PW��n���C}�� �4�`e���߱���=������&������7���������Ô�?L�/ޣ��v�u��&3%C�����o^|�����O߾yq����7/��W��?��>�����y~���^�|������0�����;�����qv�~c��7�/���o^���a|���t�/_�/t���qz��W���w�0R<�3�ٯO�a�C)?�����l��/J�o�|���ۿ�i�[Lݘ�ج��{��K̬̂��1���?�?J[�������x?��~��������W�~��Ng�����u��G���|��˻�����F�ѤS�7_ܽD����/��H1�������������o�ɦ�� ���>���Kz3�� 3��y��}v��gӭ���w�2I�M�~����?��Wy�O�t���Һ���2�!Lj���}.�6���(�^��{��_G��<�����Ѽ�b�� ���|ao��Sl�߿�DŽ��kѽ����_���bٚ���O����1�';=��I~R4!o�����;�H]c����ձ����W?�y�=�5�w���7_j�������|�����ӷ������R��}��T���o����?�~���_�^� +�!}H������o�_w�g�߾�������Ͽz����z���_�~˧ߩ�O���n���_|=w�.�̙�����/�|����ܿ8��~��_x�����N���u�T�OX[�˷��Zߥfi�>$_��>k���sP���3��|q�-y��=���?�F������?!]��϶j~���x���x��7/�~�t���S��/�>�������\�?߿�c����ww�I|��+r�������;鳶�|�0�e���>��l������o�q��\�������3�L��/���p�b��a,�H�=;���0�?�)vU\)�� ���߀�%�%�Ӧ\�� �\���܌��x[�f`��*nU��-���LDI�o^�iS��i.繜�5J��z�7�ѵ�]������[�*�F�A��iU��U��*'-������V�m�ӯVuY[�a^^�Zd]���f��U͛��V+��e��b��e���7�����g�]k;l�a]�/W�k�dY�Ԭ�U)۵�Z�)��*և:Y�e�Xt��Me��@CY#�չ�k)7�ܲԓŗY���U�e�L�Iɭ̍����z��ʵ�ؔF�2� ��s�sλ���ɝP��-V�x�>��'�O����[L�
.�C +S� +�p7�v��v)e�s��U<�s������SH1�4�S:��t�}b��>�s�S�ʧ|�o�-��&7� �L�N�y��n�i̕��W�*^�����r������d��N�O�N����t��e�mw��p� +D�5C���pq���n�X�.� �K��ucq���7�g\DW���)��;��2�Un�C��|�Ey��
��x;Rٙ�-�خ��v8Pz����? g��x�'�H��˗�v0ܮH��� �*`Cl���d�!��2r.y9��&*w�"�6`�ټ���.b������/�+>P�<s��r
�4��` +�f��j=��i�v�?����?yZ���q�E�^�\�Z��J���YYa ���(����rrga�oе)L��N��,b�tU;Z��Nd6�˻3�C^/�.҆YN�a�v�I�B�ԩ��gMs���Н5�ڣS�C����1Z�Sߜ��|O3�[�"�䍈��أ%l$�"-
����FF��/�����ӗr6��Y8�*�ߩ)�)���š��s�]q]�;��I��x��L����n�fI�\���Jg�e�Xr������%>�,"eX�a��lX~PdS�}bٛ��2<���d����uX�E3Ϩr��;.E9����J�\d��('}(bs=�U-�l��4W�����=�9�"}ZӬ���YA�������L�6�%�Ts끼VJ����{O�X �2�=�y�e[�3UC�wD翇�d���?���S�ԇ�os<���;�������XԵ���?ʏ��O�BF��7�mLE�߰��s��8҆�+ �H$�"� �(�"�t��Ay��\��( �!�DʢJ�BFǭH��|��! �,DiȪ4$��u��N"e��(�r��E�"�R,R���Qш���Q� �,e$JI OeSB%'�Јj�Fĥk�K�(2Qh�ؔ|����J5��t[듖|97�nI�����?F������յX�4�̲P,~�)u�u�x��I��x�" ?4���
Q��s���
E6< KC�v��D�1<�L\$��9.Ң���j��U˭T�k]��/R����)[�[hJܔ4lTy�Q�� +p*�����2�:�Z��������a}S7zϢ��-n�M^_
/�Y�;l�I����r54 +�rzb�>l4��맕a�ýE|r.V��O��oGEq3��--U�� +ͪ�L�T��TJэEUZ*mX�M]�JY��\9���U��Di�%�%���2�r5�������=Ҵ����ъ
��%�s��(�It8�i�4fCT +a�);��12<L7�@2�0���{���y�D�H���?\~�s��t�-*X��*;�K>�y?�Ӌ+[� �@��c���&�*��PV��5m��\�8���6
V+-��7b�U[�#w)�Z��f{%0��<@j������Xp1�fr�b�=�]����9I�t=�G9 [>�E�����Xy�+3�������K�o�J��O+ï�~Q��Q0:1�L�<�98�Il�j>-�Ѿ��8��Jl+���u!���3)]Hh%��\h�B#ڸ����L��o�{[Z�&qk��"fÊ�mIWC�v8���x�}���i؎u����'^��{����߇q�m��C����IJ���Ϟ=�����c@�0�9B��k۱���i�c�c��wt�6sM�&;�XݸC����I1��T�� ++��t���ǵ�l�⟿Z��+R>���q�V��#���6�C�xji�7~��zQfd����@,�����zv4����.����/�_�b���S;;�c4`&�#
46%�0y��SI�R�����
�m{=��j�P���]�����|���|��s�|<:@>�l��m�������/z���r.��_��S �� +_rUX���Ba3|�!<4�S<�0��< Sy+�De&���W�@�AAr��-^����u�U��jKTˈX�ō�uX������ᒗ���e?��#u����F�nf��VŜ���z�Q2�7�sP����f��'z���3m�����dq<9+��r>�3_<U�k]' +@��rO���"���i ��
嚀y�0s�fE� ���:�g��x�,>;���ug{�Y�ʪHNEa십��]�����ԕd1����U���
w]<��[�
)�8��c�(�����b�b<;��]=)�,��I�ȥId�,v�+�PO���D �QuV�o���ʬ��*rk�$V_ba���_���U�����[�X.}�7I�ʲC#�rOL��,����lE����kY�,��
E����n%ʦ"ƞD��1V]� ֯$XJ���:�vl`{6V��Y�=�+2�ҡ�Y<�W�bc����~Z�-Cq��Ŋ}�س�o�g��u8��r�s��m;n��X�u�}!�Ց?�j6U615r#����I��n +�����w�z·�2�����_�}q��|t0��>\��v���,��н�e| +����(Cq7o]ͷ`['s�ث��j�[�d�˧�1rQ��Nت�����8
�E��Tԑ<��}�>�S������|e��f�k �Hʾ����_ +�M��^A*V��� +o�DT��7
�F�\'�uY��6@��,��[���eh>�O*�r.V��+÷h�#��exZ����:�i0�$��3QN� +ߑ6�V<ϒ���^X��EH��92k�V'j�X\+Kd��P�8S����GY��р3ɡe�N�qV1��e'��������%:����U�9J���1џ��P�:��v��lu�{��L[�5*�F��6Ԯ/�+B��ƪ-;��eф�a�ǓJ��ږ�߶<��'�Oo�_��K��M ]"�\�EkF0�ED��ϤE Ȕ���θϔog����|VUu�^�v)H�!�
{'�x��T:��U���jCIT��Ғ��آ(Z�J(Z�4�K�Y�薮l��Z�Ja���\"6�Bi(��D�9���P�{�i�{��:�:�6�KO�y�íO��0i�5*�a��l�X�!X�%R�K努Q>E���(c4���,�Z�ۙ;��^�o�;r%�( � �/>��1��]�3HJ��W�.=��Cq� �Q;
�J��liJ��B��%���۵�C^ײҫjL[ExD�Z䤵 ��n�I˴�~Ի�z��Mj�,v8�'��2<��9>�Oo�_�êD�� �Oس�&������F� +� +0j�h���MMo�p-�~v*����fP�j��0<м�4�A͗����ƪ]���\ /0�)�zdp���[�_b��ݫ���j�ZL]��km�r��kX��6�ָ՚�.X��Ƭuɨ�1i=d�.���LYO�^I��S��)exZ����2<���N�O�' +�������O�' +��x������m7��?�a>Y����kp�i�>��d��8��$�\�09�f��B�'�zgFx�q���O/e⎭�cT1�;ɸC0�tm�ojj{��(qp�͂C�@���z
���Ni��m���)�x�?��Nv������U��!�q�nܺ/�/���r�vE�i]���ŧ�Mi|��T3��ٷ�O'��ؤ��\��L+�u6�u&٦|t�,�J��tѲ���K�]���j�=?��Q��`%�֜k���,pHy�Ta��k�5u1'�@I�QA��l���P�8��MJ&�7nJi�Q��<�Y��O�d����F0��D��G3yv�hC��x/���e��w9�ˣ/�h�-�UP�h��n��u�&r�S�w��O���f�c[��x��^$����؝lx��qq}���c�����sn<���c&�z��}����������Q�P�M5V�����'5��K��9�fK����rC$ۊ���������-h4�5��^�73� +^.E/�y�j�R��Kߗ��i{�v��?����|�'ȍʾG���K�6���
�ʅ���F|�,x5�奔�v���1���a�b,��T������rT��hv��/�̞��ʽh�j�2~���s�&pr|O���s�O��!y����"�p�Q�-�����*X\�ZY���[z���4��]%��zC�@醒����(M�Di�s�g��'����-tuh"Bm�@�L^u}DmA�n$��$y���`���0&�g���nճC7x'�᥎�(6�Kf��t'�8�=n��W�l��AS��uO���x8S�V��*���;�T��d���>���ٖ�I�İ�X�#�!� +����Ma�\Q��ݙ������>�Y+|�Z��[1�z[gz[����1�Ԙ۴���mJ�Ur�5���Y|�Vn�o�d����w��`�x��NR�K���������i��s���l�\7��P||���T��GY�ug�nK��E��$%V`��t +�6�>+j::�T��\P�h��e�l��銻P�n�C��%�o����S��5�� +�YS�h� +������fW�X1V�������� �*��:�I�2���S�O�BI�4�4�!�eV�k��?�x����ܓ�'cO��L�j�4-���o�K�����Y���uU��h�%
�J���L�fd��-y����t�u�����<��+q��e��Ymˇ_��CU���V��N`7��� +�6��<žr[D����\,-�9n�^$D���8�a�w���2\�0�[�����ԡz*-���-�Z�L�T����F�h7@�K�`�nQ@밆����#�^�M�n���RD_�y��rwQ�v���p���ѹ��ჲ�p�b?�M��c��C��a7�M��t����;H���sM���8�)��4y%q��i��$�!�wb��-� +K���g�Ѣ_�� \߹���D!��˔�]
��b�j�Q"#ΐ��Sm�2�a����+|�;rud�ȼ]��A>���Q�?u��l�R0�Ԝn����`uEss����9
+Q37�f���Q�;NL��t��hp)
n)�n��6W�Z����nE*���:]�y�u};� ��ӕd�q�Y�J��Z����,�=���*�S��Z�� +�`E�;p8O� +�n��2�
;aN(���FXg��`��ᡭ�Xb�mZ�b��w�k7����ax�-��(Å�S[���/|���um*][�W�m�!n;2�.��_�=�1�1i���8��c���T]#�w���-����ՇI�~��ݔ�÷Q��~����^/�CQ�J�Rz�$��-Hi���[Ȥ"k���?hR���{�W5�q�n ���U��V�i+��~� +� +�wh�p�C=�C�����~��ӷ���ݿ��OVr��b��X������ݽ}
����?���9D���a��St��~�;X�4�3��a{��G�Ol� +DžI3�^�+�0pl)=�4/��$��M���'0Y�:D�H�k�uˉ�f$��H��˟��^�f���<�$����j�'��ɲ�'pe��8l���,X�Z�d�.�T>�S�� +��}��[��Ϲ0quf�ۿ���df�7_��������/��ʃ���s���7_��ٛ?��o��jõL������{����آ���!TfE�b��ѝ�(��x�L(2�f㴸˸$��n +���,L"�C"��z��J��Є��� \��7T����[���ʤ�d�+���
�6�vB�oe�W]�!DW1�oHwm%H2k������dRq'C��Վ�XZ��[��i;F�x#�B]y��oe�����N�l�3_�c�D9��D/��*m%��� +dބS�y]�-��
�u��H�J�bc�x�[ ��w?*����rYrB�ʟ:3̑��n�sS.������e���U��dSi�k3G�>fT�9i\�h?��q��s��iC;��+x��#���@E��:��P�����l��XJ�Kun|���ƛ��y��$�����8C��(A�]�Z0O�ׄmx{\��F0TO�E�ȓHfw����aaJ@C�r�`%@|�R%�R�U�#>L�o�;yp�"MfP"0�=��Xp������n� |��9����APr�-�� +�2�3A�(L�O�ř\��'�"�D�ӂ���3��� +|=g��� +g�Z���h+������6,Q�����Y��ޚ�Y�ռ����9�>s���ǹ
%ґ�?l� ��m��m]�㽃)�L������p轑Ch�M� +�� �S�I�8\���Յ<%4��4.�i+�഻�2�>=�ρ��o?�R�ݵ�4����1��������?U58?!Yި�&�2<OYuf�\1?d1����J�Y�^U���wR�1�4Q��@R��'q��A� �S"�ݏV(�d@�DU�w��e�%E�A�[�ԕ +Y
�BƸ4�*��h��UN��v�v4��N ��[�i�^:�N"hw��@SQ�AK'!�S�;�- '?d����ۅld� +��eLQ�-2ux5n� w��S(�1����&y Kٵ�'��؎�������Ԁ�$Fa��q�R�'O�>q�ň�LeL�f�9m#�p\����K�dv�e���~�e��� �K¶����#}0�U�O���e���$��|��xA��* +L�T�U��$</k> ֎�&���&�4yr�(��$bx�(�5�M�0����Ɉ�p�r���w�ݗ#�-F6<_�� +�4֣VԻ������s9)߲zNWQF���m�;�-:�ϱ�?�3�R�O�N��Y�Ϲ4w�J�?�Y���1�F�7lֵ�,� ��F��8��J\�o���Y�}�68j @)���7�TەT�E��ਟ��� +��ic�� c&���N�-pd<ttd�pW�# +����*�NX
�F^��ӎ���^�p����r���f�WY�˕��< +� +`��^��7��1���q9���M���(ID�RΖ72���� z�\-o�7�9� F�4����B��!X�9f6�:3m,o�(a�)H�S
o�S-p���C�}78r!�f.�. ��k"'W
o�g.m�m ������B�#Y%���O�ň�X�H�����pd��1
L +/��
-��"�UMg�h=�l1{�u�������`3�M��d�h���<�1i*�"h_wm�w��`{{*��}'��㜥4+q����-������PO�UMcdm)G�t8��41M�b /�7�1ru�/���T�TØ�\Bb +c�}[�2>���d�?���ѭLc�̍�w���0S�kY�~x;(&68�`d]@��i� U}�q��@3ŭ���Oʨ4|n�ނ,���xʀ���1M����O#�i�ڸ�&H-�nqdq]�$���������v�����0��qTɣR;�{��#OR?W�jJ���'$q� +4��"�Fj�0Z̝��e�H�Ӑ�K����aDc�Jj{�
��e�Y��[�E��l]�����l�B��� +����yi��/�3�Do��:Mp��q�yNj�z��7��*�<7���%'D�fW�ҹr�""���u���:�N�#=����չ��`o6�H���{yvw�#�l��}�����}�2���9��t�4���8½�e�b�)t����sg(]��vFy9Q� +w�x�7c�"��"����Ş/�N7��vCyl�.���D�=y�#ȼ��oJ��W+��3@�x�sv��ޝ�b��t��։t�ym�f�{��<<A��t��K��>���nХb�%u�V7K����$��3�)ގ��I^���c_S��ro�T��#��x�C�A���a�#�4[So+8ո�����{|*&D +�l +�1 fE�h�5���X1�F��HX��P��I�X
�X|���5�^ɓ���Ir=���t]�F3�}��7���Q�0Y���u�oe��%D�>��9t��Ɇ�/�G��e#�*�B�Bu� ��������V�����ѫ���!�-�W�'��0�r���Ǻ~,�����!�^�i������Tv�tI�t�u:+�!��H�{���D�>GY�ƕ�n\��/� ��iǩ�'+z&;�v��������ʈ!�5p�O�����|� ߩw{��$�$��{�b�����[�BP�����O���;�y,�Ͼ�Y��[FK�fa�5�;-����g��L�P�>��]yl����?���w"CuQ�*v�����>���ͫ��БGq��E{'{:� +�豛��ɗWi+v��w���f7��V����'�˒�Q��v�]�j.����gT쒑hL~��^��eY݄6���:oCت(����^@Ú�d�7���^_��y�� +��D�LsL�^�:���~�"��r����|���ws5�mn%n!#\���� +�얍�y���0�9ġ�xJ�xI&0!����S�l�
<ཽ�Az#��(k$2J�S���` �L%��NO;�/�< &��*���0��y�f0� +��XO�V:GK��oe�'��o/^��wD�F������F�W�f��n� +�8ݱ ɉ�)Z\ɹx�f#~������2�`gW�uSq!�nH����"��7��4w`>��`��ő<`�z�*P��o��1�գgu�ΐ!?��穋�H��#�o1)g����5�k7�8�'*���%��Pb��NH�����j�2��pW�������FpJ��O�^6��G��A�0SX�b��;�V��F�� +/ƺ�7��E�N����)�(ꦑ6�~,VE �V��SӢR�fn�~������:}t�0�%�GQ����D��j[1"F���Q��Q�b3Q����]���?��h�+&�@z��LYB��� +,%���M�w��'I�������a�$�Q=���u���Y���sT�B� -ݓU���g&��TQ��L�QL��g�y�iP���6�Ǝ�}]7iR^!FKBᦢ5��J��d��2Ɲ�:�����q��u�#U +� +Gbg�y�����@h
<):o�^�i��&�망�n(�������� +��"de�A53cK^����3C��"�xf�B+�D������uŅ*�M�fH�V�@��cX�=dԥ����
b��kug(]��ꓚVI�`4f !m��� :Ez�8ӿR�@��L�M7��P[�y=��A +� ����D
�T�CVc}j�x�ɠ�j�)�B�Н+e <�*�%2.Aܖnb;_���G韬����蓺V�ɕ��V��v,����]ߠ��wj�ڵm?��c���Dtp�4���Gb@ +(����<j"�y/R;θ��:Q4�rS���%f6�tw"zSv�[��NC*���F��J"�"�9����XvZ4�O�ZYե洣ԏ����8^�/\�NM�e����������4��cݲ� +X
d�p> �.hۈ~��$��t�$k��UeG�ʀ<���K^�ԷxQ$d �B�(�^��먭Ş���Bע}�*M6��94�O� +X���Λ� +u�,�_w��<�Y���l +r�顰�^SÂS����i1�hȤ�3��[�I��E�8}R�3f&� V�N���H��eA�a�*iq9�8�Nq���6�8��.�p�̺�h�3�h����I����i�0�Tfġ�E�"���Z�g��y�/�롵� !�
�:�x�>��-/���ߢ��Z� {�[�;��=��qUZ�*����Qu��/��[�e�t��l��mѾQ�Z7��n�v���`܆���E�U�����v�� +�����d7�GW�c4zv�M$�A=�Ne6�o�|�5%���8��@%&73�7`pT=ҙO�6�+6�p�ү7�h�����h
6M\ɳl�'�k�����_o1��S�]������L�t&:=t�J$+[�TN�5�G�t9�C����PM�-���d<.3%�ԃ�q���փqL;-"m����նo��Xlo#z�9�xK��c���Z�$���i��@5�ύخ�촨fL*J�����9JHm.g��/��SCނ�1Z;ʌE�U�s.G�T��`��rt*e��&9��i��c�]�����c蘄]:�7J�Y�-'�Z��hjC�=��*�[�6$f�|D�(s�WB.�ͪܕaZӣ̑6ţ��U��n�&2 �j��Ȣ�;z�r�;�����;��/\C����B�N���(�Pt�BS������n`ߖ/5�q;��Z4��t�����D=e7"� 2���
�A����tS�
履�Ւ-��<��`+�p��6��H4�]�a�^�]��ț����b�ӊ. +8�<��� +�y�-�3��0m]}R���O��3����;u������N�#�4�f��S�����>�X)�pÉꮅm3�8����mP��
d\�K6��oѼЋa�Nt�43�Ҍ�G�S!xzF�ж�^pݴ��t3���zT9�����BET��"�C�� ":�]���È�@�:���~$����@":��$������:��J����z���^�������.8D��ׁCt +6���~�)���/v:R�)h��M�'��o � +���|\o��a\=y�)t�3!��-m߈7p����@�y7��E�:�BҔ���������={�R?���G�|�?�V�a$T1Oب*�Ed\5!�s�oD� �4��@����.�3b��$n��J{Us�8^}]U���~9�)������-�ר>M�!�:4�iR�#��e6���ݏ�i�Xe�i��ig��#����[%.hb7Ϡ=[/���ab�rQkG�0���^3��Y�'�{���:� Ė:
�vir�wb���+��V��Ucն��$���4�M?��ʼӽP�짠<���-1$��[&���m�I1_�Vb�F�VcF2����i��@Tk����ʸLŰA���[��#��4�S�~^Ʀ�5u<4�O���>N���JE�(پ���v +�s.M��CoEL��I���ə�nܶ��x��`;�(�V�����LG+qv�^B��dI�kQ�d�X佗�a��k4��Y�|��X��;�;�i���Ӎ4h|^3�\ĺ�&qe�ߩiQ��fn�~������:���\��l(ne�GQ�j���~��Zߊ�U��!<�j�����i� _0�Ϥ.آ_�����+T�B�sG�߭�5�r��Mq�ym�v��x��-&�o7���_��k�^�m�Oj߿率�n,�-�G�B"�K�V#��9+�(�k�-6��s +�"�'�st�'��2��r16�T�2�!"��}ؽ�����Hؿ�7��E�U��k���醺��c&�C�]�JS��f��z�������)bM�7�6P
;T�ĠزM�V�r�r�"��d�� �+L�L$~I�Xb4�O���w�:մ� zA0�ö�d����kE3�ڭVZ��0�>�n�<����V���Q�
�ܾ{�M7�P[�Q `5uf4��ф���֘+3�ъ6F_B��D�b��K�-�ɢUdV�]|gR�B�9��AmA�k��8Δʁ�h\�Kעy�j�ݶ���<Pm��s�Z�������Nm�eҶs��S��
Ũ��[!���?�7?Ad${�r$ж,�4�����1�?P܃'�D$-�zT�$�x׃�%�)�A*&h�*���c���@�4Fh�h�_�2��ja����41zY��� b^�Q\�jo1c�q� +� +6�@a�ae4έ����,MG�q=,�(z���C��ݺ&��u��3�FB�w���$�l +E��{,���6�A�2�� �xA�� @ɹkA�v�*��«��;-�
��dC�B�Dn��}'�dхt_"��1�c��h���FZ��@*̓�dZި�\�y�ř�L��b +��--�-��8
�"d/]�T��̴��t�>�P���I���(�������v����u�4O�8oub��)��{4W�`C�hr)�8E ��h��`�h����K����}L���Z*h����E4i�[4����g�������c�j#��;�DKe������uk��#��i�[��Ni�9s��R� �,�i@����`-��~k���9��N.mm�] +,0����+����\�10W��sZp�yt{��˵�� j���D����$}�4E}
������o��~}����w�����w���ᗿy�n��o��v�w����_�^߿����~����ֿ���gx�۷o^_��:�7_�m]iF�����ϻ�/�����ٛ��w
��n���}q�����R�����0Y�߾y�|�Yڛ�gW�q�n^Q�пOw_.���������/�G�EQ��� ɺQ�������<�f� +�ɵ��,����;}�WCg���_���;�����1��>1FF�>g�g|p4�������s�������mY������n���^�۬�Ù��߉|@c5e�D!����'�1ծ�뀑��V+Fky�>�٩�*� ~���y��#og�clJ)+��J&�H4��� +f�`E +�ZT:�УR�S��9��@�3�%O���,�#/h���F�1Cv�U@u�yP�k%d +y���
}�@�Z�7�p1�W$��D��I!G�a���TI���@SVPK�������L����XsI��ш����ҏgPl>UB����n��>GRW��9�E&��?Y#�Њ +�����l����J�F�����IV��E� [��V�� +81����d:(
i��Dd�;YA�'�1�-\��ÐP� ��2mE���y�"��V$Q�ғLd�QW��n��9"�(s�8�0�0Y<'��)HQ5Y�ۑ���LK +Bn +T��ى��V�l�����K���+��<�b�T�㤙����SQ�-B3Ŕ5I�p^l�F*b����^�^��+]�n%B�2�o�-k�5|nh���Q��!s陣�KP2�>nK�v���b@LjHE�#� +�&���4�240=#����%s��M�9�I���
$Q,�*WN�X��YI*�J�
GFO%]�POH�(ߢ�T�s�eѲ��W��T<0����ƬF����&v�� +FB&?�i��Ra}�4�J[1Ez.�� +W�
�a�ҏ�e +� +�/A���xC!�A]U��8�V��w�C��!oO�s�ᓗ�C�j%����\B[.|&Hp�xQ�3�t+�d���`�X�)dV�ǩ� +4+GN��I�eΥ3I� bD��I �`��x�����V4�HE�=�s��Jeg�
�%h��>g�8���H\;��nZn��e�3�ٙ�YL���4��tR9%������\��U��ص�ءI��T|���>T�~���>T*Y�IxYq�;�gn�0+��)�[���"|�=8:W��4n�D�L����_B�QI�>�l�C�$;w����$��t�д���;���#/%�~�ԥb��oG_0�;��hAr^�9��\�o' +QW�T �&?�H��8 �5`��R�oF�9����H����l��Ie�v#�Y���B�\j'�A�D�U�Ò��CTG|z��!�VX���V."=�X�>w
��8��F�i$�RJ�[JW|_���p���oe-����v�8�G��O��|��� ���! +IB��Hd(��z��S0w'�<ziGa��\Ɗ,��A�g&�B3�1eE�)�7��\@5�0jVfX\5^���)t=���nKOBՖ�@ +IEm��l��a˴�Rvg�*��t��-#d��D|n���1w�81g��e�/$R�`i���q�E8�+e^���2e����[5����ע��>�)�~����-����~�(i"^��Yш���*�W#C�J����'���~�L��#��?ϸ���KO�Հh�Ju�3�8�IL/��EQYɭ@E'����R]����3����D�" +�!�#.��ZU���z���Zi)V�y�~TD܄�tY�x��w��� &�:��GX~i+;$2��d�9&�Ee'�i�!�� VA�Y)�VQAE�ṑ�H�TjŭQ�����aW��]������2Ĭ
� �H���� +j/��P����݉2����L��8���z�t?�P��siFOI��q�����K&W��'��5!�4��ĥ�j(YQ(� +XվU�P���d���l�V�@D��w<���%ߜ�bF=�E���Q30��YUJ��Y���9A}7� +��jO�*i�j�I[����9p��>;�2U%�D�c��&�ƴ�0'N�ˎc�yB*¥$ ���@��k��[ _K���@���(w˚�fIP},PǼ�(�gn$:��PIc���㘊O���0�gT@t;)�-",$U �1=ȗ��N/m�3���x�6i���^��d�Mf.,�&b�H�dI�ЊQH��<�h���De�(�h;i!X��z<���T��$��J%���n�R֒|�% ��4�J��� _�$'1�'��;q��� +��$uRƙ�v+���q�&En��P�>�ğ5\j�"Gs�`���c��~�\���|�P��$=�Dz8��N�4jsM$���P��<��s�p��E�� +���2�8z��i���5��Q3CL*-���B1e[��c_�aZF��q"��&+_w<��H2�2U� +z$9��FF +ר�^`q���$��sA�"'P�'d�#z3&�i��pr�ē�w��nTh�H�0I$��jNy�[8�º�8^+Qޓ��m@R}�(`|��ֈOE�
|��id]�RBR����+:Q)2P�L@�(o$T�p�0��� +}�� +�%EEWg�8�չ���Ʃ��A��]�x�n�Y�!g��ŐIYW)�¨{�D*$�q� �F'�w�c2xL=h�+��)��W��XQ/��G�f[4%�X�CJ�損��Pa��^04�yB +�3�ٙĊL�$-8�h�R�dw�rzjs�K���l +`N�_�7y�:x5���u���� +YO��l��OEa)��J2���j�B�� +�PHEw21h��H�#u;��(DM��v,�ٓ���-���� ;I���������dgzW�{8C�@_���a�l=0`��� �eC�������<+���ܟkR<0pg3"�L2�b��gC�h4�9�r0GG�u�'��x���,� +Oͪ�q.��H�(Er�m +��%���NX=��f��_'s36O4�h���<n4 +��um�ɞ��K㾾C�+R�قi��EE �KY��)�D�_�XB@j!O7�j��2�Z�?���x}pq���ז��C���ZxA\M�)��4T�/����\ �������k�W�ڂ�uc�Ϲ��+�M�2NQ����.t���W��Vr�c�b�u��Jz�4=�եH2����S������6���2���F�ti��>��
����0ng�=ܞ��q�)� �l����{��F���n^ +4 +�2A��r�+Pj��#������\�͍i���&YS~IY�6�e m�C�ۨ�j�k�� +�'�-L#�����!��<��؍�I�MM��Ϊ��n0�ǟ�`�� cu +n-��K#��!!�?�F�T��
4IS���i�AK���X���Z^�!�Tzt�AwJ�6��:7��~������:*�G�Cb�!1;���8[]>m��S*���|)겍@
�.(��W� <�:��; :�զ�3 +�h8����q������ML(=\���2�)���@�������x�Y�ȫ3{!n ؿ���? +����mD�=��ߞ+#�Q�Z)�N,�czA-�\7t�6�l�N��B{7qes���P�)|��ï�M�C�c�K-8��>��4
3���4Lh�=���^��Q���H��W,7��)ӣ�3���?P8 +!FR��d�%
Hi�&��v
��* r��*Y�6zELS �"XG}��v �`Ϳ�MA�7�R�-�̫{�f4����-�?B�E�f����/�3~bpG��h�v��c�P�S��|���]rߘ�d�
���2��J9�|J6 +�m!�Dr�<�
��K����9 +U!�|j���l��_��p�$�7G:j'�R�d��q��!U~�~־�
Em�;np� �A��*&<��8�'�cQi���T��r�[Lm���G@��^��J�)�.bf�_y�X�z|��+�Ǟa���V�'%Sf'\�<����]1�)f�v�=�%�LV��e%�w�b��$�T*������돐C�ʉ�� +5\���+T�-�=��V�
&������{6���ϲ��s�?X�(露�>�4��}��<�����Z����M7�Jh����]�5y�曲7�1�R�d�dYl=�y��E�p������w_�L!�;!����N?P G�k6��H�~���)H$�(��Ң���a~=�Ћ�����o���rUO_7�t��~o������}���\v��S�)u��I��M +1�"z��{`�3:�i�+�|���R���S�C$2Z��֨��yFZ��y����
��Ru�NYU@\������da{@b4a��$4��}2*��/I���^�2iN{�8�W
SO��e�Wi��2S�����W��PL&%fZ���p-*�ޝY��Ng�]�JQ4���@����D�+�^]�����'�@*�r����2N�7j��t��Hyq�S��Q�m�V˨�ͥ�{*��ݨIιEVR�J�'��+�֎
��ah�RqC +����#��M����r/���5.�i���w~�hta��C�ƌ�K�SAS�ϔ~�DK��V�{���%@H��"�`7��5K��K-Ǎa3����]�� +�N�����oU3髜 (<s���5$�{�ν�}�����I+Ը_\��k�����@C�G߸����� +nS��Vf���NMԴ��G<qҘ�<�35����\�Ҏ�]��5ۖ�t�0ɰB�;/�1�'�YV�4�%A�N�$Er��rR:�u��`���+��R���_��.5l��uG�&��Bv�.̯�i�Ush_�j�ә�!f?��P�zE2<v���j��ɪ,�uj�-H�R�S +`t\���_�(vk�j�3�W�f̍~���1��ŝ�8~���q�����m��@?]'8910xiJX^Z��8�%�q��:���J9;Źk)�w�Bop��{��iR$.�$D��E��l��c��ydЍ�F���/@A�)��W�g:"�y7ztK��(��*�uo��ef�6�b��V +Ku����cbb��]����Q������h04B-z +TKh<���,�ŕ0�ݶd�1�uz�$����K����1�;�:�MQW��w7w����4������s��_�������������?��?���/��?��C��4�~�QC�i^�rA��忬^2�[5A��+����cK�|�f�58}�9j�%����B��0�^�UY�FHG���Q�`�BY�Qpbfӹ"���v���c���/,!��t��ɰnE\L����"I�1��=��͊Rߋ��G���фP"f���:ϵ���m�C�C�V ��]
1��yl�e�EY9��\�f+����*n����/�fr,i^�/�@��%V��*|:�4��f�~�ǵ��F*>�U�|\W�FU:����w��X��#�=� +���ψ��5vW��=��J��Eא��d�;3]助�Q���2z�tN+�_���`}�{�"}���4�*�T*Q��Г���B~�_d�)봳�4Fړ{�f�)
����$y�����ضi��9ؿ`W@�hMZ�,��[P� ���B��0��@��Z,��a$�|�3�<�C�q�rT
J;��v��Kև�`N����ZuJ�8��S��l)�~�6?�� +�8�O^AV�� +
M{�� +1A-w݄�)I��Xe�Ye�`����(�a�E[ +�^Ŵ�r�!ly�@j��94pɠ>�Y4��s��t�(?�~�N�!�$s� +�ku�{a�R9��'t�v�5��e +�K'��S>!1�=@t����������P�Wfl;Mu�8��Z�]��oT��X�ó.�?@i d�30��P^�6��@(A�G�`Se +?���:2�˴elX,&6�I��G�t�&��s�۠�q���Jr6:Z$Q6�D0�N{+��X���PO�M���#��; + +@0��*�'�7v�
��?��b��ᒏZ�� +^�q�J�� ��P�{�l�nD��X��'���a�-��
�oz�.�� +�y䲕�[$,@ ��豨5��d*�� A�9�.i!3�~�:E�����gu����ק��+�T��B,�U�����A��2;è�q�߽(��g�j��E>�RZ�L�����k&��}9E��o�B1�����ws�44�&䩡4"t}n�U��(a�s��!��Sf6Ce���U3<�� ���3�ޖ,�8��a��E��v~@3�ڑ�*��BDzL%g����Ɵ�S mA���9�2@E���h���1�t���zE-h�� �6�=����� |^�q�D*��b�T�`[��B�D����������ˋ�M9 +��]l�뫜�%[��U�>C���8L���8�d� +�G8x^�+g +
X{�3Y�=�aY���L�R��I����N+v\��)3 +M�H�^�����d��_w +����8b��ʋ�ң9��rK֚�F�����HU��[�O]�A�d���x�ހ��?7�L�|'� +��Jytw�F�W��r��-ԼgT9��ǁ��77����M�VDF�O%����a�=�W�V8��s�{9D�Upf���B)�R|N�9E��.�6�݊'5&�����%���5*G�*عJ����p�m�}j��H�� +�::�S.1Y6�C-.ncE�0�ڌ{�����`�}6\�hpY��e� +���o����}u��n��`\���������YZHi�Qסo���stq��R�j�{6�a�Ο�ȡ1K�
�m����F���v�ʫ���R����B�P%D�-Ά9 x��g +���� &�����\ +�OX@(X�8���b�Zgw�@C!'���AQ{�������`w�+�9qV�r�6%}L���� +u I�)#�E��q&GUӒ��JC��x�z��C�>s4fYH�x�{D��dǒ��Ա��p��\lw��Mgn��0�.�P�Q�V�<S�7��2��=r���j륯��p�T�խ��Qd�����:35k3;������w�P�g�Rl�x�_�l�BG�R���:T���<s�O=4� +\��i����7RN��)m���
=�.�6ڡ��X#��rՄ�2�h����j�*z�.�WƷbαsE�#.��N��HVe_2�E��:���몲��D��)Rʦd�U��C��-�Lҋ���!�Z�����k�q��爵�S/����B�g���/nY����v�#A�*B�IgZ�V���� + �����W�P��<�Cp��s�j +.�Z8z���b�g��m����Nn1-���)�8H���w�h4�=]
��� �S�����@ 6(��� +�f�8Gq*��ܵ1���q������,�*��l���|X�V�� +���7\��%`7Ľ?#�O �MMV>ży�H�|+�D3Sry,���������$G���y��Ѐ��@���@ce�J�%�
�=5t�n�+���C'�P�|o�Ua$4{,g0t �_�}8��PH�G
P����b�Λ�S�����$@Ǣ�*�_A�%$I�)��r�m��D�1�ʶFe�^�;�^F +�AQ��e|��(U�Xj�no*I���!CuԐ�E�V�Ad�\d�����[�����V%$M-���<w������iy/uO����,��(��9 +ŗ�w*8e��⡩5�D:O1�+��������z+�U�4x.�G�OmXHa#����g�s�/�m�����1@ei)������Q���ZǠbQ�4:�>V�;�C��<�36��لd�����i�$s�̳8ȅ�(ߧ�5�����y�-�� �d�n���ѽW��"^�m����1�$�d,_���z�DD�9Ƕ>�����4�#����Xh��D��;����u�ܦ$����K��s����9M�G�����jTo������Rn�_�D�s�����?��������?�O���?�ӿ���������O��O���������������?��O����O����������O��������������ͭ0����'���Ϸ`<១6�`�V1g����� ����ܪ�n1�������7���Z���r�7��ŭa�~�|f�{����������1S=���V!o��sT�����^�!�<�!��#�
��+�I#*�6(g��}�|�щ|BȺb+[��)�>�$;�fq�Z�vBIU��s��B0�W0H�QL���s��l�T�� R�g/�?/�z�KԾ��{��#'A� �=����fy_�ݧo�����(?[�.&ʧ�}!���
틐�����09� +a__$���Z_
)��Y=Lٞ�G}���okzJW�Gz��)�o#z�>�����H����Bd��|垦��2oC�?��W-O˷�<�#���I�ʀ�~6���Ĵ��x��m��]<�4��O.��)s�6�Wl�[���K�G'x���o�ξH���}'�W��ݻ���p��+Av�os�.�~�tq�s����6���=|��
��s��~��w�B��~��Xry��w���6g�j�˓�r�mŎ�"�0ۂ}�
xf;��'BO�u>��=hKPE��:�t����{�o/u�1�#�D��.��;��q��2]N �j�e�nd�����Y�G�!,a�q[�m���
L��1}Q�RP����.C̲�|�>-�tya�h��J�G��8�4�02~�~��'�w�o��y| D�Q�� ++t�/ks�G55��x/�F�Q�����6J7�����l�q�((Π4��~8����/�m����o��ct: .?
�/d`�!_>�+����/B��nz�1��uN��i[�s!˰�!A��f��y����[
���_~��V�۶ܱ[�Y9���nQ�2���L^���ї!��#���W�~��G��/ݮ�5(}O��%��0�"(߲����oyX3�Đ��|�C7!���Dn��4\��m��&���ᔿ N���Ja��
�!�X?Y�EŒ�f�]"j��7Fp���;,�=��/��u[{�7.�OG��<��[�|�0�.�S����y��۶�jpaE�nZ��O�nS +�mҝZ<����'��Y� yF~��FID��p�Fż�vp���<}�)?�m�-�)��e�� ��4�f�Z�jOm�I�m�]Sl��Scⴎ��n�e��$����F�V��厍+��m�
4uΧ6~�g +(�=N�Z�K*#��69�ON/sc�u�/sc�d��i��S�^V��遼�>����H�,�aQ{H�l�p������E��J|��0#�Ƕ1R.���^���8|)�Yn��I��ak�4Og�����A�*&�-��y�Y �v����'��v>T�7�{�Aέ.,̂��r�=��*��f
��*Q�x�����d�w'`V�@�� G����ƿ�棞���K��m�{�V.�d9��+`b|:��g��2�=�����%�Ǜ�/��B�m��VC.L{�w��>�zYQ0w��Ų�lg^\�k�o�������>��"�ۇ���Vx�:?�Q�o� +c�؋1�����.q���Z�{���Ɓ6C&�i���m�\��#�f>o�2�/r/ +���1�m���u��0�~[�2���X���t�ч�-����Tb��W��~���ǖ;meq���3d�-y���ɟ?��R.T�Ib%ݦ�gY�+
D�u}��ڻ�����=����5����S$V���k&zʴ=]�=h�t�oGX,�2�_��O��ω����g�*���QY����<y��o�Y{�K@�����g�� �Ԝ"���=���d�_�l +:�Q��F��-,=-�Ǜ�=��0SY�_F�oo���6 +�g��7�l�Qڷ]�\�]bi��_4�Q�Mai ������ ,���}z���&��G����U�����?{�zǓ�3�ȧ��cs�R3|��֯x-�|:�^ji�m�J��B��w��Ҟ��A�b��r�#r�z�j�x�o֭��9��s�<^�Q�sdĴ�=\��U��V���.�M}��S��puL�!�����\}NV=�e����E=��H]o/W�
uI��\m�ׁ��O3רn;i�k*�6s��r �n3רl��hכ�+w"x�:��rU�� ++�8FN*]��+
J>����J���T=oWW�G�����jCU�w.i�����Wb N��eۻ�f��4>�we��8��&]������8MH�,�W?e�9?e5i����Q�쀄˛�+� Tt��U��~1�������{�`_��y�1h>��q��� žË�m^="�㵔7�Wb������/UCl4���,U��39�\��UiT�9\}���w%Ai:��y�ȵ�tܭy{���k4��Fr���կ�*`r0n�W�,�� +��v|�� p���5��!)�ެ_�(�c��թm����8iƑO�W!)�Z��cێ�"�Ηe+�ۈ����ʲI�nå�i��6V$JyW��Q\���aT��Bv|������W�L�2�'(��k#_{�ۆӒ��N��EM�a����U�!�<`������zZ��Èt�z��}:��ӻ{��2N�?�R�C�&u^;���:��#Ӎz ��~{�֙s������>�3f����X@��t:T�Io���۾��B�:��)"��M<�Lu��г�� y���^[y�,��u��g)�V�=\A���X ��KJ=�ض#�>�ڛ
i3�=oR^á�dl�z�2��}4�=�m:������m)�s�Q�t;���.��(^�^��x��~ۈ��9ú9)��ܛk�ԏ�n�P0I�Z�G�n���'6���E�d��6�Nқ��Rn��f��lV|�->Ufa$.kOe\@ -G��/϶�-۾�/��q��a։�/`<:��N��Bd�,�#'xr��v�+R$�Sw��M��f��[�l��{�l�X��� ;�Ŷ��yM����eU3������2l�����-�>�L2 @��1I)���ļT�n'L�#����-@n'LP`敍y8a��c���N�B&�p��GS�j+�L��o�|`��N���8��� �O���4�� �%�ˉ�d�:�����e9r����%I �W�٥W��{��s1��.
wTbP�4��^�x�ذ���e9 +G�7�8o�KB��t��^� +��=U ����Y�D[�����".s^Z�)��&��� �4r����S�0(�50�x�����&�6T0)o�6��J�lL�('F����0�% ﺝ0m�cu\��
���}Z��RU��n�(�Pb�!� ez��ү
����o��ڑN���+Ey�(��4+���2yxb~E���2�I����3�.�ٺ��f��S���s�.�3��SuV��g�gOOLɟ�!c�q������eC���\R�)�p�a�Ĕ����VM���o� +$Ϯ���g��H�(�� ?�ζ�D��:oL�F�@�Η����ñIb+�d�6�4M����
/M�E�+�P2
�R�AV�49�_\2�P���6Χ��ex��T7Cg�����Dɥ��siѦ +���z�>�&j�k�ҷϥY}�^���A +lWK��l3K)᩼yX�AA
a[Wv��ݎ�]��fTɱ���S� +�����6�S���/R¿cT���� �?�0h��p�j�4 �<L��Ǵ���r�L�����&��>M͂/��/�>3���ı, +9�< +v3���������}hw!\y;�y:R���p�i�w�G��-����FQ$>Ai���O;�f���|����8�������@i�y +�6���Qd���DZ�$]����w�']��Z�� + �ݟ��&��x�v~� q�(����/jE���SS���y��Qr�lx��}7.�?."R��7�Z�}��E�s�D}�i��I�҆�����@�`���?������w��7�ට�������93�t{��G�M���mO?q�J��=<�l����J<ۘ*�9$�:f����0��u�Y�N��2���O�+��H�u\^~�Ʀ��� +=����$� ��m�'<� +�} �כ�=��0�}}��?��)f����ҫ��zs���b���SWOOǿ��/�?�/l(�oc�˿9���$����B^}Y��+^_�:��k[��V�ԕ#x����ȶ��G�?{9~��Z����_�I0��u�d����K���r�\
Q�M����%vљ[������2�S�1� +1xe��V?à�4E�6�S9
pM�g���i·VPz����ո}�*Q����~��{5~��]��>����nj㯚E�7Z���y_(�gY�j۪��f+�}T$J,c���ۏo��ޛ
�<fan[�j����H�����#[מ�(m�=�~绷8J�F�2�P\7��(~!s�tЃi��o�QA�j��a.����/�c��M�c��x��uMzx�AJ�=�������q���օ(�-+<(�j��K�����r�Ȑn�;H�Z�.E�RБz�ہ����L�2�i +TR�͎%^����=����M]��oӷ�j���o U��.�7����e��樟ooTŀYl_���p��ܺ�6o&n��@nﶞB�r[���O�6аs�C�Z�i�������c��Wm6~��U���D���F��6[��=BhZ��=�՚^��vT��X�H�-������g٦�ZG�.-��u����3���
�,�Y����=��T�Dh�t�7��|V%��7�3����s��dK��Y�[�|�7+W�n��qq +�-�j�~0��>f{��ː���Y�e��=O�2��U�5��[�ɲu��͒l˹n'���X�d���U�1���a��2C/�T�e��bʝ�0@N�|l+1�4(�=�dj�z����u���i��%,����`�}�v{����߬�E���E�eU'�����]�:����#ܼBb��4WE��(�� k#���"#M��i�u)�v����BC/�.�F/�����O��e��P(�)#�pc�qAW���X��.��@�)%C!&�.,4@�X���@�֗���-��B�Zs`��x�i���/-�c%��g����e����m�L�l�Y���2��-�i��\�K�l�r/��*��y�^�f�(zx]�l�v�bwU�,��Р8�C+�x��cj∐�����J۪ +�u���h&5��ET�!��KT�,�~_O�\.��m5��1�ށ�Ah����c��m�tiH����/�z;;QKc�ۆN���^}@Q�/x�7
�vX˵)̄����GT��&Md��/��6��-���O'�}l0���n+��j�����mT5(�l����>�=�����m�ԗr��A z���8 Qu�5�8I�uP]�h����I��5_&H���k28�t���F��w[ �ro����H�*���1�;���L��o~Gci�n�#S����FdRK{352)_��2��Ůu�ys.�b�۱h��@�2*�%�џh�E �R ��y������T�ߨ��>����i:��@�n�!����͆d�7�!Tr�+ng!� ��/C!��1~��&�o��k�j>]��I��g���z�����8��
�Yѐ�,�H0�b��ϗ��O���?����Yv?Âm��|���4��R�z�=}��ˋ���G���OK����Z�%6=�{d,��_��~��(K �Ӟ�/��ӕ�Cǻʷ�$H�/����?x�4���r��4��i�nx켎��N[r�_�%�,O��|���,��Lt�o
��wNQN 4��,s���/�x�����ѯ�q((���S�6)���)#���o��ޗ�
��Zo����wn�b@���6�WgDy��X��p�=/�7�����e[S��`�ӭ���8��c�!�LjJ +��7MA��'K�( �ۉ�3���_1���
h�_2���) �:�Y����%,i��C�:O��q7D�/G]_N��b�=�@
$k5s��כ����"D"��ߌ�\E��K�� �/&���4�6��v�'��[��xf���c��䑊c��h�����s�i�2��JL��I:5�e9�9��K)��`�9�ˁ�S���vOj3����y�Ӱ1��Cx\�D��B����(� <��ޗ�����`z��b^���<���ʄ +LH� +����V4C�}H~�s��� +T��b���Od��[3�FՊ�+=D�Rי+�u3�Ϝ[)w�����@�3�x�8�JhL��-����hZ���G���(�uA)���� ����x��%�f� ��}ZQK�����ѹa�7
���Cjb.��u���v����4v���[����XVb��:�R��
X�|�� �8E�u�˅W�S͜��7��Mm�:����B(:�7��Rf�Y�Y�W�����G:�gx�sc�¢Y��@��v���M�}�*0^Fo +��#���܄zMъY���V!:{ +y��\N�z�{qQ�7�*=j7�*]�p?}�Ă�>���K�\j��*��h�@��>��7,��-��k� +.E�[�Afx^��n�����FVQ<��C"ּuH�3����뮟��/�V/'�Aպ��k o��P+�E(����x�x@�Y�jcI��qE�j +sٛۗ�^�$clvN#\̍�x�e�e�^KGf�s�V�P��1�Ğ�N����vj���"&X:�8=&��4T��!대��WBD_V +��� N(��3�\C��@���Sy.�J���6�\Z��\{��
�I=D�+��Vc�#7�`�
6g���\�Ո*+�~#���}E&tD�I�K�R�E(���������k��M�帿�ܔ�q�Ɋ9c<��Z���C��������E���4{���\��������K�=�q�C����_2'�=����w�w����f��撾����y�)^��9�\*z�h5��{v�:�U�'`c{EHG�Ӈm�lN\�b۩��@k��8�=��t�석�S�Ԩn����B�om��B%�e�uZ��S
e�-�����1��<�@�a�K`H�%dD��$՝�ev�`]|3�,``��;���w+�(�*s�{����- �e�������p����V�
��*{�D�`���KL634`��έ�}@���0,�ei�c�Y��mmY�.��":����3�w97�<��ˆL�8�r}2��2��x��9jN5-H���Ngv��o��������V��{�# `�%�@Ǽ^V{ 9I�+�A|u˚BG�NX�/�Q��iM}Lz
�sЀ"9�{b��M�`��� +B&��{ዠ��o"�9z�ɒ��}�!�H1��oq1�O�c�F]�
D_��K��}6\$RgC�C�-a*>I���h�86|Ɵc�y��ϲR��6��i�cTPqtaij�I�����#���z���k�VR���s�a=?��C��ʤ%����8�L\{47T��6��^q�j��}�h������ +BZB��6�3��6tB(�qj�_J���ϑG�/�B��'e����~5~�+�ե��������L�%N���g��l���fHtng���[�̙�6h>��8ה)3��a�'ё0��#z��!'�Lu����ѷ��)��';���f[��4�� �uTʪL +&�E���"�1@��Y�s'8˹�B䮴�jk_]�%W_6J����
I��RZ�,u�B&9�V��5Wp9K�[[�[��Z�F�V +3�
z�O�PB�<�k�2]��݁���Ɍ��\ � 3f�"�����y>�pc'O�j��%�`�E6��!h�2&Q�&�u��fv"��b�;����ח]�*����\�H����h���Ei6�� +%�MGZ��`�v�� +��bF�y~��{p:��И7t�C��#���+���,�<h�2�W!
��5�*,�0K�=�1�qQF�$ ��K����>o^��Lj��Ql�"�
�� Z�+�P��G�;6{ +�^C�1�9�+�lIoy +4F����D�b����e ���=;~[�p�p��5�Wa�Bqr�d����
�(�0�]e/~�1vm�^�젅@�'����U�� G�8f� +bP~��l�hґ �Z#;[�͊�pm/,:%��f'4h�5H�͋G,NC:��l�؇�(5ۙ���F�h�� +�Bj� ���hP��3�N +�d�M#/P�\�p7�D�H�q�F+4�|
��g��Jyk�����52��=��c� +�{�n��=�qXF�$���_����q[V�(�Ʀ��@��e}�CUz �=Pi�tSAfɴ���]Mz��T4��=ۻ�v�MM|)i`�����X�XIc9��!r��;I�ٱ����\���Rf�W�� +�"�+�M�M +H�m�'�)�5�mZ�͇9LېM���ǖ"8t8Ϥ ]V+��NW� F�.�-���e�s���"���� +��=�R�V%
5#uAj|@%Rk.��#:��ǣG��5�r����1RR���6����T�>t��6��qL�5�����?P�`[��S�wҔ�����~PͰ��-]%x��LQ.��-�]�UBҘ��q*SE�I�&��� +q +"p ��Sh��[�9�@l45�/�d�1i7���B��j�x(���X�i^��Q7�J�@=PGw+ԃ���S?{�E�'B����������㡕͉s��c�{G-h�E2;9�ʹL�@į���F����;U�;[ �!'F.@Ls%�Rζ�m&3y�o�x�&��T5-V/�p#��l���y�� +m�� +B�n/�\�qgXS��p�ҁ���܄�[������4{��|?�M0"�q��^��F�� 抌�8��������{�����^� +l�d#���p�'�>�ܶ�C-��S� ��"=ܨ5��y�haJ/ҕ�Ebd�>�A5{�t��C.��r�u�dp뛨�����:�Q����.��� +���3�@��� pa����3�a�.@$���{�.�0N
�{W6�Q�:4{�B�8Gy��d��&.�� +-g{B���HkK�i&-Ez�\%@�O9��G�Ӥ�}�5��> +�{�I��PoXC_��`��Ά����\k�+5-���P��Zg�K + ��\���P�V9(���r��t +��%�X*����Gp�(,�%�Ue?�����H[�����z㛓٫�R߇�f�4zQ�B��K�[�'�b9E��``H���T��1��oA��ĵU+���^�#E�k]1��+V���;+ͤ�����r @4��m�;���a")��+2�M�K����0��p�
% +�������#D��5%)�� Qd���T���dg�D֔��A����W(��-�fF���S~U/A��B!�P+�!b{=��t����2I�C�"�3���Myo�cC!���)_�HMÔY�:�v�bQ�e�ኆ��5e`�'��z���*X��R��]��ѫz�9rs�F��٣�%����F��B���,�5��r�i
-|�0�����J֑�}h���������j�R�A��+Q� +��fsii����1v)\��
�'ÿ�^KSD'g�,��p�D%�CP� A���:"DR�o`g{Q�u��Jzj*�9]05���ԃ�
i����.�2���"�|\ +�x�=�1F�_���C�v��<OL�@�E�o����(�|��0��P��_�Նu �T�/D����#�/""j�z����]��%���cZ�� $e�I/�}�h`�����+�o��hēS� +���1�m� +2�Oz�@b����}K� ��G>�c���Rhd-g�T��'��j�m$�+9�/�SH_�W9���T +2�� �/`�0���@x�TJx��g�T�H/Ϡ�L���C4�}V���0 $$���kX0\�,��ZX�W��k���%I!@���L���wE��HP\η>��L����K�٫uv��5��x|����B�0���5�Nޏ[��4`BDIL�9^��0��t +?dd�4���d�|����n:�DtN߱q�-�G��ZN)H�Tk�)� �W�0�4����J�U*�f�Z���Mֱ8�s�Vu5O�5����-���Dzᣌ���(v�P��9�)����T�6�T�x.'��/-/ +z��Wi+�&����#�# m��Q�2�� �� ����S�8=���b����8�m�3@r�^�ŝ�����]�=��䒣��$�:�Q��@^�0��14�~��]ԃD�i�l]�%�'U`0�I��,#�;�uG<Y����b���1rGV������ЦK�`g����ðmI�|���8��@y�i��^釸F�+�[�Y��j��I��4u��CM
���V�9�%SVIF{�5da U@��=�W��=�4��Rr��]�jg�X�`x�Q�)8��
�o�y���[=$Ezy#�|��X�GO��*��b��:y�&.X,V:���ځ&���54H~����T������2<b��)�wП���0v4.�Μ�CJբ����%hj�Gk<8��,�K+T��F���P��۽&���'��YfL�\������|�P�m��ӠJ�R�sUd�5CЋ� �D=�}�Wn���S+��m +���sG2��F�/�N}�{R[�k=0rƕ,'䏽��f�ʆr�+��5�ʬ����yZ�V�=�dP5���M���V��+ �tȧ��:�hY��&���}W��O`�jh�3ﭜϘfD�A��Q/����5�%�G�u�� +�4`ӝ�q^�r"�pO�)w ع�&�3`�f�u�C�Z�t�7�k���>=�r%���w| +>����
� �ԡ�3˭�l7I�|�m +���JT� )� )F�^d��EI�RU��=b�9_��EJ#�C1#���E�z��ө����q�B�(H��s9ԢMΔ(%7�n�z�F�+�qbr��6b�M�λ0�� �!�܊������@�ɍ�T:�/M +r�a5qQ�9�����!J�)�7ԫH���w���Se{�\���g*gI�ᠺ�K��`������f��(��MH�����~��KT��*�
e~�� ���ı���F�Ӕ@ �!��B�g�^�����&� +�ux�5x� EZ� �x�Y�#��4�����!A�,�#��
�|�"�u����5n��#7JA�U}����r)��^�[xb�U=1�3e�� +��O�J���C�D��A
����B�G�8��Z����;0�J(��N5䝖�9b��-�'n;�Jj���#
�^Fw"�ʾ^%S�s���X)H�W=lTS[D�9Pt2 D2�C�a"јiK&Fg`])qLKV���a�!%��u� ��l�){$�9���.`�1��b�� sߥPx!(��=��ٗ#*`��זej��1�����&0Շ�"PA:ɘO�j�g�T��ϱ%�B��S����Eے���װc#�PΌ����S�dlb���|����?eV�&������N��ƣ�C̽S��#(���F7�Y��y�Q�3�b��e�=��{����(���0JmQ9�+���_\��,U�k��Z���pt�w���2�l�#N��N�XPcՄ�7��2���.N�� +���>�@�1U�X��f�a9a(�@>�p ���w^o���D�&b�p�2�ɋ.��q�c&��ˢ����kZ)�IN���V��#�M��u��U7�(XÅ�#����N��тH~�D�{R�r�2֠�g�hj�կd��(q��<!P��] +8�!7�{
4|�>P�1�@�N1:�m6���U�[2=닿�����c�)s!ș�(r�w�� +4�ye����Mr�j5�@������q�h�cP��/�P�j(��!C.SI��*\��d �4o��e.�Pس��W,�݆�ɘ���%���V�=���e�p���n��W���g"��2+�p9j��\����e�D!�i�5�Ӟ�V��P#z J�T��-��5�vE4L�ft{V����,cn�w��E��*��6��l9#��SS�h9��$�V�X��C�\��b)� �۪��`�Y[��/Yu �9���YA�\��n��b�'�j�I �h/�i�/6D�@iJC@%Z��=��Vĉæ���K?�{��CWC�`�
� +�x��ط��h^w�C��e�
[=�
� +ɏW)�Y��MD�R�yD$Ujs��n�$y�.f߱Y��/f�&`x��q-�d����ӫ�������|s��M��`\ �u
�+�P�{�'<T])&����m���g?�ҭ8r� +�L���"�ќ
�mا�Em�=�NF�I +w�(!�Mj�챙��}�ǜ�c-���~�S�X��@ܯ�r�N�9f�;�ЃP�F/����[v�Hlzmj܉`v��<´B��'�Tdz s�{�b/�K�~'�q����w��sT!�]�O���L���~2����#��eȓ ��v"��K��b�^��LO�F(w��FH-T�ԋ<$�F�ĽĴ������\�Pn�)�e�}�SjX����2�|����(�)�F�'�����`�2�B�{ /�&O��*k\6c��ͻ-�R�p�a��+6���K�*l�IQ�\�"���2�B����SV�^�b��i��(��aϳ%� +M\V�)!d���!��B'h��|���ԍ���(B +,�M�Qִ�*R4��!M,���K ����x
!���rH<$@� H��� �L�i��"S4z�c9�)�;��{ړ���]\�0?�]�)�%{��}ZI�a������9w@����j��잤�"��v�*��
X�l�[�B}�!֦^���uG��T7�7h�ޙ�%ǜ�2�n ���QW7��)�7�Ȏ,�����5��mpa\������~EOx�z���OM1g�fFL�]��b$���d��`��ث�N�[�|�[����3LA�5���P��k�cdh����� ��S�D�ʂ��6L]P��Gp����rZu�"9@��^M
� ���A�!�������Wu�u���1�E���PI���7"� H�������<����I����L�4/kU!Dyк�� +�e�_��i�Z���0�{ +�;k�A��j��e��_��)��� �'�E�\3��P��3�q7�B��zJ�o4K[k)hk������3$':o���I�Q��(��!������r\�!:!����L�[���1��^����x\1@ ��� +�M!��"�(c�T�|�˱�����H����{#��K�=����?�C���z~I�%Y��yf����+K�<l��y�C< ���Z��쁎M+oL�j�FSWU~�!+]��.T��r�Z������a������Շ�J���7�9�+�A-Rry�f4�?!R)���S�:�����c'���"fllx�mB����b�!��ب����É�e4("rR��t�.D1r�G}�$?�_���u�Yg��K�H�:sS��I�p�f�B���V���҄�5�[�e!d�^L1`6�^J�̛,n-��>��.�=�X�=e10&Rg���>b��-�-��`|�;��`>�4�0V�IA(K���H�ݣ+1�iڥ��WW�<!�ٚ�g��Nc��ȋh\ţG�~z¢ +��;�lb���Z���[x^<���r�&;�%?Q�iQ�+
&���4�cCd�Q�s�D���e%����F����xB�"z��g,��2.<���<��,��͌*�l%"�xJM�����@0A�����x�UmU���-F��_u�'����zh��=�ٜ��V�+_�IʵKyUu��;Y�����*�����K�� +�Ȃᓜ��Х]6GHA��'���.��3"�Z�����~��7S\�fKABY��\�D��Z.�W��pc��uxv/�?���J&(�~B�d�xBa�Bv,Qo����K��ДS�y�rj a��ޫR��߱����pY)��kI�̤���Y6����}TF���xb�!�*2�ة-�%/#�%0�"�\ +���No��lI��S����^Ǚ�S�bU)��K��6m��s��������$�Lz���3u4�-�;�e`Y%�� ڴA5�M��b��Ykࢇ���������J�
Q�$ܝgHC� - +Fc���s�)eU�������*U��oU��F�+z9��I?t�z�0dl�&���ti�;H#ּ�9J� �X�����#xRQ�sLA�/�����XݭX]�WFm��2r��EG���p�?^�f,�4�sK@���O��'u��2\�дpT/]���[}���7�,����'���?�����?�����_����������|������������n�����~��W���w�����������o~������O~�y����w��G%�_�5�����c���hH��1v�� +υ��2���)�?(��(�7!���
<���'r��ɴr�+,�P�a.�e�.��;�.>�y +��+I�b˩���;B����}Jh;O�/����i~�e�RBd��r������R8cHA��=�X�$����4�Y\L�>�����(�"�D�������7y+.mT��>,Hނ<$#�j<I��t�VDR��B2!H�s��}Za����)0� +i5�K�W��f���Fq�>��u{��"eɷp`�a��%Ɯ����AO�����D�7=X�&�������n��$�O.qb{����D���
�iR�oR�l6��Cկ��@YU��.`Qd6��`�{�e�""�R�>�A�����i�W�����sX���Am2^D��!9jr���Z�@&�QH���x|`�7�%�_���J��x<X4��GI�q���"=[���tID$�p�h��Ì�-�x���C7�eI +hF��u�x(c��Ż,������ы���qy�h +.��G�Q���SC�� +ѫ��!�d��P�����PfD����2Ӎ��WUЈ�w[�H8K�{h���zH��#0���'V%���s_��D���n����Q���|����?��$D ��*#�U��.��.yr�(��m�Ⱥ�ּ��qmv����U�~W��Mfd)~�u�[�%���g��gK +��T��ct9�����\\�"�$������H���"�=�l�RW�|���9iŃS���]���
l�������B�*.=R�|>�U=h\���<������pᤗL��xt!\��>G�F$� H/��$b5���1�h�3��O�v�~?`��C�o�9K7-,K"�����j5w�]�)�r�# +d��] ���n*T_�:J���e)C�I��[��uŅ�e��Z5����KZ�"���@R]�ZV��w��{N +�v�9�����ٛ+�?M��)��d��D�_u�O��瑒���90{�q���8v_��m���#Dd��Ӥf�"��qdT�P���v\��u�d������4�����|*b��/K����=��O�7��69X7+�����!m)��M0���%�)�$Ԭ����~��xuٮP��O���z�� ���~�c�"�8h�;��� ���Y%l&�����f;G��6lI{~�hb���
��iy��Cu��K�ۖ"`���{u
�c��:6�|���*PK!����tʧ�
!����2��O�&t�U����wa��7C����ߣ�n
&Q����U���a�����*3w$W߯X���l����mA +�i�;��=&���Ga�����ށRµ%�܊�%��ރf��Gjǯ�5�} ��Xa�@v��uS �+ᐰ��1PWy��-�_�C}7t�`�TdҘ�n�6#-��#*2�^Z�=ql�ȿ����i��3�������砺L�!�OfA +���͍�M-8Ő��Kƍ�)��I�;J��Α���}��\��.=]տ��E�~+4�P���KU�Wmpq�KA�J���D����'C�u8�6�
�^J�'Vq}b�H0RVX�GJ���y��� +{L-,�;�B������/;@�=W3�^R�MK���y1M�����צ*�
��ۏgG�o�T�/9�l�F�N�R�����E���]�R����W��W +y�u�^�覙�� .�p�0ir�0�d���UzQ���`�(l������Y; ��1x�#p63Y����4�����]0ʤ��n��Id̃+2�3ҟ���)����*�e~j������6�꯳k��)?�s��3�I��k2�ih{�5~�'�Z����;F���#��Ě:����/���ɭ����2Ї�k�A +~)�>�Ct<8��
j��ΰ���(�H*ֶv����͎�v�P��$���G���.d~UW�K��c� +�|?��� +oHDi��Q`)Y_awx���upKT�ff�����>"��>B5�8�Ԝ.�ݗ�F�c��Q>`EjR; ��B� +)����ͬ`MA5�}8=�� ��
[/4�`��C�*�)��_�K)ч +�E��1�_
�:�P�v�:k;W�/�$M�;���~ZF��"�E
�K嶄��5��;�va���CTn�5W��X�A���]
�m�$���h���v����� �95B�@�\"�p�m��{�l��dEA�{��0-%C6��G�w��ĞՕ؏��:\-�Q�!�P����~`�x��6�<�QRa��D��6A�η���gZ��$x��0Ym]��>p� :��X2X�+y5*U��ռb��9Ic���R
��B�&�'�Qtb�Tj{PQi��0� C�H]I�+��Ps�=�� ˫!VY���b����y˓{�\����7�Ce )!9��P���?����ڟ�����&�����ܾ��v4&i���.&'aY5�*,�o���2��c��B��C�,�ޛ_����ғ<Òk���\����хԀّV +5��W����⒢��}�E�;S�r�,1�e�fY^�P��-��cO +�=��S9S�T��=�"��~�K=������ĢH稙��OH0ו���nվ����Sw�w�*)�A��ݡ7߉T A�ۉj��@)x���\mY�7�z�Pm����#��G8W��!֓Q���b���^]��>�L]�r�~�ʕ�P� �M�܄eSU=���C�k����C�{�oT�\J��%U�(��d!��aIn;W/9�(����W�{�K��<�Cn��I��ծl�1"��S�ڥ��1ΰ/+g銒 AvڼdyU�VR�"�e��wݓy5ґh�@H�AtH*a
rՓ74CױR �:
#�^A�aF�Q Ry�zX�û��b� +��<��R�8�$�z EL��B�F�Rq��ԞrB�|���B牔���X�l�W��,����f1A+V�Ӧu?�[<>��h;�x������!�# �#�\W(C0Kþ#��sY�S�p@�hc��"�/P��۪8�.;���)�&W\��C��E�(l�%�9���� +�*�sEK�V���3�Q�).I/i�� +�� +�̻t}��7���� +����8A`�b0�G`K�/R1�)�w����\��S�y>�K� +�bwd��~k����[����� �P�q�Vy�A���t��1�$D����H�����R}P +X�ͣ�JF���������e���<w�Y< �k�g��T_���G���b{|L�����_�"ֺTFJ�yk��LU���̔痱�#� +�ʉ.1���&�t �'L��ɴ�-�Et�y/$�Y@�`k?�R=���T~�( ,����TmѪ��ʯ��F��{Ԭ�k&��5�T~���+��*$u�pqX+|G�-�C���Y��"G3w�����/�_�d�!����/P��Ʉr���9���m'�2G�� +���B����)�1�aj��^($ ��!@�*�%(O�G�W��FL���[���R���M-;�=�J�T��D2zh,|y� +/P��+Hx!v`�^cAЀ%P�[#Ģ��g
36:�S9Fpa�������7�Xo��' +��l�O͌(�e +R�i�/���}�R��� ��fA噀.�sD��X0��(�&u��ґw��Mh�b�,��F̻��y��F�s���4A�:ɥ�1�GJC�6{��2�ʜ!�Ez +���^�t|v%u����gK*k�8��#s
t�t]� +R�l�䰊��
�_�CV8�Cᤴ�:�h%q�u?��__0CQZ$M�wV�?����љւE��{ї����n@�ޥy�b݈�.rD�Pc3�m�wܢf�T>A��)��dk0�/�G{2�9W��ܷ&��n= +��Z��h�T"ہL���Os�z���q�e_Y�/ *��ɰ-�GPQ�wݾ;9��HĪ7�����X9��Dj�����Ք훹�2̓���¨I\���sl<.Y�,���w"{��ΗS�� +��ؿ\��/�r�]���X�R�Oj��d�:�4���*�pxu��}TQ�Ϣ@א�\�-G��^�b��C��XBô8�L���) �;�(�,�\5вw!�`�������o�^��i���,u(��e�B���+�Z�Ԃ�'��"��Ԙ�d������� n� �g$̂��ȄD�P;�1���7-�RJ +xm�sG"�IC%�������v7-E����d��ဧd$���ʟ�O�|e�H��%(���g��9"�;�A}�$���f���;dogDo�"{��ߐ$� +T
�Lq�?D��G६(�#���%}�î����_�UF=���jo�����?�K#�kELl�L�@>T��@�#� +1�{�Ű{�I��|ҫ�1͆U��ңJ0j�Σ� +)A���&Uv4�;�+�I�2��\a��9����N|��q�������
�I@�de]�y]VnWI��
��'�� �^�쾉����gt��fDZ����)Vċ!L�����wz�ln +[������gѐ����T ���Q�Af�@���I(�E��_����+,9=q��3�K�87�z�U_C1א�%9�i��ʁ�X�����+��/�2뼔�'�c����O�]�����xŘ����M�����,�*�)t�q�V� +�ȝ�YRl�4w�4�%������y�SG%�����uz��+߁҆W'1q>n��\Q���aر�����'E�8◙�����,�G2=x���5���C�"�����`�_��qeD~IK����"��fm)��'������5�}�n�'�5kl#e^�t��ˏ�J0�e�bŧG<�����.F�8��(]�!3���u��<�������y��F
U��g�.�FN +�@�V�빃�.�<y��Gg�D�@�N-h�;pv��"�G�Aucf�6����/���IQ�VqC��$7Zc������YEw$�,c4�]��>+�H({��T�;��f�$[P����i/�����]�&�$U��eU���-#�c���������J'v�@T���2��XPviQ4z��&=�B}�� ʋ�QM-�I���l?�$����A�.�C�{T>�85^� +!��]Ԁ�!K�n1%���>?�^��.�O��������4ChcƙtOaYÁ�ɦ����6e��t����,S.������%B�d剅�a�p�~$�,ݻd�f�"a�GIP���"�w���-< +�V��������k/�MKB��N@"�s:T}�ܕ�L�S��-�faG~�IG�l�8�д��$yi~�~�r +��ݓV�N6c�{�om~��ا�z�X��f����?��d��T&�/R���.��b_������%~5EZ�`FSU��b���p;'q(u��ɲ,�~���TTo��2��MA��-$��D�rX{��,���\Ҝ8-9�}%l��Cf�ڙ�������%}��z�8:OboG$2 +���ET^�W?�������юs]�g����'P~�0q�o��a��Gꦀ�l��RA���3`�IV�|��F�p����,�N�<��J��!Hs�hN�DjͰ�R�������Wj��:cJE�yH��t�$��Ԋ�"?ïMe�~����3��L�b����PM{� +�E��]<5��R���幈Z�S��Q�ՖwJ��Xs����Иe|�[��cI(�X��t���J5�'C��A���fPP�[l,�3�������a,�C� +�]+n�ah�����2�A8t$[�en�2���BK%.kg�(�PI�Ӂ�n�����*���_��x�Eұ����W� �)���?uɶ��CZ�d��J��u|^(8�fQ��wG�O����%bR� 2Q��e'�4��)�Chv�,�ě�/�C�( �C��
mb�p�� �@�"��~J%�EM�Hc��t��K��Tx��hx�N�`d���C� +�Hpٽ� Q�W��`Kع~¥ƾj�!=�f�Z�DK�O��L�Y�88n�����t��qZ��9�m�-k�n��j^%L_��vH)�R��v�$~_ʗ ׀ޖ��T���@������KL_ho�/��<�%�XE�>����f�埭����[�M)b�]LnC�@���7��"�A��dž�bqX�jv|[�����'6����i�1"�q�v��Q��K��+2˦�� +BV� +4� +�+�f]�uײ�c �,�"tP�YM��]�Yʬ�n@y_:p�h��{]�1�J��`cC!�ֽ���+J��5��ʒ��{���6��2�@�+��`F�;��x@ۙ+6"�!U���@��e�Բ��dw� +.;m^��K�:��V�Je�v����|8�{������iA�=�_��̣jx�D�,j�)��[�K�eI��G67L-L�3����n�ޑ�B���r`���&����SRW>`��bnb'�ThZ�q:c���J])(�-��P���tIq�n_�Ot:�D��X��)p�ML�F�83�i����V�����j�(�oj�}�"��qB�L����"�6(+�)V�.aD�W(��h�^�T��I�B����J�ډO�~���b��cn��g�#ܔrhT��~�]��j���|��A��(�����{��ڭ��
#��Nb� +��=�G�}�:�bEWa���"��n#2�+������5x!Kx��f�s?�r�9#:��ň��*�B�ʴ~0�Y�����wl�az�x �d��<f���[�k9YV�!����F� �8�n��q��:��@B���o�g�wT/o�v��sAK���ʣ��*mH�& �T�>���/�F�R�|�0bH�{:W�����ߵ�ry���9��S"s�%��/���:()��u�K��*d����t�g���-�W&��=�W�`�}̭�r� �ܦҥ�|�
� �8J��( ̏�$R +$u,u���^�]yB�}j�B(���b�!�Tn[}
���x����B�z5�zX�.ϸ*� +C�N�őudY~"�A[]�i�Gد�s���:Dwأ&[e�Ͷ@���|=��>���h�<;8^��W���0] +���wG����J?���u�Bq�ʛ~pR� +�2��ʖ?O��+��h\�I���iΩ�|D��4�q���
ĝ�z�� ��E���n.��� F����ˢq�8����X7y_���Q<�s�<����r��K�� +�9x��n]��snO�~�lܘ����+]d��:��ţ 77O4����tg[���Sb:�I�B
*���h쯓��|er>x��^x��b�+U��9�+=�#�-�uij^� +NPO�5Ϗ�w'xyi���bYqiT�U�N�SW���
�[6^�> k|n�c�����w�^�A=;�~�f��<���8�Wk��'�1�{`j���q����ĸ���rN %�K��g�h�1C +��ୌ���6�W˵ +Hٯ�UO���*��P\����A�1&��12�\3�H=��X�8i���+x��)�ΉF���E[��#���*���M&���'8s��Ł3��h����( _���7�`�+�3���L7��6�s���>s\�?�)�z�Xqa��~W]��^�}�b��m6_m�{%q�8��C��Wϛw(���;�_�w��!�T4����k�F�ع�z7��ts�yi� ��U�|����|��^_���1�c�8���|e�������������������7�9��y�L%��zs#�'qS�4�"���2v���(�_ +��ԝ�<�'ڮ�◰�;F8��"��x�H�D#��hl���2c��Ѳo�h�Dc�o�b�fS�������k����z���ij�'��#�P_�~�-� j)�Y{�Uc���_�?.9�5�]��9pz/�aM4fј��>�l'���Y�ZN�Wl n9�Tp�Ƿ
&k�jm���B�����9mnb�cl7��;U��F����9��|���Ph�uA#)ϙ�J����?gs=ƹ�v��D��}��'%����WnV��$�[h9.�7K�73iO�+4��W��+��rN�GN������Hŧ%�z\ֽ�����\�g� �>��}D�J!�oa�Bܾ�e�Eh^� ���y�)�϶��ʟ�K�����cȠdg}�|�%ϔ�Z����(4���휠?D�d<Y��=3/me�5��1Op]��P��};oq��� ���0@�[��|��nأ}�]���<�kp8�G3��9s��𠰗��eVB-'0X9f�hJ'J[+��W�p~q���LjB#:�o d�9m��[�G�s'����H:����殤#��ļ6���!w�'x��bC�qEn�� +� X���W�K(������m4�%'�x6�tQ>���PN^��s���;>�2N���$˒���[���"ª� +p�=�k���}�+����ɸ|\�@z�y��ظ���g��A���)9�a��;�)ۻ���:�2�=�zy�DL�]2���,��v��O�(R��;����A��:Cɷ6��X4^��H_���2��|</�.<�`d��x��p����e�%����,�a��cw�Xi��<�c��E�U�柟/=�L*��3֜=��S�z<�ˆ372��� +"�w�*���i�i��V�k.0������x�^i�y�ȭ<�J�!=)|J6u�ySWɇ"c^7>-?+<�IW � ֿ� �ude��w��]��q[/й�����fc;1o}�v6�%�>�6��9��dN(�<���V��{'n�7��{?�g��s�ԅ�G�E˷�<���$���f�G�g��3���}�Ŵg��@��9끷����w����q�s2���0��%�{�w ެZ�b0��� +E��!jYES�̩2��}��|���F<k��ԩ>v����L��4���=���b��
�:��Hr���n���<��]½��+u������/��Z����S���0YF������Z����DQ�$i��8�MM�jq_�Q��}�QO�3S�������O ߍ����Q��B������30��\R�� �n�(2��3�W9�\�!��ٕ-͑'�'F��z]���}���9^տ��SA�6'��"#������|�2EĉM�� �Oj'g��E*S�/A����K�$� s-�u]�g�A3O\�I��ch�Hz���W�c�@�X,,�u?_�1\jL� ��+���I��뙪{}q%ڕt�u�2�� d}�ؕ�29���ۙ���E=\{բ���m��mf���X=���AC�_�j�G�����^W�~r�'��/F=MO��Ly�b��1�Ȭ�+�s�kM*�C�aO�姜��p9�}��(g��5����W�R͚+�Y6�5�n��q"�Q�Q �x61������Ո|JN�=�*� +}y��·��8A�
�+
P܋�E����Πo=�_ש-�@ +��ٶ��g����˙� ���IS�,9U�����;(O��k�YN�<�kN�L�a>)�2�w,lA9ܘ;���1NPj\��s�'�������fAc�s̼��H��u��h�M:��9o��L)A=.�_�g}�����s�I��m3�K�$�lL���SB�������i<�2=�|��&��~>�|6�T��I_˾9U3��D3��x��w��B��A��8��T!c�8�H����rYgx���'ȒCw�hl9�f��kJn�+?����8T�!�dt��G�'xm�LJ߄�u�n���5+�$I��.!� JN�|s�إ;��'י<"���,d���*�<��V�c����~�P�sS�5���m�����,o�_��[�y,�0�knN�_g�>�?n��w��ו��dW�����䥮��@�IY=SW��*���~��V3�U�*��V� ^�~�2����E.'�*]�#V+N0���F6gV�&�g �Ȱ��d����]\�t���N%#2Κ���J~�I����� +��/�b�H�렽ƻhH�o����
��'�ȓ����H�}�}Mۜą�F`���r��R�dJ4�b�CWT�8���n|��������Yp�vE/���p,� ���GC��u͚[��Y���я�9U�צ�y�]O�Q��Pߣ���,_29I�9=i�N��k���Npb�e�r"���^'����Z/�vئ�� Q���, +\��g����'H(��t�'�y��o +����/�z�_ +A{�L��X�Q'xr����^� +���~��W�f*O�z@f�ߧ�� +O� ��I���H�������_7��p��Z�p�Z���h)���G_�JW7��NЫfd�~:8;�X�;��L4d2�+� +L��K�^���_�V�P�L�;�XU$Fը)������bս�4M�=8�D|��X�K*vfP���<x�6 +�?`2�N2a',\+��PNK#�2Վ>�(��
J&�0cUQdkZD�������b��*�f����PPG���G |�j���QT��i5U�L��#`H�h�BBx*�2�x_��}���ʄ���#U��23��o� �/�w"/f&�%�sՍ�YCxS5�8�F(Xg*�KU6�����(l�õTTW��.� ��n6|�@M��2�vB���TL��Q4zv +�T�W��9a&��b�h(� +3��&S��/��㭎��Û�7��5$Df��Vi FJeB��蘚è�5�jd�-��Jn����Q��FFRM���E]Z +e�x U9�
��J +h�'�����P��UɍL��j,rtu5H�kh F��
5�h5�D�苾T�%-S�3S��5k��`5�ve*m�I�l����R���9I�w�v3hоf�q�/���]��T��`W���y��MՁ�p�L�P_k*b�G�a]8�A��Z6i�z�&����Q���o&�̔ �%U�FPGI�Q�o ʽ�p/!�/S���5�L��T(���' e�*2��T��2�S����~�Ѓ�$Tc\B�i +EhJ�! +�,�[�+�z.�*k[�Ru�ؾ-̭��>��T:a�+��Y���p�H�d� +F}K-��? +�jjbҗo�~�����0R�\��H� +)��@ß;Дǀfqqj�e :�T[̠Q8}@]P[���M��k���MRoi� n��X�P*Ə���N���D�k
� +��܁���N-y��{+�5y��bۯn4�E�ɮ� +<�";U�.����'U���E�6�U�v���ڤ9鏵܄��,Z5xZLф��XP���X��RG��j��*�U,U�o&$�����j���N����D|CaC������D���n���\���P�P�al"f5��RO���}��Q�2SUV��H'�:�����kՇb�u������ ��}�\������cm��]5� +%�!���j�����%��m��i ͌��Lj���P���<�PL,Kg ���u�P�M���j�T�-ƍ�`˄z
&}�c�����4����z�9�꼘܉�!VB0R��F&��S��s7���Ƶ��?74I�x���X�J<l�/�j��26��X��R�"�¥��S"eBm(�'�.e��K��n-��*�����p��jŋG���'䙊�S]�,�����~`M�(�@?Y���������'6T� +n�̌L����-U-r#���%4��@1���RM +�:e_+�/���~��T��*�g,�%U����'��Z4+� +���M'��4�X Ӽ��X![�*�-T��D�1�����l��� N\UR88L��M�����p��p.������So��[�v��%���/u�T&�� u R����)�A�?Bd���X�p����Z��^��F��������͚�o�0!3Ds)N!�����@+���͛�G��m��
��k�W��Z�:�{�W:��y��y�������Q����p�{"�@o����n�������?��/�)D�@_o����9��-613u�^�T�D^�TΨ +�C�c�±�K�@+�[���G���JG��g�+&q��_0aYcؐ�QxLb +'2q_P�Y#)Ǡ��_��7n(�a�M�vZ����%�eA9!Y�$V��,���m��$�c��]A{jY*��nb%��9���r�%��e�zi���hLѿ7YҒ5�7I,m��S��
$�R+��˷��Z3�Zr�~���]�Z�e��FbùkQy�����73���,$���8ڇ�g�sGЁ��(��r�Gˊ�ԲRjo@�mXe!�T�!9��ϡ`ܴll�uH�W�t�Ϲ�
�b��A�#mc +A榳���ir�����Ђ�\t�d>�Q��)�̇�E�<����̇e���=Cn!����/��Nf="�1S��sfl� #>&w\C#١�Cў�9���ĺ|J����po�y��IJ��a��>4k,�=��$W8���� +G_]��U��u�&�u/$���)�$3���S���IL`�p�9����\\�d>�~�;��L����#2��#A� o��O��IΆ"�NŇN�3�,ds.�C��3^1C(��� �\B�4.�n��2�Km�Å��gRG2�ICA6����lJ�t�S���7T��tL�D6(g4�8ԆGs��r�Fπ�9�a��<�����'����S^a�����||�t:(m$�2�
��"��y#�<uXgO]:�a2�8Ēq�Z���ȵk�7>Xǚ�Ֆ3h.u�ckm��H�l�$Vr�~r��6�1�p +Akޡ��B)�f�nZ��:�c� +���|p�.0m�7�����s�;d�Io���w6��c6�5.��=kR����%|���\l
Z�S� �_�{yGf�b�2q�S�$�ҫlj�L�s��<��)��D��}S��~IC)Ϙ����ت)l|�T6�h]8�
J�F� +�E��<��_�l��w̤Ӑ}G����p
��p���M��N�]���N�������9���ӆ�>éȢqZ\r���o�pЩ�;��� �L�m��&� +�,��۾����Y#[n�������V���5�_r}l��ꯋ�)؏����+2���WL��yt@�2�y�X:�c�{�&m�l*��B:�}]9��.�@E���R��_�����D�d�;��ZR��zj�Ƀ��1�_�0�kXk��`R�!'S"��1 +���X_��d�c�0yc�����{V`��>�D4���{_)j{�& +N,b�맂|b�ܨ:p5�!��'��٭ ������Gxv`~�
|L������Ⱦ0Ⱦ�Ƙ�2<]48,�p�CC��g<o��������a�{�]D�d���C��XS�����l�]�7�l�-35������&r���M9������Ä�e��Ϡ��a;g�C:��:�q�{��)h�g����H!{G�9"�W���I�e�~���ڂ� �dž��}J#K�!l�ցSX�c��=$�t@�H��'g6(k��q®�� +�k#�ԟDؔ�ʇ l�3�E�1������g#�^<�Zd��}���=����Ekn]pt)��5�A�=裢sFT�����'V��ǫ��������)7�!�Q!y���#�����5�1�鉮] ~!���k� +qK[���O�#N��A�Q�Hv�"�#y��n�#�c��,Z� ���a��t�C:���;�������a\`�h� +�ߨǃ�[�=)�j��M�b�>��Cx y��H�@�-�:�X�e,�멣���il���l�y����L�k���!�7�G�� .�p����_���%����!Y��� �̧V�`3[璥�eĶ'����+��_� ������Μ�x�[K�EP�E
`��' +4�F��]�����*=)E�j>�K��_0I��0>F6��B:���슱��| �7�U|��)�����w�O�`�s"��������<�O�}Ӈ3���`���UlE��!�?p:&a����tP1�o�H�ˀw�',��2I�'f�rG���mC9h�n1�����c�@�M��Kp(��}u|T�����Ψ��\�lƞy�@/�႓F�cc�'���#8��Lr�4E���O�ľ�[�Q��@�,9-��Α +��TH�H��
�Kt���tR�t̟�w��cK��6=&����0_`'��Ɇ�˩���Tb�4��Ld�$�举���2y�c:u�*8o4�l^�9)�z���;+���o���o�ҋ&�>���s�����K�£K�����i��i$����Z�-/�a$o��x5�3���|��v�&��w�u��TX�8��� +|z`l������|���X/$�H߂�L�8<��%bĄ��mj�5�5�W�t���%�ws ���d���81[2�(=�O�~��=�HI��YG��N��"w�@;�$�q�N����G!�?�9Ħ8$�\p�h>���+|b��y> {4��x%�N����~���p��� +����JAl��)?�O�~9���'�=�Jy���k�@���)�|o9��>��p!�U���B�e����~�s > +f����y�
�\|���蚩\��%L���\`�(�٠�D@� |t�dr� +��w�����D�E}*��2��"���ͧ +�PY�� +]y����r�<dD�x�
�ރ�`y��C2���1e:�S�O7����{z2��B2�vT8Z�=b6�:V�]?+$��A(��z� z�A�|Q/�0'$p���|��%ʔ��1� ��d-��u�V1�8�bvH� +�^&�f2��̏��*�ހK�;���>�@Α2�r��<��9�r:T��a*���(8}��G�|�0�2G�5=�x��G�|+|u���ڷ*Ύ�w�w�_��n�
>{�/j�*�=| +:�j�^G�^1fZ�3��}��U: 0��q<�)�T�!.��D��pn�#B��� +y㍯��������Ķ�D@�H2�t,�yz������`��:|^\R�t��S����1U~�l��� ���Oe +���醻+��5��4v��� UxZ�J�?�(>����4�2O,�c���VT\1��_����-֤l�*Ϡn:y
p��#Kت��٦�ud�E�rG�b������q$vo'a��x����7+`-��g�Pa����a�5�/�8p@�H����*jϛ�M�W���#<h�z��B�K�Ydߑ�缣�(�� �Ny
+�.;��2��Av��9���:���o�1!���i�QB|�%䊁�|�E��/i����b�J��5�-8!��E�y +J ��ל#�]�����Yد~e����&�v2p�EA��mh�;��\d�x6�u����kanmݫ��n8�]�N|,�8�fs�l�k��In���=� +`v�3p�.�2�YL�웏� � +\R��+G<��f�q�>%�+p +|=��[fL�9�Fk���oc���gĊ
w�&j���n +��u�����~4���*���G|K6�>��3Vx�V���W@.�O�P:�q*Uxސ��ekAa��x��
ұ��!7p��E叧c�&A^ +]p�@5e����g����K���&D���n��<Qۤ�/1/�W�}�l�хST���b3w�㲎.�K.c� +8,�x��<��1�0��X/��Oy��JɪKf�����<6��"�L���+���_�%'q�;g�l�����g��8�'dψ�[ߑ�gd8n�:�+q~6��R�QEg�D�U��D�Ec�� UrD�2Q��4�u�f�!��{>ƴ�fC�'��>���/��[��Qi�3�Z���{���Yp� +o�W���L��ZF}I�:=��� +N.��,��X�m@��Oײ�'� +��3��Wq���<��}��/}�E +y�[c��_�b>nP�=V��pW^�n{�J��뗒��߈��tz���Y����*�߮�F";Go{�aBc.j�Tyu����k�:�o��>_��>��e>?Ϣ��|~�E��.���.��p3��I{�OOsy�����[i��/���Ͻ��wy~�����R���\�Yw6y�EO_�Ǐ����N��V*�?,��v��]�����;����G�:���w��=�����b~��b�= ��
�ot��u\Hc����������r���s/��_n��>D�xNj�pÏ�x��<[��W_�d�m]�ih���X��"��sa�>LU��U�|�Q����`��dp��r�'�#mn���͍��S���Y~�g7���(��L�sG��c����<��s��k%������>Y��R��1���FhcO?r�=w;Xy�����'��#[������}�Rq�M�{��^x�Ý}�͝x��~��Aq�͊c�)d�sO��;w������w3�_])q~���ɮ:ח���ޝ�d?����Ieov��?����?�{��۽�\���l��ӽ��=��A몃�W��w5Ty<i/��p����&Y������m�P8��k�N4>_F��`Noo�
l�<��t��O��ŏ�v�.8<=_j�b�ӋS�/~�`:�#�W~��r�w�M��֎��7��JH�Y���3�;������^O��um����X���k�`��}=��ˊ=������v�g)�@����=fA��Ϻ=��W"�����R�u#�d����2ۏ��ϗ +�+�zP�e��F|��qeۮ'���4V�Hn�^)s{���7�{ߓ���\9��C����MD�o��u����O�!�����dg ⅛���V+�/�.�X"?�+�|ґ���t��5�o;��Ǐ��3���Zƿ�ȡ���_�lk���,�^��'�ԝ'A��_]�W�aN_�(g��:�u-���m̶���-�{7Zw����qkU�����;I�9��I��u�=�uίW�?�)�~z��|~����$���������';���}_ls�߮��������w� ���1���W��]�����=��gv#���¶���oxjN������jL����;������D��X��{y�?V�K�-U�_Zl]z}���G�f���S�.�N�(_��e�w��~�Y�UW�r?�>�~n]CGBU���&��t���@��WK6�?̨(~�X��W��S��Nl z߲��Y�9׳�r�d��>�����X ��M2y�u��=�'�/�^w�}���w�X����l>��ӿ�L���Y�߳���gG�W���Ž,��O�7���w��Mq��-.�Zn>ۻ֢���r���ثO����V���l9��Mu��7u���n\K�%���&�p���z���яYnO�W;>;Q���p]Pw�ȮҪ�{�e��K��ގ/�?�����]!�W:"�.މ,��Vp�^X�M���wËn܈*>z3���fBY���*�G͕��(`?tf;�:Q�x�_~6'z����kC��Ն:��e������dI5������J27_�o�S�ϓ����Ϸ�o���e)��(�{{��z�2���?m��+�������������K;�rf4��mw|y��{%����J�W�]^��\RYp/��`Gt���E���Vx �<� ������SQ%Gкk��P��VBy����Ի9����-n�2�E7����]���rG�o��r�.���ݸ�d��J���k%��.?y��U��w���n9w���+���l����)9w����6�?�Rʜ���Os���&�?��N�e��Ġ��F�'{���^A��|�ݻk%�/_)��.���_Uy?���q[��z��A�ۋ5Iݹ������Ǘ��.�ρ��%ߣy:w+��쵸�S�b�܈-���\��lg��q�;Uy�#���ԋ�q?���(��}/ +�F�4$���Y��*�nV�wV�_K�̹�]G�|o�c��uW��+�Oy�2k���Vl��\���W}}ᝌzw�lć�q�/�n���w���7?�۫kSAG���{y;}��mq~y��~t;��}+0�~a+�|�ݍ,�s/�d������Q%W�5=��py}����u��^7�w��e�[o���qv�O��t�T��ͨ���T�z%�,�nY��Æ2����=���7��^�*��t�ϻr��'Y����=���9���C��2��&���Z��*��=S���T��Y���?©���_;�\^�+wxw���Y��U�G���H�����}p>��ލ[�~�m�>1}Kx�h����[�
�n��%��x����+���^b�V��
����vӛ^n��^~�^��}/��c���/��V��
��H��HQ��s��ǽܦ��{�����]뉰�ב���`]̽�Ʋ��u���"�����ws��]��g�샻 ��G���Z��:J�"�V�T~�r\I��j��OW)��.vx}���Ց������YM��u�O�*��J#_��a^w!�y�����J�����=UU��Rd�2�{��W?E/~������J�>�m*���1�
�zWX��͛��n^�����k����X�z3�ī���������d����NȎ��]/bݞ�I��Ww�R|���%G.%�ᅵ���Pz�r\鶫�N/��}w��k֝쪓WcK/\�.jG:�������!y��� +�u��+�����q���o�A./��o[y�;��ģ��#�"��S��n岿��{h��R���o<ݻ|Kt��u��ګ�����$�+�%F_}'16[)14^!�7�V��x�D��B�L�oMԉQk��{���k������,*�v.�|Ϗ�e��ʫ�g�7_L.-��S����OW[��M���;ŮOT!\TSx3���rjն��;n���R8Ϧ�<l?�/�v'���o���? +��,�������;?�,�JG���JNѓ��/�./�"#�}���~!Y��l�ʕ�d��N����7�dΨ)�ɒI�I�a��%#���L�ѓL8G�7f�d�#����$2K_�ʌ;�֟��zsG/#�_A��^G��O�v/���_N��x9����7#�N^�)���XQq3�*�nN]�݂��˩���&�V_M�,��^����Rŋ�C�wo���*;�C>�Gk�F��w��z-���}���ݣ��[Fn�=8~c�U=�?�o8�?2�c�_�W>����M2Ko�d��/%z�g�w'&"*$�>#п&H�J���If�ѓ,5��|gW��<���5����]g�s��������o_e3]���ש��g9n��V�u�V�\N-k��\��RR)ҋe�Sʿ�[�������ː>.=})��Njq���7�J,/��Z�����ʷ��������|�X�埽�/��V%�8�[.���W�$s��I-�'Yc淋!e�x�ֱk�"�gOד������Jt���轴���$Z�렖������i㶡��i��K�
Y��D������wW�J��V��.+��YZq!���jZY����mSʶ_H.;x>��̅�ң�K��!�� ++��*ֿ��dޤyHG��g��J����'�'����Z�m�J�a��F���%������L�H�D�(Y��1���{c��r����x<�U�~>��ⅸ���Ie�Wː�)>{%�(�N^����)��A6�_�-9p5���ZJ��Ӷ2���9�?��b��;���ĕX���ku��S��n��
��a ~��� ��a��"��~�����m��_?�v}��n0�oZ���,�z2n͞�[>���/ޤ*���sx|�������Ϊ�����{�E�m�ޓ�D%"�(Q9CU�b2�DI�3JT$�&0ۆV��YQ��n[��y��}κsL���s�y���y����S����#�5�������9��b��1l��� ���⦳��ȸ�/=q1������W����]�į��J���X�/B��
��1 ��}�9��~E��߯�و�h�� +�4wC��b��^u�G���79!o>��ZP_s��)���F���4A^u%ν���
���_4��n����9����[�s��ڎ�a�6��B�V;��b����ď?��߃����g��M��.�B���(2{�=����\u��3� +�jq|oh�S�����A�w��������=k�iL�~��.���g�6�ѰB����8�`�d�c�Dd�5�Ҝ�5l���l4���\��W��r�(���^��yK��o�6+�� +�p�&����cOa_ٍ����w`�z�zvó�i��p͙�����!£��i�|�h����el���+��?��S����GNEc
�q����d 2�̌!S�y�t�\d�7���>�=3g4eA8rڭ�6 ؊^ ёOT���Q����%��p�{q����Œ�_]+�y{�xǷ� +�������~n��;��s;��r�-,����?���� O��2ײFF����Qx!����n�}�D4F�����Lt쐩�4v��d�s?�<���R[���/�zc���ƿ9��z���/�ڮ](h�u)����m�o�^���z�r~��k���?={-� ��t������<s����\���#t�g���#������x͵&�qx�,M��x3{d1~%��ꎬl���F�,�����;3����";�Z�,繁�a���ӹu�kI�ryS�K�
87kj�^܀��f�=^����n��i|p9�����F|�
~?�Kc6��,tıu��|^�'GϠI>���sP�d#�����B�Y�E�cW��vJ4}I<�l�1�r�YN���i;Q�Ƙ��q����J�����_��'��o�To������m��m�~�p����4|}3���Pv�����dwܿ��
rR�_�͢��ј��Er�Q�g��1�����O�����ԛ�,�g"s�9�7�@fFvx�-E�ˑ��rdj����x�`4�F�&ύC3|ʑ}�a���_9l]�������C����{Z�q�7���r0���Wrz_���~�(���`.�%ʷ�>VL���?���sEd� ��[ c
\!�ye�眩�D������(�0a������ +�����z��r8��8wλ��EĈ���=
�ާ<}�G�����U|������]��1�>���c���Dwdn+F�]֢9T)�M����Z�0f��C�}����ժ3x|��\�K��-�zh�8z��\y%�W5�-�ۣ�"�pe�s疟ƻ������/B��)W�|��W�M+�Ƨ��-Wm�ÿ���o��_���>�[�������ʏ��!�?�V�:q/Zq�y�w +�*:)�4L5����!0ӌGN¹�4�Z�&� +F6�h�G�����^�ќ�h�=���vG��h�b-��Ԗ$��t�U]����qWp�y(��B�ɍ�j�V��ʤ?��.���L���믳}�^���+�� +b�M�� !���'��������9���&�w_U1>�KnJٝ_�p(.���chpÖ⡚f�Ώ�&[/��R�6�{�y���Do +��\��.D<�U����hYl��ҺkF�.3=~$b��:����e��O�d��!��iz�߅5�"���/���'!���u��k!ث��x߸z��m�K����0��qޞ���B ��}~�˽mQ��&?����`G����1Z�����h��[����E�;���XF���0��6��M���<w#r�;����+C�n������B�߯B��/�����|KX��Fp����:�A}�����֡�{5��ga
�۞�Y���`�uK�=B$�����e)~�W����F��S@P����%���A%�c�z�81u���3��W�o5���0�����D����)�?I����7�z��bdi0��X����yαF٢)�xdԩ��� �?��| �"ĉ�"$|/D�>ƾ��@�(�����&� d~#Ċn \�i�K���N\|�J���^:���ݷ���t�K!�o����֒m��?x1��-7�S��gSg3��ʏ]S(o]� +yt��?�M��э�r`�/�e�=eC���R��U-������t�_�1�i��
'�:z�4����@��56��_���&�����$�:+��*9m�ף������>�����v�Nj��O�d��n�$�D�梄՚�u�Ey%�~M�l�� +>��'%ܓ���C�%r��)��Ԟ_�e�5���L-�����7rŹ�qܙ�a��g������?����ٝ��ʕ��;��P����'�u��&M_I��?�8f̞+CK� +5�3���N�� ���$��B�� +1���?�?,�þ�{C��'O�x�|���x䭗�ɵ���w��?m� +{����C�hH�}v~7Ƿ����炓���j����4��z�_|�R�����7��b"
J��
�!J�At�@?�ۊi����s����Tե�����d ��ی�����'�I�$Fk��t���R���qm�B4�A����Ԝ�ތs>-�v}$��������u���"�o�*B>���{����̃w����#�sS�W?�+<)R>��}PP:�|�}���R�JY��%�����)n�6W�Va}в����=��爐�{�d�mc��� ���i\���]����WKT���G�R�/$Ԯoܨ֛����&�&7���6SM�v����l�4a�+�훈�'����0��[����jX��� p~�^|_�?�G��-o�`��*E��`�Q��1��a����+���v~�0ir�b���c�8��
���s�0�^q������Qd���;?�':&G� K�-Y��;��ڃ�zf���U��)��}�^~�i��on��sv��?�З>F0�ަ���=��U�n/���X�z���ջ��cFx��^p��k�Ov����'���m�۟�����-���~\":"����20��h�r'4�zZ`i�d^�(4~�n䆜1��e�O,����̕�ъ��l���H��G��#�dٕ�T��i��'"�G���a�s�V��Fo�+�і��hɢ��H���ע����]x�J���J�n̓T��*���8���<��cf.�<�yN*4
��q�V���!�>t�������;���J��q���o�y�7�Ln�
(�a��R`U�����Q�{Q���Қ33�̞�tJ� ��9���c�d���Wx�z#��+���+�)�!�2U�:S�f)m�4_�zq�t�E{���m�Q;ߺ�G^r��_�d_��IlA����Sy�ޚ������竂n^�S^��^��;�UPY�����z>E��xl:c�2�Tc�2 +�1�F&#q=��P�y"�wi��S���[�����~��<�y�
�+8�s�LW�k�Rb �zj&]�m���&_����N��c� +X�x6�� +����6��ucy�y�b�����ZQ5�l��C�ٍ��������������c����?��}�´�_Nמ�#����r�+F���*��[�����YV�m)m\H���=�^��J��� +�B��B +�g�ޯ�����;m`��(y*V���?��>y����*�9�3'Kn6r[�ĒDz4ʿ��*O��H�h��Yh�̅(��+�4�Sr�#�sMB��Ve�;//�}���G�Ա�$����ݯW��z���f�+쫕���C��r���;z��I����:ͩ�,&�~����2f�?j����sh�d����7����a�-`�ץ~{�m��������^������(��<��� �g���':#��m>eퟐ�������퉖Μ�\��( +����1��˨��+���L^���d!þPy�vl��ӥ��o������[��#S'��+��.�}��k�2�����gK�ҽ���uƲ�/mŗ ���ȋ�O �=�O�'���L=:�#y���a��;!
��I�a��̼|����?>'w�trY��3u�=/���b�禎lm��X�BГ.�y�J�6�^4v�C�}�����40d۟��9GU�J'o2�2635GgB����q +P�iHRG���� +W��D�N��i�=�\�6̢��=<��r����"�Ua!I����=SB��g@o��p�x�q��_����Z~�k���WYN�]�c���;'Y���Tj��4�J_��7'�g�졷�uٰ����M{'S������e�l���Ň~u
��Ӫ���y�����4�(�e� +���(����;��e����&�������Ӂ�/��ZLd�������5��K��T[�b�b���;z�@KO�ZnZ�T����ko�g����<w���"ev����1��\F�.�ے�j���݂��7�d�{W��`��� ��$�=?�Jw}�J���s�[���b-�E�t�/.�� +Cf}�!��}���s�[���ݲ�o�o�yX >#��������=f��|���i��� +���S�k�%a�Z��4M1�F���Ͽ�h�G蔊Ѳ]�8ü ���@3t���DMUJ���担|��3�$뽻����4 T�*�o\���Ln�X��o"�zA<�i�
��]>����}퓝���/�w�`����l:=�����9���X.���'u�?]}h:�]kJ嵎�dw���(�zm�(}���*M݃�W�Udj��u?q��,��X����yU +۪���Pš�Jz���p��s��^+:c� �q` +hR������=��Oq�q����dI�>+iV�YB���/���r�������cӨ���`�T����W*]�A��a>"%��S5����t�#G����f���:����}��]L��2j�gj�3W���Oa�;dzi[L�#zC������������y�$;�^L�{�b�|��Ͼ
�.|E{/��Ճ>�^.��W*�DϟQ�Հ�-z���S�ݾR��1�Üy��w��B����Oi�m>�2��?�G~,�DoЖ�٠�V��HӖ��k:������\�HxlTr�!���' �T�X�'��*Rʌ 3*:C�K���Ru@+��,V|�`}H����ӫ��}��=AאI�2�3}]�'�E�]=U}����Ӄ�̎��Ѓ���4�w`���`�z��g�15g�<a���G'I������ƒ����Ugl�ɭF��^�_��/vEΎ^�_�}���R�iv�F�M10A�G�G+p��UP~�$���s�'O���zgEP��>8AS"����$Z���H.-/����/d����u-ù����펽�����oi��+���$U�����j��eT��e���^d���e6n�D5.b��d>{!��eν +a/���O�fpLt��v[Ic�tDt����<�DH:���#�-���q�EG�1��wī��ꌰ-L`�����[a�?��処S��:TR�>�߃��A�6�1
�>���,���2������/��k���;��>�:����4d�O���O�I�;AԲ����J��� +I�;I�O�����%�d �:L���]��]@7��:8�*�l����<I�G��_VIS[�=B�����d�0e.Z6orssC�~���6��r�'�A^"��#F�
Yz�1h��m�Z�?�S�$��P��|~1��ԍ�}���Tb�S�{ +��i�r��l�-�e�嵎M,~����C%����������;��GO� ���-�k��ZЕ;l�ۮ�3��^�K���SR}�VV=8[���!�督�t�Dqx���_��#W��iR�[%k����w@s'LC�� �U~�oJ0"A^�q�����J�Jd*(b�a��Y@�?��ۧA)���s���J��t��/5�]����͜�ЋgS��IO^N�8���_�Ot+�ΠOϣ�N�aJ&���Hw�ZI�6�9�FLm�ѕ�x��2$�$
�Z]��IŔ�����9�H4���Z�����ꂑlN�%[~Ԗj~��4q^1�I�E�-7���t�ج���m{��� �~n'뺹z+q�R��}�T�J��?\M�6P�rc!�c�l��3�7�ט�_�I~r��t�K��F� +��Kw��$����M��]@L��k"E�:�ii\(�~�@���N�tY�^�ܖya��� +�6�̭�lf�9�I6�łh�l��`�ŋvLds[,��dF�:!S�N(�#z;�ے�)[�����5ρ>|Ш���Ԇ>i���*��૾�C'�R�j� �L��q���0_�߹J����v�q�v}p�u?[�m<0
��A���{� +k�=D�kXS��<�]/��C�e�J���t�{gf��@w↬��B��;j������XW��7��U�g�<[9�~o)?hGJx���iP���ڀ��� +���B*�h��'�� ���#.�b4��o2hSrE}�4���M�Kc�GJ��kJ��5��A�9�4��U�3��/���}���މ�=J��q���]Z(�}��GG���|����cp�����������l�����>�M +�t4h��{��Hw�um3���/h�����u��2C&�˒)�q�,�LV���ٔ�j4��q}��وI�b̬�5����%4����n�*��������J��w��^:��W�5���jp��z��b��./��@c�M).̾����O�Ï�ܾR�@3�N��P�^[������s@{� 4������GOi��e0g@Ì�LR�>W�ny��[���������@l���`���A���H���A�]�&U[�;�.������� +<�ܑ���ңD�˛C^^��^9�*Q��B_>�d
_̑�D�톃�����/�K֔�tu�峖 o\����k����G�LP�&k��°�ClX�6hO���� j��F��b��@+ +�%��Ϧך�kRF@�V~v[z�F���<ХM%���B�� s�G�xǏ�L�!аg�pNY��<6��$P��[���,����xM����m4 +��tX����R�C�i��5�L����A��n��H������?�M���'�{^��'^ѧ��<�G���|��ֱ��d-?�w��'������ ���S�� +�9���{�<;��]�<؆S�.y��{�ϙ�Kخ��P�w��z�����u�3�����Rj��9!�|����?��m����������=jM�N�<^��Lצb�Z�jy�8\�"�i��R����t9C��!�t�VcfӾ)LJ��ă�*���+�k��g<sQ���᳁>���bhq�w]A�����l}Y�-G��s�ms�{9����cLb�!�꾸���� ���UVv�IOO��!�]�1H�1��8�Y�zǁ�I�Pu��&� Y�\b��^�h�cȵ_Z��8��o�|.�5���`l�եl��U����Ԙ�\������r�0(�Z*��&@Yyh6h�m��*vߓл��d֕�Bc5 �t�d���Y�dw��a����X��ԙh1���F��1���<�+�U����/�:�Vp�`�`-
��؝_{�)�7lv�86�ے��5_��=w�_z*���)��1]�WQ�^m��L-C�у��o���Y�����L���b��k7�������(��D���/�'�<G^�6A�W;N�������1�mӁ�d8�aJwL±n�Ӌ/7&&��x��/����-`����Ҟ�$�'a?�q�TX�ar&��7��)u�Tb��:C[Ć�9�pC˗�BpO(��R�;h�1]O�@Ǘ\#\%,�#ⴀQ��zƁ0��W6-��p-}C~lӕ%|^�8Б璋
�zg�6�w��2t���^��w"��[Z��W&s�)h2��kpl�2�F�N:���t�
�N]z.2^+(�q�*��Z��d5 +~<H���ɸ`5�c�� z[��
z�t�Z-�?������2���rಂ�(a���+���n�Ҕv�[�|B)v��ŭ�� L<.��7Yy��W���n��bv�YtJ�h���E��:��lB�����m��g�'�3�Lb7�En����A����֙m��ې5�~|f�%Ѯ�{�*��5/0�`]��Õ�6��x�Zol�3���J`�F�X3LU��+@'�D����\�dž�x�R��ț���
?�tT��uZ0�a�I���|�g�Y��8h�=F�yǝn�������v�u��!ܫ��f�������3ۿw�z^��JN%��e�6D�n��Hu�v��'A��s�}����T�F}�uq
�u�Z
t��
&<~}�# �lw6J��KJ��ʪ��T%;�q�+����Y�l��U��^��+���-�D�+�]�+0��;;�j�yف�b���DS����v�Q�b��q\"h�����*s:'(Ӷ���*�� +�`!������OXx�F|�Ŷ�A�w}䭃N�彶�P��8NYqt0�������C8��})Ӈ���-�3����sCѪ3�@�������Zܽ�ʝ��;��S=W�-n�)����5���zD�.ߐ +Ź� {�4�7�M�,����M���q�ҰT-�{�_"/�$��3�0.��L�\4�H���L��`[R.^�|`��m��UO���fC�+�"��5�0��Հ�2��(�{���Ơq���6p
�zm{�(?9t���1��VgC�j)��F
ΦS��������@st��wD�a�xݞp�;-A;��x���ze>SzdSs�T�lي�3����'#�N�NQ�\-��ѕ�==��|i.����X`��}:��� +���� +����H-
n�̨��c���K
��h甠��1���T�o����|�4�����ĵ����r�#/�71�4��.���?���l��<�x$�z�vgq�&�,� g(�u��d�p��R���%���C���G�\i��UBX�m��k +'��}@�l�v������̍�1��6N]�mX���6Ԍ�|Z^�=����Ed� +�E�3I�.���0�C��4���Yc��E�J�`gEd�TewM�מ�WLS�xFt���nWf�8�P̬0��2�� +���Y��q�G���=��������??�� +4����l�ieF�M}ӂ:}B��
uS��������y*�?u������x!��ME���������4mX����0�[_c1�YT���V�G�h�
����s���q���G�oЖ2�j�a;�$�uţ�=��H��b�L�����tx&���
�D��(�y�e�s.�!?w/�Βr +5�Ov�$X#��( +P� +Z�\J�1�_�f\�]g�Ia
P�����Ճ}#��U�; �[�7�Y�i��IXN8f��;���{��R�`gA����b��gV���Y�K���?�Y���,���c5!��Rj���)�0wA�_���r �� �g���B������;�����������z�~>�ɠ�M�}�k4�_��<�T�g�<��t���LX�Lcv���w}+Y`��<�NX`Z���o�1m���� �D��z ���x$�#���r$�"ՠv��� +GŦ�G +0��F�k�>��k�����z3U^�50*��[���}ȩ@��� 7uLf���!�FB�;����9���6η]T9
�1yz���AY����e��u[��s_.��\L�vr���"��=Ө����Ŷ�t$쬜V`gi��\T$�sy;�@����7�&�,%𓁝U8��R�����;+e�A���T�r^`��m�}o�o@N,0ej�����V ��u���F���ՀK9�����"`j�dX�x����<=�'�^?������Bv൯���2�R�Q������H��~$���-G���#�w���B��
զ����7x]X� +�A���r�kȝ鸶�n=��d-��Z����bh�þGE����%U��7|�((�Ą
��T������x���r��8\��%��Yag�_�o�+�{��> ,��|}:2g�$*M��.�;֗�9@�J��*���) +�X��^�f�m�;K^������l`W�s�a��qX7Q�wZ����9��'ܘ�vk�]�r�qU���tp�"w��b9<?4Z�[���ZO9���`}��s�`~-��
cɵ���[@X���k����_0P�xD�5eK{�٘L)�. +W��I�_��Ϩ6��`Q�$T�
۠��+3��V��e,0O�'s��R�>�':�p�bu�H��\R�!�BJ��!����a��=�KAS�tL 1�5�م5O\���4X/��a�� +��Ø0 ٺp_���r>�r}1������N��b7�=\���\n�xвfȚ�����XϪ��Y� �/�����Y|�����K F��VV$��~�-�3ͧ��Z|�eݓ���I�5_�k����"���µ�{.ɥF�\\ +��,2C[�s|6��Xi��Y�����x"�;��s��8�S-� c]Q��f�u{&�=�Z8�U��s����ֳ�Ɩr�gH�B֬��g�k6\)�{�� �
�Sx��ո�ﹻJ��.M��ڗ�t�=vp�]Qy|�7��7��Or���c'�\�T� +d�n��z��3�"EN�K|��o� +{ݸ�ܑ����H��z�Q�Qg&U�QgpNM�}���b������hu�,�R$���1�c8/���"X����)�T#,O���{m�o���������"`� +�&��5�{���9\R���Æ&i�S���}=�ޗ�����Dl��2��5>:�����k��R�q�t�4�-��H�Zu`�/ �o��xj!��+�ze�߅�ͤ�1�X�Ĥ�}3��C.%O/6"yJv�8eQ�5�'��;�zv�xb.\�C=/�ǩ��0Up\!>����L'� 8o�?���=[�ϖ��9�[B>!��y(�5�7�=cw>�
���n/g�-�� +ɝ��]S��t-�r�������pl�g�y��ߪ|�TEA�%�W�pl>�y}%�p���3a��"n��Dz���T�x}r�&�C^�%�1��Ϛϖ��H�^ZL5_��^T66K��l\��|����{H +vO���W��Ho2V�X�8媶c��$�������M�3��ue���*������d��L���σk|i��J)y4�&P��u�< �r�f��b�����L^�9����Y� +���'A�<-�aϖ����n�������i�fP;���<�p��W�=G��O�l��)���{�>�˨7�3� �~Ŝ6��V@��[X��PnBXM�>�p^a��0ǹ-LJ��O��#�+`��:;�c�T|� +�����"�A\-d꿜�9!���b��>O�~(��a����ʌȽR��M���?��1i8߆�����m�,:�+��t��P'��6��6�E�W��]��B�/���ڂ�R�uL q��a��s�6uM&vZ�ӆ�|r]u|�Vo +�97���~��alE%j'\���J�g_p�_�s����5��3Q���������q`���L(3$���cs�Oǧ�����t|:>��Oǧ�����t|:>��Oǧ�����t|:>��Oǧ�����t|:>��Oǧ�����t|:>������S����B�CX/���ދ��ג�u�IS��:'%�E�%G'ć$�[;·X?�������/$=")h^�}��eֶ�����'��ΰ��uޜ��s%!�ֶ�/j�l-J�����ߔ���F��2�0��-,�����~�jqH2~J��7]"�s�ӷm������pk�]k�m�E3�Y;�� +�D���[�#��t���d
�V���y���r�<�p�}��ݒy��[/��0�:���a�ü9�������~�����k�������×�#:6�q�Sr6�_g�����s�"R��"\�9_k6�@nmG�y��ɟ�â%s�sp�VZ��_/^ +Z��j�}�4��A)��2Q��L�V���S����ח�ʩ��(Ϭ5���2|��=��Ӷ�*��Y*�AA�Ze +z�D+��쇋Mա�S�����k)����K�'�9��;�.>Mz��Ia��8h�6���B�6�@����L�0
���4(��uZ�g�2tP��Et&cru٤}��Te7���a>��P��C4��-��K�Vm��f�2��i������OG�k�k�@CB��m#��z���fɫ�Q�6��q9zlB�.�9���������z3�7[�����Ht�/.�[�C_$�3�=��-ԗ*�X`{ ���؞����w2h3>\|�.�]�(6V�wL�֗��֤�$�)�G�Ǎ��E�jqY]�\\����P�p��>�I<ߔ)�>QC���L֤�C¯Q��Q�/;��Q�k
��T<���Ĕ +�~+�?�e�sF@?W��~�:b*\-��R#�����K�3� +t��$
��s=��|=Й �z��{�A��IlL�H��b=�"QC��~4(AS��@O��e�2��X����Iׁ�VUF����7�em&�g����x|t k���I�4U$�C/#��K�C�)�a,_}b.�NBo7�����uM�{��DY��V����=3Db�4e�������p0���gB�
��s�c��d��>v�ej��~f�U)�>z�H���R#bo�/+S*M�eF�<�s�ZDg�<�������M;�*����\S�l��Y����lH�Yq�DEn�x��Q�!t����ym�w��O��N�C� ����[�j�=a����%�]�n�o|v��|}�(�ߠ~����*<�`����}�'�]�QqZ�;:`W>"��'A� %c�-z���O�d<~>�ItX��L����D�� +�{����%��S�L@�tz@CC�\m:��n��RĪˡ'*_� +^� zDW�^�+�}!�EL�.h.ȓ�F�o�RvM��8*ʺl������'��m�����2G=��-�gPU�s����l��:'*J����� +4���**�ߤظ�|�2u�1hk���Z���-��u#��U��b�|]��^;tE��h#@<�j�>�i��,Ķ}�Ч��ђ#�m���=dԙ�F��%�s�W�Mzx��.��.�G��)�g��N�6+xm�#�Vv-����s��A�����S@�YY�{�2�� +����2��=S|b�!�ѓz��]WbHbzz�9�&_��
���G|*���A�$��[Mt��ב�
た}�p=@O]ʪԀ��F㸰&G�j��dM.4Ct�@c��~�RD�C������N�az +� �� +�ob�>��n˦�A/5�s*"M��/�-+nӡ���öDG.,Y�þ����9yh:���o6�~x 誱�D� +bآ�Hw#��9g��;p�{�{��~��~���b˜s��}��c>����umh���- � -]'��8��0k0�k��&��F�f(��.<�������}� ;�>4�(��h�s�������)�S�^��*]=�Kc��)E��t�[�@n��
�� +��`���N�{)�����/O�y�^�Yc���3��zN(N�z��?�0$��?���|���|����G�`5�l�g`Q���Cp���E�����4�Ȁ< +*�;���2�F`\��b��������ǵ��W� +�����h�3g.O +W�L�A/ p!�m����=�x�q9��� �' +��s-�Y�y���=��C�~��ِ�uB���1 k
@> +{����<�f�QWZ��(֊�����Ҟs� +����Iī��1�FB�aX����9�b���HТ����<h��& en3����p<�P���%�N�����������> +���_%>�� +Z1������Tо���חc��?O�0p,�ŶA +��!�F��Y/{�-����`/��~S����$�b�|�.�#�n��[ը���_d��l�ˍ��(���<s�c�����*�nZ����� ��>f7t�阒TJ�^�� +�]�Is��!���p%#+��&ԩ�jԄ 媠2����K�\�X40�.���{������b���e���j��e@\����:�+�S���~�I��h�"���?����(�����{���9���^� ʟf�#�ӁFh�V�[-&C^�=aЁ��]x�����g���c�c�g}&�9����H���s��W������N���b��C� �O"w�}2`=��r�m��H���/�F���M��\�S��Cg@��-�/߀��^aMx��(O`|�S.�sqOzH>�W�~��D��Q�ˀv�z}V�KAx�u�5�� +�T�����C�E��<�9�7��Z�=���f���N�D��~e�;�G�A���A��
��Z#�r�g +�W����AW����[�Ș?�~u�õ��'�M�
X��럻�N���DUng�2~��(����D<ZO��+�땾��4�:�j��9�iJ0Dq�tB�n*�fY�
뷜��� r +�)���3@�뱁���|��@V�Y�Ҵk�Y8���|��u�&��������u�<�� +���Q�>��@�&����E�F|!Z�q���<�
Q��� +̛��
iZM�=�|�k�o�N/�Y
9��-�Ƅ�Z� +��_>G/71��W��"�Dcކ�h���X���-���I��/:�O�Ά�_�I��s0�_���4����G�c��b�蹘��"�>hlq��+s1����y��B�k˱^����D�aJ��(��Px��d�vj �����=?���9�9"KyJ|V~HKq��`n�9�g +�A��<��(w�Qn�����P�aE��~�)�m[�1ᝤ�O� ?�������.�?�`ln�/���G�
➠� +�����ix���q[<�p�9v.�uc1��`�P�B�� +zX"��(�@��������'k���C�.�匥X��RȌ!���1@s<���):��ť��D�?��t{���١�,�)�GA����G�R�T��p��=(ι���DJ��(�Z���Q��cB =/�c��v�3 +���=�8�_<����+�:*�{���^��]�۰�"�F��;e�(���j_|�݀��� �+�c� 4OX�Kɸ|�1Aǖ���?�~}cB_tZ|��w�P�g�3~x�`� �!� �zLX��1a5�69&O���a�k¨�ӱ����,�g�wc9��9m�Ş��1)���+��T�*��En� �Й�߆9/hi_��a��ޛg=&�}6a3��C��:�_��=4���ђ�ޓ��>A���x��u�2�<�5t��!�!>y�cr�����&��iD���z(�N:�Z�kAzX| +��Ό�|"��F��1J��".
�.N)�d���Qmýw���x��r8�l��\��Mo��!9�!f�zLX���8?Z�=&n��~�y�)�[��D���5%1s$� +p�K����#%s��p�ŐX��\xd,�\���F����o���(�xB��( �����F� ��z�F���J��/xU�\W�,�*� �+��������:m�t��%���~�+� +56�T�N)S���3^��nD���yk)�P�� ++\�\�YJ=[�s����a��]_ +�csX� +>X�a���)J��
�T�Q��g�+U��u�OR�Ta�|��'� +�?|����'/�S�����!-r�� q��5�����rQj�&Z���^�XK��4���#�n�P�O^��<�:���Q��@�e��AK�&�%�|.p2��Ή�@��NmQ�x�FxP{�.�+�P}Gu^|�a��x�ZX���.9������b}eX;��e���E!h3�宒�d,�5!����
�(a}�%���� +��|�yf.����o�=:����/�x]�#q>���ĕl�:��X���q(F�2�w���4��wO@\%��_P'`?^��5t�-P�%�YK +��@\@> +���~X�}��9�G�d�g�{@?b�jh��h��5�O��x� +Ç�| +7�Y�Z�Ě��S(�cx�$�a�����r�}���b1zEh,��@a����)l:��F�M�{m�������[��c�{��Q?�2��@M`||hO�����[�����1y�q,y�f$���� �2� ��HG�m�� +� ��z��K�//lh�&����K��.�Q����,�#�l�k(p�җ�� � ��#�=S�c����R���y��[����i��/ +���iLX�&�h����[�`D�z��T�Ӹ֡蓉j��ӂo���Y�k�Վ��Fe�����?$5�5):�p�2�j��j�>}�� +R��.`V�X�*l +�4�v͞OF�n"�:@����_��.���O��fL�<H�����O:d����u�v_����U����Ṣ1�ѭ�Ƽ�e|9i����8�Kཫ螁�$��˄A�ֳ)�j�ku�iV��`Z9i�Z��)c�c���R�|��WR�ջ�?# +~� �ePIջ�KsN�����LV��֧�$��u8��繴fe<FS���1��/�?^���ڮ��IjV�H�݁8��Z�{�x������+�uc �t-{������Jk�G_m: �j2^m��H2�~�#�o��Ʉʝ'�Tj� +����h3��y�=���@��z� +�[w�Y�5�g�Ƣ���7'�Ϛ�0Z�-t�ߕܭ1f�4 Dw����J�rM��Z�� +}���i�����L�v��g5��j3�2����ڣ%�lU��J�׀��'T�>h�w�Ll��!��̥Lr�>A����� ����fe������V�3�j�!oփ�����Z��P��״|��z����mFdÊ�B
�8DV�]��d
�����Һ���\��K�<���|�3w�a\���������|�)]��\��o�����^����i��HW��a�N�������+j�/z��'"�Y�X�����i�I�{�fҌ�$�J]�Tw�Iiڏr�.W*��j&�UE|����J%Jj��?]\��-a��!x��9����W��a�8�?�/(��A}dn�07��6��i������浙���ST��X�K�ѩ��h����!yo����U���ш�;`��m��{]|�Q�Ht�Y,ɭ9d�W|N��҄Io����&ӻTѡ1DŽ�^q 1F_��f�j�z�0�bS_z���ެ25Tj� +�>6
忤&eX� �>(�W{��������]z�]��G=��G�q��}�@7K��(a_��v�F�x����K���[���N����� r��O>�l��#�77!_| +K[�ĥ��&��]0y���n���֬�d�h�������ຂ���Q"�閰��,����Imj��'�̬���%�����>/���6��Jŷ�E��VJr���5k�2��٫�ڬ��U�����[FGož���[ +ߴ��wg��J�G}��y�[�v���t�~��)�>ü�d�~>F�q�z��X��*�dʔuYJ�J}$��}E�e�������5�E&��!3>�����ه�bqn�){��e�Zuȫj��V飊#�ҧe�;-}�ˈ�ޡ'��F�4� +���R7�j�w?걷�H*��O>ꢨ�>)���0��ے-�8Ǽ�:�T|8�Tv��^���.j��WD�� � ����tA�!���J���e��>\<�$h�,y5�9���S�a˼�=LeҢ�P
��� ��4q.G����xa�kx���&��Hޔ_4�wQ_��?ZͿ�]���MG��3C>��Y�� +bz����%jI3[H�{Uǥo�l�K�\��n�_b'~QsBr�I$�j7�X�J�&�4�96�_ab�+�q5������������O�Ń%��O��_�|���د}��@��x�4�xkV���4�Wy`\x�嘣�d���.⾦�#Ět����Jڛ��ڎ��~Z2��ٗ������i*��FK��2'����W=G���K,~�hm�R$.m��n>)*n=')����T9�T\�o���������7�e_v�ӯ;���Q<V����V�A9��(�k'���^l�Fޝ��rFTQ�Q[����,D�W"�j��5�����v�����K�4!K~5T|9F�h/l�|� +5�z#��DW|8K��27z
Ȱ���W먨ڭ���:��y�����Ҽ2KiN�a��c�*3�U�̣61�䃔|�Ų/[�E
��yu��OZ�����w��x����VsqE�����E�T�c�Uq���ē���v>�;��2F4P�+n����Xӯ�L���g��j���z�-�n%X6��Y�'�]����mL��h͒�0�=��_O������i"�����m�J�6�6�]���
S>ne +����
1kˏ4�-�?��,�PǫhaU���軩�N���|!��H=mc����DN7�s���:^�N��N�jLO?��0Ѹ���{��]k4�������|?髊s��&C�������D[V������2��h��������$�ބ��<�����1�U�u��9*���̲9%Z���pWNԱ�[1���`qs��Η2�a�����RY�5�]��'K�+_�<�9/y�q����~2��Z^D�Z��o����ϼ�y���'�ƽU�7qg����wQ�Ϊ +��Ĺ�%����o�Ϛ���4��G��6�d
��}j�&��Q�aɛ��BT�_~1���zT��:WG���E +�[-��k�� �}�`��M�nV��)'Zo%���\�m�W!�Zr�;Gf�$KL�u���uO�l�L���a;�\�u܍wo +L�����u��Y���J���h�^��G�;�>+v��-q��-��:ޞ%�� lo�VW]����Z��7X�˫�anD_Fq�/�+��v/�u� +�M*�� (�O�;{\�^s|^#w�(�OAe��E^��E2��(_II�>I�ѹQ��zo9=�ל������O6�I
� +��ʶl��aޙ�6�� +��λ׆^�q��e�]��jLj�r��{5�E
�a�
��G���P�v��pnj��q����H~��l��$ر*"6��'&��=�j�G�}eT���䨳�)�Ǜ�"�=o�ͺ�EJzC$%ͭ~�G��n�]G����fM�Qg�2SO7g%�p7�`C=Ϣ��}Ȟ�l��n7ѷ��#�ef}�"��9���#�j�#�c]�#���_6x���g~ۢ��d��M�TǤ���M���Q�����bC�c��d�]�"�~���urƺ=�X�����qB�~���̌�rg�~pV�*O�{�'�勓^'֍jZf��Ӥ��8$.n�5���=�r/ѱ:*%��;�j�[�mcl���2@X���ֵۉ�*]%�
�g2���"m+cn���u����C9�y���<ܬ�0ڼ+'�BsR��_�KMx≶�����tG�������p��ܘ�mYq�ccc��b�����������T�7;^-g�_����ܡ;S'8{�V1����~J�ke�w�LZ�[$�{�7��"�J"N6eD�w܈`�<��[�էè�a;���ߍ��J���%��{���7��;o]������sd�;��Ý����C}����}��)���!,嬒J�����A�Q�r�G������Z-��;gu���J�SLQӥ�'
v�9
vQ�M^ɢ�e���PM�D�����S�w��y�R~��y�=|1�}�6�y�^b�}�ƭ����{�5[U��[
e�q����)�[�Q�iP_ڝ�J�"�_z�n��� +/������� +="C�/#�p�13V���k�U~��n,�E �o�b�ɲn�.����o�������� +�K�ߞ5Z��i���n��h�������:r����X5W�X8\��O(s�i�lt(��W��M����طODh���4�n�;w���)s�9�,�[�� � +�d�����J���K �ik��s7+V([-�}>3��v�UqBA�V�[���gK��w�Yo=b +�:��-v/(�{��1"��-:��+ֻ2 ѭ2$!�W�m<�n�q�.DŽ���>��4�������j�S�t)���b0�C��>7���@��k8ޘ�m�1Y�鞂N�;%��/�r��E�!�S;�n� +��Xi�p�"BIa1���b1�C�E�$��"1�P��A,��D��fD�5 �W��|�j��<�&N��w��+gc��"D���/lt5u{����}�s�*0.��WTZ�G��7�(/F]-��=.v�|��!�J�[�Ǒ��8G�.t/|��Z�&����kn��uY�~i�I���\����p��9��o�-j����۰S�X�T�X�f9�nzFN������l��W"&���(b1�@�%�>�r?�^��z,����'y��x��˄���"b�/���J�W����?*��72��7*����BoYz�gԕ��{�nQ/ +\"s\"�r�����b��E�QoK��}*�ٯ�����䯟\/�DǼjF5��bht�s�.N��qb���(���s��J_��8t��#�����r�j�7�L F
���N$F�MD?� fNYM��r���U��@uc�sB9갸�9���zlV�GTa�s�շ�QY�ܢP� �+r��5�y�Y���S��wΑ�ŞQm�Q�_[������>X�7;G�Ν�/{=w�]Bi�t
����Dg�O@�4E�T�|?�\�����_�{������h.��{�P�k��~�[�?�e;z���Af-�#��d�.���Z��b^�BX�$�a�o�c�+��Bg<n�K�D5;Ew�9D�?���\��c
����{Nc��91�����F��w�;��=S��X�P�X�q���Z5I��;@}*��*I +Nx�'���#�i���I�[̓"�� +\�t�~����7ҵ"4&��7:��[v��r�ț��I�2�W�J��U���tUs[�uk�3�&������99|��q����|
C�8�? +Ͻ�y8��F��PV�@�$��XL�Q�O,�eAl5M�Ө�4�ϝ��ݏ��\#���d'Z�F�lH�.^��W�/�j[}�-;^�~�Q�0{}�u�ֵM�u�5�ˉD�B�z)tԼY3���pt����\������{$�3c��>'��;�Q�r���k���������Gh����9��-�C�V�GG���qx�!5�&�-�}�Kt��"���7n�M�j��_�u�F�){R�*K(��r�
�bƄixn�wy����u�wpMc~��H�9_�$�j���Ăeb��Eb�8q؞��<�Ϝ��[�I/|e��<��^�ž-pM(+pK)-vNz^��[��R��X�[EP��ѕ�n�h�r:��m�__�P6���,�/c:��{cѻ���a3���I��8MC9i���i#���/&&�/"��YM�T8@�Tv!v}=B��[��8!���Ԅ(���h��� +S��'�'��ZGL��� +ߏ�@(�G���J,�x��f�%�?�[n��3o�x��J(`�{/<�P�k}��\�����5���Ǖ�2�J������J���R�D�]�ʹ������ǿ� \�/�JĔ��Ih���)7��Č�ˉi�V�Ƭ!���H̜��X�a?
gb#�<l�0UnW@��/�����S�K����.ǽ�w�-+t�-�P^����9����{�\� +P>}��I���{F��q�+ש���导 9b,��~~?�1?����Qq�Bb6�9�6s6���%�,Q'�-2$f-���sԉ����b�N(�˱e��[n�����AQ���z\����,��#��h�w +~AX��{Ǩ�7�Qo����5F�~���[�i'������<9g�����84�b42��!7��5v91k�:b�̽Ē5b��S����� �sR�̥$1s�1CQ��=� +m_b�{�;�����p��s[�?rG��]��<�#���5��Su�CT[�S<̹�ZǴ�*���z�䷥N�K����r{����_��еx���M��EL�G ͫih�M���^�OLDc8 �F-"f�_��m#�0k+�OU����&ļ��Ă}��}bO����
fO�v��6C���@�_�X���&<��M`�{���е=|�${�j\i�����1���1���!6��s������ܮY�f�����|�|�j��"�8r���(���'��=q�=�����(������������$�h��t�5�XÕX��B�W�!������y�z�����T�p+���®7N犓��#=�I�z�\��3=?�E�!��7֪1>���2{܇}|yY��d֬u�v-��`DT���Z6N ��E����(��G9��4�9]N]�b�EĴqPnD�䕄�t��iJkL ���Ă
'��{������ +G�%Ej�p����[�&�/�q(LDׂ�����/��%-t*Ĭ�j(W( +3Q���
�L4��\�;k71g�^b�� +1w�1oM,�x�X��J�����mt+�!�y����/��~��W�m�������zy���,��L/*t�~��M�/�~��9�m� +�VsP=^���X�aM,�fF,Y�#��C�C�r��5耚���;{;Ă�4�`��X�z�X�H��c��G��o���7[��SV������
z9����Hu�ч:D�l̊M}����'�TӵӞ�(�ڈԲ2ې� +���b��}�A���xm#��L��y2����8���ᯀA _N1a��h>*SG��DL�����@�X����������s�����[xR�1�lw��f�읶=�k����;.=�ǯ|�j.�b-�j�;k��;-�R�e��(�lc|$�9��5w-t�=�QZb���!j��9��S���A���4�������C|2V5��;e-�p��F����!����r���};r���1�<ގ^w���u�y#�x�����<~�o��-��Fo���ӣb¾�ܚ}��n��"��f�ln�f-��S� t�8�n'�r�.V�D +�H����K7�h���x�m�|�m>P�i4q��.�`�O{�� ��o���������턶�:�Q�>F2�Q��Ad�1W|*l��9w����0w�����I��Z���T�1�z�!1g������ؔG8a�Iˉ�[��f�$��Am� ������A���I�_9K�O�a��j9R��#u�sz����`��3��N�q���ad�C���R�7�+�8L����?rּ6�B7�ϭ��9J���-Ե��G�,?�d�b5�����Wc$�}'��ٛ��t��I�����mL��uLnc��2@�]hP�1vQ��u�Eyq��\b��y�ԉ��B,X�C�ӳ!���5|�w��ݷ���Z%��'�/�=<_(8�:V�偢�+N�i*���p#^:X�4��zm�9�(E��G���i��9QW��H���v5z��-���������^��^��-�e�D�A�Lx�v�N��U�I6�͌-j>!~_z�(k`���7u2�C���Q]���A*��A����sY�,ۋy��~LE5c�:�����7i%���}����s�(_�
Qݥ�|s��
��ܠe{m�vMb�
����Fz��9�i�L�n�M>ԛ+�>�TpB����������S1x���vl4���яԳv���g$��y1f������� �'�N�ﻤ̣�v1�K_7^��\����gd7U�l���zg��6�-����~��b�<�k37˶ ��Ҁa*��٪/��j��^��8���{��6w��z?Ӂ�X�c�[<�ھ���o��W�����S��FwIi�3�; &m�tTu��;�����_����?4
�߭�]��Ab�7�Y���>� �z��)n&����/m)[��8����)�1)-=%�i�[ydf�~2�d���B��Q�a�m�� �w�0� +�W��T#V�X�-o���[���ш_��� +���( u�a���i��
����� �RgRb��6I3i���h�s�S��i��<mT�x��Xb*'����nqs�1���� ���G� ���W{m,��]��U��/`\��Q�4%O���V����0.)v��W[���s�}�t����3gh����k�%�zI̘�DL�� +�$�*�j��wp�h���ns���뚹�PV6 4
%���<�B�du�g��s@Bh�h*�7�{�y�O�ih����Z��߀"DR3yӳvM�R�z\[�I����3��6]ӻ�GE�>���>� �(�+��?�"�7����O�\�SE��|���K�g]l�yf���B�-a6�2W�{w�aJ�fû?Ԍ�U6�+]o�1�U����9�qF����}��.�+��e�3���r�)���M��1�� 3C� +Sٺ�ضd9�g�VB�;��hx�
��$}��;�b�ݥ%�_#>��w�i�F>�էE�?\C���am�g��)sh�x�o�g����a����&�75�ɇ�y�����������lQ�a~� ������&�V�I������m������· lg��ag���Sח���s�Uܧ�Ц���_J�l��i��.����ٍ�\nH�Sݩ���:B���dAf�*�}�xhf�n1s�r��B�tqгM´�Tj�� �j/��r +��1���[��\9&cf�����
W���_������:�q������/<7�./5ܜc��\��zᕁ���n\G���eB^�T>�f�Xrr6��k�z{^�����������>�����s3�g���[��p_���R4��g�>�/�:��/w��sE�gb�Tw(�ڝ�an��^I�rz��-_o[_n�n6�HO��^��=��Zl����p�/wb^�g>E��"&ՌᓪF�N��,���]��x���_��/��Ž�g���
�ݟ}��
���Ӟ��=��_������(�; ��y��X`~�������P���?��)����u��٣{�<<+?��W�Y<~�f��t�y�f�~Q�
I�օ�Z{��Xr�I�:c����5[��ܺv#�ظ�r!:�N�d�X!G%ڪ ŎČ +I����,�Dh%�'�y�矩
����)|r�����F���{�k($U��3j��Own|����ܐG��}oߋ�4)��L���:�����ۙ���\�:��� �'��]{�e�iG����*����5����7i6�ݩqٸOs@`�9Kmx���K4�l�4���h�������W>9�3����0�g8rm���p�O���o��V/kDc�%i��W8Jɫ�,��J��x����&�K/��<\���wW��O����p�ز��.�u7�rmO7qO7�}?^u~�P�7�;~o�x���p��Vx�{?��ׁ��?,&n�����m<�0�{͞�O�܇��ckF�����e
�B��4�f�0M�gU.�܊p�7w���<.<ˆ�-!�t�x~���� )�&Yue���&���������<��w����?{�~�aNC��b������_�c�,�|��j���e����%ڞn���G�2l���p���L���\���}�˵=?n�:���t�͎{=�4��-�,q��Y7{�f��]�vi\�{hv�c����nޒ��C����������'�;B{�3��Z�֟���sZ�{�@s�����b�����\t��P>4[<���p���KgI�͓��%��J�\}j���R��?yr���
�c/f����p
��ډ|y�,]ۧ��s?{�7� Н��{��w��+�-���y�w�/uE��{dXy�1�n� +�af�OĬ?t_䲾��#eq`���8^�o���x��?�w��_���-���x1�f�2�'Q~���+X~ew��r���R������l]��[�?y~������+�8zZc���p�\�bɅ��y�� 3��oM=�o�t�����.fvNK������_�WLb+F�1�|D�-�>ڑb��Y��gh���%��/6`���?�Շ�g�Q��O�~��7}�Jd�__���&b~Mx�[����2;����G��z���m��į;��0�ܡ��h��c����T�I����*m�W����Iɖ;6�k6/ޠٵi�K��C�kt���>�Ֆѹ#��4[mp�%����h�'78I�7C������qjp�p��E +07'�s{f�-�6A� �|f�x�th&��l���d�8��
s�Rũ���{��(����/����]�g�������|�<R���x�Ϟ��g�Œ�Ybv����B�ٿ�����U�����OV��Gs�
�\��[���l�~�Z_vq��>QW|y�>�i����f��՚=[�k���K�c�Y���I�p�4:���a�L%�d~S���D�v/�so��X0J�N�����
7��57������n��ۤ���Bj��Txn6X|Z���vl<⤘�4�4uRY=��r����bV�DҒLi�G���Q�v��S��|��P3�N�y<s�Ш�J�Ɯ4������[K����\����G{�"�줬��X/��ݩ;��^n����o��]/�H%��B�:B�7;���!�ɤa͝�~�4���x�^��� ��J�
��"T���s���?����r�;�7W���Vr���W�'�W0���rr���̏C�ڑ:����\j���=�l�?Y��w�+�:h�f������FI%�3�M)��Ng�r�����k������GZ����>�V4�����[+���OҸ���Q��f�B���*]���l=n�]_!6��o��I�{�f8�N��r���p�0��>��ҍo}�G�ӌ�>+7~�q���>��,]}��� +��&���Z8��~���g��]�yb�f�m}D��������r�'�K���'wD.�g��>�ېnd��\�1f�c*F�!�q4��U��x��`��ta�����E���Ο��M7�����p�Ef���ʘb!�s����,�/D�+���qRJ���~t��꣄��BB��_;Z������,��nq@�Hs1�� �\�.\�7ۡ�!�uN#VQ�s�?]��x����!1�`$4\�3�=WՋ_�3_�P#@3��*?=_,�t�����Jhπ
³:�?��+w�/{uݯ6a�@�L&6{���:y���.���,pw�Y-�� �t`&l\d���� +F���e�u0���ӟ�M��l
������|Z>�E�ia�vЊ��br��0q�p�����ä��ˡKM%���U
ߴ������Q(�0�B�)�o-j�x��f��Ģ3�gQW�FZB۟;\b�@.�j�.2���<;1����2Gz�)����V���4�I&��'p��{�%�␉q�2)1o��Z:��x_�B�[.==zu,���4��gB��"ҌJ�t��!�>�=_o_�X��6�]��K�����;B�b�������Xf�R��`��x��S�0��o�Ġ�a�!bf�D>�t��O1�ut�<��
5'����Q<�d
0� +�"V�����&���x+�n�>��f�r3}@��_9ZN���H�H�V~f�x��6�۷A7Q��j��u�Tmi�U_Zf'�}�'���x�V�ϙF҆lxo֨���Ո��/ʟ��jx� +�~̗�Z��,>vNb+G�Wŧ5�C��_�o�}�~͆y�5���h��t�hWV�����ri�C*!������A����/��?�g���������*'���<�@�6�G?[c8�l8�R�+/-&���������}���!y���=|��9w�'Kk������Հ;��z0��i�{]��E┱<@L�e1=�lN>0���īd�M(O���Yʱ�� +F��l-e�L� +)�NBD��> � +�)����1�K/��lM,��.g�p��֗�'��A�W`�����1�zW�N�"�L~�p������h��եc1�-��BR�b�tLU���'=)�9�.�{�Q�x)�����7W�.e��=s�s���b�.����\��mRF�N�N`��۟m����������3���xm�����$j��B;.4��[�4炒��p\�D+WO��<;5���lX�V����ͼ��-��:G�ș�BB�h��CK�8��jF-�}��3��P4�}">����y�<hI]�vB��|Sl�}ǗI����~���)\�7�����0wg��o^�{_��7�] +?�w�^�o���+��UN�N� Lf��9�9U���C˛4���GH�I6�_�i�3(�~�������e�k!(� +�`��O6��m�Y5�r�����]�o���S7Y-�����bh�-mP�k��� +����-�s^�6S�>��Aq�g7�����{_��Sѩ�bH���e˱��e���R�%|��rݽuЊG
��4h���%�)�7bF�$1�k2��U�.��^m����k�z����t��y+X�Jr����=Z����y�9�S)�(��P<��Z��]r�7n��Ǟ���J�#w�'���T�k�fȮ���]Y)v}�Cn�����:��Xn#��`�n��E�:���w<�"��.��� +� +���:b��W8���s\���~������c��#/�8P�3���]9JT�-��4��;���p�g^{��;��'h2z*�,��8�B|�(褋%��7��]z)(��'��cv��1��T�`�A�q3��4z��z����ۂ7���+ҟ,91G9��&�����Bs���~e��T�5Z�����H�s��/Z��0bڰ��{�Q�}����F���.��W^b��E|B�=4�Ÿ|���Y�ʲCn�ރ����g�� 'g��=��A��`챘1 +�||�O.�'�
9����:&�v]�ӝ�·Q��� +g��
�_�֛��r��z+�������5#t~�M���脢'B���,���VC�B�w���wB���Z9^�?l�u���Zse����E|��3�XP:��[>� +G.��#�F���P��_�䝜�䜚A���S�+@����q
a[:)�\>ؿ��x�����Zzu1�_�h���� �`^����Pw��9����z[�k�������]-��:��CB��s�/�J��I��n�1t<q��z��]�<�w��2v����E���`������B��B�]VS]�/�]\��?�n�q/������{���������T��h���N>�9�Ӊ�S���w`w�=�w�{��M�w7�Z�塾foxs��<!(� +q��Y1��JA��!�6Xwj\�H���Ah�B���Y�u?ګ�x���8������1`gʷ��'X�-���-�b�9��
Q��;0NHS�`��D��9#HS���l��`@$���c�W�X!�qt�q�f�$T����r +�:���I����K��.;1�+u�'rd�e �,g�,��CLZ��jy��tf�|��5^w��%Ь�y4��F�ژ��)��0�e� +�jط�l5�x��H�\��{n~m�<�n�y��<�Fw�����;��������k1
M5�m���;]�d���>4u�_�n�w�̓�5Ӄ��j�\��z�rZ�$�?����Tk��k��*f'��a=\0�X쉅��즩��Z�
k��ŅB��]����cy�2��{��5�w�#v�NR�����!&zz5��,��#>S���l!�6J`�09(e8|4X�ħ�j���4M���Rl�w���t��:0~H�>��y��r}���7�)��(�g���e���h�ޠW +-n)��Q`�|3���rR� +'����/�����L�,#��}�-_� Uc�k�]h���+�����,�q�1�f"�;d��a��b��I���Co�_��:^-� �mb�!�h|�����>ŧ*����3�`K����#�� Y�c�ƣ�؉��|k�r����k V"��b�� +�y��<pVR�1;K/H�,f��O��re�}��n�/�&�� O��
ɷ�Q�����H?��b>Y.�
"j�;��V���-�*I
����`T�]_�F��}�T��&>���B��b$��#�m����#�=�Y�uo�1�q�!,��7�a�O:�����덧�(��+/��-�;�����r-;Kl�b#��2��βp�ZT�̥�����&6��!bg�O;+���2�+;+�
;+a��b����TYގ���충��9 X`��b�>&��@�gu�̞�j��f�R!g ��_qe}��������l�]K%"ێ�d!����Vқ&�G?\%�������&�9�`�/��j5�"��~��]��g5y`�0������˩�N�#"��~��E�i.��?�'J���W6�����U�A�-�$2\7Q-��/�,n��'%��ZFN�%��[q}/\���������d�쬤��Y�6Fbg�Y���\������������^�!�~�Zuj�OA�l��<�[S=�vt鱷|��x,�KCZ����a��Z�r���ŖO7˝v�n��[<��p>�j�Ng�/���Jh��ܣZzy1��j�������1���14͖�kS���6#�X-k�K��Y���l���wWN���d����e�'Yq!y�߰��_s��J%]s�ʳK�ܚ��s[���Ӌ��wWJ/,�R����bX��r:�ţ�V���&nLQ�3~�C����rÑ�լ���� +�0��-p���Ď����F{�` ��2��8A��u"�sx.���ri�,�_�]�}�ᚊE��bX��N4���#vR�M��J'�=��[{�L�O�6D;��5��L +8?bݵed�`ˤS,�+�~��)��y��Ԟ'�~�e��Op�<��dN���������=�2l�/%Կ��o�l-�Y���}���`g��g`�C*�)euO���@=����V�Y��>�{�{b��|;K>��������oe1ߐ�<�rM���lA>,��Z�eﻸk�\�=�X�sԆk���'�-�\�F�X} +�]���쎩`nȅ31cB}���D�+��Q��rL��aĀa��T�[��b�G�ڋI��#S�.���=��g&�߈�"�q`Ả%��w| +��4�R����TՐ\>���� ��X�f5�}�� /*�rٵ��<��>����t���/.FOC��j���(v?�!�DZ굲�WĨɮ�D�/pސ�E䏠~¿��Ć;��n�m�"�^[�|\��h�w}P�����bR�8�Ҕ��Y���c�x��U�1l# k��61����Y���=
�@� 8�C�ڋK��똍m��P�B=���;�
W���=�����bkT�d�|��m��G<�;w���F��Þ�Z~m)��L�)�}���Ih�����>2<�z��`��^3|���>��K�ص/陃�nRp�p���\����nTR��錡�˩�a������6�C��z��4:�Q#�C~��%���%X=9L�̈����R�3|+�_"&Qō����׀9��9�Z�(18� +�-\O��eb�E��#F�!�6�!�e�+E����z��j��zۘ%�k�ƞ1�Ä]_[����!���o�ƻ�ܒ���\C��%�{���7�Ǖ�2
�k����K��{9$�F<k�$֍Ź��7�s_+J�מb�M��A���W���o�Z?ߪ��#�9��,磜����/�Pr�OK<zs��b'�����b��f��(&��Y?�\JI.MyJ��I��vg�b��o���;z}�8��uJ�9��Taq�|^Q;ΰ�#n�7�)F�u/V��/����-��Oh%�X*�����3q��>0 +X�Qv�_�����A`m�
�v|�l�G�d�2��j�/A>B�j0��f����;�/'O�g�.�s��C���9|Nj�|ۣM�yJ9�%�UB������~�=ҁ��zb}%�:���q���|��������]�~�E���z���J��Ib���֘�o�2��я�����M9r�4�#��?��I.���'[�
�-PK�[��L81��ř��2�?e��*���6N���ƫ+Ď϶J���>���a�)��q�X,+�s�Z>^��O�5���'c�I���|͙�\ǧ���r�?X�YT1<�|L1"�F)�C|8�!��)���k�&V��6�G��>�C�.�M��k���_��R�S����Jb�9�����)��c5��y�F�K{�k5�:N�<� �]\w�I�o���J�)6d�`L�k��uL�Y92�VE<o��� +xZ�qfK-읅�XWx�/V���C���<����e�t�,��j'ǜ(��|���0Lg� �bf1�U�>�ܢG�Z:�XM��YA�W�LX�5.�\3�#�O��#�X�賳5�$�k����'ȋ`��Z%4���9����Z����>�'~(����O�T<��JYN>���� +n"�8/��E9���W���i�*.,!&8{�ґΙd��������kĤ'�s��p���XO�� +��'\{�ۭ�K�yH'�;
�r�����1���ݻ9���8���#Q���i]_]�_oooooooooooooooooooooooooooooooooooooooo�??�����/��^�g?��u������X{�9>�\b�v��DžDE��&;oė��9�]�����K��Y�b���M��]\ٿ�3ط8/f?�|����˴�~���M�ՙ}��36$8$�}Q��h��M��~ɺ
�V,]�b����W�Z�z�u����KW-_��_��/������������%��/��/9d/�G�{�op���Y�;��ǘ�Ş������d����~p����~ٮ�����$wg��^q^�Lo���?^�:�W-_�v���y��ڕ���oO`?��I�Z:����������̡W�[��y���k�ً���\��4��]���l���AsO�������g��>wY�g�V��h��Cf��,k�9�2��A��ڀ+/5�|���f��}�=�ƃ3�0Ƙ{�������].ޚ}{�4�@�22�������"rm������)V�Z�σ�>���,���ô�I���>��ݼ
�w�4�����Z��l��Q߿ߗ~�[ +1ヒ�!ebH��"cv�4��cԕdz�s�0�L�-��Gc���8z�qLC~�t��`�?c�`<�'�i����˪��1��29"Ö$(�g%4�F��DI�x�I�4 ~#H����A�����X����!I"Dgؑ4B`��#żьS��!Gi! � +#��c�!���$
�n!�V��8
o�ǒ�$���t�KBBU��5���D�ㇱ��b��W�WKO.0dwO�(��b&��[AZ��{���l�߃�P\��#�I�(�}��70C�l�$�9�qU��c��Z'!8{��!���Rt����8>����dM�h�&�>> �L8>O��!����f�K��G�2�CF2̞�Af^Z?3w/U�%F�p�s<�_� +�ݞ�/���荡��t��i0>-���c�v@����9��V�dk9�r�W=Z�(��́h�6�Y���s� i^_3H�u@�H�`)�-��$k54���5B�/�Y����Վ�qs={��5�+I5NjF�dCN�3��N�g$9��R'؏�hÇ$Z��-�����@�"��������jCf�D���lG�L��HI��Ә�I��e:l�'�n�1&���dgH*s�dI2�u�d��w� +�}B,�H+��˲c3G`�Ҙql +�|�<%(Æ$���N�ȕ�T�$�g� +�[C��Fq������b`�$�$f E�12o(=�H���Ԑxt��i'Fe���1�9"��И^r�8s��T�����������6c�Q�4IE1y#tv/�=��q�g���̄���"�mi�$��ѐ�>]�/%�&�Q����F�xA�VRz�d)"��K4߳ݍ��=��֛!�R+G[��0v/�,9���C�x�wф�1FZ�dL`"[��f^�Q�U�>ȵ���0~#D��~�`�-���2{Y���H��6:C��d)0�����A��O(F�L�Ր��HK�����h����O���k�&Ռ5Ė;��vjX�
FQ�)��$�:�Xc�UJ��Q1Hf`T��[Bc��@�<I�Nj\�#FIJ/�a,ݧ�� r��eu�(6FQ�dv]!A�|/�EE�����49�@%)����t��g� ���il��d�31*���Tv�İ��;���Gct�Ə1Z��7�=4�_4���eCB�5�x��m?��E�X��i�4:Jc�G�� +N��ZS�fC��4�78��� +���Y�S �c��E�1Y#��)5�q碞� +F�0��0QN�K��ϴ%lI
�NŨ��Q;^����
YW�UH��Fv/a��a>� y +18� +�n���]���Ը��j ��-��5�5z�=��$�?�Jo2��!ف�a��f�_�a��gwO��[0S���,���oC^6��&Ya�k#R4���^s�H�/�`��P1rC�Ձ�W�Y?�]{5�n�`l&8ǖ<ɠ��K2��G�a)��HPb�G�7BjTM��H�Z�9c���-9��'��4���4�<���ӆ�|Xb
���Ҩ4�ojڱ����c�Z�;��S!)����Q�/,�oRKNχ/2$�8B +K����-��[�!��a4UM-�.-'�ɐA� +�9�N��$� +˅��l;���|�Wl�(\K>��Ƌ�����c,�~���f ��%f�o���Zht�����_���JQgA���#�//�,6��2U�k�W�Gb���V>H�QH�����y@��SH�#����_L�H��'fB^� +��AՂ�YRt�|*d��7h�<~���j +�����M�������z�����f�\�������P@֜�<7�dX��;X;�(�L��l���⭰�HJ��M���X��n��Qd�V���C[&���|b�֣t�>q���G��+�����$!����dk��c`�`���Q@G�:ct�K�j���$�xm���ps���Ps���C}�g���g!&�\�F)�����Rl�H�'e����f�E[�b,).Ʌ$[C�2�ZV��d��-ћ"��x�xK/��J���`�z����'��$��t)$}8$� �V��{�<��� ��g�i}��eVO�:mqӟ��u��n�&���S��c-�%�7����R�+��JG. � +=�R`
�1�#�7�άC���ǧ@FИ�r���jT�-�O5�d� S o�5E���Y�d
9�NYn )��q�����*��ǒ�e1��
`��g���gK5W��$�\0�������~�'�|����"YP�v�.���dd���@מ��y|'�5��-�p����Ŕ8��R�Q�� ��x�2ڧ��4�q �B>?��j�
H�5�p��c���$�ւ�z�Y\p���}��&[�~Vִ~�����^ +2�²m�%�S������Ȑq��D�ql-
�4�p(c8��joV�x�|4��J���������YC:�:��9%��|���R�����-i�1��%|'��,)�Q�/�2} +{��rzJe��'cv�t��ߐ +f��05���[A��i��ɇB��T�9B��P���S���:U�k��<=C5�j�!��$��Q;��咞Y|��-�>J,�~&�?5�PJ� ���{_�����Ax��O�K5wWB�P+�X�
�>X"���O�I���қ& ?B҆Cv\h�b��|+I����1Y�h7�G�-��� �=�.w<�)��w�\�I��ŕ��)�KI����K@���:S~�>��+����Kţ��u��k�ˀ]pכ�ufWXS��`u?Iȇ&G����d���hm2�G��)��Afud�ѷC��d��?�5$� A$��Sn-GW��_F���0d�a��q�c*G}��ͥ�L9��(% s8l��C
��W�f�v�ߙ^7A-=g��@�r���Q��H�$.o$���O�Z?Yǝ���/��_��ca^j�9����F�kE�X��OP~����)��G�ȩ�O����I�E_R�2z}�襰|���!Bo��b*���cLrC,e~�j�������}��C��e�@�1�ɓ�$Q�L�5B>�bj������#��_GA��6e +{����.Bۓ�|Ǔ-R�G�Hn%�Qh�d�L�k�/��B$��6�裆����[�����HR,,�V8e�z]D��8��&�����S.�\7���7ȵ�C�#c�F*�ͦz=�t���E����\|~�Psk�\ze��xl��4�'�{m��f��.�6j��q����&��@2���Y
�����`O�P��{��n�~
� +�/��gQ��[p�0Hq�6e��~GB��7���ݯ\~f����7H)(k���r�Ö����Վ�[��㐥��{S*�C����2�g^�H��'z�^�m$���������:��ߒ���^�G���F�9-S咡9�v^@us&�& �1�c@�_S~f!jz���b�D���ub�{�� +�����Q<��C)�H���g�)8a�O^�L����+#�^�'DW: ��w�D��;��9��3�4Ւ,�C��3��Օ,fC:M��X +߉�����F�ې4?��s�y�Kl� +�T���2�GDd�!�'�BL�(c8[�"��n#$D�Tq���?���0h��T
��s� ��f�<��ߑ���{3�AB�7�Z���Ppz��r)=RV��?8�p,'E&�}�I�����,䏥�k��G뀍2�]wLE����w�|{f�Q�B����Do���A�K�=7 @�g�|�w."�mI>��C��Og%�'B�/F������a}`���.��m����9��|H�0`!p@�֮��<Ѝ�'���( �'@M���5�}Q���,�[lV�o,%� +9p3|�I#�HP�M��w�5ҡ��F�7����䡤�ߴ��iE����p��p���J���QnQ}����f��9������J��ݵ�3!��{ +� ���$7Z=��Q�[���J��WWH_�A�~{(�d��K�f+=�����o=����p�������\��BB�_l $��q����G�D��L �P��.l�� +!!rMH�_��o��ւo����S��=a��{���l�X�I=�����G��L=:^-<7O��v���������JީYrF�da��=��Q��k�K8�>�[0��E�ԍE]��juԿ@x"�CM
Jn�* d�>!/+4|�F���E�AƝ���Ԫ!�{w{j\v�ո���xJ����S�|�
r��/GK�?cM�Dյ�8��[K���{W����?\���F���J'���Y�lȶ�8s���H�ߺ���b��"�w$D�p!!�.���W2�5[O<Ξ�\Ӑ�4ـ�P�����צ��`���X3���q梠o6|���O��� ��Θ�����;��)jQ�LH�n,O����_���-E����6��}���`�t��Z�q�$�ѻ�� �3-;� +��K�]��'��>�z�=`{������ݔ?�v=?�ƹ�`��s���k�߇4z���J��B�G+p`;�'��RQ����x�j$�����{Q�whO�䂵 T�Y*&w���=jM�K�|�r������R�_턽��|�m�~j�Y�W#3쌈#@����7�Vйb%�~ +�!c�g�p��ER�eWr�f`O�/aذG��v/qV>��yjL�H��ʴQ�X}j�Rsc���$� +�}|�j����T��Ǒ��G�[n��.�/}?�S�x��T���&����±��B`i��ov�)t>�&5|�V9ra�R88�����O���U`O{�����Y�J�B�Ӂ/G=�o�b�r|D�-^l�ld�Xx~pЄ��oc���i�$���՜["��1�P84�ߛ�*մ�sŶϷ���(w �_����`�N���߱vO]���9LZc�1[$y��S���?�AD���ӳpF +�/�D�3�Mg>P� ggu���YƊ+K���A�o�>��D+�Sa{C�Qଂ���L�ʁo�Pa�,�J�#D�
�32,��!�r�Ԍ��h��z���Ʃj٩�8�+ሜ����
�S}߷��Bd��1��;�>؈� $�ɷ�&��*>=��������8���4��*���W����u��Sn����R���V���u3s���cq&#b�O��;� �Q;������A�������؝�7B*��Ȅ�,��8pC��t���qvk������]��/�����|
�Y��J�氚a0.$��� +�� ���}TԔ��ӎ����c�
r] p��&c�{~bp*�}�c!<i8�m�윂=Z�>|���� 1��@w�Nb�e�tΠ�\��j�rF���Qy��o��<,2�Ne����D>�{��nE/���<�7*�,"tI.��g�X�E}����� +����[�Yc����cb��B��E�?`&���g�|/�壇��<CJ*M~�$�5�Fk�-'\ +�K����z��)ϭ83{ńgo�t|l�8/�~�b�������y���y��G���]��O6�q��y�:+��"���������ɄfIm��^[sh(���Fh�?�ΉP�̿��'P���u +}?,�N +-�:��c��(��}BMg���,�[��DY�g�Ef�r�)���S"�tMk?X)�r��c��7�1��gs A�����q@;�\�Tsg�����J�g�*n.�:��y�[a�8'��9��R���~��X9ru�M����@b�eW�H
���yXJ�x��sr�Q��0���r:��^��;����%�{v]� +��$@�
7V� +�wE�� bO���vM����3��˭B��5�oU� +Ŏ�A�QK/-��-�(0ӧ�y�m�7 +Gf����H+�w@�������q�X��\G�G�a�>^%$u��'HE�f ���P�^ +y'�s�Wgz�<]�u�v�o�����o�O��O��߂����u���_x��t���J�W��#}�K8�����<���L���A��֯�z��p�ͯ"|.>�7�=�Z�6t<�'v���|�&�W���b���v����o�S^��f�R~s)jE����ꉾ��}�����;�C�&`<�O��(���S<�t�I��J�n}{P��4X��M�r�[��m���&}�ۥ��j��߈"�����<�����՛��t�[A��g���+E��R5\}�{��ʵ��b�{��/ko�T��}O
�(���P��&i���z�@�XKK݁���-PA�R��+u���{�of�<�����w��z�k�4iʚ�{n����3�c�}�PG6GF�ٌ��q�W���i����s��mr�y
��f
M^i��3�ԑ��KkSC�Y`Yk����CDސ>q���3b���h����%K�g���S������у^�m�Ƃ.�~�,?l��v����|��,���XX���=�LPE���{�+;ω+k]�^�:�=-=!)���y��d>:7*�h;�l\����.�P��:���̨�.-������9E$A��5}��I���^t�ߔ.��ou�$���$�����
D9��Z��x���.�]E��v�2��E;P�"��yd�Qv��(�>�ٯ%���!L����v���C�����m�1����Í��p�e���I���9�ї��--��';�u3A<�&��,�i7뭒�z�"i����(&�|������˚/H_��tH�w��T�Y�*r2TvJ|�^��|��v� +��P�1<�~Z�Ck�tN�!��j���v����z)�7��nm +�]�N_\�f&z�xT��NX��苐x:,��u��������ģ!�~�mI��:J}�&�
&+�O�����϶x�����o��W_h���9Y�g/骼,�.�V���?�B"wTK�:�]�t��^A=����S�Z(2���֣E�tr��j#��>�:F�� ��}&��c�N!��jN?�2�o~5� +>S��0��[�=���CR��5U�oOU��!��N�5Β�=��#b�A�b�bP��� �
�{�4�͊l�8G����G�G[�=����[>;��=�7��x�'}" +�P��٨.C�i���(>��*~T����kх=ɻjG��/%ɍ:d����[�u�����>�ؓB����0ap� ��^Q���4�3�[wT���ٴ��ۢ���YQ���E�q��6�(�ۄ�U��:��q��և9�N���¤�]���o���gO��P�hE(��C�K_ ��%��:t���T��̕�lϊ�M����p��V>�x�-�����f��2�@G���-�h�q��iO���^�Zs�kbY#꒗��f�U��G������8��O,.ou2�(W���o��De�g$%�Β�:w���E���$��E���E���W=6ě^��fh�5v����ŵ���35�ҷW|?�a+��?��O�d谨�9@�W!����^���/��[C��.����*�0�*~��|�%>|t�G[%��"m�&�?��5N����A.�~3�z۸����&z�bc���A���^ZXc-)h1�ޯ�4-�3'u��'�س>�z�a#z�rR����I���q�%V��{8�'a��^uڈkj\E��^Ҷ���}%1G?��u^O=�{?�z�U�h�>P�Q �lp"^�Q坧��z/���1V�/�u�J�o�J:ל��Иw�5=�Xgn��HQ9:�'l��8����h�G|&RE�ym��A��1�� ߆b����"^�ǝd������]E2���`�g�V=���6a�ws�}FC��|)��e���) y���%��&K˞�qv]��εfg�v<L5m.Dq��ݎ��ZMD���ޔ;�5I_ל����$�;D��Pݭ>ǻr��%����U�#��k:�6J��]���C�k����� +�ػ����q���h��}���]�$õ������Wqdˈ3�c��~����#���$�~�3{�pV�����!,�|#?�n���7R�Yd��<�H��d���h���G��|٢�4V�[B��� �?� +��>������dM�9a÷#d_���'q��JW��_u�W��rF�p��P�1���ߏ�u\K̬�IH��M +i�����z�=#զ�~��KM��sg��+D��3Ī�a�䣝�q�C���?�����E���v�8?�K>\GE�lC�+��o���{����w`�ך���.*�� _����+~�igZS�#����s~�Ɣm���m���7aOG1Ic���R�=O��T��>4��V�8����7���5����y'4�fJ:�.M]g͇Ke�-���/�G���_���6�G߬�퍽TRRs9�|sB����j`���>I>1�<k9.y�b/yW�(~�bK�m'��&���A�Qƙ��{ɮ=?�t��t���4��[钞� ���1~��$�X�ߏr�3<㗌7�o��ǽ��N���8���qdǀ+Y�{���>�g[�6���Ht�AJ�V�6kyd�u'ɪ�I�Ѯ���ڲ�]Ze����n��1a�1ת�dw�b��"+[�K�.DDU48E��;ET�k��**\�T��\��
�L�o�J0~!i��{"Ú�8%x������w� ȇ�"ѣ:�#����-��%�{����A2�F�vP��$Í��OՑ�Ȁ��;H:\e6X+#;z��`�>`��
ǥm�$�uf��e>
��!͗3϶�\��}', ���p�� �p߭x玘��z���un��F����N���cQ�sdQ�s�:טB8�2k�㲫��ҫ}�jC��ކs+�U�F��h��FD���{}��w���*�|�ZJBͻ�bD�[O sG��+CZ��6��Q���]�����W_,%
��!5�����L��]�y�� �y�0��dPD����kM�8�y+�l��¢x��������¸mq�)�^� ����9������۶� ٷ-4ů981��Kv��-�n1��8��r��,�L|V�WP�!K��=ڝ+��Bw�H��.�o����N��'qu�+����Ю�オ��}�#��"���B��S��/�7����=�SXU`rbI@|v�_�[S,����Ț�iG��#����c��X�����v�w2#�B�C����;o]��-��Z�/��Ug}#��qBǫZ�����1��^1w\cJZ��2[���$��{�[����3���O�f�O���bCj/'$W��^+�u���?՜{�9#�h{�L:�.ܲ��L2�!��*i���b����!��k˶���m9�'�sS(H�|k5�,���}�ՙ��}�;�s;�r�̤�9f�>z��P�r��^�wsL�iS�E�kƐ��m'��"�s�2�=m'�m�I��"|���Xo^bd�obR�O�M�-�ɯ�Y�^��h�3�!�6fH�Q���+s��s��V�O}��Ǿ|�0�`�F�m�x�]��+qY������wS��c3b�/�^��I�К�)�
��[���nQS��d�%�t˕4Ϻ����)7�}����qjN�>�y�t�:ڲ�8ަ�0��=-3�)(ӫ!:�xWN�[�E��ǝ�o���:ڦ�A�]Wn�C{bbB�Ob@Sp +��=����|s�72���cxot�Qd�l�����e���� �/�a�j���|d0��n���*Cb�ڮ���܈!�G�����O�0��Z{<l�����R��*w�)|�w�7�����{OYv�_�u/��C%�(��'>-���-s�ʅ>���9b��1�#<J���k +N���S���|g��w��#���|�Ya�Klx[@��{U��{m����d��_�3���G����? �ݚ`�ރ`�M�u�ؼ� +a^�Y���> 1��'.�
����(������Ǣ����Wп=ku����y��)���r�8����l������,U��Y`>Ps�>_;n.�4w��}�����Ga�~��>�s�o��f�i�s�l��`���`��F�t�v�f������kf�`��1����s�{Ɗ~��ެ�T���/���{��2�跕.QOK�cҪ}��+/Ն���F���H�͎��,��bBt��x���2����Р�kkTBC�����p8���C>-W/���z�7�
��L3��;�0�t�A������a��k�дR�o�/���^�Z�0L�$0L��T��*�+��U�M�L�A�(���'i$�.�icty_��_g�����`�u�W�� ����p+�b]hR���ج�~���|e�/�^+��{\�!{S�}��'�c��w��7Ş����љU>q�5I���L�}�.�_�΄�Ɉ���;�١��F��Yn�^-�j�b�~�j�m~J^�?o���ڶV,Z��)`��"{W��R�w9 ��ϊ�I���o��?)��M����׀�[E`,���*��%>���
�ſ
��/��X|).��?��[�ػE>�/�z����y��;� +����/��[��'E> OJ<��zƿ|���O��"�؈�@�wMdBxe`|X���k5��v�ݬ�I���e��fvjܞ�asA~�Ɲ`��T�dzg�ڜ<�� +�����چ��8�?��{?���6�'B�:�ӕ��y����}��N�,y�fF���n��(4��;&�,(�xǵXT۷dơ�Օ0��
��b�m��e���r��j��778E��u�"S�-� +e0�k���`���߾W��?����P{�|�g�ǰ=3��x���ޟ��R������7k�V�v�1���m%���a?�d�q/�tmv���e�O�d�6���{�7�1l.�Ji{��V��P����W<�ϸ'��q)%q���d��̜��έ��/������?�P���9�c�}����c��v�d��Qw�ĩr�1�?36�-�.������?�����o�S���dT�y�=/�N|P��Q�/s���E�OMX,���Z_�U���J�pݪ��v;~zC���iL��|o|w"�O��
f*, +0Uq9���L�̞�֪y��G�(i�e6Q�o=`�"�� +}e#�נ��*���en����17a���g�������r���V����|%���x���d�P�Tǭ +�}��|����_�.��,��:P�}e��+{��#���-���#�]���Ω +�o��_~��)h�T��銪�pQ��S~�%��L��@e�z�2~�1i+�=�X��~:�`+�.��Δ��?��cI���H|{��Ť�"�Īb���w�)���Ş���y%�-��}��R�8�z\��L���X�I��n�_~�� �g���q����ipU����p��l�gms��Vh��x`�2���T�i��K���U$�` ��wLV�lx��",��[�]�}\�%��Y\B��������/0+/w�m|����#�Qf��s,\~ٶ�0�N��ۅ��8�3(�����sp��L3�g�9V�9�7�y��$`��`�vx�֊���8���q�LUm0w���&~<���8Y���b�-[�^���My[��/���oJ�[��ߔ��>Tx$�Ը%7�$�4��6Tx�����#Y����3t�S�m���Ϙ�����&�w��Yc�yW�9��U��7���o��o������3T�m����_&K7ف5�`��]�=�}���՚e�N�G��ᦼ@��>�X��;��S}�[lW�G2�sݍ�Y]u]ͮ��+=`-���X�N�߶͟m���x�,?(+� + �+8�f(,��-S�N����e`���m[��9;�}j@�䀹[�����`��;X� k�d�O[,����u�Z%��,;�X���.::�]hL9̽�`��{�=�1���=���=���=���-��g������̾9S������|C�E� +�@u�ئ��g��'È=��{������±�� ���`ެ�`�R,�v�<���x�Z^`��3X�},�v��1`���=��S՟0k�����Ǚ��Pߢ��g/��=�Ooz�]T��j����s�ɉŰNh�re�!E_]T�ì�3gӿ��\�0z)�X6q1��ˀ��R��A���ڦ +�ϐ�۷̞��L\}#<���f@��� +���DN��1����������x8Z�\��p{�PXT�nb�Ju��AC0���p3 } +�[n +6�`��g +[#{&�~���fԴ>0��QƆ;�����ߊ�kʉ��cך����Rbڛˉ'��R��b�c2��.D�8G&����
1��S�k�ư����i@��ٜ"��r�/g(-�9�|8U��:�S6�9K�25��z�x rh���"�g�j�O�=fV�O�ۜ��A��}��xUM�s��A��50k52&��ӼO�I�KI��У�ӭ�2Tϡ�嚏Q�Z����=���5���-v��3���# ����Y��|����m��3�#�D����y`��`�:C�A�X�;�U6Q`���
���l
*�����M�(nr��#�j��I;�'�p/�өh�^��ɚ��
���~���2���YZ��*�FFװ�u1"�6��2��bPڕsg�ڨ.��ƚ +l��z�"�$�ێ]W��0e�@�%�Zf�f-���}!M�w��(l���X�=vוxUN9ء���u����V������:P_J|
�Z/�b�Ql�j^D�j��<�������#��?8��iP��0=�nN=�lNJ���m�o;N��8%���8Da�����z�i���\+X����3�v+u���?X�wl<`�m�����`�j�~'
vb!r��>��B�ͬ�/թc���A����æ�f��s�E��oN��?\;J/����}�
o0ۍ+��!�5���e�$���F}���|o��*N��;�hq�3a폣To��o]DjM����x���%K���RUm0����Se�r0o�N�b� تkva~`��OU�]:]��V���1�gD��za�ָ���������?ڜ8�3Gu�3\����;#1��X������3�з�
�b��ڄ�1*fU�'���<���g��X��=w϶f�뾓�����b�8�'��yY�v�K��|�>�N��nS�-T�Vn�<��e�ZiwP����*���z���W���cm�k�1{5��m���������Y~�gLb��̫>,F4����@��y���}�lbt�m�9��9%��U��>�����CF�czL^c�n`��
�>Jt#�ժND��"r�2_|"j:��`���!�`����K��Z"p�Q5� �~+̛������m*�<�XSW��;h��4M~X� +��>��ł�������s>1ֆ-�42�����c^3c)a\Lz���*��`�x��
<�����킚߭��/�GƉ��3��c'/�p1?�q��Y�x4J *�`�/�c�/wwLDJŒ�W��!��^s*m�]��}��|�F��� +��W�r+r�>�l���*���- +0���V����9����/��Z��A�_���W��._�� �1�?j�Ïhr����^�&&KFO�[}%��ԃ1v!m���!������ɕ�yO���K.��?4�&m�r�u��CaB��G�l�?}�8(k%�X��4�����p6�,�h<Av���N>��{K��!����l�$�}������?��XΚ�,\��ڃ�����Ǭ�`X_Akt#e��м������Y�+��=-0� +3��8�2��;c%_q� +y��c����{���ѱf.����Ģ���MG��=� ���l�T����!#���c�� K�1�%K��h�}:d�˭Df���fE������Ʈ�v�z�Ap��^<jM4:p{+�FC�r���� +���*�?���q,����S������~�@����kq<�R������5^B�f^�������Iޏ�&�I���W��[��B=]`q����3��.�E��L�~�&�wيkj��~���b ����0��J�[�2ym%~���^��b����ڂ�W+�ٳ���c�JB��J쾗�>�ٓ�S�EM�؋�W���x7kt''uh��׃Y�bO���R������R
s��"JN#�AU��٠��9�[����g��{6v���,���%&!�x1��s��s�� +�^��\2g� *�s�l������|�D�d=-}��� ��x����\^(5�'|�� ���n��ݎ'<�&Ly��6�E�����4{]���%�w�<oDW���ie��e��ӊ2OIQ�9��Qm��s���u�4��7g���sZ(�߇����q��u���\��Y<M��9d0�����>���7ir���y$�09����0��Z�/c��� �I�)h��
tv�5m@��ؽB,;�'w��S�l�+ +V�6g=T,NyN��������C��ҏ�Ͱ�|,��.?���b�,8q���������O��&L����w#~|��B�*v�u<�3S�ٲ��1b�����jv�ެ�f���=`txw�C��{�n�}��uf��[f��0�1���2�͌�Q)c�y���1�%ch�t��I�1K{�� +��`��E@s�.`�� +�]���d.7��[��I|��=�T^��yA���bA�g-�{�,���Ba�Gu��l��"82Ix�uIQ�Y�`�`��\HQE����7�b>)sq�����e������Z&��$Un�^������Ss��kR�7�I��H������_����S�]��0��$vn�&�/��:FN���r�;��]+V��w#8�p[�qh/b�IU��~� ����k��i����o� +��!},���+y�=�rϘG�&C�<����C��a-�m���]�I��g>��7-A�G5A�M�� +]A�ӕ�)y������"?*��WοM@
�#�C�4aN��7�T13����W�:���=�Fg��ᙕ�¬���=Ā�ޮ�������� ��٤_�"��폧._Y��<��^��h�K>�z-͢��Gtm�C�<_O\~��:�A<�����7?�b��xh�*�-r�8��6�xg7�t�隊����vB�P����xVrB�8e���)j�t� +� �M��־C@k�~`l�e9�\��&9���✺4Md}\ �mE�/�SwKr�{ +}�m�3L��I�X��tH��7�.i�0��-��au���R����Ǡ��tY�:$��Oڨ��M�O��9B��������&��h�|�6����I������K�~7\�g +OLD�b���x"���C[��>X��������+�0��a\ ����xR�^2�]q�ψ� ����:ho�\��ڪ��k���8�)�W�|�|� +~>l:~A6C�| �~���au��a��OJ<��ͨ���a���鰈�WM���1e.�3;���oṟ�%O���V����W�/%���1n��庂�`��r�n�"�8���o{a���1&��1��c�s���� ��w�e�ذ��S{ω|sy+蓎��Y�([���IE��q<b%�y-<�1Q�k�$�ǝB��M{��}��kH��N�E��MZ�'�6�%O�m��E���<K\�E{�(��K Y�."���b�b<��f"���'���}Q�Ǖm2q�U�{_��y�Lp6q��6����wj��z��o%��Y��߾rX6aX>Y��6��ʯL�җ�"�nB{�$�n�k�䯡�N*�4 ��Y!��8�?M�=��}���xP�Q������j� +>�Swp�ՎHG�84�.�QO7b)M����}�A=v���YM\�����A��4!�u +���{�ɷ����>�Ľ�o��q��\����tԹ��8��^����p�칈��x����w����DO������G�ۍh� +�7bH�{��N�M"�2a<����Y��짏+\��U�#2�5�=���\<�_��m�����h��0�m�0��~��:��jYt�7�|X*�2z��~?��>t����T�I��D��U
��&�fb!wVb��Ve���Y�{y7�� �u9�`۪�`Ì�`��M`���СC@߈����c +p���z<��<� t�VF�A�_�m�ZD�?������`��~\���Tf�!<�]1�1{��Dp�r�zGr�F�l��YFy&�EL,�F�P��IBv��[\,�6��E� Ó���>��#���W� RJ��M�]V�[���C_��V��e�2��+���g�ģO���x�1��)���c�l�6-\ ����jF�o + +��b_lƣ�n$�������� +8DA?��E�tw�e���y���"v,p� �m�������z3g%��C�G���8�=}X��o܉�1a^��82?8��w�ؑ�߭e�=���G��{��J�L%j�����e�I�M��`�D�P����_�h
ڛ���o�-��_5�i����ӄ>��9��yÚ(߁��)����X`�ç�КWl%�rZ+��3w�YsM̜5������C���]�G���R^h
kK{�I�����ӊH��e�X9*�N13��'��q]��ѳć�ƙv/���%���K����I��� �1p�U<0w)��r��hP's;�>W*��j�ijZ5D7ĝ6� wP��&�x����h;B��� +r[��K9�HϘ�X�ݵ�[�������ba���h�*p���9�(c����Cjxl�va���G����K��T448`���@�@:�H�K ��0����,�����$�;�E�T�.��$�69ݺXV���oe�2��KX��<�DF<و�����Q[p�W��J�G\��A��^��6p���K�*���g���sփ�a.�{u�0�eI:���O���O�Ndy;A�V��ӱîck}��G�*��1h�4��QA��!�6����L0+9�� {�N�L�<���"���%�5��]���rF����K�W"�;��]Z����Cx�O�5�ףK�t�B�q��x�A �
k��!��w۰;C�حO��ز��{���&t�S�C���l?�r,�~�?�x��)ùfa��]�PAk¬���dv�w��.
� `dH�l�4�R�RĦ�|����E�����Xp�m����"������k�"���䭥"�mEl��d�^Y�{�ei�X!H*�&�j���^"��2��n<�r}��@��(���t�+��D�~��C=�6���]�e����~h��y�K'�A��\�=n6��ۉ�Fh/.~��=o��.�RB��IDF�&�ӫ��b�W�\a`�r�C�2�Eu4�f�)@|�����c�vK� +��j=\��BLy�����P��>(=L�j .aq�0
1���C�k��m�%4�B�XtH��8��S�^��ga}AB_A��fQ��3��Y���§�Ĺ��� �I�)��8��H醰:���S���������ǃ�I_�j��:'�t�C�xH�i3!���71\���F��V��n����(@5bF���!|c5y1}1b=��[{i��N��G���Q]Af�>4gÌB�3�='Q>�Pނ]�?D��Z�twM`-�j2�D^[�l14���9| � ��.<�8Fx�c�mu���U�%�>��Lh�Y:(Ѿ)Gq��^���'l�t
)`L����X��C�銛�VD,��g_[ƲT�㥼�t`� +:��:��tg�r�)r�GW|�������ዳ�w˭��}�Gǚ��F����%]�̻�"�^9�*߮'Ѿ|�� �=�(�5�0�|� k��0��*�Q�qZ<��n�k�tb��)�IFH�XrR�gqVѐk ��% -�� ��U�Ӥ�C,;��DĊB�%��O:E���:�Eq[r�Zjq���x3��!���zQ0�'�~�~�K�,C{"���6��*&bk9��7��8��j�� E����\���ع�i��g�L$���sR�o�9q�𰣒�1��B + N2��� �X��G��`��q�4�P�>S��*�ˈڅtP���� +��`���Ⱥ���nˌr��8���!�j>��X-X���jʻ���8৽' �l0��?uc�JaJ�n�1~Wd'oBB�HXˑ6�cQ!����Sy�v����ʎ��yfbvT��l�d.@1�(
p�SJH��)�hϨ9H�s�Ê۹�G�d<��<��V.c�s�Ӊ�.c�1�SD!V�{�*xu9���7��ҨGdT�S���̻�{�f'��_oZ<s���3'ӛ5R�
�z����7�Q,���[�%'�>=T�#�+af}�Q�1������Щh� +wI��j#����~#�g�n��f�V�{}X�j��`.
sH�-�����!&7�O#~)b��g��ay���6��� +�@�m�c�vHn6Ғ��zo=�.�K^�_�1�w��O�L�0:���+ظ���\gcG�*�� +��)!��!���D6��%���Î:�a���2g���`~�b���cc�c� +b��}�z3���������JGZ]#��q��T�|� +�a���@|��j�'��9cl��jt��x��zR�t+�K�;sω���dz��E9�,�U�rK��=i�S[�`��usB�־�����H���M���O$ ��OĎz�7���l��`�Q_8*�s)X�h�]+w�=vm
�崐�W�����7���'�TYa�@e�[$��̹@�'V�
�Eף����BTF�b1����$aZ�^���bМx�I�%w�E�c�}�87�
a�el�d�xv��0��F�'uu�@O���;�a3����4����wl������G,o�}�ue~<f~N�e�CH%�֤#mBvMUB|02�d�V���_�{�,6�J(ލg��G:��yb��%H@\����=��z>�ӫK��8Ehq\��9HY* +�[�tɜA"oА���m,�)��r�6`y�c���JS�O6��-���]��t�И��4�&"�}�e5O��!�R���|=��F*�C���ҕd�I2�����HQ�:���\�X�����g@|c�+{�s=XKƖ���>���$Y�\��Z��J�!�'¹�Q䓴P�9WU���(ӤS+��m�bs2��W��X������41�dΰ!�7h��-�:)�A��ظ��K�W���#��ĥ��C�2f2;�<�K��i8��S�;!vXi�#�ު�8�l����'nm��4*�Q/w�h�B�YmZ8�Q_��k�ȸ��iϸ��#O���®w�����k����|!��3�%���럵����������!q.d⤓� +V!߀����9�d�;_ꙶX�� +� +�Y���wע>D�%�N�#]>d��zmij��8��z�� +)k9�\�@qi^!����B��φ+#�%��1H�P� +�+��P�d#⨣�P�h[y�������T���t�$�A�4��������l��b˶��ni�;O�<�G��B�_I���5U�j2���j���I������G�7F������M�T��"�9�=靶 +V���f/D�gd{ig������X;�s�O���m!�y�1�j�6��"��E蜨��)kױH_^��p����A��a�����J��oA�ၹ+��a9���먘��Eiuڈ�Keu�"�#�ڪc˝Ǣ�������g��H +�--�_y��5q��[k�uC���wm��̮+��'�^�@k�|�s��uLü�uIV�9�� +圬^1��E��by�؊��X6��Sc�.�W����Ύ�A�96��E�ڍY�,طig#�,���{M{��G�X��{jg���'�al|Hp�J������B���SB�eR +m�(��eV�1vM�l�T���"�gBLo�{�r��F:[0N�����iH���5r��r�j:�h7�X�Ay�����Z=���,��L'�&Ҷ?Yܬ�PR�^�3�4���w؝
�Y��Gc�{�.�����j|H�yNB�Q⓮jgE/ s��� 刴����Ez&�c�N��
酡8$�;?�O���H;�����e�:NꖾP�b��'��3���{���4��Pt ��t,%^���/q������w"kߑ/w���x8���~~�-sbV#�&OB[=q��r�JӴJ�:[7e��w��;���߹�͚�;/}�������44�n)�E^ً��ϏAk£�R�Q�G�Y�B���� �����etT�n���.sQ�C�~�Յ1�L��h'���������t�g��c�O�64�/�]Kd�B�Dh}Q +8�|_l�Q|�X;��v/�u/�>7��q�|4��f��=b抽 �I�t��=�w����i��|�sA�(o�\���bٓ]���D��ֲ�m�I���u:���V�XܔC�2�&�7�R�4PN�� +P͊�Ч�_mCz�H;�����L�v��� +��T�0�h"[Z���j$D�R8��"�]��:��jר��N���3�X���>�j���N�:�$��� +p'�7,��YT���y�-����=\N��e��(�j���ƃ��jS�VS�,%����֣���g�,�?��v�a-���-%�ہy�\8���� +�@�F�Ͼ +k�-�E�\Arrۀ>x�����Pm�|�F������
�t���� ��'��� +hsn�1��e�6簇���1R|�4h�R\I� +-���&a��E�r�Y�{�E��qN~�,8[M��6M�N����4�pǘ�o��l|{+]�!�U����� |2�rl�T�Ĉ� c�b{@_�|�#zb�\�ej�U�{~H��BS}Kc$�kTg5O��a�=�%U������_����<?:J���T,(<�eT>�R⩹"�U����f��pҰ*C�S�/,��p +�$n�
x��� +�X���M�y߲oa4�ub�T>��l.��Rbc��̫�КU���x�
E�|� +���&Q�9����9M9��@rYԢ8{gmhm�~����rI'g����9��+�{AGk�b�ѩT���B��`t�P�F/��vu֬��!j����3����СV���a�
��փ-�<���L89vO��&�q���ڵP�d@���#DGp���m�����ľ��sc��fQ��l����@5{PC��ӧ�qE~��$�TO���м%��b�ģӱ�>@�
,.��Bž������f���1�Ƥ��3�灥D�d}�/ңkBĿ+�-�g�����u����&�+�� +�+��Ea�T���&���2﹤��8��Ix'���P��{ϸ��M� +�$������GA�P��6��|b�Gf�&I�5ko�/Л�|p;��{�a��G��u>�3�|�����M�39���.�;p�[yb���~Զ�1M�V�-��;��K����@O� �lI�{'a����ŢW�.rg�o�H���?��9��W��F�8�W�Sx�L]h:S=a�W̧���tnQ���N���>7�꼢fBp(�8�z��A���8�s�X�����{F��'�E�A�-d3/��8������=�uR=1�Bu�ɽ��ҵR����&V<5B�E�6��F��{` +��^����G O�v�6��)�f����&c�+t�A����_#�{�.��ƥ�㳩&8�f>�d"�Ӹ�I��3�g�s^�#���a�K���OTc��M:���;��|a��a�Wu*�Oe���F�;}���80��Gh�F��M�����_���������z|=�_���������z|=�_���������z|=�_���������z|=�_���������z|=��?���wl[g��Z�ۤ��z�bK���]�:�:��sW{�Z�`���u�����r<�m�o^��\o�ko[�y��,����7m����,���NכE^:oEzs�m�����������������m�K ��K�-�~��yK��}?o�9�,Z���^�pK��9����xz1}�{��7q����Yg���C�Lg��z�#�������c������ֻ����yr�-�����4���.����z�i�%�u��&n����$_��ͣ�8o��Ƒ<�Go�<=#=Q9Oo^o�3��y���D��\?9�%�����^H�n��������;������q���l���[z5_�\�|=n���u��ll��z���H�t6Ξ��O�~.X�`a��(��O^� +̆u持�Ș˶kX��F��.���ο����ڦ�����&�����x�X�a�r�4�9in0��u�͘ML���*�k����6�vӒ����9F�7���64�d�L�2 �����Kf���ʫ���%�l3%yf����9c��k����l���1�4vAҢ�I 2&Up�� @/% v�fnڴ�3a(g���M�h4U��M@
=[�{�h����_��������p��8�%�?%� _EG�~��W�G�(�����h����W���[�#b�҃|�g�0���n(郭Oo4K+Tr�FDK M`��k�Y
Ѽ�Go����yFn���{�E�������ރ��\�w��FP��ZȬ4,������������GIq�+��&���Lr�`m<�AA�=�R_����}�����;��3��*���a=�q����i�y��}p_3�-��nA)H@������D��M�9ߠI�t#>H(��(,����&�M��� ������������ĀL�M�3%�4�"2Fj�$c�k!�h���(l�=%?��s��-gAX�:D��;D��m��)� �YM���Q���ù��C�lܵ�f�F�����I��])C9���2�U�f�]Z���6�鰕H�p [���U��b��zK���.AEϨ!��i�� �_�.6�����s��RGH�c�!�z iP�I�IJ��7��;��p��[�����߱"7s�I�k�Ĵ���Ic����ë�%(�JX% +.�@ ��n}/�ծ@�&�C����
�P�� �@��w{Fcqd�D�DP����i�O�0eH��3z︧/m�AC/7�hh������]�� +��V��1g�|S��e.�i�'2��z���\p�42cC�G�G�C�����!s�F�T�b@$��-�-��X��� ���ʷi���� �\�����y��~J-|7�\-:� +��A��fZ�M��� bwhă-�TL�2�Z_�_<D�Fa.�yKp�b|��Rᝑ�hL�V��\aw�{���M�ԧ_B +��������7ƃ�
�q?@�n��4 �9����Ĺ��^�V�� �ٟ��E�� ���L~�` +d� v��b�_����� @=��7M�r��^��� ��c�O�NL��v6��y�Ki�+����u ���z��1�o��&%M ~��r�V(m{�ɵ .�A��8{Q(�
�
���3t)���"�<�`���qԞAzC~�����ݣ�Y +�Q>9chs#���vCJ@p�w�.%��"�N���m�G���Al
��CYchs9�����)�J���ИL4�|ż�&1o@,#R���oq�� +�7�]4�I�%�zM(�ß
�1gf�t�6���A���&�=��S�ч���s3A��䎆`v8�\P�7x(��@� ��M� y�@FϹG�@��\� LJ +�������� +0��;����$։�[�� +�!��w&�(�3��Me$WQXi��\�sc-��;k���$q�q�h� +:���SF�KWpU�d��ޢ�sH>�l�'s��֣�/i@��U�Xħ�\�{&
�o��F
���{�@�M����Br�q HT�!��������S��|b0 nǜ��ɵ F�
�j+�l �#�T]dAp�qze�����,��Pl +� 3���� ����%s�H��}�$�6#9���%c&�hP�L�<|��خ�_o�b"_��\��� � v>�1eV;{�9F|,��$��E���:D +�ڱ)�fq��#)����p+�1�T�Z���=��& +' +NQk!�#w���%�U6��R>��"�?w4�!�����l��e��֟(Y,����rE=!��.�v_�t�PܴV(�[
"�2FWB��!/��D �D\��K�^=���C�?=�O�8�˺���XƠ��02����Į0�����)9�㞾�"rN�?�ԍ�Mb������H��u��{�[����퍜dU W�=3(����/�&Bz�$���!u��l4y��~�G�q[`_�&�+�C�;#i�$Ԩ��z��h)�hQ �@��v�֣�,��S�∢o����}2P�h,�|���O �3��4Q��8p�%��<'~��s`���њ>jH���z��d}�S�e@"-���Z +�$_�j�JOS�}�G�)�J�$͡b@hxd*����)y�uנ"�+��M��k�l�l"�(Arf�7u�M�=�CQ_��D�9�?1B�4�v��9|K��x!N� gf�%/VqY
�sa�". +~c��s���+!L�G���<L�Hb�'�9��z�b~�j��i����G^}{)%������RGi��@��I��t@�ti�,��"Yi��,�)�?��U�:�|q��&���$�X�;}$�dl���C����9����o^O��;n�1��x�l!��T6��!��aO�.g�������T�y=����H�stA�+� +�Z >��E�LFrx��ք�1{����P���B�����I�F���H�a��x_�.���C�[�S-*E՛� ��S삷��Zb��r:ag�0�-�wF!?�ڔD쐒s�0�3��;��R�Q� +p�B)q�R�A�������]=��r,�%��/�T��y:͛����k
�5�|�5 �g �OςOT��[ʥ^��%�æÇ(H��m��C )#ʿ>��w��+��ȹ��9\܉��[� �4Ԯ�$�=�|@q��$���
Bnl +�+I�)�Lrׂ�����5b�ӵAƀ�H��&q�� �+��.�&%1���7o�'ٔ���Ƽ�sş�:0���S��T4É�y��� ��[!��<1�XO +-�@��I ��<��@p)��B.��,>B���m$W #D�آ�?�|}1�2���E���|��9oB�
8s�'_�| +vb�w��3����$_��[Zw���L�e<�+`��%nB���]T������'���69W�r����2*v�@��6����ݴ��V�+������9@� +�ȁfX�;h¿J��zG�$�5XG�� ˕[�hcm�G�$M��w'��O�
��]��%��HI��Q1Gԍ@�Gl +e ٥b1�z�����ER�� +�>�Wu"���k��?�{��l��M,�4ֳ�yjB�[�����`A�.K�<D)QO�(�SBx9j��� -FD�8P�$��˯_!&\�C��=c� �h_-/x�̢��G�4�.M �6��]�H�n���|֮�M�����'>��V�.i���f�vۤy5�>���������Q@�<ĺ��� ��k�.=�.et�J��:��@yw_����+�_b�JרA�~�ؚ|���к�G�� +~ +B-$֣�Lݽ�ɷ����*��3�?�.J�7�~������viQ�A�/i$�=�.0R�?�]���]�G�*�ݨ�Id�ۗ���M�!%�;RA2�P��7��djw�q��G +/}��-�Zͦ_�O���Q��^��<�=Ct����+Q?�1� +���9��=<ȩ!2/�+����� kE.�خibj�o1eHޯ�<�ȇ��)��/Bu�F�Y�ܐY��&Ⱘ�Z8@�,W�Ĩ�a
�LIs�����z!���j���!H +� 3��7�����Vt��y��̩����f�[j�a���%���\��]��C�o�輸��״>�ݫ/ƛ�k��Ц_�ܴq�Dg ���?@a���!�-2�/~��N��e\\�e_[� H�)|�}~A�j�h��^��uTJ<�qf>_�l +~G|*v�#v!��۟b��Y+-��I�.քI�g�j�s�-� �5��C��Gh��5J�<:�+�\��{m�(��ui1��$!�p,[յBr4��7�%�#*�1���I���#���!N +���d��W�3b\X�q.��`1�o��%j +�\��;5G�O�♝�C�_bѣ�B�ͅt?�� ��e�������so-�2�χ�Ck�`ϑ*"�;et��2��\����4%�i�u��1Ci�= ��㴆��]����w�0��Q[Q�7�sk~���I�����c3�Q{�Q��t:aj +/�@�."z�.��sK hA� +ˑ<��%���%
�����4?)m[�5A�O�����C����z��16g{H��>�� "�5��A��W�J,k�Ȧݞ�� +�},�RGY����t)��qJ����m���C[�[w|�2�S��&����qʤ�3 �˖?_Q��e%�yk�{|�Y5��c��7cjt�k�]��'��_�PD��#���?\ +�<�Kx�s� +�h3��}OWC��0�C���"%�O:8��Z���}�W�P��&a� +HQ +B}&��tE�����i��X���PG�� �fA�\wh�Ӈ}�ػ��sT_���:��yj*�_a0ಘj}�3̇@
�&y����_���:*rJ��~9��{�� �օ�OP�X�{b͏���qc�:{��{[K�a���bD��uY�h��#O�x�ܑ`�*=!�fp�P>��f�0��t֢8l�� +�O�
+QW��L�
��)�~2�,��ɧf��#g��0���UkQ�"�M����a�j=��G˄�k�i]��
��C�Mqn��iX+������7�����"�=f 1��~Y�/`�5
��a�n/b�_o�5-v%
U�8н��)b��]�96M�/KEg|3G�VD�>] +H�}#t��+}�&�M��?��~����w +�;F�ݣ��{QPG�Y:�쩷q�ڒ���j������>�!�>�t<�vs��h)���H^�iA|,p1��Rq=�����B� +�R�ԫ�{�A��Tz��xq��[ +Q\��� +��>Q��I4/��� ɉ��33���S�7b_R���|��%���d���O��L��P&�����oa/|�Յ��Kb��N��)� ��46��������W���&�uGԌ#K'P�D♢��Ol��t��5jDܰ�/����z�~u!�b�y��Pa��������O�XGb`l�ه�SL
!��Nce�&YE�J.��;��CYq� +�I����#�4.*;���כE-+�ݧ����EQ�$f-��:*ɏ��-F����#ŝ�ɧ��Kk��>�b�(�[��VN�"�U9�Ц��4�/�(�^���.�}��V.��B�+k�W4��:8�-{�F�h3��;�7��9�<��Q/ۧ�u@n{xګrh��w��QQ#��`O2|p�i�#.ͣ�#�~x"�xz�<�|.0�O���3}�"�x4z`�\]�P~��&��;c�����������o������g����φ������G_YH��ן�K7Zwp�$���F>������*��Kн��A̒�өB�y|i�Z��� +��:qky�ܺ��\̻�� +/{��P�{��RQ�x�3bʕ�ؗ�(~��F4�$؞�z���~cȕ�[ϕ<_�u< �D�\y�Jb�em?�ski]�O9?�SQٹ��+n_K +WұF��;O�����-i_iy�a���Ƕlů��;� �+�_�C�� +���kZ��g!�z��Oo�|��%���d?�^��0�_T�OM��כQ��ON!��h6�j<��<��D����MOv��]��Lq�7���_��[�����V��n��/���1\��@���;��3�6L�o +���c/|�K�%�J������mTM�ʂ���⧛�Ҷu����qU�^��?[%�k7���T!?� &\��\�*�p�2 e��Ψa���B֎�R!*�b��;�i�~oƟ~��;�R�V��S{��s;�`�BQ�a����Y��U��Ns��s�#c(?��D~�Wc��'3��f��N�=�ʂ?�!�'�%噦mVWkv�g����d�OV���ZM�`s\�y�K�������k��Nئ�j�Bu�^�*�6(��V��������Ě����Jy�5>�c����~e$?�a���'#űO&���*��[�^�+����7��3/��G�5��4����[��{�9j��~5����X~�g����^v�߬�W~��g�Rm�������.�ߡ<ޠ���qUo6������h\!�Hq��R8�Zɗ���_��`�_�|��V-3�^��Z��;ު�un�ז��*�H���~�P�of��v��1_�ڀ�??b]|쉩��f H��E�!�<�f����@,��-{�֢��ղ��������y��W��閛�u;�������I���e���WE�/�ܻO���B�kR��9�v|~8W��4Y|�"A�՜b��z��ʧ
��>J�_� +7_;J5;�k-����X����G.[����>W�.�|��W��^V�l�p��L�v��[�"��2��P3�:��2U�{,�>�`ky�� +�&[��-Ttmd�u�K�۬īO�W[\d���E~�{�J���]��ʑ��VŞ{��;m�[����m�;�����ݹoݸ�?;(n��Vq�7Kٵ_����ܣWn�統��qb�#��k��[�q��������0��],�S�δY�'[x������k�P��Du�������I8���G_�����c�Y�T��p鹵���㟌�#��ӝ�s����T��_m�����G];��\�����.ŕw��ؤ��VT�|!��{'N�쭶m\s���-�����cK����ͼ��N���n��˗���Vq��f6��P����˰�I}9����W��?�m~��� +����;u{��_ݣ,x��K97�����G3�]���_��ZT�e�,����ߖ�%7��:��'Uw��X�����N��͇~ҕ&g��6Q��4�Xe�ۍ��X����7L�D��7^�ߴTv�Sy�o6�۟���������/��?^� �[��_��p�EHjS�U�]�˳���3E�n�:������][���SyV���7I�ζ�I�r?ݸ��kmeU����X����fu�Q��|��p��={ꣂ��J��z[u�$K���v���N����@��[��vO�'n��'n��V�Z�{��V�j3��z孇���w��,�*^-�H8�o�״��ؿ�7��m����^|��z�(U��1U|�+�k��^�&��^�Y<�Wk���b%�������'�cK��sc�ݫ����d���{���;��D�~w�z}�"����O�xN��bgy�n���#7��z[��KթF���ܹ��J~��_�o��JW��.<s�w�ȏ�n$?���#���N����<Q�5�Z������x�˳�E�_�ʷ}w-W��8Nꨏk�����������!V��fn{{5����B���|����O�=ZK�Ug[~���}|!k�����ߌP��v�
�+'(J_�d�0���7�oC쒅\�`Z�i w��v�λ�6�o����N�������z����'���������'�o��md`ɰ���t�;��S����.Ϗ{�����q�Ȳ�&q�?ڮ������}��`��ӛ���;��m�ʣ"������:��\n����� 9�A��'�,?�JW~��j�������d�Ð����>�vk/�Q��}u:����\����}{ײ��>�g��(��(+z�qa +��MV�v)/t9�+�e�<�����9�˿q�g��v]��w^(�|ۘ!t��I/�c�����|٘��t��n��8�7S٥� +��3g�������ܫ�!�m//d��k��N�e�I�ㅦU����J�݆�mst��+��-��Ol�-oJ)��^Zd��T���t��g�����o���>�������فl�w�3,�}�鱿���b"�~F����B�ٙ|꽅��\�kCsOv(�C��[V>�)K����?)r�/Q���Q���Ų�6LY[$\xc-���Yf�\yʝ���s�?ʕOj÷��Th��r���6I|�e��6swkQQ䓤�'IE%��yQO�ʔ51��绬��W�����4��d���T6���3�e��͊���N|��X��՜�����L�͛��{W��k�g�7��{�K-��v�?�n&~j��������2ƥ�@�G������.�GJ�]��ٚ�����R��wyÿ9���65�ڽ����b�}���������&{���\�����a�;��RE�)w���T�J�_�a�r#�����m����*�l+��תz��М����YY�>�$ �����=)�}�o���?l�Nmx�ZK~�k�I��?�Lm`femhVrm\�[Ky����⇦�W����nq��\q��-�c�Ypgߊ���O�\���/Y��o�P۵[��-Yx�ſ|�|�$M�\��~x&���z�0��m���x`q���K/��&gUۃ���T��w�aM)%�ͱe�ګ�m{y9[��^���˹�_Ϸu$ǧ#37�qD��� +�.�ˎjH�U}��bR�-��?�n��{�p�(�y�Uy�t����aM�U˽$�ΚL�n�����ZyŻ�Ru�L:��Vy�u�t���k��(��D&�'�?V�Y?��n>s����EQ�R��_6pފB[k�gkI��#�Vo�_x3��]M��ks�ק�}۲� +����> /r�*Q���w=
u�:^ޖTќ���$D}�1 ��
���8]{䯾Z�w�&(��� u^mD�c�,�SG����z�-�z�"=|�->h���cn�k��]'d����ץ�4���D�&�%�/߄���0o�v�N�S�{Q9{�Ed<�"�U\�V[�H�M��c���n#��F������.���R�$=N>���H����9|K��P�hW���J���2?��[�y��?�^�wzYK`���㹊?^����v0{��.�w���9�������̼Ć�܂��Y��"���rܛK�<�Ks۫ժ7wRl^_R+ߴ�*_�&)۟���ئ8�o���?lm�j�<ڪ�\۫�_����Jֶ7�r�O���7��kL��:�m��ڬ��ɬ��=�ⱟ}�ɼ�����OoF�\�64��m�q
�>��L�G���7����x�2����������a�v�����ҽ��e��7ݒ��n��n��}7g������n��w{�5F�7F��%Ȩ�[ڒ�6��T�F�ݿo�j�}�7�9v�( +|�U�UST�(,Ϸ5�L��!Qhn
�v��OB�o[R<Z*��3�|� +��>w78ӻ9����y��u6�o�ؽ:�����,�i|YHSF���\�ٮ�@�u+�uv���<���ݞ�����4�P���x�����7?�'�6����
O~\�%-o�aʁq�k�W���}��GCrL}BnyM���=��{a���L���L��C���|�_��g[���֮ ������N� Q_{�y�Nh�����oC����ޏȱ}Ib�{���� y��o��W����'�c۞�O�q����� ���} +���mn�{����#��Z�r�y�]h�S�n��Ji�*�$�ސ�xh�����_v^�^e�2x�v7�uV�4�����0����,Y��Y�d53oя��%��yKL���@����������voP��T����ZL��Y���n�e�ߎP��J̉&����*Ox�&��U}�����.*H��+,����AX��r�"��,Z���������!����~�wڱN���-�F>/6�VYk(23��1{�2]f3���<���3�~���F�Y�Fd6K��UaZ�W�̔�㘱��1���.3D�ft/=f\�)���9��q����W2�Mݘ5��#7]�����[���O���m�ݟݬ��F��q�&0�V�_������ua99�Qy1
�Ea
���w�r��1
S�ߏ��x����E���/���P���ܦ6���=)d���.̠��dӁ?�l +<4���b�Q� ]ä�z~�����-68۽� ��U��d����ѓ=���F2:� +Q���y�zh�q27�Մ�O�κ[�ېX���'��'��s螎����$?ۓ�����U�̴1ӈ#�s�C�J�^�f +��=.lz�s�nH����C��Ee~�V�_�dF��s���������\S�/cڛ��K�0�Gb�E�wSe��U{��R�Ə���~m9S|%.���Ȝ�7���� +-|t+���&����м3�C�JoG��2���O�"�]������h�Am��̩�����
��9k�Әj|�]����P���H���`
]2NÉOKb�f��>3��df��$fh�Y�h�M̌�!���7�W��˿�Dp���Ą�����Sm�凫��mj�c�._YJ�|
0�>�[o���ۼ2��ӻ=3���n�
�/��`�dFk
����J��g��<�!^ �4��>3z�B�˙1ÿgF�\��[̌Йnj�3�6`3�����$��]�L^��YjY���@�4��n�֣I.��Ҁ�N\��*$��ٝ���"+:����ͣЊ�
!{�6��7��!�ZSd���������`�Fi�1C{�"?
&���O��X�K&0#{Mc�����7�1p3z�:�i�mf�%��2�_5���Fx}#(�Z|��K���o��=��Ww'���aP����yw�䝸�u���k����|��H���ݫg�]����?�&|D���|��/�#��|?���(��7d��_Č�]Č�3V=3~�)3f�3f�)3j�zf�w��qS9f�a�C`�Ϊ��s�W�2�$gQ�r'6���5�fٹ5j�3s�{�E��bf=��u�^P�F��ߺ�.sJќ�p9��C���~�/����=>�g��hd03Rs43��4f�й���?1������w0ّ�3v�Ȍ��`FO�3�'�0#G�g��f��\�fE���/�7�붵i=�VW�Tx)!������5�� +I�ϻq/P��aP�����M~y�5=*&5�{�r�b����S�6�z�y�{=��!����Ì�ό8�5l���ݡ���[ƌ��5|3b�O���M�b�M���s]��q̢m'������t��55�K�?u��?�z�jD��[���d��d=�
*���|X��1��y���� �Kĥ�}�������k��V����0�1�0-�!�y5�̹Z�s�Ad���>���g�k[��YB�s5�Ic�V��%n�wk}�f:_�LW3�m.j�H��ȕ���ٷ5^{n��F��Ȉ��{ϰ��u�{R��"vQ{/(vA���Xk�U� ґ�A���Rl� ņ]c��Xc�&{�[v�.�9g=�?H���u�����͙k�����˘���?�i���^wȹ���p�i�n\/���F���_4����t�Ӣ��w[=>3,�g�=n�7�{D*{�A� �Q䜆{�'��!۶�ߌ�3�,&H��j:��̰�K���9�iv,3nI3�s53ֽ��4�q��aFx�2T�̌�����q=c��xcX!���p��5���?:������;\*�|�xj�
7����4]!u�ÛytR�ÅJ�#��C�L��c�)͵�#��eJb��#��N� ���Ϗ$9��f��@r~���VNL�Q�7�G�I�@{���|ǩ���(f��8f��"fL`#3ʷ��u�إ�ՒÆ���$��}u�<�n熺�5��+�t���-ɹ}q������_�ɮ���ܖ7Oswܼ����Eic�oߥO�d��YO���ӗ���d���\�'c8�>�MF0��L�c5���ؠ3���Y:f����@f�_f�P7f�(OfЌf�2�j�Y�GM�l|d���0d�-�,�[�Ͽ�E=�^[uu}C�'�[���v����F�>�S���{�m�����A^�w��ڿ�U���M>� +'�y�ָ�������\H�a=�q�ƌr�!����N|�Rf�`�?��I��kÇ,b�
]�8re��V0�f��f��jf��L_q�xV���3�Z.8m���ˮfy�4(����8UQ~��a���M_^.�z�h�K%[�7~
S|l�
:N�+��I_=/ �����a�뚫�ٌ�_ϫ'�Y��^ҒfY��C�~d����#�x��(f�g3�%�;QŌ��q �r��T�@̛�:�� +f��5CÌsKa��0ӄ&�y�G&�꾱���a���R��
��������ˣ����gkķ���m길����ڦ�'��C�����~c�͛9_�ʮk�^�����������9=��2�����9������́� ��|�ؙ�����Ne���c����8������7�\��a�ɥ�
����!6��?o��~�oZ��<�{�/���4L\~���C��/�D�����?ܐ�e�9���5O�v�R���k�7��kx�y�混���}^����$߽��������mZ��a�Ȍ���7�=ُ���L�Q�̔���S�>3���s��e����y�tz�y�97-�j=�����k��f]�Ͳӆ���-=hpr�}:�}�a��}���C�� �b����w�5"g�y�%�s���m +A��,c���x"�'~be��.�3���/�_�Ҙ����A$������d�/Kf�q������cf��7q��g�����<�ۆ9�n���-�~�on������~�����f��o�.�z��m��×�6�"����_
!��ޥK?]-��� {W�����ƫ�c�+�/�K�|�� +���l��I��+Hs��P�쏡�W:��1�O��`�S�UC��������{X�L��=������*f����%���LU�3S�Әi�c���<3~�3a�'3e���媍楞�5?�����y����������ka�W�5?^�T��K��o�~�����M���r���s�
�R�AP�2����&J���K_�]�꣭�//l���U�p�m��s�����J���e�w6�����V�V��w�F;��7��U�=�<#���j3l�\f�� f�W<�1��|fa\����k��~j����A�4�[����b�o�r����U�?�f�~���J�_
+�
*�_
:��
�_^��4�x�|2�/���+������W}����yʢ��էA�7o�c_h���HS����_i
T0bD��Xn�v�C^<�J����ϴV�1�:��uؒq1ȅ7UM��5�K�E�y뾲]�nDlo�����o�������˞��4������Ê������,jl�U���nm��݅�����`p�:ep��i�T<1��^�ٷ��i�[+�����S���Xc���_O}����u>v.�����M��'�t���O>�6���Pzh�:w� ���^Sf)�a6c��Z�ۦ ɳH��g3f��8�/�}��o��t��)5�+�jH +��!����
\�M���!@��ξ5�}k�S�4H����M/�*ˎ:(:�sV��G����b��,�C�����*�N8��ߟ�w��-|�NRo�b&Wwn +�z~�p�^���5���ռЇ�T�g�
���-n��5�NO>C�\��}w�Fq� �\��?�˒��>&Ù��;�Q���Ì���L�f\������zѡ��~۰��'���b��s���;,����h��|������O6�o���_�^1(�6R$�0U�J3W���o9����+�|\.=~���<:�G�aòL���c ��76�֖
�5̓�}��^|/�.]}���FF�K���xp{�q�w��!��:���S��9���U{�F�_B��=�H̘2�e�K�� +��Y~�����A��!���!��k���]��_J�_ޕ������o��3w�L&0)�,��+o��kE���td=i��������������U]r��સh��f����8凿y�}%r�b��݇���_�b��2�>΄r���/nwZ-�����8C�^����B6q�UPV���f�E)̨!�4F���t�?�Ҍ�kB�����x����6r���P�s�)�
K|�fг�}�����T���u�o�7�ޟ��Y�p�u��/��ſkū�����n<-�N��r9m�����Q-2���j��<�_^ʖk�U��l��n�<����S8�Z�n�;�-l,���]�9Nj��(x�A���!7�����O�O|���=Wq{�]�5}1G���h���ָ�fojC����X�;�1ɝ���,J:�k���>�R_����[���� +�B����3���]��B�1�͵_�>N���b����@�2j(�`�0f�2��\�鲳�⃕��o$��Of�������^��=ѱBx�9X��o<����b��YB�Kw��'�x�e���n�ߗs�������_y)<|�����y��t�v�L��k�h�^3��}�<3O��X}���ޟ� +�ޖ`/N����ܫ����*������i���#���%A��-re�;ef
ư�^LXB�eTN����ʡ�:����ً��[����R������<�������v\��q��� +�G����AG~�P��0���̆�����ؘ3�����"�̗���dp�ފ�-��PU���|77������i��g��q$6�����8���m�7��a��%����q������y���2p���A�GUw8(�Qt�wVt�@]{~"��1�O��_�n,�wr��x��0��0*_�TJF�5f���BI�0��+3�M��Ro�ę���lv��9��W�����W2�W��e��z����Kw�����V�y�:���E��w����y����k�W����-�3�s��!K�+L�,�6�L�ޤ u� +ƭ�J_�'���D��J�7+R]2�An��f���Z��۰�g'�e��� + ��` +�z0�s\����,��^!ʎ+����0XV�o��A�o�-ù�s�ړ�uGNjk���t=�
�sG'm��@��0 +y��&��G�Կ�U3��x����9a�瓹���"��Ү0 +hy4E|�]�|���/�����>�R�����&p��L�U�yc'3K&�f��1!�p���B�����a�E}������Ob��|�aw�+��G/�ޗK��Nn�>'��7 +�e����b6����?�U[o��s�q yBn� +D�B���h���:݉a��7�Bˋ�l�W���w��v?Uu����g&�
NV���?���\�m�S}e��J�-��av���c��K̖.U0^J��4Q�o���a��3~�:��Շq���x-^ޣE#'{z2n��1>��Z�3}�IhJ�mHIǘв��
ҕ�G�����?����c_k��?��[�e�F�]?������2��W'V[��~w�]~�*}%�^�����̭=0�+�>�_�>��:�l�<��{����5ߘ���vn`���O�\��At�?tAW�C�?�����]CE[�+w�2�?��jz>[���?��} +��ja�k���T��e���0@*h&��2�[�5�P���;��7!�O�%r�~T�������Ru�O˄S��������q���.cS�� +i�\���և.¹����w*c�=�]���j�y�"�#�G���S +OZ�� +�Ɓ�m}�N��5g�j��U�flH���_i���̿��R�������{�uü ����� +� ?yɟ~)����+�렎+�P��^���`�����S6���G�R1�w$��[!��G�'�з"t������� +-��2k�����#$�2P����#kOL��n.ڟ.|�'�Z�����>�N�>
���"���Tվ7��B-�=���o����?����y!�?�UއM̷���y���z��L���8�ꃱ�k3T��-P�u�:���+0��=~3�~4�2f:�p�,f��匏 �ܛ�6��I�o��x{*o_%�O4a����A�6X�`��|�1�"���4��q[/͕:�,�;�����%[ ����? �����U{�����`b��t�gZ��� +n��ޟ���7ߝ�k(��¯���~�Y8�*H>�"B}��^��ؚS��\�:^/PW���7S��ƾl��2,ӔK�h�Z�g>�3}�8f�e��R�7�4"���?A�v�S���讁C^���3A +��z�E
C��n�8���80B(�4H(mu`۞,���������}4U�i$�x�bF���+hJ��OgR������f�
g� �F�U�Ǩw}��;�}�p�;%��'wn�1'�2T����X�m��VYA�A&�9�� +L=uH�8{�?�+V�v�NL�ޟ���#���>|r�-_d����;R,;��n4�� �}8����|�V���;y;B>�H�?+Q��`�� v��E��
NDo"�ׄK_�����.h�Nm�˖t
W���U��f�b���{Z�b�5
�6rZ�n�V��w�;��d�.[��,�2�Y�Лإ� T�Zn�F��2i�5��k��N1�%e�Dd��Y����3S���U��0P��;8:�B#E뢳,��;G��7��6_�m_�w4��h��~�U���}�R�� � ��4#OT꽯�T\Ɵ~-h�<NМ{�B<�R����U\��I,j����z�C{�O�e��N�{��
���F;������R~�5gvݱ�|a�u���l��nn���4g�s�?Oh}���'�=j}�1e~�歷N!.����.���N�|��u�X,g����r��m|�����3��M���P��v�T�4Lȩ�������[o/�n�8)mB�:9��$�x鮑b�!�%��8�O̵�K�(og݇������^`��5���J�"�}���I�NN��?��'�ZqF��`��%�XI�m�0_��~pWz����n����t����8���)�^�������a�u�%�y }Ɗ����I��o܄
Nwq����l��� +��,�㉯�Xg'�7��4���0 1��p����'�Xa�K�ġ�����1�2J��9U��e�yA,n���x��Hs�ad�
�t�(3*��C�>�·K�/@�`���xa6�.��3:|�jk6$Ƅ���mc��Jv��yb�V{�&�8H$�Q�4��{!��MC���>��x�!������gA!+�)g���19J�Rf��d3��:e�\T?�X���a���,�N��c�I�`�F�i5����^j)�r�$��IU�Ɛ�})������B���Ré��y�ჩ��v�v�=6��Ki��>� +>xKOِ�gc��M���叟��W�%�O5<8�BH(�e+M��wRj�`����65�?n�ȟ�?~�4�QEd��uI&>�vu�V�\�䐚���dC����R����T35ṁ�2��j��������o�>Gw���T�k>�Bمe-#����ɧ��g�*1x�k���q�d�M���f�J�Y��CN�k��b��N�ļ:�-���Gƙ��I�*�}� �Pˌk*�K/�+���T�<z`i6�J��$�Ò�(����tm���rA�J�I4�Nl�l�\sp2��=����ڔ5}��
}
�����;r30C�nv��a�`j�<����Y�9�@䛯���6G�%tS�L��� ++6"�ZRz��a^*�0#ne�9�*kwVUتBH~B�ؿ��h,Ϩ�ֻ��ۉ�͔6
���t�����thu�I��ޖ�jm!��?�0(ns�V�@yRX�l<9]���}O��q�S�tv�R&�3G<�]�'���
��f��@���R)��\�{hʰ���s{�sB��t>��{�\�2��g�'�O"#Ė[q+�-�4 �\T�9�k�a棐H��θ���̟:��p�3�Hg�g�� k��k���*�Ψ����A������'��>�؏�����~�,f�R�ٶ�(��ܫP��_4\ˋ���ے�a�Gj�� ��
�]������'��X��[�@AF�=t���4�����qZF-���Mщy�RR��fF���J-W�Z/.�7~8v-D���&n�:_l���/��v ͵�]�Ƿ�:���aڲ���[t +X�|��ڽwU��o��U��lX�)�9��>Z��{2t�=�|��W~4�w=q�,���cĘ +K1�В#�OE�\i���T���"���Xq�QØa-
l"q��^T��1�u�X�>���O��?s��_x�ڟ����;�\-DMV��T�1,Cp���|c��ˁ��NN7_�+�}�\�|�뼫麭���~"���4%�#tEuC5�'f��חɭ7܉m�М��6BŮQ$�M�<��*[hb�m��{��Iݯ�n�uR𠅊��4�?�f�X����F� k���;.�چ[�m�C��/g-\���P m-w����]��ԵJ����fШ�֟w�hi�vT���s\m�-q�g��-C���R�l�zg�v�w�j�-ɟGP^ߑ� +��+^��Gw!w�=�� +�J�zt���ऋk���o�v"��RT�Yp�����6G}��`|�x��� +�6N���������WI(����fm�?Yܚ�����^��עC�_,��?`3�˕L�NӶ���,�u��S=l���O��}��������=D��v��Tg(�i(��X]�����v��wԇ�����\�G;��jPm��BhSPmxʥ��3l�O�,m����˩�9��Yb[К�k��jȩ�|ZS�>�I�.��"�zA_^�|o�����|4^g�#��~4ë�����Ě}��ƳΚ�;��J�Ͻ�xZ/%1�r����;?����o=u'���_�P���@!��H�
��P�{$�^oG�kNL�\���pUd�)X�2���u�s�B�I����MDm��ZAs=��^�l]$�W=�TsM<���Z{��5��P��rrm���Z�,��%�hWof�.�Ľ?��ĸr+Ƀ��/E�:�Y�a&Rx�Xˢ���J�k���#q����V��bV�B� Loʽ�r~eqCg��i<�+�B�.8�n�vm����< ,�u����}W����<�3%�Y�1=,n�?�|k��B��k|��#S���~4���cѳ�M5>��E�Ў�&�Y�hg58�{�a}Pʀv��Q*�g��:]���0�!m|���Y���Ey�jgE�������;�/�7NK���\mIu�r��R
��u�б�or +kD���@=�"�%��I��[�k��ɲ�D�����{�GC���S6�os���-������.���|��uv�[�$�'~`�v�͆�S5�M��m��#�]w<��k�`qK�vyO�I�wܐ�b
PSd��+�¾��U�9 +�-T����AH[ۇO4�ZN$f���v֎;��λ�XK�S;�V���?�Yέ��^������쿵�Jz������3E|ѧ��#��1w����C��+�6���l���8�����rxv/��E^��a ^����u��|�h0��fr�M����.�Wɫ�3������]�=�=�+���v,����I�������f��q=��)��J�� +#@;��8����!�G�~ץ��M/��eSj�F9"�\�H4�$�� �.�媮1�@��];��Y˭%R����w�d6�u8B�Bn��<�9�S��M� ��o�!�P��J�wo.e�s�.G�$ߺ�L_�i�.��*$�qHp���홠��%��O���LɃ��|ۅjgQ�����O�v������U��,?�Em��T���n�M�v/���A?�Y%=�Y���J�S;+��c��Ԓ�9/�㋶;��
�
�$��eT���8� +�����CV�p|�t��3P�����d����Kz8ǻ�hɵ��YQ}���^����m�o�d������B�r!�&�_Γj5Z'ħ��C�M�}4��'5yd~/<'P�1j}���Sc�uD��ox_�a@w�� �O��!R���Wmn?O���a��bL���C���N��/�+Iܖ�O��Kj9��j�a���?��#=.�B�O���?���,�T;��4M�Ygmje_5j���m�+��6���\�>&8���[�z<w�`�co�����8]ʲ�^�&o,�l$�1��b�E�[B�%|�ŹЀ�ka؟Ck��8/��Y`�cߣ����jw��7}4'8���g�_�kI��Ҷ닐�I���ї����vֽ%��o�4�O�����H*�� +z��3���jga} �T_iM�Xm͡���������Q�x`���cg]��)Ю�$Xc��8�Mt�m���S�z�9>v��1-�x.b�z\5'f����-�8�X�ׇŘB:�R�Y���+���=wh �i�6�Ξj8ǭ�Z��խ�rU��_�]?�pMŊG16�B-F��ƈ�4��?����Sd�TaFbx��.����.w�`h��'K�L�v��dܫX��>_J��E,�t�&Ju��{~H�A.�8�+hAc$�kTgk��n��4�����q6�[�5��xzttٛS}��fĝ��f���ǧkH� +
�o�h +����P��<���3�ߐPMh�\��&��@��h�zC�y����y���q_���E�ΏXj:�Mh���X4Nn�� +��:_z�~���_�۲D�'t��O�2�:�e;Fʫ*���>�DH̷�})������s�����H`w>w�v����D�|H�{GK������T;Z!X�ZO쳲��9_hg��hgɛ?�#6]��A�[I��69�\��}h� ��u���yW����;FQ���=c��g�H[/Σ����Z�O_H�h�UuO��n����=������jOL��t>���]wj�.{�!*�L�=8k�wy�Etm��+���\��Dj,Zk�;>En��D�re�$�*����Rh�9�|�ɫm����Ͳ�e���v|���j���
D.��z(HI�u�ض�c�a�uc��`]��`T�4�RW�4�]���6hn��G�DŽ�3�t;��W�_&X��E��è�%M��ɸ�A5�Vۈ�4�G��8:^�zm�D4坣����-m!\Wԣ�/�l�j��Re�ʮ������3�r=�ۤFC�Oul���;�����z���<�����n#m86kڣ�����b��eRp�)��ܿ�5E
C��tސ�ŗZ������Ϧu���rݩ�����;�Q��Q��,������J�T���I�>2�GJjg�������9���Xז�r�yߎ�ZB��z�x���T�����R�y���5���x�
WA�|r�۠;E�XCj��;K5������������ܵ�OM��&���ȇ�CO]]u�LR��Ϣ��o ]_.#���3|���Ձ�%9r��t��^7)������8Z37]X��n�֯4HNM5�Ww9BwK$�g�c�
&���Q�����1�K����K�z����Q-O�Y�5�Nз��%�IT}f���9����s �,֢��83hm�zjj?�.�|0k���bL��K6��2�k*���(�^/4�ZFBg
k��%���;��<�&���$m���С��p��iӅ�ܒΣ=�t�?� +��c��&�q�4��ڵ�yϗ��iRJ���k!���i2�`_�x�E���C�f�C��tk!���՝>1Cl�|����횽㩦94oI�Gs�����>@S�u4���ggsM����]�o���qeV4&�?8 ~��&���S�7Օ�:�{BĿ�M�p�OO����:�y�&��TS����*Z��e<�
�y����2�Ś�D����e6� �D��C��^���{&�~�
@��ۿ\$n�8s�K\��$�x�{=� +b�%g��6DΊ��>��%�^B� �h�����֫n���th� �^�X���h�=X�N���L� +��D��2�*8'��V�����V�ȫ�]�s��=z�NӬ?0k����Q�RbK5�H�F��嶺��i<7�3� +b��i+�M��`O�_`�ɂ�%y�������h�'�[a�Rn�x4��~���
��u0�lz���/4Ƞ�Wwd*��[
���N�F���w_N�xZ�/�v^C�=Ԫ�n�A�o{���~g!|�f=�%���X���T�㱛v�5tbp��j}�W�ѽ'Xk����� +��B����rǝ�l����Mf�{:�$v�v���7nF�b={��6�ɑ�G`��͝��=c��,3V���t��s@N��H�̦A2�?e췪�;V�z�0z�l�əb��%Ҧ�.�O/��+��F� +��v:r͟������|bE��0Ǥ�.G~�� \۵\ӕ������E��,��)�gYh��K�ᰇd����JC�W[i���V�Z�$��wzh2l��\ָ���)MR�����V�Q�_.�$>�u8]�#5�7��p��/��S1Aj�A���.�;�$�o���J �Զ�1M����m��� y�Z����s��@O� �li˻��w� +���5�[�v��FIu�����=GЂ��`O�=���{%>E�nMg�'����T�[��:�X�ͩ�O����p&�yŚ �C1ǥ��z��O���:WЊ�:;�c�r�J����yl��@��Əgb� +�ϕk�{��zb���0�y�N�Yُ�+%9��4;��N�$�6��V��v�8h�Q�2ܧ�]g�: �u���:�?l8>��^w`��B7��/��Esrm�tE�#h\�>:�j��s���M��j����d���D1���=7�{i�|��؊N2�N����%�_J�_H{�������A�G�n,tzH�H�#�+m������t������x�?���������x�?���������x�?���������x�?���������x�?�������ر �CSCmDo��n>s���U��R#Slm�OwKI]������ +�δ�e��~�,Eg0v�SW�4]&��ÒM5��$.�TX�]Y{l:2�=&��[R���Y�m�I��~HR�J���hEfo9j��>��V�B>?m�h$BR��"Df���M��8M�1HD� +�f�&Dǰ�bJ���.4�DJ���4|L�9�B�1�oI�y�=U͆��0#������-�y���U�&�:F�9Hc$�����@Ͻr�X:lW��AG(�g��~�^T��)�=J*h*�U؊����u���:{!��w�.��V)�К�2��;�)����&�(�:]L�9Ow���@>��5�c���hc�A`VE)U�F~J-ڒ] R%9�k� +�K��_i�o��A紸��_Px��o��,�R0�l
�2�j�H����e֬�hu� }��y��;��!F��{�F�N7tI�BT��ve��.��Z�V�7��67R�[7;�Yr��;k27�k���;�b�˨��������a?R\��a��iJ��0
�[�k7]���;�+���H�v��LtP*II+��4���g��'���R2�t���A+�4�U�mA�BW��<c"�'�Q"dl���R`�NJ}�����SKl5Q��T�y����5�r\���b�9�\���>�`*F&�����$��^���55Ǧ�26�����|K�9:�@"B���jH;�J�a�ڢ���x���yrӍE�`� +z(Br��ZGƂ��:N%������Ѡ(P%��<K�e�]f�+n)�U��Vf��]$�x%�F;��̤�ä�+�i���K|�'��|ӥ���$V�%c�jʑ�J^i(3�~b�z�>���b"3Ȝ7Rrz�U|?�Zň�^��+�A���(�� !ڈ��9�[YJo�/E��P�RL� R��X[l"������iJGblVo��2+V�d��?�h�Y��J��q�.e��6>�J�e�.T}v�@)]���p��6�.1�2�%O�ǒ�b�q�d������*;tR�^z� +����U쟠�pj�n���ZJq�9N��n�"k������%>��Lt���hG*+16�7:�a3���~�Z����*)�9]=�35���7�u���kS+�iR�l���^���1ϭ�]���{�����k��c@������D;��:Fj[����_�ۉ~�Ʌ�rQ�pt��N���t�#��q��S7��A�+���1�2��.59�n�&mu�o]�WA��w��d,a���!>� 2�o�.7!`W�� +��_ŀ�Ċ��y&�_ϰ2y=�I|x���2���ā��^��f6t� o��g?���Bd��Sh�->dy��i�._�-tGю�����q~�e֚���
��څ&��D?��^��3֠c&�ؒI6��PI���#��ٖ�#hRJ��7�2*�̳@7��r�:��`[r,�O2���p�0y�I+E���䰌���O_�{�&���2�'/h���C�Є�k��j��ߤ]s`|�.c�(XbT���"� +����7JX#����04'��:R5�M�ݶ
f��c�pB>C)9���� ���TLF�_�����:�`�kv��YW�w�.�����a.��IN*�9�v�����ܖ���M�0W�r�s,ѥG}*� 6p�Id�VP"0|���t��z�|��FPWcH\XY` ���j*�e���O�"��1F���E1@`m�<h��'��TaM +?)�$���"79�etpӮ��L�j��h�(=4���$����EۆS{��;�~�>7c�@�B��P��u��#��Ɛ�S�I�U7�Ҙ���jӫ�S��
�(S�͠#>s(��}
�TV���d�(mI�#:wi#���� L�c��
%9������ +:!�[���I�m�YHm ��lz��%�w�%6����B8�}�բ�~5�c��.{��Km@���bW�µ���\�~�/H|Հ��i���I�C���tn� +W��D;��J9̓��N�,��9K�5� +�t��&�~����T���tt��kW�s:�A���C(OƓ�2��k�_d>js��_�#��0���K� <���!>���5smi�%G�A����7lt �I��Y\2?(1��BrB�:O)> +�R��R�GI㕶�GR�1y?:Ca3�"��D��ώ||ڵLrH���������Uv��@%���
ǧ��M�U��j�6R_I�������f? +� ���;2*���̑RfK�/����eݣA��? +�Y.oEIU���w��9 + ��5��#~�>������� +$�J1�� 1I�%� 2˜'��Z�OiUu_�F�:�k]ɒZ�1�Z�B|7!u{��J�&u�Jc����C� ��a���BL&������$�/�f�_��u}(���~�Bh�)�d�F$��x����e�-�*R����L�6!$�Z�!i�J���a�z���dz#�Œ:]���
�U��Ը�d���U�5���":��� +6�v�Y$�y�����������`RR?l0�q +sYJ�?���,���[��<����A)�%���kJ�]Ubuz�����w�w"^C���G�_�u��5����^4AN�Voe��:P�4�q@I�>�#y5T
(�5����Pl��ۤ>��-�}�$q��ӏ���!Yf���(�3�͠ +E�9�p�jFRゾ � y���՟o��E
�c�q +��*�B��7aÇS���>�E|�l�Q������:�%�kO�����E�A &�z/m2�@ZA��4��ԇ���-��+�@��*U�'�����A[�}$�X�jsj��{���uCh���Ӊo�r1U=�X�뙔�P�4JS�{���9|�sw~��˨�cӵy���@3�c+�k�n�����"�Ua�5��g)o�`�BLnoDžm_���/�4U�k�
�[{r���&�[n̗�?p����ۿt���VH�Jq�pԥ��Z%��OJ�i~L�u'&K�g������
d�e�.�؞z���U� u?�ǯ��|C����O��ѹI��<XO����ʤn��v�{�0�?�s�QӁ�����@sk9��/�2�� ����]N���s�n,�X�)k�j" +z�6AvD�[UN��@i��.]�̫��:�C�@Or��Ҿ��(�$��%�����Z��p~���dw�v������Xc�˂ƍ<���koWպ����ݍ���Vl��k�Y� +����"ȍK/�� +��&l�Ф!�_���8�5��wg9(� +�Kק@~���>&�s�6^�W��1ǟ`Ҵ��u��'�I�X��㝳����F�Vn�]R~��(���M�<�@$ԫ�r㑼���7�<�c��sܓ����*ԩ���d\�F^����r +��}��!`�(��:P���B��4�����>_�[V�E�д��&v�~,u����4�u��7A������ +����7���� +���ܹ�q�Ʊ+� +��M���M��(�� +�0��>~J���:`����9U���̟��M���V�h��5NY�� +h���yq����G�S��E��y_7�|!��ryg��%_��(�ly&N
"c�(�BS�Qk,��D�i���ط;85�����X���ERrNqh�)��؇�ل� +����C><|(�à�H����e�[�<%��0.�:LӃ\�s�<Ԏ�/$c�w��߬�1ɐ�dpN��� �q���!�5PCgS2!0W��2?������m�@
B|�f�Ni�1�'�Ĥ��!5qt��(�I���!�Җ�߿�=&���+�,BFa����˹r��g.#b�v�}�A��%������Z&s�U��q�� ؆�N�vW�JG���M��u�ːǛN 2N���_�_�^o�� +{���O��ˡF�\�������r-㔡L�vo�Q��W�s�2�#�$�kPǮ��i�����-)t���ݾ�7r�
��1ǾK�};�En��?N��F0��(x�ZN
�Z��?� �@
�wh2?��/���5sQ��&F2A�������&���q~��4�N���
w���c�<������!���}�����w&L5��ǡ17L�}�&f��3��R��#`^.�؆�ʏ���}��=��2~/�s���� +g�M���g�ȩo�� B���\��jRdl,A�MA=�8L��8���T��
j�6�_j�WFM�|�E�vk�c�r��A��5}��⓹ +TȨ��]tP�zP+�߅�njףUDD�6P��t7�U\�p7��P3%u���L��rS�@�܊�����(�A�L��Ncn�M��x&v�O5蕀<p~��� \�>�|Xx����r��&9OP�&�ڎE��K�3���O���Q����� ǀ�?���j��Ę����-�~��S����.�E�4��e;IM{ +rXb����@���ɳ���ab*W+?9��^MY�M��0ch�����gԁ �)>��ۥ���D.���������
�V0�@��z�;s��}����N-�g��P�H��'U�R�J�Ae�9��<������{ q�W5�!5�85l72+́ی������ +��8 +�E<=��q�*J=����.����^S�_$ıe����\?��@a��Z/�j�R*����y�� $��\r +ypȭH��4��{�8;��6��qo��#y)��9eI��=r +LŇ)�\=��0F������l6�3�.JD`n�q��VI����(��nI����ɟ�'�J:��b�a�;��Q>i+ �%q�^��A�
�A�����7-c����9�5�S�i���L|�:�X���&u���b(ڑ����ݼ*�%ujBߏ�����.C_��0=�\M�بMl�� +`v�3�]�e��^j\���r���SA}jC���^�k�2�W�
P��0O��.�M�N�����x���P>8#\vQsA�
r�Rg�|���U��K�z#`f���*=P>���r= +�\�C�!��py�芝�3���oN����\��}�Z����8F���*(J��d�K�К���A��IU{��m���K)���1�D��攚r�p�Av�J05��۠�����dī�DX�F.o�Q��O�<2�0��p
(�K=o��z��z��\���L��/J�3�?\��׀r�kK1g� +.ܤ|���W�w6�� +�x�m�\\O�7�uA��!f.�=��G���>�1u��h���>~�h����A�8l&u��P����1���ҕE��[ +ꍢ�~S�����5c�_E�.N�� +��� +iq�땄�"ԮἋ��[!�;�Se� ��"|�ru � ���9h:�������J.�s�#z����c�����u�(�G�꩷8=rK�ӊ�3&Nُ%[�qP(a��Ӂy���mp@y�z�����7�S��z�����})L@�ơ{:b*������:J^�
Tc9>�}+�5�/�x)�P���X|=g5����K@
K╳� )P�0+�0�`%������p�q����S�O`/L`�fP������}]ʠ��j$�.F�<���P�~�$/�r�P��#��p� �32�l/�r+W�:�1TΠ�/����itP�fPS���#T8徐�
���(짹X�c��t�o��0-(L�R��\�O���4��W���B�PjRT@�F�/Dt�QZ��֭C�6�����������p�R?uT̏�@�[�~c ��9����G�((L�l0&c�wR��q*��:vj�@�%�s�حF�l���zX頷��ˡ�i��Y����Tb�>qJ�!(�s�Fx�8�<C��%U��ױܳ*N�I�@���Г>�/��8��rK�q�����^I��0�u�L�B��.n圹���n&n~ҡn� n~�f�0"_3%�>�r���'}"��~2m@���%�<k:,}]wV����CB�tk3�v�^�[*;i;�\�*�g�����r���
LB���Fi�Q.>�TN�'��őE��2���2���$c�wC~F��r3�e�qջA����3��}:�O��o�u�@���sIͪ��&6�%"J��4��d=�O2�]| +���v&˥r��Y+���G���R*��z*� +��a�Դ�Jk�g4�Di
��H�����x�DL�N��k2�]
zG�=z��f>�D��?����֝D�w-�y������La�I������VZt_�w�Y5�̽&��^��Z qv��&K6���6
���U��NF���4����4����zt�����@ z
谢�������"�^�����9�0����o�'���@��>x7߬j���iV�!*�P�p�^/�q�k1u�\M���5��|�!����"�� +�.�|��_dIu��n]�A�W,��i�>�r���p�YdU����)|�CH��&% +3��Y +��퀠���Z�\u�F�|��*z�2}'����K]$5�������1��_"yYB������jYJ
_]�)��ӡ��c߳��x���kU��6���֑�6-���u��\bI��g���1��5m�(jǹ�R(xB��#}��G��7a��&�E�<o? ~VwX��f)��N��Zdl�.aJ�s����o�i������Ո��ф�0a��)�~��y�"?h�Hsj���,~TiF'�k jw�]��R���l +5"�*�ֳO�9���ѧK��2$�
�w>��>��'�2�y/����y�sD��y@|�1�����$��0�Z$��N>�� +��O?SL����¿�/��D��$��W�^��h���)iV����lH����kc��@,�� +�Gd�G�(�[�$�k1��Yl�ĵi��T4��0�'�j�_h%{Q~F|��T��+��iK3ZI�zJ�Ԭ'N�6bҺ��'�A͊�~9%/V�D��~_��<�x�8�]O��A�J��d|QF���'�����j\��&����˒�Z_Q�u���i�����ѕ���,,�?��@~��v�d��O���[�Q�o�Y&?Җ#��t��QB��z@��}LR\o#{�pN��"�ݫ13�);y�U����Ⳓ�2"���0�u��f�@�Ss���K���; �9cQz��CƲ�j����C���e�7��vMl!�C���d7��sk�IsN +�~7 R��e�¶����c��^����h�`�ێ�y�Q��������3���Gɂ��o�� +_}���鲮3Ҷ�������ʲ+��TV����%���)���y�tP̣v�$�ɜy�����DZ��(��'{\q�[����^M��2�nv��Q�����m����zD�GC�NAf���]$��'��b�u�a�:~��w��+>��+;Α/$tN
��|�+&|�����"*�� ]�rA���a��>X2��'lf��kXK���E��Æ~�{����K�j>x�49_�q)��W���o�]C��!��_�|�{I]�E�?^#��]���M_��3M<���#zU��v��ue�-����c��"k��"��]��Jl%/kNH�6���&VI���F�8�$��bL�"��:_U�M��1Q�͂���(���W2X�+�������S������w��s���k͐�nN +�(�� +.�q��N9�������f��咞_i{�7U�q ��3��AK���!a��}DҀ�4��YA���I�1�����A�~�%��o�2k)���6_�i>).n�YZTi--��7�ʿ*~�|A�����m�I^�9�U�%���$��c�Ii~�YIA�Y��LMR�v +�.�G�l����&�kB���{Ⱥ�d}U��뢾���F������o悒?̈�_,�_�R>^
6xJ?UZv=��|j�*>��^u��[�<"��*��z2�V���Q�'~�`i����,��,��4��T����4�ʜ~�&a�~�ϻ�U��8��$���i�Q�v"�!�h�O��˼j��TT\�V;ɚ*��w���{��f�·Q��^E��=%-��+�u���,�\�d��6�`on��;1g���.��F]�� +;�y�5#�t /��q��r���wC��H~�&vL[@&|P�n�1��z�� v �^,0N��B1k`і'7�-�>��<�`��pQU���軹�CV]��b���HC=SDQ� +b��%�u��N�ݍ�И�|��Q�i}�'�5�n3)��h"�������fuy^��?37���w[��g��F�m��"b�y�x��
�j:�$�T`��H~�N��dF�S�������ag�¥�nue�m�!�����7��|F7X�sX2㻶0�k��t��E��Y�y�ӎ�D�� ����!U�/�Ѳ�*/ˎQGڟF��V�Z\$���t��vV���'��LO~7>�&�w�'��oG�:'ؓ��O��եWL���To6N�a����Q��o���ɖ���r��� +�(���1�5���b-�FH�TI>���>�������~�scB����0�'���G����A��d��8?�-�|�� (�ؕ����b����7[Ӵ:�4�M����K��S!o|Ԗ�j=iZQ�"-�p=�1���OR���/\˗�_O<$����G><�9��"Z�Q�+�P�a:Xr�16ֽ�7έ�76��9ң�7Q�R|��k;o��N���p��zxp�KxZ��<��>�v�C^o�r�0��^�>��.�G��y����Q%������
'���H�/I�7e�7S̭f��F/� k�|��v�93�\sj���q'���K;�������%� +k~%*�~���56�e�xI][�S?��k�x��8�`wn��s�.�<E�������$�ɘ��` ~X#�+?g����h۽���OC��=��Д�l�(���������I+w�߫�ɫ� +,m��_TeTPaTRcPYmP��.��*)��Sj�V��W�y�!)´�u�x��ۢ멜����)�'�C@��&���ŏ;�n|4��jJntR�o���㢴��O����t~p���J>�R=.���^��� ��J9��i'x�x���ל�5��&�� +0�+w������x�9=�`�0io���G���w� �n ��v�_e'/��*h� +|�hX�?��Y��Z>�����]b�sXr�sX|�K�G�O��S�?�����`�EĒ���]���sf%Ůf
E����!ⷍg�DJ��$�I(y�vHZ�xQR�c�/ҚZw� +�D�jy�yk�\��z����� �~���-�i�X���r�1>�D�8��"������C$_�vg��4����:EFԺƞiI����`:꜏vdE�6�Ƹ�{GF�:�oW�ÕUi��ӫ�+��b����aY%��R��c홡�->��&Yu�UQ~�III���}����� +�
y�Ul��a^�^�偑NU��q�n>�ޱTg���V�od���ɯ�3:��#<��-̮.�W\\`���c������oYC��P���,�퓍��|3}��2ϴ�I���g�mD�e�]k�`��zUir��>$��)�~͕���������Y�/���=�Q����g/�?9��?��� +����]��V�z�24�l}|����c�rYO��E�s���1@���W���%z��A����E/~9d�Tz�)=�tsF��Yz_��y.��~���՚��v��;�q7̢�ܤ�=n�<x��Pm{��A�s}�
Ӻ����Q���F�OY�M���M7�o�hR������?�y#2��52��%̲���W��a'kj��J��Y�~+��gi�A���+{��{��V��|�r'�|q0la%�Mˍ����%��6f�U��Z���W�&��_�M+s��i�L�vW������v[q]������\CJ�cUH�Med��װ�oC�꣰�~)�/��.��ʎ����]��T{�-=����*��a/�nľ�<ز;'�d[F����Ȉz�H�:�ѧf/�����-���0*b���0����9O��U�w~?%����Z�wDR���=��"�G�O�ɦ�ˎ[!t��S�cC��t���Lc�����h�j����N�W��B����u������[Gy�;��C�8��C|����|��A�_l��}VI�u�`�%���*¾έ�;B��GG��o�p��NXj�CDQ����
����P�&�x��2_��J��情rA���_�jFv�����Q�ov^a�@����C[v�E*;��M*�hÖ=h��ڠ�C���0�+O�h��m�V�E~iwt(
+I~u-��������<ϰ�7y`�O�U�N7�G�z{<M�*���eEb\X����#2��KX&�
����?n�1/(��)��o����Z�k� +f~4\7����g%���/F��)�E�g�h&����9�RƟ�=�����'F��+ +�2ŝ�)�l�<4�ƿ5MP��&+�A��+�y��!�i�Тy[�ʕ�h����z����.�*V$�����=(z���Y�;y�[������o���Km�����+w /���V��R��#�.��.�wW#��_?��LNt�r���u��Q�t9���?>C�ď>������:�[S��S&:ܟ���NY/����o�{��ԋ�[��?��(�G�f-F�3��5�@�84�Ac�5 ���#e�h�4e�~� �k��v��x����ZM������ڴ�e����[�8�*n���t���p'�j�oT�[�Ф|7��BW9���i�aO��o�����b,Q�(S�\��>8��%,��#����/�u&�K�u�/}?���H6��=���ݪ��f�����;5��e�h��H��������z�i�5��(.]��&��h4�F�����.E�>)���p���x�c�o��_)r�����m�$F�Ho����բ�"Wy��<�w�<�S����jhd�������|���y.�/��9�N!O^;�d�y��I���1�m���>���O��zO�OΗZ�#^7��z)0��1\��5�cz�����T��ᵍ¯J�[��8|�+���
~������o���F
��?ND#&�f�YS֠u[��U3�8n��G��5�o����Z�����54�K(�1��E�An~��=O�����6:�d�s�G��oK����������U��p�c�7����7�6�1@��g�5��^�H� +�� xMӱ�Mş�����j���0nu���a��n,�{3�Y\��R�j��y�]e4�a:z<d�~-/B��d�]�����
�x�cYl�������`�_���*p��
|�|�Іb���2���bo��,
:XƸ�=!��Z�g�vY�)x��_����#������E���:��h�s�$�.V��Tf{�$�?�Wؽ7n����D<-r�z��1<7�9��K��<�Ѐw�r���R�p��kai�w���o�:�ĕ����^�*�w��[�(�_��f)L�lp�*�O�S��"g���?�a�G⟏����9�}����a�:�BSF,As�����#�$�zV���io���7��9į�+�DKZ(��3
�a�ˀWb��?�Ԅ�m˔��3�;��c�^_c4�u�ck�#-���_H�/��?{�����]�_߃�*����u����X|����I���C>H�ϵ�����ɛЪ���cwGh�f� +�Y�C-�U&���^���tCbhM�K����:���EN1M�.�M�cj���_�u +�����9,��#L��nT���qg���۷���߽������#��hn���;��S���˅h��%�Y;lO;��3ky��ε���aws��s߸D��w�)�wI(-v�{Q��S��P�.�/ �˥�/�wyx���`�� +}��jԻ<�Ȳ���B����w����N���9��c��C|?콻\��U_�^�����&����g���9?2���'�}T����4w�4o�4{�^4w�&����^,@��#���h�B]4o9����]�-��%^:���pK���'Nr���"���g�������b��ۇ�:�9��5�
��v�WX�y'�����u���y����C>p�����$4Ca�=v�=e=�;k/Z�V��o?�m���q4w��]D�Y�4k�P�Ds��p?[�G�j'h~`����C����)O�y�Z��-���kLq�K��o���J"*�"�kl#j�bkJb +)M]�}�J4s�Z|�v��Sw#�i���i{���[a��-��E�O��z�h����;����e�+��*F�Ç�nx}��Y��Q�����.���!�\{�}R[�CB[������KxiԲ{����_���Z�Ϧ*�FS1C��j>s���-@�N�״Q�ь�k��6���U�}�c�4Bs6���*g��}�h��7Z�D��d�h�Law��3TKٍTo��K�n���^��!�1���k{��!� �q���am��]���mv�y���竣C4߲�fO��o��_�
�=D��JHi�B��9����O�{����!�1+�?�{7n=��[�ܙ{тEZ��8Z�� +-�rFK5��Uk4_���i�V�C������Ԟ�+y��QW�����y!A�]��z�_��=9/�)8��g������ˮpyH��WW��Kg�^�o��������p��)c߿)
_���l�38ۜ�ߧ+���[�f�[���[�}#�&�B3�c��X)�5G��,�'В=�h�QZ���Z�U��Q;n�]v�F��q�Ii�K���I���}C�t�W�v��k+�s~Vb��:�S�mt�m|Y�]l\�k�ɏ�k�V��=�����_�d���5���xgs�tş�Ҥ��^)���6���`;�i�����>��]����#��ZHi�Z��9_��x��ր� ;o��U+�M��6���l�qݳ�;8:�j���1��6�\e�Yc�[g���J\w�cBG�=��-,o���k���?���x-}�_��RG�u�:����W��������
�L|��Y�7{7�;g/�����-���)�h�Q�B��&��Gr6�����<v����I?��+`7iw�<��f[ӶG�o���s���y��E��O߸� J��`�Lb~Q�� +ܞ�_�����,54s�&RZa���;��h
q����o*n�;_5�O%�u_%���.��)*G���Y�'o���T:q�g�4�����?a7a|���k��1x��R��͊t|J��6�0(ZA���XT�}^�����F�俩3��0?�n�<�l.��ʞT�䷜�~'�"�DM�8]��{���6u�B��7����h�j3�x� �L��廣5:к=G��-$Z�F�X��֨�� +�3l��'�v��ݗ��EZU��^kb�˚_�;X��~wU�훕��[���I�u�^|��[��R֘W�R� +�\�0p�i��c>T;�}n��*L��݇���g���ǘ�V7ת�؊R� +�p������U�
�T +�%� ��� ��k�<"�t+ᗳ���ZN_��\�ܬg�^%e�Kw2W�g�3�ϝ�dR�>*�f7�l�0���4����T�ȚʼMn�]]�0W]��x6H�6{�
��3��?Xk���E�N�v��n6�]�r�d5��-92�0�a
��m#*�D=��χOٯ�����{F��� +��� +=�m_��]��SGfŃ�Z�w�v��d���,2�p����ԛ9�|"�6?�k��j�|�;s1u��}��[ߴ�m��Q����n���H��)����lCfvQ���-~\�V~Л���n�V��>��(���[W1��n��gwj��Fz���A�P��50x���b�M�Y�����?S6<�8��⌢Ɂӊz��hǪh߶mH�g�ȃ�F����M�}�����_�v�s |oIϔ��<ϤeR{o%���x�*|�0�v߲��HU��fSNa���Js�O(y�A����[$�
�J�?\"y�rPZY�}��w�l�{�AB����"�B�T�ϋ�,��b�H��[����3c�/eO�:�1^�!������|�J���)}���)�T3�k�D;TѾ������f��(���LnR�uk,�!x&�O����x�N��5�],��uMT�&U8s��ͥ��� k���_�*x�D��`�0��<����F�4�� +� +1�jgu��x�uﲛ
��X��PU�!mc)2�^V�_���/F{�i })�V�Ejk� �=���hD�������}HW� x$�,���N4sI\b�vc%<$u ��827�̳*����n|�ڇ�$�R&Tʋ7�§ N�����&�k>Og�Rܳ.61J�<3q��"�%f�0O虵�8�n�q�
��_UM�J7�RT�n|�a���l�3���Ԥ�o����w��Sg�æ�|�A���&�����DL���^ +�b,:4LMeڶtڳA�sGu
ϲ�,=�%�i0��~�����?��֊��fJt�Q@e�����RN�s���}�\�J4��ѳ�k���o�k�f��ģ�|��o�_�Q�z(����(������}��^�� ��y���m���������G1Lg��q.�3z�j���1t�Q�gt�Qg�.�M6�f��ϖI�*�-lG�.7&�)��T��o=R�x���5Y�ީ�ƈ133`n1}��p�E����EI:db��0�j/�Ң3 dw����n
�j�2�>�vK^ +i#�.�q>c@MW���f���a�1�KF�蒒�z͘���DN������_̿��>��8C�|���YEx~����+}Vw̴����}�=��+5�����1k��}�D[p�QZ�VOX�?�CZ4��)8f3����p���م�j�4�^�?�����؈���3���� ++D�/��\�:�ӌ:j=��8=\t���� ��`,�� ��:M��y���TAr�N*�K�R�}������:
��w�EϜ�V=6{Yz�J�׆g����(y�6���J�j�2�j�wo%� +�7���Êכ؆N�;��1��],89EC�-��n
��S���,�'<�lY�-;-�0
��<����S�Bq����L�����Ld�S�̕"����B�eLJs�A��d�K�\&��f*��^aB�.������*��>�2�zHAj��Q��yM�2��:"�nW��N���κ߽Ե��Dx�V�N� ��U{K��0��[�O�(w��'\���� +�Z�R�!̹?�4�<0��K�s�HK�Q<�(��ȟ��`[��rŗ_�:xn��1�O{f-'N8�!ι���q<���`�L�Z>�#��Wqe����}ԭ}���ѭ��۾�eD=��s���k���j�pY���^��)�{�!o����OZ�O��Cy�_.LP'R���L���2���R���~R�N�[�U�"�j����7����mK֣]6����#]#�_�6���L�gD!-��3F���V�Sa� �xFf-¬?��P ����8���7*Lb�~2�Yfvg��Q�K�MF�;b�]�3}1�9fb�n� +�9uRQv�����#�?j_��02�z�C�s�l�;u� ���n���Y�A��ߴ���V}K�'�n3I��)�����c�Y=��a�.'�L��2r��mh�O�Ю��������0^r�� +i�;-qD�^�]�9t0��/�!�8=L����?�}y�,��Hq����+Q���qM��ۃ�D�G-2��Z�&J��̋�/�L�ɳ���ᛐ�\A��D��
d�u�G�B���Aj�^"�Lj��6&R�h��/�y|�9EuD�of=�8�9�tD�?�q3�f�#`��$�8�����Ҟ�+��Z�/���q�O�9�I����������Fe��:��P6���ŦIr�X��F�G#idi�4�-c�q�1�w�� !�Jr����J!���ޔ۾�~�����㾵֩3#Yg�ʌ8֜���}�Z{�U�^{�-�:֞�O�: cG�6�rE�ӟ�ty�w+��Jų� ����۶ț�56���t�'�[x���5<�K>����Nó�x~-��n��������M_�3���w����w�U���ج�=���0Xâ�I��Qk�HqZv���T�9t�m��_u����S�fͼ�e}�B_��k�ؐ +�;���}�������19���+1�F`��ɡ���dh��SL���\����^Z���KrŮo�+O��=���l��T�^��Y�E�N�X�X��c�*��'�9i�����i�m����=�6ۄ���2����������������������g7���}�^���1NA��1�� +<�Ű�����#_.��dž��_6��ǰ�T��w�FÓ�������W�k^�c�s����u����� l�y��P��?�����1�?Ǝ��`��t���spm��Пn<�s�ޓn�;hNY��HY8����}�/�ؔ�{_ +�<7�|�d��/u�I�����[;�Ü��>���z0&Pt��k�;��al��I1���c�R,m��=��C�_�qF�����R{?�y��[�~�����3��|���^����;�����M|���O��������w>�"�
�~�<��B���Y�����|���Ϟ(�Q�����ӂ�R:�y_̿��
[�a�g�.:� +s�6�a|�����(c��#wn;�r=���S�*a><�uM��Ţ�+��0.L�e�7��1�/��V�s���f�''c�b,:�YL�]y��Ӄ��_\r����G�
�xhrp�c��ׁ}�����K>;ػ�H���wn,�Ƽ��7���:'��vN�����������#�~�%���A�sv�B��b���bn&�1Z����|��k"o}������˟��F��ѸvB1�xijh�~�z +<�.��g07H +�a�:�#�gBKw�s[,1u�Ц��@9�v����x���c�{<�x��SC��m=;��&W�>�aѲI�l�a�dʱ� �X�ڣc ��r������?#rזs0.#�yP1wd�KWc�:�a�Z��g/�Xw���bF-�>�b���C���P.X̧���<�]�7�H��紆ۓ��oOiy1�2�ʆ�?TB˞�\�x[xc01!Ծ�D�!�ջ�,�rF]s���u0��m��1��l�?x1��Q�E�-wN��E`��Y��|̉���:V���du�%AG��ж�`�����V��/�8Ea�����o��<{%��7a���3��<�Ï��R̻��U�9;1w_��OZ~��������Mr<�ц�?P�G~�EK��L�9=��1�k��8�;�.{�������������'�E���u���ה�W+e�oZPV߶|����y`�V�R�4��$�߮k�O����b��@kf�/�hb��gR�����^�y �m +<�������F��:�]��K/�����_6����o{������;��l�����3�j���0�,���p��V�0w^}�E�Sz@h���kN�ܜ�D�x��I�*a|aL�Z_�,ز��H7����u�\Z��B�G�����^Aq�A��tM�xU�9=��� +�˅9�B�� �.��gjd���b|C-���b������1�F`��3B�~[������k���`F_�,���GwD_�](�� +�a�M�Zb�T��\���`ǦS�z'a����G(�&�1��u� �;�N�\Bx�=�N����w�7���e;��X��G��|3���>QNW�������| #0�V���3��9�r��wql�+S)��s����ȡ�Ğ��.���9�G��Ḍ�?�3Gy|�Jh��*���r����7���tzd2�i�������`� ߾/��}G/��y�BlۼYs`>�ʂK6��c�ɷE;'���N��&ͫ
��S]&_%��R��J���2�.�:.�l����_�2�t�Y'c�R�e[Ύݽs�����kF�0��g��T�_�e� +��c1o����}��A�~��x���������9�z�t�����@����?V7�����ܹ
e��R[�����=8�NQ'������o���|���˛bD�W��Z~�?�;�b�??����{߭�<���8���I,����о�o¸_���K�֓�)����04��yal���0@��_��{�Sc�\8���ͧ7����<盞�<���k1�`���n
��|����PI��6�xe(��В5��a��C`\���w*O}v}d�2Ɗ�<j�g�����B��y.�<~�{��5.$}��x�O���ȁ?�m<������ ��͍�1ڷ}r�ރ�b,C�����8���Ťsl��5��ޗ"��<+r�O�6����ÿ��>��|��s�]��Ƶ;.��|�x�*���j�2�d��7={ȺiO�s��3��BG�1?|�op��I1tp��KI�w����)�>\��%
���X�����m���+N�
�'T�0����7���B�� ��c��~3��%�][W*$:&a����ɔ�w�ٔ��9�"v�Ú��?S"k� +��i]��\Xzo9��e�=s�w(��T��q�!|�3�����7�pY�C4��u���q&���ke��OTC��"+�]H�����a�og�͋9�p]���6��|��O�`����/�BO��F�}Y��$�뇹f��}S��Oo�8��&B����+�{���q����y��ƸMwm�f��g�{\s�=�&<�ae��Gu�G>F��vv`�/U����Fƺox� +�{��[Ӣ��2?r��u�g�k����nozm +�o>zŷ{��ڦ7��}�����?��>F��3�]�����m`b����� 1���9���Hb�w��Ekn�Q�c̭�����4m|��p�gE���]�����On����Ο ���b!�|�x�=���9��z�,��������[�k��j���ȝ�zT ����p���Mķq��K���&�@mZ���e-�� +�[���-��M���D|fa�����21r��ɸ����7��00﴿
����8?��[�`� +��=NC��y
e�o��ˀ�<?�����˗�J���'��[&ҷ�r������?TF����rga��T��>3w�r=wV��M�;�eot���Xf�l;��ƽ�ƕ��{���7��9���[�=���(���Ϡ| �0/
Ų�|��|�y����+Q�������g������w%�Oka�C��~�~��ƒG��ؖo_�yIc�~�0�����e� ���o�c�)`�]~���Q�-���rg)w�'7F����ѣ_܆>�hP.��u��W�X�h�$r�IF�,\_�_�Sb�_������$���� ?�ҵ�G~ 4ny�:�]�Z}����u��u�<�����?(o̦�<�,ʎ(����&�x�k���<|>��(�oI���0�}x���оOo��5�s�\��v +ܿ������H�Ц��В�'�B��
�mQv���1�Wl�<N���� �ֻNh��|:ڷ�+>s� O?�ڵ�C�.�8ȸW��燻7����ߘ>���2�}~@��.�r�q��KHF�\�<��� v���z�����������2�\�]o3���q�c�Q~�5{.F�Ӽi�ضoO����9pp}S�)��l-�P�Sw�#`�7�(' +��]���w���q|�����u���}��<����"�`�x̋�y~B;ߚNcsˬ"YtU�_ߌ�3|�_o���ءO�Ǐ�6��y�j`�����z��K#=���=}�`��Sp_*������K�;��ς
�|y3�� +=��4<������5/�X�AZs��4ʝ��Bp=���N�/�κW˝y�bh�O��� +2�q��I���9[P>�=!���|��ƃ�Q���G��v�#��xW������tV��0�ߖ�S��>�������n<
u=�浘��|`���ַ��+�<?��1)�����F쥏�����?���$��6�[�}]d�/n�<��ԓj��e���LJ��O�5�؝���yPcK�Ni\�urx�������r�ܵ�\�`�V�z��`c�0�uc�G����Q��U�4��}��B�/�v�Řs#���� �3�?zE�+�_�W��s�i��QK�m�^������P�r��Q�nz������k"э�.ǜ�(�C��0���Q�럸sV�9��/h�6ʁ����7(3�
ꡑ� ��FC}��ؠ^��'�'��� +�z�c=v�Wh���ق��z��W�w�Q��cƘ��#�Yh�j��iX���އ� +��ބ����#�>���7ܽ�<�\yr��{Rt��o�_O�?-l|���賿�
��p&���5�;�&����O����}�_M9�1�-�|��n{u�"��{�B́z�{|��?T�w�L��]�o����
��Lz��k�ϣ.��p�)w?vA�{=�'�=��Ǣ����#}0�:��h�D�_A9U@��۴}X���A�7�$#`އ��<5�9�-<��a�O���:ۍ�g�羸s +���?�D�J{���qh��������$����p�S��g���Yˉ����0� +�{c��;�_p�<�i�e��Ǽ��s�|���Fxi���$�����SN,�Ѩ#a�7�:����D7�����6�1-���7�'"Ա��h汄�����('���>}���~y�"�<��A�ksí|�<��iy5�/� �|y;^�@}��Vc����\6 +����s�唋g��30w�!{mU��a���?�x������.�y�P�>�zE��畱�?�a�ܫ�\_K��M�'�ֈ>@[^��z-�7�{�O�w��G74���x����,فc昖�xυ����;���5y�%�G���3ҝ"��\�o����s��� +u� Z�0șG��3��V[�����i���ﰡ}��~�]�郭w�P�c�1Ȳ
�x�{~&c��_s7���{/�9�x�x���}���������E
�V���1C}'G�{f +�C�{��<r�Ў{N��=�M�U�\ڠ���=<��kqL��u�!�|SѮ��z6�]����C���^D�|`3���F�_�v~}�m>��h����tG= �[�0fÝ+N���9��f���.A_�H�Sb(�w�-������D�����W���+l�G�?q.��ȿQ����[�&�#����� �&���|��S�+v��9�)�0�+��C9�c��`�[\��k�9���x�wY��k&���?��Ə0�)�8�s��bq��Xt�n=�3�OP/�16���u���H�����a�P�?��<�N�|�Y�W +:�g�>�x�.��m���t����0�+�}��['�����pn�?<��k�x�KW��+�M���/��t�-�Ƶ{/!���� +� 8���9��-�]x�k�ޚZ�k2�s���<��8�(�֢�I�'���?���?/���?�<����E�N��!��A�M�<= ��|�܃�ͧS�i^g�����~�q?������~�q?������~�q?������~�q?������~�q?�����gʔٝm��xy��)���f����d��˧4O����J�f���xw�g�Bj��fyfx������L��<�3�3�r�4C�u��:x��r�gz}"��L�*��Ϟ���d' +��mW@�Q��۳�.���w�Dj^���Nvf���**4pU��P����O���9��v�y 4E�.L�%�2��� +�4��Qǰ�+�Z�;�1�{��� Л�w�^ޕ�Lt:�-���cY(���ΞL|HZK�Rs
>N���1UV���)�J�[�l!�2�v�"u�dg�����Y�L��[����ӎ�����>���C��C��{����vJ��ǚ��q�ū�-q�і�Cs,���8dGD(jD�;;"l�s�◙��dfqG"�|c��d�����I�.���tE��(�[�Jr�x�,Ht/J %KO%*t���.�v��Gã����QI8U�ө��Db��m���:��?���"_.`V�[���d*�|���L��m�u���-���1"%��u�;ޖ�u����NENww-N�ҋ���1[�/ws~V�ȹ۸�i#���i.OC�u�8�vڤ��X'���9�R[L/U���#���r��p,@��"8F1Z�[�&�"��%�se��$S)Gm��&� +;U2V�I�O��whiq�7.+�>)�E�J�;(Ջ㝝��/�J��Ȗ_pԑ�w��5T$���8����J�[��̂xW��$�c��ɻd�.�v+]97:��G}�vġ*�[�%�������sq\�B�q���&^�o8�D���Z���Tq>�|�8?3[��^���2��w�E�� w���)U�c��;��ܧ����A�:�f��?ڳ������"�|�Y{z�=R��}�q���w�d�����Jg"��pCk<պ ��A�V�xwr2i�Gz�Lw:�Ј���v��gdg�"��[w��{�赵%3ɥ g���B��ۓ�T!>ש1�L�Ɏ���Q)��w�xq�iu�f���s�%��$���ی�c��73��+�WǙ�q�8S��-v��:��|r�����L��gZǍ��8bb���8�����:ΰ��L�j���q� +��E>UƵ��Wj|`���J��� +�\�ڟ#%�t���
�4.�_;_���q��#�&����o%���U����mv7 +b�E��Z�]��Zk{����
K�/8^`[2���?���=���9O[2,���Av��E�� }gG�--��%g�;�Yܑ�8�JI�Eꔒ$�A�S����ǐ��=�8�v�����s�υ�,�%4w���v������&Y�;�3� �Q*{��7K�����9����<�����{���sv��-���s�-�ξ���g�)�ݦ�d{{oO�:� �w��Wn��v�L����º/�Ш#חH��˜b�J.Z���+Z1x�cs��:�� /�y<�E�5_��ąL��_�s�����72o��D�s&����dg[rQz��d:����N��Lw�;�$s�r�r��:w�.�.��).9�tI�ঠ�[��W�Lj�W$;z3�dY�O��1[���$ۿ�1�����+5��^z����������d��t%ZA���#�;�t"�^�J^K������P,^ +E��9"nx�"sa-���z9��ߡ9�e�T2SO����b>�P�"ԍpUl"t�D��]�ѱ��J�R��nd�q٪�nu�Z
�cۆqժr^�oq�-���;��z�}����,s���Pڇ��ms����!��AX���E>W������{�݉���u�q�Z��ke#�sDZ�P,�3:����/�W�F+0S���eɶ����G�w���D!>Y�㣎�ej�!����=ʨV����\=��L�[,}���[ +���Q��Oi/(�e��9"��G Xȥ���w��������.���֙xNO�Y]�;؝i_&�id�n���
�Tg��ʌ��c7��ގ��L|i�ً�����q���xObNw���Dg�s"�Ԩ#�������gh�"h�i��j-l�ҡ*0L�u��O���`�~� +&5^�/��D��q��Lڹ�N�*n4%7�Ҁȹє�{��hJ#������қ��d��80%p�� +v�X��`2n����m��q��±��F�(.���#l�F���X����X
�ë�x!��ӆ-^�h{�S��o���iO��TA(�hI�[���h�tW�5��Q�qO�/�|�Tz���R�Ss��JoJ}�8:��阤ӥ�����]5�HX��!��Fd_k� +��t'�wn6�u{��v��[�u_v�QGn��N_�p�~�p�Bm(�u$M?\�l<��v�� .��8�V"7���J����3���dGo[�������45F�֬$�ښB6�G(Z�,�?��"��t?W{(u�a<��!d���-��f/�Jw& +�E���e��`�+���=����iO��4bʓO�ʥ�=�^֥�SP�j�jK��W8��O�5������r��sζd,�sD�5�#"���d�'툰c�H�+�E/;�����D�3JI��Kg�T2SOf��"��7��]�:G��ņH���!�5�K1Z��q%������T�&�,b�h�YH�t�ȵ������4~S���8��5Ґ6��[�s��tu�R���z����L�Ӯ�+�L�x|�eG�r��8G�Ӭ��\(�3��`��
:j���H,F�1%ո%�u87W�!E*���S�b��%�QƩ�ks��T�q���;f|z��;��} +�
�8&s {3�{�}ȱ^��JP�w��c��6�J[�\<Ԟ螓�.�U�b�g��x�'oI%��jf��>�������9������T����í$���n���Jt�U��� +�Cxػ�;����<�E��!�*pM�b�d(�i)h�� ,��]9�� �ƫL���k��$C����1�mJ +�)��X�yvg��� +A"B��;� + +YT��������vQ������%�*�Z���_��F&R�x*�_h^$�{���r�+�2����H ++����"��p�(H��9)yY���gy� +,�E�dAd
endstream
endobj
29 0 obj
<</Length 65536>>stream
+T��U���喻S�nn��; +'q�JVD����p��)�� ���멀j��*^�xl�I� +���k%h��UYI��)W�<V��/bT��^� +���ͭ� +�A�Q=*�<#JT��q*�A<:���Ud�ó^^Vw�"I +����aM�ZUxA���F2!Y8�Z7��`E�<x��׀>0:YU"��C�0%Yd��h-�v1/Z h���&{U��� +�r��}�L�D�@<g�1�@#M�Al�wPR�^��� � +iêH]�����(�N�"���� +;��<D��fH,M�C`jڌ +[���06���A��ܦ4�7�<7�y(,nJs'��S+;ӝ�����D�CUy�$+C��L"�NS�@ã���0z$EE^h@��U�'^ +dթ�RI-�-XIs��m�}Z�\~0gw�z5�\�N��������6ͬ���[s�j�Ӑ�L�~����L&�ٜ^ +Vb�6�5�@�Y���p��&Ƴ�8 ð({q�)t��y��~��$�((��F�7���q�k� +�F�"�ʳ���w��N��'A���Q^�P��k�jʍת������Z����,��/�w�<0kID!��Õ�FGS��el��ᐻS +#�1e���*r��, + +�G���� +��l&��!��3*�Wh5WkԔW��l�w����Y�oK&`��ӨS+T�`�v ��T-*G�D� +�B��ʲ��x@m��$+�P��u,�q�i�f],�$)�u,�Q��y/���jU䪆9 ǔ��������� +}�e��)�M�jk��S*Un�i���'�1o�#�>lH�4�9�c_Qe9��
�zJ�e��_�Y�x��_�ne$�mx9c���6Ҭ��y���ױ8<XF�?���QŮj��������$�6�y����"_�H0��Q�Ύ�t��N�%3��xw��^,ˮڡ���W��TZx�4�5 +��<���܀��ߒ�Lfe�
E ��˵o��o�"Z5�a՞�f�A��Q���:V�r�$<�A�20/�t��ͪ�0��&Z������V�B��T�m˻����i����$��d���6���F����rzm�嶗�d�� +��>4�&8XMp��)�_E"8���I]T���6E��(F@p���E!��Ʊ��
N�&-�(d�K�<��ʪ������x��U9�������S5��HNeC"�#����`���".��fPqя����m��i��]\�۠�Da�IN�C҂#��y4^��-Ia�����?1[7�65�T����6� +Qn�SIA�DG�nH��9�i_c/)r�ЀօmQt�qe��l� +��s,#^�� +Ί�飡yM�t�M0�C�J��7�j�P?-zt�Ƣk|q�?����V-n�g�dc�־]�o�0�eǻ��U�9���r�e��N#{k����S��x +������J��W����.U��ÄC�0�`[(8�ce�n��x�f�k�x�X���鮶��c:Z[YΘ��Y��� Dt��0QG�Ƅ + +��I"�f{�Cw0l���m�+��0mx�U�_�j.'��\�p"�0��65�m�k��]~2 +��s9���˲�X���r���$�lapV�*���X��0h?�s�~����cg�N%B~�#G^�"k~� +���!�9�TDZM�~�cؽ���ey�[�B]�N��F>���tTc���YԘ�Y�������� �v0@( �J�^���C�bZ +�)���xRAD�gN�e���z'��`#Y��TA�Y@S@�,kkm�EEx0H ����?�b=�Q����z`B��{�Е��5�si�;�h�Y +��8Lqu��XG�y�H@ +����F(��c͋�cp·�hB +��j��j�<cx���W�9/��V�
@
Ъ�a����We�x��6���Bd�.� �b��H���б +���� Ԅ�~h�Y���q���$�*ґ
�*�����^���
lP�%����$Ŏ��e���r;�h�3[���Q���(� �.6Zj�a����^�`�p�(J� +��VR��2c�w� � ��g�f�&����g6�F?����^�`�/�RD?��N?;L�^���� +�������,�q�V�
U�ȴXj�n��` �0BӬܤ��;�1�j�2B�1�6��
`r�\j!
9qt�A�#*�h#k��5�,�_6��u|>��y�������L�e�E�r� +V,��-��gbc�,|����:���J٤��=j����������`��0��p�WT��� +��(�X�� &�z��{�B�+\�������3N�e, + +�E"C'2��:�Y�~o�Ȅ�$�A�em�N_㭶���̢��v����Q�u��(���9����q0l��JX�4bHQ���|A�s�_��е_uXߪ2������X���q�~��g�
���ǡ~��f+z�y�jz� Omw�1 +��m�!n�Pɼ������+w���C�@�v�����h[+P����a{���n�d�o�Ry�,�6K�;���~Ɂ�����`:�M*��
�u�C��m�t(�1�Qo`J��I�
t�M�I��7j(��j�d�fM��v
fy�۰AT߲�j����l���t�����s�C���by[:�@��:�M���Z��
�l��-������d��o��wR��O6���Ⓑ���·���1��m�l��!(��5D��7��X��P6��a��ED��7���ֱdZ��
X���M���l�p![H6��Z�:�F��`kUȦ�l%�C�c6��,`�ɦ�fv(M6�6��C�l���,�eéj9�u�;��(���E�·�,u6��Cؒ�)�YdʶT?�r��f3�!lX��,�e�ʦ�fQv(W6�6�a�z
���)[���M���uH[[6}�N�!moY*����oq��ip��N��7�,��N��7�,
�N��7�,��N��7���3��j�d�[d��j'd��d�Jj'd�[e��j�c��e��\A�ӱ��4K9����4K���
5K+�S��M�|�LɁ������r�����Ӿ%ݑ8Kd��"I�^�j��J�9`�<�R^�H���� <�Ad��A����(�!��WeY;���9���y��4/d���_��Nr�)q����Fc�QmxV� +(=�c�-u�9����Bx���d%'��=����L6T�Ɯ�3'��
���K���X�4m�'?��H�V5��3�%��(��\V< =ͺlM<1Z�ɬQXA��l���F��eT�������3VAm�k����^[s�!�U����~K�\{�|~��~F�>�Ca�U{������<��dU{��-]��Jef˚.�F�q쪆;��1]�'�S�� �Ek��M�W���$���{h����ӯ©�G��OW����k�:f0'h�*��9U/�0_�O{�i��P^U�h#��YU�*�X��D<����/��W��U�:��]�.M#<V�!ď6�h��Y�O�;����[��yYa{��W�2K7��� ��[��^�?]�#��i��,U�b�H��l�v�b�0�ɪC����x]M��hc���vD
U P��TK�~���.)n4n��)5��$`���/u"��I#�R/H�N��m��bS��O(��J�6��tz�U9�g]i�0Wc�ZF#"Շwv��j�!_]�5t)���s��-f��e����Ln�X1�J�`�H�I)��`l��6�V���m,�ʬ_r3J�4jUÍ�`�����4�q�1UY���,�p�Ơ5.m��vƨ3F�1��9�3(������ʒ]�Ҳ�! +�38EA�r�`��0�ױ�Z�hO��kk�4vUÎ�Y���I��e�Z��(�a�9���g&C�e�v���j��� +��`�_a�q��Aw�^r�ũ���e�`[������'��n<kv$z�U8��r��4B8U
;N�0�e٩:G��Q�I��+�~���8O������eY������ +sf�˛�w�J����P����Y� w>�CvU$��O�N�Xx�:0�2Nu��7A.�eDQB����_0by�é^�*dЖ��N���q�H�lAjLn�Ά
��.K�`~"@�*�6��/I��6��粄��QEm�E�dm7��u�hi��R�ێ�ܦ� �<|*�k[;������N��r��^�U;��������`(�;�Q'�-'�hɸ��1�o
D-���5��m#�;l���U]no����Q�E��3��x:���a�CjL'k;�5�Ŵӿ�c��Bݨ����n��ۺc +�"���� +���M, +�'[]F7^�@�xȽ��X�sj��Z=L{p�GPp�MY�� +_�;o�>_>#�en1� +�0Gi�^�=$��).�<%�"y\(�I���*KNA���u �d=���>f%�xQk� ��A;WD�`���c +�t�<�T��H�#�t��S7 �Vs�bYQ�O`S1x�Q1;K��t�ù�k9�U�Q�-��q�u2/�����w���� +dl�O9�gp�T%Rы�/ܤ�AKe��doL��H�@3��7Ve@ +#�'�*���j�@�)��a�)�(�>i�����TA3NE��s�g�t�*:�a^��f�'(ZN� +HҘ*24�ꑼN����c�x�t�1��8�1<GF~E��TC�r�U�~��NdKQg\���M��x�1%�m=��j���@�/�0�����%����p����j;C��x!��N�,��0�6�5�(��H;>8aL +2-�@�
��2�N��Q���/��8�Z�H�
B;�bqK +*�I[ASEܚ�W�Q
x�@����VD�{P0'\�4`�ڀC?>��>� +F�`i$�$4�x�}��{M*i}����f� +�[�ƽ�$���d�n#�ĵh��� +��qk�m��6 +�
�nw�p��@U�d"�Y2.�� 2�,�b\�b�!�R���[��s�XW�i+~�`G_�iy:)�g�B�]�v1m���V!�-��:S{Ԩ�HZU�-LO�s�@*b�U4��Ur���ә��;[c�g����~K�jF�t�5�Bcߦxs��f
�m!:�B8��j�q +ڿ0����[5Z�U���I�F9��6�xՏO��CCHAe���%UB��S0'��YPǪx�T��+ .��a%��E��a��i`��~��jf�7�·X%ڵw���0Ju�ԊwJ^����p8�%F +}�f�J55vCby��;onO����k���s=��0YN�D�:�'A��k]��t�1��v8+�in�ʬ'Tٿ���X�g�#�� jZ�uS��T�w�7�u�/�z% +*��e�2:� ��d���7�]��~���Xt� +(0'��|C��uq��TE�b�4��N��YE�ǻ[���S��lM�����)�"�@<su\w.�M���O�5 ��@\_"�1}�ǫ�toV_
s��iͰ�jo;�b�tT�<���B��y*�5WuìJ%���dL��j<)5c�4bui��%���A�*���chi�t��L�餕M�螶�d�+�PC�nt�h� +�U,��� lU*��6L��N�<-<��"R>}��Dk/��~��yL��؋�?~�6���&�tvY��ޓ�L���^`^*�K�c����c�&�0őN��Y�zj������ ���df({jmo�,A��ĬdOW*ާ�NA�n�
��5�Sk�#fTjsf��װޱ��(ī����J��6`D��N�'�bţr�+Z\��W�h8���+��N�H&y$%S�R�=����Dw�pI��JMIp̾`�,:���-��g�a�o������]I闱(ŭ�g#�D/3��2/q"�uxNd�J,:;�A#]PV5%G��ZL�D�=;���9��SQ�N\�u����% +�FLLu����JJ�(~��qL�����*՛�,L��3��ĸ��Ȋ,'rxJ��2'�<+`MV��g�l�u�H�9��,�|=%1�ϓ��lk,�'2���"f�P;��)�Y�xPv��䘮H �e�ו&!�X�֖�PS�����A�����5�Ɏ'zJ�A��&p*�.EL��dI6܍y;�x��]���l�@�à��|�"1*z�#q�z�C�T<栣�Q��H>���L3\�Z��~�d�P�yOY��Q�00yeEa�)��ωfp��lM_xLj
����w^y�XI� Β���,q��"O�����Gxm��������N^I���|&g�Hd�3�MM�3{�x���n ���g���̵����U]]]���Q��Y +��#�>,�C�B�X$t��bz.%<��\���Z��B&��[� +�{����)�-�ޮ7��io���U�)\�a��oK�p��`�E��D�3K������c�����ܮMo��x�����s���_?��b+�a7�5���a+�t��K�s-��OGu��xD��w��p�b�o3���@�&G��vt�mw�+��j�\d��N������)5��$ϨAgӠ�H�_������-t/!�M�D���#j@����H*H�|l
E������>��'ڡ8(����aH��2�;@��1?����Y��z@���������'�����f�����vx=j�Z)���_l�j38�g`j�/�k�ؿ�Dkc��,N��;��d<�����6���@rS ��
��Y
��>��Y�-F�������1Y_�'J��0����~S\��ڞ��#��o/M`PmG��'8Y��m}4�0!ht7/��8t�~�����7�z�>lG�V����h�$�J���l(?d��s��Bn;���~��MC�A��������1���H)n��H6�~�����@�K#��G����)�A�&}��L�nϔ?��*���)e����+�գ�� +�$�>�q��O{QZ-�G��
$� �9ހ$�Z? ��� :�1���*�\P"�p�'�S�VI�o�bE-rQ* +0�B/�<�V�$E����c!L���(���F�� �`��ѵ�l� +LL���+A�i?�10!E3�U���N +���
�Ez�{/A��a�^X�?ꉢp�G�!��Ax�A��" H�@rAP���y��D������$����� ^�d!xI���q|$���*.UY�����W�P)�^���A�c�?>T���x}~��� +Q�� +�"�Pa]�hJ�'�G��'�`!���n���F p2�x�dG`��s���kL�֥�BD�����|$�^�� +�� ���!Ų>^�䌁KPd�dRay
� +nǷ���/X�i�eNz}X�3'�Ë�5Ff8� +!}.6 +.k_�V��B���X�h%NX1ȋ���5ʢ +k +�bO�/�%&���,�, +'�']>0hO�.X^��A��\{)I�첸��ע~��Jh�}�D=.Hc ��CN;��kЕ�0�`��w/:��H�c���Ф��t�����{�H�"rJHy0TVؚ
PG��* +ݠ��cGO�X�HL��G��HKZ���Cl|�[lܞ,/�&A��`�]c4�w���h�e� ڏ����b� +��p��8 t�X.�^��b� +g�͂, v +�QS�dr/F����_ p���%��������Y�!���G��oS��z{�ۮ����2 V����>�""(�����e�)rC��i�D���^���K��((F��e9���f.\J��q��.#6ș���������� �h�;0�Q�v��ȸ�g�B��&@ha{�e� +�h�9� +�X��D����SeH�d`�Kd�75Z,R�r
��}����_�h(y4�����*ϋQ2o�M2���b4�����ȵ��z�v��s;.� ��A�6��D�~X���@���X|n�;a�_b��{��-yyt�yc�<�"Q�FL�q�4t}�h��,Xv��w��j����ୋ +h~��~��a.���R�[���� NH�v�@��j��������b�ۉ�D^��a���F�;|��S����?���x�B!�O)�v�� +Mg�5Pgt�G7p�5o7�
�x7[�3���o{G��]1���o�N�!�v"�Q ��uKf�M'<!����^�-��$զ<T۞@�h�Sˣ
�����|V��_m;ڍ��nQ6�mf8����O�����ď�c���f�)p +���8v`�c��;'�� +���0D�@s�!����dL5�w!�
�����a���'�s!��r���W���=�7��r愶׀tg�!x%(����M�ޣxf�2vb��N6�٠�7��i��)���~���,��45T�� +�tj/��N]������o�Eso]�a@�U^:�;q�[䷆���4qjr���N�ыX6�6�1����T���� Jo�?%;�Q�=
P�M{����
��b�7�E=�F��H�D��S�&�Oj���6�̑+y�QO�`s�>��*5@ÒM�,|��5��Ih�^�p�Kbw1.1?�!�/��b���0�U����k#���Җ��X��=�|��}|�[��p��6�Ŏ�ҟLT�f����-�����YQ�y�P�mٛ�v�tV�51}M3��hXۮQ +Fi$fbAS�%��(%�!�9��;��ux� ����/X3` +g���Ց]w� �:����1�u�?�LM�����yd_��6�E�����P.*��}D��A�C:���?������b����6QPr��?�Ba� +���L|v��aj�8W��w�.�V��_C.:(h�<��>n��&��L%��)jZytZ��L���L�� +����m�J)a3iR�m�ъ�OD,�5p&����\���[pE�.�!X���w���g�>�=Wn���Bo��r�^,N��z��?F����r�@�v��~a5^ߞ7WU}*��m��������i=zS��t�{�Q\���/�C���*�A�q��{�Z����x�Ҍ�f��s��������CGm8�)M�.U��ex3A�V��iB�6r�X[��z���r{��#ۖͲ�(�2fx���6����S�)@������@D3�F�$c�Z�v8:5��r� +o{(ˏ�h7��x�#JI���`U��� eȬx��g����� ��q9��ֽ�oNI��W�J"�%�@��d���c|0�Q���C�z�.c�É�A}o �6�d�
�)���ĭ�|\�?.,Nq�ʩ8�����1����OyVa�V�
+%)I]�jw<f^�sqsVJ���w����7嗔v�)xd@ e�4�}䋨�l��&�2���Wi�������V�gJ� +[1Rr���`��&�j��Z�1��qK�v�<g�H����r1S� +��?=B���t��!X+&�u�X̛�T��p�g�F��q�P���u�m�Й}�z<T�l���@�s�f�毿���li��n��t֢���3տ�� +$|0n��f�y�,������d|������?�z�����| +E�5��&����Ze7�!�u��&�
|��QߑD��9�O�(�ڼ1�,�>�Q#}=g��{����I�vM�����u�>�H�4�m���G�Օ��}Yч� ��Դ��_�X���_��gS��_�3��f�MB��� ��|g�&=�Z���3e3I;���e���Kzlɛҥ���I���1a�;ݔJ�*m| -���_�q���lB7]�g*�s%=�e�q�����M�㘛<������Ը��Ύw�#�
?a��R~�ώm�!4;�wxR���e0�$w�뽛�%;��D}xgNf<���|u��<�1����+�������Wg��ҹ�*��7��y��X�'�l$[��ti�J͢��#S)���Ȕ����x���g^,�����(�*�
g|��M���|��ӣ��yg������S;|��|aS v�j�O8�R�0���t$]���taX�ܘ���\�M}������vP ��Z��"@.���n�Hf�q.An]�x��O\n}z�z����JL<��\��y�/��F�tu:�0��ӥ�>��mJ��+��zn�l�7��v������v��x^��b�o�!k]���k��l� +ՍAWr�r�����s�t53]�=�3]�P����G]���=����{t +P^�]�a��h���~���
�6F�x+���^77y�2��ҭ���k����T^�+�z�&Yћ���:}z�;Rw�3}�J/�����I����{�U�^�1K/��o;_�Դ��g�%���VX�˯���:������J��o5��yM,�����]�_�q�@�g���Ұy�oj�@�[i���5̾���6�
��7��N��7{����3D>�cC���lH���|����y�P{}���Q��c�Yo���Ы���Ѥ�4|R���aUOM
;sbb�W��F�351:�����>�~���|}�2�J�1�&-Ƽ7�2Vm����E�mw(g|��j�^��bWJS��cw0n�9�I>DoL&��}��8X^M�}oe�� �)ro���ĸa�M��J)j35w����L����4��Ѧ����i3,ͺa�g�̇f�y�1�}���/��,a�1�st�d�<�W��5??���1�'#��y�n����m1��.�k�y��ZonK�!�jI��>K��Zj��;K{f�X��i�2�;˲\x����;��XTgu��OV:H�����ޚɆ������a�����aqS�.�m�'Kz�%9�<)G�Ɣ�1�]w���;[�=ڞ����c�+�f�&@�}-~�)�尻�/;������}s{�k��랽�u��E��>���������6ysP���#����b�w��v�i���w&�g%�v��u��䴾�N*[�wF\�gf��9�����y�y��oƹ���.��9w�L1�� ����W�UZ������xmW\sw}�:L� �#�Rq�����n +�����|c"�{���6lS��#*�㚡�>�Z��|�E��f ��ZTl�YP�T�C=��9 +L^��*,^[����>ۇ7��x�֘d��4ƽ��I��oW��ϳO9|�c�;���n��F�η�w~�ܾ�یޟK�L�GO���&���igh�=yGȏ<�Mzt��x���� +v̌��G3A�0�,�-=1�5g�۵��
�n�TہH>� �RI_�9��J�Ϡ���ԨT&ͭM�!3�?FFX3d�uB��^2�.ꌦ�ЬMߘ���b��r�p:mم��rx�.Z��юV�?O}�"���^m����G�u�IEc��-zߛ��-c)�)��1g���E����}�^��?W`�c���|�r��w����]uS�������v��=՜'�`��x�j�Ň��&������,�v&���=N|ZzӤ%2�L�diCl��dΐ�l�S�}o��T9�j���Ը�k��O�a�����Ū~kO��G���c�L2`�e_u��̾�d-��]6�����c�_��r��-���\�vPro�A%��m�D��ʧk�y�i����Ť�l�b����Yx|� +��ܶh;P�����(6�ӷ�5���])��m�����������S��S�S�aI�����g�F�Z��,��4gT�3��;���>Ag^��~���2+�p5�%����~e�5�j���C�}��?��Ƈ�@v�������A��VO���y?�z+/��
�����y��F�j�4u�WG3м�4k!k�9ُ���A��|)����m3<o��Q�U��*��9�ٶ%�S;1?��&}{;�e�����S�a
?M�A��ad:��~�� +<�z��shZ�{n:C��e�V~!�;�K�;���ث-:н�L�����&��{s�oLo��P���Q~[7L�ף
ݪ�yܝ1��w��c�`%������a��9���=c��ڻ��ڽ�x��;j�p�V뷆�Zk����}��4h�ȗ��T�
i��s�0 ��e��6� ��}N��p}��
����a<ǽ/�-L�
���H���� +Ok�ek��o�3߫-<{x��V�e�>?�ڠ��xu,?7�Bt4/��V:��w���"�y,:r��?-c�x��\v�lqe�-���|]
<Dt�d��u1�m���XdCUæ�x�ج���+���=�V�u��q�[k�ngr;�i��b'w�:�q�1�i\�,�����9Z�F[t9-#}�<�>yy���q6u"��
���-���#W�g_*�|�Ė} �_Bb�ž���4u�}x�}ʷ��na������$NA�AMO%����P�cLD>�s����6��:N�K��d�㦗ih�M�1͔�=�M��ݾ=�Bj.�֜�v���vt���n�����1�����v�&>�V���o�j������ +�X �:���{����iG-�ޓ��5W]��6���&+]1�sZ-�YϽ3ҏ�m�s���.T~�T��À�f�J�D�|�إ?�'a���n{<�����1��e��ب�ON��x�7j�f�� �v[&����c�YS�y��ӟoI߳˙X�˻D���:b��M������Ҿ1��D�/ٙ� �����k��r���ۅ��y�-ڹ����t�Zs�� +��1=~k3hK�)4NN��)�L +��aN��W<rgi�� +�'�"~B>vz#�� lj��p�&;`�S�W��0��w!&�e1P���_��rz�F��0�Τ��1z,W��É
L���h�`��%1�ߘ�4pP�w��}�a`: �ţ:ŝ� �$p�K�%�>%,��өG��+� ��C�-P��iTgV�$~ +�׳�x[�!X�����.����%�G��*]�7��>��\�B(�;���{���]��z��pB[�����$i'����d�?I���ٶB�R�<���^U���7"�5E�mp�]�Y�좃'��Z{*���,%����?qN4�&�R��s��5ᬾ����X�Y��v�g%�po��<��}�TLb3�L�sW��<�H���k���- +��:Q�|�D=j��y�>�@sW�̗�7 ���Y[��O�:䐝�h�~�.��#�Y����T��*#�Zs�� +/���I��m�s<�,0霉l���K
M���1���/�J�Zv�~����G]���B���,�\?� �d��Ͼ�{���<J�.2�@�T��!sG?�R��֝�7�����:Lr��gr]n o{sc� s���Y��h�+I/����MbנK���Lo�c���U����!4/����&X{�D5�)���
���0�X�[W��dr<��
�����'�<ڛE�~n-M���Nb=�ځbBf9�K���y@���X��J1Hp��4L�������a��yC6�x�dS�I=o���D�3OH7I�?�f�����<l@��P{4�6�w�����pQm�u���'�%�[T���˃~�zwN�A�١0�pǧ9�7��ct�vׇ.\��3��O��gW)n��\��{M.A� �oYx���Ǒ�#���!���vig?��،�G���WrY��/��A�k��,�0i9�3�������-8{�x�[����GΔՕ�[Cw���n �
�֜����S65��� �A�X����>g�Oӹ�i&F�fc������m8k-�ȹ|E2�)=�t��pp���.��n���p���g�J&��f������_�G3>
=<*;�3{�e~W� +� +n��f���N�g˫����.�M�X�Өda:��:1�JCʗr]X�z"&�����i�iZ��g�E��O�wb���J�]����:[:��|;�Ƞ�YF�u��q�Y�h�ȣh��䂉�+�md�hs������\���4R~�����b�!r��<�S��L��X�<�#�>H,z#�+a@�5D��.������h)�'���C1gz�
<�6� ��bc�+_/cG9<^����g[H����θ�d�"��8���Rj��2,r�-��t�ݎGY�w_wh ��3��P��s�,AZ�!E���P�=3C(���F����I/���$��v{����Z��V�|\�£�y c����c_KlE"�|7 ��!�o&<����C/�ޚ���X���i���0f��E`o7�����qh����N/��*�>m +�H�X
m_�`���w�4BZ�^��V��o>ҭǷV��K�Sӗ�yX�x���M�J�i�X��cٞ9�=���<8��5 +c.�L��әX��j����k��g�}�wÅj�N���0�Q�3��8iQ$&0�`�� +1��k�=��Qq9�{/�D�"!�����~��5�I��r��!�&vzJ9�uz��y�Q��c�ߘt��<���?u��}��:�!��9+Oi���P�'ڱb�~]����Q;P����wW��y�o +��Vt�6G9��;�h���ދ���� tnw�1@��K�Tp����B��4�,�D�й�ݳ��k�J(�5n��� +%D@���h}�ߢNt��q��.���W�}4o8�a�{��H���uH�i�\��N����p~z!�A���2o���#^�#F����M��n�X��j��z� +�Z!�*�4@���O����D��� ��<�}Zv��(����8|~*�m�����ہ�9yܱOǖ����G��h��I}�b��bc%���ri�|+��m�{t�O_ӡ�b�?L]�(��s_��e��[T����b�y6֕{Pz�e�)_�I�b����(˽m֙�v٧�D�?�}Z����<�:�h�<��L�~s�=u4vw�Ӕ;"^���GΞ8?��|κ�KC�K��?�z����컟=����$�c�ވ<̔�Uv���l�?n�[V�L�S�O�o'�^=y�|[=e��\�<?G`��^�X\ⵁ<ފ�T+��O�z3�GN��Y�o��ln�@�n�7�3X��� +fu<�ǟ������K-���势�eZ҆�n橪��?����I�k���K�úDԩ�4��a� s#.Z�h��y��X�M�YG2���c[ds�ъ����O�E,�{I���ed�Y4q�c��YYs +�y� B������[qR�;�G�1�AZ��%5��?�3/1>�Nv|7����<�_C�>�����I��� +��>k̟�g��X +����gV��-�~$V�ug��J��Y�ʽ~]OyI��q��q�)O%��Ee���K(zl��������Qc��ka�'� eͬ葦]U+ ,��3�d�p�#WҴ�t�b[nU�x���:����bxpV��F�\���&H"�v�F��b�Q�jn37�b4PZ�$%a�w��{�����|�a3rOi�irnȞђ�8�q�o����ӵ#z�'㠎tg��Τ��t����/�]/�u�)�:Е=��Aq.
��t�?/�&�[�d�fJR� �O(�zD_���$/y��pB���>'�Y,���
2N����+�rJ�_�q9%Ü��U�����b�`3��5�UK7�k�7�h���z�Z�ÜPNK��>+^��wEY]Y�s�h1� +]�\ᓳ���$�Sn���ym�T@<���LP,A��
#)>dHA��1]���@(-ђ{ۛ�ղVP8 +Ɋ"$ˢЂ�q��C�04�B�f��0I�%T��7N^���A���� +~�������)��}]��r�O
)m'�ռ ���[����g!oE�]����%X47�oR�YSVy7��:��a�퉳��t�����s/G�|M?�뽓�/љ`��:%*��`��iZ�)���+;)�|zcR_��
�r_��'cD�\N�&R���З@��%�nn��h��xO�D�����0�J�dzD;z��X����%ڍ�$���%�iU�Z�_�h0kR���\/�.bl??�h�����~v��I�i�sc��J��V��[��6��Y�[��sG��t��_Ɩ/y1��2K�:��3��N�Bg-�UB��$+f��� \�-�K<��(0k��&9 �ޏ6�^���~~��{�q�E;���7�5��%vpg��fu!�ρ��6�_]?��yL���w?����Z�Y��6l_e�+�`Qg?��_��t�Z���!�K-����}������p?��T/'�U���PYb ���cm(Ѕ��}b~��t$$$�8])H�:�a���[�)�ҩa����'�jQ�:�����%���s�(���=�$�"��\�5�s���г�Q�\iH��$�8�Guy�S���PK)�G�_�A1Qɧ�lz�|暌��Q�H�aq�w��m���ݜ�=Z�3�1\*�F�(�\gb�� ��|wk�����,��b�-�7���&�4r����42�t��,毬$=np��n�s��u�V7�s%�]T7����cOn�y
_�]VЉ*��]C�\A�e�/����t�ՂW��)W��RC�\A'��~PC�\A'��A
�r�B��U5t�t�Z�j��q��?���X�� +��g��:� +:l���� �*�j����-�/_ $Jvр�d�7���m�V/����N�M��_����H�KZ����:�_Z���m:��v֊�t�UK1��s�R����:S���6>�S���<>Q��r�h'��z�d*U"WJ(I�̡�\U4�I�dD� �ܞ� +��W����c�� ׇ����d�ǫ:.���n4� 3!�
bN�9�iĘ-v�۶zIj�n����OZf�A����U3*��u&L�"/wl�ԗZ�6���^���U)�����)�W���ڷ�ƪCu��%��}��.Cgj��y`# +�����I��ر�ɚ]�U`<KI\�jvi��;���_Q��W�1�V�i�E0ʦ�e�%:5�!�*є�?�x�YÜ0�)9Z��[��%ff���~�Bt{����L��3u��N1a���S-�>ȳD�ń�_*��q ���z�J.m��E����:-��t�R�^NԅLs�P#Kt�AuI��Cqu�58{'�O�ٛ�5;{r�s�х��(0ϧS5���}k�� u�r4i��*qS2�(��QU��w��J5r7*e��<<��p�����"�ߚ�k 9ogD��?ׅw$\%�RR)���:�Q{Im�
{��uş�=�Y�.�#_f'� �6��*���+!�WFd( �)���J�Ŭ����ӊ�rv�zQ�J�;ܢ�/[���"���0K
,a����ǧR�c��?�������#2ЁU!��2��Dd.��Aeh���\E�Z}�愈�d����<G[q*у�������U��X.��e��q-Ʋ���a���5����d2�y =X~'�CYUrz���}3���_P�|t����jA�����f/3Tq]��|=ź:^�B��z��xHo��lK�T���Y��7���X�.���;�p�o��)��]��w�ᤲ�k�߮��A���pJ��W���?\���$N�-��~=� �������玲q�]�zJ���� v�4�Z~�N��m�J��W�#�k9�Е0'RζԒ�ZkʉT[�����f@ +'H����T�}��h�#�텵�p?�P�u�ɠ��.�Pq�|@�2ߙw��LƳ��~��l�R��"���<�~���G���O�!t�x����]����e�`�#z_�/J2�����n���#C?�R��h�b��� ,s��\������� �Ң�m��*>S>�Iա>U����&���,w��*R{�w
E�+R{�����J�߯T��~�NE*��7*RQ���+RQ/�Q����v��%����D��ԫ��l.n�������PT +'-�~���+f��F)���z)���B�)��W��?(��A����%�pQ�A)�t|L��Q2���~�R��T6WUˉ�B{,�Vq��&z����"�Ȩ3�����a.�vs�W��Ѹ��t:/�r)�w��^�,��{�=G���Q �p^���8�<n����4�h��ӆ�!�
��l3V��={H�l���k��ϙm<����T�=H�������9�#�B�2q�bIU�!/��Qz��;<�j|���� +?����M�Z����yR*vzd��fR���T�Uzr@?��\APq-Vȱ�E���n��i�t3��LoU*v#�"�����K� +;�`���r�n/JUgK� +�u�)�\M�r@G���=<��ܿ�d�k\y��r@�vxVa�r�Ɵ8>il�j�F-}�eM=�l5��:˴�!z��b��B�P�b�Rn��cŎE�GT3���G=CU5����KJ�}1�ԒS��<X��7o���vD�L
�%��䮊½�5�H�TC�3!���S�DN1�O;?�\"';>�{��.�:>��4]��Yj?�?N�zɍ�/"�Mw�z�r��;�tߋ�\[M'�����j:������N*&(^/?������n�|5�T,^:��'�t�pkV���U�Iu�rB�7�龩�����ڧ9��_���������SM'UK�1��j:�X���߫���]���j:)㆟;�;�tR�t2��������A�R�n5��qzc��j:���Ȇ�a5��+�;��UM'g[�n5�v����NԕxO����E����k�~��N������: +2U�rH�P�* +4�.'ܘ�J�b��U�.+�$�H!+a�p����DZL�ݑŝ�#����͕#s�۲�.���5w�s�4��߹�N�v���Z%����Uri+�Ӕ ���|���gs��l��2���t͝jD����q6��Ew?�掭}S��N��Ѧ��\y�I�I�^gQ���M�lr����i�O�]tA�j��2:�<+F�5�i�h�Q�0�O��\_P��H"Cԑ
� 9Y�
[ +�J%\s6t��?�9 +:Ӗѭ�،e߯T>�|+�(�p87���t��T/�̮�o�@��E%�d��z-;�LSa������결����SQg�r�1�1�V�0��.YR6�H�z߫R��rKU�]fP+z�r9ԣ��W*SN'_oI\vU>��
��&�E�y�?^uQ����x���ۋRV����)l??������N8�.W�QC!�U;�6��2li(d����
w��J�;%�+�{o�u7�)U>�`����Wn�S�'�vS�O�N7��|*�p'�K�R���{Ew�]Ý�S�Q���k_��f������:S7sn�:��t�+�W>�?B���r��ι��|Cn^�����z� +��S�G�VT�t�v��.��v�"&��(e��L������7�eLZ��,Ѯ��i1-eL�A��N�]��E��)d�T��趟VeȪeUj)b�DWb���~��UELrD��DM{�a������T~�a(qX�S���7j\Sn�SŐ�r�tW]��I)o�u~�h��}����T��0��U�=�ܔ��f�+o}��04T=�J����j\���2#
�h����|��������NF�ƍ)}�h4��
�r5\ݗ}z�)KL�f��b��'A��]�TPwc�Z�?T%��-�z������)�ɢ2<�.W�G�L��&W��*Ƣ�n��c%r��GY��B�=����vz��:��x@��i;c>�#�U9ڬw/)�7&D`�s�2�����O�R�&�6�|��sV\�� +2� +�����(�Zˣ}��RL�>��(V���tvQ.,er������m���0���{�w�s{}�ܴ��03 +TS���z��4 +z}���I&n����KC�����M�j�OG_��*�R��\��g�ζ�_�i��g��P2��~�nÒ�]����qzJ���oڼ״������9����o�kKF���%�qu�f��o��l��Mq�]<�<M���L�����M�N.�~|s��gn%��3�l� }���{�6���L��M��iŃt�����{�'qv�[)�yÓ8�m8]_����c�f��o���Z�m?��iLޏ/
����o���RIb��z��X������:��~c�����3S���+:�~S˜I�،��M��o�U���~s�����/���4�����ߌ���*w�l9�����-]�,eN}�&���]�&�r6Ӿ~S�w�{�ͺ��ԁN�lJ����X��M].��~��[�=c3�y�d]9��~��+YW�YG���7到t +�/�S��f��H{{�������Z��VO�C��>���q��c;.������l;\*/�T^S��d��A��O��r�;鱲���#������6HM-�AيSm����4���H��-��b+�W�mb9��M��:�D:q�����+�/��}ȡm�bI�K�[-�F��d�a�*yK�"�b_�Dk��堲�a��-�}�ŭ�U�_<�hp�xv{����ikڠ���p`Sh��(���fc��}f~i���4�q��Gk�-�6=q���M�{�4V�n�w䀷�+�I�K��~�ʽ-l�TRܚO�[�L\��(`�+�g�crFV7������_2�/��뗲F�����Ŗ"����e�k�fC%�K�`~(.]8�D屳�kK�7�.`;Jw�`�-��n9s����`}��G�-��Ə�,K��l������߫���eR��qb��)���R��w���0�ˋ�R�P�1�G�,�Q.�+����h���e�DihUM�XƷ}��ln{G!���J�B߱�b����i�Վ"�K�Vm���QB��ZJ������f���_�_������]g����-e?-+X���G늌�RR �));�K�\������ݒu�8_w���0�~��|���`O���q�o�IJ��b��c������P�b����ӻnsY��]^6T�ۻ�̼���K�=v8�X�������Y���,M\����z:���ST�/\J�RYűm+�w����wm��ڲ���H�����J���|������|��e��jJ��nl۩o�pA�9���Y����g?`gl� +�<j9��{�[��Q��s�SK6m?v���:�ݕ�HLg��8�������� c��X�/�_��v����+�wGΘ��\���Ol�7۶�V��۴��@`�\ytY���~�ų��~�U�^+�:��c�MsZ�8oO1:s��7��v>�r��ڪ��Zh��U�͕%Eu���m���ɴ����-0}|d����l!���],)>�+*>���_.�}���$��>��ْ�3{+�����9�V(����'�:�5�q����N)�"��h�M�D�I�ZBœؔB%I�>�Au>�}m�y%M��Z���!K��G�����1]M���ݡ-��n:>fV�))Yy��^��R�l��y�ɧ�ѹ�����٣���M��RC�լ�τ\�~���v6��5�ƶ�\J��̥�ɚ�|�XȔ�,����n]ߠ�5�^_��n�g��oeqBV��hՂ%�� +��-�V��6���]�
�,-������T`֏)$Qs�~'��ִq���WVe��\v=�������h� ��7���BZ�]"ķ���V�`Z*�������uY����>�ɰ�gy��ڋ��>lH��e��"�쨴� +�/-�m���ˌ�w���n�)b��*���;K蚦�����F�o�k��j�\V ��R��B��������,_��C'��^ܶ��qM2���D�h�&�wg�8f{�%���mqU��u[6��=�������651��ڲ���ҍ��L3_��g�]_����,5/�rg�ytg�.Ki�Xwķ��s�Iߵ��ۼoy�z���l{,����評�W�����EdJ�i�[F��)���e�����# ��Q�m���]�o�Ş��>H���V�[VQ|�1��SM���c�+��.�[Giء +;�bW���%2S�/-�Vy2��<p���8a�$W�0W�[�:�c\=�V����� �|��I��}����}I'��~�{���?i\��C�t����-�{�z������V:[VZ��)�Sf�2yj}qE�c�K��,�L\�ڳ�6��5� f!�Z�F?�J����b��B6�����u���lY�M��饄����|��-�r��ڸ�:iv,I8��6,ZSRZ�YS���S���܉�m-gN�i�,]���M�������-'Nԝx������'N4�z�y�7���YYq����'<,�j��զf����<b�����2k�抓k��!q��#'K�n�L?\F]�k�.=�x���cE2}���.-���..��r�m�I=�l�/+N�ln�,���3��Ek�)�ɕ{6��Y^|��cšM��+�w�*/n-9oX,��uLx��-�ċO�V��[����eŁ�ԛ_A�E�XS�]ZP^N�����m�Ƿ��`�w٦�ǩ|y�4��8Ҽ�:%���3W 3�4�=����f�kMxZɓ�Z��أ�6?�V�x��3��~�EX�2��,~�CֿMo12e-!�B~���8����R��L�^�q{ybۍ��e{�ݭK3&��ְ���5��F.��m�\/lnh����R.��j��妇��~�1�ͧ��poMB�6��>�/��=o&>m�0� O��d�����5����l�Ukv�]��'�*���{
5�Pj<M��r��]��E}x�=�¢
,���6.t�v��X�GJJ�քȻ�����衲
k�e�Z=B�z���W�M����e\/�P?����g����Z�A`c�C_n��!��Fr,��Z�,��r��U��c���r����r��K롒R��<��;Rj�;�P4�tgX��+&������%]�{��6x�V�R��=���%UJ!�N\�?ɩ��:dE��Y7��A�����O +��g�]4U�$����Y�����=K�>R���㽤�l��}��܃�f����tζijk.'�|��$0��~V'Nݛ�)+�7�)0l�םm2Nq>�es���oM��n����붷��+�c �y���g~��;�P��ݮ�l�
����h�� �u.�}�C7�:f��0X��qKY|�38��u�3�\�xW��ij!,����z&�-q�t�11����S������⩤K�R���>%����5�H�͖�T67�|��0IW}�i�q���?�1V��(��I�ؔ�8T^2�18�?�1V�T0�Ky5�K� �
��;��.���`�d c,�M(5��o����l��Ky�K�����J��j��W��i�����FY_X7��AU�ԧ�=_�:�в��� �������9���;˦ه�
ť�'rhEkQ�c�M=$��p�Ta��D�r/�؇���q������☴zٜFıe��G#�����������F��жr������Օ��LQ&���}]��{lE���Ɔ��#J͖�U,�[V�'O�k�����[#0|���-��-�r�Cnۉ&��pvYYc��R���-�4��-R��q��z_M�%1�*T�0g�0Ü�U7�g�}�^<��q����0��t�\�Zwt\��윙����'-���%�L���4%�L��Fr��B&M I�hMCRH�d)!��4&�L�B}�iK +�4%�KڒB +'K !ǒ���ISB�E1mI!������L +��Օc0��|��o��&�n;���E����l��f�}��Syİ��N/
��A�f�eJBKtGJ��Xw��\��4+.c��,��&�6�������`�zf��� nd��
+�,_d��ذ�F�uN�P����!�3#ؽ?6@�,�?�8_��r�#��c/�!��ڪ�L��U��.�Wt�� =`B�i�v��b�E^�ڰ��E2�V6V6�z*�2�fֶ�V6n>q�LS͑�O�,*���J��u�ZOi�O�ʕ��J�m��E��w=����E%�M�����M-�g���9�t��i�:�UCmM}�³���A#��z��.�4��&?*�>��RO�����џ� +��T>u�|K�����g.�9z�gˮ]�������7��#�kx��9��mQ�~p仧ɇ*��q�Փ��O�g���q��;�� �9wb��$�<r�������E�'�w�؉��fO��E�=%E�%��W��^��du隒U�OM�v횢�kK^�j�5��+<�V����YS�Y�b5���o����E��=���]�N� +��%2رUi=��\钒�5�5���8 += +.&;kE��fa�$ד�(�ʊ�S � + +B +=�2i�������<M6^# + +j�LjyU]�C�t-"vɣQ�����5�A�Tي�e�uQ�����bo��*���� +19rC._K"� +�F�3��)7���� +�>�?. +J��K��fX&m�^9I��͡��� +|�a| +a� +Z�NJ +uv��.��0�]S1���?�|��TE���{� +훓�V� +��>��5� +cJ�\L��~�ea���"��4�2���� +����,��z�G�$p�V��i�]Ҁ��OA����� +-2��$��f+F-�6G��c +�d̀�� ~`�Б�V��H��2rt1Y�X/�+&0W����*:wE��K +Ri��qD��f�$�q\<�0-�y��:4�շb4�&���GvN�����A��Ẍ�09�tQ�r$5�� +�� +�qHJ`栞;3$R���u���
wH#]��DFRU@}٣Qy+���'�Z���<`rH��q__�+[&�dӬ�L
���B�
�$�]Ԍ�s[��㖢� +���2�0Nc���Qì�����H�5/�\��y���癤���|O�<�*���
yտ������������w�F����\ѷ`ݲ�뿲�÷��W�,ď�f��J��]�|�94&�*~�Nh��>�;�=�'+�e����o��$����O�qYz��g춆��[=�
��4`2"�j�?>!>�5�ʕ'�H�k�z0�$G$w&x�����b9���R��j���YzL�{}�|k�!4&_>�Ue}�$'K�`��AOc�$iA�Y(<&�Ɗ?�C����@R��x�2SvK0�iL��]��!/Y�vey�����ri�G�E��EL��j`���J�KG=o_�x@n8�d�1E%8{�r壚��'�wgqQ���W��x��I�A��KU��A�0���U�o����]��E�'ouKГ���Gΰ&�����#�S�f�X�+�� +'#O��`��V/��`�탞gC09��rZ�v嘘T��d�I��'�L!8�:���x�I'A�������L?��
�|F"C��Ip����v�_<�(�� +��4=�ؚ����Z��Q +��.��r��������
����eT�g@3��OI��'�@��4+�t��JA���rf�/6���Z�}����{=w��wP�˛�Г`J4˕�Y|�L��3Y�n�ci� +ϳ&��}V�� \�n�� +%8����Iߕ�4�� �Qn��A+�+ ��`7t1Y��*.ުA�͖��8�y���� ��1�`��3�DL��j���h8�&�ӣ�zvk�8��I���!C��h��'A0A^/����!1�Y����
Rb�W���9����I+Y�E�����=q�X8�}2��q��S��j}��s�WBF�)9�uK���IRO�ol��xn��e�{L!8|M�)>��m� ��$���3^�'�&� �jn����)&��$]�&8$�f{��XL�����Z4X�$�Xƾ�]�� ���8�h����+����dߌ#��twW��(c���� ���s>��so@|�&����&*�V5�-����J���FoDqP��8�z�cH�
rG�"��#yp|� �"���$�B(�G�\����>��V���=)�B-�����8�݀������� 8i9�J���W"�ϡ¹�I��hz�Y��fT�N�������Iɶ�0���YQ��L7Һ�.s�a�(�L&�M�+ܟk�ܿ,���p��EUs�\�!�?��_=��v;3`21�JA�0� +��=v�` +�����na�(�4�-|�U5c +��u�_>�#�3w�L6x�� +��^M���(��ΆV��-�X'w�> �v�Ĝ?�-��P��Q�BOf�5e���!\b���Tf6]O2!��n'�u�B�~�0��dGP���^�(��=�wg:i��꿡�_;��qрI�犬 ?K4�B�r=a����;����Ѱ�"P�<�6a�����&$�3x�_�]/�S�L��)��1o,�*L�=Wd�OSUtg7*9�>��]����&k¸��ܿ,!1�!|�2-v�&p"y�͈&��S�'�y��D���&����փ�n n6X��j�a�E�����(G�����$W�DL~�U�P������!���I�ev����9.�������aPCF���PBOfy��aU��9ߕ�BG攙Oe,rR�d1�2�3M�1@FE7�� �P$������/��z�<�%~�z2��&�뗏{����<f�CL:�NTDqi!�ı{p��saN��^�\'[2�1@Ӈm�Q�u&&G5������v�.LΖD60�&���L���'ú��#��;*]�s���(G��|!�@�}s3*�g�����\9���0����Z�#qd�8�:��a�
�A�I��DQ:����kГ6�I09���r^|f+ʕω\0�JAB=q��d�Ӈ� hy9��j����^o���U�uEzpU�ۋJ;�$���)�����В{��9Z�U +��t0�q�'�Vî^'A�&�Ĝ +�G<���w���]>`U͇�U�$�0������.� &�:qzR�Г����$�M������כٲl?�|���Ұ�ʅU��DL��I�#{X�$�o�1e�nz��`��l�^Ü&t������z���_G$R�6GcГ(&٩&�_���#`2�S/CTD���
:
Q=�"�
�&��+ݟ:�y�2
����=���=~���7Tʯ���ո:��J'{�M�� +�m�G}�z�*,�@�*I#`�gO˟��!J�i'�� =A��q:x�Q������B���p�t��i$��$Q�|�$;�DL~����i���X���W� +�q��� ��"����B_�����Qf9��9��(�r�h�>{�ۥ `2#���mJ�'9�L��]U\1'A0��s>��=�#���$���)9<`rD��&�q�&3��Qaﱈ�n������n���\$��_:�}�e�ݺ�5oƜ�'��k�7���ې}�q�e�aY=�D�vH�9 = ��Gބ�OyQ�2�y��~]g����R=��I_w����M��"z$�2�N��תV��Q��L�N-Lk�Ț0�락|c���I0�ʯtH�;���I�o(p{�s�wʘ;Z�^Ü���&�\fGP��3�����;;��e��5ۮ�HI2�j>��s�����H�z4V�bҙЍ���[
�����Π�����N��g�띕$Wm�1!��0G��w���w `2s
�zMZ5N���L�뮅�B0N�`���>�ˬ%$e�N��=�˕�P寞����I�op2��`��/����8N��yyZ�'m� . +��v�~�ׅ��&�D��zs��8
z�nŭ���[A� ��(��!��Q�7$e6��'���vK��R�LL�F�<%}��V�D�d&S32q�Z/0N:�EZ �U� +g7:�<���#���;�H� +�D$��Q�� +�1{�%Vv2 +=�<�E�tY!���":���/�������*�1 �LJ09�ɿh�>u���l!�ġm���-�T6���U������a ��-$�j����^o$�d����BJ3`�{�� 4���L�\�Ǫh��8ʘ;d$�עL:���G��}�����*�����<`rX���Izf���ʳ�TL*�K��q�IG����j���8 ��'�����9Y�W�;����&b���_>鋱r��qg5VƼ3L#'���L��
/�G�Et<y�� +�� +rt=Y���n�'AL�� ��(3�������v19�y���(W��de̅(�āq�iH�0�x�?�qS$O�y�Na(F�zCRf&�_�� +%/WN���O�p� +F�? A�.F���'}�>�Ĝ�#���{l������'}�0-W�4`�Q3�Pg7��N_A<]�d +Y����Is2��B̽�9Ͼ���wQ�p��^i�xm�i����ݼ!� p�d��[��` �i9�J�G�[��;H����p36'=�˕�h�7Ή�t6���՞8�N:z��J/�� �7y��WXF*f�VS ���W5'�pX��u�}�
#`�zR/; 1�0p=
.���>A�yv)���y�����Up��/�NO�ɟ�˟9�!��&�0���!���#'{ȊRq�8 ����(?�_�7 �e&����P��QM����?�ͲoP�4����"쓎�^v��#r�b�Y)��Ḿ������$��L�P�o���N[r�>�@��%�_F�E�A���� �@��!"��6�5M���v>�"���'y�����7��=U4`���f5v_�71�'��vx
�턥�a7�H��]��\��a"�]V9�o]�!�w�R*A�&_�?�� `�st�Ǣ�`���� �@"H�a�����m?�`V��M�<`���?)}��������ZOg�;Nc +���e'�B%ك�n3���}e��JMm�3���?�:��0 ��h�e�T-�"�N�, ��A7j�� �i���n~���
|�DN�w[��*f�D�$����j��8zv; yF�n��}�!����ۤѨ��e����ȋɿ�/���B;Ep���]%DC�Uc +�co�8A�T����D�$�H$ͽ���ʁ|�i4*�Ƌ�*I�ك�K�R�M�T4D�N�&��ij�^-��F�I3�A��^�W%���X=�M��{$�Ʌ���M�<�(�J��K��5x�+�6`&�L���*2����=�������A'������*&�_u���Jf$*����'����C�1��?Z���� '�:(P�1�$p[t���
= ���$��(�_]�n��db��z����?�%�O��E���=TR�!�p�=���8h��rG������AǒwT��Q&ӊI.cnu�/�H��Gcc.5k>�S��t8��Mq�ZΔ$�����q���� �C.&_���ɓ҈6����I���wz�E h�����:�x�8�|
*+;G�E'�Z,�mA��d����!jdT�Uh����D�E[x@��J�8EuII.((N��_��Y�F�/�0=Y�;O��h����ɁZ��.J7�)Y&�z�(m�[cC(���\��^��V�!)HV%f�V�{q�I���ɖ�����(> ���I�=��$��PLr�2�����mou��ju|�s�.)mc�B��F��2��t;z���k�;��4� ����Du�Ac&'�-O�Dy�Ǐ,��~1���v�.)�%���{��6�������y缧��M_[ ���ے�X����\%JdbDZ-ﲭ}I +m�������#8�Sx���7W�U~&�I +� +;���EK��f�[�Қ��Wr��QʿyȎn��G�6/�s�����f��X�� + +�g�'��+��]��a>۠|��V_��v�+eJ�o�}2�vV�� +��$_~�4m�]h25
�^�"W�$Qc��s��R>#��[�����'��Fe��s9�����d���-n��%���} +[�??ye��. +Qf��"v�[��D)�7*�= +ƀ +z��cB&3s �rQUFQ��xF����ɾؽÕ�L�P�܁�+�h��n���'3��ZLjy�n.��7 +�ɀ���m�A�d�.�W�b��`&Xՠ��ɾX�r8����F����� +�x��s_.�|����%o�!ƞ�U���e�aR)E��Ll�n�K��^QTT�Fml��]�n)�9 +-D�-!EiѪA�3�i�wUy���[�X�6��ind2�"nSeS�-�֖>Z +��d�I"!�[�xi�� �� +N��p�<>��R?$���vM���%,U�`�5����*�� ?QʘL���4�d���Š�&S�A��e�^4����w}��3���SJtc� �C-Ehy����+�z
"{Q�*���7j������wȇ�B +y���p���O +[%�r>�W�����ֺ��G�5Pz+� +�zk�2�0���BWJ�0l��52����� �CEE3��'�.��4�yj,��Rnm��Hׯ�i��@/��u����k�g�*�L�+t�[E�E��jZ�싥��R6��F�9ϒ��֊hI�J���:�x=�U�r���B�+�<v���;�l�"��6j�6���� +Le�&��ODP�Rh��D�̢z��M��I�|V��M2��m�C r6@&MG�y�MB�E#�`U�L�!�� + _���C�cJa^�r�P +��M���������TF�ΐK�2 �8��X_by~��݃ty2iz�{�8�얮�I�/q�J����!{�5�f%(����(A)*�J龕m������h� @��e���GBf�d��/c8�c�����Jy�A�����BRJ.*ͬ�L%���v�%�����h[��&7I +e�>ɖ���->�RjU�����F+�7�*�3��AȤI!p�Y�w���.z�^�%��X�J٨|�>[�,|O���X�J!&�視7�:�E�J�}�e�M��)i2 �4%�%Ny�TK��pP��G�W�؎����9���8�D �\ V�\�#��VVp��R����]> +�{QAas#�6�~��=�X�����*���n��WN[��aG�s>�n�W�z?*���:�;��&� +���½��2ǀ���iG��n�����m�SY����g�����F�o��wK9�� V�H.���2YH��@<t�[�
a��P/N?��'����*e�\J����9�����o
x��~��JT`N ���{/"Ei�� +:�ϕrPU�����ڦ���X ʠ7�HQ�u����|�[�2���� +���Zj �z�!��` +�%���o?�PX-��L��A,y��Ƌ�/��Ɣ���R�PGhC�'�o�F�fm]Q�C�_iU��1p(% +�"<W[���¸јR��5fRJ^����.���|�\QwZ'BKVҽ
|��K�~ +Q��xa7^�e��Gӱ���
y���_8���?Y�'�����e�ˬ�2��� +@&p�쨲�t���$/D9�- w0�A����9Wʷ���aEYy�����5�z�Z�Jf��`/%�k�er(D�Lb"I�ދq�M~qs�^���<��#�ѓ7�o���E-�d�'Z=�b9���ݢ���[Ƞ%��I���H~*g�-y㬷��u�h�8Ӑ#��yd�U�R�&)�3�����J7"��� ����n�����T�L�TXɓy2 ҂�^�4^�mȱQGYo=#��ן�
G�7��$V�<hv:6T�'B�-#-u�͓ ?!�<������`���H�G����+-h�8�c�ʛ�����ߊn�d=qh@&9�s��[C>��)+o�27�C4���6ǀ +��CGNl��C'=�t�29��c{)���J=���V�;4��s���7�4 �2I^��Ӹ2 2f��)^���X�<�l��PH��㎆K@�su*M��^['8�{�K�/a_��"Z.�|�݀�8���Q +0�q�Y�O�>�r?��ͭ�FOqN)e�[7]�Ɓ�[�C�3�6���Q �L���w��L��z/ +031�-]i�����+\)�ŔR�c6K:�ˬ*k���B�� E|wE�̦z�C�W��"0 Vj�<uy�S�^���^���m�/��@r�O�R�H��h������r��+�{�i.�o� +�G%�&Mq�nި-R=V�k�9I����HI��v�Q�dq��Ae����:1މ-�)�C����a�-���loWk��.4�&9�#~u��d�=k�Ra�CSB��_��N^��\�Y +z/�0/�>U�7�6g/K9�m���t�=�j��{�J�����p���� +B)� �L~�>��z� +Q�@'m�x�M�z�����p���~;1�7j!����+e��?�ǻX]J(%�2�LB&A��%o���i ~�? _ +;���
x+x�hA�}�� +`2Ȑ�:�{Q��Kޗ���md�^mv���I�$B�f)+��X�V �B��=�]U���O�c���8{�E�������2��u����g_���Q�a@D���b���������]2��Đ�=�>�u�ǁ1���6W_�A�I���e)���&�?�L���^.c�`0�'���m�^�D��w�X(Z:f�h]J(%ȘD�� �`h!���O�����-�I� �JAD){������O"���RzD)y!�f�.���27�B��/y���.\o�>�熞��.�"���O�'�_�n*�T��YJ�"�4��~��gC��&P8\k�������IFo�C�XPͻ�>�B�� +��ɣ�hi ���S^�2 +�^�T
�Z|2�� .��<��#��ҩ���K ��י1��TP��T����.\m�� +@v!��ua�CF�E=�ˣ��{�������@d'��x+��RB)���`{&���c ����p!>9Ʃ ����ʍ���p7����Q�P�R"K ���d����[��)U�� +�����yA��(E?S�ã��ZP�0�H�K�|�E�;.��T9�N4PN2��'n����<v���>�;�S����_p�x���sJ�����Gl�y�����о$|O���/�Y_���8Ĩ��ۻ�!U��K +�O"r&�O�x�VW#�%�!���8����Τ�T�dՙ;�g�x�L .ϳ�a�4܄g; +��&HQ�(D�c�2 +� +N���B�X�N�Ӎv��A��f^◯4����X�n�$"�u:'��ȋ�9 ��`n��e�!Fՠt��IZ�>�ȍ�6�H�]2���v�[����ǯ7aA'�N�t�EF�۔ ҕ�ᐳ?Z|2�D��X�����"�% +�] |2c"� +���C�9�>y�aAQQ�'�擣��I�%&��`:z�\k�p(2
�U��`��W�h1�wvQ���I����ث�]� Yc�� ++f>����++�=�R��)b!�:&
��=��$/�(; �jQ0~*g/��3�Ƌ?B���F'�I���W��Â��I<��p������b�����9Ή��'���'KN����vDP)�(� +/D)���/�A���x�Phs�|�ȂE�jkkc)J,y#����tq�D; +�(H +�.�(���7v��]���'�Kag������%Om�J�,E �D���D���HN�] +/D �LZ5(,���_�D|�a��M%�{��֮-^�)J���ҍnǺA� +�=�K<,y#�
*��_�tKHN�|���$H���7�2Ӌ��J<��ƹs��9H�]�=�BM����C�x,�ul���am��L�N�x�RH����q��D�ؑ�Z��O[&#�j��L��U�'�X�q��NqWi���)o��[�� �'Xr�/�ǻ���O�� +Q.^UA|�_�F�1m���|^gw�� �� .5�����1���U�Y�o��p1 +��Do}���v:z�K��;%�l<��3{�?�a܂;�q0q�d�1v�������'o+���n��j^�\�H|rŲ'���)������{'�� �Jߊ:�$s.y�R�D��L~�
�o{f:I ������薆CRv���Ń�����䒵��sٽU�غ�g��)J2T�/bre�y���ؖu�U5|���E�]�k���K��'q*1m|Э��$0�{)���=���C�*�����Ҡ;'������s�婭6�)�2�B�I>4X�k�҉�l�<��1tH���S�\SM _�K=?yF�YJ�z�ʓ=
�4>�-���ˏ�֎��F9�VEݵ2z*'��>���vN���rD^�O33U)�\%-.�w�ՠp1 ++�+%y�4�*��Ƿ���.�|����{�l�&ڶq-�˳��9��4~gVI��@���.����3pɛ�(������>�W�o_[��Gnϼ� +�{��|ɛɹy�[(-xO9�MN�3�d���+�<Wyz��h�(@��V���/������>U��j���d�R>Q}� �L�#ח6�>��OrU�̖���O��'$f���R��tQ\1�ٳ����C^g����ʋJ%�|�[(O78_�z'�qV�����Һ.�%o���' ���J/���<Lp��2U�@����zִ1�7�8Ϊ��;���!���j|-!9�d�\G�����C���ˡ������aeK�����ءF�7�!o=w�ms��h��d��Q
�o����C��qKe��S+�Oa�>y�ʺ�/be!+;9������ +��dMN��r��O�M�Rr��i��D{�L�mnN�����i��-��^_�ɞ9�i�rǦ5���KI1��d�� +�s�]��F�W[�뺅����O��wg|�;��GW��Jv՛�w��^���'ɗ��+�O�^�[��v]\zw
_��'�(� +��;�� ���=��7]�T�[;������sD;6�!�yj�[tr����46Oj�0�%����v����6�<9߽�,�!�8v;���α}��>4�{G:�l���+�x�n�\�n���$�v�N�I�(���^m�ƻ��w% +Gd~��8!���-[���dR.��amߴ�����G7O֧?H.79�Y�hu�k=�M���H�O�#�7|�@�F�=�vN�>��R�A��0{�U��.G�~��ۜm����+�O��8�}���� ݸ_��^G���/h�v�����C�ګϒ��t�w���x'L�'�ݱd��?}�V8OH��q�'�M�ך]g]ee��O��u���UuZ~2��"|����NN�m�����{( +���yk� t�w�,� +����s�nt��$z,`��20Y]��,��s��$��u����{�n(��z9UR2��9D��s�`F��n�� +�3�$=��dR\o���w��֭D,�}v�����3�5�M�����?}�i�o�*������>��L)�4��e�m�Wm���e��O�<������?�1 +wet�3���4f�}�W�ֻ�7�[�J���2T���km҄��'/�9�H��7�����γ�#U��y&�Z�'�*�}_|jeO����sFغ�h'ͦ��6���+ͮ��/q�7-]W�b�f� �����'MEѓ8�R�$'Cne)o�J����ۧvK���ms��V��Op�u-��w��~����[���/EI;��v�{gR)��H�����=Lsg,/>�㧝�|%�ҺG���/��(�w�4/�������&��m�j��϶P�_�����Kܛ�{�<? �4s����.2�>D�I +v���n����y�$ +K����+�����}�r��!��y�1�~jv�T<�\�R3N�r�ʇ7���(e�\a���b�\���]<�+���y���=~�E59��N��'#�$Ǣ�HiΎؕ�-[�K�~y�uLF��͢~r�E?bzr!_Гq�x����g���+���68��2���udshc�R������_<Ծ��F@���<~{W���)M�a?X�2� +�՜}�`zr߽g����o[��y'�R��S%r��HAy������g3=y�_O +� SOZ-��&�er��"3q +:q +ԓk"�I/��>Y��_��& +)��w�:+v�[m�Xj�v +�>ݲ-W���tk[�����y��
�'��x[��F���� ����t��UM7���տ��-���UH�=�3�z���\��;����/�榠���d�z���7_����j�Y+��Kv��j[��G�����-Tj�ʓ����G=��>LQO�x4v0�r�f]~�
�
�^\O����>-� �HR2i����4/�iK�H��
CuAk����s�}`~�=���Ϋn�麋F���i�.B���k^�J#D)�'-l� ��M�j,�8�>ޛ����URX�Ralϕ��d���`�GB_~J]�z��E���'�b�8N\|�m�Ǝ�oyp2^/� +��!mYH�yϸ:�(�g_i���䤾����~�`�O����.����+̳�y=���97��۳�Vʟ/qU��-Ov�r�xHy��R�9��>A,�a���d�l���a's���DfJ��T���'���.�|���/V� 8 @�b��)o��Ե��-R����귛T*w/�� +�/�9;�^P����[|�m7]�pQ���x��n��_K�er�Z��f�@I�_�Xц��f]9>�p�Qs���3�Q�v�=8Ɉ���t�:-��I��bΓ\��]���J�?S +o,?; +��(`j�>�G�SHU�^�6�m��
M&)�W���b
a�x�2;�:�ՆIN\O��X�-\�zҩ�'O�j�`��� +CR�VT�?ג�PUt�R&,�r�6�M��2�]i��� +�A����4��$¯���&�jޖM��]~�b���v���/��|�0 +{3q�'�x��dAj?�D4 +ER�!�]y����%|!�ԓ-YLOj�
zҁ����`= +��(�����|�%lɌd�2��1��>�Ȧ��Za�����=��Xⶓ�r� +���-�O�`� +����E +�f��� )ÅI��,y,S�/���]����F� �x��vyR��,�N�I�/�<U��c& +a%�oH���G��]?�����d�06�_��c�=��.*�w�|��d_�r�D> �6 +Im�2�C���8�-Fʹ��[��h���Vp.�/ГvZ<8�ei2���d7 +�?�L +�(�с��>~:w��4�ۭ4����V������Hv +��/v
>�N +'���X2�=�t�cHʘ�U)/���t�5Г�,��G�3��Q' +208����Zv�c���q;P{�ܖhH�NH�|�Q�.P{�$�5ۡ'�X|��,���w +N�����ka��ޜ
wt�ӑG{*"�JH� �ڨ���=��7]!�~�Q�|� +w��|�����@��D)�ྔ��EXa/n��_���w�w+ +]�Œ�, +�c"P@m��H:���!'��|��d�o���<a~+o2�j�Х2��*�Yr�*�9jFZ-��H���00�K�Ν� +g'��U:�Rn�۔���x;0�����.&��0��D6��5gS��=��}�Q�O|����'{�<�I����P�5�_��o��[�� +�6XH +7����>�psߐ�����Z_��[���w�7�po��t�F���.�+�������$��%���3a)Z�س?��Ii��&a�Ϧ�z&�����JGN +R� +oɦ�b=��2��eGȹo!;�=ֿf�|D��܂s��ڱ8�$%G�|��[��'���ћc
Uk0]DCXf(M�jK�ڑ��&j�� +q�$�AE)ic�l.��KR�[��93��v:�(�09�=N�(a��a�5�=A�1:��!)}|�7�]z�`�E)u��M��Г +#�[��=����J����I�痔�E�s��˧+m�<ٍ�7 +B� +N��/�k�<8���V;�H��;-b��o��x;c�M�9\R�,�{��Cs*)�rȈ�g +�RZ�:�@���ʗ�2i3'R��ܢ��l��'� +���� J��&>�(��ٝ��<���7 +���d�jx0yM,��^C� +�Z51z���l���x�MYjO����2I�0�
n<�����stQB�jp#�
��L�G�ǗI�i00 ��nu�e�G�������D��`���i�_���I�b�6���]�Y���z��C��%�3_��r�l�r�ʗG侇IJ'�lFJ|�(~��I)^'�n��P�7|9 +o2�ѣ3̱����%��R�
�~4���+���,>Bқ-}�J~���wKi7'�}i���%��I�uz��3��<�4�̙$#�������'�q�C��LU�Y9�kR`D �=H��%Sp2��
+[@��*�m�,!��!)�k�2�)ɮ�ty`=�V�^9��z�==��$ +��:�����XYy����<���(a�TΚ�YUT�C�>]a����a�m�������oL +����x�;З���<^g��� +3�-%'+�b���I��Ocz�7/z +��eC��e�ܙO�CBR�X�7��'�(47+A��A�R���R��4��)D��� +�� �
�����9{�����JOk��Qt�p��[{�o�t�S�9�Q�Kѥ�%W�m��n������c|a�1�}������~I�?.�R�(h|ӈ1���q�M��T⨢q��zr*zR�m�Q����dg>�It� +I ��ѵnrKII����t$�A2�}�f��.���1�~ϐ����}��?�����V?��jk�J�y�b���U-���7Js�:��#Ì�*�'''&]I�b$&
�J}.;k�rSPE �е굱.��^�6��H�w��wk~��i�H)i&)%}C�T�����<@Y��z��y���8�?�o>W��K���*1g�RF뵜��GOF��|�%R�)S5���n +uy�����Z]Z�M��//_!!8 �ĈӢc��J'��u��֞�E�F�/L.\L~����r)�?�[���+��T��ݤ���b�}��B�/��:F�3�;��n�
�'C�II�̙V�I���!S9��Ҩ�Hy��&�Q�w��m�D!�ne�hiӾ{��1f�C����ڇo��O�����Q�6w�ŕ{-��凶3h��� +F�}7�����1�2`��r�'Gד<8i��ԍ�w���(� +&t��禇ڥgP�ˆ�^>��b�e������R��/��]R�{��^)�f�ϗ����k�ݣ8x#%��@O�ɘ{N��x��}�$#J1���� +=�I[��g���i�)R� +N��p���6fǴL��
g��O�d41�
܌��uȏ�b���ƚ'�:����̗ݛ+���Њd߽��@�Q2}�T"Ӎ��Λ�?���"��t#D#H4�' ��I�xWN�����WK+ +Zr +�fk=�]��Q|�fd� +N +2S����9�<�?�����l���K�~{�D=���}e,��`�o + +:C���H_s�T%[�dz��wogb���_���W>�O���=�>ܷ���/~��.����� +>��β��9K>]>]tͷn��٨�tv�5��5m���ww���]L[ncb����?:����^�`��û�?�{���}������q +t���a�s۶m��z��J*��x�o���^�O�����$/?9�"�����mv�fƙ�,�� +]r�˽�߰ +ٴ.�_�5dB\B\#톶m=���B+ +�ʏ�$ҏ�-,��%����17���r��!�o� +�ƣ�F6e�TK�#2I����'��Β;yF;Q� SYk��4��Ŷ�����^�#��������xeI9j�%Ӗ];����|�]�PO��c2S�LC�(�8c�ӧ�v�w��_�O?=y�,M�榦���̿�����-�c��mOn��ܓ;�������/�M��T܊� .��n#�ݜ�����ͫ3�ty���`<��D{Q�2#=�+x����˄�����7H�XX�(��=���_��:z`��s�VO�ik��fR��3�8��N��������LR�}V�ο�ҋo���_�莕��6/m哥��<�ػ��{}�%���;�8��o���kݢ{e�ƹ�>ۖ�%�;�Wq�M]��Q�A2� +#��@'EbFFt� ��p���A�Vn��j�Azx�Ɬb�������0Q�y�@O����O�"m}��駟~�}����/�*�s�5�_rǍ�����W��7���X����M��>��A��|��˟����^d� �����~E:�{�k/=c�5ײ�Գ{ks&���8������,/o��wk�,�{g�N6w�� }���g+]���_EU3Q�k��mg��4�<���Q�\0��VD\O]f�LҌ��<��~�L��șӧ�N�.����t�o~��u�W�^�xQֳ��|��7^|�)���$����Tί9GFg맯���ޭ#�x �xW�O�����AO�"�����A�Q��H�[��P}n�)�\r�/�8С!c��;����IU�������6�G����ӧ�[���C&�y��N + +�W?Y��ҟ���^��̻;�cH���.��P���z�0'�J7���g�?�������:����k~c����{g��.�r�#n?�y[6F���>]i��}��C�θ�_��5� �=��sGv=oW��{���{Ã�l����R��ݢ��8ό�� +%@B�c�܀�GI�@������dl5wcl�q�{�l��|3�w�S��I73��=�!������}�m#:e�N��}�129!��1��w�Y�\t��W]��=��>��k/L�z�f��x�{K�G���l�!�\G��L7s�ǥ��k��b�ny~��D˨��OoD�r�7�D�-��V�+�_�~�gR���D
0�-��$n��X�s��H��= �,zY����,7��.6)'^3'ŬƊy�n��n,�����XX[5�I���Y��.�+�G�:��՛���u���s���G?�᧿��O?r��L���s�y�\�����W!_̇\V�U���z��9顱�&%DBV��aU���OQ�𧼇Uxѕ�%� +�cT���F���Jb��S�i
}�E3�s�����F+��?(\4�T���2�i�!�n�x�K��XXm���$�E|r����Mƭxt<0������μ��v�������ʼnO��g����̷x���*�Z0�}����1��#5v�+�1g2�hNf�eх;�<5��s��%����;��z�Q���'qkJ�.�i՞� +#U�րt�uy���9�{�gQΛ�r�L�����o���]�Q���틼����i��d������4�_�`^{tB¸λ庫�ͯS{��R�����ud?Y4�]�.2ﱞZǚ�cx�������N��&����S1�K�2�g�����&W0��������>9,�)F�v��^�?=��ܿ�rVΛY�7�p�}ˀ�������nqw���yḎ�o����%t���y�o���k~u��O=���O������:�&s�0��.��x��Н��t��ֱ�M������J�9oP'i`pPaƚ[�;XQ�����x�L������x y���ʋ$kz�Y�FjN��K.��L�a�\>>ǒ�?�Ǧ�n�A���⹛��0D+,����i�9n?��&X^�Ͷ�l1�q����~��f�u$��Z�{���0EcOw]�%?uN���� �6]!��//�<�o�ndJ��j>�^��QH��Ks�S�k�]�`���.�a3%�fn:?CQwC��-����6,�7#p�U��:Q��^��Ŝ��ܬH} ʊ8+g�����S��Ob��J��!]�]��I�ޤ�< �AB�J��zk�8v���L7���pF˛w�v/Ʈ��^ȇ��C��̴Df��b{�U�g��`�ʒ�{��|�l[���*'G|=�C�����{��@���XZ�`�7�m^N���27r[J� �_{�>��0s~@-D��Z�eq���2f������s��ֳ)�9q����Z9o��Es�IDu
Q�����T�϶`�Ğ��=�P�<!2��^̜I�{�p����'ѕ��2x��Ԥ�b���X7%n�䑟?�3�q��� +�V��')��'��s�j� +a��z��y�� �S�Xa_��{�����ɉ܍��� �ww=3��'�K��@2�E�u�EiAb)�*k
Hok��^���-.���n.�u,�������l/��'��ֱ-�����RqVs�]9XQ�x+MЇs���ȸ�ޡ�LJ粃��P�����^.Uw2jH�� +Q�eUGO�[+����4��'Y*���2JgN��A�림���w2\�(^���]���}�����Ըm�����>9,����,��@u�X�M
�O�fGf�Ood�%8 �-+-��-�%���%��K.?��3�Y�X�]��^�M
�rҍN˝��&���Nn�&B�;�/�L�G��&|�?J�}�"E�_�M�=��s�O��_7hF��̠�=๙U҃>^D}ˠgg�e��CԱZi},�n��a�}����g�_�校�����ۼ�^n�W��AX
/w�Ojմ����kDCV�o���Q��� �5@s��Ζ8+<t@z�!�e��K�zxZ���/8�U�X-\�����5�f�Ծ]s�2�ds��G��G#����SC�!��r@��+!wOL�79�m�r��~N��\k#�.jwt����#���^9o&� +��h��������������g�=�2� �Z�{��l�e�M�3��nKr�G��F+ݸ��ً�� +F�{?��"���� NH8�\\�����m +1 }ypܐ��=�۷�Q��C�W���.1D]�垙�fќe�Y�Z�J�X���*��(���$FM������#�&WD�_ªkm~��NMb>�6Ѹ]!j_w����U��,�g�Ç�թYc���^i^��oY���ܳ�fD|�P���U��^�������D/�]�1��7��\���f3a��j}"R:��?{�K������$wOJ<�\s&>s#yad���}ț�� 2-~����䧕�*W͟��(g�;�Nz#^R���T�d��=[|Sq�!�X�/����Vf�U���n�җ�U(��������~��Y�K�x�'#���[����&�H~̺7�#�sR|��5��$�H +/�`FzcV
�ryA6s�?,�˜��E����+xf��3K���&t�}\�t �����Cx#t[�[��A�r#_�{R�h$?J;i�7n����!�B��H ++�>���y��X�g,\�?j2�&�wt��I �R��Mq���WQ�B�k������`[j�v/F|z�;x{+ +� +�̙'�{?q�Dqx
s2yF;�����q +�b���s�݊J�n�^0��yG��-�J�u��'8�2$�y0��9ϫо]���iy�/qI�N��6A|�!ݒ����y +#�y`J�aq�� �ćFN���g�^<��&Bw +�kW�$PDž� +�s��M�g�]4G��Y�����A��%�yKjw���o�qqsk���K6�x��D>L��Dm}vs��LJ�5���[�Cn�iy6Y��I��ȝ���x�8 +o�,g�}Z>"ҟ�v#+�J��o|���uk# +# +�ObԤ����Cd�āܖZu⮉|���)I�0��b��;4t��s�YWÍ +GYb�e����wi^V�S�Exn[SZ���{j�ߓ�9��_�VEJ��T^�%%�˿&�xa�7�0 +�� +��o)�Xf�����Kϙ�����{ۄ��J�Τ�4x�ѣp/wz�zj�;���M� +��}O��i:��t���(��+�u#E���I�{'��Ή "P��}"��u艇�@s
&� +#���� +(}�/L.^�_7 +p���H=���e"���.e�{)��v�n,�9��ŀM^�����W��v��R�.���f_�ծod�88�]�y�nj�,?�ԗY��V�7��pFQ���rrZrQ��bU k5��S�� +���M_�{oUNNa�&�?�_T��Q� +nA�L +b& +�ڏ@p��ý�(z>�[�ɞ�GJ����k�Q�Z������#8>�u_��J������� �����>���ܨ�@f����.m16]����a�w�� +?a��Q�P2�=`��ܸ��+ +N�a�S��ǩ_OG��b�<���r�¡t�ᢞ�~��q�Ϯ�t�f[t��(�0�3�%��`S�Vx�Q߯ M��<�����l�a<+J�I0�M��7�{υ������n���^�5DZ� (��ϢEn���Hn\p�1�< + ��H�����|P< +LjU�^�n��.I��:5\ub���⺂ �'���c����������S�x!*�I��ՊJ��K�EŅ���##/���O�G���d�}��(�{����
����RF��ڐ+}{��aq�6�.�����K>m� +�n��_�(�0=�Gj�yOf����e���Q}Z�Ʈ�5�[�U'6�d,�1�[8���߽�~��S��Z�Gbߏ��{����r�f��@pz�/�7�y��� �U6�@U�S�M=�, ��f�W ��1�{^)?��j�1��#O�nܜ��M\��R�a���]��K����l�V
�~�����!���_�\6=�s8]���H��;_/���j����C��������9��L�=���0c�P��I��c�����6b�V��w�.�N�m��:�����r٤�Y����+��ubӯ���yȀ9��\VG�/���k���������M���*����}3I�mY�U�Ev�d͝v]qC����x탯�ʹ�j��M|(��Ο�&SԶ5\ub���Bo��߯�NC�{a�֣�F6y�V�AX�W_�&�I���w�p +a��=����`���.�o:����{k-�;S[�LփE?N��� ؘ�q�Ms*��g��1r���H��V����vD0P��� +�I�د%���Oŝ�j�n1���EW�Ʈۍhex.T�ql�/�#S�د��WM���1~�*[��>��ycr�S"�����h���m��2����w�7��B��c�-�v��w����pՉM�� +����ɗ�9{�{��j�n1���������,w-,�u,'�!�$�3>v�S}��-š���i�<$�u���W6 +�~"��DC}�M�����=��>:ȓ���m-��}go�M2���L��~~����W����h�V��YC�����J����!v���������q�[+�݈����4�{7�<$����?r�f�^:��5c�=o,�!.{k�Ģ34+Wg�w�q)�n5��$����?����WW�� ��ת�P�>�n9�[��Y��XtqoX�V�0�~cn�[�!2���b��Fje�L��*r��poy �0l����_���{�#��C��*Hf��o+#7Qؕ����4�C�H�]�^�U\�Lf7�C+���2I����P�~{�N7 ���k�|�ߗ~�|�&��6ݠS��CF���P�n?W�
t�0c�U�1��g��s� H�_��^H=d�b)��5�� +���`.����N����Z:!�Up�s�6��0�Y���Mt��&�5U�٧��+��ɰ�BmZ��.j��{6^���hC�!B^��o3w[4d����c��� �P���r�.���0�q�:���;��C�:�vcv�qh�.{u&�������M^��}h�đ.q�<1g�(K�x�Hc�����pd�G���T��3>���F�e���}2���E�п�0G�=Ƽ2��{XMg�Ţ{¥l�`cv�+����D�п�Xt�(-��^��J�}�����^��B���O�� N���0kA,���-6����D�� )����8�����P�6Ʀ�ޠ��!]_U]n�n�[�����=0m��Z�W8�l�������]��ƽ�/0�:��Z�+�?A��Zuث�?
<4C���P:T#<�c�{��e���:���_��������U(ׇc��X��H8�����8��w?�# +G�ۯ�����A{H|��%�u���D
<��D�Ͼ�?��C�+5��6}T��kx�ūeY���]�T���>HK����~��rWk�bA��p�ѳOv�{��m�X7�M���ҘIUc�ٿ}�d�"���ݵhf'��{�?٪rQI�tC4v��2b��[�-
�!���m���ycN�G�L�b��(�r�/�7�$���k 'R�^іa�ONS����~�w�Y7*>_&Jߘ&l��w�����;�hf��T��J{�&1���On"H���q��2n������7��~�:��v�?E=ĘBu��(�T�[�C�I�/^^�x�j'�¢�)�!�!�^�Tn�D��5�����x�:���J����uܯU���WvZbH�L=j��Ħ��Sp��잣���耸���4��H]�yHWMJ&�Ʊ�4�b&���3o����S[w��Ǧk:({C=$n��r��$�ݏ��k�o�<G��d2��������$ :�pՉM+oS����O���~"N;l��#�C�=]�
�IƬVq�dӰ��sT�C���������Ő�د��������4L� +]��Xt�H�'r�ܰu��'fl��+�?(�Ħ��y/���юh�ܜ�<ͨ&�����x�6�oH���cӯ�TRo|���ߡ>�v�����g��gXZ�����d��=|������|m�M������%������� +��G��<���2^ +{rR���$#6��(�C')�
���&���4��Z��b�7�*�M1�v3��@Ul�9A�d�A:f¼U��/+-9�;D'��8���Z��r�RI���eކ�Bt��E���yc
�*6��c���� +��*-U*Z�!�Z0o@Qؓ�t�%�♃9 +@Ul�?^%w2�\�
�P��Tj
`��_ؽUa�� +ɍ��N�@2 +SI�ԉ��d�J�7�.�QǼ�z亁�0w2^�fO.�ơ3�q'
r�Q��@]���Q!��7aހ�8��A�l���#q����yu�I��G? +#j�Tq'=d�w�N�����T����ro@a�f�ie̛I������du��t��Ms�I��ǧp'��8���*rc���6�P�nW&�f��"$��8��2\����0��U��-�r���ʁ���C���TƢ�U�&����P�Gb"-���!#�Bp��E�vVž�n亁���qUj�Lҩr*c�/�P%Zb��,�
�s'��&�,'��8���*��$�C2 +�$?Fy ��:�Ppr�Q�߀~�M����ߣ�����s)c�$�K���(��wz"�����Np쵼�t7���p��? tŦ�Ñ�X(&V�t +r�G�q�MY�xnk�Vm\l1�Y���=�����Jթ��J��?��}߳Ak ��d�+��+o�n3L��]�o[س�h��*i����rg�.��� �
D33V�OI*��;C&B�$�J��{��vE^��Ξc��h�a���o~�B����v����� Ozyt�9�< ��ٽ�Ɓ�?�_OM�l�2W܅Y�b�2�F���"�wۨ�c��í+a�@�b�}��?�k�s��6�gj�Qo :�,z���ӛ�.��a�`D%��m�7�8��r�� +��J!��4|�d\�ǿDn +h{�S#-�:��W�>�� +m��@p@IZy�j֍��tw�p���$�P��y#\p(�E7&��y�����џ*j�8P ��?)0��~LbBp@���+ ��2�!�@Z6DaoR`��3!8� +:����y�Ǒ +�
2I�!$��ش������#&ewp��O�-�cӣō<�w�N��T5pi�C���
�+��C��չS��E�&��(��Ǣ���#��յs�e
�Aބ܀�t���QC����GQg���P����nOL6�o��]b=�v x��H�pl���<lp�ݺtfzS���G�P����8r耞ݺvn����!�}�d +� +fj� 8 t�q�қI�~�tš����O�g�-��Н2鍹��p'���tc�D�\9�%@_l��@��f��p'��شh�<z3Hϕ��Ţ���w{�m�aހ�X�uC��������הForƗ�� +���֛I�a� +lzl\���!��@T`ӣ�GXo��n�t���Đ_�D6��5�z3H�4�*������Gv|��|�����$���F�D̲��DУ4I��75� +���A�Fm �"���w)�1w2r��/�#%8�G�2�.l�<���<���2,z���A:���D�#1�^pr�Q�7uT��G`g��P[��n>��������0��Bb�Vo&�����qe�IzBo :ql�p@� +�C��1x Za���І�3y�����g��mXJi�[�N��ٚ�]e�A�; �fm�h+�1w2�
D56�m��.���Re�X���6���
wD7�][x���� �辋� +C~�N +ML��o + + +����Wp^cL���`� +}Mb�F�F���|�7�v�n%P����<���ܨ�]�98�sp��0߆�Ș܍��1y2ǧ�$�ಾE�S\�_�7�ް����zw7$��#龻7@;�c�7���=�����w�@ +�%?��}sYȖ`�J�O#�6%LI��7��\@wդ��]K�O��u|p��B9�B ��
c�׀�� p�\<���h<�<ޘo]����𬨣�N�{K�Xi�c4�p�m�t�d�mz��6�|�}Gǜ!&p���h�g�lB�1������4�\H����m�>��U
��F���p��_��{��%̏���y���ȏ����l���ⴓC.(Y��P�Q,|9�w���`b�����@m��16�t=��9�J����|��ppΐ_ +�c���t,���+� +_l}�8rr�'�_�j-�A�U��oi�f~��t�n=��R�����]��,� +GUV!prׂ��u��/�cp0?r�讵�`2��z�+y,*����|W�m%` ��H���N��~a�!dl4L)\9�,��[�ȃ��x78��g�1!���O�t��9��z�K�?�f���� +����oH��5 �X��b=-�%�=������}�h�6-�e��P�s�X��>{ 0��1r�lB�7�Vڟ����B�C:d�X +?��gO��B���P涋�mL=C�) +����~К��VQ�GK�f
�yt���E��T�mTd�E8��Y�?��^��������M��Փ$���8�qJ��\�02&�VQG_��<�26O��G��ݴ�������o�X &��9&Lz�<���9p�(dl^K������/�r3�"]�0^�2����܋�|�%������?~�Л���N�-��"ŖΟ�c�#��Ǣ� +G&ǀ��x47��L:0{�[i�x�gy��rl�K�s4?yx9�r4.��|�� +ل3�9�x�S��p"��'T�n�덷���j�8f)��ްl�(����D +o�H���}+�����OnS�u��R?��] +�u_p��]�kW ��0,k&��3%���n}�)�R��
�R��<�P��`�^����W];��Ƣ��)�Bk�ܥ���K�(�o�SMv�&?�Վ�4:dC� �)�_n��.��+�8y����]gB�����pz���C�m��C���������] +��Q�*���(�-������Z_�۲rh2���r��> +�W���E�>!pr�@͍��˿<��s��u���,�o=zI;�a���������f��E57�7�t�1f����6ŃGѫl� +�5Ĵ0����9)���0���ɯ���C���7vl�v]gOYVvbt����Ox�T$A��Yw\w��w)��L)���Fmlx�G'O��?��>r��1�H^��ҋ/�P6�d��d2�T\���6�#ܥ����*�#F�ƏI]ç����/���?�����/��0i�ml���3R +��Mڐ��r#��rM7A�Աc��}��m߸᧫�V�2����(�&C��@�S +_Zv����Xnt�8<]���>x��G~~݆���9���_u��!�ԍd~Z�@�.]Z��az�1�M�8���/�xs�3����ݵ
�1qK]17|��s��|��@ +����G#�����_���o/���-m5YQ��g�M������ңK��f���}]��\�{Ւ��>X"�
L�ƈ��0��y��0��psDB�9z|(1/�� �b����JS_������JCqZ3��V��6 /�+�Ն�������g�F��/-�)6*t���5��fMsRs�"Kc(N�4S_�>�U$P�&)�+m�E<���LQ>����G�����c��eQ��k��\~'�]�6Tg�m��m6��Լ��^Wc5g*c��b�E ��Ćx��:)�>n�%ӶZפmЬ7g袲�Y����zG���sW�`�.�#�-��ɘ���7+��F��kmj}|���֛�#W�?��k����¦�FCAQ]�rCF˺���ڼ�x}A��`��lN6��}[�M�b�[fLQe��5E����&;Ő�ܬ.]ї��9ی���M�ٵm%re|v�`-���Ԣj-�2���R�樾� +C�2��l27k�ʲ�B]_�zuEk�F�V\L�6ڠQ����w����>�j0�#�ݽ˴5EZ��r%}n���\bj������{R��u�D�9���3rx ����G^�r0&Ϥꯏ��fΡ�@ݗѮ�h����r�fENMݘS��T4��� +�mI���T:��V�Q��� +}Vow��ö^5ݍ��{c��s�"�fj���Z��L}w�Qc��0�2c;����ӝ�>�R�l��[�)qW�6������z]���P��"��~���`���s�+��[EbZBDQn��SM�C���(�ΑX�ߝ��:؝[���d�2��c���sb�m��֖� ߥ,��m��j0Q�o��Ӓ�X3@�ggT��*�+�����
�kk����ʛu9����jg�����8^n�g�2R'� ���)�UUҟ�ѕnHo���o��.�p����4�$G�M�Π�F�h2�s\^m���1��e���^����#<���tN��Z�`�Ti���mYP�G>�t~�TP:��-J��ԓ����+�\e�6Z���U��*���SS��uԷv����)���6Z,EI����}v^��ұ�/М�ߝ�C4���0�w�#�d��*��]�Ѣn�+ڢWe�O1��6U�e�F��V��k�]U�ݥ+Փ�f�!r�&ܙs͚�5��GP�F[�SRB�Y�.�Ĥk�Y�-I�m�e)�U����&��92ͨn.�6��W-3�[Z�cu���Z��m�k��IF[\e��'�y��P'�+��RB������兆���h���&+ٸ�^��Z�ҥ�5e)��v}JS��T��ȭ�����v��9Q��Nhl�N�X�Ʃ�]ָ��3R�a6%�S��J�][i[�M9�ef���BJw���ŕJ� +�����"��'9�h�,��d����R�L�QZJ�ӔjcIAǪ|�٘֘��ڣ�c��Ii�)-��2�IUV:�<���Q��A�}Ue�!}��&�k
���#5`������\S<�G�ԍ�i�v�U��)_�e�e��L��d��0S舰F��TsVS��s͊��e�i��φ5mQ��V��nP�Nc5�l +p*��E���wm���l�عU�{� +x�T���s4>� +��L�L<m�*���9�|yd.T�����,�����u<Ʋ +x�_T���s4��Ur����>���*��\����q�3����<Wn��wv�K�-����=� +p(�����m�C�鱙T�k��e_�m�o*�b��C"������Om�Z�U �r�7;ʖ +��cި +p'�H��c<W��R6zlf�X.����x�V�����9U r��}<�s��`�ǦS� +�\���r����n��v�����l +k__��괭�>Q��������5����J���,��(�I
endstream
endobj
15 0 obj
[/ICCBased 19 0 R]
endobj
6 0 obj
[5 0 R]
endobj
32 0 obj
<</CreationDate(D:20160615142312-04'00')/Creator(Adobe Illustrator CC 2015 \(Macintosh\))/ModDate(D:20160615142312-04'00')/Producer(Adobe PDF library 15.00)/Title(metamask_icon)>>
endobj
xref
0 33
0000000000 65535 f
+0000000016 00000 n
+0000000144 00000 n
+0000047649 00000 n
+0000000000 00000 f
+0000163121 00000 n
+0000593503 00000 n
+0000047700 00000 n
+0000048109 00000 n
+0000048283 00000 n
+0000163420 00000 n
+0000139682 00000 n
+0000163307 00000 n
+0000049181 00000 n
+0000048344 00000 n
+0000593468 00000 n
+0000048620 00000 n
+0000048668 00000 n
+0000139717 00000 n
+0000160473 00000 n
+0000163191 00000 n
+0000163222 00000 n
+0000163494 00000 n
+0000163800 00000 n
+0000165099 00000 n
+0000187851 00000 n
+0000253439 00000 n
+0000319027 00000 n
+0000384615 00000 n
+0000450203 00000 n
+0000515791 00000 n
+0000581379 00000 n
+0000593526 00000 n
+trailer
<</Size 33/Root 1 0 R/Info 32 0 R/ID[<858D18969ABF4CF88593CFB9A20C1759><B33F39DA517C42B9A50D10EC91C85574>]>>
startxref
593722
%%EOF
\ No newline at end of file diff --git a/ui/responsive/design/chromeStorePics/promo1400560.png b/ui/responsive/design/chromeStorePics/promo1400560.png Binary files differnew file mode 100644 index 000000000..d3637ecc8 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/promo1400560.png diff --git a/ui/responsive/design/chromeStorePics/promo440280.png b/ui/responsive/design/chromeStorePics/promo440280.png Binary files differnew file mode 100644 index 000000000..c1f92b1c0 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/promo440280.png diff --git a/ui/responsive/design/chromeStorePics/promo920680.png b/ui/responsive/design/chromeStorePics/promo920680.png Binary files differnew file mode 100644 index 000000000..726bd810a --- /dev/null +++ b/ui/responsive/design/chromeStorePics/promo920680.png diff --git a/ui/responsive/design/chromeStorePics/screen_dao_accounts.png b/ui/responsive/design/chromeStorePics/screen_dao_accounts.png Binary files differnew file mode 100644 index 000000000..1a2e8052c --- /dev/null +++ b/ui/responsive/design/chromeStorePics/screen_dao_accounts.png diff --git a/ui/responsive/design/chromeStorePics/screen_dao_locked.png b/ui/responsive/design/chromeStorePics/screen_dao_locked.png Binary files differnew file mode 100644 index 000000000..6592c17e4 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/screen_dao_locked.png diff --git a/ui/responsive/design/chromeStorePics/screen_dao_notification.png b/ui/responsive/design/chromeStorePics/screen_dao_notification.png Binary files differnew file mode 100644 index 000000000..baeb2ec39 --- /dev/null +++ b/ui/responsive/design/chromeStorePics/screen_dao_notification.png diff --git a/ui/responsive/design/chromeStorePics/screen_wei_account.png b/ui/responsive/design/chromeStorePics/screen_wei_account.png Binary files differnew file mode 100644 index 000000000..23301e4bf --- /dev/null +++ b/ui/responsive/design/chromeStorePics/screen_wei_account.png diff --git a/ui/responsive/design/chromeStorePics/screen_wei_notification.png b/ui/responsive/design/chromeStorePics/screen_wei_notification.png Binary files differnew file mode 100644 index 000000000..7a763e5df --- /dev/null +++ b/ui/responsive/design/chromeStorePics/screen_wei_notification.png diff --git a/ui/responsive/design/metamask-logo-eyes.png b/ui/responsive/design/metamask-logo-eyes.png Binary files differnew file mode 100644 index 000000000..c29331b28 --- /dev/null +++ b/ui/responsive/design/metamask-logo-eyes.png diff --git a/ui/responsive/design/wireframes/1st_time_use.png b/ui/responsive/design/wireframes/1st_time_use.png Binary files differnew file mode 100644 index 000000000..c18ced5e2 --- /dev/null +++ b/ui/responsive/design/wireframes/1st_time_use.png diff --git a/ui/responsive/design/wireframes/metamask_wfs_jan_13.pdf b/ui/responsive/design/wireframes/metamask_wfs_jan_13.pdf Binary files differnew file mode 100644 index 000000000..c77c9274a --- /dev/null +++ b/ui/responsive/design/wireframes/metamask_wfs_jan_13.pdf diff --git a/ui/responsive/design/wireframes/metamask_wfs_jan_13.png b/ui/responsive/design/wireframes/metamask_wfs_jan_13.png Binary files differnew file mode 100644 index 000000000..d71d7bdb4 --- /dev/null +++ b/ui/responsive/design/wireframes/metamask_wfs_jan_13.png diff --git a/ui/responsive/design/wireframes/metamask_wfs_jan_18.pdf b/ui/responsive/design/wireframes/metamask_wfs_jan_18.pdf Binary files differnew file mode 100644 index 000000000..592ba8532 --- /dev/null +++ b/ui/responsive/design/wireframes/metamask_wfs_jan_18.pdf diff --git a/ui/responsive/example.js b/ui/responsive/example.js new file mode 100644 index 000000000..4627c0e9c --- /dev/null +++ b/ui/responsive/example.js @@ -0,0 +1,123 @@ +const injectCss = require('inject-css') +const MetaMaskUi = require('./index.js') +const MetaMaskUiCss = require('./css.js') +const EventEmitter = require('events').EventEmitter + +// account management + +var identities = { + '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111': { + name: 'Walrus', + img: 'QmW6hcwYzXrNkuHrpvo58YeZvbZxUddv69ATSHY3BHpPdd', + address: '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111', + balance: 220, + txCount: 4, + }, + '0x222462427bcc9133bb46e88bcbe39cd7ef0e7222': { + name: 'Tardus', + img: 'QmQYaRdrf2EhRhJWaHnts8Meu1mZiXrNib5W1P6cYmXWRL', + address: '0x222462427bcc9133bb46e88bcbe39cd7ef0e7222', + balance: 10.005, + txCount: 16, + }, + '0x333462427bcc9133bb46e88bcbe39cd7ef0e7333': { + name: 'Gambler', + img: 'QmW6hcwYzXrNkuHrpvo58YeZvbZxUddv69ATSHY3BHpPdd', + address: '0x333462427bcc9133bb46e88bcbe39cd7ef0e7333', + balance: 0.000001, + txCount: 1, + }, +} + +var unapprovedTxs = {} +addUnconfTx({ + from: '0x222462427bcc9133bb46e88bcbe39cd7ef0e7222', + to: '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111', + value: '0x123', +}) +addUnconfTx({ + from: '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111', + to: '0x333462427bcc9133bb46e88bcbe39cd7ef0e7333', + value: '0x0000', + data: '0x000462427bcc9133bb46e88bcbe39cd7ef0e7000', +}) + +function addUnconfTx (txParams) { + var time = (new Date()).getTime() + var id = createRandomId() + unapprovedTxs[id] = { + id: id, + txParams: txParams, + time: time, + } +} + +var isUnlocked = false +var selectedAccount = null + +function getState () { + return { + isUnlocked: isUnlocked, + identities: isUnlocked ? identities : {}, + unapprovedTxs: isUnlocked ? unapprovedTxs : {}, + selectedAccount: selectedAccount, + } +} + +var accountManager = new EventEmitter() + +accountManager.getState = function (cb) { + cb(null, getState()) +} + +accountManager.setLocked = function () { + isUnlocked = false + this._didUpdate() +} + +accountManager.submitPassword = function (password, cb) { + if (password === 'test') { + isUnlocked = true + cb(null, getState()) + this._didUpdate() + } else { + cb(new Error('Bad password -- try "test"')) + } +} + +accountManager.setSelectedAccount = function (address, cb) { + selectedAccount = address + cb(null, getState()) + this._didUpdate() +} + +accountManager.signTransaction = function (txParams, cb) { + alert('signing tx....') +} + +accountManager._didUpdate = function () { + this.emit('update', getState()) +} + +// start app + +var container = document.getElementById('app-content') + +var css = MetaMaskUiCss() +injectCss(css) + +MetaMaskUi({ + container: container, + accountManager: accountManager, +}) + +// util + +function createRandomId () { + // 13 time digits + var datePart = new Date().getTime() * Math.pow(10, 3) + // 3 random digits + var extraPart = Math.floor(Math.random() * Math.pow(10, 3)) + // 16 digits + return datePart + extraPart +} diff --git a/ui/responsive/index.html b/ui/responsive/index.html new file mode 100644 index 000000000..9dfaefbb3 --- /dev/null +++ b/ui/responsive/index.html @@ -0,0 +1,20 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <title>MetaMask</title> + </head> + <body> + + <!-- app content --> + <div id="app-content"></div> + <script src="./bundle.js" type="text/javascript" charset="utf-8"></script> + + <!-- design reference --> + <link rel="stylesheet" type="text/css" href="./app/css/debug.css"> + <div id="design-container"> + <img id="design-img" src="./design/metamask_wfs_jan_13.png"> + </div> + + </body> +</html> diff --git a/ui/responsive/index.js b/ui/responsive/index.js new file mode 100644 index 000000000..a729138d3 --- /dev/null +++ b/ui/responsive/index.js @@ -0,0 +1,58 @@ +const render = require('react-dom').render +const h = require('react-hyperscript') +const Root = require('./app/root') +const actions = require('./app/actions') +const configureStore = require('./app/store') +const txHelper = require('./lib/tx-helper') +global.log = require('loglevel') + +module.exports = launchMetamaskUi + + +log.setLevel(global.METAMASK_DEBUG ? 'debug' : 'warn') + +function launchMetamaskUi (opts, cb) { + var accountManager = opts.accountManager + actions._setBackgroundConnection(accountManager) + // check if we are unlocked first + accountManager.getState(function (err, metamaskState) { + if (err) return cb(err) + const store = startApp(metamaskState, accountManager, opts) + cb(null, store) + }) +} + +function startApp (metamaskState, accountManager, opts) { + // parse opts + const store = configureStore({ + + // metamaskState represents the cross-tab state + metamask: metamaskState, + + // appState represents the current tab's popup state + appState: {}, + + // Which blockchain we are using: + networkVersion: opts.networkVersion, + }) + + // if unconfirmed txs, start on txConf page + const unapprovedTxsAll = txHelper(metamaskState.unapprovedTxs, metamaskState.unapprovedMsgs, metamaskState.unapprovedPersonalMsgs, metamaskState.network) + if (unapprovedTxsAll.length > 0) { + store.dispatch(actions.showConfTxPage()) + } + + accountManager.on('update', function (metamaskState) { + store.dispatch(actions.updateMetamaskState(metamaskState)) + }) + + // start app + render( + h(Root, { + // inject initial state + store: store, + } + ), opts.container) + + return store +} diff --git a/ui/responsive/lib/account-link.js b/ui/responsive/lib/account-link.js new file mode 100644 index 000000000..d061d0ad1 --- /dev/null +++ b/ui/responsive/lib/account-link.js @@ -0,0 +1,26 @@ +module.exports = function (address, network) { + const net = parseInt(network) + let link + switch (net) { + case 1: // main net + link = `http://etherscan.io/address/${address}` + break + case 2: // morden test net + link = `http://morden.etherscan.io/address/${address}` + break + case 3: // ropsten test net + link = `http://ropsten.etherscan.io/address/${address}` + break + case 4: // rinkeby test net + link = `http://rinkeby.etherscan.io/address/${address}` + break + case 42: // kovan test net + link = `http://kovan.etherscan.io/address/${address}` + break + default: + link = '' + break + } + + return link +} diff --git a/ui/responsive/lib/contract-namer.js b/ui/responsive/lib/contract-namer.js new file mode 100644 index 000000000..f05e770cc --- /dev/null +++ b/ui/responsive/lib/contract-namer.js @@ -0,0 +1,33 @@ +/* CONTRACT NAMER + * + * Takes an address, + * Returns a nicname if we have one stored, + * otherwise returns null. + */ + +const contractMap = require('eth-contract-metadata') +const ethUtil = require('ethereumjs-util') + +module.exports = function (addr, identities = {}) { + const checksummed = ethUtil.toChecksumAddress(addr) + if (contractMap[checksummed] && contractMap[checksummed].name) { + return contractMap[checksummed].name + } + + const address = addr.toLowerCase() + const ids = hashFromIdentities(identities) + return addrFromHash(address, ids) +} + +function hashFromIdentities (identities) { + const result = {} + for (const key in identities) { + result[key] = identities[key].name + } + return result +} + +function addrFromHash (addr, hash) { + const address = addr.toLowerCase() + return hash[address] || null +} diff --git a/ui/responsive/lib/etherscan-prefix-for-network.js b/ui/responsive/lib/etherscan-prefix-for-network.js new file mode 100644 index 000000000..2c1904f1c --- /dev/null +++ b/ui/responsive/lib/etherscan-prefix-for-network.js @@ -0,0 +1,21 @@ +module.exports = function (network) { + const net = parseInt(network) + let prefix + switch (net) { + case 1: // main net + prefix = '' + break + case 3: // ropsten test net + prefix = 'ropsten.' + break + case 4: // rinkeby test net + prefix = 'rinkeby.' + break + case 42: // kovan test net + prefix = 'kovan.' + break + default: + prefix = '' + } + return prefix +} diff --git a/ui/responsive/lib/explorer-link.js b/ui/responsive/lib/explorer-link.js new file mode 100644 index 000000000..3b82ecd5f --- /dev/null +++ b/ui/responsive/lib/explorer-link.js @@ -0,0 +1,6 @@ +const prefixForNetwork = require('./etherscan-prefix-for-network') + +module.exports = function (hash, network) { + const prefix = prefixForNetwork(network) + return `http://${prefix}etherscan.io/tx/${hash}` +} diff --git a/ui/responsive/lib/icon-factory.js b/ui/responsive/lib/icon-factory.js new file mode 100644 index 000000000..27a74de66 --- /dev/null +++ b/ui/responsive/lib/icon-factory.js @@ -0,0 +1,65 @@ +var iconFactory +const isValidAddress = require('ethereumjs-util').isValidAddress +const toChecksumAddress = require('ethereumjs-util').toChecksumAddress +const contractMap = require('eth-contract-metadata') + +module.exports = function (jazzicon) { + if (!iconFactory) { + iconFactory = new IconFactory(jazzicon) + } + return iconFactory +} + +function IconFactory (jazzicon) { + this.jazzicon = jazzicon + this.cache = {} +} + +IconFactory.prototype.iconForAddress = function (address, diameter) { + const addr = toChecksumAddress(address) + if (iconExistsFor(addr)) { + return imageElFor(addr) + } + + return this.generateIdenticonSvg(address, diameter) +} + +// returns svg dom element +IconFactory.prototype.generateIdenticonSvg = function (address, diameter) { + var cacheId = `${address}:${diameter}` + // check cache, lazily generate and populate cache + var identicon = this.cache[cacheId] || (this.cache[cacheId] = this.generateNewIdenticon(address, diameter)) + // create a clean copy so you can modify it + var cleanCopy = identicon.cloneNode(true) + return cleanCopy +} + +// creates a new identicon +IconFactory.prototype.generateNewIdenticon = function (address, diameter) { + var numericRepresentation = jsNumberForAddress(address) + var identicon = this.jazzicon(diameter, numericRepresentation) + return identicon +} + +// util + +function iconExistsFor (address) { + return contractMap[address] && isValidAddress(address) && contractMap[address].logo +} + +function imageElFor (address) { + const contract = contractMap[address] + const fileName = contract.logo + const path = `images/contract/${fileName}` + const img = document.createElement('img') + img.src = path + img.style.width = '75%' + return img +} + +function jsNumberForAddress (address) { + var addr = address.slice(2, 10) + var seed = parseInt(addr, 16) + return seed +} + diff --git a/ui/responsive/lib/lost-accounts-notice.js b/ui/responsive/lib/lost-accounts-notice.js new file mode 100644 index 000000000..948b13db6 --- /dev/null +++ b/ui/responsive/lib/lost-accounts-notice.js @@ -0,0 +1,23 @@ +const summary = require('../app/util').addressSummary + +module.exports = function (lostAccounts) { + return { + date: new Date().toDateString(), + title: 'Account Problem Caught', + body: `MetaMask has fixed a bug where some accounts were previously mis-generated. This was a rare issue, but you were affected! + +We have successfully imported the accounts that were mis-generated, but they will no longer be recovered with your normal seed phrase. + +We have marked the affected accounts as "Loose", and recommend you transfer ether and tokens away from those accounts, or export & back them up elsewhere. + +Your affected accounts are: +${lostAccounts.map(acct => ` - ${summary(acct)}`).join('\n')} + +These accounts have been marked as "Loose" so they will be easy to recognize in the account list. + +For more information, please read [our blog post.][1] + +[1]: https://medium.com/metamask/metamask-3-migration-guide-914b79533cdd#.7d8ktj4h3 + `, + } +} diff --git a/ui/responsive/lib/persistent-form.js b/ui/responsive/lib/persistent-form.js new file mode 100644 index 000000000..d4dc20b03 --- /dev/null +++ b/ui/responsive/lib/persistent-form.js @@ -0,0 +1,61 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const defaultKey = 'persistent-form-default' +const eventName = 'keyup' + +module.exports = PersistentForm + +function PersistentForm () { + Component.call(this) +} + +inherits(PersistentForm, Component) + +PersistentForm.prototype.componentDidMount = function () { + const fields = document.querySelectorAll('[data-persistent-formid]') + const store = this.getPersistentStore() + + for (var i = 0; i < fields.length; i++) { + const field = fields[i] + const key = field.getAttribute('data-persistent-formid') + const cached = store[key] + if (cached !== undefined) { + field.value = cached + } + + field.addEventListener(eventName, this.persistentFieldDidUpdate.bind(this)) + } +} + +PersistentForm.prototype.getPersistentStore = function () { + let store = window.localStorage[this.persistentFormParentId || defaultKey] + if (store && store !== 'null') { + store = JSON.parse(store) + } else { + store = {} + } + return store +} + +PersistentForm.prototype.setPersistentStore = function (newStore) { + window.localStorage[this.persistentFormParentId || defaultKey] = JSON.stringify(newStore) +} + +PersistentForm.prototype.persistentFieldDidUpdate = function (event) { + const field = event.target + const store = this.getPersistentStore() + const key = field.getAttribute('data-persistent-formid') + const val = field.value + store[key] = val + this.setPersistentStore(store) +} + +PersistentForm.prototype.componentWillUnmount = function () { + const fields = document.querySelectorAll('[data-persistent-formid]') + for (var i = 0; i < fields.length; i++) { + const field = fields[i] + field.removeEventListener(eventName, this.persistentFieldDidUpdate.bind(this)) + } + this.setPersistentStore({}) +} + diff --git a/ui/responsive/lib/tx-helper.js b/ui/responsive/lib/tx-helper.js new file mode 100644 index 000000000..ec19daf64 --- /dev/null +++ b/ui/responsive/lib/tx-helper.js @@ -0,0 +1,17 @@ +const valuesFor = require('../app/util').valuesFor + +module.exports = function (unapprovedTxs, unapprovedMsgs, personalMsgs, network) { + log.debug('tx-helper called with params:') + log.debug({ unapprovedTxs, unapprovedMsgs, personalMsgs, network }) + + const txValues = network ? valuesFor(unapprovedTxs).filter(txMeta => txMeta.metamaskNetworkId === network) : valuesFor(unapprovedTxs) + log.debug(`tx helper found ${txValues.length} unapproved txs`) + const msgValues = valuesFor(unapprovedMsgs) + log.debug(`tx helper found ${msgValues.length} unsigned messages`) + let allValues = txValues.concat(msgValues) + const personalValues = valuesFor(personalMsgs) + log.debug(`tx helper found ${personalValues.length} unsigned personal messages`) + allValues = allValues.concat(personalValues) + + return allValues.sort(txMeta => txMeta.time) +} |